双品种价差偏离策略图示
两个通常同向运动的品种偶尔会走散,而它们之间的差距往往又会重新收敛。该图示用一个价格除以另一个价格,观察这个比值偏离其自身移动平均的幅度,并在差距开始收敛的那一刻买入或卖出第一个品种,而不是在差距刚刚拉开时动手。
策略概览
- 一个指数模块把两个真实品种合成为一个合成标的:用第一个品种的价格除以第二个品种的价格;再对这个合成标的订阅一条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,在回测器中用历史数据运行,然后根据自己的交易品种调整参数或方块,确认无误后再用于实盘。