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

WeaponZhi發表於2019-03-03

原文連結

我的GitHub部落格地址

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

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

OK,下面我就把關注點集中在價格預測這件事上。我們都知道,不論用機器學習做什麼,首先我們得需要一些資料來源,並且還需要有一些途徑來進行回測。那麼像股票或者其他金融盤口的資料是有很多途徑可以獲取的,我今天給大家介紹一個我平時經常用的平臺:RiceQuant米筐量化交易平臺(非廣告)。

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

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

具體的API我就不多介紹了,有興趣的同學可以直接去官網檢視API文件,非常詳細。www.ricequant.com/api/python/…

在這裡,我將通過資料進行一些簡單的機器學習操作,並沒有用到能夠得到回測的那些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極客研修站

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

相關文章