因子计算实战:用 pandas 计算动量与估值因子
因子计算实战|用 pandas 计算动量与估值因子
这节课学什么
本节把原始行情和财务数据转换为可检验的因子矩阵。你将计算20日动量MOM20和盈利收益率EP,完成时间对齐、去极值、标准化和分组检查。先修要求是会使用 pandas 的排序、分组和合并。
两个因子的定义
动量使用复权收盘价,估值使用当时已披露的盈利与截面市值:
MOM20(i,t) = P_adj(i,t) / P_adj(i,t-20) - 1
EP(i,t) = NetProfit_TTM(i,t) / MarketValue(i,t) = 1 / PE_TTM(i,t)
EP比直接使用PE更适合线性排序,但亏损公司会产生负值,不能简单当作异常删除。财务字段必须按公告日生效,不能按报告期结束日连接。
price = price.sort_values(["symbol", "trade_date"])
price["mom20"] = price.groupby("symbol")["adj_close"].pct_change(20)
factor = price.merge(finance_asof, on=["symbol", "trade_date"], how="left")
factor["ep"] = factor["net_profit_ttm"] / factor["market_value"]
横截面处理
每个交易日分别处理,不能把所有日期混在一起标准化。先用分位数或MAD去极值,再计算z-score。保留原始值、处理后值和异常标记,方便追溯。随后按五分位分组,检查每组数量、均值和未来收益。
实操任务
选择连续两年的月末交易日生成因子矩阵,输出 symbol、trade_date、mom20、ep、mom20_z、ep_z。分别计算两个因子的月度IC和五分组收益,再查看二者相关性。若合成因子,先用等权 score=(mom20_z+ep_z)/2 建立基线,不要一开始就优化权重。
本节学习方法
建议先完整阅读概念和公式,再按照实操步骤独立完成一次。不要直接复制最终结果:先记录数据范围、字段口径和预期现象,运行后对照检查。若结果不同,应从复权方式、交易日对齐、缺失值、可交易状态和费用假设逐项排查。每次练习保存代码版本、参数、运行日期和结果截图,形成可以复现的研究记录。
课后检查
- 能否用自己的话解释本节核心概念,而不是只背公式;
- 能否指出输入数据的主键、时间字段和单位;
- 能否让同一份代码在相同数据上得到一致结果;
- 能否解释结果的局限性,以及哪些变化会让结论失效;
- 能否区分研究结果、模拟结果与真实交易结果。
本课程用于量化研究方法学习,不构成个股推荐、收益承诺或投资建议。示例参数用于演示计算过程,不代表适合任何真实账户。