LSTM神經網絡到底能否進行(線性預測)股票預測(代碼解釋)

          最近有人一直在問我,LSTM到底能不能進行股票預測,那麼多人寫代碼進行預測股票,爲何沒有具體去應用購買。LSTM方法到底能否進行精準的線性預測。針對LSTM預測問題的解決,我將從股票預測和線性預測問題(例如:PM2.5預測,交通流量預測)的解決去概述目前網上一些代碼的思路(這只是個人的一些見解,如有問題請留言指出)

目錄

股票預測問題:

線性預測問題:

總結:


股票預測問題:

        總結目前進行股票預測問題的代碼可以發現,針對股票預測一共有兩種類型的預測方法(或者說兩種不同的預測問題去採用LSTM進行解決)。 

        一種就是採用開盤價、成交量等相關特徵去預測收盤價(也叫多變量時間序列預測),數據和預測結果如圖所示:

              

           這是我從網上隨意找的數據類型,也是我最初開始學習LSTM股票預測最先接觸的方法和數據類型。利用高維度特徵進行股票預測當然具有高準確率(從理論上講),但是該方法仍舊準確誤差。目前在解決此類數據集進行收盤價預測的時候,大家往往採用兩種方法進行構建輸入特徵變量和預測標籤,爲了方便大家理解,我繪製瞭如下圖的形式:(比如用三天的數據去預測第四天的收盤價格)

                                                                

                         

       上述通過動態構建特徵的方法就是常說的滑動窗口。即是利用歷史數據特徵去預測未來的標籤輸出。當然這種方法只能通過歷史數據往前預測一天的輸出。構建此類型數據常用的方式代碼可以描述爲:

def multivariate_data(dataset, target, start_index, end_index, history_size,target_size, step, single_step=False):
  data = []
  labels = []
  start_index = start_index + history_size
  if end_index is None:
    end_index = len(dataset) - target_size
  for i in range(start_index, end_index):
    indices = range(i-history_size, i, step)
    data.append(dataset[indices])
    if single_step:
      labels.append(target[i+target_size])
    else:
      labels.append(target[i:i+target_size])
  return np.array(data), np.array(labels)

      另一種就是基於股票的收盤價格進行線性預測未來價格趨勢(也叫預測單變量時間序列)。例如,我隨意收集了一批數據,其歸一化後的樣式如圖所示,在該圖上我畫出瞭如何構建輸入特徵變量和預測標籤。

                                                                         

         即是使用一個特徵去訓練模型,並再次使用該訓練好的模型爲該未來值做出預測。構造該特徵也常採用滑動窗口的方法進行構造,其實現代碼如:

def univariate_data(dataset, start_index, end_index, history_size, target_size):
  data = []
  labels = []
  start_index = start_index + history_size
  if end_index is None:
    end_index = len(dataset) - target_size
  for i in range(start_index, end_index):
    indices = range(i-history_size, i)
    data.append(np.reshape(dataset[indices], (history_size, 1)))
    labels.append(dataset[i+target_size])
  return np.array(data), np.array(labels)

       上述兩種方法進行預測股票只是採用某些歷史數據來學習預測未來的某一天或者可以說預測未來 延遲一天的數據。其輸入數據在進入LSTM神經網絡的結構形式如圖:

                                                 

               真正進行預測的輸出表示結構應該爲這樣的:

                                                 

              到此爲止,已經描述了我所瞭解的股票預測兩種不同的數據類型所構造的輸入形式。從數據輸入形式來看,訓練的模型確實具有股票價格預測的能力,也就是說訓練好的LSTM神經網絡確實能夠進行線性預測,但是,爲何大家在代碼實戰上預測的精準度如此之高,但是到了現實應用中卻不行了呢?我的理解就是股票價格問題包含多種特徵因素影響,比如政治因素、市場環境因素等,這些特徵很難用向量的形式精準的體現出來,因此導致我們訓練的模型不能進行應用。還有一種原因可能是我們基於歷史有限特徵數據進行訓練的模型,會出現過度擬合曆史數據的問題,導致應用不準確等各種原因吧。

線性預測問題:

     根據上述對股票預測問題的討論,我們不難發現LSTM網絡模型確實可以進行線性問題的預測。只需要我們採用所謂的滑動窗口方法進行構造輸入輸出特徵即可。

      但是,如何進行多點預測,也就是說能夠基於給點數據預測未來一段時間的數據值,這就需要我們在輸入特徵構造和模型輸出上做改動。

     例如最後的一層的輸出可以設置爲以下形式:基於多點預測問題(預測未來一段時間數據),我將在具體應用上概述該實現代碼。

                                                     

multi_step_model.add(tf.keras.layers.Dense(72))

總結:

     如果大家對此類預測問題感興趣,也可以根據我的論述進行復現股票預測。如果我前面的理解有問題或者出現錯誤,歡迎大家加Q525894654進行批評指正或者討論交流。如我們所知,股票市場非常動盪,且變化莫測。然而採用深度學習方法進行價格預測肯定具有一定的使用潛力。所以,我們認爲算法模型能夠(並非總是)正確預測股票價格走勢而非具體值(最好是做分類問題)。因此,我猜想基於概率時間序列模型(之前我看過有人提出了概率時間序列模型, probabilistic time-series models)。可能更玄學的方法更能適應股票的預測問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章