2016年9月9日 星期五

[機器學習練習] [Machine Learning Practice] 用 Scikit 學習台灣指數趨勢(六)- TRAINING

上一集中,我們處理完資料獲得了技術分析的特徵,

KD 以及 均線,現在我們要丟給機器學習,

然後預測漲跌了!!

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

Step 8 : TRAINING

在訓練之前呢,我一樣習慣看看到底特徵們都長怎樣,

也可以確定說,這筆特徵經過剛剛的處理後,是否有不合理的地方。

所以我們打開 twfuture.py 檔案,繼續加入以下程式碼,

style.use('fivethirtyeight')

ax1 = plt.subplot2grid((2,1),(0,0))
ax2 = plt.subplot2grid((2,1),(1,0), sharex= ax1)
df[['close','close_mvag5', 'close_mvag20']].plot(ax= ax1, linewidth=3, color=['k','r','b'])


df[['RSV','K9','D9']].plot(ax= ax2, linewidth=3, color=['r','g','b'])
plt.show()

儲存後,在終端機輸入

 python twfuture.py

應該會看到這個























上面是台股指數從 1999 年到今天的每日收盤價,黑紅藍分別為,日線、週線、月線。

可以明顯看出,2000 年科技泡沫和 2008 年金融海嘯對台股的影響。

圖下方為 RSV 以及 K9 and D9,值都在 0 ~ 100 之間,把下圖拉近看看,











可以發現,藍線是最平滑的,綠線次之,紅線最後,

符合 z-transform 後,判斷為低通濾波關係之理解。

到這邊,就確定我們的特徵資料都沒問題,可以丟去餵給機器了!

我們把 plt.show() comment out。

在底下繼續加入以下程式碼,

df = df.loc[date(2000,1,1):date(2015,12,31)]

labels = []

for i in range(len(df.index)):
    if df['open'][i] < df['settlement'][i]:
        labels.append(1)
    else:
        labels.append(0)

df['labels'] = pd.Series(labels, index= df.index)

X = np.array(df[['y_K9','y_D9'
,'y_close_mvag5','y_close_mvag20']])
X = preprocessing.scale(X)
y = np.array(df['labels'])


X_train, X_test, y_train, y_test = cross_validation.train_test_split(X,y,test_size=0.2)


clf = neighbors.KNeighborsClassifier()


clf.fit(X_train, y_train)


accuracy = clf.score(X_test, y_test)

print ('accuracy', accuracy)

這邊呢,我們匯入 2000 ~ 2015 的資料給機器做學習

給的 Label 呢,就是當天的漲跌,

我們就定義最後成交價 > 開盤價為 1(漲),最後成交價 < 開盤價為 0(跌)

然後匯入昨天的 'y_K9','y_D9','y_close_mvag5','y_close_mvag20' 當作特徵。

一樣在終端機輸入,就可以看到你的 accuracy 了!

 python twfuture.py

看到了嗎?

我想你應該沒看錯,大概就是 0.5 ~ 0.55 左右的命中率,

如果低於 0.5 代表你的機器真的很笨,哈哈哈哈!



你可能會想說,那跟丟銅板不是差不多嗎?

對。



但是都做到這邊了,能怎麼辦?

就只好繼續完成剩下的步驟,再來檢討到底出了什麼問題。

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

Step 9 : BACKTEST

通常一般公司,跑回測就是給他跑個十幾年

我們現在也要寫一套程式碼,來回測我們的機器,

寫回測方法之前,我們先加上以下程式碼做準備。

# 做多的賺賠 = 收盤最佳買價 - 開盤價
df['long'] = df['close_best_bid'] - df['open']


# 做空的賺賠 = 開盤價 - 收盤最佳賣價
df['short'] = df['open'] - df['close_best_ask']


作多的時候,就是因為機器預測指數漲,

所以我們把 close_best_bid - open,做空則反之。

準備好這個,就可以開始寫回測的方法,

因為太長,所以我放到下一集。

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

Reference
[1] 期貨 wikipedia

[2] 股票指數 wikipedia

[3] 台灣期貨交易所, http://www.taifex.com.tw/

[4] Codecademy, https://www.codecademy.com/

[5] A beautiful soup, https://www.crummy.com/software/BeautifulSoup/bs4/doc/

[6] Pickle, https://docs.python.org/2/library/pickle.html

[7] Scikit-Learn, http://machine-learning-python.kspax.io

[8] Scikit-Learn, http://scikit-learn.org/stable/

[9] INVESTOPEDIA, http://investopedia.com

[10] Wikiwand, http://www.wikiwand.com/

[11] z-transform, https://zh.wikipedia.org/wiki/Z轉換

下一集:

[機器學習練習] [Machine Learning Practice] 用 Scikit 學習台灣指數趨勢(七)

4 則留言:

  1. 您好想請問為何在執行 df = df.loc[date(2000,1,1):date(2015,12,31)]時會出現TypeError
    找了好久一直找不出原因來

    回覆刪除
  2. 我是用 python 2.7,如果你是用 3.4 建議你把 crawler 那邊重新執行一次,爬一次自己的資料。
    或者是你把 terminal 的訊息貼一下,不然我這樣也不是很了解。

    回覆刪除
    回覆
    1. 成功了!!!最後我在匯入2000 ~ 2015資料上面加入了底下這行
      df.set_index('date', inplace=True)
      似乎是date設成index的時候沒有用inplace的話,dataframe的index不會變,還會是最左邊那排預設值

      刪除
    2. 嗯嗯嗯!pandas 很多方法都有 inplace 這個變數,sort_index, drop, 對於DataFrame做操作的,若將 inplace 設成 True 就是直接在這個 DataFrame 作轉換不會匯出值。

      刪除