能力子页 · 回测与审计
tick-stock-panel 回测可信度审计:先问十个问题
一个策略回测数字好看,不等于它在未来管用。本页不展示任何收益数字,而是把 tick-stock-panel 对到底做了哪些约束、哪些口径需要你自己确认写清楚,并给一份能直接照着跑的审计清单。
tick-stock-panel 有哪几种回测模式?各自适合问什么问题?
选对模式比调参数更重要:用个股回测去验证一个全市场策略,得到的结论会有系统性偏差。
| 回测模式 | 适合问题 | 官方口径 |
|---|---|---|
| 个股回测 | 这只标的在某个策略下表现如何 | 单标的 + 一个策略,看净值与交易明细 |
| 策略组合 | 一个策略扫全市场后按组合约束持仓会怎样 | 策略先扫全市场,再按最大持仓数、敞口控制与等权或自定义仓位组合 |
| 自由信号组合 | 多个自定义信号加自定义权重混合 | 多个信号 + 权重,适合做信号层面的组合实验 |
| 分钟策略回测 | 盘中触发条件在历史上会不会真的成立 | 逐交易日回放信号,以分钟收盘价入场,输出分钟级成交明细 |
tick-stock-panel 在回测里到底考虑了哪些真实约束?
下表每一行都是官方列出的约束,并说明它为什么会影响你对结果的信任度。
| 约束 | 官方行为 | 为什么它影响可信度 |
|---|---|---|
| T+1 | 信号日与成交日错开,当日信号不能当日成交 | 这是 A 股制度约束,也是回测里最常被无意触发的未来函数 |
| 手续费 | 按交易额计提 | 不计成本的策略变成成本后经常直接转负,尤其是高频策略 |
| 滑点 | 按配置模拟成交价偏离 | 滑点对高换手策略的侵蚀可能远大于手续费 |
| 止损 | 可配置止损条件 | 止损会改变交易分布,让尾部风险变形 |
| 最大持仓天数 | 到期强制平仓 | 避免策略靠少数几笔超长持仓把整体收益拉上去 |
| 组合约束 | 最大持仓数、敞口控制、等权或自定义仓位 | 仓位规则一变,同一个信号集的结果就变,所以必须记录参数 |
tick-stock-panel 的回测输出哪些指标?怎么看?
指标名字大家都熟,但每个都有它的误区。下表把它们和“看的时候注意什么”放在一起。
| 输出 | 官方口径 | 看的时候注意什么 |
|---|---|---|
| 净值曲线 | 策略期间的累计表现 | 关注回撤形状而不只是终值;长期横盘也是信息 |
| 夏普 | 风险调整后的收益表现 | 它对收益分布形状敏感,小样本下容易被极端值拉高 |
| 最大回撤 | 历史最大回撤幅度 | 它是已发生的事实,不是上限;它是「下界」的一个参考 |
| 胜率 | 盈利交易占比 | 胜率高不等于赚钱,必须与盈亏比一起看 |
| 盈亏比 | 平均盈利单与平均亏损单的比值(官方用颜色区分高低) | 它与胜率是一对:低胜率 + 高盈亏比与高胜率 + 低盈亏比都可能成立 |
| 蒙卡回撤 | 按成交顺序重抽样估计回撤分布,给中位与 95% 边界 | 它回答的是「换一个执行顺序会怎么样」,这比单一最大回撤更接近风险感知 |
| SSE 流式进度 | 回测过程流式输出,切页可重连 | 回测在 spawn worker 子进程运行、有持久 run ID,所以刷新不会丢任务 |
tick-stock-panel 的因子归因能告诉我什么?有什么限制?
这是本项目最实用的一个分析工具,但它有明确的适用范围。
但它有两个硬边界,必须知道:第一,它只覆盖
meta.scoring 非空的策略(内置策略与自定义 polars 策略);第二,矩阵单因子排名类策略暂不产出归因(官方明确说明)。所以当你发现某个策略的归因栏是空的,先判断它属不属于这一类,而不是先怀疑功能坏了。归因结果怎么读:它回答的是「这笔交易为什么赚或亏」,而不是「下一笔该不该买」。如果发现高位信号对应的败单占比明显偏高,那是一个可以去验证的假设(比如加一个位置过滤条件重跑),而不是一个可以直接下结论的结论。
tick-stock-panel 的分钟回测怎么避免未来函数?
分钟级回测最容易出现“用了未来一分钟”的问题,下面是官方在入场价与粒度上的具体取舍。
| 关键点 | 官方口径 | 为什么这样设计 |
|---|---|---|
| 分钟级回放 | 逐交易日回放信号 | 而不是先把所有分钟数据载入内存再一次性计算 |
| 入场价格 | 以分钟收盘价入场 | 避免用分钟内最优价造成不可实现的收益 |
| 明细粒度 | 输出分钟级成交明细 | 你可以看到具体到分钟的入场时点而不是只有日级汇总 |
| 约束一致性 | 与日线回测同用一套 T+1 / 费用约束 | 两类回测的结果可以直接放在一起比较 |
| 信号回放工具 | 另有独立的分钟信号回放接口 | 可以在配监控之前先验证信号会不会真的触发 |
tick-stock-panel 的回测结果怎么导出与复现?
能不能复现,是区分“真结果”和“巧合”的最直接手段。
导出 CSV,一次四段
概要、净值曲线、交易明细与分标的统计。四段分开好处是你能把交易明细拿到其他工具里做自己的分析。
保存候选
保存时存的是完整参数与指标快照,而不只是一个名字。
回测页一键载入复测
「候选方案」里点一键载入,会回填全部参数。这是判断「结果能不能复现」最直接的手段。
复测时先确认三件事
版本是否相同、本地数据是否变过、股票池是否一致。这三件任何一件变了,结果都不应该一模一样。
记录复现信息
官方在策略迭代文档里强调过证据包与台账:每轮留下改了什么、为什么改、结果如何。对回测而言同样适用。
把“能复现”当成结论的前提
一个跑不出第二遍的结果,即使数字再好也不该该拿去做决定。
TSP 回测结果到底可不可信?十问审计清单
下表把每个审计问题对到项目的具体能力或明确边界,方便你逐条确认而不是凭感觉。
| 审计问题 | tick-stock-panel 的对应能力 / 边界 | 本站提醒 |
|---|---|---|
| 信号日与成交日错开吗? | 有——T+1 是官方列出的真实约束之一 | 这是最容易被无意触发的未来函数,先看这一条 |
| 有没有计算手续费与滑点? | 有——两项都在真实约束名单里 | 分别做一次「计入 / 不计入」的对比,看感应强度 |
| 涨跌停与停牌怎么处理? | 涨停信号与连板数是 enriched 的一部分 | 涨跌停制度下“买不到”的情形难以在纯数值回测里完全复现,需要人工判断 |
| 是否使用复权数据? | 前复权,且指标与回测共用同一份 | 请确认你自己导入的数据不是已复权的,否则会双重处理 |
| 股票池有悬殊偏差吗? | 股票池口径由你的数据源决定,官方未承诺历史成分 | 用当前仍在交易的股票去回测更早时期,会系统性高估,这是策略以外的偏差 |
| 做了参数敏感性吗? | 本身不自动扫参数;但因子搜索与策略迭代提供了正式方法 | 在正式流程下不要用手改参数、看结果、再改参数的方式做敏感性 |
| 做了样本外验证吗? | 挖掘流程内置嵌套 walk-forward 与 purge;策略迭代提供留出集纪律 | 普通回测模式本身不强制样本外验证,需要你自己切区间 |
| 收益是不是靠少数几笔? | 可用交易明细与分标的统计自己算 | 官方在挖掘发布门槛里把「样本外交易数 ≥ 60」写成硬条件,就是为了防这一点 |
| 结果能导出复现吗? | 能——CSV 四段 + 候选方案一键载入 | 复现失败时先排查数据与版本,而不是先改策略 |
TSP 回测有哪些典型失败模式?
下表列出七种最常见的失败模式、它们看起来像什么,以及到底在哪一步崩掉。认得出来,比会调参数更重要。
| 失败模式 | 典型症状 | 它在哪一步崩掉 |
|---|---|---|
| 样本内优秀、样本外失效 | 回测曲线很漂亮,换一段区间就不行 | 过拟合:参数在同一段历史上被反复调到最优 |
| 计入成本后直接转负 | 不计费用时收益可观,加上费用后变负 | 交易频率高,成本占据了大部分优势 |
| 参数轻微变化、收益大幅变化 | 把均线周期从 20 改到 22,结果完全不同 | 缺乏参数敏感性检查:真正健壮的策略应该在一个区间内都成立 |
| 换数据源后信号不一致 | 同一天、同一策略,两个溕选出不同标的 | 复权方式、成交额口径或股票池不同,而不是策略逻辑不同 |
| 胜率很高但盈亏比很差 | 大多数交易小赚,少数几笔大亏 | 只看胜率不看盈亏比;官方把两者放在同一屏就是为了防这个 |
| 结果靠少数几笔 | 删掉最赚的三笔后策略变负 | 样本量不足。官方挖掘门槛要求样本外交易数 ≥ 60,就是这个原因 |
| 回测很好但实盘买不进去 | 涨停买不到、滑点远大于假设 | 这是纯数值回测难以完全复现的部分,需要人工判断 |
跑正式回测前,应该先把哪些口径定下来?
下面五个口径是本站归纳的「先定规矩」清单:它们不改策略逻辑,但决定你看到的结果有没有意义。
跑一次可信的回测,先把这五个口径定下来
第一个口径 · 区间划分
至少切三段:调参用的段、验证用的段、你完全没碰过的段。第三段最重要,它是你唯一能用来评估“未来表现”的东西。
第二个口径 · 成本假设
先把手续费与滑点设成一个不保守也不离谱的值,然后再分别跑一遍极低与极高。结果在三者之间都站得住,才叫健壮。
第三个口径 · 股票池
确认你用的是不是当前仍在交易的股票。如果是,你的回测里天然不包含那些已经退市的标的,结果会系统性偏好。
第四个口径 · 复权与字段单位
确认你导入的数据没有二次复权,且单位与系统一致。官方用 pct_unit 强制要求源头声明单位,就是为了防这一类错。
第五个口径 · 结果导出与标记
每次跑完都导出 CSV 并记下参数。否则一周后你就不知道那条好看的曲线到底是哪组参数跑出来的。
tick-stock-panel 回测与可信度常见问题
以下答案基于官方仓库与文档的核验结果;涉及版本、数据源口径与许可条款的内容一律以官方仓库与官方文档为准。tick-stock-panel 的回测引擎到底是什么?
这里要说一个官方资料自己就不完全一致的地方:README 的技术栈里写的是「自研仓位模拟引擎(T+1 / 费用 / 滑点 / 分钟回放)+ vectorbt(部分路径)」,而 docs/features.md 写的是「基于 vectorbt」。本站不替你选一个说法,因为两种表述都在官方仓库里。对你而言真正重要的是约束本身:不管底层是谁,T+1、费用、滑点与持仓天数都在。你验证口径的方法也不变:看交易明细里买入日是不是晚于信号日、成本是不是真的扣了。
不计手续费和滑点,结果会差很多吗?
取决于你的交易频率,但在高换手策略上差异往往是决定性的。官方把手续费与滑点都列进了真实约束清单,就是为了避免你在「不计成本」的假设下做决定。建议你自己做一次对照:同一个策略、同一段区间,分别在计入与不计入成本两种设定下跑一遍,看差距有多大。这比看任何三方结论都有说服力,因为参数是你自己的。判断标准很简单:如果一个策略在合理成本下就不成立,那它本身就不适合作为你的候选,不需要纠结到底该用多少滑点。
因子归因为什么有时候是空的?
因为它只覆盖 meta.scoring 非空的策略(内置策略与自定义 polars 策略),而矩阵单因子排名类策略暂不产出归因——这是官方明确说明的边界。它的数据来自入场候选快照,零额外计算,所以不会影响回测耗时。碰到空的归因栏,先判断策略类型,再判断功能是否异常。
分钟回测会不会有未来函数?
官方在入场价与回放方式上做了选择:逐交易日回放信号、以分钟收盘价入场、输出分钟级成交明细,且与日线回测共用同一套 T+1 与费用约束。收盘价入场是一个保守选择:它避免了「用分钟内最优价成交」这种在实盘中难以保证的假设。
怎么判断一个回测结果是不是只靠少数几笔?
用交易明细与分标的统计自己算:看前几笔盈利占总盈利的比重,以及删掉最赚的几笔后结果是不是还成立。官方在挖掘的发布门槛里把「样本外交易数 ≥ 60」写成了硬条件,就是为了防止这种情况被当成可用策略发布出去。你在普通回测模式下也应该自己设一个最低交易数心里线。一个简单做法:把交易明细按盈利降序排,删掉前 10%,看剩下来的结果还能不能站住。站不住就说明优势集中在少数几笔上。
回测结果能导出吗?怎么复现?
能,而且官方把复现做成了一个动作:结果可导出 CSV 四段(概要 / 净值曲线 / 交易明细 / 分标的统计),也可保存候选(存完整参数与指标快照),回测页的「候选方案」可一键载入并回填全部参数。复现失败时,顺序应该是先排数据(复权与股票池)、再排版本,最后才怀疑策略。把每次回测的参数与导出文件放在同一个目录,下次就能直接对比而不用猜,也能避免重复劳动。