深圳融克迪特科技有限公司 Logo,金融科技,量化交易,软件开发

深圳融克迪特科技有限公司

RONG CREDIT TECHNOLOGY CO., LTD.

基础入门

【pandas 系列 第6讲】计算5日和10日均线

基于收盘价列使用 rolling mean 生成 5 日和 10 日均线,理解滚动窗口的基本逻辑以及前几行空值的正常来源。

2026-04-23 智铨研究 阅读时长 5 分钟

目录

  1. 本节目标
  2. 为什么第 6 讲选 5 日和 10 日均线
  3. 沿用第 5 讲整理后的sorted_df
  4. 四步生成两条均线
  5. 先确保close为数值列
  6. 计算 5 日均线
  7. 计算 10 日均线
  8. 把价格和两条均线一起打印
  9. 怎样判断均线列已经加对了
  10. 两列都已生成
  11. ma_5前 4 行通常为空
  12. ma_10前 9 行通常为空
  13. 后面至少出现有效均线值
  14. 为什么均线前几行是空的
  15. 空值是不是说明计算错了
  16. 为什么ma_10空值更多
  17. 为什么要两条一起算
  18. 如果数据还不够 10 行怎么办
  19. 哪些情况仍然算本讲完成
  20. 写一个最小均线函数
  21. 样本不够长时先接受“部分列暂时全空”
  22. 第 6 讲是 pandas 滚动计算的入门门槛
  23. 完成标准
  24. 系列衔接
  25. 风险揭示与免责声明

【pandas 系列 第6讲】计算5日和10日均线

1. 本节目标

第 6 讲第一次把前面整理好的行情表交给滚动计算,目标很明确:基于收盘价列,同时算出 5 日均线和 10 日均线。这一步重点不在于追求复杂指标,更在于让你第一次看见“pandas 如何在一张时序表上长出两列常用技术指标”。

学完这一讲后,你可以直接完成下面几件事:

  1. 会在 close 列上使用 rolling().mean()
  2. 知道 5 日和 10 日均线为什么前面会有空值。
  3. 能把价格和两条均线放在一起看。

2. 为什么第 6 讲选 5 日和 10 日均线

这两个窗口长度非常适合入门。原因很简单:

  1. 计算逻辑直观。
  2. 两者差异足够明显,便于比较。
  3. 它们后面还能自然接到策略、回测或简单可视化练习里。

第 6 讲更重要的收获,不是记住某两条具体均线,而是理解“滚动窗口怎么在 DataFrame 里工作”。

3. 沿用第 5 讲整理后的sorted_df

print(sorted_df[['date', 'close']].head())

这里最重要的前提是:表已经按日期排好。因为滚动均线对顺序非常敏感。

4. 四步生成两条均线

这一讲建议老老实实按顺序推进,不要一上来就两条均线一起写完不检查。先保证输入列可算,再依次生成 5 日和 10 日均线,最后一起看结果,最不容易出错。

5. 先确保close为数值列

sorted_df['close'] = pd.to_numeric(sorted_df['close'], errors='coerce')

6. 计算 5 日均线

sorted_df['ma_5'] = sorted_df['close'].rolling(window=5).mean()

7. 计算 10 日均线

sorted_df['ma_10'] = sorted_df['close'].rolling(window=10).mean()

8. 把价格和两条均线一起打印

print(sorted_df[['date', 'close', 'ma_5', 'ma_10']].head(12))

这一步的意义在于,你要建立的是“原始价格和两条衍生列之间的关系感”。

9. 怎样判断均线列已经加对了

均线列是否正常,核心看的是窗口行为有没有体现出来。也就是说,前面该空的地方要空,后面该出现数值的地方要开始出现数值。

10. 两列都已生成

assert 'ma_5' in sorted_df.columns
assert 'ma_10' in sorted_df.columns

11. ma_5前 4 行通常为空

assert sorted_df['ma_5'].head(4).isna().all()

12. ma_10前 9 行通常为空

assert sorted_df['ma_10'].head(9).isna().all()

13. 后面至少出现有效均线值

assert sorted_df['ma_5'].notna().sum() > 0

14. 为什么均线前几行是空的

很多初学者第一次看到滚动结果时,会把前几行空值误当成报错。其实这正是滚动窗口最基本的行为表现,下面这些问题都围绕这一点展开。

15. 空值是不是说明计算错了

不是。滚动窗口需要足够历史数据,5 日均线至少要前 5 行才能算出第一个有效值。

16. 为什么ma_10空值更多

因为它窗口更长,自然要更多历史样本才能开始产生结果。

17. 为什么要两条一起算

因为只算一条均线时,你很难立刻感受到窗口长度差异;两条放在一起,差别会更明显。

18. 如果数据还不够 10 行怎么办

ma_10 全空也是正常结果。这一讲先要吃透的是窗口逻辑,而不是强行得到一列看起来很完整的结果。

19. 哪些情况仍然算本讲完成

  1. 你只要能稳定算出 ma_5,第 6 讲就已经有核心收获。
  2. ma_10 若因样本太短而全空,不算失败。
  3. 当前不必做买卖信号,第 6 讲只先把指标列建起来。
  4. 你可以保留前面的 return 列,不影响本讲结果。

20. 写一个最小均线函数

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))

21. 样本不够长时先接受“部分列暂时全空”

第 6 讲特别容易让初学者焦躁的一点,是看到 ma_10 全是空值就怀疑自己写错了。其实如果你当前练习表只有几行数据,这反而是对滚动窗口逻辑的正常反馈。你可以顺手检查当前样本数:

print('样本行数:', len(sorted_df))
print(sorted_df[['close', 'ma_5', 'ma_10']].tail())

只要你知道空值来自“窗口还没凑够”,这一步就已经学到了真正重要的内容,而不是被输出外观带偏。

22. 第 6 讲是 pandas 滚动计算的入门门槛

从这一步开始,你已经不只是做表格清理,而是在真正使用 pandas 的时序能力。rolling().mean() 看起来只是一行,但它背后对应的是一整类很常见的金融数据处理方式。只要这一步吃透,后面再看波动率、滚动最大值、滚动最小值,都会轻松很多。

23. 完成标准

如果你现在已经能在 close 列基础上稳定生成 ma_5ma_10,并理解前几行空值的原因,那第 6 讲就算完成。

24. 系列衔接

本讲是《pandas金融数据入门短课》的第 6/8 讲,当前主题是《计算5日和10日均线》。

上一讲:第 5 讲《排序并重置索引》。

下一讲:第 7 讲《按月份统计平均收益》。

后续安排:第 8 讲《导出清洗后的行情表》。

25. 风险揭示与免责声明

风险揭示与免责声明

本页面内容仅用于量化研究与技术交流,旨在展示研究方法与流程,不构成对任何金融产品、证券或衍生品的要约、招揽、推荐或保证。

本文所涉历史数据、回测结果与示例参数不代表未来表现,也不应作为投资决策依据。

市场存在波动、流动性与执行偏差等不确定性,任何策略均可能出现收益波动或阶段性失效。

读者应结合自身风险承受能力进行独立判断,并在必要时咨询持牌专业机构意见。