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

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

RONG CREDIT TECHNOLOGY CO., LTD.

基础入门

【pandas 系列 第7讲】按月份统计平均收益

从日期列提取月份信息,并用 groupby 对日收益率做月度平均统计,完成从逐行表到汇总表的第一次过渡。

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

目录

  1. 本节目标
  2. 为什么第 7 讲开始做分组统计
  3. 沿用已有return列的工作表
  4. 四步做月份平均收益统计
  5. 先确保日期列是 datetime
  6. 新增一个月份列
  7. 按月份聚合平均收益
  8. 给结果表改一个更清楚的列名
  9. 怎样判断月份统计已经成立
  10. 结果仍然是 DataFrame
  11. 结果表里有月份列
  12. 结果表里有平均收益列
  13. 至少统计出一行结果
  14. 为什么月度统计结果不多
  15. 只有一个月的数据怎么办
  16. 为什么有些月的平均收益是负的
  17. 为什么一定要先新增month列
  18. groupby()结果看着像 Series 怎么办
  19. 哪些情况仍然算本讲完成
  20. 写一个最小月度统计函数
  21. 第 7 讲是在把“逐行表”变成“汇总表”
  22. 完成标准
  23. 系列衔接
  24. 风险揭示与免责声明

【pandas 系列 第7讲】按月份统计平均收益

1. 本节目标

第 7 讲把前面已经算出来的 return 列继续往上推进一步:把日收益率按月份聚合,得到每个月的平均收益。这一步很适合入门者,因为它第一次把“逐行数据”提升成“按时间段汇总的结果表”。

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

  1. 从日期列中提取月份信息。
  2. groupby() 做一次最小时间聚合。
  3. 得到一张按月份汇总的收益结果表。

2. 为什么第 7 讲开始做分组统计

前几讲都在处理单行、单列和滚动窗口。到了第 7 讲,最自然的下一步就是做一次简单聚合。因为金融数据处理中,一个非常常见的问题就是:每天的数据看得懂,但想看按周、按月、按季度汇总后的结果时,该怎么做

按月份统计平均收益,正好是最容易入门的一种聚合方式。它既不复杂,又能让你第一次真正体会到 groupby() 的价值。

3. 沿用已有return列的工作表

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

当前这一步最关键的前提,是表里已经有 datereturn 两列,而且 date 最好已经是 datetime。

4. 四步做月份平均收益统计

月度统计的关键不是公式,而是顺序。先把日期映射到月份,再按月份聚合,最后把结果表整理成一眼能读懂的样子。

5. 先确保日期列是 datetime

sorted_df['date'] = pd.to_datetime(sorted_df['date'], errors='coerce')

6. 新增一个月份列

sorted_df['month'] = sorted_df['date'].dt.to_period('M')
print(sorted_df[['date', 'month']].head())

这里的重点不是必须记住 to_period('M'),而是理解:你先要把日级别时间映射到月级别,再谈按月份聚合。

7. 按月份聚合平均收益

monthly_return = sorted_df.groupby('month')['return'].mean().reset_index()
print(monthly_return.head())

这就是第 7 讲最核心的一步。它把原来逐日的收益率,压成了一张按月份汇总的小表。

8. 给结果表改一个更清楚的列名

monthly_return = monthly_return.rename(columns={'return': 'avg_return'})
print(monthly_return)

这一步不是必须,但非常推荐。因为结果表一旦脱离原上下文,avg_return 比单纯的 return 更容易让你一眼看懂。

9. 怎样判断月份统计已经成立

判断这一讲有没有做成,重点不是结果表有多少行,而是它有没有从原来的逐日视角,真正转成按月份组织的汇总视角。

10. 结果仍然是 DataFrame

assert isinstance(monthly_return, pd.DataFrame)

11. 结果表里有月份列

assert 'month' in monthly_return.columns

12. 结果表里有平均收益列

assert 'avg_return' in monthly_return.columns

13. 至少统计出一行结果

assert len(monthly_return) > 0

14. 为什么月度统计结果不多

第一次做月度聚合时,最常见的疑问不是代码报错,而是结果“为什么只有这么几行”。这通常和样本跨度有关,不一定是逻辑出错。

15. 只有一个月的数据怎么办

那结果只有一行也是正常的。这一讲先要掌握的是聚合方式,不是追求很多月份。

16. 为什么有些月的平均收益是负的

这只是说明那个月整体偏弱,不是程序有问题。

17. 为什么一定要先新增month列

因为对入门者来说,这样最直观。你能清楚看见“每天属于哪个月份”,再做分组会更容易理解。

18. groupby()结果看着像 Series 怎么办

所以本讲推荐加 .reset_index()。它会把结果重新整理成更适合继续处理的表格结构。

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

  1. 结果只有一两个月,也算完成。
  2. 你把月份写成字符串而不是 Period 也可以,只要自己能清楚使用。
  3. 当前只统计平均收益,不必一次性加总收益、波动率等更多指标。
  4. 你可以把结果表单独命名成 monthly_return,和原表分开保存。

20. 写一个最小月度统计函数

import pandas as pd

def build_monthly_avg_return(df: pd.DataFrame) -> pd.DataFrame:
    out = df.copy()
    out['date'] = pd.to_datetime(out['date'], errors='coerce')
    out['month'] = out['date'].dt.to_period('M')
    result = out.groupby('month')['return'].mean().reset_index()
    return result.rename(columns={'return': 'avg_return'})

monthly_return = build_monthly_avg_return(sorted_df)
print(monthly_return)

21. 第 7 讲是在把“逐行表”变成“汇总表”

这是一个很重要的跨越。很多 pandas 初学者会一直停留在逐行看数据、逐列加字段的阶段,但真正的分析工作往往需要汇总视角。第 7 讲虽然只做了一个月度平均收益,但它已经帮你打开了这扇门。

22. 完成标准

如果你现在已经能把日收益率按月份聚合,得到一张带 monthavg_return 的结果表,那第 7 讲就算完成。

23. 系列衔接

本讲是《pandas金融数据入门短课》的第 7/8 讲,当前主题是《按月份统计平均收益》。

上一讲:第 6 讲《计算5日和10日均线》。

下一讲:第 8 讲《导出清洗后的行情表》。

24. 风险揭示与免责声明

风险揭示与免责声明

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

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

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

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