发布于vn.py社区公众号【vnpy-community】
 
原文作者:用Python的交易员 | 发布时间:2020-04-06

 

本文的封面图来自于一部叫做《Upside Down》的电影,片中互为颠倒的两个世界仅靠一座巨塔进行有限的沟通,反向合约(Inverse Contract)也许就有点像是这么一座巨塔,连接着传统金融和数字货币两端的衍生品市场。

 

作为vn.py的用户,以下两处的【合约模式】选项可能曾经让你懵逼许久:

 

description

CtaBacktester回测参数设置

 

description

SpreadTrading创建价差设置

 

不绕弯子,先说结论:

 

  • 反向合约:只有数字货币市场(或称“币圈”)才有的一种特殊衍生品合约规则;
  • 正向合约:除了反向合约以外,其他所有的金融市场(股票、期货、期权等等)采用的规则。

 

看到这里,如果你不关注币圈(或者觉得数字货币都是骗局)的话,那么只要记住以后【合约模式】都选【正向】,就可以直接退出关闭本文了。

 

反过来,如果你对金融市场的“新鲜事物”充满好奇心,或者本身就是数字货币投资者(甚至已经在跑币圈量化交易),那么不妨继续看下去,相信接下来的内容会让你有所收获。

 

反向合约的概念

 

绝大部分数字货币相关的衍生品都采用了反向合约的设计,包括:反向期货、反向永续、反向期权等。尽管被许多币圈交易所采用,但反向合约本身并没有一个非常正式(或者说学术化)的定义,这里我们尽可能用“人话”来总结一个定义:

 

反向合约是指用USD来标识价格,用BTC来结算盈亏的衍生品合约。

 

其中:

 

  • USD可以是其他计价法币;
  • BTC也可以是其他数字货币。

 

同时作为一个对比:

 

正向合约是指用USD来标识价格,用USD来结算盈亏的衍生品合约。

 

光看这两个定义,可能并不足以降低你的懵逼程度(搞不好还得加重),接下来我们选择两个具体的例子来做对比说明,正向合约方面选择芝商所(CME)的比特币期货,反向合约方面则选择火币合约(HBDM)的比特币期货:

 

交易所 芝商所 CME 火币合约 HBDM
类型 正向 反向
标的物 5个BTC 100USD对应的BTC
合约乘数 5 100
最小跳动 5 0.01
计价方式 USD USD
结算方式 USD BTC

 

目前(2020年4月6日)比特币的价格大概是6900美元附近,四舍五入做个取整,假设我们以7000美元(开仓价)的价格做多1手期货,后续比特币的价格上涨到了8000美元(平仓价),则两个交易所合约的盈亏情况分别是:

 

  • CME的正向期货

    • 盈亏金额:

      • (8000 - 7000) x 5 x 1= 5000 USD
    • 计算公式:

      • (平仓价 - 开仓价) x 合约乘数 x 仓位 = USD盈亏
    • 背后逻辑:

      • 以开仓价买入5个BTC,并以平仓价卖出5个BTC后,得到的盈亏是USD价格的变动值
    • 讲人话:

      • 昨天去菜场用5元的价格买了10个苹果,今天去菜场用10元的价格把这10个苹果全卖了,赚了50元(货币)

         

  • HBDM的反向期货

    • 盈亏金额:

      • (100 / 7000 - 100 / 8000) x 1 = 0.001786 BTC
    • 计算公式:

      • (合约乘数 / 开仓价 - 合约乘数 / 平仓价) x 仓位 = BTC盈亏
    • 背后逻辑:

      • 以开仓价买入100USD等值数量的BTC,并以平仓价卖出100USD等值数量的BTC,得到的盈亏是BTC数量的变动值
    • 讲人话:

      • 昨天去菜场用5元的价格买了10个苹果,今天去菜场用10元的价格卖掉5个苹果,赚了5个苹果(商品)

 

其中正向期货计算公式背后的逻辑,基本做过期货交易的人都能理解。而反向期货名字里的【反向】两个字,则是体现在尽管计价还是使用的USD(货币),但在结算盈亏时则是使用的却是BTC(商品)。用人话来讲,那就是正向合约盈亏的都是钱,反向合约盈亏的都是苹果。

 

搞明白了什么是反向合约,估计大部分人会有接下来这个疑问:这东西有啥用?或者说:为什么不直接用正向合约?

 

其实核心目标很简单,为了实现一个只需要BTC,不需要USD,就能交易的金融衍生品市场:

 

  • 前者是对理想的坚持:对于BTC的信仰,实现一个用BTC作为主要货币的世界(以下省略一万字)
  • 后者是对现实的妥协:基于法币结算的期货交易,需要拿到政府监管机构发放的正规期货交易所牌照,而早年的币圈交易所根本无法满足监管规定(也就拿不到了~)

 

不管是理想还是现实的影响更多一些,反向合约成为了币圈金融衍生品的主要形态,也对各种围绕数字货币的量化交易策略产生了显著的影响。

 

量化策略的影响

 

CTA策略

 

针对以趋势跟踪(追涨杀跌)为核心的CTA策略,vn.py量化平台提供了完善的历史回测(CtaBacktester模块)和自动交易(CtaStrategy模块)支持。首先,我们基于BTC的分钟线历史数据,开发出来了一个还不错的CTA策略,回测的资金净值曲线如下:

 

description

正向模式回测:固定合约数量

 

在这里,我们采用的是固定合约数量的交易仓位,即:

 

trading_size = self.fixed_size    # 固定合约数量
self.buy(self.entry_up, trading_size, stop=True)

 

请注意这里的净值曲线只用于展示反向合约带来的影响(曲线形状),不用过多关注具体的数字,对于策略本身感兴趣的话可以关注我们的CTA策略小班课

 

数字货币的现货交易采用的是正向合约模式,但是在做空上十分麻烦:要么同时持有BTC和USDT,要么得杠杆融币(跟股票T0的需求类似)。所以为了方便还是要选择用衍生品(反向合约)来做交易,但切换为反向回测模式后,回测曲线一下子没法看了:

 

description

反向模式回测:固定合约数量

 

可以看到上图中除了开始一段时间净值曲线有所增长外,往后几乎走平了。背后的主要原因,是比特币价格大幅波动后,带来的实际交易仓位变化:

 

  • 2017年初的时候BTC价格大约位于1000,交易1万USD面值的期货差不多等于10个BTC;
  • 2017年底BTC价格到达巅峰水平20000的时候(翻了20倍),1万USD面值的期货则只剩下0.5个BTC了;
  • 目前价格位于7000附近,1万USD面值的期货仓位差不多是1.43个BTC。

 

因此2017上半年的持仓水平大概有后续时段的10倍以上规模,带来了巨大的策略盈利,而后续随着币价越来越高,实际交易仓位变得越来越小,导致盈亏在资金曲线上几乎看不出来了。

 

最简单的解决方案,就是将交易的反向合约仓位和币价挂钩,使得实际交易仓位保持固定:

 

trading_size = self.fixed_size * bar.close_price   # 固定BTC数量
self.buy(self.entry_up, trading_size, stop=True)

 

代码部分的调整很少,只需在计算下单的合约数量trading_size时,乘以当前最新的合约价格bar.close_price,从而使得每次交易的BTC数量保持一致:

 

description

反向模式回测:固定交易BTC数量

 

可以看到即使还有细微的区别,整体资金曲线的形状已经变得和开始正向模式下的回测结果一致了。需要注意的是,正向回测模式时的账户资金是法币(USD/USDT),而反向回测模式时的账户资金是BTC。

 

关于反向模式下,回测结果中的成交盈亏计算细节,因为篇幅所限就不在本文中详细讲解了,有兴趣的话可以查看vnpy/app/cta_strategy/backtesting.py中的源代码,搜索inverse关键词即可。

 

价差交易

 

去年发布的v2.0.8版本的vn.py中,就已经增加了SpreadTrading价差交易模块对于币圈反向合约的支持。对于用户来说,唯一需要手动调整的地方就是本文开头出现过的一张截图:

 

description

 

只需将价差组合中是反向合约的腿,在创建价差时将这条腿的【合约模式】设置为【反向】即可,其他交易过程中的所有涉及到反向合约数量和正向BTC数量之间的转化计算,都会由价差算法中的内置逻辑来实现。

 

需要注意的是,不管价差各条腿是否设置了反向合约(哪怕所有的腿都是反向合约),价差的交易数量和盘口数量都还是多少个币(BTC的数量):

 

description

 

上图中,对于BTC-HB-SPREAD这个价差,其中BTC200410.HUOBI是反向腿期货,btcusdt.HUOBI是正向腿现货:

 

  • 黄框内的是当前该价差组合的盘口买价的可交易数量,即如果以市价卖出该价差,可以立即以-9.61的价格成交0.05个BTC的量;
  • 绿框内的是当前该价差组合的盘口卖价的可交易数量,即如果以市价买入该价差,可以立即以-7.71的价格成交2.0个BTC的量;
  • 红框内的则是用户启动价差交易算法时,设置算法所需要成交的BTC数量,即要以最高不超过3的价格买入0.4个BTC数量的价差。

 

由于反向合约的最小成交面值限制,在实盘中涉及到反向合约的价差组合有可能出现最终无法完美对冲的情况:

 

  • 假设当前BTC价格为7040,选择买入1.0个BTC数量的价差

  • 主动腿的btcusdt.HUOBI现货,成交了1.0个BTC的数量

  • 被动腿的BTC200410.HUOBI期货,理论上要成交:

    • 1.0 x 7040 / 100 = 70.4(张)
  • 但由于期货最小的交易数量为1张,无法满足0.4张的交易要求,因此四舍五入实际只能成交70张期货

 

最后出现了0.4张期货的敞口,但货币金额是40美元,对应大约0.0056个BTC,所以对于1个BTC的交易量来说可以忽略不计。

 

期权交易

 

对于币圈的反向期权合约的支持,将在v2.1.2版本(预计4月15左右发布)的OptionMaster模块中提供支持。用户要做的同样非常简单,只需在初始化期权交易组合时,将【合约】选择为【反向】模式即可:

 

description

 

OptionMaster内部的期权定价引擎会自动负责处理所有相关的转换,包括实时定价、希腊值风控,以及隐含波动率曲面跟踪:

 

description

Deribit BTC隐含波动率曲线

 

从上图中的隐含波动率曲线上可以看出,当前币圈期权市场(至少以Deribit为例),不管是各种波动率套利策略,还是期权做市策略,应该都还有挺大的盈利空间。对于期权相关的量化交易策略策略感兴趣的话,可以关注我们的期权波动率交易小班课

 

最后的总结

花了快半年的时间,总算实现了vn.py在CTA、价差和期权三大类量化策略上对于币圈反向合约的充分支持,基本可以做到让传统金融领域的量化投资者,几乎无感的切换到数字货币市场快速开始实盘交易。

 

同时越来越多的币圈交易所开始提供正向衍生品合约,使用USDT(代币)而非USD(法币)来进行结算,满足监管底线的同时对于传统领域进入币圈的投资者来说也更加友好和易于理解,不过当前从成交量和流动性上看还是反向合约占据主导地位。

 

技术分享活动公告

 

根据之前在几次在【vn.py框架交流群】(QQ:262656087)中的投票调查结果,发现目前在币圈交易所中火币是vn.py社区用户最主流的选择之一。

 

和火币的机构业务负责人联系后,很荣幸的邀请到火币技术和产品两条线的高管,在本周末给大家做一次线上分享活动。

 

主题:头部交易所漫谈 - API技术核心优势&交易系统技术优化

 

时间:4月12日(周日)下午16:00 - 18:00

 

嘉宾:

  • Stephen Li,火币API技术总监
  • Zack Dong,火币Global金融产品负责人

 

内容:

  1. API业务介绍及服务机制
  2. 金融衍生品元年-头部交易所如何布局
  3. 社区答疑

 

报名方式:点击这里或者扫描下方直接进入直播间(免费)