標籤:

我也想躺著收錢:一個比特幣套利系統的實現

記得在很早的時候就在知乎日報上看過青銅時代:中本聰之惑這篇文章,當時的我完全沒有搞懂作者在說什麼,只是覺得很厲害,於是在添加完收藏之後也沒有在多想這件事,也沒有精力去想這件事。

大約在11月的時候,我終於忙完了手頭所有的事情,一下子閑了下來,再一次重新整理收藏夾的時候再次發現了這篇文章,於是我又聚精會神地讀了一遍,這次依然沒有搞懂整個系統是怎麼盈利的,但是我記住了一個數字:280%,作者估計的系統年化利率,雖然沒有理解這篇文章的意思,但是我還是著手開始設計一個平台,因為即使因為各種原因,只能達到作者十分之一的收益率,28%,也是極其可觀的。

平台的第一步肯定是先抓去一部分數據進行分析,同時這也是這個系統中最簡單的一個部分,當時發現中國三大比特幣交易平台 火幣,btcc,okcoin 都有開放的查詢介面,而且介面比較穩定,所以沒有必要自己去頁面爬取數據了,同時我也發現,各個平台也開放了交易介面,雖然不是特別穩定,穩定性也可以湊合湊合,這是我和青銅時代:中本聰之惑作者所處環境非常不一樣的第一點:

01 技術門檻大幅度降低

第二個不同點在抓取三個平台數據開始後不久就顯現出來,

上面這張圖是火幣和btcc的價差實時監控,可以發現的是價差非常非常的小,接近沒有,而且波動幅度也不是很大,總結起來就是:

02 套利空間大幅度減小

真的是特別大幅度的減小,知乎文章的作者提到的價差空間在幾十甚至上百的範圍內,而僅僅夏天到冬天,價差就已經縮小到了幾乎看不到的地步,非常恐怖。

這兩個消息一好一壞,一下動搖了我的決心,但是經過大概0.5秒的糾結,金錢的誘惑還是戰勝了理性,我決定繼續把項目進行下去。

由於當時又找了實習,所以白天實習,晚上心情好的時候就寫一點,不久抓取平台就完成了,沒多少工作量,然後就是漫長的數據積累階段了,沒有一定的數據,我是沒法憑空設計一個模型出來的,但是平台在抓取的同時也可以做一些其他的事情,於是我開始惡補一些金融的入門級知識,比如股票的實時成交價格是怎麼產生的,order book是怎麼一回事,什麼是盤口,市價單,現價單,冰山委託都是什麼東西,交易所是怎麼贏利的,什麼是做市商,什麼是對沖,這些東西其實都相當入門級,但是對於一個計算機系的學生來說就是天書了。

在吃透了這些概念之後,我終於完全理解了套利的操作是怎麼進行的:

首先在兩個比特幣交易平台分別部署現金,並且借入一定數量的比特幣在兩個平台價差拉大時在價位較高的平台賣出,在較低價位平台買入,確保數額相同在兩個平台價差縮小甚至逆轉時再做逆向操作

大家也可以參考一下知乎文章上的「兩個蘋果」的解釋,這三步操作其實描述的就是一個對沖,對沖是一種規避風險的方法,這裡被對衝掉的就是比特幣本身的價值,也就是說,本來我們在投資比特幣本身,通過對沖,我們實際上在投資的是比特幣市場之間的價差:

這個行為有一個學術點的名字:統計套利

整個統計套利的基石就在於把比特幣幣值變化的風險給對衝掉,所以我們必須做到以下幾點:

平台上部署的比特幣必須是借來的(或者說是融幣融來的)必須保證價差計算準確,不能有太多的滑點(實際成交價格和意向成交價格的偏差)同時整個系統的延遲必須做到最小,否則在兩個交易所的下單會受到幣值波動的影響

但是這裡就有一個問題了,投資價差和投資比特幣本身有什麼區別呢?區別只有一個,就是價差收斂,什麼叫價差收斂呢?就是說價差雖然會有變化,但是始終是穩定在某個值附近,實際導致這個現象的原因是不同比特幣交易所買賣的實際上是同一個東西——比特幣。就像不同地方的麥當勞一樣,價格可能會有不同,但總體上這種價差不會發生太大變化,總是在某個值上下變化。利用這個特點我們就可以做出一些有意思的策略了。

但是想要對衝掉比特幣本身的價值就意味著需要融幣,融幣意味著每天千分之一左右的利息,就是說如果今天你的策略獲得的利潤小於千分之一,那麼即使你的策略能夠產生利潤,也是沒有價值的。

在對比特幣的不斷了解中,我也發現了比特幣的魅力之處:

所有交易所全天候24小時交易國內三大交易所的比特幣人民幣現貨交易完全沒有手續費,但是提現的時候會有手續費和延遲完全沒有漲幅和跌幅的限制,也就是說在一分鐘之內理論上來說完全有可能1個比特幣會變成不如一張廁紙值錢,也可能變得比一噸黃金還貴監管很少,交易所有整個跑路的風險(參考Mt.Gox)

在收集數據的同時,我也開始了套利平台的一些基礎建設,根據設計,平台劃分為幾個大的並且互相幾乎完全獨立的模塊:拋開比特幣本質不談,比特幣交易的這些性質簡直就是金融的一朵奇葩,所以比特幣交易的數據也是非常有特點,或者說非常有價值的,這也更加激發了我對比特幣的興趣。

03 哈勃(hubble)

hubble 模塊的計劃功能是圖形化的數據抓取和展示平台,作用是數據可視化,提供平台的價格和差價的可視化功能。當時的希望是能夠通過hubble來目測發現一些市場的基本規律。最後hubble整個是用web2py框架寫的,抓取則用的是crontab,提供市場分鐘級的數據展示,用來觀察市場走勢。

04 南柯(Nanke)

取名自南柯一夢,作用是市場數據的回測,為了回測方便,我把策略邏輯和框架邏輯分離,最後南柯模塊可以直接在網頁上編輯和回測策略,並且查看報告。取名南柯其實也是警示自己,回測再美好也是南柯一夢。

05 黃粱(Huangliang)

計劃中南柯的姊妹模塊,提供比南柯更精細的回測功能,但是目前並沒有開發。

06 矩陣(matrix)

是的,矩陣取名自黑客帝國,這個模塊很有意思,是一個根據即時交易所價格模擬策略在交易所行為的模塊,在南柯初期驗證過的策略代碼在上線之前都需要經過matrix的模擬,但是matrix目前的功能比較有限,只能模擬交易所的市價單行為,因為市價單只需要再查一遍order book就可以了,但這對於我來說已經足夠,matrix還可以模擬交易所的交易延遲和交易失敗造成的影響,並且也支持在線編輯策略代碼和熱載入,熱重載,和同時模擬多個策略的行為。

但是,matrix這個模塊的名字也時刻提醒著我,再真實,也是假的,matrix不能也不可能模擬市場的全部行為,一切以線上為準。實際上也由於種種原因,市場的行為在中高頻的情況下也和matrix有相當的差異。

07 斯葉特(sjet)

先說一下命名吧,卡倫·斯葉特是一款非常老的遊戲《homeworld》中庫申人的精神領袖,是一個女科學家,把自己嵌入到了庫申人的巨大飛船mothership中作為生物cpu,這個遊戲也是第一款讓我感動的遊戲,有興趣大家可以了解下。把這個傳奇作為模塊的名字,模塊的作用也很明顯了:sjet是整個平台的核心,是線上策略運行的地方,也運用了和matrix相近的技術,支持策略腳本的線上編輯和熱重載,理論上sjet和matrix的策略腳本可以通用,就是說在matrix經過驗證的策略理論上可以無縫直接在線上運行,但是實際操作的時候還是有一些策略需要經過一些小修改才能上線到sjet。

還有一些小模塊不表

08 框架開發中遇到的一些技術問題Q&A

如何讓程序持續抓取?

這個問題有兩種解決方案:

crontab定時抓取demon進程中循環抓取

其中hubble模塊使用了第一種而matrix和sjet模塊使用了第二種。

如何實現熱載入,熱重載python策略腳本?

初始化時直接import 策略模塊,循環判斷策略腳本是否發生變化,如果發生變化,則重新載入,唯一需要注意的一點是在重載是不能直接再次import模塊,而要使用python的reload語句。這裡還有一點就是由於需要在線上程序運行的時候熱重載,所以最好要把策略做成無狀態的,就算有狀態的話最好也要用文件,或者資料庫,或者redis的形式存儲下來,否則策略一重載狀態就沒了。另一個需要注意的地方是由於程序常駐內存,所以不當的策略會導致內存泄漏,稍微注意一下就行。

程序需要在兩方下單,要是一方失敗了怎麼辦?

需要對雙方的下單進行事務化處理,但是這種事務和資料庫的事務完全不同,而是類似於分散式事務,對於fail的處理需要謹慎,在一次套利開始時紀錄下兩個市場賬戶中的比特幣分布和期望中交易完成後時稱中的比特幣分布情況,接下來分別發送兩個下單請求,然後鎖住整個交易系統,接下來在市場賬戶中的比特幣分布達到成功條件或失敗條件時解鎖交易系統繼續交易,在其他情況下判斷交易應該繼續進行還是回滾,走相應的邏輯就行。

交易受滑點的影響太大怎麼辦?

這個也是目前交易中遇到的最大問題,策略經常在南柯和矩陣中運行非常良好,但是一到sjet就開始虧錢,揪其原因就是滑點太大,這個問題目前來看幾乎是無解的,只能設計一些策略來減少滑點造成的損失。

目前自動化交易的利潤空間有多大?

我手頭上也沒有具體數據,但是就目前這個策略上線這幾天的運行情況來看,是一個數學期望大於30%的年化收益率,但是風險(方差)非常大,而且需要更多時間來驗證,但是不排除今後設計更好的策略能夠提升。

為什麼使用市價單而不考慮限價單這種不會產生滑點的手段?

也考慮過,限價單並不是立即成交的,有可能一直不成交,會大大增加套利事務的複雜性,不是不想用,是沒想好怎麼用才合適。

09 交易策略

在解決了這些框架開發的問題之後,我終於可以將注意力集到交易策略上了,按照知乎文章上的思路,首先是找出兩個市場價差分布的均值E和方差σ,然後再確定一個大於0的參數α,然後在價差大於E+ασ時做正向搬運,當價差小於E-ασ時做反向搬運,這是一個簡單而有效的策略,唯一可能導致虧損的點就是交易時的滑點了。

這裡唯一需要確定的參數是α,一個較小的α意味著更多的交易次數,但是也意味著每次交易的利潤會變小,然而南柯和matrix的模擬顯示這也意味著更多的總利潤,這是比較耐人尋味的一點。然而減小α的代價就是系統受滑點的影響也就更大,如果沒有較強的高頻交易能力,一個較小的α會讓你虧成翔。拋開其他問題不談,我們肯定是希望有一個儘可能小的α,但是由於這個系統的交易延遲有1~2秒之久,比一個高頻系統的最低要求都差太多了,只能算是一個中低頻的自動交易系統,所以說α就不能選的很小了。絕對不要小看這一兩秒,這一兩秒足夠讓一個在matrix和南柯上爆賺的策略在實盤虧成翔,所以說:回測很豐滿,現實很骨感。這句話絕對非常非常有道理。

我們不妨把上面這個策略稱為simple sigma,整個simple sigma策略的假設就有這幾點:

兩個市場的價差不恆定,而是在某個數值(E)附近上下波動兩個市場的價差大體上符合正態分布

這兩個假設都是基本上正確的,所以說理論上這個策略是可以做到盈利的。

10 深入思考兩個假設

雖然上面兩個假設都是正確的,但是實際上微觀的價差的分布並不總是圍繞平均值波動,並且如果根據歷史數據計算出一個價差的平均值,那麼誰也沒法保證這個平均值在將來也會適用,我們觀察一下下面這張圖:

這張圖顯示的是火幣和btcc兩個市場1月4日到1月6日三天的價差數據,在前一個紅框里,價差圍繞著3.5左右波動,而在後一個紅框里,價差圍繞著0上下波動,如果我們按照simple sigma策略的思路,那麼我們就會失去1月6號幾乎一整天的套利空間。

我們需要的,是一個能夠動態反應價差「均值」的標誌,它不能變化得太快,否則會失去「均值」的作用,也不能太慢,否則難以跟上價差的變化幅度,所以必須有一個參數來確定這一點。

也就是在這個時候,我想到了之前做智能車的時候運用到的一個數學工具,互補濾波,整個智能車項目對於我來說就是一場巨大的悲劇,但是我卻記住了互補濾波,互補濾波原本的作用是過濾掉一些信號中的高頻雜音,從而提取出有用的低頻信號,但是在不同的場景下也有一些其他的用途,但是是否適合運用在這裡,效果如何呢?

不了解互補濾波的同學可以戳這裡

接著首先,我修改了simple sigma策略,將其中的E(均值)換成了互補濾波的輸出,並且在南柯和matrix上進行了回測和模擬,回測和模擬都顯示這種新的策略比simple sigma的盈利多30%以上,那麼理論上,這個策略還不錯。

(後來看《統計套利》這本書才知道,這種方法早也被人發明出來了,叫指數加權平均移動模型,所以說多讀一點書還是可以少走一些彎路的)

總的來說,用上了互補濾波的策略之所以比simple sigma表現得更好,還是因為它正確地精細化了市場價格差波動的模型,現在模型的假設是這樣的:

兩個市場的價差不恆定,在某個特定時間段內會在某個數值(E)附近上下波動兩個市場的價差大體上符合正態分布一個時間段內市場的價差大體也符合正態分布

是否還有能更加正確或者更加精細市場行為的模型呢?我認為肯定是有的,只是我沒有發現而已,如果大家覺得自己發現了一些有意思的市場規律,一定要告訴我。但在發現更好的模型前,就用它上線了。

11 上線那些事

由於本人技術太渣,上面這些事情做完時,時間已經從11月中旬到達了12月末,除了sjet之外的模塊都已經上線,只剩下最重要的實盤策略模塊sjet了。於是我挑了一個好日子上線,12月31日晚上,這樣一來,系統第一次盈利就會在1月1日這樣一個好日子,以後裝逼的時候就可以說在2016年的第一天我上線了一個牛逼的系統,然後如何如何,想想也有些小激動呢。其實真正的原因是平時要實習,也只有元旦假期才能確保我有充分的時間處理剛上線系統中的各種bug。

上線的時候,我選擇了一個非常保守的倉位,0.01比特幣,大概是30塊錢,所以就算我的系統爆炸,也就是半天飯錢而已。果不其然,系統完全被各種bug所困擾,只進行了一兩次有效交易,而且由於各種bug,系統完全在貼錢,新年第一天的也時不時的需要查看一下系統的穩定性,我也是醉了。

新年的第一天不僅沒有盈利,系統反而因為穩定性原因虧掉了1毛錢,但是上線還是勉勉強強上去了。裝逼失敗。

1號2號基本上解決了系統的各種bug,3號把收益的圖形化模塊上線了,終於從圖形化界面上看到系統第一次盈利:

然而還沒來得及高興多久,剛剛盈利的money馬上給虧回去了:

調查原因發現策略本身沒有問題,是滑點造成的利潤損失,於是6,7號兩天我開始嘗試調整模型參數(調大α),並且加入一些策略(在開始交易前考慮價差變化方向和速度),希望能夠有效遏制滑點,結果是滑點沒有消失,但是嚴重程度有所減輕,經過一周多的驗證,系統可以盈利:

後幾天的時間慢慢把系統的監控模塊titan也上線了,系統收益和穩定性報警都能夠通過簡訊形式直接發送到手機上,實現了半個自動化運維。

當然系統中還有很多非常不完善的地方,並且演算法還存在非常大的繼續優化的空間,也希望對交易演算法有了解或者感興趣的同學email我或者私信我,我們可以一起改進這個系統。

註:本文轉載自IcyBees blog

推薦閱讀:

《克羅談投資策略》的讀書筆記
賺錢是一種巧
惡意軟體Disttrack的最新變種是如何展開攻擊的?
行情不可預測,是否要避免開倉時的潛意識預測?

TAG:技术分析 |