Delta 中性价差 Z-Score 策略图
两个通常同向波动的标的有时会背离,而它们之间的差距往往又会重新收敛。本图用一个价格除以另一个价格得到一个合成标的,以自身波动率为单位衡量该比值偏离其自身均值的幅度,并同时对两个标的建立方向相反的持仓:买入便宜的一边,卖出昂贵的一边。当比值回到通常所处的位置时,两条腿一并释放。每一次入场还会以一行文本说出来,其中带有触发它的读数。
策略概览
- 一个指数方块用第一个标的的价格除以第二个标的的价格,把两个真实标的合成为一个合成标的;随后对这个合成标的订阅一条K线序列,于是价差以现成的K线到达,而不必由两路行情手工拼接。
- 移动平均和标准差在价差K线上运行,一个转换方块取出K线的收盘价。决策所需要的全部就是这三个数字:价差现在在哪里、它通常在哪里、以及它通常波动多宽。
- 一个公式把它们变成 z-score,也就是收盘价到均值的距离除以标准差;另一个镜像公式给出符号相反的同一数值,于是一个入场阈值和一个出场阈值即可服务于两个方向,不需要第二组常量。
- 另有两条K线序列运行在真正参与交易的两个标的上,两个变量把读数锁存到被交易的那一路上:每个变量保存价差产生的最后一个数值,并在被交易标的的K线收盘时把它放出,因此每个决策都带着委托所指向的那个标的的时钟。
- 两个持仓方块,每个标的一个,报告当前持有什么。它们的数值在同一根被交易标的的K线上被锁存并与零比较,于是图得到四个明确的答案:每条腿要么空仓,要么持仓。
- 与入场阈值的比较说明价差是远低于还是远高于其均值,一个逻辑条件再把它与两条腿都空仓这一点组合起来。只有此时四个持仓方块才会一同触发,以相同的数量买入一个标的、卖出另一个标的。
- 与出场阈值的两个比较由一个逻辑条件连接起来,说明读数在绝对值上已经很小,也就是价差回到了均值附近。每条腿都有自己的放行闸门,因此已经空仓的腿不会被要求平仓,而仍有持仓的腿一定会被平掉。
- 入场的瞬间,一个变量捕获触发它的 z-score,一个字符串格式化方块把它写进一句话,一个通知方块再把这句话写入策略日志。图表面板画出两个被交易的标的、合成价差序列、均值、标准差,以及每一笔委托和成交。
入场与出场规则
- 做多入场: 镜像 z-score 高于入场阈值,意味着价差位于其自身均值下方、距离超过相应数量的标准差,且两条腿都为空仓。图买入被交易标的、卖出对冲标的,两者均以市价发出,数量均为委托量。
- 做空入场: z-score 高于入场阈值,意味着价差位于其自身均值上方、距离超过相应数量的标准差,且两条腿都为空仓。图卖出被交易标的、买入对冲标的,两者均以市价发出,数量均为委托量。
- 离场: 当 z-score 的绝对值落到出场阈值以下,也就是价差回到其均值附近的窄幅区间内时,两条腿一并释放。两个平仓方块本身不带方向,而被设置为平掉持仓:各自判断该往哪个方向交易、交易多少,因此同一对方块既能了结做多的价差,也能了结做空的价差。此外,被交易的那条腿带有一个按成交价百分比计算的止损。该止损只覆盖一条腿:配对持仓无法用单个保护性委托平掉,因此对冲腿保留自己的放行闸门,在价差回归时离场。
参数
| 参数 | 默认值 | 说明 |
|---|---|---|
| Index Expression | BTCUSDT@BNBFT/TONUSDT@BNBFT | 构建合成标的所用的表达式:被交易标的的价格除以对冲标的的价格。两个标的都必须存在于所连接的数据中,并且两者都会被交易。 |
| Spread Candles | 00:05:00 | 价差序列所基于的K线周期,也就是均值和标准差所度量的那根K线。 |
| Traded Leg Candles | 00:05:00 | 跟踪被交易腿所用的K线周期。整张图按这个时钟运行,因此要让它与价差序列保持一致,否则锁存的读数会比读取它的那根K线更旧。 |
| Hedge Leg Candles | 00:05:00 | 跟踪对冲腿所用的K线周期。这条序列的存在是为了让对冲标的的价格进入运行并显示在图表上;要让它与另外两个保持一致。 |
| Average Length | 20 | z-score 所参照的移动平均中包含的价差K线数量。 |
| Deviation Length | 20 | z-score 所除以的标准差中包含的价差K线数量。除非你有意让一个快速的水平线对上一个缓慢的宽度,否则应让它与平均长度保持一致。 |
| Entry Z-Score | 1.5 | 在建立配对持仓之前,价差必须偏离其均值多少个标准差。调高该值会让入场更稀少,而入场时的偏离幅度更大。 |
| Exit Z-Score | 0.5 | 在两条腿被释放之前,价差必须回到离其均值多近的位置。这是一个绝对值,同时覆盖两个方向,因此同一个数值既平掉做多的价差,也平掉做空的价差。 |
| Order Volume | 1 | 每条腿的数量,以手为单位。两条腿以相同数量发出。 |
| Stop Loss, % | 1.5 | 被交易腿的止损,按其成交价的百分比计。它只保护一条腿;对冲腿没有自己的止损。 |
图表详情
- 合成标的取的是比值而不是差值。两个价格水平相差很大的标的之间的差值会被较大的那个主导,此时 z-score 衡量的就是那一个标的,而不是两者之间的关系。
- 两条序列并不在同一瞬间结束:合成标的由两路行情拼成,它的K线比普通K线略晚收盘。把读数锁存在被交易标的的K线上,可以让整张图运行在同一个时钟上;若改为让两条序列一起放行,每笔委托都会按两者中较早的那个时间来标记,而时间早于当前时刻的委托会被拒绝。
- 常量由被交易标的的K线触发。比较方块每次求值都需要它的两个数值重新到达,因此一个从不重新发送的常量会悄无声息地让它所供给的条件停下来。
- 产生 z-score 的除法在分母上设有一个很小的正数下限,这样一段价格完全静止的行情就不会除以为零的标准差而中断运行。
- 每条腿由各自的持仓方块监视并分别设闸,因此如果止损先把被交易的那条腿带出场,对冲腿仍会按自己的条件释放,而不会一直挂到下一次入场。
使用方法
将 .json 文件导入 Designer,在回测器中用历史数据运行,然后根据自己的交易品种调整参数或方块,确认无误后再用于实盘。