对于价差的反手套利策略,回测时候有时候只成交一腿,另一腿在过几天在成交;但有时候又是正常,这是怎么回事儿
代码检查了半天也没问题,其他回测框架都试过,就vnpy这里找不出
对于价差的反手套利策略,回测时候有时候只成交一腿,另一腿在过几天在成交;但有时候又是正常,这是怎么回事儿
代码检查了半天也没问题,其他回测框架都试过,就vnpy这里找不出
价差策略模块才能避免瘸腿问题
xiaohe wrote:
价差策略模块才能避免瘸腿问题
瘸腿是什么意思呢 组合策略模块这里下单会不一样吗 ?我在组合策略模块里面试过别的非反手套利模型就没问题,两腿一起下单。这里反手策略就会不一样。 没明白老师你的意思
xiaohe wrote:
价差策略模块才能避免瘸腿问题
我在这个反手模型的时候用buy sell或者rebalance_portfolio进行回测都是会这样,不知道原因是什么,甚至连他们俩的结果也会有所不一样
“从你的描述来看,“有时候两腿同时成交、有时候只成交一腿过几天另一腿才成交”,通常是由于回测过程里的撮合逻辑和真实市场的撮合机制不一致或不完备导致的,常见的原因可能有以下几类:
回测撮合方式与下单价格不匹配
如果你在策略代码里用“前一根K线的收盘价/开盘价”作为下单价,可能在回测中对某一合约来说,这个价位在下一根K线里实际上从未成交过(没有成交量或没有穿过这个价格),导致其中一条腿当日无法撮合,只有等到价格真的再次触及才会成交。
同理,如果某一腿的实际价格滑点过大、下一根Bar一开始就跳过了你的下单价,也会造成回测中的单腿“无法即时成交”现象。
不同合约流动性、撮合机会不同
在跨期、跨品种套利时,两腿品种或合约的流动性可能差异非常大,一条腿的挂单在当天能撮合成功,另一条腿因为没有对应的买卖盘或价格滑动未达到,回测中的算法会把它推迟到后面几天(等价差或价格再次触达时)才撮合。
真实市场如果是做跨期跨品种的“价差”或“反套”交易,往往会用组合撮合(交易所或券商提供的SP、IOC等方式)来保证两条腿同时或接近同时成交;纯用单腿指令在现实交易里也可能会遭遇“单腿先成交另一个腿没对手盘”的情况。
回测引擎的撮合机制简化
有些回测引擎对多合约回放时,只是逐Bar在一个顺序上更新数据:例如先更新leg1再更新leg2(或者先更新leg2再更新leg1),如果策略在“更新到leg1时就发出了交易指令”,而下一步更新到leg2时又已经是另一个时间点,就会导致两腿成交的时机不一致。
或者回测引擎的“撮合优先级”和“撮合顺序”是按照某种固定逻辑在执行(比如先撮合卖单,再撮合买单),也会造成部分腿成交延迟甚至失效。
策略下单逻辑细节
你的代码里对两腿下单看似同步 self.short(...) + self.buy(...),但是要注意它们可能在回测底层被拆分成多笔独立指令,比如先发出 leg1 的空单、再发出 leg2 的多单,若其中某一笔因为价格原因当时撮合不了,就会推到下一Bar或下一天撮合。
如果你在策略里对下单量、滑点、限价单/市价单方式没有做好统一处理,或者对其中某一腿加了额外条件(例如下单价减去 threshold、限价单有效期设置等),也会导致回测表现不一致。
如何改进或排查:
检查回测中的买卖撮合模式
如果你使用的是“限价单撮合”,要看你给出的下单价格是否真正在下一根Bar能够成交。可以尝试用市价单或用“Bar的(最高+最低)/2”当作撮合价格做测试,看是否仍然出现单腿成交延后的现象。
如果可以设置撮合模型(如Tick级别回放、使用更高频数据、或者使用交易所的组合报价),则可以更贴近真实的双腿同时成交。
在回测中引入组合撮合逻辑
有些CTP/交易所会提供套利合约(如SP、SPC)或交易所端的“组合下单”撮合功能,能保证两腿几乎同时成交。回测时可以模拟“组合下单”,而不是简单对两腿分别发单撮合。
如果回测引擎不支持组合撮合,可以考虑先写一个“价差撮合引擎”,专门对价差进行撮合,或者至少在回测的同一时刻先看是否能同时满足两腿价差的成交条件。
仔细核对策略下单价格、顺序和数量
在回测日志里打印每一笔下单的价格、数量、以及回测引擎里实际撮合的价格和时间,看看是哪一腿先触发了成交,另一腿具体是在什么价位、什么时间才成交。这样就可以 pinpoint 出造成时差的具体原因。
若发现某一笔单是“价格不满足”而撤单或延后,下次信号又过了几天才出现,那么就是典型的回测撮合价没匹配上所致。
总之,这种“先成交一腿,过几天才成交另一腿”的现象本质上是因为跨合约的撮合在回测环境中无法做到真实市场那种‘几乎同步’或者‘按组合价差撮合’的效果。要么改进撮合方式,要么改进回测逻辑(或交易逻辑)来模拟真实双腿/多腿的同时成交,才有机会避免一条腿先填坑、另一条腿挂了老半天的情况。”
这个是我用chatgpt o1 pro模型给你的回答,你看能解决问题不= =