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
相关产品推荐
相关产品推荐

