有一个带有一些库存数据的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线的时间-作为时间的函数-
相交,如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