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

Python中如何正确计算同一数据集内多只股票的移动平均值

多股票数据集分组计算简单移动平均(SMA)方案

直接复用单股票SMA代码出错的核心原因:全局调用rolling()会顺着数据集行顺序连续滚动计算,不会在不同股票的数据边界自动截断窗口,导致后续股票的前序SMA值会错误混入前一只股票的尾部交易数据。

计算前首先确认数据集存在股票标识列(常见列名如Ticker、Symbol、StockCode,用于区分不同股票的数据分段),且每只股票的行已按交易日期升序排列,否则先做预处理排序:

# 按股票代码、交易日期升序排序,保证时间序列顺序正确
df = df.sort_values(by=['Ticker', 'Date'], ascending=[True, True]).reset_index(drop=True)

注意:如果你的股票标识列、日期列、收盘价列的列名和示例不一致,替换为实际列名即可。


实现方式1:改造原有SMA函数适配分组场景

基于你原本的函数逻辑调整,加入分组计算逻辑,避免多层索引错位:

def SMA(data, period=30, column='Close', group_col='Ticker'):
    return data.groupby(group_col)[column].rolling(window=period).mean().reset_index(level=0, drop=True)

df['SMA20'] = SMA(df, period=20)
df['SMA50'] = SMA(df, period=50)

实现方式2:用transform直接计算(无需封装函数)

如果不需要复用SMA函数,直接用groupby + transform一步完成计算,逻辑更简洁:

df['SMA20'] = df.groupby('Ticker')['Close'].transform(lambda x: x.rolling(20).mean())
df['SMA50'] = df.groupby('Ticker')['Close'].transform(lambda x: x.rolling(50).mean())

结果说明

分组计算后,每只股票最开始的period-1条记录因为滚动窗口长度不足,SMA值会返回NaN,属于正常现象,和单股票计算的逻辑一致。

内容的提问来源于stack exchange,提问作者Dhiraj jain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:12:28