利用隨機森林預測股票大盤漲跌

本文僅從實戰角度去觀察,利用機器學習算法中,隨機森林模型預測股票市場指數漲跌的準確率。
適合入門玩家


首先,我們導入所需要的模塊

import numpy as np 
import pandas as pd
import talib as ta  #金融數據計算
import datetime,pickle 
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import mean_absolute_error,mean_squared_error,r2_score,accuracy_score,roc_auc_score
from sklearn.ensemble import RandomForestClassifier #隨機森林分類模型

然後讀取指數數據,這裏所使用的數據爲個人付費購買數據,本文所使用的數據可以從文末聯繫方式獲取。
關於數據,如果僅做ML、DL學習使用,可以選擇量化平臺獲取、tushare接口獲取、爬蟲獲取等方式,但如果是做模擬交易或者實盤交易,請儘量購買券商提供的數據,否則在數據清洗方面,哪怕是團隊也需要耗費大量的人力物力。

with open(r'D:\history_data_22\indexs.pkl','rb') as f:
    index_data = pickle.load(f)

然後將index_data 打印出來,我們可以得到這樣的數據:
code – 指數代碼(string)
date – 日期(int)
open – 開盤價(float)
close – 收盤價(float)
low – 最低價(float)
high – 最高價(float)
vol - 成交量(float)
money – 成交額(float)
這裏寫圖片描述
因爲指數包括了很多,如上證50、滬深300、中證500等等,這裏我們僅用上證指數爲例
所以選擇code代碼爲SH000001的數據

df = index_data[index_data['code'] == "SH000001"]

現在我們添加一些簡單的技術指標

np_close = np.array(df['close'])
diff, dea, macd = ta.MACD(np_close, fastperiod=12, slowperiod=26,signalperiod=9)
df['MA5'] = ta.MA(np_close,timeperiod=5)
df['MA10'] = ta.MA(np_close,timeperiod=10)
df['DIFF'] = diff
df['DEA'] = dea
df['MACD'] = macd

此時,我們的dataframe應該是這樣的
這裏寫圖片描述
那麼,特徵值(feature)爲Open到MACD。
我們想要機器通過feature預測出明日大盤的漲跌情況,那麼這時需要來定義一下label,即告訴機器你想要預測什麼。
我們在本文中採用二分類作爲測試,漲爲1,跌爲0。

def num_config(x):
    if x > 0 :
        return 1
    else:
        return 0
df["(t+1)-(t)"] = df['close'].shift(-1) - df['close']
df['label'] = df["(t+1)-(t)"].map(num_config) 

再次打印df,我們應該得到如下的數據
這裏寫圖片描述
這時,特徵值和標籤,我們都應該搞定了。
現在,我們來劃分一下訓練集和測試集,因爲此文僅做測試使用,大家可以根據個人興趣,添加驗證集,用網格搜索、交叉驗證,尋找最優參數,然後再作用於測試集。
因爲股票數據是一個典型的時間序列數據(後面會寫一篇LSTM運用),所以儘量不要用隨機切分。因爲隨機切分很可能導致你的訓練集裏面含有未來函數,即X裏存在Y,進而導致準確率極其的高。
我們將2017年以前的數據用來做訓練,用2017年以後的數據用來做測試。

df = df.dropna() #剔除缺失值
df['time'] = pd.to_datetime(df['date'],format='%Y%m%d')
train_data = df[df['time']<"2017-01-01"]
test_data = df[df['time']>="2017-01-01"]
train_X = train_data.ix[:,'open':"MACD"].values
train_y = train_data['label'].values
test_X = test_data.ix[:,'open':"MACD"].values
test_y = test_data['label'].values

所有數據均已準備完畢,下面開始調用sklearn中隨機森林模型進行測試

clf = RandomForestClassifier(max_depth=3,n_estimators=20)
clf.fit(train_X,train_y)
print(accuracy_score(train_y,clf.predict(train_X)))
print(accuracy_score(test_y,clf.predict(test_X)))

這裏寫圖片描述
此時我們看到,該模型在訓練集上有58.86%的勝率,在測試集上也擁有56%的勝率。
毫無疑問,這當然是值得慶幸的事情,56%的勝率已經要比50%高出很多,如果按盈虧均爲1:1的情況下,長此以往的跑下去,是很恐怖的事情,這簡直比賭場裏某些遊戲的勝率還要高。
但在股票市場裏,真的是這樣嗎?
我們思考一下真實情況,該模型僅是猜漲跌,簡單的二分類問題。那假設該模型只是猜跌比較厲害,而猜漲很瓜皮呢?
我們查看一下召回率
這裏寫圖片描述
發現概率是51%,該模型並沒有過多的偏袒漲跌其中的一方。
那麼這個模型就可以用了嗎?不是的,我們在以前的主觀交易到後來的量化交易,發現很多趨勢追蹤策略的勝率可能只有35%-40%,但仍然可以取得不俗的盈利,原因是趨勢追蹤策略在盤整或者下跌階段,有不停的試錯,而上漲階段則是一直處於持倉狀態,沒有頻繁的換倉。於是勝率雖然低,但一口波段也能吃個胖子。
反觀我們的56%模型,會不會存在雖然勝率高,但是每次賺的少,而虧一次就虧個大的這樣的狀況存在呢。
畢竟大A股,暴跌總比暴漲的次數多,對吧。
這裏僅拋磚引玉
1、我們是否可以通過迴歸方法來解決上述問題
2、我們是否可以通過多分類問題來解決上述問題

總結:機器學習對於預測股票市場是存在一定作用的,但該文所涉及的模型僅對第二天的漲跌情況起輔助效果,並不能作爲決策的依據!

文中所涉及代碼及其付費數據集可以通過下面聯繫方式索取

注:該文屬個人原創,轉載請聯繫
Email:[email protected]
VX:gq454001240

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