在 GitHub 上查看

双品种价差偏离策略图示

两个通常同向运动的品种偶尔会走散,而它们之间的差距往往又会重新收敛。该图示用一个价格除以另一个价格,观察这个比值偏离其自身移动平均的幅度,并在差距开始收敛的那一刻买入或卖出第一个品种,而不是在差距刚刚拉开时动手。

策略概览

  • 一个指数模块把两个真实品种合成为一个合成标的:用第一个品种的价格除以第二个品种的价格;再对这个合成标的订阅一条K线序列,于是价差直接以现成的K线形式到达,无需手工拼装。
  • 一条移动平均运行在价差K线上,同时一个转换器取出它们的收盘价,这样价差既有了当前水平,又有了属于自己的参考线。
  • 一个公式把这一对数值归结为一个数字:收盘价与均线之间的距离,以均线的百分比表示。
  • 同一读数在前一根K线上的取值,由上一根价差K线和上一个均线值重新算出,第二个公式把这两者变成前一根K线的偏离度。
  • 第二条K线序列运行在被交易的品种上,两个变量把两个偏离度锁存到它上面:每个变量保存价差给出的最后一个数字,并在一根交易品种的K线走完时把它释放出去,因此每一次决策都按照委托所发往的那个品种的时钟做出。
  • 随后由比较模块提出四个问题:前一根K线的偏离度相对阈值处在什么位置、偏离度当前朝哪个方向移动、它仍处在均线的哪一侧,以及持仓是否为空仓。一个逻辑条件把四个答案汇总成每个方向各一道入场闸门。
  • 入场是固定手数的市价委托,只在空仓状态下发出,并且发往策略自身所设定的那个品种。合成标的只是数字的来源,永远不承载委托。
  • 另外两个比较模块盯住偏离度重新回到均线的时刻,并把这个时刻交给两个持仓模块(每个方向一个),由它们平掉已经开出的仓位。

入场与出场规则

  • 做多入场: 前一根K线的偏离度低于下阈值,本根K线的偏离度高于前一根,偏离度仍在均线下方,且持仓为空仓。多头模块按市价买入设定的委托手数。
  • 做空入场: 前一根K线的偏离度高于上阈值,本根K线的偏离度低于前一根,偏离度仍在均线上方,且持仓为空仓。空头模块按市价卖出设定的委托手数。
  • 离场: 当价差走完它被买入时所期待的那段路程,持仓即被平掉:多头在偏离度回到均线或向上穿越均线时离场,空头在偏离度回到均线或向下穿越均线时离场。每个平仓模块都带有各自的方向,因此为多头准备的那个碰不到空头,而在空仓状态下触发的平仓模块只是什么也不做。这里没有止盈目标、止损,也没有时间限制;价差的回归就是全部的离场依据。

参数

参数 默认值 说明
Index Expression BTCUSDT@BNBFT/TONUSDT@BNBFT 构建合成标的所用的表达式:第一个品种的价格除以第二个品种的价格。两个品种都必须存在于所连接的数据中,而其中只有第一个会被交易。
Spread Candles 00:05:00 价差序列所基于的K线周期。
Traded Candles 00:05:00 下单所用的K线周期。请保持它与价差序列一致,否则锁存下来的数字会比读取它们的那根K线更旧。
Average Length 20 用于度量偏离的移动平均中所包含的价差K线数量。
Deviation Threshold, % 0.3 价差必须离开其均线多远(以百分比计),向均线的回归才值得交易。
Order Volume 1 委托手数,以手为单位。

图表详情

  • 前一根K线的偏离度是由上一根K线和上一个均线值重新算出的,而不是把已经算好的百分比保存下来,因此比值的两个组成部分都取自前一根K线,当前值与彼时值的比较不会把两个不同的时刻混在一起。
  • 两条序列并不在同一瞬间收线:合成标的由两路行情拼装而成,它的K线要比普通K线稍晚收盘。把这些数字锁存到交易品种的K线上,正是让策略保持在单一时钟上的做法;若改为让两条序列一同释放,每一笔委托都会被打上两者中较早的那个时间,而时间早于当前时间的委托会被拒绝。
  • 常量由交易品种的K线触发。比较模块每一次运算都需要它的两个输入值重新到达,因此一个不被重新发送的常量会让它所供给的条件停止工作,而且不留任何迹象。
  • 下阈值不是第二个常量,而是对同一个值所做的一个公式,因此无论阈值设成多少,通道都保持对称。
  • 委托模块被设定为不等待策略进入在线状态,入场则被设定为只从空仓开仓,因此在一笔交易进行期间重复出现的信号不会给它追加任何东西。

使用方法

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