# Quantitative trading of cryptocurrencies with CPI and Fibonacci retracement ## 研究簡介 ### 一、 摘要 2020年疫情爆發初期,各國經濟受到嚴重影響,股票、加密貨幣價格進行大幅回撤,美聯儲(Fed)為了刺激經濟消費,開始了無限QE政策,僅在兩年間便印製了四兆美金,使得二級市場進入了前所未有的大牛市。然後過度印鈔,導致通膨問題日益加重,今年六月,CPI(消費者物價指數)達到9.1%,創下近年新高,美聯儲不得不政策轉向,實施貨幣緊縮,利用升息縮表來減緩通膨,此後,每一次的CPI公佈都對二級市場走勢有著重大影響,尤其是情緒化的加密貨幣市場。 在現行金融二級市場中,透過量化指標分析,並且自動化進行交易已經是一種顯而易見的趨勢,華爾街多家著名對沖基金(Hedge fund),如橋水基金、城堡基金等,都已經開始在美股期貨、選擇權、外匯及加密貨幣上採用量化交易策略。本文旨在利用Python進行歷史數據回測,與觀察影響短線市場的關鍵數據-CPI,研究出一套適應於比特幣U本位合約的量化交易模型。 ### 二、 研究之動機與目的 我個人已在金融二級市場交易五年,從台股短線當沖、波段,再到近年興起的加密貨幣合約市場,我發現許多技術分析流派及指標,都擁有慣用性,可以跨市場的進行通用,而其中在加密貨幣上,因為市場的開放和不被監管等特性,使得利用量化指標進行自動操作的對沖基金和大戶非常活躍。本文希冀可以透過觀察影響比特幣短線走勢的CPI消費者物價指數,找出一套合理的預測方式,並透過Python進行回測,計算勝率,並了解其實際應用的可行性。 ### 三、 提案脈絡 本文選定利用比特幣進行歷史數據回測,它是目前在區塊鏈交易網路上市值最龐大的幣,高達399,506,809,580美元,每日的交易量也非常驚人、交易人群充足,故對其進行歷史數據回測可以很有效的得知策略能否適應市場。而因其市值第一大的原因,也很常做為整個加密貨幣的先行指標,其他山寨幣(Alt coin)的走勢也很容易被它影響,故如果建構了一套對於比特幣有效的量化交易模型,也能更加方便的操作其他幣種。 ### 四、 研究方法 我主要想對比特幣進行兩種方法的量化分析,分為特徵值機器學習和CPI結合斐波那契回撤,特徵值機器學習方法會先在Yahoo財經上下載DJI(道瓊工業指數)和BTCUSDT(比特幣美元交易對)從2017-09-12到2022-09-12的歷史交易數據,並且放入Python中進行數據分析,優先分析其走勢、繪製移動平均線、指數移動平均線和MACD等常見技術分析指標,再計算兩個交易的走勢的相關係數,並將這些分析結果找到固定的特徵值,如5日移動平均由下往上穿越10日移動平均,接下來一段時間都呈現上漲等,建構成特徵進行機器學習分析,利用Python的自由軟體機器學習庫scikit-learn其中的SVM進行訓練、統整並計算勝率。 CPI結合斐波那契回撤方法。CPI公佈分為實際值與預期值,當實際大於預期時,代表通膨並未有效下降,我們預測接下來的一分K會呈現下跌,反之則預測上漲。本研究回測了從2021年1月至2022年12月的每一次CPI,共二十四次的公布內容,預測結果confusion matrix和一分K棒截圖顯示如下,其中發現,CPI公布會對短線的價格行為帶來重大影響,我想透過斐波那契回撤(Febonacchi retracement),來預期趨勢的回撤點,並找到合適的開倉位置。 ### 五、 預期成果與限制 預期成果同上述,將建構出一套合適的CPI行情預測方法,可以穩定的適應於市場上的波動行情,並通過回測計算出勝率,了解到真實適用的可行性。限制部分,因為本學期的專題內容較大且複雜,若進度順利的話,希冀可以在最後放上幣安API,真實的進行即時交易,利用小倉位驗證策略的成功與否,而非只是對更多的歷史數據進行回測。 ## 研究成果 ### 壹、特徵值機器學習-SVM漲跌預測模型 我先在 Yahoo 財經上下載DJI(道瓊工業指數)和BTCUSDT(比特幣/美元交易對)從 2017-09-12 到 2022-09-12 的歷史交易數據,並放入Python 中進行數據分析,優先分析其走勢(圖1及圖2)、繪製移動平均線(Moving average)、 指數移動平均線(Exponential moving average)和MACD等常見技術分析指標(圖3),再計算兩個交易對的走勢相關係數(圖4),並設法透過這些分析結果找到固定特徵值,如5日移動平均線由下往上穿越10日移動平均線,接下來一段時間都呈現上漲等,或比特幣自己的開盤、收盤、最高和最低價等數據,建構成特徵值進行機器學習分析,利用Python的自由軟體機器學習庫 scikit-learn中的SVM支持向量機進行訓練、繪製預測結果並計算勝率。 ![](https://i.imgur.com/EYqSCYK.png) 圖1. 比特幣價格走勢圖 ![](https://i.imgur.com/2DkAXFm.png) 圖2. 道瓊工業指數價格走勢圖 ![](https://i.imgur.com/FGPybbE.png) 圖3. 比特幣MA、EMA、MACD圖 ![](https://i.imgur.com/rONuU4c.png) 圖4. 比特幣對道瓊相關係數圖 在分析美股和比特幣交易對的相關係數時,我發現資料日期長度不同,美股例假日不開盤,而比特幣是24/7全年無休的,因此我透過python將美股例假日前一日數據做為填充,發現相關係數高達0.89(圖4)。隨後我們打算利用SVM來將美股的日線開盤、收盤、最高和最低價作為特徵值,訓練資料並預測比特幣之漲跌,卻發現SVM沒有辦法實現此功能,因此透過技術分析當特徵值的想法可能也無法落實,因此我只能改為利用比特幣本身的資料,也就是自身的日線開盤、收盤、最高和最低價來做為特徵值訓練。 在預測過程中,我切割20%的資料作為預測集、80%資料作為訓練集,並且設定預測結果1表示下一日會漲、0表示跌或平盤。我們使用scikit-learn中的preprocessing.scale函式對特徵值進行標準化,並透過svm.SVC來創建SVM分類器。 我首先採用linear kernel並預設參數的方式進行訓練,並將預測結果與走勢透過下圖表示,利用svmTool.score函式計算出正確率為78%(圖5) ![](https://i.imgur.com/xzDjjFZ.png) 圖5. linear kernel預設參數結果 雖然正確率78%為還算可以的結果,不過我還想嘗試是否有更佳的參數組合,可以產生更好的結果,於是分別採用了poly kernel和RBF kernel進行訓練,並手動調整參數以利最佳化,poly kernel部分,我主要調整C、gamma和degree參數,區間分別是10^-1~10^2、0.5~2和3~5最終得出最佳化的參數結果degree = 3, gamma = ‘auto’, C = 50,勝率為76%,此最佳化結果比linear kernel還差,因此不再採用。(如下圖所示,後面幾次全部預測錯誤) ![](https://i.imgur.com/59uPUeq.png) 圖6. poly kernel結果 隨後我改為嘗試RBF kernel,同樣調整gamma和C參數,區間為0.5~2和10^-1~10^2,手動得出的最佳化結果為gamma = 0.7, C = 50,勝率為92%,是有明顯的進步,但擔心C值太高可能會出現問題,因為C越高,說明越不能容忍出現誤差,容易過度擬和。C越小,又容易欠擬合。C過大過小,泛化能力會變差,因此決定再嘗試回linear kernel看看是否發生此結果。 由於linear kernel只有C一個參數,因此我們同樣取區間10^-1~10^2,最終得出C = 50時勝率為95%,很確定此結果不具泛化性,因為連續幾次實際預測皆產生偏差。最終我使用linear kernel,對C逐一進行微調,用幣安得到的比特幣日線真實合約數據對資料進行預測,從C = 1~20,發現預測結果最準的參數為C=15,故計算出勝率為85%的模型(圖7)。 ![](https://i.imgur.com/bkIZNNa.png) 圖7. 最終linear kernel模型 ### 貳、執行預測結果 透過在Python中依序輸入比特幣日線前一天的收盤、開盤、最高和最低價,來預測下一天收盤比起前天收盤將會呈現上漲或下跌。 以下是幾組實際演示結果: Data 1 2023/01/01 ![](https://i.imgur.com/7hlNVEu.png) 輸入'16610', '16537', '16618', '16488',得到預測結果為1,表示隔日將會上漲,而其真實數據是對應到幣安比特幣合約日線2023/01/01,其隔日也真的呈現上漲,如下圖所示。 ![](https://i.imgur.com/bXK6loQ.png) Data 2 2022/12/14 ![](https://i.imgur.com/wUlAs92.png) 輸入'17803', '17777', '18400', '17659',得到預測結果為0,表示隔日將會下跌,而其真實數據是對應到幣安比特幣合約日線2022/12/14,其隔日也真的呈現下跌,如下圖所示。 ![](https://i.imgur.com/2oV9o6v.png) Data 3 2022/11/29 ![](https://i.imgur.com/2GCRoAi.png) 輸入'16433', '16204', '16543', '16088',得到預測結果為1,表示隔日將會上漲,而其真實數據是對應到幣安比特幣合約日線2022/11/29,其隔日也真的呈現上漲,如下圖所示。 ![](https://i.imgur.com/TFzQFuv.png) ### 參、CPI結合斐波那契-CPI與比特幣價格之間的連動性: CPI作為衡量通貨膨脹程度的領先指數,從聯準會(Fed)宣布升息以來就受到全市場的高強度關注,因為其是最直接反應升息成效的標準,若CPI持續居高不下,代表通膨還未下降,可以預測FED將進行更高強度的升息,而若CPI下降,則表示升息結果有效,可以預測下一次的升息可能不會那麼劇烈。 ![](https://i.imgur.com/Mp8py1E.png) 這邊CPI的主要參照值又分為前值和預測,若高於則預測比特幣行情下跌,低於則預測比特幣價格上漲,先不討論利多出盡或利空出盡等情況,而又為在CPI公布的東八區時間20:30(夏令時間)波動最為劇烈,下面討論CPI公布當下的1分K價格關聯性,驗證預測是否正確。 1/12 21:30 CPI公佈當下一分K ![](https://i.imgur.com/iECGENw.png) CPI公佈值為7.0%,和預測7.0%一致,等於的狀況下我們不進行漲跌判斷,但可以看到此次BTCUSDT交易對價格在當下一分K從43359上漲到43624,上漲近300點,更是有向上插針至44082,漲勢非常凶猛。 2/10 21:30 CPI公佈當下一分K ![](https://i.imgur.com/yxb4Zuh.png) CPI公佈值為7.5%,高於預測7.3%,可以看到BTCUSDT交易對價格在當下一分K從44931下跌到44302,下跌近600點,後續又持續下跌至43213,符合預期。 3/10 21:30 CPI公佈當下一分K ![](https://i.imgur.com/HtBUf2o.png) CPI公佈值為7.9%,和預測7.9%一致,等於的狀況下我們不進行漲跌判斷,但可以看到此次BTCUSDT交易對價格在當下一分K從39288上漲到39755,上漲近500點,不過後續又馬上下殺甚至跌破起漲點。 4/12 20:30 CPI公佈當下一分K ![](https://i.imgur.com/L6LSSNb.png) CPI公佈值為8.5%,高於預測8.4%,預測下跌但實際上漲,BTCUSDT交易對價格在當下一分K從40283上漲到40543,上攻近300點,雖然後續有持續下跌,但此次依然算做預測失準,不符預期。 5/11 20:30 CPI公佈當下一分K ![](https://i.imgur.com/VZ9GegB.png) CPI公佈值為8.3%,高於預測8.1%,可以看到BTCUSDT交易對價格在當下一分K從31545下跌至31160,後續又持續下跌至最低29087才從谷底反彈,下跌近400點,符合預期。 6/10 20:30 CPI公布當下一分k ![](https://i.imgur.com/vxoQ3Ro.png) CPI公佈值為8.6%,高於預測8.3%,也高於前值8.3%,可以看到BTCUSDT交易對價格從30086跌至最低29548,隨後反彈至29642收K,下跌約444點,符合預期。 7/13 20:30 CPI公布當下一分k ![](https://i.imgur.com/yjJ1R0z.png) CPI公佈值為9.1%,高於預測8.8%,也高於前值8.6%,更是創下歷史新高,可以看到BTCUSDT交易對價格從20040跌至最低19453,隨後反彈至19607收K,下跌約587點,後續又持續走跌,符合預期。 8/10 20:30 CPI公布當下一分k ![](https://i.imgur.com/ndGhSjm.png) CPI公佈值為8.5%,低於預測8.7%,也低於前值9.1%,是升息以來第一次低於預期,可以看到BTCUSDT交易對價格從23051上漲至最高23593,隨後拉回至23456收K,上漲約405點,後續又持續上漲,符合預期。 9/13 20:30 CPI公佈當下一分K ![](https://i.imgur.com/e4xps5G.png) CPI公佈值為8.3%,高於預測8.1%,但低於前值8.5%,可以看到BTCUSDT交易對價格從22712下跌至最低21709,隨後反彈至21961收K,下跌約751點,後續又持續下跌,符合預期。 10/13 20:30 CPI公佈當下一分K ![](https://i.imgur.com/A3WE9s7.png) CPI公佈值為8.2%,高於預測8.1%,但低於前值8.3%,可以看到BTCUSDT交易對價格從18799下跌至最低17917,隨後反彈至18187收K,下跌約612點,不過下跌至最低點後迎來了一波反彈,符合預期。 11/10 21:30 CPI公佈當下一分K ![](https://i.imgur.com/5CWVS9x.png) CPI公佈值為7.7%,低於預測8.0%,也低於前值8.2%,可以看到BTCUSDT交易對價格從最低16557上漲至最高17466,隨後回調至17351收K,上漲約794點,這也是近期第一次見到7字頭的CPI,多頭勢力強勁,隨後還有繼續上攻約兩天,符合預期。經過2022/01~2022/11共11次的CPI觀察結果發現,主要價格反應的都是預期值,若高於預期值則下跌,低於則上漲,與前值高低較無關係,總共有八次漲跌狀況符合預期,兩次因數值和預期值相同,故不預測,而只有一次失準。由下圖的confusion matrix我們可以更加清晰地看到此結果。 ![](https://i.imgur.com/pcLnec6.png) ●P(positive)代表漲 ●N(negative)代表跌 漲跌定義為當下1分K收K,和前根K棒進行比較。 數據回測了2021/01/13-2022/12/13共二十四次CPI公佈結果,其中五次因開出數據與預期一致所以不操作,其餘十九次透過此confusion matrix可以得知,預測上漲而實際上漲(PP)的有三次,預測下跌而實際下跌(NN)的有十次,其中五次為預測下跌實際上漲(NP),預測上漲而實際下跌為0次(PN),勝率為73%。不過從2021/06/10的CPI結果來看,量能已經明顯不足,代表CPI在該日以前對價格的影響並不如今日一樣大。 ### 肆、CPI結合斐波那契-斐波那契回撤(Fibonacci Retracement) 商品在面臨上升或下降趨勢的竭盡時,容易回撤到幾個關鍵比例的價位,分別為0.786、0.618、0.5、0.382、0.236,這些位置也容易形成支撐阻力位。和一般的技術指標不同,一般指標具滯後性,都是價格先反應後才繪出,但斐波那契回撤不同,它具有前瞻性,可以得知商品的潛在支撐阻力位。 實際應用: 上升趨勢 ![](https://i.imgur.com/0r3X09D.png) 上升趨勢應用時,在底部繪製1(100%),並觀察潛在頂部繪製0(0%),TradingView會自動標示出0.236-0.782的斐波那契線。可以看到上面兩個USD/TWD交易對價格,在觸頂後回撤0.382,即打到星號處,皆得到明顯支撐。 實際應用: 下降趨勢 ![](https://i.imgur.com/bzZgiUQ.png) JPY/USD 日線 2021/11/22-2022/12/13 下降趨勢應用時,繪製方法和上升趨勢相反,在頂部繪製1(100%),並觀察潛在底部繪製0(0%)。上圖可以看到下跌過程多次應用斐波那契,即標示星號處,打到0.236、0.382後價格繼續下探。 ### 伍、透過斐波那契回撤結合CPI制定短線交易策略: 透過上述對斐波那契回撤的應用,我們得知這是一種當價格開啟新的區間走勢時,可以用來預測潛在支撐或壓力線的技術分析方法,分別在最高最低價的價差之0%、23.6%、38.2%、50%、61.8%、78.6%、1% 容易產生回撤點位,是一種具有前瞻性的指標。我想透過Python,讀取CPI公布日的Timestamp資料,因為藉由上述CPI公布日1分K線圖,我們可以知道在公布當下的1分K波動非常劇烈,對於小的時間級別來說,的確是開啟了一個新的區間走勢。在下面的分析中,我們藉由BLOCKCHAIN RESEARCH CENTER提供的付費資料庫,下載了7/13、8/10、9/13和10/13的Timestamp日內資料,對CPI公布當下的一分K棒繪製斐波那契回撤,和前面的判斷方法一致,當CPI高於預期,我們會預測其下跌,當CPI低於預期,我們則預測其上漲,並且利用斐波那契回撤,看看使否會在回撤碰觸到0%、23.6%、38.2%、50%、61.8%、78.6%、1%時,繼續進行趨勢。 7/13 CPI公布當天Timestamp對應斐波那契應用: ![](https://i.imgur.com/RpLYfK0.png) 7/13 CPI公布值為9.1%,預期值為8.8%,因高於預期所以預測下跌,在公布當下的一分K繪製斐波那契回撤,以一分K最高價格到達位置20060設為1、最低價格到達位置19470設為0,可以看到後續走勢在跌破0後繼續下跌,力竭回撤23.6%、38.2%才又繼續下跌,不過下跌幅度並為超過當日最低點,後續還有一次在回撤1後繼續下跌,這三次皆符合斐波那契之運用。 8/10 CPI公布當天Timestamp對應斐波那契應用: ![](https://i.imgur.com/SM3RICX.png) 8/10 CPI公布值為8.5%,預期值為8.7%,因低於預期所以預測上漲,在公布當下的一分K繪製斐波那契回撤,以一分K最低價格到達位置23051設為1、最高價格到達位置23600設為0,可以看到後續走勢在突破0後繼續上漲,力竭回撤23.6%,23482才又轉為上漲,符合斐波那契結果。 9/13 CPI公布當天Timestamp對應斐波那契應用: ![](https://i.imgur.com/3ADZrrX.png) 9/13 CPI公布值為8.3%,預期值為8.1%,因高於預期所以預測下跌,在公布當下的一分K繪製斐波那契回撤,以一分K最高價格到達位置22712設為1,最低價格到達位置21709設為0,可以看到後續走勢在跌破0後短暫下跌,回撤23.6%,21922後接續下跌,也同樣符合斐波那契結果。 10/13 CPI公布當天Timestamp對應斐波那契應用: ![](https://i.imgur.com/pLHdNg0.png) 10/13 CPI公布值為8.2%,預期值為8.1%,因高於預期所以預測下跌,在公布當下的一分K繪製斐波那契回撤,以一分K最高價格到達位置19040設為1,最低價格到達位置18190設為0,可以看到後續走勢回撤38.2%、78.6%和1時,雖然有受到壓力阻擋,不過依然繼續突破,不符合斐波那契結果。 ### 陸、結論 透過7/13、8/10、9/13及10/13的四次CPI回撤點預測結果來看,在CPI數值較具影響力的2022後半年,極短線(Timestamp或分K)級別上確實有利可圖,不過對於波動性和具體回撤到哪條線的掌握程度則比較難以控制,若在每條線都進行掛單,可能會有很高機率觸發停損,整體結果比起SVM機器學習系統在真實交易實用程度較小,不過若後續再進行更多優化,如加大回測數據範圍和改變時間級別,則還有研究的空間,總結來說,這一套透過斐波那契回撤預測CPI公佈時Timestamp回撤點的交易策略,會有利於我在未來CPI數據公布時,對可能出現的回撤點有更好的了解,不過真實交易上,則還需要謹慎使用。 SVM機器學習系統部分,在我真實交易上的應用層面則更加廣泛,因現今的加密貨幣合約市場,已不像2013-2019年的快速上升期和2020-2021因無限QE引起的大牛市般單純,大型機構與法人的進場,以及越來越多的量化交易程式介入,都使得要判斷開倉方向更加困難。SVM即可透過簡單在Python中輸入BTC/USDT交易對前一日的開盤、收盤、最高及最低價,就可以對隔日的漲跌進行簡單預測,確實有幫助我在實際交易上對於方向的判斷。而未來發展的可能性,若還可以適用於更小時間級別,如小時或分K,則不局限於日線上的操作,或許也有結合CPI與斐波那契回撤做極短線交易的可能性。 ### 參考資料 1.Kelly-Based Options Trading Strategies on Settlement Date via Supervised Learning Algorithms- Mu-En Wu1• Jia-Hao Syu2 • Chien-Ming Chen3 2.Understanding jumps in high frequency digital asset markets-Danial Saef, Odett Nagy, Sergej Sizov, Wolfgang Karl Härdle 3.Price discovery in bitcoin spot or futures?- Dirk G. Baur,Thomas Dimpfl 4.幣安BTC/USD: https://www.binance.com/zh-TC/futures/BTCUSDT