這一期,我們將使用上一期處理好的數據特征和標簽訓練機器,然后預測交易策略。我們將分別使用 K近鄰算法和集成學習兩種方法分別完成模型的訓練和預測。
FinTech History
Python 與金融數據|股票數據的獲取與可視化
Python 與金融數據|數據的滑動平均值及多圖可視化
Python 與金融數據|數據的重采樣與蠟燭圖(K線圖)的繪制
Python 與金融數據|網頁爬取上證50股票代碼
Python 與金融數據|批量抓取并保存上證50的交易數據
Python 與金融數據|上證50的收盤價匯總
Python 與金融數據|繪制股票間的相關性圖表
Python 與金融數據|為機器學習預處理數據
Python 與金融數據|生成機器學習的標簽和特征

在 Python 中有很多種免費的機器學習庫,其中之一是 sklearn,是針對 Python 的免費軟件機器學習庫。
sklearn 具有各種分類,回歸和聚類算法,包括支持向量機,隨機森林,梯度提升,k均值和DBSCAN等內置方法。
K近鄰算法是機器學習中比較簡單的算法之一,在 ?sklearn 工具包中提供可以直接調用的方法。
K近鄰算法是一個分類算法,可以把待分類的數據看作空間或者平面的一些點,如果一個樣本點附近的K個最近的樣本點大多數都是屬于同一個類別,那么,這個樣本點就也是屬于這個類別。
與之前一樣,使用一個特定的函數 doML()?來實現本期的內容,因為要使用上一期處理好的特征數據和標簽來完成機器學習方法的訓練,所以執行上一期的函數獲取處理完成后的數據:
def doML(ticker): X, y, dataFrame = extractFeaturesets(ticker)
接下來我們從所有的數據中劃分出一部分來訓練模型,另一部分的數據用來測試我們模型的準確性。
可以使用 train_test_split?這個方法來劃分數據,這個方法來自于 sklearn?庫,所以使用之前需要先導入這個方法:
from sklearn.model_selection import train_test_split
train_test_split?方法一般有三個參數,第一個參數為待劃分的特征數據,第二個參數為待劃分的標簽數據,第三個參數為測試數據所占的比例,第三個參數的值是介于 0 和 1 之間:
XTrain, XTest, yTrain, yTest = train_test_split(X, y, test_size=0.25)
這里使用 X 作為特征數據,y 作為標簽數據,隨機取數據總量的 25% 作為測試數據。
接下來我們設置分類模型,這里選擇 K近鄰分類算法,前面說過,這是 sklearn 內置的一個方法,使用之前需要先導入一下:
from sklearn import neighbors
然后使用內置的 K近鄰算法生成一個分類器?clf:
clf = neighbors.KNeighborsClassifier()
下一步要做的就是訓練模型,借助于 sklearn 這個機器學習庫,訓練模型也變得很簡單:
clf.fit(XTrain, yTrain)
使用 fit?這個方法來訓練模型,一般會有兩個參數,第一個參數為訓練用的特征數據,第二個參數為訓練用的標簽數據。
執行這行代碼后,我們生成的分類器會自動用給定的數據按照既定的模型完成訓練。
還記得前面我們除了生成訓練數據,還生成了測試數據嗎?這時就可以使用測試數據來測試訓練好的模型的準確度,使用 score?這個方法可以返回測試測準確率。
這個方法一般有兩個參數,分別為測試用的特征數據和測試用的標簽數據:
confidence = clf.score(XTest, yTest)
這個方法會首先將特征數據作為輸入,使用訓練好的模型去給這些特征數據分類,也就是獲取每組數據對應的標簽。然后會將預測出來的結果與測試數據中的標簽數據比對,得到并返回一個準確率。
獲取了測試的準確率后,為了讓結果更直觀,我們把準確率輸出:
print('Accuracy:', confidence)
完成了模型的訓練,就可以對數據進行分類預測了。例如我們給定測試用的特征數據 XTest,使用 predict?方法就可以完成對特征數據的分類:
predictions = clf.predict(XTest)
根據我們的訓練數據,這里得到的結果實際上是由 0、1 和 -1 這三個數構成的列表,根據前面的分析,0表示繼續持有,1 表示買入,-1表示賣出。
為了更直觀的展示結果,我們使用 ?統計每個數出現的次數并將其輸出:
print('Predicted Spread:', Counter(predictions))
這樣就完成了是用 K近鄰算法預測交易策略。接下來調用 doML?這個函數,使用 '600036.SS'?這支股票來驗證一下:
doML('600036.SS')
觀察到的參考輸出為:
dataSpread: Counter({1: 1104, -1: 1082, 0: 463})Accuracy: 0.41389728096676737Predicted Spread: Counter({-1: 340, 1: 200, 0: 122})
因為每次使用的訓練數據都是隨機選取的,所以每次得到的準確率可能都不太一樣。
這里我們得到的準確率是 41% 左右。對于隨機生成的測試數據,預測則結果是由 340 天是建議賣出,200天建議買入,122天建議繼續持有。
如果實際中,我們想要去預測當日的策略,只需要用之前的交易數據去訓練模型,然后得到當日的特征數據,將特征數據輸入訓練好的模型,就可以看到使用 K近鄰分類算法輸出的建議交易策略了。
如果在某次的訓練過程中,獲取到的準確率比較高,還可以將這一次訓練的模型保存為 pickle 格式,以后需要使用的時候只需要直接獲取這個模型即可。
集成學習
集成學習實際上就是分類器的集成,就是構建多個機器學習模型來完成學習任務。機器學習有很多種模型,對于同一個問題,每一種模型都會產生不同的預測結果。對于多種模型預測結果如何選擇最合適的一個結果呢?這就是集成學習要解決的問題之一:
把多種算法集中起來,每種算法都會有一個自己的預測結果,然后對每種算法的結果進行評估投票,綜合選擇出最好的結果。
在 sklearn 中提供一個封裝好的集成學習方法 VotingClassifier,按照慣例,使用之前先導入相關的庫文件:
from sklearn.ensemble import VotingClassifier
在構建集成學習的分類器之前,首先按照第一部分的方法導入處理好的數據并獲取訓練集和測試集:
def doML(ticker): X, y, dataFrame = extractFeaturesets(ticker) XTrain, XTest, yTrain, yTest = train_test_split(X, y, test_size=0.25)
然后開始構建集成學習分類器,這里我們集成使用三種分類方法:
線性支持向量機、K近鄰算法和隨機森林分類算法。
支持向量機是一種二類分類模型。它的基本思想是在特征空間中尋找間隔最大的分離超平面使數據得到高效的二分類。
隨機森林分類算法指的是利用多個決策樹對樣本進行訓練并預測的一種分類器。
這是三種比較常見的分類算法,在 sklearn 中都提供了可以直接調用的方法。如果使用線性支持向量機需要導入以下工具包:
from sklearn import svm
使用 K近鄰算法 需要導入以下工具包:
from?sklearn?import?neighbors
使用 隨機森林算法 需要導入以下工具包:
from?sklearn.ensemble?import?RandomForestClassifier
想要使用集成學習,只需要添加以下代碼:
clf = VotingClassifier([('lsvc', svm.LinearSVC()), ('knn', neighbors.KNeighborsClassifier()), ('rfor', RandomForestClassifier())] )
這樣就完成了集成學習分類器的構建,接下里只需要按照與上一部分相同的方法用處理好的數據訓練并驗證模型:
clf.fit(XTrain, yTrain)confidence = clf.score(XTest, yTest)print('Accuracy:',?confidence)
最后完成模型的預測并輸出結果:
predictions = clf.predict(XTest)print('Predicted Spread:', Counter(predictions))
最后我們同樣用?'600036.SS'?這支股票來驗證集成學習的預測結果,輸出內容如下:
dataSpread: Counter({1: 1104, -1: 1082, 0: 463})Accuracy: 0.4501510574018127Predicted Spread: Counter({-1: 390, 1: 270, 0: 2})
這里預測的準確性可以達到 45%。對于這支股票,在測試集合中,集成學習方法預測的結果是有 390天 建議賣出,有 270天 建議買入,有 2 天建議繼續持有。
一般來說,使用集成學習預測的結果會比使用單一模型的預測結果好一些。
同樣的,如果希望預測其他時間點的交易策略,只需要更新測試數據樣本就可以了。
參考代碼
#!/usr/bin/env python3# -*- coding: utf-8 -*-"""@author: IT信息教室(微信公眾號)訂閱/關注,在看、分享三連吧~"""from collections import Counterfrom?sklearn?import?svm,?neighborsfrom sklearn.model_selection import train_test_splitfrom sklearn.ensemble import VotingClassifier, RandomForestClassifierdef doML(ticker): X, y, dataFrame = extractFeaturesets(ticker) XTrain, XTest, yTrain, yTest = train_test_split(X, y, test_size=0.25) # print(len(XTrain[0]), len(XTest[0])) # print(yTrain, yTest) # 構建集成學習分類器,使用的分類算法有 線性支持向量機、K近鄰算法和隨機森林算法。 clf = VotingClassifier([('lsvc', svm.LinearSVC()), ('knn', neighbors.KNeighborsClassifier()), ('rfor', RandomForestClassifier())] ) # 構建 K近鄰算法的分類器 # clf = neighbors.KNeighborsClassifier() clf.fit(XTrain, yTrain) confidence = clf.score(XTest, yTest) print('Accuracy:', confidence) predictions = clf.predict(XTest) print('Predicted Spread:', Counter(predictions)) print() print() doML('600036.SS')doML('601328.SS')doML('600340.SS')
Codes: M先森看世界Edit: M先森看世界







ONE MORE THING
如果您對內容有什么需求建議,或者遇到了什么軟件、應用使用方面的問題,請直接在公眾號主界面下發私信給我,我看都會及時回復。感謝大家的支持!
合作:?classroom.it@hotmail.com
Hi
你好呀
我是?M先森?
這是一個共同學習的平臺
我會把我會的?你們想學的
做成教程或者寫成文章
我們在這一起學英語?
學編程?學算法
學各種各樣
好玩的好用的軟件
記得要常回來看看呀
(^_^)a(^_^)a
點擊?閱讀原文?查看Python入門教程~
喜歡就點個 分享?點贊?在看?三連吧!