如何使用yfinance和pandas计算加权移动平均并对比50日MA与WMA
错误原因
你原有代码的问题主要有两点:
- 循环内每次直接给
df['W50MA']整列赋值,最终整列只会保留最后一次循环的计算结果 - 权重计算用了全数据集的成交量总和,没有按50个数据的滑动窗口单独计算对应区间的权重
正确实现
如果你要计算的是成交量加权移动平均(VWAP),也就是你原有代码中尝试用成交量作为权重的场景,可以用下面的高效实现:
# 提前计算收盘价和成交量的乘积临时列 df['close_vol_product'] = df['Adj Close'] * df['Volume'] # 分别计算50窗口的乘积总和、成交量总和,相除得到加权均线 df['W50MA'] = df['close_vol_product'].rolling(window=50).sum() / df['Volume'].rolling(window=50).sum() # 可删除不需要的临时列 df.drop('close_vol_product', axis=1, inplace=True)
如果你要计算的是线性加权移动平均(WMA),即权重随时间递增、越近的收盘价权重越高(50个窗口的权重分别为1到50),可以用下面的实现:
import pandas as pd # 生成50窗口的权重序列,越新的数据权重越高 weights = pd.Series(range(1, 51)) # 滑动窗口计算加权均值 df['W50MA'] = df['Adj Close'].rolling(window=50).apply( lambda x: (x * weights).sum() / weights.sum(), raw=True )
额外优化建议
你之前计算普通均线的代码可以直接用列名代替索引取值,可读性更高:
df['50MA']= df['Adj Close'].rolling(window=50).mean()
内容的提问来源于stack exchange,提问作者Steve Tarkowski
相关产品推荐
相关产品推荐

