一、考慮交易成本情況下的策略調(diào)整
我們以第一個(gè)策略(正循環(huán)套利_掙CNY策略為例)。
我們?cè)O(shè)計(jì)的套利策略是被動(dòng)套利策略,具體來講,我們?cè)贚TC/BTC,LTC/CNY,BTC/CNY三個(gè)市場(chǎng)上都是作為taker去吃單。
在LTC/BTC市場(chǎng)上下買單,就必須使用該市場(chǎng)的賣一價(jià)格(ltc_btc_sell1_price)加上一定的滑點(diǎn)(ltc_btc_slippage,以百分比表示)來作為買單價(jià)格,即:
P3 = ltc_btc_sell1_price*(1+ltc_btc_slippage)
同理,在BTC/CNY市場(chǎng)下買單,就必須使用該市場(chǎng)的賣一價(jià)格(btc_cny_sell1_price)加上一定的滑點(diǎn)(btc_cny_slippage,以百分比表示)來作為買單價(jià)格,即:
P1= btc_cny_sell1_price*(1+btc_cny_slippage)
同理,可以推導(dǎo)出在LTC/CNY市場(chǎng)下賣單的價(jià)格如下:
P2 = ltc_cny_buy1_price*(1-ltc_cny_slippage)
假設(shè)各個(gè)市場(chǎng)的費(fèi)率情況如下(以百分比表示):
LTC/BTC: ltc_btc_fee
BTC/CNY: btc_cny_fee
LTC/CNY: ltc_cny_fee
在LTC/BTC市場(chǎng)凈買入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市場(chǎng),賣出1個(gè)LTC,得到的CNY是:
ltc_cny_buy_1_price*(1-ltc_cny_slippage)*(1-ltc_cny_fee)
在BTC/CNY市場(chǎng),凈買入
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)]
考慮到各市場(chǎng)費(fèi)率都在千分之幾的水平,做精度取舍后,該不等式可以進(jìn)一步化簡(jiǎ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à)和市場(chǎng)價(jià)的價(jià)差比例大于所有市場(chǎng)的費(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ù)量,作為L(zhǎng)TC/BTC市場(chǎng)的下單數(shù)量。然后,根據(jù)LTC/BTC成交的數(shù)量,得到需要對(duì)沖的LTC數(shù)量和BTC數(shù)量,分別在LTC/CNY和BTC/CNY市場(chǎng)下對(duì)沖單,所有市場(chǎng)先下限價(jià)單進(jìn)行對(duì)沖,超時(shí)之后補(bǔ)市價(jià)單,確保完全對(duì)沖。
對(duì)最小交易單位的處理規(guī)則如下:
如果欲下單的LTC數(shù)量小于最小LTC交易單位(取LTC/BTC和LTC/CNY兩個(gè)市場(chǎng)的最小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è)市場(chǎng)的最小BTC交易數(shù)量的最大值)的某個(gè)倍數(shù)(比如2倍),則放棄本次套利。
二、三角套利策略流程
(1)初始化:
a)在BTC/CNY市場(chǎng)放入如下資產(chǎn):
i.BTC:1個(gè)BTC, 最少預(yù)留20% (btc_reserve = 20%)
ii.CNY:2萬元,最少預(yù)留20% (cny_reserve = 20%)
b)在LTC/CNY市場(chǎng)放入如下資產(chǎn):
i.LTC:100個(gè)LTC,最少預(yù)留20% (ltc_reserve = 20%)
ii.CNY:2萬元,最少預(yù)留20% (cny_reserve = 20%)
c)在LTC/BTC市場(chǎng)放入如下資產(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)套利的順序如下:
先去LTC/BTC吃單買入LTC,賣出BTC,然后根據(jù)LTC/BTC的成交量,使用多線程,同時(shí)在LTC/CNY和BTC/CNY市場(chǎng)進(jìn)行對(duì)沖。LTC/CNY市場(chǎng)吃單賣出LTC,BTC/CNY市場(chǎng)吃單買入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)套利的順序如下:
先去LTC/BTC吃單賣出LTC,買入BTC,然后根據(jù)LTC/BTC的成交量,使用多線程,同時(shí)在LTC/CNY和BTC/CNY市場(chǎng)進(jìn)行對(duì)沖。LTC/CNY市場(chǎng)吃單買入LTC,BTC/CNY市場(chǎng)吃單賣出BTC。
如果不滿足以上兩個(gè)條件,則繼續(xù)等待套利機(jī)會(huì)。
(3)賬戶內(nèi)劃轉(zhuǎn)條件:
BTC/CNY, LTC/CNY, LTC/BTC各個(gè)市場(chǎng)的計(jì)價(jià)貨幣和基礎(chǔ)貨幣的存量降到最少預(yù)留比例(比如20%)或以下,觸發(fā)賬戶內(nèi)劃轉(zhuǎn),劃轉(zhuǎn)的流程如下:
1)撤銷LTC/BTC市場(chǎng)中尚未成交的委托;
2)撤銷BTC/CNY市場(chǎng)中尚未成交的委托,對(duì)委托未成交部分進(jìn)行市價(jià)補(bǔ)單;
3)跟2)并行,撤銷LTC/CNY市場(chǎng)中尚未成交的委托,對(duì)委托未成交部分進(jìn)行市價(jià)補(bǔ)單;
4)進(jìn)行賬戶內(nèi)劃轉(zhuǎn),劃轉(zhuǎn)結(jié)果如下:
BTC/CNY市場(chǎng)中的BTC = LTC/BTC市場(chǎng)中的BTC
LTC/CNY市場(chǎng)中的LTC = LTC/BTC市場(chǎng)中的LTC
BTC/CNY市場(chǎng)中的CNY = LTC/CNY市場(chǎng)中的CNY(這個(gè)目前是合并在一起的,暫時(shí)沒問題,如果是ETH,則需要保證ETH賬戶中的CNY = BTC賬戶中的CNY)
三、策略監(jiān)控和異常處理
我們先定義一個(gè)異常的處理方法,稱為操作1,具體如下:
操作名:操作1
操作簡(jiǎn)介:停止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
操作簡(jiǎn)介:停止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市場(chǎng)、LTC/CNY市場(chǎng)以及BTC/CNY市場(chǎng))
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市場(chǎng)中的CNY - LTC/CNY市場(chǎng)中的CNY)/(BTC/CNY市場(chǎng)中的CNY + LTC/CNY市場(chǎng)中的CNY),因?yàn)長(zhǎng)TC和BTC市場(chǎng)共享統(tǒng)一的CNY,所以本策略暫時(shí)不存在CNY頭寸偏度這個(gè)問題。
BTC頭寸偏度 = ABS(BTC/CNY市場(chǎng)中的BTC - LTC/BTC市場(chǎng)中的BTC)/( BTC/CNY市場(chǎng)中的BTC + LTC/BTC市場(chǎng)中的BTC)
LTC頭寸偏度 = ABS(LTC/CNY市場(chǎng)中的LTC - LTC/BTC市場(chǎng)中的LTC)/( LTC/CNY市場(chǎng)中的LTC + LTC/BTC市場(chǎng)中的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)長(zhǎng)TC和BTC市場(chǎng)共享統(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市場(chǎng)未成交的委托單數(shù)量+BTC/CNY市場(chǎng)未成交的委托單數(shù)量之和)數(shù)量超過一定額度,進(jìn)行“操作2”。
四、需要注意的問題
1.LTC/BTC市場(chǎng)的單子是整個(gè)套利循環(huán)的起點(diǎn),在LTC/BTC市場(chǎng)中成交的單子,一定要到LTC/CNY和BTC/CNY市場(chǎng)同時(shí)進(jìn)行對(duì)沖。LTC/CNY和BTC/CNY市場(chǎng)的對(duì)沖單,先嘗試以限價(jià)單掛出,不成交則逐漸修改價(jià)格至可以成交的價(jià)位,多次嘗試之后(超時(shí))如果仍有未成交部分,則以市價(jià)單補(bǔ)單,保證完全對(duì)沖。
2.整個(gè)套利過程,為了簡(jiǎn)化價(jià)格轉(zhuǎn)換運(yùn)算,沒有考慮BTC/CNY市場(chǎng)的盤口深度,所以在估計(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市場(chǎng),按照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í)候,是偏保守的。
以上就是在有成本的情況下進(jìn)行三角套利的全過程。
評(píng)論
查看更多