一位 三十亿 规模 私募 量化 基金 的 新 研究员 周一 早会 端 PPT 走 进 会议室。"上周 我 在 沪深300 上 找到 夏普 等于 2 的 信号 —— 5 日 动量 加 行业 中性化,扣 5 bp 交易 成本,回测 2015 到 2023。" 基金 经理 问 四 个 问题。第一,"你 开始 之前 的 待 检验 假设 是 什么?" 沉默 —— 假设 是 结果 跑 出 之后 反推 的。第二,"试 了 多少 变体?" "大概 五十 个,第三 周 后 不 计数 了。" 第三,"测试集 触碰 几次?" "得 多次 调 平滑 窗口。" 第四,"别人 能 不能 从 你 的 笔记本 重现?" "不 完全 能,种子 没 设。" 四 个 答案、四 重 纪律 失败:没有 预登记、没有 实验 计数器、没有 测试集 上锁、没有 复现性。"扔 掉。重 来。先 把 假设 写 下来。" 这 节 课 教 的 就 是 让 这 四 个 答案 变 不同 的 工作流 —— 把 研究 结果 和 猜测 区分 开 的 纪律。
量化 研究 项目 的 七 个 经典 阶段
每 一 个 量化 研究 项目 —— 沪深300 上 的 动量、中证 500 上 的 反转、消费 板块 的 另类 数据 叠加 —— 都 走 同样 顺序 的 七 个 阶段。跳过 或者 调换 任何 一 个 阶段,都 会 把 验证性 研究 结构 性 地 转 成 探索性 研究,而 探索性 研究 会 系统 性 地 抬高 报告 出 的 结果。
1. question - 一个 锐利 表述 的 经济学 问题,含 universe + horizon + period
2. hypothesis - 可 证伪 的 预测,含 sign / magnitude / significance threshold
3. data sourcing - 数据集、universe、回看 窗口、survivorship-bias-free 过滤器
4. EDA guard-rails - 探索性 分析 只 在 训练 窗口 上 做;测试集 从 项目 开始 即 上锁
5. in-sample exploration - 在 训练 窗口 上 拟合、调参、迭代;每 次 试验 入 日志
6. single out-of-sample evaluation - 留出 的 测试集 每 个 项目 恰好 触碰 一次
7. decision - production / paper-trade / abandon;阈值 在 评估 前 已 预设
第一 阶段 question 不是 预测。"沪深300 成分股 在 2015 年 后 5 日 上 是否 存在 盈余 漂移?" 是 问题 —— 在 既 定 数据集 上 有 是 / 否 答案。"我 要 找 alpha" 是 愿望,不 是 问题。问题 必须 在 你 触 数据 之前 就 圈 定 universe、horizon、时间 区间。
第二 阶段 hypothesis 是 可 证伪 伴生。"沪深300 成分股 大于 2σ 正向 盈余 意外 后 5 日 收益 至少 +0.5%,t > 3" 是 假设 —— 有 方向(正)、量级(50 bp)、显著性 阈值(t > 3)。"盈余 意外 预测 收益" 太 模糊。纪律 口号:假设 先于 数据。
第三 阶段 data sourcing 定 数据集(Wind 全 A 日 频)、universe(沪深300 / 中证500 / 中证1000)、回看 窗口(2010 起 算)与 4.1.1 L4 的 survivorship-bias-free 过滤器。每 一 项 选择 入 文档。
第四 阶段 EDA guard-rails 是 文化 分 水 岭。探索性 分析 只 在 训练 窗口 上 做;测试集 由 工程 层 上锁(test_set_seal.lock、data/test/ 在 EDA notebook 里 不 加载)。第五 阶段 in-sample exploration 自由 迭代 —— 每 次 试验 入 日志。第六 阶段 single out-of-sample evaluation 触碰 一 次;不 过 线 项目 即 结束。第七 阶段 decision 机械 执行:阈值 第二 阶段 已 预设,结果 直 触发 production / paper-trade / abandon。
预登记:从 临床 试验 借 来 的 纪律
预登记 是 在 拟合 任何 模型 之前 把 假设、评估 指标、universe、窗口、决策 阈值 与 试验 计数器 写 下来 的 实践。落地 形式 是 项目 开始 时 提交 到 git、带 时间戳 的 一 页 文档。纪律 来自 临床 试验 与 开放 科学 运动;买 方 量化 行业 在 2015-2020 年 跟 进,背景 是 Lopez de Prado 《Advances in Financial Machine Learning》 与 Harvey-Liu-Zhu 2016 关于 横截面 收益 预测 因子 通胀 的 论文。
预登记 模板 包含 六 个 字段,按 此 顺序 排列,字段 名 跨 区域 保持 字节 一致:
(i) question - 一句话
(ii) hypothesis - 方向、量级、显著性 阈值
(iii) universe + window - 数据 过滤 与 时间 区间
(iv) metric - 主 评估 指标(Sharpe / IC / IR;扣除 交易 成本)
(v) decision threshold - 触发 production / paper-trade / abandon 的 预设 数值
(vi) trial counter - 从 1 开始,每 加 一 个 变体 加 1;将 进入 L3 的 多重 检验 修正
附 文化 规则:预登记 是 合规 的 认识论 孪生 —— 拟合 前 写 下 假设、指标、universe、窗口、阈值 与 试验 计数器。AMAC 中国 证券 投资 基金业 协会 信息 披露 要求 下 监管 想 看 的 即 是 这 六 字段;认识论 与 合规 两 重 纪律 相互 强化。
对 5 日 动量 信号 在 510300 沪深 300 ETF 上 的 预登记 实例:
question: "5 日 动量 信号 在 沪深 300 成分股 2022-2023 年 区间 内 是否 生成 样本外 alpha?"
hypothesis: "5 日 动量 信号 `mom_5d = (close_t / close_{t-5}) - 1` 在 沪深 300 成分股 2015-2023 年 区间 日 频 上 计算,在 2022-2023 留 出 窗口 上 净 扣 单 边 5 个 基点 交易 成本 后 的 样本外 夏普比率 大于 1.0。"
universe: "沪深 300 成分股,月度 刷新,剔除 ST 与 停牌 名 单"
window: "2015-01-01 to 2023-12-31"
train_window: "2015-2021"
test_window: "2022-2023"
metric: "样本外 夏普 比率 扣 单 边 5 bp 交易 成本,配合 DSR"
decision_threshold: "Sharpe > 1.0 and DSR > 0.95 → paper-trade for one quarter; otherwise abandon"
trial_counter: 1
阈值 规则 Sharpe > 1.0 and DSR > 0.95 → paper-trade for one quarter; otherwise abandon 跨 区域 字节 一致;标的 代码 与 universe 名 称 按 区域 填 入。
探索性 分析 与 验证性 分析
探索性 数据 分析(EDA)允许 在 训练 窗口 上 做 —— 画 分布、算 摘要 统计、找 异常 值、形成 假设、迭代。验证性 分析 就 是 第六 阶段 的 单 次 样本外 评估。每 一 个 从 验证性 开始 的 项目,如果 测试集 上锁 不 在 每 一 层 都 落实,一 周 之内 都 会 漂 向 探索性。
测试集 上锁 的 四 个 执行 层,按 此 顺序:
1. engineering - 文件系统 权限;`test_set_seal.lock` 文件;`data/test/` 分区 EDA 不 加载
2. cultural - 每 次 站会 都 有 人 问 "你 看 测试集 了 吗?" —— 例行 检查,不是 控告
3. code-review - L4 的 PR 模板 含 一 个 勾 选 框 "测试集 恰好 评估 一 次"
4. statistical - L3 的 多重 检验 修正 部分 抵消 未 被 发现 的 漂移
规则:每 一 个 从 验证性 开始 的 项目,如果 测试集 上锁 不 在 四 层 全部 落实,一 周 之内 都 会 漂 向 探索性。EDA 是 常态;验证 是 稀有 事件;测试集 触碰 一 次。
研究 实验 日志
每 一 次 拟合 都 入 日志。实验 日志 每 条 必须 记录 的 五 个 字段,按 此 顺序:
timestamp - 含 时区 的 ISO-8601
hyperparameters - 每 一 个 可 调 参数 的 JSON dict
seed - 整数;RNG 种子;不 允许 为 空
data_window - 拟合 用 的 日期 区间 与 验证 用 的 日期 区间
metric_outcome - 主 指标 数值 加 辅助 指标
实验 日志 决定 L3 多重 检验 修正 的 N —— 数 不 清 假设 就 没 法 修正。日志 是 CSV / SQLite 表 / mlflow run-id 流,与 notebook、脚本 一起 提交 到 git。报告 里 每 一 张 图 带 run_id,可 从 run_id 重 生;日志 是 项目 尝试 的 唯一 真值 源。
Notebook 与 脚本
Notebook(Jupyter、.ipynb)是 想法 诞生 的 地方。自由 形式、图 多、文字 注解 重;研究员 偷看 数据、原型 信号、断 与 修。生产 脚本(run_experiment.py,--config=<config-id> 调用)是 结果 可 复现 的 地方 —— 给 定 lock 文件、数据 快照、种子 与 git commit SHA 输出 确定。
迁移 规则:结果 升级 到 实盘(影子 交易 / 仿真 交易 / 生产)时,notebook 两 周 内 改 写 为 脚本;孤儿 notebook 直接 删除。
完整 研究 项目 的 四 项 经典 产出
一 个 完整 的 研究 项目 恰好 产出 四 项 经典 artefact,按 此 顺序:
1. pre-registration document - 拟合 之前 的 六 字段 模板
2. experiment log - 每 次 拟合 的 hyperparameters / seed / data window / metric / outcome / timestamp
3. single out-of-sample evaluation result - 触碰 一 次
4. write-up - 供 人 审阅 的 整 理 后 叙述
规则:四 项 缺 一 即 猜测。少 (1) 无 法 判断 发现 是 提 前 假设 的 还 是 事 后 拟合 的;少 (2) 无 法 应 用 多重 检验 修正;少 (3) 已 数据 窥视;少 (4) 经 不 起 同行 复核。
早会 诊断
本 节 开头 基金 经理 问 的 四 个 诊断 问题,是 全 四 重 纪律 的 实战 检验,按 此 顺序:
1. What was your hypothesis before you started? - tests pre-registration
2. How many variants did you try? - tests trial-counter / multiple-testing
3. Did you touch the test set more than once? - tests the test-set lock from L2
4. Can someone else reproduce this from your notebook? - tests the reproducibility from L4
能 通过 四 问 的 是 研究 结果,过 不 了 的 是 猜测。这 四 问 是 买 方 量化 对 本 模块 下游 四 重 纪律 的 实战 检验;私募 量化 巨头(明汯、幻方、中诚、灵均、九坤 投资)自 2020 年 起 已 把 这 套 沉淀 为 标准 评审 流程。
工作 实例:510300 动量 预登记
把 510300 动量 研究 套 进 七 阶段:(1) question 5 日 动量 在 沪深300 成分股 2022-2023 区间 是否 生成 样本外 alpha?(2) hypothesis mom_5d = (close_t / close_{t-5}) - 1 在 2022-2023 留 出 窗口 上 净 扣 5 bp 后 Sharpe > 1.0 且 DSR > 0.95。(3) data sourcing Wind 日 频 2015-2023、沪深300 月 度 刷新、剔除 ST 与 停牌。(4) EDA guard-rails data/test/(2022-2023)由 test_set_seal.lock 上锁;EDA 只 加载 data/train/(2015-2021)。(5) in-sample exploration 在 2015-2021 上 拟合、调参;每 变体 入 experiments.db。(6) single out-of-sample evaluation 调参 冻结 后 破封 data/test/seal 一 次,算 Sharpe + DSR。(7) decision 若 Sharpe > 1.0 且 DSR > 0.95 → 私募 影子 交易 一 季 度;否则 放弃。试验 计数器 即 L3 修正 的 N。
Formula Explorer
\text{Sharpe} = \frac{E[R_p] - R_f}{\sigma_p}夏普比率、Alpha 衰减、信息比率、因子模型 中 各 类 因子 暴露、动量、最大回撤、下游 4.4 的 均值方差优化 与 组合优化、监管 级 压力测试 场景:这 些 是 预登记 触及 但 不 推导 的 词汇 锚点 —— 推导 留 给 4.2.3、4.4 与 2.2。
练习
Exercise
你 正在 开始 一 个 关于 510300 沪深 300 ETF 的 5 日 动量 信号 研究 项目。按 顺序 产出 四 项 经典 研究 artefact。
(i) 写 一 份 完整 的 一 页 预登记 文档,填 完 六 个 字段:question、hypothesis(方向、量级、显著性 阈值)、universe + window、metric、decision threshold、trial counter。假设 必须 给 出 (a) 预测 效应 的 方向,(b) 效应 的 量级,(c) 决策 的 显著性 阈值。
(ii) 给 出 EDA guard-rails:数据 的 哪 些 分区 上 可以 跑 EDA?哪 些 分区 上锁?
(iii) 给 出 七 阶段 项目 计划,每 阶段 用 一 句话 描述 将 要 发生 什么;计划 必须 把 测试集 评估 放 在 阶段 6、决策 放 在 阶段 7。
(iv) 列 出 工程 层(测试集 权限、依赖 锁、随机数 种子)防 范 的 三 种 失败 模式 与 文化 层(代码 评审、站会、写 报告 仪式)防 范 的 三 种 失败 模式。
报告 全部 四 项 artefact。
提示
question / hypothesis / universe + window / metric / decision threshold / trial counter;假设 必须 名 方向、量级、阈值。提示
参考 卡
本 课 装 配 的 组件,按 序:
- Inline-code listing —— 量化 研究 项目 的 七 个 经典 阶段。
- Inline-code listing —— 预登记 模板 的 六 个 字段。
- Inline-code listing —— 完整 研究 项目 的 四 项 经典 产出。
- Inline-code listing —— 早会 基金 经理 问 的 四 个 诊断 问题。
- Fenced ```yaml block —— 510300 动量 研究 的 一 页 预登记 模板。
- Inline-code listing —— 测试集 上锁 的 四 个 执行 层。
- Inline-code listing —— 实验 日志 每 条 必 录 的 五 个 字段。
- Exercise —— 四 项 研究 artefact 综合 练习,配 两 条 渐进 Hint。
- FormulaExplorer —— 夏普比率 定义
(E[R_p] - R_f) / σ_p。
下 一 课
本 课 工作流 直 接 流 入 下 一 课 「样本内 / 样本外 与 交叉 验证」。你 将 学 四 种 分割(简单 时序 留 出、滚动 样本外、扩张 样本外、purged + embargoed k 折)、四 种 泄漏 模式(look-ahead、survivorship、snooping、regime)。本 课 试验 计数器 在 L3 成为 多重 检验 修正 的 N;实验 日志 在 L4 与 git commit SHA 绑 定。口号:一 个 项目 由 书面 假设、预登记 指标、单 次 样本外 评估 与 报告 定义;少 任 一 即 猜测。