You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 03:00:02