三角套利

本贴最后更新于 2018 天前,其中的信息可能已经时过境迁

三角套利又叫间接套利或多边套利,是同一时间利用三种或三种以上的货币汇率差价进行交易,三角套利是利用交叉汇率定价错误进行的套利。如 EOS/USDT=10、EOS/ETH=0.01、ETH/USDT=500,则通过 EOS/USDT、EOS/ETH 交叉定价形成 ETH/USDT 的公允价格为 1000,与 ETH/USDT 的当前价 500 存在价格差,可进行套利。

三角套利策略

https://blog.csdn.net/hjm4702192/article/details/79542146
要明白币币交易,首先要搞清楚什么是交易对。

交易对:就是用一种资产(quote currency,计价货币)去定价另一种资产(base currency,基础货币),比如用人民币(CNY)去定价比特币(BTC),就形成了一个 BTC/CNY 的交易对,交易对的价格代表的是买入 1 单位的基础货币(比如 BTC)需要支付多少单位的计价货币(比如 CNY),或者卖出一个单位的基础货币(比如 BTC)可以获得多少单位的计价货币(比如 CNY)。当 BTC 对 CNY 的价格上涨时,同等单位的 CNY 能够兑换的 BTC 是减少的,而同等单位的 BTC 能够兑换的 CNY 是变多的。

以下是一些常见的交易对:

BTC/CNY:用人民币(CNY)去定价比特币(BTC),该交易对的价格代表 1 个 BTC 值多少 CNY。

LTC/CNY:用人民币(CNY)去定价莱特币(LTC),该交易对的价格代表 1 个 LTC 值多少 CNY。

ETH/CNY:用人民币(CNY)去定价以太坊(ETH),该交易对的价格代表 1 个 ETH 值多少 CNY。

LTC/BTC:用比特币(BTC)去定价莱特币(LTC),该交易对的价格代表 1 个 LTC 值多少 BTC。

ETH/BTC:用比特币(BTC)去定价以太坊(ETH),该交易对的价格代表 1 个 ETH 值多少 BTC。

然后,我们说一下什么是币币交易。

币对币交易:用一种数字资产去直接换取另一种数字资产,中间不涉及任何法币结算,就是我们所说的币对币交易。比如用 BTC 换取 LTC,也可以用 LTC 再换回 BTC;用 ETH 换取 BTC,也可以用 BTC 再换回 ETH。币对币交易的交易标的是之前文章提到的“交易对”,币对币交易的价格就是交易对的价格。

这么解释,你明白了吧?

二、三角套利策略原理

三角套利的基本思路是,用两个市场(比如 BTC/CNY,LTC/CNY)的价格(分别记为 P1,P2),计算出一个公允的 LTC/BTC 价格(P2/P1),如果该公允价格跟实际的 LTC/BTC 市场价格(记为 P3)不一致,就产生了套利机会,具体操作如下:

1.假如实际的 LTC/BTC 市场价格 P3 低于公允价格(P3 < P2/P1),就在 LTC/BTC 市场买入一定数量(记为 Q3)的 LTC(花费相应数量 P3Q3 的 BTC),同时在 LTC/CNY 市场卖出数量为 Q3 的 LTC(得到相应数量 P2Q3 的 CNY),在 BTC/CNY 市场买入数量为 P3Q3 的 BTC(花费相应数量 P1P3Q3 的 CNY)。整个过程中,BTC 和 LTC 的数量不变,而 CNY 的数量增多(P2Q3-P1P3Q3= P1Q3(P2/P1 – P3) > 0 ),从而实现稳定盈利。

图:正循环套利(挣 CNY)策略示意图

2.假如实际的 LTC/BTC 价格 P3 高于公允价格(P3>P2/P1),就在 LTC/BTC 市场卖出一定数量(记为 Q3)的 LTC(得到相应数量 P3Q3 的 BTC),同时在 LTC/CNY 市场买入数量为 Q3 的 LTC(花费相应数量 P2Q3 的 CNY),在 BTC/CNY 市场卖出数量为 P3Q3 的 BTC(获得相应数量 P1P3Q3 的 CNY)。整个过程中,BTC 和 LTC 的数量不变,而 CNY 的数量增多(P1P3Q3-P2Q3= P1Q3(P3-P2/P1) > 0),从而实现稳定盈利。

图:逆循环套利(挣 CNY)策略示意图

以上两个策略是挣人民币的策略。相应的,我们还可以设计出挣 BTC 和挣 LTC 的策略。具体过程不赘述,读者朋友可以根据示意图自行揣摩。示意图如下:

图:正循环套利(挣 BTC)策略示意图

图:正循环套利(挣 LTC)策略示意图

图:逆循环套利(挣 BTC)策略示意图

考虑交易成本的三角套利

https://blog.csdn.net/weQuarter/article/details/76596115

之前给大家介绍了一下三角套利的原理,现在为大家奉上考虑交易成本的三角套利方法和代码。

一、考虑交易成本情况下的策略调整

我们以第一个策略(正循环套利_挣 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_fee
BTC/CNY: btc_cny_fee
LTC/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

基本意思就是:只有当公允价和市场价的价差比例大于所有市场的费率总和再加上滑点总和时,做三角套利才是盈利的。

如果价差满足条件,交易数量上的计算规则如下:

先计算以下几个值:

  1. LTC/BTC 卖方盘口吃单数量:ltc_btc_sell1_quantity*order_ratio_ltc_btc,其中 ltc_btc_sell1_quantity
    代表 LTC/BTC 卖一档的数量,order_ratio_ltc_btc 代表本策略在 LTC/BTC 盘口的吃单比例
  2. LTC/CNY 买方盘口吃单数量:ltc_cny_buy1_quantity*order_ratio_ltc_cny,其中 order_ratio_ltc_cny 代表本策略在 LTC/CNY 盘口的吃单比例
  3. LTC/BTC 账户中可以用来买 LTC 的 BTC 额度及可以置换的 LTC 个数: btc_available - btc_reserve,可以置换成 (btc_available –
    btc_reserve)/ltc_btc_sell1_price 个 LTC
    其中,btc_available 表示该账户中可用的 BTC 数量,btc_reserve 表示该账户中应该最少预留的 BTC 数量(这个数值由用户根据自己的风险偏好来设置,越高代表用户风险偏好越低)。
  4. BTC/CNY 账户中可以用来买 BTC 的 CNY 额度及可以置换的 BTC 个数和对应的 LTC 个数: cny_available - cny_reserve, 可以置换成
    (cny_available-cny_reserve)/btc_cny_sell1_price 个 BTC, 相当于
    (cny_available-cny_reserve)/btc_cny_sell1_price/ltc_btc_sell1_price
    个 LTC
    其中:cny_available 表示该账户中可用的人民币数量,cny_reserve 表示该账户中应该最少预留的人民币数量(这个数值由用户根据自己的风险偏好来设置,越高代表用户风险偏好越低)。
  5. LTC/CNY 账户中可以用来卖的 LTC 额度: ltc_available – ltc_reserve 其中,ltc_available 表示该账户中可用的 LTC 数量,ltc_reserve 表示该账户中应该最少预留的 LTC 数量(这个数值由用户根据自己的风险偏好来设置,越高代表用户风险偏好越低)。

拿到上面 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) 初始化:
a) 在 BTC/CNY 市场放入如下资产:
i. BTC:1 个 BTC, 最少预留 20% (btc_reserve = 20%)
ii. CNY:2 万元,最少预留 20% (cny_reserve = 20%)
b) 在 LTC/CNY 市场放入如下资产:
i. LTC:100 个 LTC,最少预留 20% (ltc_reserve = 20%)
ii. CNY:2 万元,最少预留 20% (cny_reserve = 20%)
c) 在 LTC/BTC 市场放入如下资产:
i. LTC:100 个 LTC,最少预留 20% (btc_reserve = 20%)
ii. BTC:1 个 BTC,最少预留 20% (ltc_reserve = 20%)
(2) 套利条件:
如果

(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。

如果

(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。
如果不满足以上两个条件,则继续等待套利机会。

(3)账户内划转条件:
BTC/CNY, LTC/CNY, LTC/BTC 各个市场的计价货币和基础货币的存量降到最少预留比例(比如 20%)或以下,触发账户内划转,划转的流程如下:
1) 撤销 LTC/BTC 市场中尚未成交的委托
2) 撤销 BTC/CNY 市场中尚未成交的委托,对委托未成交部分进行市价补单
3) 跟 2)并行,撤销 LTC/CNY 市场中尚未成交的委托,对委托未成交部分进行市价补单
4) 进行账户内划转,划转结果如下:
BTC/CNY 市场中的 BTC = LTC/BTC 市场中的 BTC
LTC/CNY 市场中的 LTC = LTC/BTC 市场中的 LTC
BTC/CNY 市场中的 CNY = LTC/CNY 市场中的 CNY(这个目前是合并在一起的,暂时没问题,如果是 ETH,则需要保证 ETH 账户中的 CNY = BTC 账户中的 CNY)

三、 策略监控和异常处理

我们先定义一个异常的处理方法,称为操作 1,具体如下:

操作名:操作 1 操作简介:停止 LTC/BTC 下单,完成 LTC/CNY 及 BTC/CNY 的对冲,发报警,停止程序。 操作流程:
a) 第一步:停止在 LTC/BTC 盘面下单,撤销该盘面未完全成交的委托单;
b) 第二步:对于 LTC/CNY 及 BTC/CNY 盘面的未完全成交的委托单,进行轮询等待,超时之后,撤销未成交的部分,并用市价单进行补单,保证完全对冲;
c) 第三步:发出相应的报警邮件 d) 停止策略

再定义一个异常处理方法,称为操作 2,具体如下:

操作名:操作 2 操作简介:停止 LTC/BTC 下单,完成 LTC/CNY 及 BTC/CNY 的对冲,发报警。 操作流程:
a) 第一步:停止在 LTC/BTC 盘面下单,撤销该盘面未完全成交的委托单;
b) 第二步:对于 LTC/CNY 及 BTC/CNY 盘面的未完全成交的委托单,进行轮询等待,超时之后,撤销未成交的部分,并用市价单进行补单,保证完全对冲;
c) 第三步:发出相应的报警邮件

再定义几个参数,如下:(注意:以下所有资产的总量包含可用部分和冻结部分,包括 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)

需要监控的指标和相应流程如下:

1\.  当次盈亏监控:如果策略亏损超过一定额度,进行“操作1”,然后调查亏损原因,明确之后再手动重启策略。
2\.  净头寸监控
a)  CNY净头寸监控:如果CNY净头寸的绝对值超过一定额度,进行“操作1”,然后调查产生净头寸的原因,明确之后再手动重启策略。
b)  BTC净头寸:如果BTC净头寸的绝对值超过一定额度,进行“操作1”,然后调查产生净头寸的原因,明确之后再手动重启策略。
c)  LTC净头寸:如果LTC净头寸的绝对值超过一定额度,进行“操作1”,然后调查产生净头寸的原因,明确之后再手动重启策略。
3\.  头寸偏度监控
a)  CNY头寸偏度监控:因为LTC和BTC市场共享统一的CNY,所以本策略不存在这个问题。
b)  BTC头寸偏度监控:如果BTC头寸偏度超过一定幅度,进行“操作1”,然后进行手动头寸调整,使得头寸偏度为0,之后再手动重启策略
c)  LTC头寸偏度监控:如果LTC头寸偏度超过一定幅度,进行“操作1”,然后进行手动头寸调整,使得头寸偏度为0,之后再手动重启策略
4\.  未成交的对冲单数量监控:如果未成交的对冲单(LTC/CNY市场未成交的委托单数量+BTC/CNY市场未成交的委托单数量之和)数量超过一定额度,进行“操作2”

四、 需要注意的问题

  1. LTC/BTC 市场的单子是整个套利循环的起点,在 LTC/BTC 市场中成交的单子,一定要到 LTC/CNY 和 BTC/CNY 市场同时进行对冲。LTC/CNY 和 BTC/CNY 市场的对冲单,先尝试以限价单挂出,不成交则逐渐修改价格至可以成交的价位,多次尝试之后(超时)如果仍有未成交部分,则以市价单补单,保证完全对冲。
  2. 整个套利过程,为了简化价格转换运算,没有考虑 BTC/CNY 市场的盘口深度,所以在估计 BTC/CNY 的对冲成本(btc_cny_slippage)时,需要结合最近 BTC/CNY 盘口的深度情况进行调整。如果 BTC/CNY 盘口太薄,则建议设置一个比较大的对冲成本(btc_cny_slippage)。
  3. 本文中所有的买一卖一价格,都是指进行了盘口深度合并之后的价格。盘口深度合并的规则是:
    a) LTC/BTC 市场,按照 0.0001 的价格进行合并(即一个价格档位对于的比特币为 0.0001 个,约 2 元)。买单向下合并,卖单向上合并。用数据表示如下:
    合并前深度:
(asks)
0.010413        12
0.010412        20
0.010312        33
0.010112        13

(bids)
0.010109        45
0.009812        22
0.009812        10
0.009712        2
0.009612        30

合并后深度:

(asks)
0.0105      32
0.0104      33
0.0102      13

(bids)
0.0101      45
0.0098      32
0.0097      2
0.0096      30

所以本策略中的买一卖一的价格和数量,是已经包含了未合并之前好几档的深度。这样的合并规则,保证我们在计算套利机会的时候,是偏保守的。
以上就是在有成本的情况下进行三角套利的全过程。代码已上传 GitHub

--------------------- 作者:WeQuant 来源:CSDN 原文:https://blog.csdn.net/weQuarter/article/details/76596115?utm_source=copy 版权声明:本文为博主原创文章,转载请附上博文链接!

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...