【邢不行|量化小講堂系列33-實戰篇】邢不行親歷:一行程式碼虧損5萬美金,量化投資的風險
引言:
邢不行的系列帖子“量化小講堂”,通過實際案例教初學者使用python進行量化投資,瞭解行業研究方向,希望能對大家有幫助。
【歷史文章彙總】請點選 ofollow,noindex"> 此處
個人微信:coinquant,有問題歡迎交流。
邢不行親歷:一行程式碼虧損5萬美金,量化投資的風險
本文純屬真事
10月15日,週一,早晨07:30
在我還睡著的時候,阿里雲香港伺服器上跑著的自動交易程式,在bitfinex交易所陸續對我交易的幾個數字貨幣,開了空單。並且策略判定此次交易盈利的概率較大,所以加了3倍槓桿。
開空單:指的是做空,例如價格跌10%,我就賺10%,相應的價格漲10%,我就虧10%。
3倍槓桿:放大盈虧比例。例如價格跌10%,我就賺30%,相應的價格漲10%,我就虧30%。
下圖展示的當時比特幣(btc/usdt)的15分鐘K線圖,開空點位是6348左右。
10月15日,週一,上午
因為一些私人事情需要處理,這天上午沒有到辦公室。
在出門之前,通過每天早晨8點半釘釘發給我的持倉監控,瞭解到策略已經開空了。內心:趕緊他媽的給我暴跌吧。
因為辦的事情比較麻煩,一個上午都沒有時間看手機,微信群也沒有檢視。
10月15日,週一,下午13:15
如下圖所示比特幣的價格上漲到6423,相比我們的做空點位已經上漲了1.18%,空頭倉位已經虧損了約3.6%。
交易的其它幣種的空頭倉位,也產生了一定的虧損。此時按照策略,應該馬上平倉止損。
做交易就是要這樣,該止損的時候絕不手軟,哪怕之後被打臉。因為活下來是最重要的。
這也是量化交易的好處,幫你按照策略自動止損,避免交易者情緒的影響。
並且根據我策略的判斷,此時不僅應該止損,還要反過來開多,並且仍然是3倍槓桿。
10月15日,週一,下午13:20
事情終於順利辦好了,我也在外面吃好了午飯,坐上去辦公室的車,拿出手機。
這個時候不知道為什麼,我開啟手機上的teamviewer,遠端了一下阿里雲伺服器。沒啥特殊目的,就是順手隨便看看。
因為程式一直比較穩定,我一般是不怎麼看伺服器的。天知道這次怎麼就想著開啟手機順便看看呢,可能是我的錢正在向我呼救吧。之後才知道,這順手一看,救了一命。
登陸伺服器之後,就看到了下面這張行情圖,發現幣價正在急速上漲:
內心:媽蛋,虧錢了,幸好策略應該幫我提前止損了。
之後看下我程式的實時輸出,想看下當前持倉。然後發現我的程式已經暫停2個小時了,並且之前的空頭倉位還在,並沒有止損!
此時瞬間人就變得緊張,從椅子上坐了起來,之前辦事的疲憊已經忘記。
趕緊點選重新執行按鈕,讓程式重新跑起來。
但我不在電腦面前,沒辦法手工操作平之前的倉位,眼睜睜的看著價格還在繼續急速上漲,只能等著程式跑。
因為我跑策略看的是15分鐘K線,所以每隔15分鐘才會操作一次。所以只能等到13:30的時候,程式才進行了操作。
具體如下圖所示,直到漲到6500的時候,才平空倉,並且3倍槓桿開多:
10月15日,週一,下午
等到程式幫我止損並且再開多之後,繃緊的神經才稍稍放松下來。坐在車上望著窗外的上海中心,算算到底虧了多少。
因為程式故障慢了的這15分鐘,導致之前的空倉多虧了錢,新開的多倉又少賺了錢。
恩,一來一去,大約5萬美金沒了,媽蛋。
但是呢,隨著行情的進一步發展,我深深的感到,我是多麼多麼多麼多麼多麼的幸運。
因為之後的行情走勢是下圖這樣的:
繼續暴漲!
受到usdt不能承兌的影響,bitfinex交易所上面的btc/usdt交易對開始猛漲。最高一直漲到了7800美金。
如果我不是在13:20左右,隨手看了下伺服器,然後讓停止的程式重啟,那麼我早晨在6348開的空倉就會一直持有。
當漲到最高點7800的時候,總共虧損:
( 7800 - 6348 ) / 6348 * 3 = 69%
按照bitfinex交易所虧損50%就強平的交易規則,早就已經爆倉了!
10月16日,週二,上午
到了第二天,還是很後怕。
想想當時真的是命大啊,怎麼就突然看了眼伺服器呢。要是當時不看,最終爆倉,那就是半年白乾,說出去也被人笑死。
計劃著週末去龍華寺燒香。
10月16日,週二,下午
下午,寫程式碼的小哥很小心的跟我說,問題查出來了。
我仔細看了一遍之後,真的是哭笑不得。
因為這個問題,我之前在課程裡面就給大家講過,當時還重點提了一下。
下面是當時課程中的程式碼截圖:
這兩行程式碼很簡單,大家都看的懂。作用是從okex交易所獲取到最新的行情資料。
雖然這程式碼和案發現場的bitfinex交易所實盤程式碼不一樣,但講的問題是一樣的。
圖中第10行程式碼中的那串地址。是okex交易所的行情介面地址,大家可以在瀏覽器中輸入這個地址,就能看到萊特幣LTC最新的價格。
https://www.okex.com/api/v1/ticker.do?symbol=ltc_usdt
第13行程式碼的作用是獲取行情介面返回的資料。其中有一個關鍵的引數叫做timeout。
當時在上課的時候我特意提到了這個timeout引數一定要加。
當我們向交易所伺服器傳送請求獲取資料時,理論上對方應該很快返回資訊。但由於網路情況複雜、交易所伺服器故障等原因,有可能對方不會馬上回復。
此時我們的程式就會等待。加上這個引數timeout=15就表明,我們最多等待15秒。15秒之後還沒有返回,程式就會報錯終止。
如果不加這個引數,程式預設會一直等下去。若訊息一直不返回,就會一直等到地老天荒。此時整個程式也就和停止了沒有差別。
而最終的問題就是,寫程式碼小哥獲取bitfinex持倉資料的那行程式碼,居然沒有加上timeout引數。
恰好這次又碰上bitfinex伺服器不穩定,一直沒有返回資料,而我的程式就在那裡一直等著。
哎,我學生都知道的東西,我自己招的寫程式碼小哥居然不知道。
事後措施
出了問題就要解決,以後不能再犯。
原先程式每15分鐘就會通過釘釘傳送一次持倉簡報到我手機,如果不發就說明程式停止了。後來因為長時間穩定,我嫌煩,就停了。
現在我已經乖乖的打開了,再煩我也不會關閉。
bitfinex交易所我開始交易的比較早,和交易所對接的程式碼都是自己寫的,並沒有使用課程裡面推薦的ccxt。那些覺得ccxt不好,想著自己對接交易所的同學,還是省省吧。
你的程式碼是不可能比這些開源框架還穩健的。ccxt裡面預設就寫好了,所有情況下timeout為10秒。
最後,寫這行程式碼的小哥,首先年底獎金就不要想了,其次可以考慮換個工作了。
對本文研究有自己的想法的朋友,可以在評論區留言。關於文中的程式碼、資料,以及下期《量化小講堂》想了解的內容,也可以加我個人微信coinquant交流,歡迎瀏覽我的朋友圈內容。
如果你想入門量化,但是始終找不到方向,可以加入我的知識星球。我會在裡面解答你的問題,分享我的感悟,不論是投資、技術,還是職業選擇、思維方式。
-- 學習和成長從來都不是一個人的事 --
來源:邢不行
本文由布洛克專欄作者釋出,代表作者觀點,版權歸作者所有,不代表布洛克科技觀點
——TheEnd——
關注“布洛克科技”