能力子页 · 因子与挖掘
tick-stock-panel 因子平台与挖掘:怎么防住过拟合
因子研究最容易骗的不是自己的眼睛,而是自己的流程。本页拆开 tick-stock-panel 在这件事上的具体设计:编辑器里的算子与字段、三类检验量、嵌套 walk-forward 与 purge 接口、六条硬门槛,以及它明确不做的四件事。
tick-stock-panel 的因子平台有哪几个标签页?
它不是一个一键跑完的黑盒,而是四个分工明确的标签页。每一个都能单独用,也可以连起来用。
| 标签页 | 它做什么 | 适合谁 |
|---|---|---|
| 检验 | 跑 IC / IR、Newey-West t 值、BH-FDR q 值、分层收益与多空对比 | 想知道一个因子到底有没有信息含量的人 |
| 因子库 | 管理已有因子与生命周期状态(活跃 / 观察 / 退休 / 草稿) | 需要把因子当资产管理而不是一次性试验的人 |
| 编辑器 | 用 DSL 写自定义因子,**25 个算子**与 **79 个可用字段**(双语 chip) | 有明确因子假设、想直接写成表达式的人 |
| 组合 | 多因子组合试算 | 想看多个因子叠起来效果的人 |
TSP 用哪些统计量判断一个因子有没有用?
下表列出因子检验里实际用到的五类量,并说明它们各自防的是什么偏差。
| 统计量 | 它回答什么问题 | 为什么需要它 |
|---|---|---|
| IC / IR | 因子值与未来收益的相关性及其稳定性 | IC 看方向与强度,IR 看稳定性;只看 IC 不看 IR 会把偶尔有效的因子当成好因子 |
| Newey-West t 值 | 在存在自相关与异方差时,IC 序列的统计显著性 | 普通 t 检验在时间序列上会高估显著性,这是因子研究里最常见的假阳性来源之一 |
| BH-FDR q 值 | 在同时检验很多因子时,控制错误发现率 | 你一次性试 50 个因子,总会有几个“显著”;多重检验校正就是为了拆穿这一点 |
| 分层收益 | 把因子值分成外层后看各层收益单调性 | 单调性比单一 IC 数字更难作弊;分层乱掉往往意味着因子形状不稳定 |
| 多空对比 | 按因子排序后做多头与空头的对比 | 它把 IC 换算成更接近“能不能用”的形式,也能看出是否只在一侧有效 |
TSP 的因子怎么进到策略里去?
官方设了四条桥,分别面向不同的下一步动作。选对桥比重写一个策略省事。
| 方向 | 具体做法 | 典型场景 |
|---|---|---|
| 因子库 → 策略 | 因子库里点「生成策略」,得到一个单因子排名策略 | 你已经验证了一个因子,想看它在完整回测里的表现 |
| 因子 → 信号 | 策略触发器编辑里的 Zap 按钮从因子快速创建条件信号 | 想把因子当作监控或策略的一个条件,而不是整个排序依据 |
| 因子 → AI 生成信号 | AI 生成信号的提示词里包含全部因子分组与 id | 让 AI 在你已有的因子体系里找组合,而不是凭空发明 |
| 回测 → 因子归因 | 回测的「因子归因」标签页反向消费因子值 | 回测跑完后回头看哪些因子在拖后腿 |
tick-stock-panel 的挖掘到底能做什么、不能做什么?
官方对挖掘 V1 的边界写得很硬,知道这些才不会对它抱错期望。
为什么这么保守?因为一旦允许任意公式或任意代码,搜索空间会大到无法用统计手段约束,得到的结果也就无法审计。把搜索限制在你自己已经写好的因子与策略里,每一个候选都能被你读懂——这是这个模块最大的取舍。
tick-stock-panel 是怎么防住样本外泄露的?
下面是防泄露链路的七个环节,每一环都对应一个具体机制。
tick-stock-panel 的防泄露链路:七步看完
内层循环:每个训练折里独立学一遍
方向、统计、去重与组合搜索都在内层独立完成,而不是拿全量数据学一次、在各折重用。
内层测试只选候选
内层 test 不参与训练,只用来选出候选项。这一步防的是「用测试集调参数」。
选完后在完整外层训练重训
候选确定后,在整个 outer train 上重新训练,而不是直接拿内层的参数。
purge 与 embargo
训练与测试之间保留间隔,默认 purge = 30 个交易日。它防的是指标窗口跨界导致的泄露——即使你不用未来价,跨界的滚动窗口也可能把未来信息带进训练集。
外层测试只做一次
outer test 只做最终样本外评估,不反复跑。一旦你开始根据 outer test 结果调参数,它就不再是样本外了。
T-1 环境口径
交易日 T 只能用上一交易日的环境标签;缺前驱时 fail-closed,绝不用当日环境、最近自然日或默认环境补齐。
tick-stock-panel 的发布门槛有哪六条?
这六条由服务端强制执行。本节把每一条拆开,说明它在防什么。
| 发布门槛 | 具体条件 | 它在防什么 |
|---|---|---|
| 置信度档位 | 不得为 exploratory | exploratory 档只能作低置信度 pending 候选,不允许发布 |
| 有效折数 | 至少 2 个有效 outer 折 | 防止只跑了一段就当成全部样本外证据 |
| 正收益折比例 | 正收益的折数 ≥ 2/3 | 防止收益集中在某一段特殊行情里 |
| 样本外 Sharpe | ≥ 0.5 | 一个低于此的策略在扣成本后几乎没有意义 |
| 最大回撤 | 不劣于 −25% | 控制尾部风险;收益再好,回撤超限也不可用 |
| 样本外交易数 | ≥ 60 | 防止结果靠少数几笔交易撑起来 |
tick-stock-panel 的三档置信度差在哪里?
差别不在算法,在你花多少计算量换多少统计信心;同时说清“保存 vs 发布”为什么要分开。
| 置信度档 | inner train / inner test / outer train(交易日) | 适合场景 |
|---|---|---|
| exploratory | 126 / 63 / 63 | 初步探索因子形状;只能产生低置信度 pending 候选,不能发布 |
| balanced | 504 / 126 / 63 | 默认档;至少 3 个 outer folds,在样本量与耗时之间取平衡 |
| strict | 756 / 126 / 126 | 正式评估;至少 3 个 outer folds,样本外证据最充分 |
tick-stock-panel 挖掘在运行上有哪些硬限制?
下表列出可能直接影响你部署方式的几条限制,尤其是那条「必须单应用进程」。
| 限制 / 行为 | 官方口径 | 你该怎么避坑 |
|---|---|---|
| 单应用进程要求 | run store 与重任务 limiter 用进程内锁,生产环境必须只启动一个应用进程负责挖掘 | 不要在同一份数据目录上跑多个实例并行挖掘 |
| 任务隔离 | 挖掘在 spawn 子进程执行,浏览器断开不取消任务 | 关页面不会中断任务,但不要因此就反复开新任务 |
| 重任务容量 | 共享重任务限流容量为 2:普通回测 / 优化 / walk-forward / 矩阵预热占 1,挖掘独占 2 | 挖掘跑着时发起大回测会排队,不是 bug |
| 历史快照回填偏差 | 概念成分为当前快照 | 不要把历史主线当护城河标签用于长历史回测 |
| 财务因子时点 | 只在晚于公告日的交易日生效,公告前空值且从截面剔除 | 不要手动把财务值向前填充 |
| 统计口径变更 | mining-v2 修了缺失掩码下的 pairwise Spearman,因此 correlation artifact 与 v1 不再要求数值相等 | 升版后不要用旧结果做一一对比当作回归失败 |
第一次用 TSP 的因子与挖掘,该按什么顺序走?
下面八步是本站归纳的顺序:先把因子跑通、再进挖掘,每一步都有明确的停止条件,避免一上来就用最重的档位。
第一次用因子平台与挖掘,按这八步走
先把因子写出来并过检验
在编辑器里用 DSL 写好表达式,先看 40 日试算的 IC,确认方向与量级没有明显问题,再进因子库。
存入因子库并标状态
新因子建议先标为草稿或观察,等它在不同区间都稳定后再转活跃。状态本身不影响公式,但它帮你区分“还在试”和“已经能用”。
用因子作为策略的评分项
从因子库点「生成策略」,得到一个可回测的单因子排名策略。先用它跑一次普通回测,看它在不同区间的表现。
再选挖掘的策略与因子集
挖掘只研究你明确选中的矩阵原生日线策略,以及已有的日频因子。选得越少,搜索空间越小,结果越容易被你读懂。
先用 exploratory 抑住预期
第一次跑建议用低档位,目的不是拿结果,而是估计你的机器与数据规模跑一次要多久。
看候选与证据行
先看 selected 与 benchmark 两类行的对比,再看 cross 行判断该组合在其他折是否也成立。
最后才决定是否发布
发布前逐条对六条门槛。不过就先把它留在 pending,等数据或参数变了再说——保存不会阻止任何东西。
tick-stock-panel 因子与挖掘常见问题
以下答案基于官方仓库与文档的核验结果;涉及版本、数据源口径与许可条款的内容一律以官方仓库与官方文档为准。挖掘会不会自动把策略上线?
不会,这是官方设计里最硬的一条。保存与发布是分离的两个动作:保存始终允许,结果进 pending;发布需要你显式操作,而且客户端只能提交 run ID 与候选签名,不能提交策略 ID、权重、方向、公式或代码。即使你开了自动周度挖掘,它也只生成 pending 结果,永远不会自动发布。这意味着“自动化”在这个模块里只做到产生候选为止。
嵌套 walk-forward 和普通 walk-forward 差在哪里?
差在“参数在哪里学”。普通 walk-forward 很容易写成:用全量历史确定一组参数,然后在各个滚动窗口重用。tick-stock-panel 做的是每个 inner 训练折里独立学习方向、统计、去重与组合搜索,inner test 只用来选候选,选完之后才在完整外层训练重训,最后在外层测试上只评估一次。两者的区别不在算法名字,在“生成候选的那一步看不看得到测试集”。
purge 和 embargo 到底在防什么?我都已经只用已收盘数据了。
防的是指标窗口跨界。即使你不用未来价,一个 20 日均线在训练期末尾九之带了一部分测试期的价格信息,就等于把未来渗进了训练集。官方的做法是在训练与测试之间保留间隔,默认 purge = 30 个交易日,并一并做 embargo。这是一个不会在图上看到效果、但会直接决定结论真假的设置。
T-1 环境口径是什么意思?为什么缺了就不算?
它的含义是:交易日 T 只能使用上一交易日已得到的环境标签,统计与挖掘把它聚合为三档(强、震荡、弱)。缺前驱时它选择 fail-closed:不用当日环境、不用最近自然日、也不填默认环境。宁可少一天样本,也不能把当日才知道的环境当成前驱用——那是一种比价格泄露更隐蔽的泄露。
官方对性能的说法能直接当成我的预期吗?
不能,而且官方自己就把这件事写明了。它公布了一组基准结果(包括峰值内存与总耗时),但同时声明:这些结果只证明该基准工作负载达到目标,不表示所有数据规模与搜索预算都具有固定内存上界。本站引用时也会标明“官方自测、本站未复现”。你的股票池、因子数量与预算不同,结果就不同。实际使用时建议把它当成「上限参考」而非「预期值」:先用 exploratory 档跑一遍看内存与耗时量级,再决定是否上 balanced 或 strict。
为什么要单应用进程?我想多开几个提速。
不建议。官方明确说了原因:run store 与重任务 limiter 用的是进程内锁,因此生产环境必须只启动一个应用进程负责挖掘。多开实例不会提速,反而会让限流与任务状态失控。另外共享重任务容量只有 2:普通回测、优化、walk-forward 与矩阵预热占 1,挖掘独占 2。所以挖掘跑着时发起大回测会排队,这是设计而不是故障。