数字货币量化通用策略研究系列---三角套利

144
提问者
2023-03-15 15:41 悬赏 0财富值 阅读 1004回答 1

前言:三角套利本来是外汇市场中利用交叉汇率定价错误进行的套利。同样可以应用在数字货币市场。利用数字货币市场中币币兑换之间价格的不及时而产生的套利机会。三角套利原

默认分类
登录 后发表回答
1楼 · 2023-03-15 16:19.采纳回答

前言:三角套利本来是外汇市场中利用交叉汇率定价错误进行的套利。同样可以应用在数字货币市场。利用数字货币市场中币币兑换之间价格的不及时而产生的套利机会。

三角套利原理

既然是三角套利当然有三种币对啦。以eos/usdt、btc/usdt和eos/usdt为例进行套利说明。

1、正向套利(挣usdt)

套利条件(简化):P1*P2>P3

首先定义变量:

买卖三种币对的手续费率为cost[0],cost[1]和cost[2],滑点分别为slip[0],slip[1]和slip[2]。

假设买1个eos,由于存在手续费,因此实际购买时需要下单的eos的量为:

eosbuy=\frac{1}{1-cost[0]}

因为需要主动买,因此需要按照当时的卖一价下单,对应需要花费的btc的量为:

buybtc=\frac{P_1*(1+slip[0])}{1-cost[0]}

购买btc_buy个btc需要花费的usdt的数量为:

usdtcost=\frac{P_1*P_2*(1+slip[0])*(1+slip[1])}{(1-cost[0])*(1-cost[1])}

卖出1个eos得到的usdt的数量为:

usdtget=P_3*(1-slip[2])*(1-cost[2])

存在套利机会需要满足得到的USDT比USDT多,即:

\frac{P_1*P_2*(1+slip[0])*(1+slip[1])}{(1-cost[0])*(1-cost[1])}<P_3*(1-slip[2])*(1-cost[2])
\Rightarrow
P_1*P_2*(1+slip[0])*(1+slip[1])<P_3*(1-slip[2])*(1-cost[2])*(1-cost[1])*(1-cost[0])

由于滑点和手续费率相对于价格来说很小,因此套利条件可以简化为:

\frac{P_1*P_2}{P_3}<\frac{(1-slip[2])*(1-cost[0]-cost[1]-cost[2])}{1+slip[0]+slip[1]}

简化为:

P_1*P_2>P_3

即我们可以认为在满足上式的条件时存在正向套利策略。

2、反向套利

套利条件(简化):P1*P2<P3

反向套利的流程:买1个eos需要花费一定数量的usdt,卖eos得到btc,将得到的btc全部卖出得到usdt,只要得到的usdt大于花费的usdt,即满足套利条件。

策略的实现

在币宽回测平台中进行策略回测。

策略相关说明:

1、回测时间:2018-08-01至2018-09-11

2、K线频率:tick

3、初始资金:10000 USDT和0.5个btc

4、交易手续费率:0.2%

5、均线参数:快速10日均线,慢速30日均线

回测交易所和币对:OKEX的BTC/USDT、1、EOS/BTC和EOS/USDT

策略代码如下:

# -*- coding: utf-8 -*-'''//////////////////////////////////////////////////////////////////////////免责声明:本策略仅供学习使用,请勿直接进行实盘交易,本策略不承诺任何收益。/////////////////////////////////////////////////////////////////////////'''from __future__ import print_function, absolute_importfrom nf.api import *def init():#变量初始化global exchange #交易所global front #交易币对前项币global base #交易币对后项币global symbol #交易标的global freq #频率global cost #交易手续费global slip #滑点global bid #买一价global ask #卖一价global vol #买eos的量exchange='OKEX'front=['btc','eos']base=['usdt','btc']symbol=[get_symbol(market=exchange,front=front[1],rear=base[1]),get_symbol(exchange,front[0],base[0]),get_symbol(exchange,front[1],base[0])]freq='tick' cost=[0.0015,0.0015,0.0015]slip=[0.000001,0.0001,0.0001]ask=[0.0,0.0,0.0]bid=[0.0,0.0,0.0]vol=100print('三角套利eos/btc,btc/usdt,eos/usdt')``subscribe(symbols=symbol,frequency=freq,count=1)def on_tick(tick):global exchange #交易所global front #交易币对前项币global base #交易币对后项币global symbol #交易标的global freq #频率global cost #交易手续费global slip #滑点global bid #买一价global ask #卖一价global vol #买eos的量for i in range(len(ask)):if tick['symbol']==symbol[i]:ask[i]=tick['quotes'][0]['ask_p']bid[i]=tick['quotes'][0]['bid_p']if min(ask)>0 and min(bid)>0:if ask[0]*ask[1]*(1+slip[0])*(1+slip[1]) < bid[2]*(1-slip[2])*(1-cost[0])*(1-cost[1])*(1-cost[2]) :#正向套利,买100个eosprint(tick['created_at'].strftime('%Y-%m-%d %H:%M:%S'),'正向套利开始')order_buy_btcusdt=order_volume(symbol[1],vol*ask[0]*(1+slip[0])/((1-cost[0])*(1-cost[1])),side=1,order_type=1,price=ask[1]*(1+slip[1]))order_buy_eosbtc=order_volume(symbol[0],vol/(1-cost[0]),side=1,order_type=1,price=ask[0]*(1+slip[0]))order_sell_eosusdt=order_volume(symbol[2],vol,side=2,order_type=1,price=bid[2]*(1-slip[2]))print('正向套利结束','\n\n')if bid[0]*bid[1]*(1-slip[0])*(1-slip[1])*(1-cost[0])*(1-cost[1])*(1-cost[2]) > ask[2]*(1+slip[2]) :#逆向套利print(tick['created_at'].strftime('%Y-%m-%d %H:%M:%S'),'逆向套利开始')order_buy_eosusdt=order_volume(symbol[2],vol/(1-cost[2]),side=1,order_type=1,price=ask[2]*(1+slip[2]))order_sell_eosbtc=order_volume(symbol[0],vol,side=2,order_type=1,price=bid[0]*(1-slip[0]))order_sell_btcusdt=order_volume(symbol[1],bid[0]*(1-slip[0])*(1-cost[0])*vol,side=2,order_type=1,price=bid[1]*(1-slip[1]))print('逆向套利结束','\n\n')def on_execution_report(execrpt):print('打印交易回执:',execrpt,'\n')def on_error(code,info):print('错误代码:',code,'错误代码说明:',info)def on_backtest_finished(indicator):print('绩效对象打印:',indicator)if __name__ == '__main__':run(strategy_id='f5ec03a4-b572-11e8-a0fb-00ffa9185dbb',filename='main.py',mode=MODE_LIVE,token='6778ebc60a3b004bcc7286a5566a28df')

回测结果如下(所有结果按每日公允汇率币/USD结算):

累计收益率:2.11%

年化收益率:20.67%

基准收益率:-16.69%

最大回撤:4.58%

Alpha:0.38

Beta:0.25

从回测结果中可以发现三角套利实现了不错超额收益和绝对收益,其中回测中有一部分是由于固定持仓0.5个btc导致的。从每日持仓可以看出,btc的持仓始终没有发生变化,但是经过三角套利,账户中的usdt增加了。实现了套利挣usdt的目的。

小结:由于数字货币市场发展的不尽完善,因此各个币对之间的定价或多或少的存在误差,也正是因此存在了不同套利空间。实际操作中可以套利挣eos,也可以套利挣btc。有兴趣的读者可以进行相关的回测。

声明:本文主要用于共同探讨和学习,请勿直接用于实盘交易。

后续将推出更多系列的量化策略,欢迎大家关注,共同交流。

文章为本人原创,转载时请注明作者。