姓名:閆偉? 學(xué)號(hào):15020150038
轉(zhuǎn)載自:https://zhuanlan.zhihu.com/p/34772715
【嵌牛導(dǎo)讀】:如果要選幾個(gè) 2017 年最火的流行詞,絕對(duì)有人工智能和虛擬貨幣。英國程序員 David Sheehan 就被比特幣這種顛覆性的技術(shù)以及過山車式的價(jià)格漲跌留下了深刻印象,雖然他自己一個(gè)幣也沒有,但還是想用機(jī)器學(xué)習(xí)技術(shù)預(yù)測(cè)一下比特幣這種虛擬貨幣的價(jià)格。
【嵌牛鼻子】:比特幣 以太坊
【嵌牛提問】:如何利用深度學(xué)習(xí)預(yù)測(cè)比特幣價(jià)格?
【嵌牛正文】:
在我(作者David Sheeran——譯者注)寫這篇文章之前,我到網(wǎng)上搜了搜,發(fā)現(xiàn)之前有人寫過怎樣用深度學(xué)習(xí)技術(shù)預(yù)測(cè)比特幣價(jià)格,于是我想了想,決定除了比特幣外,也預(yù)測(cè)另一種近來比較火的虛擬貨幣價(jià)格——以太坊,也叫以太幣。
我們會(huì)使用一個(gè)長短期記憶模型(LSTM),它是深度學(xué)習(xí)模型的一種,很適合處理時(shí)序數(shù)據(jù),或者任何有暫時(shí)性、空間性和結(jié)構(gòu)性順序的數(shù)據(jù),比如電影、語句等等。如果你對(duì)這種模型不是很熟悉,我推薦讀一下這篇博客

因?yàn)槲乙蚕胱尣惶畽C(jī)器學(xué)習(xí)的讀者愿意看下去,所以我會(huì)盡量不放大段大段的代碼,請(qǐng)理解一下。要是你也想這么操作一波,我把數(shù)據(jù)和代碼放在了 GitHub上,點(diǎn)擊這里獲取即可
dashee87/blogScripts?github.com

好了,廢話不說,我們開始吧!
獲取數(shù)據(jù)
在我們搭建模型之前,我們需要獲取一些數(shù)據(jù)讓模型學(xué)習(xí)。在 Kaggle 上有個(gè)數(shù)據(jù)集,詳細(xì)記錄了過去幾年比特幣每分鐘的價(jià)格以及其他方面的數(shù)據(jù)(我之前看的那篇預(yù)測(cè)比特幣價(jià)格的教程用的也是這個(gè)數(shù)據(jù)集)。但按照每分鐘的時(shí)間尺度,會(huì)有很多噪聲數(shù)據(jù),所以我們選擇每天的價(jià)格。這樣就會(huì)產(chǎn)生一個(gè)問題:我們可能收集不到足夠的數(shù)據(jù)(不過我們需要幾百行而不是幾百萬行數(shù)據(jù))。
需要強(qiáng)調(diào)的是:深度學(xué)習(xí)中,在嚴(yán)重缺乏數(shù)據(jù)的情況下,沒有模型能取得成功。
我也不想依靠靜態(tài)文件,因?yàn)樵趯碛眯聰?shù)據(jù)更新模型時(shí)它們會(huì)讓更新過程無比復(fù)雜。相反,我們會(huì)從虛擬貨幣網(wǎng)站和 API 中獲取數(shù)據(jù)。
因?yàn)槲覀儠?huì)將兩種虛擬貨幣的價(jià)格混合在一個(gè)模型中,所以從一個(gè)數(shù)據(jù)源中提取數(shù)據(jù)可能是個(gè)好主意。我們會(huì)用到網(wǎng)站coinmarketcap.com當(dāng)前我們只考慮比特幣和以太坊的數(shù)據(jù),但用這種方法再添加別的幣種也不會(huì)太難。在我們導(dǎo)入數(shù)據(jù)前,我們必須加載一些 Python 包,讓工作更容易些。
importpandasaspdimporttimeimportseabornassnsimportmatplotlib.pyplotaspltimportdatetimeimportnumpyasnp# get market info for bitcoin from the start of 2016 to the current daybitcoin_market_info=pd.read_html("https://coinmarketcap.com/currencies/bitcoin/historical-data/?start=20130428&end="+time.strftime("%Y%m%d"))[0]# convert the date string to the correct date formatbitcoin_market_info=bitcoin_market_info.assign(Date=pd.to_datetime(bitcoin_market_info['Date']))# when Volume is equal to '-' convert it to 0bitcoin_market_info.loc[bitcoin_market_info['Volume']=="-",'Volume']=0# convert to intbitcoin_market_info['Volume']=bitcoin_market_info['Volume'].astype('int64')# look at the first few rowsbitcoin_market_info.head()
<img src="https://pic4.zhimg.com/v2-4aba411eae24c0df5b2faedc3888a4b3_b.jpg" data-size="normal" data-rawwidth="1153" data-rawheight="306" class="origin_image zh-lightbox-thumb" width="1153" data-original="https://pic4.zhimg.com/v2-4aba411eae24c0df5b2faedc3888a4b3_r.jpg">

圖表標(biāo)簽:日期-開盤價(jià)-最高價(jià)-最低價(jià)-收盤價(jià)-容量-市值
剛剛發(fā)生了什么呢?我們加載了一些 Python 包,然后導(dǎo)入了coinmarketcap.com上如上所示的這種數(shù)據(jù)表格。稍微清洗一下數(shù)據(jù)后,我們就會(huì)獲得上面這個(gè)比特幣價(jià)格表格。在 URL 里將 bitcoin 換成 ethereum 也能得到以太坊的價(jià)格數(shù)據(jù)。
要想證明數(shù)據(jù)是準(zhǔn)確的,我們可以繪制出兩種貨幣價(jià)格和容量隨著時(shí)間推移的變化情況:
<img src="https://pic3.zhimg.com/v2-24e981ec68160383723c927da6ab4ec2_b.jpg" data-caption="" data-size="normal" data-rawwidth="782" data-rawheight="534" class="origin_image zh-lightbox-thumb" width="782" data-original="https://pic3.zhimg.com/v2-24e981ec68160383723c927da6ab4ec2_r.jpg">

<img src="https://pic3.zhimg.com/v2-f68cab764415b0c0b2e61a9b6b89d006_b.jpg" data-caption="" data-size="normal" data-rawwidth="782" data-rawheight="534" class="origin_image zh-lightbox-thumb" width="782" data-original="https://pic3.zhimg.com/v2-f68cab764415b0c0b2e61a9b6b89d006_r.jpg">

訓(xùn)練,測(cè)試和隨機(jī)游走
我們已經(jīng)獲取了一些數(shù)據(jù),那么我們先在需要一個(gè)模型。在深度學(xué)習(xí)中,數(shù)據(jù)通常被分為訓(xùn)練集和測(cè)試集兩部分。我們用訓(xùn)練集讓模型進(jìn)行學(xué)習(xí),然后用測(cè)試集評(píng)估模型的性能。對(duì)于時(shí)間序列模型,我們一般對(duì)一個(gè)時(shí)間序列進(jìn)行預(yù)測(cè),然后對(duì)另一個(gè)時(shí)間序列進(jìn)行測(cè)試。比如,我把截止日期設(shè)為 2017 年 6 月 1 日,那么就會(huì)用在這個(gè)日期之前的時(shí)間訓(xùn)練模型,用這個(gè)日期之后的數(shù)據(jù)評(píng)估模型。
<img src="https://pic1.zhimg.com/v2-15ef18851b9fbab2ab3d61d563b43748_b.jpg" data-caption="" data-size="normal" data-rawwidth="782" data-rawheight="534" class="origin_image zh-lightbox-thumb" width="782" data-original="https://pic1.zhimg.com/v2-15ef18851b9fbab2ab3d61d563b43748_r.jpg">

你可以看到訓(xùn)練時(shí)間大部分包含虛擬貨幣價(jià)格較低的時(shí)期。這樣,訓(xùn)練數(shù)據(jù)或許無法代表測(cè)試數(shù)據(jù),會(huì)損害模型泛化不可見數(shù)據(jù)的能力(你可以試著讓數(shù)據(jù)更平穩(wěn)些)。但干嘛讓負(fù)面情況礙手礙腳呢?在使用我們的機(jī)器學(xué)習(xí)模型前,有必要討論一個(gè)更簡(jiǎn)單些的模型。最基本的模型就是設(shè)定明天的價(jià)格等于今天的價(jià)格(我們稱之為滯后模型)。我們?cè)跀?shù)學(xué)上以如下方式定義該模型:
<img src="https://pic4.zhimg.com/v2-3bc1450e605b5f9c0ce5417a2de8ac93_b.jpg" data-caption="" data-size="normal" data-rawwidth="538" data-rawheight="89" class="origin_image zh-lightbox-thumb" width="538" data-original="https://pic4.zhimg.com/v2-3bc1450e605b5f9c0ce5417a2de8ac93_r.jpg">

<img src="https://pic1.zhimg.com/v2-15ef18851b9fbab2ab3d61d563b43748_b.jpg" data-caption="" data-size="normal" data-rawwidth="782" data-rawheight="534" class="origin_image zh-lightbox-thumb" width="782" data-original="https://pic1.zhimg.com/v2-15ef18851b9fbab2ab3d61d563b43748_r.jpg">

在互聯(lián)網(wǎng)鏈接分析和金融股票市場(chǎng)中,當(dāng)擴(kuò)展一下這個(gè)簡(jiǎn)單的模型時(shí),通常將價(jià)格當(dāng)做隨機(jī)游走(概念接近于布朗運(yùn)動(dòng),是布朗運(yùn)動(dòng)的理想數(shù)學(xué)狀態(tài)。指任何無規(guī)則行走者所帶的守恒量都各自對(duì)應(yīng)著一個(gè)擴(kuò)散運(yùn)輸定律),那么在數(shù)學(xué)上可以將其進(jìn)行如下定義:
<img src="https://pic2.zhimg.com/v2-67de4ff95d7476bd5f6c3aeafccbd1b5_b.jpg" data-caption="" data-size="normal" data-rawwidth="779" data-rawheight="87" class="origin_image zh-lightbox-thumb" width="779" data-original="https://pic2.zhimg.com/v2-67de4ff95d7476bd5f6c3aeafccbd1b5_r.jpg">

<img src="https://pic4.zhimg.com/v2-9ea8d9cc981a34d14f002e1811c38943_b.jpg" data-caption="" data-size="normal" data-rawwidth="782" data-rawheight="533" class="origin_image zh-lightbox-thumb" width="782" data-original="https://pic4.zhimg.com/v2-9ea8d9cc981a34d14f002e1811c38943_r.jpg">

我們會(huì)從訓(xùn)練集中確定 μ 和 σ,將隨機(jī)游走模型應(yīng)用在比特幣和以太坊的測(cè)試集上。
<img src="https://pic4.zhimg.com/v2-77635657667017776556c205a43d3e3f_b.jpg" data-caption="" data-size="normal" data-rawwidth="782" data-rawheight="533" class="origin_image zh-lightbox-thumb" width="782" data-original="https://pic4.zhimg.com/v2-77635657667017776556c205a43d3e3f_r.jpg">

哇哦!看看這些預(yù)測(cè)線。除了少許部分扭曲,基本上緊貼每個(gè)虛擬貨幣的實(shí)際價(jià)格變動(dòng)情況。模型甚至捕捉到了 6 月中旬和 8 月下旬的暴漲狀況。
然而正如另一篇預(yù)測(cè)比特幣價(jià)格的博客中所說,只在某個(gè)點(diǎn)預(yù)測(cè)未來的模型常常會(huì)讓人誤以為它很準(zhǔn)確,因?yàn)樵诮酉聛淼念A(yù)測(cè)中模型沒有將誤差因素考慮在內(nèi)。不管誤差大小如何,它在每個(gè)時(shí)間點(diǎn)本質(zhì)上會(huì)被重置,因?yàn)檩斎肽P偷氖钦鎸?shí)價(jià)格。比特幣的隨機(jī)游走尤其具有誤導(dǎo)性,因?yàn)?y 軸的值可以很大,這讓預(yù)測(cè)線看起來很平滑。
不幸的是,單點(diǎn)預(yù)測(cè)在評(píng)估時(shí)序模型中相當(dāng)普遍。所以通過多點(diǎn)預(yù)測(cè)衡量模型準(zhǔn)確度是個(gè)更好的做法。這樣以來,之前預(yù)測(cè)的誤差不會(huì)被重置,而是會(huì)被計(jì)算入接下來的預(yù)測(cè)中。這樣,我們?cè)跀?shù)學(xué)上這樣定義:
<img src="https://pic3.zhimg.com/v2-bc7a5a06b99c879c752de3889d8f4102_b.jpg" data-caption="" data-size="normal" data-rawwidth="1017" data-rawheight="77" class="origin_image zh-lightbox-thumb" width="1017" data-original="https://pic3.zhimg.com/v2-bc7a5a06b99c879c752de3889d8f4102_r.jpg">

我們來獲取我們的隨機(jī)游走模型,預(yù)測(cè)整個(gè)測(cè)試集的收盤價(jià)格。
<img src="https://pic4.zhimg.com/v2-87c0f25d1ce622a389a6fa5c2b57ba1b_b.jpg" data-caption="" data-size="normal" data-rawwidth="782" data-rawheight="533" class="origin_image zh-lightbox-thumb" width="782" data-original="https://pic4.zhimg.com/v2-87c0f25d1ce622a389a6fa5c2b57ba1b_r.jpg">

模型的預(yù)測(cè)對(duì)隨機(jī)種子極其敏感。對(duì)于以太坊的預(yù)測(cè),我選了一個(gè)完整的看起來正常的區(qū)間隨機(jī)游走(如下gif圖)。你也可以在 Jupyter Notebook 中處理下面這些隨機(jī)種子值,看看情況有多糟糕。
<img src="https://pic3.zhimg.com/v2-71f742bd44e815c9f92a6288a227ca4a_b.gif" data-caption="" data-size="normal" data-rawwidth="802" data-rawheight="533" data-thumbnail="https://pic3.zhimg.com/v2-71f742bd44e815c9f92a6288a227ca4a_b.jpg" class="origin_image zh-lightbox-thumb" width="802" data-original="https://pic3.zhimg.com/v2-71f742bd44e815c9f92a6288a227ca4a_r.jpg">

注意單點(diǎn)隨機(jī)游走會(huì)一直看似十分準(zhǔn)確,即便背后并無真實(shí)實(shí)體。因此,希望你對(duì)任何博客中預(yù)測(cè)出的貨幣價(jià)格都保持懷疑態(tài)度。想買虛擬貨幣的朋友別被市場(chǎng)預(yù)測(cè)報(bào)告給輕易忽悠了。
長短期記憶模型(LSTM)
在前文說過,我們會(huì)用到長短期記憶模型。但我們沒必要從頭開始自己搭建一個(gè)模型,現(xiàn)在有不少應(yīng)用了多種深度學(xué)習(xí)算法的開源框架可供我們使用(比如 TensorFlow,Keras,PyTorch等)。我選的是 Keras,因?yàn)槲野l(fā)現(xiàn)它很適合像我這種水平不牛的人。
如果你對(duì) Keras 不熟悉,可以看看我寫的這篇教程,或者其他人的教程都行。
Another Keras Tutorial For Neural Network Beginners?dashee87.github.io

我創(chuàng)建了一個(gè)新的數(shù)據(jù)框架叫做 model_data。我將移出了之前的一些列(開盤價(jià),每日最高價(jià)和最低價(jià)),重新表示了一些新列。Close_off_high 代表了當(dāng)天收盤價(jià)和最高價(jià)之間的差額,其中值 -1 和 1 表示當(dāng)天收盤價(jià)分別等于最低價(jià)和最高價(jià)。volatility 列是指被開盤價(jià)分開的最低價(jià)和最高價(jià)的不同。你可能也注意到 model_data 是按照最早時(shí)間到最近時(shí)間的順序排列的。我們實(shí)際上并不需要日期列了,因?yàn)椴恍枰傧蚰P椭休斎脒@項(xiàng)信息。
model_data.head()
<img src="https://pic4.zhimg.com/v2-a4378c70b78b5dfad4ad030f9baf4e27_b.jpg" data-caption="" data-size="normal" data-rawwidth="1284" data-rawheight="463" class="origin_image zh-lightbox-thumb" width="1284" data-original="https://pic4.zhimg.com/v2-a4378c70b78b5dfad4ad030f9baf4e27_r.jpg">

我們的長短期記憶模型會(huì)使用之前的數(shù)據(jù)(比特幣和以太坊的都有)預(yù)測(cè)每種貨幣第二天的收盤價(jià)。我們必須決定模型需要獲取之前多少天的數(shù)據(jù)。
這個(gè)隨意,我選擇的是 10 天,因?yàn)?10 ....... 是個(gè)很好的整數(shù)。我們創(chuàng)建一個(gè)小型數(shù)據(jù)框架,包含連續(xù) 10 天的數(shù)據(jù)(稱為窗口),所以第一個(gè)窗口會(huì)包含訓(xùn)練集的第 0-9 行(Python 是零索引),第二個(gè)窗口是 1-10 行,以此類推。選擇一個(gè)小型窗口意味著我們可以將更多的窗口輸入到模型中。下降趨勢(shì)是指模型可能沒有足夠的信息來檢測(cè)復(fù)雜的長期行為(如果出現(xiàn)這種情況)。
深度學(xué)習(xí)模型不喜歡輸入數(shù)據(jù)大幅變動(dòng)。仔細(xì)看這些數(shù)據(jù)列,一些值介乎 -1 和 1 之間,而其它值則是百萬規(guī)模。我們需要將數(shù)據(jù)正?;晕覀兊妮斎霐?shù)據(jù)比較一致。通常,你會(huì)想讓值在 -1 和 1 之間。Off_high 列和 volatility 列和之前一樣好。對(duì)于剩余的列,和其它人的做法一樣,我們會(huì)將輸入數(shù)據(jù)正常化為窗口中的第一個(gè)值。
<img src="https://pic3.zhimg.com/v2-3f6de62b8591a51e137c088fb2217342_b.jpg" data-caption="" data-size="normal" data-rawwidth="1221" data-rawheight="566" class="origin_image zh-lightbox-thumb" width="1221" data-original="https://pic3.zhimg.com/v2-3f6de62b8591a51e137c088fb2217342_r.jpg">

這個(gè)表格表示我們的長短期記憶模型輸入的一個(gè)例子(我們實(shí)際上有幾百個(gè)類似的表格)。我們已經(jīng)將一些列正?;虼怂鼈兊闹翟诘谝粋€(gè)時(shí)間點(diǎn)都等于 0,所以我們的目標(biāo)是預(yù)測(cè)在該時(shí)間點(diǎn)的價(jià)格變化情況。我們現(xiàn)在準(zhǔn)備好搭建 LSTM 模型了。用 Keras 搭建模型非??焖?,將幾個(gè)部件放在一起就行。我曾詳細(xì)寫了篇教程,可以參考
Another Keras Tutorial For Neural Network Beginners?dashee87.github.io

# import the relevant Keras modulesfromkeras.modelsimportSequentialfromkeras.layersimportActivation,Densefromkeras.layersimportLSTMfromkeras.layersimportDropoutdefbuild_model(inputs,output_size,neurons,activ_func="linear",dropout=0.25,loss="mae",optimizer="adam"):model=Sequential()model.add(LSTM(neurons,input_shape=(inputs.shape[1],inputs.shape[2])))model.add(Dropout(dropout))model.add(Dense(units=output_size))model.add(Activation(activ_func))model.compile(loss=loss,optimizer=optimizer)returnmodel
因而,build_model 函數(shù)構(gòu)建了一個(gè)空的模型(model = Sequential),添加了一個(gè) LSTM 層。為了適應(yīng)我們的輸入(n x m 表格,其中 n 和 m 表示時(shí)間點(diǎn)/行和列的數(shù)值),該 LSTM 層經(jīng)過了調(diào)整。函數(shù)還包含神經(jīng)網(wǎng)絡(luò)的一些特征,如 dropout 和激活函數(shù)等?,F(xiàn)在,我們只需指明放入 LSTM 層中的神經(jīng)元的數(shù)量(我選擇的是 20 個(gè)),以及訓(xùn)練模型用的數(shù)據(jù)數(shù)量。
# random seed for reproducibilitynp.random.seed(202)# initialise model architectureeth_model=build_model(LSTM_training_inputs,output_size=1,neurons=20)# model output is next price normalised to 10th previous closing priceLSTM_training_outputs=(training_set['eth_Close'][window_len:].values/training_set['eth_Close'][:-window_len].values)-1# train model on data# note: eth_history contains information on the training error per epocheth_history=eth_model.fit(LSTM_training_inputs,LSTM_training_outputs,epochs=50,batch_size=1,verbose=2,shuffle=True)#eth_preds = np.loadtxt('eth_preds.txt')
Epoch50/506s-loss:0.0625
現(xiàn)在我們已經(jīng)搭建好了一個(gè)可以預(yù)測(cè)第二天以太坊收盤價(jià)的 LSTM 模型。我們看看它性能如何。我們首先用訓(xùn)練集檢測(cè)它的性能(即 2017 年 6 月之前的數(shù)據(jù))。代碼下方的數(shù)字表示在第 50 次訓(xùn)練迭代(或 epoch)后,模型在訓(xùn)練集上的平均絕對(duì)誤差。我們不看其中的變化了,我們可以看看模型輸出的每天收盤價(jià)。
<img src="https://pic2.zhimg.com/v2-e65d570228e0fdd421c143071912e151_b.jpg" data-caption="" data-size="normal" data-rawwidth="694" data-rawheight="488" class="origin_image zh-lightbox-thumb" width="694" data-original="https://pic2.zhimg.com/v2-e65d570228e0fdd421c143071912e151_r.jpg">

對(duì)于模型如此高的準(zhǔn)確率,我們不應(yīng)感到太驚訝。模型能獲取其誤差的來源,然后自行修正。實(shí)際上,要想實(shí)現(xiàn)幾乎零誤差訓(xùn)練也不是很難。只需添加幾百個(gè)神經(jīng)元訓(xùn)練上幾千個(gè) epoch 就行。我們更感興趣的是模型在測(cè)試集上的表現(xiàn),因?yàn)檫@代表了模型面臨新數(shù)據(jù)時(shí)的預(yù)測(cè)效果。
<img src="https://pic3.zhimg.com/v2-90a37affc47f216fc115bc9ac0fb2ade_b.jpg" data-caption="" data-size="normal" data-rawwidth="694" data-rawheight="489" class="origin_image zh-lightbox-thumb" width="694" data-original="https://pic3.zhimg.com/v2-90a37affc47f216fc115bc9ac0fb2ade_r.jpg">

撇開我們上文說的單點(diǎn)預(yù)測(cè)的誤導(dǎo)性不談,我們搭建的這個(gè) LSTM 模型好像在新數(shù)據(jù)上表現(xiàn)的還不錯(cuò)。最明顯的錯(cuò)誤之處是它沒能檢測(cè)出價(jià)格突然增高后不可避免的要下降的情況(比如 6 月中旬和 10 月)。實(shí)際上,這是個(gè)持續(xù)性的錯(cuò)誤,只是在這些峰值處更加明顯。預(yù)測(cè)的價(jià)格和第二天的價(jià)格基本上一致(例如 7 月中旬的價(jià)格下降)。另外,模型似乎系統(tǒng)性地高估了以太坊的未來價(jià)格,因?yàn)轭A(yù)測(cè)線始終在實(shí)際價(jià)格線的上方。我懷疑這是因?yàn)橛?xùn)練集代表的時(shí)間段正值以太坊價(jià)格飛漲,因此模型預(yù)估這個(gè)趨勢(shì)會(huì)一直持續(xù)。我們也可以針對(duì)比特幣的測(cè)試集,搭建一個(gè)相同的 LSTM 模型預(yù)測(cè)比特幣的價(jià)格,如下圖所示:
<img src="https://pic3.zhimg.com/v2-95d0911469abaf877d1bca25c31792b6_b.jpg" data-caption="" data-size="normal" data-rawwidth="702" data-rawheight="489" class="origin_image zh-lightbox-thumb" width="702" data-original="https://pic3.zhimg.com/v2-95d0911469abaf877d1bca25c31792b6_r.jpg">

點(diǎn)擊這里獲取全部代碼
dashee87/blogScripts?github.com

我前面強(qiáng)調(diào)過,單點(diǎn)預(yù)測(cè)具有誤導(dǎo)性。那么在仔細(xì)看看,你會(huì)注意到預(yù)測(cè)值有規(guī)律地反應(yīng)了之前的值(如 10 月份)。我們的深度學(xué)習(xí) LSTM 模型在部分地方再生了一個(gè)順序?yàn)?p 的自回歸模型,在這些地方,未來的值就是之前 p 值的加權(quán)和。我們可以在數(shù)學(xué)上將自回歸模型進(jìn)行如下定義:
<img src="https://pic3.zhimg.com/v2-ef845556f2a97d4eedbd7453555e9f66_b.jpg" data-caption="" data-size="normal" data-rawwidth="1052" data-rawheight="73" class="origin_image zh-lightbox-thumb" width="1052" data-original="https://pic3.zhimg.com/v2-ef845556f2a97d4eedbd7453555e9f66_r.jpg">

好消息是,時(shí)序任務(wù)通常都會(huì)用到自回歸模型(比如股票預(yù)測(cè)),因此我們搭建的 LSTM 模型存在的這個(gè)問題可以有合理的解決方案。壞消息是 LSTM 能力的一種浪費(fèi),我們本可以用更少的時(shí)間搭建一個(gè)更簡(jiǎn)單的自回歸模型,而且或許能達(dá)到同樣的效果。模型更復(fù)雜并不等于有更高的準(zhǔn)確率。
<img src="https://pic1.zhimg.com/v2-4291529f880a494b6084f74437867210_b.jpg" data-caption="" data-size="normal" data-rawwidth="782" data-rawheight="534" class="origin_image zh-lightbox-thumb" width="782" data-original="https://pic1.zhimg.com/v2-4291529f880a494b6084f74437867210_r.jpg">

這樣以來模型的預(yù)測(cè)很明顯不如單點(diǎn)預(yù)測(cè)那么令人滿意(如上圖所示)。但是,我很高興這個(gè)模型返回了一些很細(xì)微的舉動(dòng)(例如以太坊這張圖的第二條線)。模型沒有簡(jiǎn)單地預(yù)測(cè)價(jià)格朝同一個(gè)方向發(fā)展,所以我們有理由對(duì)模型持樂觀態(tài)度。
再回到單點(diǎn)預(yù)測(cè)部分,我們的深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)看起來還不錯(cuò),但是無聊的隨機(jī)游走模型也很棒。和隨機(jī)游走模型一樣,LSTM 模型對(duì)選擇的隨機(jī)種子非常敏感(模型權(quán)重開始時(shí)隨機(jī)設(shè)置)。所以,如果我們想比較這兩個(gè)模型的話,我們可以讓每個(gè)模型運(yùn)行多次,比如 25 次,對(duì)模型誤差有個(gè)估計(jì)。這個(gè)誤差可以計(jì)算為測(cè)試集中實(shí)際收盤價(jià)和預(yù)測(cè)收盤價(jià)之間的差額。
<img src="https://pic4.zhimg.com/v2-6eebed2f1594d90818d557e58f6d8653_b.jpg" data-caption="" data-size="normal" data-rawwidth="698" data-rawheight="488" class="origin_image zh-lightbox-thumb" width="698" data-original="https://pic4.zhimg.com/v2-6eebed2f1594d90818d557e58f6d8653_r.jpg">

或許 AI 還是值得夸獎(jiǎng)一番的??!這些圖標(biāo)顯示了每個(gè)模型迭代 25 次后,在測(cè)試集上的誤差。LSTM 模型對(duì)比特幣和以太坊的預(yù)測(cè)誤差分別為4%和5%,徹底碾壓隨機(jī)游走模型。
只想打敗隨機(jī)游走模型太 low 了。我們可以將 LSTM 模型和更多的時(shí)序模型進(jìn)行比較。比如自回歸模型,ARIMA,加權(quán)平均法等。這個(gè)任務(wù)我們留給以后再做,你也可以自己試試。
再說一下,希望談到用深度學(xué)習(xí)預(yù)測(cè)虛擬貨幣價(jià)格時(shí),大家都能保持一個(gè)懷疑的態(tài)度,因?yàn)榧夹g(shù)并不是完美的。
總結(jié)
我們收集了一些虛擬貨幣的數(shù)據(jù),將其輸入一個(gè)超酷的長短期記憶模型中。不幸的是,模型的預(yù)測(cè)幾乎只是重復(fù)之前的值。我們?cè)鯓幽茏屇P透晟菩┠?
改變損失函數(shù):平均絕對(duì)誤差并不真的鼓勵(lì)我們?nèi)ッ半U(xiǎn)。例如,在絕對(duì)平方誤差情況下,LSTM 模型會(huì)被迫將檢測(cè)峰值視為更重要的事情。而且,更適合模型的損失函數(shù)會(huì)讓模型不再那么保守。
抑制過于保守的自回歸模型:這能激勵(lì)深度學(xué)習(xí)算法去探索更有趣或更冒險(xiǎn)的模型。這一步說起來容易,做起來難!
獲取更多更好的數(shù)據(jù):即便靠單單過去的價(jià)格就能很好地預(yù)測(cè)未來價(jià)格,我們還可以添加其它一些能提升模型預(yù)測(cè)能力的數(shù)據(jù)特征。這樣,LSTM 模型就不必只依賴過去的價(jià)格數(shù)據(jù)了,可能還能解鎖更復(fù)雜的功能的。這一步可能是最值得嘗試但也最難的部分。
如果你想自己從頭創(chuàng)建一個(gè) LSTM 模型,可這里獲取所有 Python 代碼
dashee87/blogScripts?github.com
