如何使用 Groupby 将 Pandas TA 应用于数据框

Posted

技术标签:

【中文标题】如何使用 Groupby 将 Pandas TA 应用于数据框【英文标题】:How to apply Pandas TA to a Dataframe with Groupby 【发布时间】:2022-01-24 03:30:36 【问题描述】:

我有一个包含股票数据并按股票分组的数据框(例如,参见附图),索引是每只股票的每分钟数据,第二列是股票代码。

我正在尝试通过使用 groupby 将“Pandas TA”指标应用于数据框,以便单独处理每只股票的数据,并使用 Pandas TA 的内置多处理。我有一个主回测文件,它调用此函数向原始数据添加指标(原始数据为开盘价、最高价、最低价、收盘价、成交量),但此代码仅返回空白数据框。

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)

这是我的主程序的一部分,它调用上述函数将指标应用于数据框。

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"

    #Retrieve raw dataframe****************************************************
    total_data = access_dataframe(start, end, stocks, dates)

    #Apply indicators to dataframe *************************************
    total_data = simple_strategy(total_data)

任何使用 groupby 将“Pandas TA”应用到数据框的解决方案都会非常受欢迎。

【问题讨论】:

【参考方案1】:

两个选项 1) 使用 apply(),2) 迭代组。对于我只有三个符号和形状df.shape (12096, 7) 的数据框,这两种方法使用%%timeit - 3.4 seconds 花费了相同的时间。您可以对较大的数据帧进行一些测试,看看一种方法是否比另一种更快。

选项 1

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
    ]
)
    
def apply_strat(x):
    x.ta.strategy(CustomStrategy)
    return x

newdf = df.groupby(['Symbol']).apply(apply_strat)

选项 2

df_list = []
dfg = df.groupby(['Symbol'])
for grp in dfg.groups:
    x = dfg.get_group(grp).copy()
    x.ta.strategy(CustomStrategy)
    df_list.append(x)
newdf = pd.concat(df_list)  

【讨论】:

我已经能够通过 apply() 将一个指标应用于数据帧(例如 60Period SMA: Sixsma = groups.apply(lambda x: ta.sma(df.loc[x .index, "close"], 60) ).reset_index(0,drop=True)),也许这有帮助。我正在尝试应用指标矢量化,因为我最终将拥有一个包含几百只股票的数据框,因此尽量避免循环。我想让我们 Pandas TA 的策略功能利用内置的多进程。 我需要重新考虑 groupby.apply() 情况下的函数。我已将其添加到解决方案中。

以上是关于如何使用 Groupby 将 Pandas TA 应用于数据框的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 groupby 调整 pandas 中的小计列?

在 Pandas 中使用 groupby 函数时如何解决“keyerror”?

Python Pandas 如何将 groupby 操作结果分配回父数据框中的列?

如何将pandas dataframe进行groupby操作后得到的数据结构转换为dataframe?

如何在 pandas 中使用过滤条件和 groupby

无法将 groupby 数据集转换为 pandas 中的 json [重复]