上篇给大家介绍了一下三角套利的原理,发现大家的热情是如此高涨,都在喊着要代码和下半段。呐,我们WeQuant毕竟是以用户第一的产品,所以,加班加点把下半段赶出来
上篇给大家介绍了一下三角套利的原理,发现大家的热情是如此高涨,都在喊着要代码和下半段。呐,我们WeQuant毕竟是以用户第一的产品,所以,加班加点把下半段赶出来,就问你们感动不感动!话不多说,开搞!
我们以第一个策略(正循环套利_挣CNY策略为例)。
图:正循环套利(挣CNY)策略示意图
我们设计的套利策略是被动套利策略,具体来讲,我们在LTC/BTC,LTC/CNY,BTC/CNY三个市场上都是作为taker去吃单。
在LTC/BTC市场上下买单,就必须使用该市场的卖一价格(ltc_btc_sell1_price)加上一定的滑点(ltc_btc_slippage,以百分比表示)来作为买单价格,即:
P3 = ltc_btc_sell1_price*(1+ltc_btc_slippage)
同理,在BTC/CNY市场下买单,就必须使用该市场的卖一价格(btc_cny_sell1_price)加上一定的滑点(btc_cny_slippage,以百分比表示)来作为买单价格,即:
P1= btc_cny_sell1_price*(1+btc_cny_slippage)
同理,可以推导出在LTC/CNY市场下卖单的价格如下:
P2 = ltc_cny_buy1_price*(1-ltc_cny_slippage)
假设各个市场的费率情况如下(以百分比表示):
LTC/BTC: ltc_btc_feeBTC/CNY: btc_cny_feeLTC/CNY: ltc_cny_fee
在LTC/BTC市场净买入1个LTC,实际上需要买入1/(1-ltc_btc_fee)个LTC,其中的ltc_btc_fee比例部分,是被交易平台收走的手续费。买入1/(1-ltc_btc_fee)个LTC需要花费的BTC数量是:
ltc_btc_sell_1_price*(1+ltc_btc_slippage)/(1-ltc_btc_fee)
在LTC/CNY市场,卖出1个LTC,得到的CNY是:
ltc_cny_buy_1_price*(1-ltc_cny_slippage)*(1-ltc_cny_fee)
在BTC/CNY市场,净买入
个BTC,实际上需要买入
ltc_btc_sell_1_price*(1+ltc_btc_slippage)/[(1-ltc_btc_fee)*(1-btc_cny_fee)]
个BTC,其中btc_cny_fee比例部分,是被平台收走的手续费,而对应需要花费的CNY是:
btc_cny_sell_1_price*(1+btc_cny_slippage)*ltc_btc_sell_1_price*(1+ltc_btc_slippage)/[(1-ltc_btc_fee)*(1-btc_cny_fee)]
套利的前提条件是:得到的CNY > 花费的CNY,即:
ltc_cny_buy_1_price*(1-ltc_cny_slippage)*(1-ltc_cny_fee)> btc_cny_sell_1_price*(1+btc_cny_slippage)*ltc_btc_sell_1_price*(1+ltc_btc_slippage)/[(1-ltc_btc_fee)*(1-btc_cny_fee)]
调整一下,对应的套利条件就是:
ltc_cny_buy_1_price>btc_cny_sell_1_price*ltc_btc_sell_1_price*(1+btc_cny_slippage)*(1+ltc_btc_slippage) /[(1-btc_cny_fee)*(1-ltc_btc_fee)*(1-ltc_cny_fee)*(1-ltc_cny_slippage)]
考虑到各市场费率都在千分之几的水平,做精度取舍后,该不等式可以进一步化简成:
(ltc_cny_buy_1_price/btc_cny_sell_1_price-ltc_btc_sell_1_price)/ltc_btc_sell_1_price>btc_cny_slippage+ltc_btc_slippage+ltc_cny_slippage+btc_cny_fee+ltc_cny_fee+ltc_btc_fee
基本意思就是:只有当公允价和市场价的价差比例大于所有市场的费率总和再加上滑点总和时,做三角套利才是盈利的。
如果价差满足条件,交易数量上的计算规则如下:
先计算以下几个值:
拿到上面5个值之后,对它们取最小值,得到LTC的数量,作为LTC/BTC市场的下单数量。然后,根据LTC/BTC成交的数量,得到需要对冲的LTC数量和BTC数量,分别在LTC/CNY和BTC/CNY市场下对冲单,所有市场先下限价单进行对冲,超时之后补市价单,确保完全对冲。
对最小交易单位的处理规则如下:
如果欲下单的LTC数量小于最小LTC交易单位(取LTC/BTC和LTC/CNY两个市场的最小LTC交易数量的最大值)的某个倍数(比如2倍),则放弃本次套利;
如果欲下单的LTC数量对应的BTC数量( LTC数量乘上系数 ltc_btc_sell1_price)小于最小BTC交易单位(取LTC/BTC和BTC/CNY两个市场的最小BTC交易数量的最大值)的某个倍数(比如2倍),则放弃本次套利。
则进行正循环套利:
正循环套利的顺序如下:
先去LTC/BTC吃单买入LTC,卖出BTC,然后根据LTC/BTC的成交量,使用多线程,同时在LTC/CNY和BTC/CNY市场进行对冲。LTC/CNY市场吃单卖出LTC,BTC/CNY市场吃单买入BTC。
(ltc_btc_buy_1_price-ltc_cny_sell_1_price/btc_cny_buy_1_price)/ltc_btc_buy_1_price> btc_cny_slippage+ ltc_btc_slippage+ ltc_cny_slippage+btc_cny_fee+ltc_cny_fee+ltc_btc_fee
则进行逆循环套利:
逆循环套利的顺序如下:
先去LTC/BTC吃单卖出LTC,买入BTC,然后根据LTC/BTC的成交量,使用多线程,同时在LTC/CNY和BTC/CNY市场进行对冲。LTC/CNY市场吃单买入LTC,BTC/CNY市场吃单卖出BTC。
如果不满足以上两个条件,则继续等待套利机会。
BTC/CNY, LTC/CNY, LTC/BTC各个市场的计价货币和基础货币的存量降到最少预留比例(比如20%)或以下,触发账户内划转,划转的流程如下:
BTC/CNY市场中的BTC = LTC/BTC市场中的BTCLTC/CNY市场中的LTC = LTC/BTC市场中的LTCBTC/CNY市场中的CNY = LTC/CNY市场中的CNY(这个目前是合并在一起的,暂时没问题,如果是ETH,则需要保证ETH账户中的CNY = BTC账户中的CNY)
我们先定义一个异常的处理方法,称为操作1,具体如下:
操作简介:停止LTC/BTC下单,完成LTC/CNY及BTC/CNY的对冲,发报警,停止程序。
操作流程:
再定义一个异常处理方法,称为操作2,具体如下:
操作简介:停止LTC/BTC下单,完成LTC/CNY及BTC/CNY的对冲,发报警。
再定义几个参数,如下:(注意:以下所有资产的总量包含可用部分和冻结部分,包括LTC/BTC市场、LTC/CNY市场以及BTC/CNY市场)
CNY净头寸 =当前CNY总量 – 初始CNY总量BTC净头寸 =当前BTC总量 – 初始BTC总量LTC净头寸 =当前LTC总量 – 初始LTC总量
策略的盈亏计算公式 = (当前CNY总量 – 初始CNY总量)+ (当前BTC总量 – 初始BTC总量)* 当前BTC/CNY价格 + (当前LTC总量 – 初始LTC总量)* 当前LTC/CNY价格
CNY头寸偏度 = ABS(BTC/CNY市场中的CNY - LTC/CNY市场中的CNY)/(BTC/CNY市场中的CNY + LTC/CNY市场中的CNY),因为LTC和BTC市场共享统一的CNY,所以本策略暂时不存在CNY头寸偏度这个问题。
BTC头寸偏度 = ABS(BTC/CNY市场中的BTC - LTC/BTC市场中的BTC)/( BTC/CNY市场中的BTC + LTC/BTC市场中的BTC)
LTC头寸偏度 = ABS(LTC/CNY市场中的LTC - LTC/BTC市场中的LTC)/( LTC/CNY市场中的LTC + LTC/BTC市场中的LTC)
需要监控的指标和相应流程如下:
合并前深度:
(asks)0.010413 120.010412 200.010312 330.010112 13(bids)0.010109 450.009812 220.009812 100.009712 20.009612 30
合并后深度:
(asks)0.0105320.0104330.010213(bids)0.0101450.0098320.009720.009630
所以本策略中的买一卖一的价格和数量,是已经包含了未合并之前好几档的深度。这样的合并规则,保证我们在计算套利机会的时候,是偏保守的。如果想做ETH/BTC交易,只需要将文中LTC替换为ETH即可~
怎么样,以上就是在有成本的情况下进行三角套利的全过程,是不是干货满满?别急,代码都给你准备好了!关注“WeQuant微宽量化”公众号(微信号:WeQuant-Official),回复“三角套利”,即可获得全套源码。或者加入WeQuant的用户QQ群519538535向管理员索要。赶紧燥起来吧!
(风险提示:币市有风险,一切投资请在个人风险承受范围内进行,WeQuant提供的策略和代码仅供参考使用)
最多设置5个标签!
上篇给大家介绍了一下三角套利的原理,发现大家的热情是如此高涨,都在喊着要代码和下半段。呐,我们WeQuant毕竟是以用户第一的产品,所以,加班加点把下半段赶出来,就问你们感动不感动!话不多说,开搞!
一、考虑交易成本情况下的策略调整我们以第一个策略(正循环套利_挣CNY策略为例)。
图:正循环套利(挣CNY)策略示意图
我们设计的套利策略是被动套利策略,具体来讲,我们在LTC/BTC,LTC/CNY,BTC/CNY三个市场上都是作为taker去吃单。
在LTC/BTC市场上下买单,就必须使用该市场的卖一价格(ltc_btc_sell1_price)加上一定的滑点(ltc_btc_slippage,以百分比表示)来作为买单价格,即:
P3 = ltc_btc_sell1_price*(1+ltc_btc_slippage)
同理,在BTC/CNY市场下买单,就必须使用该市场的卖一价格(btc_cny_sell1_price)加上一定的滑点(btc_cny_slippage,以百分比表示)来作为买单价格,即:
P1= btc_cny_sell1_price*(1+btc_cny_slippage)
同理,可以推导出在LTC/CNY市场下卖单的价格如下:
P2 = ltc_cny_buy1_price*(1-ltc_cny_slippage)
假设各个市场的费率情况如下(以百分比表示):
LTC/BTC: ltc_btc_feeBTC/CNY: btc_cny_feeLTC/CNY: ltc_cny_fee
在LTC/BTC市场净买入1个LTC,实际上需要买入1/(1-ltc_btc_fee)个LTC,其中的ltc_btc_fee比例部分,是被交易平台收走的手续费。买入1/(1-ltc_btc_fee)个LTC需要花费的BTC数量是:
ltc_btc_sell_1_price*(1+ltc_btc_slippage)/(1-ltc_btc_fee)
在LTC/CNY市场,卖出1个LTC,得到的CNY是:
ltc_cny_buy_1_price*(1-ltc_cny_slippage)*(1-ltc_cny_fee)
在BTC/CNY市场,净买入
ltc_btc_sell_1_price*(1+ltc_btc_slippage)/(1-ltc_btc_fee)
个BTC,实际上需要买入
ltc_btc_sell_1_price*(1+ltc_btc_slippage)/[(1-ltc_btc_fee)*(1-btc_cny_fee)]
个BTC,其中btc_cny_fee比例部分,是被平台收走的手续费,而对应需要花费的CNY是:
btc_cny_sell_1_price*(1+btc_cny_slippage)*ltc_btc_sell_1_price*(1+ltc_btc_slippage)/[(1-ltc_btc_fee)*(1-btc_cny_fee)]
套利的前提条件是:得到的CNY > 花费的CNY,即:
ltc_cny_buy_1_price*(1-ltc_cny_slippage)*(1-ltc_cny_fee)> btc_cny_sell_1_price*(1+btc_cny_slippage)*ltc_btc_sell_1_price*(1+ltc_btc_slippage)/[(1-ltc_btc_fee)*(1-btc_cny_fee)]
调整一下,对应的套利条件就是:
ltc_cny_buy_1_price>btc_cny_sell_1_price*ltc_btc_sell_1_price*(1+btc_cny_slippage)*(1+ltc_btc_slippage) /[(1-btc_cny_fee)*(1-ltc_btc_fee)*(1-ltc_cny_fee)*(1-ltc_cny_slippage)]
考虑到各市场费率都在千分之几的水平,做精度取舍后,该不等式可以进一步化简成:
(ltc_cny_buy_1_price/btc_cny_sell_1_price-ltc_btc_sell_1_price)/ltc_btc_sell_1_price>btc_cny_slippage+ltc_btc_slippage+ltc_cny_slippage+btc_cny_fee+ltc_cny_fee+ltc_btc_fee
基本意思就是:只有当公允价和市场价的价差比例大于所有市场的费率总和再加上滑点总和时,做三角套利才是盈利的。
如果价差满足条件,交易数量上的计算规则如下:
先计算以下几个值:
拿到上面5个值之后,对它们取最小值,得到LTC的数量,作为LTC/BTC市场的下单数量。然后,根据LTC/BTC成交的数量,得到需要对冲的LTC数量和BTC数量,分别在LTC/CNY和BTC/CNY市场下对冲单,所有市场先下限价单进行对冲,超时之后补市价单,确保完全对冲。
对最小交易单位的处理规则如下:
如果欲下单的LTC数量小于最小LTC交易单位(取LTC/BTC和LTC/CNY两个市场的最小LTC交易数量的最大值)的某个倍数(比如2倍),则放弃本次套利;
如果欲下单的LTC数量对应的BTC数量( LTC数量乘上系数 ltc_btc_sell1_price)小于最小BTC交易单位(取LTC/BTC和BTC/CNY两个市场的最小BTC交易数量的最大值)的某个倍数(比如2倍),则放弃本次套利。
二、三角套利策略流程初始化:
套利条件:1.如果(ltc_cny_buy_1_price/btc_cny_sell_1_price-ltc_btc_sell_1_price)/ltc_btc_sell_1_price>btc_cny_slippage+ltc_btc_slippage+ltc_cny_slippage+btc_cny_fee+ltc_cny_fee+ltc_btc_fee
则进行正循环套利:
正循环套利的顺序如下:
先去LTC/BTC吃单买入LTC,卖出BTC,然后根据LTC/BTC的成交量,使用多线程,同时在LTC/CNY和BTC/CNY市场进行对冲。LTC/CNY市场吃单卖出LTC,BTC/CNY市场吃单买入BTC。
2.如果(ltc_btc_buy_1_price-ltc_cny_sell_1_price/btc_cny_buy_1_price)/ltc_btc_buy_1_price> btc_cny_slippage+ ltc_btc_slippage+ ltc_cny_slippage+btc_cny_fee+ltc_cny_fee+ltc_btc_fee
则进行逆循环套利:
逆循环套利的顺序如下:
先去LTC/BTC吃单卖出LTC,买入BTC,然后根据LTC/BTC的成交量,使用多线程,同时在LTC/CNY和BTC/CNY市场进行对冲。LTC/CNY市场吃单买入LTC,BTC/CNY市场吃单卖出BTC。
如果不满足以上两个条件,则继续等待套利机会。
账户内划转条件:BTC/CNY, LTC/CNY, LTC/BTC各个市场的计价货币和基础货币的存量降到最少预留比例(比如20%)或以下,触发账户内划转,划转的流程如下:
- 撤销LTC/BTC市场中尚未成交的委托
- 撤销BTC/CNY市场中尚未成交的委托,对委托未成交部分进行市价补单
- 跟2)并行,撤销LTC/CNY市场中尚未成交的委托,对委托未成交部分进行市价补单
- 进行账户内划转,划转结果如下:
三、策略监控和异常处理我们先定义一个异常的处理方法,称为操作1,具体如下:
操作名:操作1操作简介:停止LTC/BTC下单,完成LTC/CNY及BTC/CNY的对冲,发报警,停止程序。
操作流程:
再定义一个异常处理方法,称为操作2,具体如下:
操作名:操作2操作简介:停止LTC/BTC下单,完成LTC/CNY及BTC/CNY的对冲,发报警。
操作流程:
再定义几个参数,如下:(注意:以下所有资产的总量包含可用部分和冻结部分,包括LTC/BTC市场、LTC/CNY市场以及BTC/CNY市场)
需要监控的指标和相应流程如下:
四、需要注意的问题合并前深度:
(asks)0.010413 120.010412 200.010312 330.010112 13(bids)0.010109 450.009812 220.009812 100.009712 20.009612 30
合并后深度:
(asks)0.0105320.0104330.010213(bids)0.0101450.0098320.009720.009630
所以本策略中的买一卖一的价格和数量,是已经包含了未合并之前好几档的深度。这样的合并规则,保证我们在计算套利机会的时候,是偏保守的。如果想做ETH/BTC交易,只需要将文中LTC替换为ETH即可~
怎么样,以上就是在有成本的情况下进行三角套利的全过程,是不是干货满满?别急,代码都给你准备好了!关注“WeQuant微宽量化”公众号(微信号:WeQuant-Official),回复“三角套利”,即可获得全套源码。或者加入WeQuant的用户QQ群519538535向管理员索要。赶紧燥起来吧!
(风险提示:币市有风险,一切投资请在个人风险承受范围内进行,WeQuant提供的策略和代码仅供参考使用)