之前給大家介紹了一下三角套利的原理,現(xiàn)在為大家奉上考慮交易成本的三角套利方法和代碼。
一咳榜、考慮交易成本情況下的策略調(diào)整
我們以第一個(gè)策略(正循環(huán)套利_掙CNY策略為例)夏醉。
圖:正循環(huán)套利(掙CNY)策略示意圖
我們?cè)O(shè)計(jì)的套利策略是被動(dòng)套利策略,具體來講涌韩,我們?cè)贚TC/BTC畔柔,LTC/CNY,BTC/CNY三個(gè)市場上都是作為taker去吃單臣樱。
在LTC/BTC市場上下買單靶擦,就必須使用該市場的賣一價(jià)格(ltc_btc_sell1_price)加上一定的滑點(diǎn)(ltc_btc_slippage,以百分比表示)來作為買單價(jià)格雇毫,即:
P3 = ltc_btc_sell1_price*(1+ltc_btc_slippage)
同理玄捕,在BTC/CNY市場下買單,就必須使用該市場的賣一價(jià)格(btc_cny_sell1_price)加上一定的滑點(diǎn)(btc_cny_slippage棚放,以百分比表示)來作為買單價(jià)格枚粘,即:
P1= btc_cny_sell1_price*(1+btc_cny_slippage)
同理,可以推導(dǎo)出在LTC/CNY市場下賣單的價(jià)格如下:
P2 = ltc_cny_buy1_price*(1-ltc_cny_slippage)
假設(shè)各個(gè)市場的費(fèi)率情況如下(以百分比表示):
LTC/BTC: ltc_btc_fee
BTC/CNY: btc_cny_fee
LTC/CNY: ltc_cny_fee
在LTC/BTC市場凈買入1個(gè)LTC飘蚯,實(shí)際上需要買入1/(1-ltc_btc_fee)個(gè)LTC馍迄,其中的ltc_btc_fee比例部分,是被交易平臺(tái)收走的手續(xù)費(fèi)局骤。買入1/(1-ltc_btc_fee)個(gè)LTC需要花費(fèi)的BTC數(shù)量是:
ltc_btc_sell_1_price*(1+ltc_btc_slippage)/(1-ltc_btc_fee)
在LTC/CNY市場攀圈,賣出1個(gè)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)
個(gè)BTC量承,實(shí)際上需要買入
ltc_btc_sell_1_price*(1+ltc_btc_slippage)/[(1-ltc_btc_fee)*(1-btc_cny_fee)]
個(gè)BTC,其中btc_cny_fee比例部分穴店,是被平臺(tái)收走的手續(xù)費(fèi)撕捍,而對(duì)應(yīng)需要花費(fèi)的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 > 花費(fèi)的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)]
調(diào)整一下泣洞,對(duì)應(yīng)的套利條件就是:
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)]
考慮到各市場費(fèi)率都在千分之幾的水平忧风,做精度取舍后,該不等式可以進(jìn)一步化簡成:
(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
基本意思就是:只有當(dāng)公允價(jià)和市場價(jià)的價(jià)差比例大于所有市場的費(fèi)率總和再加上滑點(diǎn)總和時(shí)球凰,做三角套利才是盈利的狮腿。
如果價(jià)差滿足條件,交易數(shù)量上的計(jì)算規(guī)則如下:
先計(jì)算以下幾個(gè)值:
1. LTC/BTC賣方盤口吃單數(shù)量:ltc_btc_sell1_quantity*order_ratio_ltc_btc呕诉,其中l(wèi)tc_btc_sell1_quantity 代表LTC/BTC賣一檔的數(shù)量缘厢,order_ratio_ltc_btc代表本策略在LTC/BTC盤口的吃單比例
2. LTC/CNY買方盤口吃單數(shù)量:ltc_cny_buy1_quantity*order_ratio_ltc_cny,其中order_ratio_ltc_cny代表本策略在LTC/CNY盤口的吃單比例
3. LTC/BTC賬戶中可以用來買LTC的BTC額度及可以置換的LTC個(gè)數(shù):
btc_available - btc_reserve甩挫,可以置換成
(btc_available – btc_reserve)/ltc_btc_sell1_price個(gè)LTC
其中贴硫,btc_available表示該賬戶中可用的BTC數(shù)量,btc_reserve表示該賬戶中應(yīng)該最少預(yù)留的BTC數(shù)量(這個(gè)數(shù)值由用戶根據(jù)自己的風(fēng)險(xiǎn)偏好來設(shè)置,越高代表用戶風(fēng)險(xiǎn)偏好越低)英遭。
4. BTC/CNY賬戶中可以用來買BTC的CNY額度及可以置換的BTC個(gè)數(shù)和對(duì)應(yīng)的LTC個(gè)數(shù):
cny_available - cny_reserve, 可以置換成
(cny_available-cny_reserve)/btc_cny_sell1_price個(gè)BTC间护,
相當(dāng)于
(cny_available-cny_reserve)/btc_cny_sell1_price/ltc_btc_sell1_price
個(gè)LTC
其中:cny_available表示該賬戶中可用的人民幣數(shù)量,cny_reserve表示該賬戶中應(yīng)該最少預(yù)留的人民幣數(shù)量(這個(gè)數(shù)值由用戶根據(jù)自己的風(fēng)險(xiǎn)偏好來設(shè)置挖诸,越高代表用戶風(fēng)險(xiǎn)偏好越低)汁尺。
5. LTC/CNY賬戶中可以用來賣的LTC額度:
ltc_available – ltc_reserve
其中,ltc_available表示該賬戶中可用的LTC數(shù)量多律,ltc_reserve表示該賬戶中應(yīng)該最少預(yù)留的LTC數(shù)量(這個(gè)數(shù)值由用戶根據(jù)自己的風(fēng)險(xiǎn)偏好來設(shè)置痴突,越高代表用戶風(fēng)險(xiǎn)偏好越低)。
拿到上面5個(gè)值之后狼荞,對(duì)它們?nèi)∽钚≈蛋玻玫絃TC的數(shù)量,作為LTC/BTC市場的下單數(shù)量粘秆。然后如迟,根據(jù)LTC/BTC成交的數(shù)量,得到需要對(duì)沖的LTC數(shù)量和BTC數(shù)量攻走,分別在LTC/CNY和BTC/CNY市場下對(duì)沖單殷勘,所有市場先下限價(jià)單進(jìn)行對(duì)沖,超時(shí)之后補(bǔ)市價(jià)單昔搂,確保完全對(duì)沖玲销。
對(duì)最小交易單位的處理規(guī)則如下:
如果欲下單的LTC數(shù)量小于最小LTC交易單位(取LTC/BTC和LTC/CNY兩個(gè)市場的最小LTC交易數(shù)量的最大值)的某個(gè)倍數(shù)(比如2倍),則放棄本次套利;
如果欲下單的LTC數(shù)量對(duì)應(yīng)的BTC數(shù)量( LTC數(shù)量乘上系數(shù) ltc_btc_sell1_price)小于最小BTC交易單位(取LTC/BTC和BTC/CNY兩個(gè)市場的最小BTC交易數(shù)量的最大值)的某個(gè)倍數(shù)(比如2倍)摘符,則放棄本次套利贤斜。
二、 三角套利策略流程
(1) 初始化:
a) 在BTC/CNY市場放入如下資產(chǎn):
i. BTC:1個(gè)BTC, 最少預(yù)留20% (btc_reserve = 20%)
ii. CNY:2萬元逛裤,最少預(yù)留20% (cny_reserve = 20%)
b) 在LTC/CNY市場放入如下資產(chǎn):
i. LTC:100個(gè)LTC瘩绒,最少預(yù)留20% (ltc_reserve = 20%)
ii. CNY:2萬元,最少預(yù)留20% (cny_reserve = 20%)
c) 在LTC/BTC市場放入如下資產(chǎn):
i. LTC:100個(gè)LTC带族,最少預(yù)留20% (btc_reserve = 20%)
ii. BTC:1個(gè)BTC锁荔,最少預(yù)留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
則進(jìn)行正循環(huán)套利:
圖:正循環(huán)套利(掙CNY)策略示意圖
正循環(huán)套利的順序如下:
先去LTC/BTC吃單買入LTC,賣出BTC蝙砌,然后根據(jù)LTC/BTC的成交量阳堕,使用多線程,同時(shí)在LTC/CNY和BTC/CNY市場進(jìn)行對(duì)沖择克。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
則進(jìn)行逆循環(huán)套利:
圖:逆循環(huán)套利(掙CNY)策略示意圖
逆循環(huán)套利的順序如下:
先去LTC/BTC吃單賣出LTC肚邢,買入BTC壹堰,然后根據(jù)LTC/BTC的成交量,使用多線程,同時(shí)在LTC/CNY和BTC/CNY市場進(jìn)行對(duì)沖缀旁。LTC/CNY市場吃單買入LTC记劈,BTC/CNY市場吃單賣出BTC勺鸦。
如果不滿足以上兩個(gè)條件并巍,則繼續(xù)等待套利機(jī)會(huì)。
(3)賬戶內(nèi)劃轉(zhuǎn)條件:
BTC/CNY, LTC/CNY, LTC/BTC各個(gè)市場的計(jì)價(jià)貨幣和基礎(chǔ)貨幣的存量降到最少預(yù)留比例(比如20%)或以下换途,觸發(fā)賬戶內(nèi)劃轉(zhuǎn)懊渡,劃轉(zhuǎn)的流程如下:
1) 撤銷LTC/BTC市場中尚未成交的委托
2) 撤銷BTC/CNY市場中尚未成交的委托,對(duì)委托未成交部分進(jìn)行市價(jià)補(bǔ)單
3) 跟2)并行军拟,撤銷LTC/CNY市場中尚未成交的委托剃执,對(duì)委托未成交部分進(jìn)行市價(jià)補(bǔ)單
4) 進(jìn)行賬戶內(nèi)劃轉(zhuǎn),劃轉(zhuǎn)結(jié)果如下:
BTC/CNY市場中的BTC = LTC/BTC市場中的BTC
LTC/CNY市場中的LTC = LTC/BTC市場中的LTC
BTC/CNY市場中的CNY = LTC/CNY市場中的CNY(這個(gè)目前是合并在一起的懈息,暫時(shí)沒問題肾档,如果是ETH,則需要保證ETH賬戶中的CNY = BTC賬戶中的CNY)
三辫继、 策略監(jiān)控和異常處理
我們先定義一個(gè)異常的處理方法怒见,稱為操作1,具體如下:
操作名:操作1
操作簡介:停止LTC/BTC下單姑宽,完成LTC/CNY及BTC/CNY的對(duì)沖遣耍,發(fā)報(bào)警,停止程序炮车。
操作流程:
a) 第一步:停止在LTC/BTC盤面下單舵变,撤銷該盤面未完全成交的委托單;
b) 第二步:對(duì)于LTC/CNY及BTC/CNY盤面的未完全成交的委托單瘦穆,進(jìn)行輪詢等待纪隙,超時(shí)之后,撤銷未成交的部分扛或,并用市價(jià)單進(jìn)行補(bǔ)單瘫拣,保證完全對(duì)沖;
c) 第三步:發(fā)出相應(yīng)的報(bào)警郵件
d) 停止策略
再定義一個(gè)異常處理方法告喊,稱為操作2麸拄,具體如下:
操作名:操作2
操作簡介:停止LTC/BTC下單,完成LTC/CNY及BTC/CNY的對(duì)沖黔姜,發(fā)報(bào)警拢切。
操作流程:
a) 第一步:停止在LTC/BTC盤面下單,撤銷該盤面未完全成交的委托單秆吵;
b) 第二步:對(duì)于LTC/CNY及BTC/CNY盤面的未完全成交的委托單淮椰,進(jìn)行輪詢等待,超時(shí)之后,撤銷未成交的部分主穗,并用市價(jià)單進(jìn)行補(bǔ)單泻拦,保證完全對(duì)沖;
c) 第三步:發(fā)出相應(yīng)的報(bào)警郵件
再定義幾個(gè)參數(shù)忽媒,如下:(注意:以下所有資產(chǎn)的總量包含可用部分和凍結(jié)部分争拐,包括LTC/BTC市場、LTC/CNY市場以及BTC/CNY市場)
CNY凈頭寸 =當(dāng)前CNY總量 – 初始CNY總量
BTC凈頭寸 =當(dāng)前BTC總量 – 初始BTC總量
LTC凈頭寸 =當(dāng)前LTC總量 – 初始LTC總量
策略的盈虧計(jì)算公式 = (當(dāng)前CNY總量 – 初始CNY總量)+ (當(dāng)前BTC總量 – 初始BTC總量)* 當(dāng)前BTC/CNY價(jià)格 + (當(dāng)前LTC總量 – 初始LTC總量)* 當(dāng)前LTC/CNY價(jià)格
CNY頭寸偏度 = ABS(BTC/CNY市場中的CNY - LTC/CNY市場中的CNY)/(BTC/CNY市場中的CNY + LTC/CNY市場中的CNY)晦雨,因?yàn)長TC和BTC市場共享統(tǒng)一的CNY架曹,所以本策略暫時(shí)不存在CNY頭寸偏度這個(gè)問題。
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)
需要監(jiān)控的指標(biāo)和相應(yīng)流程如下:
1. 當(dāng)次盈虧監(jiān)控:如果策略虧損超過一定額度闹瞧,進(jìn)行“操作1”绑雄,然后調(diào)查虧損原因,明確之后再手動(dòng)重啟策略奥邮。
2. 凈頭寸監(jiān)控
a) CNY凈頭寸監(jiān)控:如果CNY凈頭寸的絕對(duì)值超過一定額度万牺,進(jìn)行“操作1”,然后調(diào)查產(chǎn)生凈頭寸的原因洽腺,明確之后再手動(dòng)重啟策略脚粟。
b) BTC凈頭寸:如果BTC凈頭寸的絕對(duì)值超過一定額度,進(jìn)行“操作1”已脓,然后調(diào)查產(chǎn)生凈頭寸的原因珊楼,明確之后再手動(dòng)重啟策略。
c) LTC凈頭寸:如果LTC凈頭寸的絕對(duì)值超過一定額度度液,進(jìn)行“操作1”厕宗,然后調(diào)查產(chǎn)生凈頭寸的原因,明確之后再手動(dòng)重啟策略堕担。
3. 頭寸偏度監(jiān)控
a) CNY頭寸偏度監(jiān)控:因?yàn)長TC和BTC市場共享統(tǒng)一的CNY已慢,所以本策略不存在這個(gè)問題。
b) BTC頭寸偏度監(jiān)控:如果BTC頭寸偏度超過一定幅度霹购,進(jìn)行“操作1”佑惠,然后進(jìn)行手動(dòng)頭寸調(diào)整,使得頭寸偏度為0齐疙,之后再手動(dòng)重啟策略
c) LTC頭寸偏度監(jiān)控:如果LTC頭寸偏度超過一定幅度膜楷,進(jìn)行“操作1”,然后進(jìn)行手動(dòng)頭寸調(diào)整贞奋,使得頭寸偏度為0赌厅,之后再手動(dòng)重啟策略
4. 未成交的對(duì)沖單數(shù)量監(jiān)控:如果未成交的對(duì)沖單(LTC/CNY市場未成交的委托單數(shù)量+BTC/CNY市場未成交的委托單數(shù)量之和)數(shù)量超過一定額度,進(jìn)行“操作2”
四轿塔、 需要注意的問題
1. LTC/BTC市場的單子是整個(gè)套利循環(huán)的起點(diǎn)特愿,在LTC/BTC市場中成交的單子仲墨,一定要到LTC/CNY和BTC/CNY市場同時(shí)進(jìn)行對(duì)沖。LTC/CNY和BTC/CNY市場的對(duì)沖單揍障,先嘗試以限價(jià)單掛出目养,不成交則逐漸修改價(jià)格至可以成交的價(jià)位,多次嘗試之后(超時(shí))如果仍有未成交部分毒嫡,則以市價(jià)單補(bǔ)單癌蚁,保證完全對(duì)沖。
2. 整個(gè)套利過程审胚,為了簡化價(jià)格轉(zhuǎn)換運(yùn)算匈勋,沒有考慮BTC/CNY市場的盤口深度礼旅,所以在估計(jì)BTC/CNY的對(duì)沖成本(btc_cny_slippage)時(shí)膳叨,需要結(jié)合最近BTC/CNY盤口的深度情況進(jìn)行調(diào)整。如果BTC/CNY盤口太薄痘系,則建議設(shè)置一個(gè)比較大的對(duì)沖成本(btc_cny_slippage)菲嘴。
3. 本文中所有的買一賣一價(jià)格,都是指進(jìn)行了盤口深度合并之后的價(jià)格汰翠。盤口深度合并的規(guī)則是:
a) LTC/BTC市場龄坪,按照0.0001的價(jià)格進(jìn)行合并(即一個(gè)價(jià)格檔位對(duì)于的比特幣為0.0001個(gè),約2元)复唤。買單向下合并健田,賣單向上合并。用數(shù)據(jù)表示如下:
合并前深度:
(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
所以本策略中的買一賣一的價(jià)格和數(shù)量佛纫,是已經(jīng)包含了未合并之前好幾檔的深度妓局。這樣的合并規(guī)則,保證我們?cè)谟?jì)算套利機(jī)會(huì)的時(shí)候呈宇,是偏保守的好爬。