一、考慮交易成本情況下的策略調整
我們以第一個策略(正循環套利_掙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)
- 1
同理,在BTC/CNY市場下買單,就必須使用該市場的賣一價格(btc_cny_sell1_price)加上一定的滑點(btc_cny_slippage,以百分比表示)來作爲買單價格,即:
P1= btc_cny_sell1_price*(1+btc_cny_slippage)
- 1
同理,可以推導出在LTC/CNY市場下賣單的價格如下:
P2 = ltc_cny_buy1_price*(1-ltc_cny_slippage)
- 1
假設各個市場的費率情況如下(以百分比表示):
LTC/BTC: ltc_btc_fee
BTC/CNY: btc_cny_fee
LTC/CNY: ltc_cny_fee
- 1
- 2
- 3
在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)
- 1
在LTC/CNY市場,賣出1個LTC,得到的CNY是:
ltc_cny_buy_1_price*(1-ltc_cny_slippage)*(1-ltc_cny_fee)
- 1
在BTC/CNY市場,淨買入
ltc_btc_sell_1_price*(1+ltc_btc_slippage)/(1-ltc_btc_fee)
- 1
個BTC,實際上需要買入
ltc_btc_sell_1_price*(1+ltc_btc_slippage)/[(1-ltc_btc_fee)*(1-btc_cny_fee)]
- 1
個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)]
- 1
套利的前提條件是:得到的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)]
- 1
調整一下,對應的套利條件就是:
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)]
- 1
- 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
- 1
- 2
基本意思就是:只有當公允價和市場價的價差比例大於所有市場的費率總和再加上滑點總和時,做三角套利纔是盈利的。
如果價差滿足條件,交易數量上的計算規則如下:
先計算以下幾個值:
- LTC/BTC賣方盤口吃單數量:ltc_btc_sell1_quantity*order_ratio_ltc_btc,其中ltc_btc_sell1_quantity
代表LTC/BTC賣一檔的數量,order_ratio_ltc_btc代表本策略在LTC/BTC盤口的吃單比例- LTC/CNY買方盤口吃單數量:ltc_cny_buy1_quantity*order_ratio_ltc_cny,其中order_ratio_ltc_cny代表本策略在LTC/CNY盤口的吃單比例
- LTC/BTC賬戶中可以用來買LTC的BTC額度及可以置換的LTC個數: btc_available - btc_reserve,可以置換成 (btc_available –
btc_reserve)/ltc_btc_sell1_price個LTC
其中,btc_available表示該賬戶中可用的BTC數量,btc_reserve表示該賬戶中應該最少預留的BTC數量(這個數值由用戶根據自己的風險偏好來設置,越高代表用戶風險偏好越低)。- 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表示該賬戶中應該最少預留的人民幣數量(這個數值由用戶根據自己的風險偏好來設置,越高代表用戶風險偏好越低)。- 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
- 1
- 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,
- 1
- 2
則進行逆循環套利:
逆循環套利的順序如下:
先去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
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
需要監控的指標和相應流程如下:
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
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
四、 需要注意的問題
- LTC/BTC市場的單子是整個套利循環的起點,在LTC/BTC市場中成交的單子,一定要到LTC/CNY和BTC/CNY市場同時進行對衝。LTC/CNY和BTC/CNY市場的對衝單,先嚐試以限價單掛出,不成交則逐漸修改價格至可以成交的價位,多次嘗試之後(超時)如果仍有未成交部分,則以市價單補單,保證完全對衝。
- 整個套利過程,爲了簡化價格轉換運算,沒有考慮BTC/CNY市場的盤口深度,所以在估計BTC/CNY的對衝成本(btc_cny_slippage)時,需要結合最近BTC/CNY盤口的深度情況進行調整。如果BTC/CNY盤口太薄,則建議設置一個比較大的對衝成本(btc_cny_slippage)。
- 本文中所有的買一賣一價格,都是指進行了盤口深度合併之後的價格。盤口深度合併的規則是:
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
合併後深度:
(asks)
0.0105 32
0.0104 33
0.0102 13
(bids)
0.0101 45
0.0098 32
0.0097 2
0.0096 30
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
所以本策略中的買一賣一的價格和數量,是已經包含了未合併之前好幾檔的深度。這樣的合併規則,保證我們在計算套利機會的時候,是偏保守的。