建議先看過上篇 「大數據分析 – LSTM預測比特幣價格曲線(上)」,了解資料集與前處理後,再閱讀此篇文章。
專案目標
計畫將以具時間序列比特幣價格曲線的大數據資料集透過機器學習或深度學習演算法來進行時間序列價格曲線的分群,分類,與迴歸的三種分析來完成分析所需的模型建置、學習和優化。
運用一般機器學習或深度學習的分析流程核心技術如資料集前處理、特徵值之辨識、萃取、轉換與選取來探索和分析比特幣在集中市場美金 7 日報價時間區段間的每小時價格曲線趨勢圖。
實驗過程與方法
第二階段目標
收集比特幣美元報價的歷史資料集和價格關連的市場面、基本面、和消息面三大資料源的資 料集進行資料集的前處理。
將此資料集進行機器學習模型的離線回測模型的建置和優化完成 比特幣 7 日每小時美元報價時間點共 168 點的價格曲線的分群分析。
● 資料前處理(資料日期區間 2020/01/01~2021/12/31)
基本面
建立 CoinPriceLib,透過Crawler技術可以以參數方式(日期區間/時間單位)獲取比特幣實時價格,並針對missing value 作排除處理,並以Close 價格作為模型訓練的特徵值之一。
消息面
透過 Selenium 從幾個比較具有活躍度的網站(LTNNews、cnYESNewsClient, MoneyUdnNewsClient, NewsCrawler, BitCoinComNewsClient, AkiDateTimeUtil)抓取關於比特幣之新聞,並透過人工方式標記該新聞是屬於哪個類別。
市場面
透過 Glassnode 取得加密貨幣在區塊鏈上的相關資訊,與 Yahoo Finance API 查找那斯達克綜合指數、S&P500、VIX(恐慌指數)和GoldAPI查詢目前的黃金&白銀價格波動。
在Glassnode所提供的API資料中是以日為單位,故我們以每日的價格作為基礎,填補至24小時單位點並設定為特徵值(marketcap、hash rate、active addresses、sopr)之一。
在Yahoo Finance API中,我們發現其提供小時資料的服務有區間限制(最多只能抓2年範圍),且NASDAQ、S&P500這些指數的資料是有特定時段的(也就是有開盤時間)並不像比特幣24小時都在動態變化的,故針對這樣的情境產生的Missing value ,我們會以前一天的收盤價格補足至下一個開盤時段來填補滿24個小時點來做處理。至於小時為單位的兩年限制則將用以日為單位來做填補或先存取了2020/01/01~2021/12/31的CSV作為後續訓練用的資料。
建立 GoldAPIClient,作為 GoldAPI.io 的 Client,詢問指定日期的金、銀價格。因為API有相關的使用量限制,加上為了增加速度,有另外做詢問過的日期資料存成CSV的cache機制。
● 市場面特徵值依據:
● 框架實驗:LSTM
陸續嘗試其他模型後,發現LSTM最近獲得越來越多的關注,與傳統的前向神經網路 (feedforward network)不同,LSTM 可以對之前的輸入有選擇的記憶,從而有助於判斷當前的輸入, LSTM的這一特點在處理時序相關的輸入時,有著很大的優勢。
故後續選用LSTM為主要建置模型的演算法。
第一階段模型:以單一特徵值-比特幣價格作未來7天預測
- 設定 Timestep = 60 ,代表過去 60 個點的資訊
- 訓練集與驗證集比例切分 95:5
第二階段模性:加入加密貨幣相關經濟指標、股票市場面等特徵值
- 調整模型時,發現若只參考加密貨幣相關經濟指標,結果會偏離實際趨勢許多
- 同時參照加密貨幣與股票市場面,曲線走勢相對回穩。
- 有對消息面的資料同樣做五大分類的標記,惟最後沒實際加入模型。
第三階段模型調整項目:
- Dropout 擴增為兩層
- 調整LSTM每一層的node數量
- 訓練集與驗證集比例切分 8:2
模型超參數:
batch_size=32, epochs=15,optimizer=’adam’, loss=’mean_squared_error’
● 預測結果:
以下表格紀錄共8次預測的結果:
預測日期區間 | Max Price (USD) | Min Price (USD) | 分群趨勢 |
---|---|---|---|
2022/01/11~2022/01/17 | 45,848.188 | 40,248.17 | 極度樂觀 |
2022/01/07~2022/01/13 | 57,801.293 | 52,981.56 | 持平 |
2022/01/04~2022/01/10 | 60,085.332 | 55,908.324 | 極度悲觀 |
2021/12/31~2022/01/06 | 64,305.39 | 55,798.137 | 相對悲觀 |
2021/12/28~2022/01/03 | 50,665.785 | 45,642.5 | 相對樂觀 |
2021/12/24~2021/12/30 | 49,432.625 | 45,855.74 | 持平 |
2021/12/21~2021/12/27 | 48,195.54 | 44,613.26 | 極度悲觀 |
2021/12/17~2021/12/23 | 51,176.49 | 47,622.598 | 極度悲觀 |
(紅線:實際價格波動 2021/12/17~2022/01/11 ; 藍框:第一階段模型 ;綠框:第二階段模型;橘框:第三階段模型)
參考資料來源
- Cryptodatadownload
Yahoo Finance
sklearn/tslearn
https://www.sktime.org/en/v0.9.0/examples/01_forecasting.html
https://scikit-learn.org/stable/index.html
https://tslearn.readthedocs.io/en/stable/https://towardsdatascience.com/how-to-apply-k-means-clustering-to-time-series-data-28d04a8f7da3
https://github.com/john-science/scipy_con_2019/tree/main/modern_time_series_analysis/
GoldAPI.io
How To Forecast Stock Market Prices in Python
https://www.roelpeters.be/solve-pandas-valueerror-cannot-reindex-from-a-duplicate-axis/
https://www.youtube.com/watch?v=LWZueqlFV8c&t=548s
https://www.youtube.com/watch?v=PuZY9q-aKLw
https://www.youtube.com/watch?v=EDHpfSSD6ZI
https://www.youtube.com/watch?v=ka9OmsaEx54