价差套利一等公民:组合行情、组合持仓与组合下单
配对/价差套利的本质是“交易两条腿的差”,而不是“分别交易两个标的”。
但很多系统里没有“价差”这个对象,只能把两条腿拆成两个独立订单硬凑——结果是行情看的是单腿、持仓算的是单标的、下单也各报各的,中性关系全靠人脑维持。
结论先行:EasyQuant 把价差做成一等公民——组合行情、组合持仓、组合下单三件事都以“价差”为中心,而不是以单标的为中心。
这对标 vnpy 的 SpreadData 思路,收敛在 execution/spread 包。
一、为什么“单标的中心”是错的模型
早期用 LEG(单标的多腿)拼价差,问题在于模型错位:
- 行情:真正要看的是
A − 乘数·B的价差序列,而不是 A、B 两条独立曲线 - 持仓:真正的仓位是“几手价差”,而不是“A 多少股、B 多少股”各记各的
- 下单:真正要的是“把价差建到 N 手”,由系统反推两条腿的报单
以单标的为中心,中性关系是隐式的、易漂的;以价差为中心,中性关系才是系统维护的、显式的。
二、价差对象:三个“组合”
| 能力 | 组件 | 含义 |
|---|---|---|
| 组合行情 | SpreadQuoteService |
由两腿报价合成价差报价,支持双合约乘数 |
| 组合持仓 | SpreadTradingEngine |
以“价差手数”记账,由组合持仓反推单腿持仓 |
| 组合下单 | SpreadPlanController / SpreadPlanFacade |
下“价差单”,系统拆成主动腿/被动腿报单 |
SpreadLeg 描述每条腿的标的、方向与乘数;主动腿先成交、被动腿跟随,裸腿(单边成交后另一边未成)时自动暂停,避免把套利做成单边裸头寸。
三、信号:THRESHOLD 与 BOLL
价差建好后,开平仓由价差序列的均值回归驱动:
THRESHOLD:价差偏离固定阈值开仓、回归中枢平仓BOLL:用布林带自适应刻画“偏离多少算极端”,比固定阈值更贴合波动变化
两种模式共享同一套价差行情与持仓口径,切换的是触发逻辑,不是另起一套引擎。
四、回测与实盘同源
价差套利最怕“回测用一套价差、实盘用另一套价差”。EasyQuant 让 SpreadBacktestService 与实盘引擎共用价差合成与持仓反推逻辑:
- 腿单最终仍落到现有
paper_order通道,复用风控与账本,不另开一套执行 - 回测里的价差手数、拆腿方式与实盘一致,绩效才可迁移
至于“β 该取多少”——固定乘数只是最简单情形,动态对冲比留给下一篇(见 28 统计套利动态对冲)。
结语
判断一个系统能不能做套利,看它有没有“价差”这个对象——有,才谈得上中性;没有,就只是两个订单的巧合。
把价差升级为一等公民,行情、持仓、下单三件事围绕价差展开,是 EasyQuant 从“多标的策略”走向真正配对交易的结构性升级。