能力子页 · 因子与挖掘

tick-stock-panel 因子平台与挖掘:怎么防住过拟合

因子研究最容易骗的不是自己的眼睛,而是自己的流程。本页拆开 tick-stock-panel 在这件事上的具体设计:编辑器里的算子与字段、三类检验量、嵌套 walk-forward 与 purge 接口、六条硬门槛,以及它明确不做的四件事。

本页回答:怎么写因子 / 怎么防过拟合 / 能不能自动上线依据:官方 docs/mining.md 与 docs/features.md官方基准数字标注为官方自测,本站未复现
内层训练
内层测试
外层训练
外层测试
tick-stock-panel 嵌套 walk-forward 划分与防泄露机制示意(依据官方 docs/mining.md 与 docs/features.md 整理的 schematic,非官方回测报告)。每层训练与测试之间保留 purge 与 embargo(默认 purge 30 个交易日);本图不包含任何收益数字。
Factor workbench

tick-stock-panel 的因子平台有哪几个标签页?

它不是一个一键跑完的黑盒,而是四个分工明确的标签页。每一个都能单独用,也可以连起来用。

标签页它做什么适合谁
检验跑 IC / IR、Newey-West t 值、BH-FDR q 值、分层收益与多空对比想知道一个因子到底有没有信息含量的人
因子库管理已有因子与生命周期状态(活跃 / 观察 / 退休 / 草稿)需要把因子当资产管理而不是一次性试验的人
编辑器用 DSL 写自定义因子,**25 个算子**与 **79 个可用字段**(双语 chip)有明确因子假设、想直接写成表达式的人
组合多因子组合试算想看多个因子叠起来效果的人
DSL 的两个细节,实际用的时候很关键:一是校验报错可以点击定位到字符,而不是只给一句“表达式无效”;二是编辑器可以先用 40 日样本试算看 IC,不必等完整回测。另外字段数量不是固定的:你通过数据扩展接进来的字段(列名带扩展前缀)会自动出现在可用字段列表里,也可以直接用来写因子。
Statistics

TSP 用哪些统计量判断一个因子有没有用?

下表列出因子检验里实际用到的五类量,并说明它们各自防的是什么偏差。

统计量它回答什么问题为什么需要它
IC / IR因子值与未来收益的相关性及其稳定性IC 看方向与强度,IR 看稳定性;只看 IC 不看 IR 会把偶尔有效的因子当成好因子
Newey-West t 值在存在自相关与异方差时,IC 序列的统计显著性普通 t 检验在时间序列上会高估显著性,这是因子研究里最常见的假阳性来源之一
BH-FDR q 值在同时检验很多因子时,控制错误发现率你一次性试 50 个因子,总会有几个“显著”;多重检验校正就是为了拆穿这一点
分层收益把因子值分成外层后看各层收益单调性单调性比单一 IC 数字更难作弊;分层乱掉往往意味着因子形状不稳定
多空对比按因子排序后做多头与空头的对比它把 IC 换算成更接近“能不能用”的形式,也能看出是否只在一侧有效
为什么官方把因子检验做成四个标签页而不是一个按钮:因为单一指标永远有漏洞:IC 高可能不稳定,t 值显著可能是多重检验造成的,分层单调可能只在极端层有效。把它们分开列出来,意味着你可以逐一核对而不是被一个综合分数带走。
Factor to strategy

TSP 的因子怎么进到策略里去?

官方设了四条桥,分别面向不同的下一步动作。选对桥比重写一个策略省事。

方向具体做法典型场景
因子库 → 策略因子库里点「生成策略」,得到一个单因子排名策略你已经验证了一个因子,想看它在完整回测里的表现
因子 → 信号策略触发器编辑里的 Zap 按钮从因子快速创建条件信号想把因子当作监控或策略的一个条件,而不是整个排序依据
因子 → AI 生成信号AI 生成信号的提示词里包含全部因子分组与 id让 AI 在你已有的因子体系里找组合,而不是凭空发明
回测 → 因子归因回测的「因子归因」标签页反向消费因子值回测跑完后回头看哪些因子在拖后腿
Mining boundary

tick-stock-panel 的挖掘到底能做什么、不能做什么?

官方对挖掘 V1 的边界写得很硬,知道这些才不会对它抱错期望。

挖掘不是“让系统替我发明策略”,它的边界写得非常硬。官方对挖掘 V1 列了四条明确不做的事:不生成任意公式、不接受 AI 自由代码、不用扩展数据生成新因子、不用分钟数据优化入场。它只研究两类东西:已有的日频因子,与你明确选中的矩阵原生日线策略。

为什么这么保守?因为一旦允许任意公式或任意代码,搜索空间会大到无法用统计手段约束,得到的结果也就无法审计。把搜索限制在你自己已经写好的因子与策略里,每一个候选都能被你读懂——这是这个模块最大的取舍。
Leakage control

tick-stock-panel 是怎么防住样本外泄露的?

下面是防泄露链路的七个环节,每一环都对应一个具体机制。

tick-stock-panel 的防泄露链路:七步看完

  • 内层循环:每个训练折里独立学一遍

    方向、统计、去重与组合搜索都在内层独立完成,而不是拿全量数据学一次、在各折重用。

  • 内层测试只选候选

    内层 test 不参与训练,只用来选出候选项。这一步防的是「用测试集调参数」。

  • 选完后在完整外层训练重训

    候选确定后,在整个 outer train 上重新训练,而不是直接拿内层的参数。

  • purge 与 embargo

    训练与测试之间保留间隔,默认 purge = 30 个交易日。它防的是指标窗口跨界导致的泄露——即使你不用未来价,跨界的滚动窗口也可能把未来信息带进训练集。

  • 外层测试只做一次

    outer test 只做最终样本外评估,不反复跑。一旦你开始根据 outer test 结果调参数,它就不再是样本外了。

  • T-1 环境口径

    交易日 T 只能用上一交易日的环境标签;缺前驱时 fail-closed,绝不用当日环境、最近自然日或默认环境补齐。

  • Publish gate

    tick-stock-panel 的发布门槛有哪六条?

    这六条由服务端强制执行。本节把每一条拆开,说明它在防什么。

    发布门槛具体条件它在防什么
    置信度档位不得为 exploratoryexploratory 档只能作低置信度 pending 候选,不允许发布
    有效折数至少 2 个有效 outer 折防止只跑了一段就当成全部样本外证据
    正收益折比例正收益的折数 ≥ 2/3防止收益集中在某一段特殊行情里
    样本外 Sharpe≥ 0.5一个低于此的策略在扣成本后几乎没有意义
    最大回撤不劣于 −25%控制尾部风险;收益再好,回撤超限也不可用
    样本外交易数≥ 60防止结果靠少数几笔交易撑起来
    这六条是服务端强制执行的,不满足就拒绝并返回原因列表。它的意义不只是“防住坏策略”,而是让发布这件事可审计:你不需要信任自己的判断力,只需要看这六条是不是都过了。另一个重要设计是「保存与发布分离」:保存始终允许(进 pending),而发布是一个独立的显式动作,且客户端只能提交 run ID 与候选签名,不能提交策略 ID、权重、方向、公式或代码。
    Confidence tiers

    tick-stock-panel 的三档置信度差在哪里?

    差别不在算法,在你花多少计算量换多少统计信心;同时说清“保存 vs 发布”为什么要分开。

    置信度档inner train / inner test / outer train(交易日)适合场景
    exploratory126 / 63 / 63初步探索因子形状;只能产生低置信度 pending 候选,不能发布
    balanced504 / 126 / 63默认档;至少 3 个 outer folds,在样本量与耗时之间取平衡
    strict756 / 126 / 126正式评估;至少 3 个 outer folds,样本外证据最充分
    三个档位的区别不在算法,在你愿意花多少计算量换取多少统计信心。exploratory 的 outer train 只有 63 天,足以看趋势,不足以下结论;strict 把 outer test 拉到 126 天,代价是跑一次要久得多。另外自动周度挖掘默认关闭,即使开启也只允许 balanced 与 strict,且同一 ISO 周确定性只触发一次——自动任务永远不会自动发布策略。另外三类证据行也值得区分:selected(内层胜出后的外层测试)、cross(定义在其他折胜出后在本折补评)、benchmark(对照策略在该外层测试窗独立评估,不占候选名额)。
    Operational limits

    tick-stock-panel 挖掘在运行上有哪些硬限制?

    下表列出可能直接影响你部署方式的几条限制,尤其是那条「必须单应用进程」。

    限制 / 行为官方口径你该怎么避坑
    单应用进程要求run store 与重任务 limiter 用进程内锁,生产环境必须只启动一个应用进程负责挖掘不要在同一份数据目录上跑多个实例并行挖掘
    任务隔离挖掘在 spawn 子进程执行,浏览器断开不取消任务关页面不会中断任务,但不要因此就反复开新任务
    重任务容量共享重任务限流容量为 2:普通回测 / 优化 / walk-forward / 矩阵预热占 1,挖掘独占 2挖掘跑着时发起大回测会排队,不是 bug
    历史快照回填偏差概念成分为当前快照不要把历史主线当护城河标签用于长历史回测
    财务因子时点只在晚于公告日的交易日生效,公告前空值且从截面剔除不要手动把财务值向前填充
    统计口径变更mining-v2 修了缺失掩码下的 pairwise Spearman,因此 correlation artifact 与 v1 不再要求数值相等升版后不要用旧结果做一一对比当作回归失败
    First run order

    第一次用 TSP 的因子与挖掘,该按什么顺序走?

    下面八步是本站归纳的顺序:先把因子跑通、再进挖掘,每一步都有明确的停止条件,避免一上来就用最重的档位。

    第一次用因子平台与挖掘,按这八步走

  • 先把因子写出来并过检验

    在编辑器里用 DSL 写好表达式,先看 40 日试算的 IC,确认方向与量级没有明显问题,再进因子库。

  • 存入因子库并标状态

    新因子建议先标为草稿或观察,等它在不同区间都稳定后再转活跃。状态本身不影响公式,但它帮你区分“还在试”和“已经能用”。

  • 用因子作为策略的评分项

    从因子库点「生成策略」,得到一个可回测的单因子排名策略。先用它跑一次普通回测,看它在不同区间的表现。

  • 再选挖掘的策略与因子集

    挖掘只研究你明确选中的矩阵原生日线策略,以及已有的日频因子。选得越少,搜索空间越小,结果越容易被你读懂。

  • 先用 exploratory 抑住预期

    第一次跑建议用低档位,目的不是拿结果,而是估计你的机器与数据规模跑一次要多久。

  • 看候选与证据行

    先看 selected 与 benchmark 两类行的对比,再看 cross 行判断该组合在其他折是否也成立。

  • 最后才决定是否发布

    发布前逐条对六条门槛。不过就先把它留在 pending,等数据或参数变了再说——保存不会阻止任何东西。

  • FAQ

    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。所以挖掘跑着时发起大回测会排队,这是设计而不是故障。

    因子验证完了,怎么把它接到日常使用上?

    先看 AI 助手与监控页(取数可核对、四类监控规则与推送渠道),再看扩展插槽页了解怎么把自己的逻辑加进去。