7.2 从回测到 paper 的迁移清单


7.2 从回测到 paper 的迁移清单

本节摘要:策略从回测进入 paper,不是换个按钮,而是换一套运行环境:数据源从历史整段变成实时流,费率从静态假设变成交易所实际档位,延迟从零变成网络往返加撮合排队。本节用三张差异表把这些配置差逐一核对,然后定义两个核心观察指标——成交假设偏差(paper 成交价与回测假设价的系统性差距)与信号滑出(信号发出后价格已走的幅度),它们是"回测假设是否在实时世界成立"的量化答案;最后讨论 paper 至少跑多久:给出一个依据框架(市场状态覆盖、样本量、极端时段经历),建议量级为数周到数月,并说明为什么短于此的观察不具判读价值。清单结尾是一张可打勾的迁移检查表。

学习目标

  • 按数据源、费率、延迟三张差异表完成回测到 paper 的配置核对。
  • 计算并解读成交假设偏差与信号滑出两个指标。
  • 用市场状态覆盖与样本量框架论证自己的 paper 观察时长。
  • 执行迁移检查清单,避免"配置漂移"造成的假偏差。

一、三张差异表:先排除环境差,再谈策略差

paper 阶段观察到的一切偏差,都混杂着两类原因:环境差异(配置没对齐)与策略真实差异。必须先把前者排除,指标才有解释力。

差异项 回测侧 paper 侧 核对要点
数据源 本地历史库,完整连续 实时行情通道,有延迟与缺口 两通道的同标的时间粒度、字段口径一致
费率 静态配置(6.1 四要素) 目标交易所实际档位 档位按你真实账户核对,含 VIP 折扣差异
延迟 零延迟,信号即成交 网络往返 + 队列 + 撮合 回测滑点假设是否覆盖 paper 实测延迟

逐表的典型错法。数据源表:回测用某数据源的收盘价口径,实时流用另一口径,信号天然对不齐——先做第 03 章的口径核对。费率表:回测填了吃单 0.1%(示意值),paper 按默认档位走了挂单——成交假设偏差里会混入费率差,读数前先核对档位。延迟表:回测滑点设 5bps(示意值),paper 实测信号到成交的等效滑点远超此值——这不是策略变差了,是假设太乐观,正确动作是回 6.3 调整压力测试参数重新判读。

配置对齐的执行建议:把 paper 账户配置与回测配置放进同一目录做 diff,逐行确认差异项都有解释。这份 diff 与 6.3 的判读记录一起归档。

二、两个核心观察指标

环境对齐后,观察指标度量的才是"回测假设 vs 实时世界"。

指标一:成交假设偏差。对每笔成交,取 paper 实际成交价与"回测假设价"(同一信号在回测撮合模型下的成交价)之差,按基点统计:

# calc_fill_bias.py —— 成交假设偏差统计(示意逻辑,字段以实际报告导出格式为准) def fill_bias_bps(paper_fills, backtest_fills): """逐笔配对后计算偏差:正=paper 成交更贵(买入方向吃亏),负反之""" diffs = [] for pf in paper_fills: bf = backtest_fills.match(pf.signal_id) # 按信号标识配对 if bf is None: continue diffs.append((pf.price - bf.price) / bf.price * 10000) diffs.sort() n = len(diffs) return { "median_bps": diffs[n // 2], "p90_bps": diffs[int(n * 0.9)], "sample": n, } ​

读法:看中位数与 90 分位。中位数系统性为正且幅度可观(超过回测滑点假设,量级自定),说明回测成交假设整体乐观;90 分位刻画最差情形的偏差尾巴。样本量不足时(经验上少于百笔)不要下结论,继续收集。

指标二:信号滑出。信号产生时刻的价格,到策略本可以成交的时刻,价格已经移动的幅度。它度量"延迟吃掉了多少信号价值"。读法与上面类似:分布的右尾如果长期显著非零,策略的有效性高度依赖低延迟执行,对基础设施的要求就要上调(第 11 章可观测层会持续盯订单延迟)。

信号滑出同样可以脚本化(示意逻辑,字段以实际导出格式为准):

# calc_slipout.py —— 信号滑出统计(示意逻辑,字段以实际导出格式为准) from datetime import datetime def slipout_stats(signals, fills): """按 signal_id 配对信号与成交;未成交的信号不入样本,另行单独计数""" pairs = [] for f in fills: s = signals.get(f.signal_id) if s is None: continue slip_bps = (f.price - s.price) / s.price * 10000 # 买入视角:正=价格已走 lag_s = (datetime.fromisoformat(f.ts) - datetime.fromisoformat(s.ts)).total_seconds() pairs.append((slip_bps, lag_s)) if not pairs: return {"sample": 0} pairs.sort() lags = sorted(p[1] for p in pairs) n = len(pairs) return { "sample": n, "slip_p50_bps": pairs[n // 2][0], "slip_p90_bps": pairs[min(n - 1, int(n * 0.9))][0], "lag_p50_s": lags[n // 2], # 延迟中位数:把滑出拆成时间与幅度两半 } ​

两个实现细节值得展开。其一,未成交的信号被排除在样本外:滑出度量的是"成交时刻价格走了多少",未成交样本属于另一个口径(拒单与撤单分析),混在一起会同时污染两个数。其二,把延迟中位数一并算出来:滑出由延迟与价格漂移共同决定,先看延迟能帮你判断该修执行链路还是该修策略节奏——这与判读矩阵 C 行的结论互相印证,C 行的"策略吃延迟"到底吃到多少,一半答案在这行延迟读数里。

两个指标合起来的判读矩阵:

情形 成交假设偏差 信号滑出 结论
A 接近零 右尾小 回测假设成立,paper 结果可外推
B 系统性为正 小 成交模型乐观,回 6.3 重判读
C 接近零 右尾大 策略吃延迟,评估执行链路升级的必要性
D 双高 双高 策略与执行链路都要重审,暂缓一切实盘讨论

三、paper 至少跑多久:依据框架与建议

没有普适标准答案,但有一个依据框架。观察期要同时满足三个条件:

  • 市场状态覆盖:至少经历一段与你目标环境不同的行情状态(例如趋势策略至少见过一段横盘震荡)。单一状态下的 paper 结论无法外推。
  • 样本量条件:成交笔数积累到统计上可判读(配合 6.2 的样本量直觉,经验上百笔量级起步)。
  • 极端时段经历:至少经历一次波动显著放大或数据异常时段,观察策略与数据层的反应。

量级建议:数周到数月(作者建议,非官方标准;低频策略取上限,信号密集策略取下限)。比时长更重要的两点:第一,观察期内的判读要按固定节奏做(例如每周一次按指标矩阵过一遍),而不是"到期看总账";第二,观察期内策略代码与配置冻结——边跑边改的 paper 没有判读价值,任何修改都应重置观察窗口并记录原因。

四、迁移检查清单

序 检查项 通过标准
1 6.3 判读记录归档 红绿灯全绿,失效标准已写明
2 数据源口径核对 回测与 paper 同标的同粒度同字段口径
3 费率档位核对 paper 配置与真实账户档位一致
4 延迟假设核对 回测滑点覆盖 paper 实测等效滑点
5 信号流健康检查 7.1 观察清单无未处理异常
6 观察计划成文 判读节奏、时长依据、冻结纪律书面化
7 应急预案就位 虚拟账户异常时的处置路径明确(第 10 章开关预演)

第 7 项常被忽略:虚拟账户虽不动真钱,但异常运行会污染观察数据、占用资源,处置路径同样要事先想好。

五、迁移日走查:一个示意案例

把清单变成体感,走一遍示意案例。某读者的趋势策略已通过 6.3 判读(红绿灯全绿),迁移日安排在周一开始:

时点 动作 产出与判读
迁移日前夜 配置 diff:回测与 paper 配置同目录逐行比对 差异三行(数据源、费率、延迟),各有解释,归档
迁移日开盘前 提交 paper 账户,确认信号流开始 首批信号时间戳正常,频率与回测量级一致
首日收盘后 跑 fill_bias 与 slipout 首日报 样本极少,只记录不判读
第一周周末 按判读矩阵过一遍周样本 样本仍不足,继续收集
第一个月末 首次正式判读,写观察记录 偏差指标、信号分布、异常事件各一段成文

三个踩坑点,都来自真实容易犯的错。其一,首日就盯着偏差指标看:样本个位数时的中位数毫无意义,首日该看的是"信号在按设计产生",指标判读从周末的固定节奏开始。其二,观察期内手痒改了一行策略代码:按冻结纪律,这次修改使观察窗口重置、此前样本作废——比损失两周观察更贵的,是不承认损失、继续用混合样本下结论。其三,把 fill_bias 的配对做成按时间就近匹配:必须按信号标识配对,时间就近在信号密集时会把两笔不同信号错配成一红一绿的假偏差。三个坑的共同教训:迁移清单管的是环境,判读节奏管的是结论,两者都不许临场发挥。

本节要点回顾

  • 先排除环境差再谈策略差:数据源、费率、延迟三张表逐项核对,配置 diff 归档。
  • 成交假设偏差度量回测成交模型的乐观程度,信号滑出度量延迟吃掉的价值,两者构成判读矩阵。
  • 观察时长看三个条件:状态覆盖、样本量、极端时段;量级建议数周到数月,期间代码与配置冻结。
  • 迁移清单七项全部打勾之前,不进入实盘讨论——这是本章与下一章之间唯一的门。

paper 观察达标后,下一个决定沉重得多:接入真实交易所。第 08 章讲六家加密交易所适配器与两家券商通道、API key 的权限最小化、测试网先行流程,以及比技术更重要的每日对账与合规边界——在那之前,请再读一遍每章末尾的免责声明。


作者与出处
原作者: 灏天文库
整理: 灏天文库整理
本站整理收录,版权归原作者/开源协议所有;欢迎通过原文链接访问源仓库。
发布者: 作者: 灏天文库 转发
评论区 (0)
U