原文鏈接:tecdat.cn/?p=41850
作為數(shù)據(jù)科學(xué)家,我們深知在瞬息萬變的金融市場(chǎng)中,準(zhǔn)確的預(yù)測(cè)就如同珍貴的寶藏。隨著技術(shù)的不斷發(fā)展,機(jī)器學(xué)習(xí)成為了我們解讀市場(chǎng)趨勢(shì)的有力工具。在眾多機(jī)器學(xué)習(xí)模型中,長(zhǎng)短期記憶網(wǎng)絡(luò)(Long Short-Term Memory, LSTM)因其獨(dú)特的優(yōu)勢(shì)而備受關(guān)注。當(dāng)LSTM與注意力機(jī)制相結(jié)合時(shí),其在分析時(shí)間序列數(shù)據(jù)方面的能力更是得到了顯著提升,尤其適用于像股票價(jià)格這樣的數(shù)據(jù)(點(diǎn)擊文末“閱讀原文”獲取完整代碼、數(shù)據(jù)、文檔)。 本文是我們之前幫助客戶完成的一個(gè)咨詢項(xiàng)目的總結(jié),旨在深入探討LSTM網(wǎng)絡(luò)與注意力機(jī)制的結(jié)合在預(yù)測(cè)蘋果公司(AAPL)股票價(jià)格未來四個(gè)交易日走勢(shì)中的應(yīng)用。我們利用了來自雅虎財(cái)經(jīng)(yfinance)的數(shù)據(jù),對(duì)模型進(jìn)行了構(gòu)建、訓(xùn)練和評(píng)估。通過這一項(xiàng)目,我們希望能夠?yàn)榻鹑谑袌?chǎng)的分析提供一種新的思路和方法。 在這個(gè)過程中,我們使用了Google Colab作為我們的編程環(huán)境,它提供了免費(fèi)的Jupyter notebook環(huán)境和GPU支持,非常適合運(yùn)行深度學(xué)習(xí)模型。我們使用了TensorFlow和Keras庫來構(gòu)建我們的模型,同時(shí)利用yfinance庫獲取蘋果公司的歷史股票價(jià)格數(shù)據(jù)。 通過對(duì)數(shù)據(jù)的預(yù)處理、特征選擇、模型構(gòu)建、訓(xùn)練和評(píng)估,我們最終得到了一個(gè)能夠?qū)μO果公司股票價(jià)格進(jìn)行有效預(yù)測(cè)的模型。同時(shí),我們也對(duì)模型的性能進(jìn)行了詳細(xì)的分析,包括平均絕對(duì)誤差(MAE)和均方根誤差(RMSE)等指標(biāo)。 專題項(xiàng)目文件已分享在交流社群,閱讀原文進(jìn)群和500+行業(yè)人士共同交流和成長(zhǎng)。我們相信,通過這篇文章,讀者能夠?qū)STM網(wǎng)絡(luò)與注意力機(jī)制在股票價(jià)格預(yù)測(cè)中的應(yīng)用有一個(gè)全面的了解,同時(shí)也能夠?yàn)樽约旱难芯亢蛯?shí)踐提供一定的參考。 一、LSTM和注意力機(jī)制在金融建模中的應(yīng)用(一)LSTM網(wǎng)絡(luò)基礎(chǔ)LSTM網(wǎng)絡(luò)是一種特殊的循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN),它能夠長(zhǎng)時(shí)間記住和處理數(shù)據(jù)序列。與傳統(tǒng)的RNN不同,LSTM通過其獨(dú)特的結(jié)構(gòu),包括輸入門、遺忘門和輸出門,能夠有效地解決梯度消失的問題,從而保持長(zhǎng)時(shí)間的信息記憶。在金融市場(chǎng)中,股票價(jià)格不僅受到近期趨勢(shì)的影響,還受到長(zhǎng)期模式的影響。LSTM網(wǎng)絡(luò)能夠很好地捕捉這些時(shí)間依賴關(guān)系,使其成為金融時(shí)間序列分析的理想選擇。 (二)注意力機(jī)制:增強(qiáng)LSTM注意力機(jī)制最初在自然語言處理領(lǐng)域得到廣泛應(yīng)用,現(xiàn)在已經(jīng)擴(kuò)展到包括金融在內(nèi)的多個(gè)領(lǐng)域。其核心概念是:輸入序列的不同部分對(duì)模型的貢獻(xiàn)是不同的。通過讓模型能夠?qū)W⒂谳斎胄蛄械奶囟ú糠?,同時(shí)忽略其他部分,注意力機(jī)制增強(qiáng)了模型對(duì)上下文的理解能力。當(dāng)將注意力機(jī)制融入LSTM網(wǎng)絡(luò)時(shí),模型能夠更加專注于相關(guān)的歷史數(shù)據(jù)點(diǎn),從而提高預(yù)測(cè)的準(zhǔn)確性和細(xì)致程度。 (三)在金融模式預(yù)測(cè)中的相關(guān)性LSTM與注意力機(jī)制的結(jié)合為金融模式預(yù)測(cè)提供了一個(gè)強(qiáng)大的模型。金融市場(chǎng)是一個(gè)復(fù)雜的自適應(yīng)系統(tǒng),受到多種因素的影響,并表現(xiàn)出非線性特征。傳統(tǒng)模型往往難以捕捉這種復(fù)雜性,而LSTM網(wǎng)絡(luò),特別是結(jié)合了注意力機(jī)制的LSTM網(wǎng)絡(luò),能夠更好地揭示這些模式,為未來股票走勢(shì)提供更深入的理解和更準(zhǔn)確的預(yù)測(cè)。
點(diǎn)擊標(biāo)題查閱往期內(nèi)容 二、環(huán)境搭建為了構(gòu)建我們的LSTM模型來預(yù)測(cè)蘋果公司的股票模式。 AI提示詞:在Google Colab環(huán)境中安裝用于股票價(jià)格預(yù)測(cè)模型構(gòu)建的相關(guān)庫,包括tensorflow、keras和yfinance庫,要求安裝過程不顯示多余信息。 !pip install tensorflow -qqq !pip install keras -qqq !pip install yfinance -qqq
這段代碼是在Python環(huán)境(通常是Jupyter Notebook)中使用的,用于安裝三個(gè)Python庫。下面是逐行解釋: 第一行代碼python!pip install tensorflow -qqq
! :在Jupyter Notebook中,! 用于執(zhí)行系統(tǒng)命令,也就是在命令行中運(yùn)行命令。pip install :這是Python的包管理工具 pip 的命令,用于安裝Python庫。tensorflow :這是要安裝的庫的名稱,TensorFlow是一個(gè)開源的機(jī)器學(xué)習(xí)框架,廣泛用于構(gòu)建和訓(xùn)練各種深度學(xué)習(xí)模型。-qqq :這是 pip 命令的一個(gè)參數(shù),用于抑制輸出,即不顯示安裝過程中的詳細(xì)信息,讓安裝過程更安靜。
第二行代碼python!pip install keras -qqq
- 同樣,
! 用于執(zhí)行系統(tǒng)命令,pip install 用于安裝庫。 keras :Keras是一個(gè)高級(jí)神經(jīng)網(wǎng)絡(luò)API,它可以在TensorFlow、Theano等后端上運(yùn)行,提供了簡(jiǎn)單易用的接口來構(gòu)建深度學(xué)習(xí)模型。-qqq
第三行代碼python!pip install yfinance -qqq
! yfinance :這是一個(gè)用于從雅虎財(cái)經(jīng)獲取金融數(shù)據(jù)的Python庫,可以獲取股票、基金等金融產(chǎn)品的歷史數(shù)據(jù)。-qqq
建議如果你已經(jīng)安裝了這些庫,再次運(yùn)行這些代碼會(huì)嘗試重新安裝??梢栽诎惭b前先檢查庫是否已經(jīng)安裝,避免不必要的操作。例如,可以使用以下代碼檢查 tensorflow 是否安裝: pythontry: import tensorflow print("TensorFlow is already installed.") except ImportError: !pip install tensorflow -qqq
安裝完成后,我們可以將這些庫導(dǎo)入到我們的Python環(huán)境中。運(yùn)行以下代碼: AI提示詞:在Python環(huán)境中導(dǎo)入構(gòu)建股票價(jià)格預(yù)測(cè)模型所需的庫,包括tensorflow、keras、yfinance、numpy、pandas和matplotlib.pyplot,并檢查tensorflow的版本。 這段代碼不僅導(dǎo)入了所需的庫,還檢查了TensorFlow的版本,以確保一切都是最新的。 三、數(shù)據(jù)獲取與處理(一)從yfinance獲取數(shù)據(jù)為了分析蘋果公司的股票模式,我們需要?dú)v史股票價(jià)格數(shù)據(jù)。yfinance庫可以幫助我們從雅虎財(cái)經(jīng)獲取這些數(shù)據(jù)。 AI提示詞:使用yfinance庫獲取蘋果公司(AAPL)從2020年1月1日到2024年1月1日的歷史股票價(jià)格數(shù)據(jù),并顯示數(shù)據(jù)的前幾行。 這段腳本獲取了蘋果公司從2020年1月1日到2024年1月1日的每日股票價(jià)格數(shù)據(jù)。你可以根據(jù)自己的需要調(diào)整開始和結(jié)束日期。 (二)數(shù)據(jù)預(yù)處理和特征選擇的重要性獲取數(shù)據(jù)后,數(shù)據(jù)預(yù)處理和特征選擇變得至關(guān)重要。數(shù)據(jù)預(yù)處理包括清理數(shù)據(jù),使其適合模型使用,如處理缺失值、歸一化或縮放數(shù)據(jù),以及可能創(chuàng)建額外的特征,如移動(dòng)平均線或百分比變化,以幫助模型更有效地學(xué)習(xí)。特征選擇則是選擇對(duì)預(yù)測(cè)變量貢獻(xiàn)最大的特征集。對(duì)于股票價(jià)格預(yù)測(cè),通常使用開盤價(jià)、收盤價(jià)、最高價(jià)、最低價(jià)和成交量等特征。選擇提供相關(guān)信息的特征很重要,以防止模型從噪聲中學(xué)習(xí)。 四、數(shù)據(jù)預(yù)處理在構(gòu)建我們的LSTM模型之前,準(zhǔn)備我們的數(shù)據(jù)集是至關(guān)重要的第一步。這部分涵蓋了數(shù)據(jù)預(yù)處理的基本階段,以使從yfinance獲取的蘋果公司股票數(shù)據(jù)適合我們的LSTM模型。 AI提示詞:檢查蘋果公司股票數(shù)據(jù)集中是否存在缺失值,如果存在則使用前向填充的方法進(jìn)行填充,并處理數(shù)據(jù)集中可能存在的異常值。 # 檢查缺失值 aapl_stock_data.isnull().sum() # 填充缺失值(如果有) aapl_stock_data.fillna(method='ffill', inplace=True)
這段代碼主要用于處理股票數(shù)據(jù)中的缺失值,下面為你詳細(xì)解釋: 代碼功能概述這段代碼使用了Python的pandas 庫,對(duì)名為aapl_stock_data 的股票數(shù)據(jù)進(jìn)行缺失值檢查和填充操作。 代碼逐行解釋- 檢查缺失值
pythonaapl_stock_data.isnull().sum()
aapl_stock_data.isnull() :這部分代碼會(huì)對(duì)aapl_stock_data 數(shù)據(jù)框中的每個(gè)元素進(jìn)行檢查,如果元素是缺失值(NaN ),則返回True ,否則返回False 。最終會(huì)得到一個(gè)與原數(shù)據(jù)框形狀相同的布爾型數(shù)據(jù)框。.sum() :對(duì)布爾型數(shù)據(jù)框的每一列進(jìn)行求和操作。由于True 在求和時(shí)會(huì)被當(dāng)作1 ,False 會(huì)被當(dāng)作0 ,所以求和結(jié)果就是每一列中缺失值的數(shù)量。
- 填充缺失值(如果有)
pythonaapl_stock_data.fillna(method='ffill', inplace=True)
fillna() :這是pandas 數(shù)據(jù)框的一個(gè)方法,用于填充缺失值。method='ffill' :表示使用前向填充(forward fill)的方法。即使用缺失值前面的非缺失值來填充當(dāng)前的缺失值。inplace=True :表示直接在原數(shù)據(jù)框aapl_stock_data 上進(jìn)行修改,而不是返回一個(gè)新的數(shù)據(jù)框。
示例假設(shè)aapl_stock_data 是一個(gè)包含股票價(jià)格的數(shù)據(jù)框,如下所示: pythonimport pandas as pd import numpy as np
data = { 'Open': [100, np.nan, 102, 103], 'Close': [101, 102, np.nan, 104] } aapl_stock_data = pd.DataFrame(data)
# 檢查缺失值 print(aapl_stock_data.isnull().sum())
# 填充缺失值 aapl_stock_data.fillna(method='ffill', inplace=True) print(aapl_stock_data)
在這個(gè)示例中,首先創(chuàng)建了一個(gè)包含缺失值的數(shù)據(jù)框,然后檢查缺失值的數(shù)量,最后使用前向填充的方法填充缺失值。 建議- 在使用
inplace=True 時(shí)要謹(jǐn)慎,因?yàn)樗鼤?huì)直接修改原數(shù)據(jù)框,可能會(huì)導(dǎo)致數(shù)據(jù)丟失。如果需要保留原數(shù)據(jù)框,可以將inplace 參數(shù)設(shè)置為``,并將結(jié)果賦值給一個(gè)新的變量。 - 在填充缺失值之前,最好先了解數(shù)據(jù)的特點(diǎn)和缺失值產(chǎn)生的原因,選擇合適的填充方法。
在股票市場(chǎng)數(shù)據(jù)中,各種特征可能都有影響。通常,“開盤價(jià)”、“最高價(jià)”、“最低價(jià)”、“收盤價(jià)”和“成交量”被使用。對(duì)于我們的模型,我們將使用“收盤價(jià)”,但你可以嘗試使用其他特征,如“開盤價(jià)”、“最高價(jià)”、“最低價(jià)”和“成交量”。 歸一化是一種用于將數(shù)據(jù)集中的數(shù)值列的值轉(zhuǎn)換為通用比例的技術(shù),而不會(huì)扭曲值范圍的差異。應(yīng)用最小-最大縮放,這會(huì)將數(shù)據(jù)集縮放,使所有輸入特征都在0和1之間。 AI提示詞:對(duì)蘋果公司股票數(shù)據(jù)的收盤價(jià)進(jìn)行最小-最大縮放,使用sklearn.preprocessing中的MinMaxScaler,將縮放后的數(shù)據(jù)存儲(chǔ)在新的變量中。 五、構(gòu)建LSTM與注意力機(jī)制模型在這一部分,我們將深入構(gòu)建我們的LSTM模型,并添加注意力機(jī)制,專門用于預(yù)測(cè)蘋果公司的股票模式。這需要已經(jīng)在你的Colab環(huán)境中設(shè)置好的TensorFlow和Keras。 AI提示詞:使用Keras構(gòu)建一個(gè)LSTM模型,包含兩個(gè)LSTM層,每層50個(gè)神經(jīng)元,設(shè)置輸入形狀為訓(xùn)練數(shù)據(jù)的相應(yīng)形狀,并且第一層LSTM層返回序列。 在這個(gè)模型中,“units”表示每個(gè)LSTM層中的神經(jīng)元數(shù)量?!皉eturn_sequences=True”在第一層中至關(guān)重要,以確保輸出包含序列,這對(duì)于堆疊LSTM層是必要的。最后一個(gè)LSTM層不返回序列,因?yàn)槲覀冋跒樽⒁饬訙?zhǔn)備數(shù)據(jù)。 AI提示詞:在上述構(gòu)建的LSTM模型基礎(chǔ)上,添加注意力機(jī)制,包括進(jìn)行必要的維度變換操作,如Permute和Reshape,以確保模型結(jié)構(gòu)的兼容性,并添加一個(gè)全連接層和編譯模型。 # 恢復(fù)到原始形狀 model.add(Permute((2, 1))) model.add(Reshape((-1, 50))) # 在最終的全連接層之前添加一個(gè)Flatten層 model.add(tf.keras.layers.Flatten()) # 最終的全連接層 model.add(Dense(1)) # 編譯模型 model.compile(optimizer='adam', loss='mean_squared_error')
這段代碼主要用于構(gòu)建和編譯一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)模型,下面逐步解釋: 1. 恢復(fù)到原始形狀pythonmodel.add(Permute((2, 1))) model.add(Reshape((-1, 50)))
Permute((2, 1)) :Permute 層用于重新排列輸入張量的維度。這里 (2, 1) 表示將輸入張量的第 2 維和第 1 維進(jìn)行交換。例如,如果輸入張量形狀是 (batch_size, dim1, dim2) ,經(jīng)過 Permute((2, 1)) 后,形狀變?yōu)?nbsp;(batch_size, dim2, dim1) 。Reshape((-1, 50)) :Reshape 層用于改變輸入張量的形狀。-1 表示該維度的大小由其他維度自動(dòng)推斷得出,這里將輸入張量重塑為最后一個(gè)維度大小為 50 的形狀。
2. 添加 Flatten 層pythonmodel.add(tf.keras.layers.Flatten())
Flatten 層的作用是將輸入的多維張量展平為一維向量。例如,如果輸入張量形狀是 (batch_size, height, width, channels) ,經(jīng)過 Flatten 層后,形狀變?yōu)?nbsp;(batch_size, height * width * channels) 。這一步通常在全連接層之前使用,因?yàn)槿B接層的輸入需要是一維向量。
3. 最終的全連接層pythonmodel.add(Dense(1))
Dense 層是全連接層,這里 Dense(1) 表示該層有 1 個(gè)神經(jīng)元。全連接層會(huì)將輸入的每個(gè)元素與該層的每個(gè)神經(jīng)元進(jìn)行連接,并進(jìn)行加權(quán)求和,最后通過激活函數(shù)(這里未指定激活函數(shù),默認(rèn)使用線性激活函數(shù))輸出結(jié)果。
4. 編譯模型pythonmodel.compile(optimizer='adam', loss='mean_squared_error')
optimizer='adam' :指定優(yōu)化器為 Adam 。優(yōu)化器用于在訓(xùn)練過程中更新模型的參數(shù),以最小化損失函數(shù)。Adam 是一種常用的優(yōu)化算法,結(jié)合了 AdaGrad 和 RMSProp 的優(yōu)點(diǎn),具有自適應(yīng)學(xué)習(xí)率的特性。loss='mean_squared_error' :指定損失函數(shù)為均方誤差(MSE)。均方誤差是預(yù)測(cè)值與真實(shí)值之間差值的平方的平均值,常用于回歸問題。
建議- 可以考慮在
Dense 層中添加激活函數(shù),根據(jù)具體問題選擇合適的激活函數(shù),例如在回歸問題中可以使用線性激活函數(shù)(默認(rèn)),在分類問題中可以使用 softmax 或 sigmoid 激活函數(shù)。 - 可以添加更多的層來增加模型的復(fù)雜度,提高模型的表達(dá)能力。
這個(gè)自定義層計(jì)算輸入序列的加權(quán)和,使模型能夠更多地關(guān)注某些時(shí)間步。 六、模型訓(xùn)練與評(píng)估現(xiàn)在我們的LSTM模型已經(jīng)構(gòu)建完成,是時(shí)候使用我們準(zhǔn)備好的訓(xùn)練集來訓(xùn)練它了。這個(gè)過程包括將訓(xùn)練數(shù)據(jù)輸入模型,并讓它學(xué)習(xí)進(jìn)行預(yù)測(cè)。 AI提示詞:使用之前準(zhǔn)備好的訓(xùn)練數(shù)據(jù)X_train和y_train對(duì)構(gòu)建好的LSTM模型進(jìn)行訓(xùn)練,設(shè)置訓(xùn)練輪數(shù)為100,批量大小為25,驗(yàn)證集比例為0.2,并返回訓(xùn)練歷史記錄。 在這里,我們訓(xùn)練模型100輪,批量大小為25?!皏alidation_split”參數(shù)保留一部分訓(xùn)練數(shù)據(jù)用于驗(yàn)證,使我們能夠在訓(xùn)練過程中監(jiān)控模型在未見過的數(shù)據(jù)上的性能。 訓(xùn)練模型后,下一步是使用測(cè)試集評(píng)估其性能。這將使我們了解我們的模型在新的、未見過的數(shù)據(jù)上的泛化能力。 AI提示詞:將測(cè)試數(shù)據(jù)X_test和y_test轉(zhuǎn)換為Numpy數(shù)組,并對(duì)X_test進(jìn)行與訓(xùn)練數(shù)據(jù)相同的維度變換,然后使用構(gòu)建好的模型對(duì)測(cè)試數(shù)據(jù)進(jìn)行評(píng)估,計(jì)算并打印測(cè)試損失。 除了損失,其他指標(biāo)可以提供對(duì)模型性能的更多洞察。對(duì)于像我們這樣的回歸任務(wù),常見的指標(biāo)包括平均絕對(duì)誤差(MAE)和均方根誤差(RMSE)。 AI提示詞:使用構(gòu)建好的模型對(duì)測(cè)試數(shù)據(jù)X_test進(jìn)行預(yù)測(cè),然后使用sklearn.metrics中的函數(shù)計(jì)算預(yù)測(cè)結(jié)果y_pred與真實(shí)值y_test之間的平均絕對(duì)誤差和均方根誤差,并打印結(jié)果。 七、預(yù)測(cè)未來股票價(jià)格在訓(xùn)練和評(píng)估了我們的LSTM模型與注意力機(jī)制之后,最后一步是使用它來預(yù)測(cè)蘋果公司股票價(jià)格的未來四個(gè)交易日。 AI提示詞:使用yfinance庫獲取蘋果公司最近60天的股票數(shù)據(jù),選擇收盤價(jià)并進(jìn)行縮放處理,將處理后的數(shù)據(jù)轉(zhuǎn)換為適合模型輸入的格式,然后使用訓(xùn)練好的模型進(jìn)行預(yù)測(cè),并將預(yù)測(cè)結(jié)果轉(zhuǎn)換回原始價(jià)格尺度并打印。 將預(yù)測(cè)值與實(shí)際股票價(jià)格進(jìn)行可視化比較可以非常有洞察力。以下是繪制預(yù)測(cè)股票價(jià)格與實(shí)際數(shù)據(jù)的代碼: AI提示詞:安裝mplfinance庫,使用該庫和matplotlib.pyplot繪制蘋果公司股票的實(shí)際數(shù)據(jù)(使用candle圖),并疊加預(yù)測(cè)數(shù)據(jù)(使用折線圖),設(shè)置圖表標(biāo)題并顯示圖表。 八、結(jié)論在本文我們探索了使用LSTM網(wǎng)絡(luò)與注意力機(jī)制進(jìn)行股票價(jià)格預(yù)測(cè)的復(fù)雜而有趣的任務(wù),特別是針對(duì)蘋果公司的股票。我們?cè)敿?xì)介紹了LSTM捕捉時(shí)間序列數(shù)據(jù)中長(zhǎng)期依賴關(guān)系的能力,以及注意力機(jī)制在關(guān)注相關(guān)數(shù)據(jù)點(diǎn)方面的額外優(yōu)勢(shì)。同時(shí),我們還涵蓋了構(gòu)建、訓(xùn)練和評(píng)估LSTM模型的詳細(xì)過程。 然而,LSTM模型與注意力機(jī)制雖然強(qiáng)大,但也有其局限性。例如,假設(shè)歷史模式將以類似的方式重復(fù)可能會(huì)有問題,特別是在波動(dòng)的市場(chǎng)中。此外,外部因素,如市場(chǎng)新聞和全球事件,未在歷史價(jià)格數(shù)據(jù)中捕獲,可能會(huì)顯著影響股票價(jià)格。 希望本文能為那些有興趣在金融市場(chǎng)中應(yīng)用深度學(xué)習(xí)技術(shù)的人提供一個(gè)起點(diǎn)。鼓勵(lì)持續(xù)的探索和實(shí)驗(yàn),以完善和調(diào)整這些方法,用于更復(fù)雜的應(yīng)用。 本文中分析的完整數(shù)據(jù)、代碼、文檔分享到會(huì)員群,掃描下面二維碼即可加群!
|