TShopping

 找回密碼
 註冊
搜索
查看: 342|回復: 0

[教學] 利用LSTM Finmind 分析台灣股票 (以台積電2330為例)

[複製鏈接]
發表於 2021-7-2 09:55:58 | 顯示全部樓層 |閱讀模式
 
Push to Facebook Push to Plurk  
FinMind 是超過 50 種金融開源數據 50 datasets。 包含
  • 技術面 : 台股股價 daily、即時報價、歷史 tick、即時最佳五檔、PER、PBR、每5秒委託成交統計、加權指數、當日沖銷交易標的及成交量值。
  • 基本面 : 綜合損益表、現金流量表、資產負債表、股利政策表、除權除息結果表、月營收。
  • 籌碼面 : 外資持股、股權分散表、融資融券、三大法人買賣、借券成交明細。
  • 消息面 : 台股相關新聞。
  • 衍生性商品 : 期貨、選擇權 daily data、即時報價、交易明細,選擇權、期貨三大法人買賣,期貨各卷商每日交易、選擇權各卷商每日交易。
  • 國際市場 : 美股股價 daily、minute、美國債券殖利率、貨幣發行量(美國)、黃金價格、原油價格、G8 央行利率、G8 匯率、

資料每天更新。你不需收集資料,就可進行分析。

首先先導入套件
接著我們可以使用FinMind的功能取得股價,這次我們嘗試的就是這個月股價不斷創高、台灣人稱外資控盤工具的 台積電(2330-TW), 選用的資料從2018-01-01開始

我們可以取得的資料有
  • Trading_Volume(成交量)
  • Trading_money(成交金額)
  • Trading_turnover(周轉率):週轉率高代表股票交易越活絡
  • close(收盤價)
  • date(日期)
  • max(當日最高價)
  • min(當日最低價)
  • open(開盤價)
  • spread(震幅)
  • stock_id(股票代碼)

Finmind,金融資料,股票,Python,LSTM

Finmind,金融資料,股票,Python,LSTM

plt可以透過這個來進行視覺化

代碼
  1. import pandas as pd
  2. import numpy as np
  3. import matplotlib.pyplot as plt

  4. #2330:TSMC
  5. from FinMind.data import DataLoader
  6. dl=DataLoader()
  7. data = dl.taiwan_stock_daily_adj("2330", "2018-01-01", "2021-07-02")
  8. #print(data)
  9. # 繪製k線圖

  10. fig=plt.figure(figsize=(20,8))
  11. plt.xticks(rotation = 90)
  12. ax1 = fig.add_subplot(111)
  13. ax1.plot(data.close,color='red',label='close')
  14. ax1.plot(data.open,color='green',label='open')
  15. plt.legend()
  16. # twin 為共享x軸
  17. ax2= ax1.twinx()
  18. plt.bar(data.date,data.Trading_Volume.astype('int')//1000)
  19. ax3 = ax1.twinx()
  20. plt.savefig('2330_year.png')
  21. plt.show()
複製代碼

Finmind,金融資料,股票,Python,LSTM

Finmind,金融資料,股票,Python,LSTM

訓練集資料有406筆,而我們只使用開盤價而已
  1. #切分Test集
  2. test = data[data.date>'2019-09-01']
  3. train = data[:len(data)-len(test)]
  4. #只要open high
  5. train_set = train['open']
  6. test_set = test['open']
複製代碼

接著將數據做歸一化(Normalization)
  1. from sklearn.preprocessing import MinMaxScaler
  2. sc = MinMaxScaler(feature_range = (0, 1))
  3. #需將資料做reshape的動作,使其shape為(資料長度,1)
  4. train_set= train_set.values.reshape(-1,1)
  5. training_set_scaled = sc.fit_transform(train_set)
複製代碼


這裡需要特別解釋一下,for迴圈中的10代表著,我們將10天的資料視為一句話(一個序列的意思),因為序列型資料需要這樣子去呈現才行(X_train),而y_train則是用第i天前的資料來預測第i天的股價的意思。
  1. X_train = []
  2. y_train = []
  3. for i in range(10,len(train_set)):
  4.     X_train.append(training_set_scaled[i-10:i-1, 0])
  5.     y_train.append(training_set_scaled[i, 0])
  6. X_train, y_train = np.array(X_train), np.array(y_train)
  7. X_train = np.reshape(X_train,(X_train.shape[0], X_train.shape[1], 1))
  8. print("X_train.shape",X_train.shape)
複製代碼

Finmind,金融資料,股票,Python,LSTM

Finmind,金融資料,股票,Python,LSTM


接著我們建置最簡單的LSTM模型
  1. import keras
  2. from keras.models import Sequential
  3. from keras.layers import Dense
  4. from keras.layers import LSTM
  5. from keras.layers import Dropout,BatchNormalization


  6. keras.backend.clear_session()
  7. regressor = Sequential()
  8. regressor.add(LSTM(units = 100, input_shape = (X_train.shape[1], 1)))
  9. regressor.add(Dense(units = 1))
  10. regressor.compile(optimizer = 'adam', loss = 'mean_squared_error')
複製代碼

Finmind,金融資料,股票,Python,LSTM

Finmind,金融資料,股票,Python,LSTM


我們只使用一層LSTM層,訓練100個epoch,batch_size設為16,並劃出train loss
  1. history = regressor.fit(X_train, y_train, epochs = 100, batch_size = 16)
  2. plt.title('train_loss')
  3. plt.ylabel('loss')
  4. plt.xlabel('Epoch')
  5. plt.plot( history.history["loss"])
  6. plt.show()
複製代碼

Finmind,金融資料,股票,Python,LSTM

Finmind,金融資料,股票,Python,LSTM


接著就到了開獎的時候了,但這裏我們需要稍微處理一下輸入的資料,一樣的邏輯,要預測第i天,就需要第i天前的資料。


  1. dataset_total = pd.concat((train['open'], test['open']), axis = 0)
  2. inputs = dataset_total[len(dataset_total) - len(test) - 10:].values
  3. inputs = inputs.reshape(-1,1)
  4. inputs = sc.transform(inputs)
  5. X_test = []
  6. for i in range(10, len(inputs)):
  7.     X_test.append(inputs[i-10:i-1, 0])
  8. X_test = np.array(X_test)
  9. X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))
  10. predicted_stock_price = regressor.predict(X_test)
  11. #使用sc的 inverse_transform將股價轉為歸一化前
  12. predicted_stock_price = sc.inverse_transform(predicted_stock_price)
複製代碼
劃出預測結果


  1. plt.plot(test['open'].values, color = 'black', label = 'Real TSMC Stock Price')
  2. plt.plot(predicted_stock_price, color = 'green', label = 'Predicted TSMC Stock Price')
  3. plt.title('TATA Stock Price Prediction')
  4. plt.xlabel('Time')
  5. plt.ylabel('Stock Price')
  6. plt.legend()
  7. plt.show()
複製代碼


可以看到我們的預測模型低估了台積電的實力了XD

Finmind,金融資料,股票,Python,LSTM

Finmind,金融資料,股票,Python,LSTM


補充:其他的嘗試
在我們的網路層再加一層後(中間用dropout,防止過擬合),再來看一次結果

Finmind,金融資料,股票,Python,LSTM

Finmind,金融資料,股票,Python,LSTM

Finmind,金融資料,股票,Python,LSTM

Finmind,金融資料,股票,Python,LSTM
XD結果看差多了


參考文章
https://awesomeopensource.com/project/FinMind/FinMind
https://wenwender.wordpress.com/ ... %E8%82%A1%E7%A5%A8/



 

臉書網友討論
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2021-9-21 07:34 , Processed in 0.199132 second(s), 23 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表