批量回测一半失败还能排名吗:先核对每个运行的去向
计划股票回测一半失败时,现有最高利润未必就是全批最优。先把每个预定配置连接到有证据的状态,确定哪些结果允许比较,并披露缺口。失败或缺失运行没有测得收益,填零会一边改排名,一边隐藏证据为什么不存在。
本文从合成记录建立批次状态账、失败分流表和最小技术重跑队列,是外部研究方法,不证明CoTrading已有批次审计功能。保持市场、币种和实验上下文固定,运行是否完成与股票策略是否盈利分开解释。
从冻结计划开始
先取得T1等预定任务身份清单,再读结果目录。每个身份连接合法配置、代码、数据、执行政策和请求期间。只看已有文件夹,无法恢复没有留下文件的失败任务,恰好会漏掉最需要审查的部分。
候选身份与尝试身份分开。同配置技术重试可以有两次尝试,不会增加一个独立参数位置。保留两次历史,再按约定规则确定候选当前状态。不能把一次失败和后来成功当两个搜索点,也不能把失败尝试删掉后假装从未消耗过预算。
保存派发确认或权威调度登记。没有日志不等于未启动,进程可能在第一条日志之前就失败。派发状态未知时应保持未解决,不能为了凑齐表格把它改成未启动。归档要能解释“知道没启动”与“不知道发生过什么”的证据差别。
定义状态与排名准入
本次最终检查要求每个计划任务属于四类之一:通过产物验收的完成、失败、取消、确认未启动。仍运行或未知表示最终审计尚未就绪;进度报告可以单列,但不能强塞终态让等式看起来平衡。必要时先停止最终排名,等待明确处理。
进程成功与产物成功不同。Python subprocess官方文档说明返回码及输出捕获,但零退出码本身不认证净值、成交和摘要齐全。因此执行声称完成后,还需检查产物契约及可比较的有限评分,才能进入排名。
契约和指标应提前冻结。不能因为T6摘要利润高,就临时宣布成交明细可有可无。相反,完整无交易策略可能合法得到零结果,但需要完成状态与全套产物支持。空表的含义来自证据,不来自行数看起来一样。
八个任务的完整主例
计划含T1至T8。T1产物有效、净评分五;T2产物有效、负二。T3加载输入失败,T4策略执行失败,T5引擎阶段失败。T6虽然显示执行完成、摘要九,但产物检查不通过,不能因看上去领先就纳入。
T7取消,T8由登记明确确认未启动。最终证据状态如下:
| 最终类别 | 任务 | 数量 |
|---|---|---|
| 准入完成 | T1、T2 | 2 |
| 失败 | T3、T4、T5、T6 | 4 |
| 取消 | T7 | 1 |
| 确认未启动 | T8 | 1 |
八等于二加四加一加一,准入完成率百分之二十五,不是进程曾经报告成功的比例。T6原进程状态仍保存,只是最终证据状态变为产物失败,读者能看到为什么九没有参加比较,而不是看到作者悄悄把领先行删掉。
按首个可观察阶段分流
加载、策略、引擎和产物分别记录。加载问题先查输入取得与解析,策略异常查接口契约,引擎失败查执行诊断,产物失败查生成和保存。这些是根据可观察证据安排调查的路由,不等于已经证明最终根因,不能只看阶段名就断言某个外部服务有错。
合成政策将T3加载问题和T6产物问题标为技术上可重试,T4与T5先调查,不自动跑,因此最小队列为[T3,T6]。这是示意政策,并非所有加载失败都适合重试。权限未解决、数据已换版或错误会改变输入时,需要先明确上下文。
T6应确认可信检查点能否重新导出,还是必须全程重跑。不能从别次运行拿交易补文件夹。T3如果改了数据版本或授权范围,也可能形成新实验,而不是原冻结输入的重复执行。修复方式和候选选择应分别记录,避免根据输出好坏决定是否承认重试。
先实现勾稽,再排名
首道身份检查要求计划与登记精确对应:
if len(set(plan)) != len(plan) or set(records) != set(plan):
raise ValueError('duplicate, orphan or unresolved trial')
接着分类、执行产物准入并加总终态。原进程状态和最终证据状态并列保存,解释T6为什么重分类。真实系统同候选可能有多次尝试,应先按明确规则折叠当前状态,再统计候选;不能随意取最后一个文件名当权威结果。
计划外产物也应拒绝,调查它属于旧批、意外重复还是未记录扩展。把额外有利评分直接放进赢家表,会改变研究家族与完成率分母。新增加任务时可以修订计划,但要保留原计划版本,不能只在结果出现之后补清单。
说明目前排名能承担什么
准入T1、T2中T1较高,正确标签是当前契约下已完成任务最佳,不是八个预定配置最佳。未测候选可能表现不同,取消与不启动还可能与参数复杂度有关。不能假设缺失随机,因此幸存者均值也未必代表原计划。
失败不填零,不无痕删除,不在未披露缺口时宣布全域最优。必要时按参数区域展示已尝试与准入覆盖。如果所有长周期候选都失败,剩余结果可能系统偏向短周期,而不是公平比较了原定域。覆盖图要让这种结构性缺口可见。
要声称穷尽全批排名,需要在冻结或明确修订协议下解决缺失候选。此前可以提出暂定对象做后续研究,但限制应紧邻结论。操作准入不会消除多次搜索偏差,也不会把开发结果变成样本外证据,不能混同为策略有效性审计。
不同机制反例:登记缺口
反例删掉T8登记,计划仍有八个身份,审计直接拒绝未解决映射,不因没有执行输出就推断它没启动。这防止开始记录之前悄悄消失的任务被当作正常空白。只有权威派发状态才能支持确认未启动。
另一个独立检查让T6摘要九保留在原记录,却不进入eligible清单。如果比较器仍然选择九,预期准入断言会失败。身份完整和产物有效是两道不同门槛,都不能用“进程成功”一句话替代,也不能互相抵消。
真实归档还需原错误、时点、尝试序号及产物引用,分享日志时去掉凭证。重跑成功后不要覆盖旧错误,而是关联新尝试,并说明候选状态如何更新。比较结果如果变化,能追到补跑,而不是看起来此前从未有过另一个赢家。
建立最小恢复清单
重跑单可列任务、冻结输入引用、失败阶段、允许动作、预期补齐产物和禁止变化。T3只恢复合法可得的相同输入,T6只从同源状态导出或全程复跑,均不能顺带调参数。若调查要求改策略,建立新上下文,并保留原失败作为原计划去向。
完成后重新勾稽整个八项清单,不只检查补跑的两个。确保取消没有被无意启动,未启动任务仍有证据,旧产物未串用。批次完成率的改善应能从状态转换表重算,而不是作者手改一个百分比。正在运行的任务仍单列为进度,不能提前算完成。
每个状态转换保留操作者或执行器引用及原因,尤其是取消后重新排队的情况。它应成为有记录的新尝试,不能回写成最初就完成。
运行与验收
下载完整示例。使用Python 3.12或更新版本,运行python R618.py。标准库程序断言八项勾稽、准入T1/T2、重跑T3/T6、T1有限排名,以及缺失登记被拒。输入是合成任务账,没有实际派发模型、行情或券商。
验收要求每个计划候选有证据状态,准入指标产物完整,重试有依据,结论文字符合覆盖。计划、尝试、终态、分流与原错误一起导出,不能只留赢家。重试完成、取消确认、产物恢复或计划扩展后重新审计,保留旧版本。
本文验证的是合成状态记账,不替代真实数据权限、市场成交规则或产品服务诊断。对于实际看不到的字段应说明未知,而不是为了分类精细编造原因;诚实保留缺口,比一张没有出处的百分之百完成表更可用。
常见问题
缺失任务可以填零收益吗?
不可以。零是有效运行的测得结果,不是证据缺失替代值。
没日志就证明没启动吗?
不能。需要权威派发记录,否则保持未解决。