在 GitHub 上查看

双腿价差背离策略示意图

两个通常同向运行的品种,有时涨跌的幅度并不一致,而落后的一方往往会补上这段差距。该示意图衡量两者在相同根数K线内各自走过的幅度,用其中一个减去另一个,当差距张开到足够大时,在同一时刻买入落后的一腿、卖出领先的一腿。当差距重新收敛时,两腿一并平掉。

策略概览

  • 一个标的(Security)变量指定第二个品种,因此配对是一项参数设置,而不是接线上的取舍;第二路K线序列以及第二腿的每一个委托方块,指向的都是这同一个变量。第一腿就是策略自身所设定的品种。
  • 两路K线序列都设为仅取已完成的K线,因此未完成的一根K线既不会左右决策,也不会给委托打上过期的时间。
  • 同步(Sync)为每个品种各保留一条输入线,并按五分钟的节拍把两根K线一起放行。两路行情各自独立到达,只有经过这一次等待,两根K线才属于同一根周期——而这正是比较两个品种的意义所在。
  • 对每一根放行的K线,一个转换器取出收盘价,前值(Previous value)方块保存固定根数之前的那根K线,再由第二个转换器从那根较早的K线中读出收盘价。方块保存的是K线本身,字段随后才读取,正是这个顺序保证了每一根K线上都能得到数值。
  • 两个公式把每一对价格化为一个数字:该腿自较早那根K线以来走过的幅度,以较早价格的百分比表示。
  • 两个变量把这两个百分比锁存到交易品种的K线上:各自保存该对价格算出的最新数值,并在交易品种的一根K线走完时释放出去,因此下游的每一次比较、每一道闸门和每一笔委托,跟随的都是委托所发往品种的时钟。
  • 一个公式用交易腿的幅度减去第二腿的幅度,这就是背离;另一个公式取其绝对值,用于离场。比较方块把背离与一条对称的阈值带作比较,把两腿的幅度分别与零作比较,并把持仓与零作比较;两个“与”和一个“或”把两个符号判断合成一个相关性标志(Flag)。
  • 三个逻辑条件组装出决策,六个持仓(Position)方块负责执行:每个方向各有两个方块开出一对头寸,每个品种一笔委托;另有两个方块把两腿一起平掉。每个开仓方块都设为仅在其自身品种处于空仓时才动作,因此在一对头寸持有期间重复出现的信号不会再往上加仓。

入场与出场规则

  • 做多入场: 背离位于阈值带下沿之下——交易腿落后于第二腿——两腿在回溯的这段区间内同向运行,且交易腿处于空仓。在这一个信号上两个方块同时触发:一个在策略品种上以市价买入交易腿数量,另一个在指定品种上以市价卖出第二腿数量。
  • 做空入场: 背离位于阈值带上沿之上——交易腿领先于第二腿——两腿在回溯的这段区间内同向运行,且交易腿处于空仓。镜像的那一对方块以市价卖出交易腿数量、买入第二腿数量。
  • 离场: 当初开仓所依据的差距一旦收敛,两腿就一起平掉:在一对头寸持有期间,背离的绝对值跌破离场阈值。两个平仓方块在这一个信号上触发,每个品种一个,各自根据查到的持仓算出自己的平仓数量,因此都不需要单独设定数量;若某个品种本就空仓,触发的平仓方块什么也不做。这里没有资金目标、没有止损、也没有时间限制;两腿重新靠拢就是全部的离场逻辑。

参数

参数 默认值 说明
Second Instrument TONUSDT@BNBFT 第二腿交易所在的品种。它必须存在于已连接的行情数据中,并且是真实可交易的品种:委托是发往它的,而不只是从它读取数据。
Traded Candles 00:05:00 策略自身品种上的K线周期。决策和委托都按这个节拍运行。
Second Leg Candles 00:05:00 第二个品种上的K线周期。保持与交易序列相等,否则两腿的幅度是在不同的时间跨度上度量的,两者之差也就没有意义。
Sync Interval 00:05:00 等待环节放行两个品种的节拍。与K线周期保持一致。
Traded Leg Shift 12 交易腿的幅度从多少根K线之前起算。十二根五分钟K线是一小时。
Second Leg Shift 12 第二腿的同一个根数。保持两者相等:两个不同的跨度会让相减失去意义。
Divergence Threshold, % 0.3 两者的幅度相差多少(以百分比计)才值得开出一对头寸。阈值带是对称的,因此这一个数值同时设定了上下两个边界。
Exit Threshold, % 0.1 两者的幅度重新靠拢到多少(以百分比计)才把两腿平掉。要让它低于入场阈值,否则一对头寸会在开出的那根K线上就被平掉。
Traded Leg Volume 1 策略品种上的委托数量,单位为手。
Second Leg Volume 10 第二个品种上的委托数量,单位为手。两个数量各自独立设定,因此两腿之间的比例是一项参数设置,而不是根据价格推算出来的——请按两个品种的价格量级来选取,并对照第二个品种的数量步长检查,否则委托数量会被向下取整。

图表详情

  • 配对K线靠的是同步(Sync),但没有任何委托是由它的放行触发的。两路行情不会在同一瞬间结束,等待后放行的那一组数据带的是两个时间中较早的那个,而时间早于当前时刻的委托会被拒绝。把数值锁存到交易K线上的那两个变量,才是让整条下游保持在同一个时钟上的东西。
  • 这种锁存带来的后果值得了解:做决策所依据的是最近一对完整的数值,因此一对头寸是在产生该读数的那根K线之后的一根上开出的,而不是在这根K线之内。
  • 每一个常量——零、两个阈值和两个数量——都由交易品种的K线触发。比较方块每次求值都需要两个输入值再次到达,而一个不再重新发送的常量,会悄无声息地让它所供给的条件停止工作,且不留任何迹象。
  • 阈值带的下沿是对阈值做公式运算得到的,而不是第二个常量,因此无论阈值设成多少,阈值带始终对称,而且只需要改一个数字,而不是两个可能彼此走偏的数字。
  • 持仓方块只读取交易品种,其数值也与两腿的幅度一样锁存到K线上。两腿由同样的信号开出和平掉,因此交易腿的状态就代表了整对头寸的状态。

使用方法

将 .json 文件导入 Designer,在回测器中用历史数据运行,然后根据自己的交易品种调整参数或方块,确认无误后再用于实盘。