有一个带有一些库存数据的Pandas DataFrame对象。 SMA是从前45/15天计算得出的移动平均线。

Date      Price   SMA_45      SMA_15
20150127  102.75  113         106
20150128  103.05  100         106
20150129  105.10  112         105
20150130  105.35  111         105
20150202  107.15  111         105
20150203  111.95  110         105
20150204  111.90  110         106

我想查找SMA_15和SMA_45相交的所有日期。

可以使用Pandas或Numpy有效地完成吗?如何?

编辑:

我所说的“交集”是指:

数据行,在以下情况下:
  • 长SMA(45)值比短SMA(15)值大,且长于短SMA周期(15),然后变小。
  • 长SMA(45)值比短SMA(15)值要短于短SMA期(15),然后变得更大。
  • 最佳答案

    我要说的是SMA线的时间-作为时间的函数-
    相交,如this investopediapage所示。

    由于SMA代表连续的功能,因此当
    对于给定的行,(SMA_15小于SMA_45)和(先前的SMA_15为
    大于先前的SMA_45),反之亦然。

    在代码中,可以表示为

    previous_15 = df['SMA_15'].shift(1)
    previous_45 = df['SMA_45'].shift(1)
    crossing = (((df['SMA_15'] <= df['SMA_45']) & (previous_15 >= previous_45))
                | ((df['SMA_15'] >= df['SMA_45']) & (previous_15 <= previous_45)))
    

    如果我们将您的数据更改为
    Date      Price   SMA_45      SMA_15
    20150127  102.75  113         106
    20150128  103.05  100         106
    20150129  105.10  112         105
    20150130  105.35  111         105
    20150202  107.15  111         105
    20150203  111.95  110         105
    20150204  111.90  110         106
    

    以便有十字路口,

    然后
    import pandas as pd
    
    df = pd.read_table('data', sep='\s+')
    previous_15 = df['SMA_15'].shift(1)
    previous_45 = df['SMA_45'].shift(1)
    crossing = (((df['SMA_15'] <= df['SMA_45']) & (previous_15 >= previous_45))
                | ((df['SMA_15'] >= df['SMA_45']) & (previous_15 <= previous_45)))
    crossing_dates = df.loc[crossing, 'Date']
    print(crossing_dates)
    

    产量
    1    20150128
    2    20150129
    Name: Date, dtype: int64
    

    09-25 21:41