2026年九月22日 · 期货

你的连续期货图表对应着一个无人能交易的合约

你的连续期货图表对应着一个无人能交易的合约

连续期货序列会把依次到期的合约接起来,形成一段完整历史。你可以用这段历史研究信号,但若直接根据序列价格变化计算交易盈亏,每次换月都可能凭空产生收益或亏损。这个序列并没有告诉你持有的是哪份合约。

来看一个特别严苛的例子:2020 年 4 月 20 日的 NYMEX WTI 原油。5 月合约结算价为每桶负 37.63 美元,6 月合约则为正 20.43 美元。两个价格都是真实的,两者相差的 58.06 美元也确实存在。但图表从 5 月切换到 6 月,并不会让多头持仓赚到这笔差价。

我们来拆解这次拼接。以下是历史结算价;下面的假设性核算示例用这些价格说明计算过程,并不表示订单当时能以这些价格成交。

CLK20 和 CLM20:图表抹去的合约标识

字段5 月合约6 月合约
合约标识CLK20CLM20
交割月份2020 年 5 月2020 年 6 月
4 月 20 日结算价,美元/桶−37.6320.43
合约规模1,000 桶1,000 桶

月份代码比品种代码前缀更重要。K 代表 5 月,M 代表 6 月。这两份合约的交割义务和价格都不同。5 月合约临近到期,面临着异常严峻的储存压力;6 月合约则多了一个月的时间。

数据供应商的连续合约代码把这些区别藏在一个简洁的符号后面。我喜欢简洁的代码,前提是它不是交易日志里唯一留下的标识。否则,调试就像考古,只是咖啡更难喝。

连续历史也没有统一标准。供应商可能按距到期日若干个工作日、成交量交叉点或其他计划换月。许多历史序列在 4 月 20 日之前就已经移出 5 月合约。我们特意把这两份合约的结算价拼在一起,以便清楚展示问题;这并不是在描述任何特定供应商的换月安排。

1,000 桶:每次报价背后的合约乘数

标准的 NYMEX WTI 期货合约代表 1,000 桶。因此,价格每变动 1 美元,一份合约的多头头寸价值就会变动 1,000 美元。最小跳动价位为 0.01 美元,即 10 美元。

若一份合约的持仓不变,基本计算方式如下:

gross_pnl = contracts × 1,000 × (ending_price − starting_price)

价格低于零时,这个公式依然适用。以期货报价计算的百分比收益就没那么有用了:价格穿越零点时,百分比收益可能变得无定义,或改变表面上的含义。策略收益应根据账户权益和现金流核算方式计算。每桶报价并不等于策略投入的资金。

58.06 美元:拼接处的断层

假设一个简单的引擎看到 5 月合约结算价后接着 6 月合约结算价,便套用上述公式,仿佛交易标的没有变化:

invented_pnl = 1 × 1,000 × (20.43 − (−37.63))
             = $58,060

这组比较里,时间并没有流逝。它们是同一交易日两份不同合约的价格。引擎把跨合约的价差误当成了持仓期间的收益。

在实际的逐日拼接中,旧合约昨天的价格和新合约今天的价格还包含正常的市场波动,因此错误更难察觉。记录的价格变化把旧合约的波动和换月时两份合约之间的价差混在了一起。

把这 58,060 美元当作所谓的现金“换月成本”扣掉,也修不好模型。期货并非通过支付全部报价名义金额来买入。平掉一份合约并开立另一份合约,会带来持仓变化、已实现或结算盈亏、费用、执行影响和保证金要求。两份合约的价格水平之差不会自动变成现金支出。

+58.06:写入历史数据的后复权

一种常见的连续序列构建方法,是将换月价差加到较早的价格上。按这种方法,5 月合约的 −37.63 会变成 20.43,与 6 月合约平滑衔接。同一历史区间中更早的价格也会整体上移 58.06。

构建方法该拼接处的处理方式对研究的影响
不调整保留 58.06 美元的价差指标可能把合约切换当成市场波动
加法后复权较早区间加上 58.06区间内的美元变动保持不变;历史价格水平和百分比变化会改变
比例后复权较早区间乘以 20.43 / −37.63,约为 −0.543负数因子会反转区间内价格变动的符号

最后一行就是我不接受仅仅写着“比例调整”的原因。对严格为正的价格表现合理的方法,必须明确说明如何处理零价和负价格。

加法调整也会带来影响。如果后续换月改写了先前的价格水平,一个在低于绝对价格 30 美元时买入的信号就可能改变。只要两个窗口接受相同的平移,快慢均线差值信号可能不受共同加法偏移影响。跨越调整边界的窗口则需要单独检查。

研究结果应记录调整方法、换月计划和数据版本。对于受调整后价格水平影响的信号,应重建每个决策日期当时可用的历史数据。当前下载的数据可能已经包含尚未发生的换月调整。

连续图表里缺失的两笔订单记录

来看一份刻意简化的账目。假设换月前,一份 5 月合约按 −30.00 计价。再假设 5 月合约按上述历史结算价平仓,6 月合约按该结算价开仓,之后 6 月合约按 21.00 计价。这些假设成交价仅用于说明核算。

账目事件计算方式毛盈亏
以 −37.63 平掉一份 5 月多头合约1,000 × (−37.63 − (−30.00))−$7,630
以 20.43 开立一份 6 月多头合约入场时价格未变动$0
以 21.00 计价 6 月合约1,000 × (21.00 − 20.43)+$570
合计未计执行成本和费用−$7,060

58.06 美元的价差并没有作为独立收益或费用出现在账目中。每日变动保证金决定期货盈亏何时计入现金,但不会凭空再造一份盈亏。

实际换月可能通过日历价差订单执行,而不是分别下达两笔独立订单。模拟器应按假设的机制建模,包括成交和费用,同时保留底层各份合约的持仓记录。

我的验收标准很简单:每一美元期货交易盈亏,都必须能对应到明确的合约、数量、乘数,以及属于该合约的两个价格。我还需要换月决策的时间戳和依据。如果基于成交量的规则使用的是当天已结束交易时段的成交量,就不能悄悄地在同一时段更早时交易。

可以绘制连续价格线作为参考,再在下方绘制实际持有的合约并标出每次切换。如果权益曲线在切换处跳变,我会先检查那两笔订单记录。

连续期货回测期货换月市场数据盈亏核算
← 全部文章