首页 > 解决方案 > 需要改进我在某个时间点返回多个 SMA 的函数

问题描述

当我传递典型的 OHLCV 数据帧以及参数“retro_days”时,我有一个函数返回 SMA(简单移动平均线)SMA200、SMA50、SMA20 和 SMA10。因此,如果我通过retro_days = 0,它将返回截至今天的 4 个 SMA 。如果我通过retro_days = 10,它将返回10 个交易日之前的 4 个 SMA 。

我的问题是,它在准确性方面都运行良好,但是当我遍历多个股票代码时,每个股票代码的时间都会累加,这个循环最终会花费很多时间。我为每个股票代码调用此函数 6 次,retro_days 为 20、10、5、3、1 和 0。

有人可以提出一种更有效的方法来实现这一目标吗?谢谢你。

我的函数看起来像这样,其中df_SMA被传递给股票代码的df_OHLCV。:

def get_SMA_Stats( df_SMA, retro_days):
    if retro_days > 0:
        df_SMA = df_SMA[ 0 : len( df_SMA)-retro_days]
        
    sma200 = df_SMA.Close.rolling( window = 200).mean()[ -1:][0]
    sma50 = df_SMA.Close.rolling( window = 50).mean()[ -1:][0]
    sma20 = df_SMA.Close.rolling( window = 20).mean()[ -1:][0]
    sma10 = df_SMA.Close.rolling( window = 10).mean()[ -1:][0]
    
    return sma200, sma50, sma20, sma10

该函数的调用如下:

SMA200, SMA50, SMA20, SMA10 = get_SMA_Stats( df_OHLCV, 20)
SMA200, SMA50, SMA20, SMA10 = get_SMA_Stats( df_OHLCV, 10)
SMA200Tm5, SMA50Tm5, SMA20, SMA10 = get_SMA_Stats( df_OHLCV, 5)
SMA200Tm3, SMA50Tm3, SMA20, SMA10 = get_SMA_Stats( df_OHLCV, 3)
SMA200Tm1, SMA50Tm1, SMA20, SMA10 = get_SMA_Stats( df_OHLCV, 1)
SMA200, SMA50, SMA20, SMA10 = get_SMA_Stats( df_OHLCV, 0)

标签: pandasdataframerolling-computation

解决方案


您可以实现累积和离散差的组合

def get_SMA(df, periods):
  '''
    step 1) compute the cumulative sum of the dataframe.
    step 2) compute the differences of the cumulative sum
    step 3) skip the of the first period
  '''
  return df.cumsum(axis=0).diff(periods=periods, axis=0).loc[periods:, :] / periods;

def get_SMA_Stats( df_SMA, retro_days):
    if retro_days > 0:
        df_SMA = df_SMA[ 0 : len( df_SMA)-retro_days]
        
    sma200 = get_SMA(df_SMA, 200)
    sma50 = get_SMA(df_SMA, 50)
    sma20 = get_SMA(df_SMA, 20)
    sma10 = get_SMA(df_SMA, 10)
    
    return sma200, sma50, sma20, sma10

在一项使用具有一百万行和 10 列的数据框的测试中,该函数get_SMA_stats在这里花费了 0.3 秒。


推荐阅读