利用CNN對股票「圖片」進行漲跌分類——一次嘗試

寬邦科技發表於2019-01-23

摘要:本文嘗試用CNN對股票圖片進行了一個漲跌分類,並在文末附上實現程式碼,為大家提供一個新的思路,大家可以直接點選文末連結,前往BigQuant人工智慧量化投資平臺直接進行實現。

首先解釋一下標題:

  • CNN卷積神經網路(Convolutional Neural Network), 在影象處理方面有出色表現,不是被川普怒懟的那個新聞網站;
  • 股票漲跌:大家都懂的,呵呵;
  • 股票圖片:既然使用CNN,那麼如果輸入資料是股票某個週期的K線圖片就太好了。當然,本文中使用的圖片並不是在看盤軟體上一張一張截下來的,而是利用OHLC資料“畫”出來的;
  • 嘗試:這個詞委婉一點說就是“一個很好的想法",比較直白的說法是“沒啥效果T_T”。

進入正題:
首先是畫出圖片。本文目前是仿照柱線圖畫的。

利用CNN對股票「圖片」進行漲跌分類——一次嘗試

大致的想法是:

  1. 對每個樣本,將32time_steps×4features(OHLC)資料歸一化處理,即所有取值均在[0,1]之間;
  2. 構建一個128×128畫素的全0陣列,將[0,1]區間等分為128份,分到每列的128個畫素點上;
  3. 然後使用每四列構建一根K線(前三列畫柱狀線,第四列作為間隔行):第一列描繪開盤價,開盤價與該列的哪個畫素點最近,那麼這個畫素點取值就由0變為1;第二列描繪高低價區間,將 最高價至 最低價 範圍內的畫素點取值由0變為1;第三列描繪收盤價,收盤價與該列的哪個畫素點最近,那麼這個畫素點取值就由0變為1。

這樣每個樣本就構建了一張由32根K線組成,類似柱線圖的“圖片”,下面是一個樣本畫的一張圖(為了便於觀看,將0替換成空格,將1替換成圓點):

利用CNN對股票「圖片」進行漲跌分類——一次嘗試

其實還蠻像柱線圖的。

測試階段:

  • 原始資料:最終選擇的資料是100只2005年以前上市的股票。1只股票資料太少,全部股票資料又太多,所以 股票三千,我只取一百;“上市時間前於2005年”這個條件 主要考慮在每隻股票上取樣數量不會太少。
  • 生成樣本:每隻股票每32根K線生成一個樣本,每隔8根K線取一次樣。然後按照上述作圖方法將其變成圖片。標籤:若未來五日收益為正,標籤為[1,0],否則,標籤為[0,1]。15年1月1日之前資料用作train和evaluate,之後資料用作test。
  • 構建模型:本文所用模型共5層,先後順序為 卷積層-池化層-卷積層-池化層-全連線層,中間還夾雜了兩個Dropout和一個Flatten,用來防止過擬合和一維化資料,不過由於他們是無權重的,所以沒將他們算作一層。

利用CNN對股票「圖片」進行漲跌分類——一次嘗試

預測效果

在train和evaluate階段,看起來還是不錯的:
利用CNN對股票「圖片」進行漲跌分類——一次嘗試

但是在test階段:

利用CNN對股票「圖片」進行漲跌分類——一次嘗試第一個值是loss,第二個值是準確率,不要看反。。。呵呵

聽說有一種很厲害的操作——去除label不明顯的樣本——可能會提高模型效果。所以本文又對訓練樣本進行了一次篩選,只保留了未來五日收益在最前30%和最後30%的樣本。然後input到模型做訓練。最終test集上效果:

利用CNN對股票「圖片」進行漲跌分類——一次嘗試有(mei)所(sha)改(xiao)善(guo)!

利用CNN對股票「圖片」進行漲跌分類——一次嘗試

問題分析

目前發現的一個問題:一幅圖中被標記的畫素點太少了。下面兩張圖為train-evaluate樣本和test樣本中值為1的畫素點佔總畫素點(128×128=16384)比重的分佈。

利用CNN對股票「圖片」進行漲跌分類——一次嘗試

利用CNN對股票「圖片」進行漲跌分類——一次嘗試

值為1的畫素點佔總畫素點比重平均不到5%,最大的比重也未超過10%。這說明在模型訓練階段有些畫素點對應的weights僅僅被訓練了很少的次數甚至未經訓練,這影響了模型在test資料上的表現。之後可能會針對這一問題做一些改進,以增加每張圖值為1的畫素點佔總畫素點比例

程式碼部分: 

利用CNN對股票“圖片”進行漲跌分類

本文由BigQuant人工智慧量化投資平臺原創推出,版權歸BigQuant所有,轉載請註明出處。 

相關文章