基础入门
基于收盘价列使用 rolling mean 生成 5 日和 10 日均线,理解滚动窗口的基本逻辑以及前几行空值的正常来源。
第 6 讲第一次把前面整理好的行情表交给滚动计算,目标很明确:基于收盘价列,同时算出 5 日均线和 10 日均线。这一步重点不在于追求复杂指标,更在于让你第一次看见“pandas 如何在一张时序表上长出两列常用技术指标”。
学完这一讲后,你可以直接完成下面几件事:
close 列上使用 rolling().mean()。这两个窗口长度非常适合入门。原因很简单:
第 6 讲更重要的收获,不是记住某两条具体均线,而是理解“滚动窗口怎么在 DataFrame 里工作”。
print(sorted_df[['date', 'close']].head())
这里最重要的前提是:表已经按日期排好。因为滚动均线对顺序非常敏感。
这一讲建议老老实实按顺序推进,不要一上来就两条均线一起写完不检查。先保证输入列可算,再依次生成 5 日和 10 日均线,最后一起看结果,最不容易出错。
sorted_df['close'] = pd.to_numeric(sorted_df['close'], errors='coerce')
sorted_df['ma_5'] = sorted_df['close'].rolling(window=5).mean()
sorted_df['ma_10'] = sorted_df['close'].rolling(window=10).mean()
print(sorted_df[['date', 'close', 'ma_5', 'ma_10']].head(12))
这一步的意义在于,你要建立的是“原始价格和两条衍生列之间的关系感”。
均线列是否正常,核心看的是窗口行为有没有体现出来。也就是说,前面该空的地方要空,后面该出现数值的地方要开始出现数值。
assert 'ma_5' in sorted_df.columns
assert 'ma_10' in sorted_df.columns
assert sorted_df['ma_5'].head(4).isna().all()
assert sorted_df['ma_10'].head(9).isna().all()
assert sorted_df['ma_5'].notna().sum() > 0
很多初学者第一次看到滚动结果时,会把前几行空值误当成报错。其实这正是滚动窗口最基本的行为表现,下面这些问题都围绕这一点展开。
不是。滚动窗口需要足够历史数据,5 日均线至少要前 5 行才能算出第一个有效值。
因为它窗口更长,自然要更多历史样本才能开始产生结果。
因为只算一条均线时,你很难立刻感受到窗口长度差异;两条放在一起,差别会更明显。
那 ma_10 全空也是正常结果。这一讲先要吃透的是窗口逻辑,而不是强行得到一列看起来很完整的结果。
ma_5,第 6 讲就已经有核心收获。ma_10 若因样本太短而全空,不算失败。return 列,不影响本讲结果。import pandas as pd
def add_ma_columns(df: pd.DataFrame) -> pd.DataFrame:
out = df.copy()
out['close'] = pd.to_numeric(out['close'], errors='coerce')
out['ma_5'] = out['close'].rolling(window=5).mean()
out['ma_10'] = out['close'].rolling(window=10).mean()
return out
sorted_df = add_ma_columns(sorted_df)
print(sorted_df[['date', 'close', 'ma_5', 'ma_10']].head(12))
第 6 讲特别容易让初学者焦躁的一点,是看到 ma_10 全是空值就怀疑自己写错了。其实如果你当前练习表只有几行数据,这反而是对滚动窗口逻辑的正常反馈。你可以顺手检查当前样本数:
print('样本行数:', len(sorted_df))
print(sorted_df[['close', 'ma_5', 'ma_10']].tail())
只要你知道空值来自“窗口还没凑够”,这一步就已经学到了真正重要的内容,而不是被输出外观带偏。
从这一步开始,你已经不只是做表格清理,而是在真正使用 pandas 的时序能力。rolling().mean() 看起来只是一行,但它背后对应的是一整类很常见的金融数据处理方式。只要这一步吃透,后面再看波动率、滚动最大值、滚动最小值,都会轻松很多。
如果你现在已经能在 close 列基础上稳定生成 ma_5 和 ma_10,并理解前几行空值的原因,那第 6 讲就算完成。
本讲是《pandas金融数据入门短课》的第 6/8 讲,当前主题是《计算5日和10日均线》。
上一讲:第 5 讲《排序并重置索引》。
下一讲:第 7 讲《按月份统计平均收益》。
后续安排:第 8 讲《导出清洗后的行情表》。
风险揭示与免责声明
本页面内容仅用于量化研究与技术交流,旨在展示研究方法与流程,不构成对任何金融产品、证券或衍生品的要约、招揽、推荐或保证。
本文所涉历史数据、回测结果与示例参数不代表未来表现,也不应作为投资决策依据。
市场存在波动、流动性与执行偏差等不确定性,任何策略均可能出现收益波动或阶段性失效。
读者应结合自身风险承受能力进行独立判断,并在必要时咨询持牌专业机构意见。