es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo aplicar Pandas TA a un Dataframe con Groupby

Tengo un dataframe que contiene datos de acciones y está agrupado por acciones (ver imagen adjunta como ejemplo), el índice es cada minuto de datos para cada acción y la segunda columna es el símbolo de la acción.

Estoy tratando de aplicar indicadores de ‘Pandas TA’ al dataframe usando groupby para que los datos de cada acción se traten por separado y también se utilice la multiprocesamiento incorporada de Pandas TA. Tengo un archivo principal de backtesting que llama a esta función para agregar indicadores a los datos sin procesar (los datos sin procesar son Apertura, Máximo, Mínimo, Cierre, Volumen), pero este código solo devuelve un dataframe en blanco.

import pandas_ta as ta

def simple_strategy(df):

  CustomStrategy = ta.Strategy(
      name="Momo and Volatility",
      description="SMA 50,200, BBANDS, RSI, MACD and Volume SMA 20",
      ta=[
          {"kind": "sma", "length": 20},
          {"kind": "sma", "length": 60},
          {"kind": "bbands", "length": 20},
      ]
  )

  df = df.groupby(['symbol']).apply(lambda x: 
        df.ta.strategy(CustomStrategy) ).reset_index(0,drop=True)
  print(df)

Esta es parte de mi programa principal que llama a la función anterior para aplicar indicadores al dataframe.

import numpy as np
import pandas as pd
from alpaca_trade_api.rest import REST, TimeFrame
import os
from datetime import datetime, timedelta, date
import time
import pandas_ta as ta
from strategies import simple_strategy

if __name__ == '__main__':

    stocks = ['TSLA', 'AAPL', 'V', 'MSFT', 'TQQQ', 'SQQQ', 'ARKK', 'TLRY', 'XELA']

    start = "2021-06-01"
    end = "2021-12-22"

    # Recuperar dataframe sin procesar****************************************************
    total_data = access_dataframe(start, end, stocks, dates)

    # Aplicar indicadores al dataframe *************************************
    total_data = simple_strategy(total_data)

Cualquier solución para aplicar ‘Pandas TA’ a un dataframe usando groupby sería muy apreciada.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para aplicar los indicadores de Pandas TA a un dataframe agrupado por acciones, puedes usar el método groupby para agrupar los datos por símbolo y luego aplicar el método ta de Pandas TA a cada grupo por separado.

    En tu código, has definido la función simple_strategy para definir una estrategia personalizada para los indicadores que deseas aplicar, pero hay un error en la declaración groupby.

    Para solucionarlo, puedes modificar la función simple_strategy para aplicar los indicadores a cada grupo por separado y luego combinar los resultados. Aquí tienes una versión actualizada del código:

    import pandas_ta as ta
    
    def simple_strategy(df):
        CustomStrategy = ta.Strategy(
            name="Momo y Volatilidad",
            description="SMA 50,200, BBANDS, RSI, MACD y Volume SMA 20",
            ta=[
                {"kind": "sma", "length": 20},
                {"kind": "sma", "length": 60},
                {"kind": "bbands", "length": 20},
            ]
        )
    
        # agrupar por símbolo y aplicar la estrategia a cada grupo
        grouped_df = df.groupby('symbol').apply(lambda x: x.ta.strategy(CustomStrategy))
    
        # combinar los resultados en un solo dataframe
        total_data = pd.concat(grouped_df.to_list())
    
        return total_data
    

    En tu programa principal, puedes llamar a esta función en los datos sin procesar para aplicar los indicadores a cada acción por separado:

    if __name__ == '__main__':
        stocks = ['TSLA', 'AAPL', 'V', 'MSFT', 'TQQQ', 'SQQQ', 'ARKK', 'TLRY', 'XELA']
        start = "2021-06-01"
        end = "2021-12-22"
    
        # Obtener el dataframe sin procesar
        total_data = access_dataframe(start, end, stocks, dates)
    
        # Aplicar los indicadores a cada grupo por separado
        total_data = simple_strategy(total_data)
    

    Ten en cuenta que también deberás importar el módulo pd para combinar los resultados en un solo dataframe.

Comments are closed.