两次股票回测配置差在哪:生成可复核的设置对照表
两份股票回测配置看起来不同,实际生效设置可能完全相同:一份省略默认值,另一份显式填写。反过来,文本接近也可能因默认、覆盖顺序或策略内部值不同而执行不同实验。比较真正消耗的值,保留来源,再做受控重跑,才能解释某个设置的影响。
本文交付生效设置差异表、许可变化清单和合成确认运行,属于外部研究流程,不证明CoTrading已有配置导出。保持单一市场与币种,虚构交易只检验配置语义,不代表真实股票表现,也不假设全部策略行为都由一个文件控制。
找齐所有配置来源
收集两次运行的原文件、命令行值、应用默认和策略构造实参,记录覆盖优先级。只看界面不够,策略可能硬编码股数,适配器也可能替换费用。数据、代码、引擎和执行政策同时冻结,才能确保配置是唯一计划改变的输入。
把影响运行的字段与描述元数据分开。报告标题变化可能不改实验,费用单位变化即使数字相同也会改变成本。分类应来自字段契约,不能为了减少差异,在看完结果后删掉不方便的字段。哪些键被消费,也需要能追到实际组件。
Python argparse默认值文档展示省略选项时如何使用规定值。本文自行实现字典解析,并不假设真实引擎都使用argparse。来源说明默认机制,实际生效路径仍由自己的代码和回执验证,不能靠工具名称作保证。
解析默认值并保留来源
合成默认为回看三、费用二基点、数量一。空对象解析出三个值,来源均为默认;只写fee_bps: 2的对象得到相同生效值,但费用来源为显式。来源不同,不等于行为不同,差异表应能同时表达这两点。
规范值旁保留其来源和默认集合版本,否则以后默认改变,旧文件省略字段就难以还原。不能用今天规则解释昨天运行,再说已经找回历史设置。确实缺少旧默认时,应标为未解决输入,而不是猜一个最方便的值。
空值、假、零与省略应按字段契约分别处理,不是普遍等价。本文正整数回看和数量拒绝布尔值,费用零则可以是有效无费用假设。通用的“假值当缺省”会把主动填零悄悄换成二基点,造成文本看似正确、执行却不同。
未知字段与未生效字段都要处理
拼错的fee_bp直接拒绝,不静默忽略。JSON Schema对象参考说明限制额外属性的方式。样例用标准库集合比较实现同类拒绝,没有运行第三方模式库,也没有自动识别所有策略参数。
unknown = set(raw) - set(defaults)
if unknown:
raise ValueError('unknown settings')
effective = {**defaults, **raw}
字段被接受还不够,要有实际消费者。费用追到成本计算,数量追到下单金额。JSON中存在、策略却从不读取的键,不是生效设置,应标为不支持或无效,再修适配器。不能在差异表列出它,就认为两次交易已经比较过该参数。
需要单位换算时,同时保留原表示、换算规则和规范值。百分比与基点不能当裸数字比较。本例两边都采用基点,使唯一计划变化清楚。真实导出若用分与元,也需先确认金额单位,不应把一百倍差额误判为引擎计算错误。
建立主例对照表
| 情况 | 原费用字段 | 生效费用 | 生效数量 | 解释 |
|---|---|---|---|---|
| A | 省略 | 2基点 | 1 | 默认基线 |
| B | 显式2 | 2基点 | 1 | 无生效差异 |
| C | 显式4 | 4基点 | 2 | 两个设置变化 |
| D | 显式4 | 4基点 | 1 | 允许的费用单项变化 |
主对照表内回看均为三。A与B原文不同,生效差异却为空。A与C同时改变费用和数量,不能把利润变化只归于费用。许可集合只含fee_bps,检查器拒绝C,先处理实验前提,而不是等看到结果是否符合预期才判断。
D从基线只改费用,用于新的确认运行。保留原来失控的C及其引用,不能直接修改C文件,让历史看起来从来就是单字段比较。新的受控实验需要自己的身份、输入和输出,也要注明为何安排这次确认。
实际运行费用单项确认
已知信号历史为九十、九十五、一百,回看三时末值高于窗口均值,允许后续合成往返;回看一则不触发,另有断言确认该字段真实参与计算。虚构交易以一百买一股,以一百一十卖出,毛利润十,双边成交额二百一十。二基点成本零点〇四二,净利润九点九五八;四基点成本零点〇八四,净利润九点九一六。差额负零点〇四二,正好等于同一冻结交易的新增费用。
执行函数从实际使用的参数生成生效回执,并断言与解析请求相同。若回执在适配器丢参数之前直接抄请求,它只能证明抄写正确,不能证明计算真的用了这些值。检查点位置本身也是交付证据的一部分。
这仍是冻结成交的计算。真实费用可能改变可买数量、后续订单和资金资格,此时应在单项设置下完整重跑引擎,并解释路径变化。不能把玩具例子的线性扣费关系推广为所有费用比较,也不能假定股数永远不受成本影响。
不同机制反例:数量也变了
C数量为二,毛敞口和费用都变。即使最终利润恰好接近基线,也不能恢复单字段前提。先检查许可集合,再看绩效方向,避免凭结果好坏来决定哪些变化算重要,哪些变化可以忽略。
多个变化如果本来就是有意,应相应命名干预,或安排一系列有依赖说明的受控运行。不能从长差异表中挑最像原因的一项,就宣称已完成归因。设置比较提出解释候选,归因能否成立还取决于实验控制与持有条件。
生效值相同但输出不同,就应转查数据、源码、环境、随机状态和执行产物,不再怪罪原配置排版。相反,输出相同也不证明设置相同;小价格路径上,不同参数可能恰好给出同样交易,仍须检查生效值本身。
导出可复核设置账
每个字段保存是否出现、原值、规范值、来源、单位、模式和默认版本,以及消费组件。变化分别标为许可、描述性或阻断,再连接两次原运行和确认运行。这样别人无需聊天上下文,也能知道为什么A/B不算变化、A/C不能归于费用。
不要把凭证放进共享导出。数据访问前置条件可以用引用说明,不必嵌入令牌;历史消费值缺失时,也不能拿猜测默认补齐。配置账既要便于重跑,也要如实保留无法确定的范围,避免“字段齐了”掩盖证据不足。
建议交接者抽查一个默认字段、一个显式字段和一个被拒字段,从原始配置追到解析输出,再追到执行回执。确认回执引用的是相同运行,而不是另一次顺利任务的文件。默认标记与生效差异分开保留,能在日后默认更新时找出哪些旧运行需要重新解释。
另查优先级是否按约定执行,例如文件二基点被命令行四基点覆盖时,最终值应指向真正覆盖源。本文小解析器只有默认加字典两层,没有实现命令行或环境覆盖;实际系统增加来源后,需要新增对应证据,不能声称样例已经覆盖所有层级。
差异表中也应注明不可比原因,而非只用颜色标红。C的阻断理由是数量超出许可集合,不是四基点本身非法;D用同样四基点却可运行。把有效性、来源变化与实验授权分开,能避免误修一个本来合法的费率字段。
运行与验收
费用解析先统一转为Decimal,再要求有限且非负。数字和文本形式的NaN、正负无穷都在比较、迁移或执行之前以明确ValueError拒绝;只判断小于零无法拦住NaN。回归样例在对应解析路径实际覆盖六种输入,不能把非有限费用传给后续计算。
下载完整示例。使用Python 3.12或更新版本,运行python R617.py。标准库十进制断言核对省略与显式默认差异为空、数量额外变化和未知键被拒、生效回执一致,以及准确净额九点九五八和九点九一六。
验收要求解析规则有版本,生效差异逐项解释,确认运行只改许可字段,输出可勾稽。来源区别即使不算行为变化也保留。默认、模式、覆盖顺序、策略或执行改变后重建账,不能按最新规则改写所有旧运行。
本文验证的是虚构数据的设置到计算链,不是历史盈利,也没有确认产品集成。真实适配器哪些字段受配置控制、哪些需要源码修改,都应另查;未知处标明限制,比展示一份看似完整却无法执行的差异表更有用。
常见问题
省略默认值算参数变化吗?
按各自记录规则解析后相同就不算,但仍保留来源区别。
另一个设置也改了,还能只归因一项吗?
不能只凭这次比较。应拒绝单项归因,或安排受控确认。