预测市场回测可能用了看起来正确的代码、正确的价格历史,却选错了合约。这种错误很容易被忽略,因为市场名称很短,事件页面可能会更新,而 YES 份额看起来总像是一个介于 0 和 1 之间的价格。
以一个假设市场为例,标题是“《清洁交通法案》会通过吗?”某个策略在新闻信号触发后以 0.42 买入 YES。回测后来以 1.00 标记该持仓。在相信这笔盈利之前,我想确切了解合约承诺了什么:是哪项法案、“通过”具体指什么、截止日期是什么时候,以及依据哪个来源结算。
标题:“《清洁交通法案》会通过吗?”
标题是用于展示的字符串,不是稳定的交易工具标识符。两个市场的措辞可能几乎一样,指的却是不同的立法届期、修订后的法案或截止日期。交易平台也可能为了让标题更清楚而修改标题,但不改变合约的底层条款。
因此,回测应使用交易平台不可变的市场 ID 或合约 ID 来标识持仓,并保留完整规则文本及其版本。如果历史数据只有标题和代码,你就无法确认价格序列对应的是否是策略原本打算交易的合约。
| 身份字段 | 确定的内容 | 缺失时的风险 |
|---|---|---|
| 交易平台和市场 ID | 具体挂牌的市场 | 相似标题被合并在一起 |
| 规则版本 | 参与者同意的条款 | 后续修改被套用到更早的交易 |
| 结果代币 ID | 正在交易的 YES 或 NO 认赔凭证 | YES 和 NO 的价格被互换或合并 |
| 结果裁定来源 | 用于判定结果的证据 | 回测假设了不同的裁定方 |
规则:“通过”是什么意思?
假设规则规定,法案必须在 6 月 30 日前通过众议院和参议院,并由总统签署。若回测把只通过任一院算作成功,就改变了这笔赌注。把下一届会期中同名的法案也算进去,同样改变了赌注。
将实际的结果判定标准读作可执行条件。记录截止日期和时区、符合条件的事件、任何例外,以及指定的结果裁定来源。模糊之处也很重要:如果交易平台的规则未能说明某种合理情形该如何裁定,就不要悄悄选一种恰好符合历史结果的解释。
这项工作有个格外朴实无华的环节:在任何有意思的事情发生之前保存规则页面。等结果出来后才保存的页面可能只显示最终措辞,而你的策略进场时依据的却是更早的版本。
时间线:策略何时能够获知信息?
现在假设规则没有问题,新闻信号在 14:05 UTC 触发。历史行情源显示,14:05 有一笔成交,价格为 0.42。光凭这个时间戳,你无法判断信息在成交前是否已经可用、记录的价格之后是否仍可成交,也无法知道这根 bar 表示的是报价、成交还是某个区间的汇总。
把信号的可用时间与市场事件时间分开记录。然后将下单时间设在策略完成计算并提交订单之后。对于流动性稀薄的市场,下一笔有记录的成交可能要过几分钟才出现;这并不能证明你的订单能以那个价格成交。
价格:报价不等于成交
YES 的价格为 0.42,意味着每份价格为 42 美分,但仅看最新成交价会掩盖价差和可用数量。如果最佳卖价是 0.45,挂有 20 份,那么模拟买入 100 份就不可能全部以 0.42 成交。订单可能逐档吃掉盘口、继续等待,或始终未能成交。
预测市场价格也容易让人走 accounting 捷径:把 0.42 当作 42% 的概率,却忘了它也是入场时的现金支出。持有 100 份 YES,手续费前成本为 $42。如果最终结算为 $1,毛收入为 $100;如果结算为 $0,收入就是 0。费用、部分成交以及交易平台特有的结算机制,都应计入账目。
结算:什么会平掉这笔交易?
回测通常会按最终市场价格结束持仓。但持有至结果公布的合约会按规则付款,最后一次报价可能已经过时、价差很大,或与最终赔付相差甚远。应将结果裁定建模为独立事件:结果、结算时间和现金变动都应来自合约记录。
如果交易平台的规则规定了无效或有争议的结果,也要纳入考虑。这种情况下,可能会退还本金、支付不同金额,或需要延迟结算。二元赔付假设无法涵盖所有结果裁定路径。
回测的判定
对于这个例子,只有在核对了不可变的市场 ID、进场时生效的规则版本、YES 代币、信号可用时间、可成交的卖价和数量、费用以及记录在案的结算结果之后,我才会接受回测报告中的盈利。如果价格档案无法支持这些核查,诚实的输出应是一个情景范围或未经验证的结果。
对一笔小额交易来说,这听起来或许过于严格。但如果同样的关联错误扩散到成千上万个市场,回测就可能变成一次细致的测量,测量的却是策略从未交易过的合约。
← 全部文章


