機器學習股票價格預測初級實戰

原文連接python

個人GitHub博客地址git

上一篇文章,我用了4000字這樣比較長的篇幅,介紹了一些金融和量化交易相關的基本知識,還大概說了下人工智能在金融方面使用的優劣。這篇文章咱們將用一個具體代碼來進行一波股票價格預測的實戰。github

以前也說了,量化交易自己只是一種交易模式,只要在量化交易軟件中輸入了策略,計算機就會根據策略進行自動化交易。咱們機器學習生成的不過是量化交易步驟中的策略階段,暫時咱們不用考慮交易方面的接入,這個涉及到不少交易 API 相關的知識。交易平臺開發框架,我介紹一個Github上基於Python的開源框架,你們能夠了解一下:vnpy算法

OK,下面我就把關注點集中在價格預測這件事上。咱們都知道,不論用機器學習作什麼,首先咱們得須要一些數據源,而且還須要有一些途徑來進行回測。那麼像股票或者其餘金融盤口的數據是有不少途徑能夠獲取的,我今天給你們介紹一個我平時常常用的平臺:RiceQuant米筐量化交易平臺(非廣告)。c#

這個平臺有本身的一套Python API和編譯器iPython NoteBook來進行量化交易策略的開發。代碼只須要在特定的方法內實現好邏輯,就能夠一鍵生成測試結果,結果會自動的解析出回測收益曲線以及一些指標來給你參考。就像這樣api

具體的API我就很少介紹了,有興趣的同窗能夠直接去官網查看API文檔,很是詳細。www.ricequant.com/api/python/…app

在這裏,我將經過數據進行一些簡單的機器學習操做,並無用到可以獲得回測的那些API。須要提早了解的一個API就是get_price函數,好比下面這句話就表明了獲取CSI300指數過去一年的原始歷史數據,返回類型是咱們很是熟悉的pandas中的DataFrame。框架

df = get_price('CSI300.INDX','2005-01-05','2015-01-01').reset_index()[['open','close']]
複製代碼

這個函數只能在米筐線上編譯器中使用。咱們拿到這個數據,就能夠經過Python數據分析三劍客來進行花式操做了。咱們這裏用一些比較簡單的特徵來進行咱們的預測。那就是前兩天的漲跌幅,把前兩天的漲跌幅做爲特徵輸入,再把該天的實際漲跌幅做爲輸出,這樣的一組數據做爲訓練樣本。機器學習

固然了,這種特徵的選擇是很是簡單的,預測結果確定不夠理想,實際工程中,特徵的定性和定量是最重要也是最複雜的,好比行情都會有不少指標,像MACD、VR,都是很重要的指標,咱們這裏這樣選擇特徵只是爲了方便演示。函數

既然咱們是經過漲跌幅來做爲特徵,首先得把漲跌幅這個數據給弄出來,剛剛經過 get_price 得到的是每一天的開盤和收盤價格,那麼計算漲跌幅就簡單了

>>> up_and_down=df['close']-df['open'] > 0 # 獲取漲跌狀況
>>> rate_of_return = (df['close']-df['open'])/df['open'] # 獲取漲跌幅
>>> up_and_down_statistic = up_and_down.value_counts() # 獲取漲跌天數
複製代碼

而後,咱們使用matplotlib.pyplot來繪製下漲跌天數的柱狀圖

很奇怪,在ipython notebook使用pyplot有時候會畫出來彎曲的,將就看咯

從圖上咱們能夠清晰的看出來,這10年中,最後收盤價是漲的狀況仍是偏多一點的。咱們還能夠看一些別的數據,好比咱們就打印一下天天漲跌圖。

rate_of_return.plot(kind='line', style='k--', figsize=(15, 10), title='Daily Yield Changes Over Time Series')
複製代碼

從這個圖咱們就能夠比較清晰的看出來這2000多的交易日裏面的一些行情狀況了,好比中間有段寬幅波動奇大的區間,這說明這會是個牛市,對應到07年那會的牛市。我還記得那會我剛上初中,天天中午回家,我爸爸就告訴我他今天股票又賺了多少多少錢,可開心。

固然了,你還能夠利用畫圖進行更多的數據分析,下面咱們將編寫一個簡單的機器學習代碼,看看使用這樣一個簡單的特徵,這段數據跑下來,能有多少的價格預測正確率。

咱們在這裏預測的是收盤漲跌狀況,是個分類問題,因此咱們這裏選擇SVM來進行分類。每一個新數據都會被再次進行fit擬合以便提升下次預測的準確率。代碼以下:

import pandas as pd
import numpy as np
from __future__ import division  
from sklearn import svm
from collections import deque
import matplotlib.pyplot as plt

window = 2
# 米筐獲取某一品種歷史數據的DataFrame,注意得從2005-01-04開始
df = get_price('CSI300.INDX', '2005-01-05', '2015-07-25').reset_index()[['open', 'close']]
up_and_down = df['close'] - df['open'] > 0
print(len(up_and_down))
X = deque()
y = deque()
clf = svm.LinearSVC() # SVM
prediction = 0
test_num = 0 # 測試總數
win_num = 0 # 正確預測數

current_index = 400 # 起始位置

for current_index in range(current_index, len(up_and_down)-1, 1):
 fact = up_and_down[current_index+1]
       
 X.append(list(up_and_down[(current_index-window): current_index]))
 y.append(up_and_down[current_index])
 if len(y) > 100 and len(y) % 50 == 0:
   test_num += 1
   clf.fit(X, y)
   
   prediction = clf.predict(list(up_and_down[(current_index-window+1): current_index+1]))
       
   if prediction[0] == fact:
     win_num += 1
     print(win_num)
     
print("預測準確率爲",win_num/test_num)
複製代碼

最後輸出的結果爲58.53%,若是一個價格預測軟件僅經過歷史數據就能達到百分之60左右的正確率,實際上這已是一個很是不錯的結果了,不過咱們這裏的結果說服力不夠強,首先咱們的特徵過於簡單,再有就是爲了節省訓練時間,實際上我把樣本的擬合規模縮短了不少,我只在50的倍數位置進行預測,因此我最終的預測樣本數量大概只有40來個。

上面的代碼部分參考了米筐社區中一位叫陸東旭的同窗。這個社區如今仍是挺活躍的,我看的帖子仍是三年前的。能夠說,早在幾年前,國內就有這樣量化交易和AI的社區了,可見前人們早已在路上,等到咱們都認爲須要去接觸這些東西的時候,他們已經跑的更加遠了。

不過不要緊,後來者居上,也是一件挺有意思的事。

上面的代碼其實是最粗暴和原始的代碼,經過本身寫循環未免也太麻煩了,因此這個平臺後來更新了 API,就像我文章開頭說的那樣,只須要在提供好的空方法裏填充邏輯,就能夠快速的進行回測操做了。好比下面就是官方的API文檔介紹。

# 在這個方法中編寫任何的初始化邏輯。context對象將會在你的算法策略的任何方法之間作傳遞。
def init(context):
   context.s1 = "000001.XSHE"
   # 是否已發送了order
   context.fired = False

# 你選擇的證券的數據更新將會觸發此段邏輯,例如日或分鐘歷史數據切片或者是實時數據切片更新
def handle_bar(context, bar_dict):
   # 開始編寫你的主要的算法邏輯

   # bar_dict[order_book_id] 能夠拿到某個證券的bar信息
   # context.portfolio 能夠拿到如今的投資組合狀態信息

   # 使用order_shares(id_or_ins, amount)方法進行落單

   # TODO: 開始編寫你的算法吧!
   if not context.fired:
       # order_percent而且傳入1表明買入該股票而且使其佔有投資組合的100%
       order_percent(context.s1, 1)
       context.fired = True
複製代碼

好了,今天就是簡單的經過米筐來介紹下如何經過一些第三方數據獲取API,並結合 Python 的數據分析庫來作一些有趣的事情。下篇文章再見咯!


推薦閱讀

機器學習股票價格預測從爬蟲到預測(數據爬取部分)

分享一些學習AI的小乾貨

量化交易與人工智能究竟是咋回事

關注公衆號獲取更多幹貨文章-AI極客研修站

相關文章
相關標籤/搜索