在 GitHub 上查看

基差百分比套利策略图

一个配对有两个价格:它值多少钱的价格,以及实际能成交的价格。本图把前者构建为一个合成合约并取其移动平均,从两条订单簿中读出后者,把两者之间的距离表示为百分比,当这个距离超过阈值时同时开出两条腿。

策略概览

  • 指数模块把第一个合约的价格除以第二个合约的价格,构建出一个合成合约;对它订阅一条K线序列,这些K线上的移动平均就是该配对的公允价值。
  • 两个订单簿(Market depth)模块提供该配对实际可成交的价格:一个转换器取第一个合约的最优买价,另一个取第二个合约的最优卖价。
  • 订单簿在一根K线之内会变动很多次,因此这两个最优价格不会直接送入条件判断:两个变量各自保存最新的报价,并在一根交易K线走完时把它放出,再由一个公式把二者相除,得到可成交比价。
  • 同步(Sync)模块把时间戳相同的可成交比价与比价K线一起保存并一同放出,因此参与比较的公允价值与可成交价格始终属于同一根K线。
  • 一个公式把放出的这对数值化为一个数字:可成交比价与公允均值之间的距离,以该均值的百分比表示。这个数字就是基差。
  • 一个变量把基差锁存到交易K线上,其下游的每一次比较都在该K线上求值,因此每一笔委托都以做出决定的那根K线为时间标记。
  • 基差与入场阈值比较,也与该阈值的相反数比较,从而为每个方向各得到一道闸门;同时还与公允价值附近一条窄得多的区间比较,其两个结果由一个逻辑条件合并为回归信号。
  • 一个延时模块由任一入场信号触发后开始对已完成的交易K线计数,并在达到持仓上限时发出一个单次标志(Flag);一个组合(Combination)模块把该标志与回归信号合并为同一条离场流,两个平仓模块随后把该配对了结,每个合约各一个。

入场与出场规则

  • 做多入场: 可成交比价低于公允均值,且幅度超过最小基差:本图买入第一个合约并卖出第二个合约,每条腿各一份委托数量。每条腿都设定为只有在自身持仓为空时才开仓,因此在配对已经建立之后重复出现的信号不会再往上加。
  • 做空入场: 可成交比价高于公允均值,且幅度超过最小基差:本图卖出第一个合约并买入第二个合约,每条腿各一份委托数量。同样的“仅在空仓时开仓”条件分别守护每一条腿。
  • 离场: 两条腿在以下任一条件先满足时被了结:基差回到公允价值附近的窄区间之内,或延时模块自触发它的那次入场以来已数满持仓上限根已完成的交易K线。两个原因都经由同一个合并模块到达同一个触发器。平仓模块不带方向,会依据当前持仓自行算出数量;若某条腿已经是空仓,触发平仓模块则不会有任何动作。

参数

参数 默认值 说明
Traded Candles 00:05:00 做出决策并下达委托所依据的K线长度。
Index Expression BTCUSDT@BNBFT/TONUSDT@BNBFT 构建合成合约所用的表达式:第一个合约的价格除以第二个合约的价格。两个合约都必须存在于所连接的数据中,并且两者都参与交易。
Ratio Candles 00:05:00 构建公允价值所用的K线长度。请与交易用的序列保持一致,否则两者无法进入同一组数值。
Sync Interval 00:05:00 同步模块用于归集的时间桶。请与K线长度保持一致:桶更短会把本应成对的数值拆开,桶更长则会把不同K线的数值合到一起。
Fair Average Length 20 公允价值所取的移动平均中包含的比价K线根数。
Minimum Basis, % 0.5 在开出两条腿之前,可成交比价必须偏离公允价值多少个百分点。
Exit Basis, % 0.1 在了结该配对之前,基差必须回到距公允价值多少个百分点以内。
Volume Per Leg 1 每条腿的委托数量,单位为手。两条腿发送相同的数量。
Max Hold Bars 72 无论基差如何,该配对最多可持有多少根已完成的交易K线之后被平仓。

图表详情

  • 订单簿从不直接读入条件判断。它每根K线更新很多次,而条件运行在K线上;两个锁存变量正是把两者放到同一个时钟上的环节,它们的触发源是交易K线,而不是订单簿。
  • 任何下达委托的模块都不由同步输出触发。放出的一组数值以其成员中最早的时间为标记,而时间早于当前时刻的委托会被拒绝,因此同步只为算术运算供数,每一个触发都由交易K线驱动。
  • 两条K线序列都设置为仅取已完成的K线。形成中K线的更新会让委托的时间标记停在该K线开盘的时刻,而在对这根K线做出决定时,那个时刻已经过去了。
  • 常量在每根交易K线上都会重新发送。一次比较需要它的两个输入在每次求值时都重新到达,因此只发送一次的常量会悄无声息地让它所馈入的条件停止工作。
  • 较低的阈值不是各自独立的常量,而是由较高阈值算出的公式,这样无论阈值设成多少,两条区间都保持对称;持仓上限则按已完成的K线根数计,而不是按时钟时间计。

使用方法

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