Skip to main content
 首页 » 编程设计

python之在 python : averaging last n entries of a column 中找到价格动量的有效方法

2025年05月04日8jyk

我正在定义价格动量是给定股票在过去 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