tushare实战LSTM实现黄金价格预测
tushare實戰LSTM實現黃金價格預測
文章目錄
- tushare實戰LSTM實現黃金價格預測
- 拉取數據
- 數據預處理
- 訓練模型
- 模型預測及查看效果
- 先看整體情況
- 選取特定的一小段查看
- 結果分析
拉取數據
老樣子,之前tushare實戰分析黃金與美元收益率關系的時候也是這樣,注意: pro_api中的東西是tushare的token
# 導入tushare import tushare as ts # 初始化pro接口 pro = ts.pro_api('xxx')# 拉取數據 df = pro.fx_daily(**{"ts_code": "XAUUSD.FXCM","trade_date": "","start_date": 20160910,"end_date": 20210910,"exchange": "FXCM","limit": "","offset": "" }, fields=["ts_code","trade_date","bid_open","bid_close","bid_high","bid_low","ask_open","ask_close","ask_high","ask_low","tick_qty" ]) print(df) df.set_index('trade_date',inplace=True) df.to_csv('黃金數據2016-9-10至2021-9-10.csv')數據預處理
LSTM模型的核心是用一個序列數據去預測未來的數據,序列數據的構造思路: 構造一個隊列,將每日的數據視為一個個體,當后一個個體進入隊列的時候,就會擠出隊首的個體,然后在每個時刻都‘拍照’記錄下隊列的情況,就可以得到一個三維數據(len, men_day, attribute)其中len是序列的個數,假設數據集中有100條數據,我們將5天作為一個序列,那么就會有100-5+1=96個序列,men_day就是那個5天的5,表示序列的長度,attribute則是原數據的協變量(就是數據的特征);
了解了輸入數據后,我們就要處理輸出數據,假設我們想用截止到今天的數據去預測未來五天的價格,那么構造訓練集的時候,就要將價格數據作為標簽,向前shift5天;也就是在一條數據中,除了那些他原本就有的數據,還會多一個5天之后的價格。按照這個思路,寫出數據預處理函數,其中deque表示的就是那個隊列
mem_his_days就是序列的長度,pre_days就是預測未來幾天的價格
def Stock_Price_LSTM_Data_Precesing(df,mem_his_days,pre_days):df.dropna(inplace=True)df.sort_index(inplace=True)df.drop(columns='ts_code',inplace=True)# 將ask_open向前移動了pre_days天df['label'] = df['ask_open'].shift(-pre_days)from sklearn.preprocessing import StandardScalerscaler = StandardScaler()sca_X = scaler.fit_transform(df.iloc[:,:-1])from collections import dequedeq = deque(maxlen=mem_his_days)X = []for i in sca_X:deq.append(list(i))if len(deq)==mem_his_days:X.append(list(deq))X_lately = X[-pre_days:]X = X[:-pre_days]y = df['label'].values[mem_his_days-1:-pre_days]import numpy as npX = np.array(X)y = np.array(y)return X,y,X_lately訓練模型
終于到我們熟悉的調參環節,我調了好一會兒,最終選定的是mem_days、Lstm層數、隱藏層數、隱層神經元個數分別是5、3、2、64,朋友們也可以自己取調一調
pre_days = 5 # mem_days = [5,10,15] # lstm_layers = [1,2] # dense_layers = [1,2,3] # units = [16,32] mem_days = [5] lstm_layers = [3] dense_layers = [2] units = [64] from tensorflow.keras.callbacks import ModelCheckpoint for the_mem_days in mem_days:for the_lstm_layers in lstm_layers:for the_dense_layers in dense_layers:for the_units in units:filepath = './models_only_problem/{val_mape:.2f}_{epoch:02d}_'+f'men_{the_mem_days}_lstm_{the_lstm_layers}_dense_{the_dense_layers}_unit_{the_units}'checkpoint = ModelCheckpoint(filepath=filepath,save_weights_only=False,monitor='val_mape',mode='min',save_best_only=True)X,y,X_lately = Stock_Price_LSTM_Data_Precesing(golden,the_mem_days,pre_days)from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X,y,shuffle=False,test_size=0.1)from tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import LSTM, Dense, Dropoutmodel = Sequential()model.add(LSTM(the_units,input_shape=X.shape[1:],activation='relu',return_sequences=True))model.add(Dropout(0.1))for i in range(the_lstm_layers):model.add(LSTM(the_units,activation='relu',return_sequences=True))model.add(Dropout(0.1))model.add(LSTM(the_units,activation='relu'))model.add(Dropout(0.1))for i in range(the_dense_layers):model.add(Dense(the_units,activation='relu'))model.add(Dropout(0.1))model.add(Dense(1))model.compile(optimizer='adam',loss='mse',metrics=['mape'])model.fit(X_train,y_train,batch_size=32,epochs=50,validation_data=(X_test,y_test),callbacks=[checkpoint])模型會被保存在models_only_problem文件夾下,第一個數值表示的就是預測的精度,越小越好,后面跟的就是那些超參數的值,只要找到前面數值最小的那些超參數的值,固定這些超參數即可,我的mape數值最小是1.66
模型預測及查看效果
將剛才訓練好的最好的模型拿下來,加載模型,把需要預測的數據扔進去
先看整體情況
from tensorflow.keras.models import load_model import matplotlib.pyplot as plt best_model = load_model('./models_only_problem/1.66_28_men_5_lstm_3_dense_2_unit_64')pre = best_model.predict(X) print(len(pre)) plt.plot(y,color='red',label='price') plt.plot(pre,color='green',label='predict') plt.show()選取特定的一小段查看
x_time1 = y[200:300] pre_time1 = pre[200:300] plt.plot(x_time1,color='red',label='price') plt.plot(pre_time1,color='green',label='predict') plt.legend() plt.show()結果分析
從總體上看,LSTM的擬合效果還是不錯的,可是在一個較短的時間內,預測數據竟然滯后于實際價格,這有可能帶來投資的偏差,一種可行的辦法就是,在數據中加入更多的屬性,數據的質量決定了最終神經網絡預測的質量
總結
以上是生活随笔為你收集整理的tushare实战LSTM实现黄金价格预测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汽车价格预测回归分析模型
- 下一篇: 机器学习项目实战(五) 住房价格预测