我正在定义价格动量是给定股票在过去 n 天的平均动量。
反过来,动量是一种分类:如果当天的收盘价高于前一天,则每一天标记为 1,如果价格低于前一天,则标记为 -1。
我的库存变动百分比如下:
df['close in percent'] = np.array([0.27772152, 1.05468772,
0.124156 , -0.39298394,
0.56415267, 1.67812005])
momentum = df['close in percent'].apply(lambda x: 1 if x > 0 else -1).values
Momentum 应该是:[1,1,1,-1,1,1]。
因此,如果我找到过去 n = 3 天 的平均动量,我希望我的价格动量为:
Price_momentum = [Nan, Nan, 1, 1/3, 1/3, 1/3]
我设法使用以下代码让它工作,但这非常慢(数据集有 5000 多行,执行需要 10 分钟)。
for i in range(3,len(df)+1,1):
data = np.array(momentum[i-3:i])
df['3_day_momentum'].iloc[i-1]=data.mean()
请您参考如下方法:
您可以创建一个 rolling对象:
df = pd.DataFrame()
df['close_in_percent'] = np.array([0.27772152, 1.05468772,
0.124156 , -0.39298394,
0.56415267, 1.67812005])
df['momentum'] = np.where(df['close_in_percent'] > 0, 1, -1)
df['3_day_momentum'] = df.momentum.rolling(3).mean()
这里,np.where 是 apply() 的替代方法,它通常很慢,应该作为最后的手段使用。
close_in_percent momentum 3_day_momentum
0 0.2777 1 NaN
1 1.0547 1 NaN
2 0.1242 1 1.0000
3 -0.3930 -1 0.3333
4 0.5642 1 0.3333
5 1.6781 1 0.3333
