基础入门
从日期列提取月份信息,并用 groupby 对日收益率做月度平均统计,完成从逐行表到汇总表的第一次过渡。
第 7 讲把前面已经算出来的 return 列继续往上推进一步:把日收益率按月份聚合,得到每个月的平均收益。这一步很适合入门者,因为它第一次把“逐行数据”提升成“按时间段汇总的结果表”。
学完这一讲后,你可以直接完成下面几件事:
groupby() 做一次最小时间聚合。前几讲都在处理单行、单列和滚动窗口。到了第 7 讲,最自然的下一步就是做一次简单聚合。因为金融数据处理中,一个非常常见的问题就是:每天的数据看得懂,但想看按周、按月、按季度汇总后的结果时,该怎么做。
按月份统计平均收益,正好是最容易入门的一种聚合方式。它既不复杂,又能让你第一次真正体会到 groupby() 的价值。
print(sorted_df[['date', 'return']].head())
当前这一步最关键的前提,是表里已经有 date 和 return 两列,而且 date 最好已经是 datetime。
月度统计的关键不是公式,而是顺序。先把日期映射到月份,再按月份聚合,最后把结果表整理成一眼能读懂的样子。
sorted_df['date'] = pd.to_datetime(sorted_df['date'], errors='coerce')
sorted_df['month'] = sorted_df['date'].dt.to_period('M')
print(sorted_df[['date', 'month']].head())
这里的重点不是必须记住 to_period('M'),而是理解:你先要把日级别时间映射到月级别,再谈按月份聚合。
monthly_return = sorted_df.groupby('month')['return'].mean().reset_index()
print(monthly_return.head())
这就是第 7 讲最核心的一步。它把原来逐日的收益率,压成了一张按月份汇总的小表。
monthly_return = monthly_return.rename(columns={'return': 'avg_return'})
print(monthly_return)
这一步不是必须,但非常推荐。因为结果表一旦脱离原上下文,avg_return 比单纯的 return 更容易让你一眼看懂。
判断这一讲有没有做成,重点不是结果表有多少行,而是它有没有从原来的逐日视角,真正转成按月份组织的汇总视角。
assert isinstance(monthly_return, pd.DataFrame)
assert 'month' in monthly_return.columns
assert 'avg_return' in monthly_return.columns
assert len(monthly_return) > 0
第一次做月度聚合时,最常见的疑问不是代码报错,而是结果“为什么只有这么几行”。这通常和样本跨度有关,不一定是逻辑出错。
那结果只有一行也是正常的。这一讲先要掌握的是聚合方式,不是追求很多月份。
这只是说明那个月整体偏弱,不是程序有问题。
因为对入门者来说,这样最直观。你能清楚看见“每天属于哪个月份”,再做分组会更容易理解。
所以本讲推荐加 .reset_index()。它会把结果重新整理成更适合继续处理的表格结构。
Period 也可以,只要自己能清楚使用。monthly_return,和原表分开保存。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)
这是一个很重要的跨越。很多 pandas 初学者会一直停留在逐行看数据、逐列加字段的阶段,但真正的分析工作往往需要汇总视角。第 7 讲虽然只做了一个月度平均收益,但它已经帮你打开了这扇门。
如果你现在已经能把日收益率按月份聚合,得到一张带 month 和 avg_return 的结果表,那第 7 讲就算完成。
本讲是《pandas金融数据入门短课》的第 7/8 讲,当前主题是《按月份统计平均收益》。
上一讲:第 6 讲《计算5日和10日均线》。
下一讲:第 8 讲《导出清洗后的行情表》。
风险揭示与免责声明
本页面内容仅用于量化研究与技术交流,旨在展示研究方法与流程,不构成对任何金融产品、证券或衍生品的要约、招揽、推荐或保证。
本文所涉历史数据、回测结果与示例参数不代表未来表现,也不应作为投资决策依据。
市场存在波动、流动性与执行偏差等不确定性,任何策略均可能出现收益波动或阶段性失效。
读者应结合自身风险承受能力进行独立判断,并在必要时咨询持牌专业机构意见。