因子投资-实验05-价值与动量分层回测
构造 24 个形成月、30 只股票的确定性面板,计算 EP 和 12-1 动量,分别做单变量三分组,再做独立 3×3 双排序。输出单因子 H-L、控制另一因子后的价值与动量边际收益,以及等权多空目标组合的换手。
问题
构造 24 个形成月、30 只股票的确定性面板,计算 EP 和 12-1 动量,分别做单变量三分组,再做独立 3×3 双排序。输出单因子 H-L、控制另一因子后的价值与动量边际收益,以及等权多空目标组合的换手。
这个实验重点验证三件事:信号只影响下一期收益;独立双排序每期 9 个单元非空;联合控制后的边际收益与单变量收益不是同一个对象。
输入数据
代码先生成 37 个月收益历史。前 13 个月只用于建立动量窗口;从索引 12 到 35 形成 24 个信号月,并把索引 t+1 作为未来收益。
- 30 只股票分成三种基础趋势,保证动量横截面可识别;
- EP 组随月份轮换,产生持仓变化;
- future_return 由当期 EP 状态、历史动量状态和小幅确定性噪声组成;
- 所有日期、股票、公式和参数都在代码中,不依赖外部数据。
这是算法测试夹具,不是模拟真实 A 股分布。人工嵌入的收益关系不能作为因子有效证据。
逐步实现
1. 计算 12-1 动量
1 | |
切片包含 t-12 至 t-2,共 11 个月,排除 t-1 最近月。代码同时保存 signal_date 和 return_date,并断言后者更晚。
2. 独立三分组
1 | |
两个断点分别从各自边际分布产生,故为独立双排序。先 EP 后在组内排动量会变成条件双排序,结果不能混称。
3. 单因子与双排序边际收益
单因子 EP H-L 直接比较 EP 高低组。双排序价值边际收益先在每个动量组内算高 EP 减低 EP,再对三个动量组等权平均;动量边际收益反之。
4. 换手
多空目标权重在高组为 +1/n(H),低组为 -1/n(L)。从第二个月开始:
这是目标权重直接比较,未考虑持有期收益造成的权重漂移;真实成本实验会在实验 07 修正。
完整代码
1 | |
预期输出
程序应生成 720 行点时面板、24 行月度结果。ep_hl、mom_hl、double_ep、double_mom 均应为有限数,每期 3×3 的 9 个单元都非空。
由于生成过程给 EP 状态和趋势状态分别加入正方向收益,四类平均收益应为正;具体小数由确定性正弦噪声决定。EP 状态每月轮换,因此 ep_turnover 显著高于零;动量状态更稳定,mom_turnover 应较低。
不要把“预期为正”写成对程序的强制断言。真正的回测函数必须允许因子失效;这里只断言结构、日期、完整性和有限数。
断言
- 面板恰有 24×30=720 行。
- 每行 return_date 严格晚于 signal_date。
- signal_date、asset 联合唯一。
- 每月独立 3×3 双排序的 9 个单元都非空。
- 四类月收益无缺失且为有限数。
- 换手除首月外可计算,摘要均为有限数。
真实数据还需断言财报公告早于 signal_date、动量月份连续、EP 分母有效、每组市值覆盖、停牌和退市收益处理、权重和与成交可行性。
结果解释
ep_hl 是不控制动量的价值差,double_ep 是在三个动量组内分别比较价值后再平均。两者接近说明本样本中 EP 与动量混杂较小;差异大则说明单变量价值收益包含动量暴露或交互。
独立双排序保证 EP 与动量各用自己的全市场断点,但不能保证每个交叉单元规模相同。真实样本应保存单元数量、权重、市值和行业覆盖;单个很小单元会让边际收益不稳定。
换手使用目标权重,没有考虑收益漂移、无法成交和交易成本,因此是下界式教学指标。ep_state 人工轮换导致高换手,说明一个统计关系即使为正,也可能在净收益层面失败。
12-1 动量来自真实滚动历史,不是直接用 future_return 排序。收益 t+1 写入后,只会在未来更晚的形成窗口中进入历史;跳过最近月进一步隔开同月机械关系。
常见故障
- rolling 切片包含最近月或未来月。
- EP 使用 return_date 市值或尚未公告盈利。
- 独立排序被误实现为先 EP 后组内动量。
- qcut 遇并列值时偷偷减少组数。
- 交叉单元为空仍用 skipna 平均,隐藏问题。
- 换手只比较股票集合,不比较权重。
- 第一月没有前期权重却填成零换手,拉低平均。
- 双排序边际收益按股票数而非单元组合等权,改变定义。
- 人工数据中的正收益被误解为经验发现。
练习
- 将独立双排序改为“先 EP、后组内动量”的条件排序,比较结果。
- 将单元等权平均改为按单元市值加权,说明经济问题变化。
- 让 EP 与动量完全相关,观察哪些 3×3 单元为空,并解释独立识别失败。
- 用收益漂移后的再平衡前权重重算换手。
- 加入单边 20 基点成本,比较单因子和双排序净收益。
- 把人工收益中的 EP 系数设为零,验证程序仍能正常输出而不强制正收益。