2017年1月25日 星期三

[深度學習練習] [Deep Learning Practice] 神經網路入門(六)- 卷積神經網路 X 台指

這個專案,我覺得比起之前都要好玩太多,

因為我們將引用外部資料,自己決定資料長相以及要學習的事情,

這才是機器學習最有趣的地方!

------------------------------------------------------------------------------------------------------------

一、文獻回顧

在開始寫程式碼之前,還是要先了解一下,我們想要做什麼,

想要機器學什麽以及要怎麼讓他學。

回顧一下期貨的玩法,我們只需要預測漲跌、振幅、多空籌碼這樣,

就可以賺進大把大把鈔票,但是真的很難。

不知道期貨是什麼的人,可以看一下這一篇

了解期貨是什麼後,

我們還是先一起看看別人把 CNN 和股票預測結合在一起的時候,

都是怎麼做的。


這一篇講得很好,大概讓我有如何用 Neural Network 來學習投資的概念。

再看一下第二篇,

Convolutional Networks for Stock Trading

這是一個 Standford CS 的人做的 CNN 模型,

他用了兩種方法,第一種是以 x 當時間軸畫出隨時間改變的高低股價圖形

這一個很戳,他結果也戳,太多無用的資訊在圖片裡面。

第二種是單純把數值資料圖像化成簡單的幾何圖形讓 CNN model 學習

我當時覺得這個想法不錯,便把他的想法做衍伸,動手做下去,

現在再回頭看,當初真的是被這個史丹佛哥給騙了,這方法理論上就走不過去。

但是他在最後一段,留了一句很受用的話,

Lastly, it remains to be seen whether image features are best. Naturally we could feed historical price, volume, cor- relation, or any other data into a neural network directly, instead of encoding it as an image. This would get the data into the network more directly than via the circuitous route that the current implementation takes. 

當我們有一堆數值的時候,為什麼要轉成圖像不直接給其他種 model 學呢?

這一段話我基本上是沒看到,所以我當初也一股腦做下去了,如果可以重來,

我會好好地思考,要處理的問題是否一定藉由圖像來學習會比較好?(這留到最後討論)

------------------------------------------------------------------------------------------------------------

二、決定資料的長相以及要預測的事情

回到我們被史丹佛哥給騙的時候,

我們一樣想要預測明天的漲或跌,漲代表 1 跌代表 0,

很好,n_classes = 2 已經出來。

再來我 input 要是什麼呢?

我當初猜想,一個月大概有 20 個交易日,我們就把過去 20 天的幾個特徵資訊,

都放到一張圖片裡面,然後讓 CNN model 去學習怎麼看圖就知道漲跌!

------------------------------------------------------------------------------------------------------------

這邊插個話,這次小專案,比較大一點,我們會有兩個文件檔和一份資料檔,

大家可以先把資料夾以及資料檔案建好,

dl_cnn_tx
       |--- CNN_model.py
       |--- data_processing.py
       |--- txfuture_updated.pickle

Github 連結在這裡

------------------------------------------------------------------------------------------------------------

三、獲取資料

決定好輸入輸出,我們就可以去找資料了,

這邊跳過爬取台指資料以及儲存成 pickle 檔的步驟,

有興趣的可以看這篇教學

不然也可以直接從 git 上面抓下已經整理好的資料,再做更新就可以。

python 2.7 - Link

好!資料都爬好存好以後,

我們打開 data_processing.py,在裡面輸入以下,

import pickle
import numpy as np
import pandas as pd
from datetime import date
import random
from sklearn import preprocessing
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

def get_rawdata():

    # 載入資料
    pickle_in = open('txfuture_updated.pickle', 'rb')
    df = pickle.load(pickle_in)

    # 把漲跌標籤加進去資料裡面
    labels = []
    for i in range(len(df.index)):

        # 結算價高於開盤就是漲,反之為跌
        if df['settlement'][i] > df['open'][i]:
            labels.append([1,0])
        else:
            labels.append([0,1])

    df['label'] = pd.Series(labels, index= df.index)
    df['close_adjusted'] = df['close']
    df['close_adjusted'].fillna(df['settlement'], inplace=True)

    return (df)

就這樣!我們已經有整理好的資料了 :) 可以自己 print 看看。

------------------------------------------------------------------------------------------------------------

四、資料亂數處理

再來我們還要有一個方法,可以把我們輸入的資料,以一天為單位打散

為什麼要這樣呢?

如同在機器學習的時候一樣,

我們希望每次選擇到的學習資料與預測資料是跨時間且隨機的

這樣才不會有 bias。

def sample_suffling(sample_x, sample_y, length = 20):

    featureset = []

    sample_length = len(sample_x)-length

    # 將 20 天的資料與標籤結合
    for i in range(sample_length):
        sample_x_chunk = np.array(sample_x[i:i+length])
        min_max_scaler = preprocessing.MinMaxScaler()
        sample_x_chunk = min_max_scaler.fit_transform(sample_x_chunk)
        featureset.append([sample_x_chunk,sample_y[i+length]])

    # 將結合玩的資料組亂數
    random.shuffle(featureset)

    return featureset

這個步驟做的事情,有點抽象,還有使用的 scaler 也是精心挑選,

希望大家有看懂。

------------------------------------------------------------------------------------------------------------

五、資料視覺化

再來就是資料處理中的重頭戲,我們去把資料轉換成圖像。

def sample_visualizing(sample_x):
    picture_array = []

    # 將亂數好的 sample_x 整理成一張新的圖片
    for i in range(len(sample_x)):
        picture = []
        sample_x[i] = np.transpose(sample_x[i])


        for j in range(len(sample_x[i])):
            pictureline = []


            for k in range(len(sample_x[i][j])):
                append_pt = [sample_x[i][j][k],sample_x[i][j][k],sample_x[i][j][k]]
                pictureline.append(append_pt)
            picture.append(pictureline)
        #plt.imshow(picture)
        #plt.show()
        picture_array.append(picture)
    return (picture_array)

這邊比較複雜一點,

k 是負責圖片中的某一行,

j 負責把每一行組合在一起變成一張圖片,

i 負責把每一張圖片組合在一起,變成到時候要被拿來訓練的圖片。

經過這邊,我們已經有一組可以產生像 mnist 圖片資料的方法了!

下一集,會把這三個方法串在一起,並且讓大家看看自己的資料長什麼樣子。

------------------------------------------------------------------------------------------------------------

Reference

[1] Practical Machine Learning Problem

[2] 圖解機器學習

[3] Coursera - Machine Leanring 

[4] A tour of machine learning algorithms

5 則留言:

  1. 您好,請問參數如何透過Deep Learning動態最佳化呢?
    另外我有很多台指期features想跟您討論,謝謝

    回覆刪除
    回覆
    1. 請問你指的參數動態最佳化是指說,選出最好的參數嗎?
      關於討論可以寄信給我 (y)

      刪除
    2. Hi~ sorry to bother again
      is your gmail address
      khanlee@gmail.com ?

      刪除
  2. 作者已經移除這則留言。

    回覆刪除