因子 Walk-Forward 检验工作流

易斋易斋··204 浏览

因子 Walk-Forward 检验工作流

源自论文 Interpretable Hypothesis-Driven Trading (Deep et al., 2025),提炼为国内量价因子入库的实操模板。


一、工作流总览

假设定义 → 特征构造 → Walk-Forward 切片 → 样本内训练 → 样本外测试 → 机制分层评估 → 摩擦扣减 → 入库/否决

每一步都强制信息集隔离,杜绝未来函数,目标是:不自欺欺人地拷问因子真实盈利能力


二、8 步实操流程

Step 1:假设定义(Hypothesis Specification)

原则:每个因子必须对应一条可解释的经济逻辑,拒绝"先算再解释"。

输出清单:

  • 因子名称 & 缩写(如 VOL_IMB = Volume Imbalance)
  • 经济假设(一句话):例"大单净买入预示短期价格方向"
  • 预期方向(正向/反向)
  • 预期生效条件(如"高波动期"、"放量日")
  • 止盈/止损阈值(如 8% / 4%)

入库门槛:假设不清晰 → 直接否决,不做回测。


Step 2:特征构造(Feature Engineering)

核心规则:只用当期及历史数据,严禁任何前瞻窗口

实操检查点:

检查项 说明
未来函数排查 确认计算窗口不含 T+1~T+N 数据
生存偏差 排除已退市/暂停上市股票(A股特有)
加总粒度 日频因子需声明:是否可下沉至 tick/分钟级(如论文指出日频微观结构信号天然被平滑)
缺失值处理 明确填充策略(前值/零/丢弃),不能事后根据表现选择

特征集规模建议:控制在 20~50 个,超过需先做冗余剔除(相关性 > 0.7 的同族因子只保留一个)。


Step 3:Walk-Forward 切片(数据切分)

论文硬核模板:252 天训练 + 63 天测试,步长 63 天。

针对 A 股的适配方案:

参数 论文原值 A 股建议 说明
训练窗 252 天 250 天(约1年) A 股一年约 250 交易日
测试窗 63 天 63 天(约1季度) 与季度风格切换节奏匹配
步长 63 天 63 天 保证测试折之间零重叠
最小样本 10 年 5~8 年 A 股历史较短,可适度压缩

绝对红线

  • 测试折之间 零重叠(步长 = 测试窗长度)
  • 训练期与测试期之间 零重叠
  • 不允许"训练期包含前一个测试折的数据"(即纯滚动,不做扩展窗)

生成切片后,统计总折数 K(5 年数据约 16~20 折),记录每折的起止日期。


Step 4:样本内训练(In-Sample Training)

每折独立训练,训练期数据仅限当前折的 252 天窗口。

训练内容:

  1. 因子信号统计:计算每个假设在训练期的胜率、期望收益、方差
  2. 机制标签:用训练期数据划分低波动/高波动子集(阈值:训练期波动率中位数)
  3. 仓位分配权重:基于训练期统计,为每个假设生成初始置信度权重

ε-greedy 策略(论文方法)

  • ε = 0.1(10% 随机探索,90% 按训练期最优假设行动)
  • 每个测试折开始时,ε 值可从训练期末端胜率重新校准

简化替代方案(不使用 RL)

  • 直接按训练期 Sharpe 排序,取 Top-N 因子进入测试期
  • 或按等权组合所有通过训练期 t 检验(p < 0.1)的因子

Step 5:样本外测试(Out-of-Sample Testing)

最关键的一步——所有"回测美颜"在此被挤干。

执行规则:

  1. 测试期 只读 训练期产出的权重/参数,不允许任何在线优化
  2. 每个测试折独立计算:累计收益、胜率、最大回撤、Sharpe
  3. 不做跨折参数平滑或重调

输出矩阵:

Fold | Period      | Return | WinRate | MaxDD | Sharpe | Beta | Turnover
F01  | 2020Q1      | +0.8%  | 44%     | -1.2% | 0.45   | 0.03 | 12x
F02  | 2020Q2      | -0.3%  | 38%     | -2.1% | -0.18  | 0.05 | 15x
...
F34  | 2024Q4      | +1.1%  | 46%     | -0.9% | 0.72   | 0.02 | 10x

Step 6:机制分层评估(Regime-Conditional Evaluation)

论文核心发现:低波动期因子失效 ≠ 因子本身无用,而是机制不匹配。

分层方法:

  1. 按测试期波动率(或成交量)将各折分为 低波动 / 高波动 两组
  2. 分别统计两组的均值收益和 Sharpe
  3. 若高波动组 Sharpe > 0.5 且低波动组 Sharpe < 0,判定为机制依赖型因子

实操适配 A 股:

  • 用万得全A 指数20日滚动波动率作为机制标签
  • 或用全市场成交额相对120日均值的偏离度
  • 高波动阈值:波动率 > 过去1年中位数 × 1.5

入库判定规则

机制表现 判定
两组均 Sharpe > 0.3 全周期因子,可常驻
高波动 Sharpe > 0.5,低波动 < 0 机制依赖因子,仅在高波动期启用
两组均 Sharpe < 0 否决

Step 7:摩擦扣减(Transaction Cost Deduction)

论文标准:单笔 $1 固定佣金 + 5 bps 滑点。

A 股适配:

费用项 参数 说明
佣金 万1.5(双边) 当前券商标准
印花税 千1(卖出单边) 2023年减半后
滑点 5~10 bps 视因子换手率调整
冲击成本 大单按 20 bps 占流通市值 > 0.1% 的交易

红线:摩擦扣减后 Sharpe 仍 > 0.3 才考虑入库。换手率 > 20 倍/年的因子,即使扣减前 Sharpe 高,扣减后大概率废掉。


Step 8:入库/否决决策(Admit or Reject)

最终判定矩阵:

指标 门槛 权重
扣减后全周期 Sharpe > 0.3 40%
扣减后机制 Sharpe(最优机制) > 0.5 30%
最大回撤 < 15% 15%
Beta(对基准) < 0.15 10%
假设可解释性 明确 5%

综合评分 > 60 分 → 入库,否则否决。

否决因子记录归档(假设 + 失败原因),避免未来重复测试相同逻辑。


三、A股落地建议清单

  1. 数据源下沉:日频微观结构因子天然吃亏,实操时应将数据源下沉至 Level-2 快照或分钟级,再聚合为日频信号
  2. 多空对冲测试:论文仅做多头,A股应补充 Long-Short 测试,消除 Beta 残留
  3. 退市股剔除:Walk-Forward 切片中必须排除已退市/ST 股票,防止幸存者偏差
  4. 涨跌停处理:涨停买不进、跌停卖不出,需在测试期模拟真实可执行性
  5. 风格轮动适配:A股风格切换周期约 1~2 季度,与 63 天测试窗天然匹配

四、快速参考:一页纸检查清单

□ 假设是否可解释?(一句话经济逻辑)
□ 特征是否含未来函数?(逐列检查计算窗口)
□ 切片是否零重叠?(步长 = 测试窗)
□ 测试期是否只读训练参数?(无在线优化)
□ 是否扣减了佣金+滑点+印花税?
□ 是否按机制分层评估?(低波动/高波动)
□ 是否做了多空对冲?(非纯多头)
□ 是否剔除了退市/ST 股?(防幸存者偏差)
□ 最终 Sharpe 扣减后是否 > 0.3?
□ 因子档案是否归档?(含否决原因)

源自 Deep et al. (2025) "Interpretable Hypothesis-Driven Trading",由易斋
提炼为 A 股实操模板。

评论

还没有评论,来说点什么吧
0 / 2000