python 预测算法_Python 与金融数据使用机器学习算法预测交易策略
這一期,我們將使用上一期處理好的數(shù)據(jù)特征和標(biāo)簽訓(xùn)練機(jī)器,然后預(yù)測(cè)交易策略。我們將分別使用 K近鄰算法和集成學(xué)習(xí)兩種方法分別完成模型的訓(xùn)練和預(yù)測(cè)。
FinTech History
Python 與金融數(shù)據(jù)|股票數(shù)據(jù)的獲取與可視化
Python 與金融數(shù)據(jù)|數(shù)據(jù)的滑動(dòng)平均值及多圖可視化
Python 與金融數(shù)據(jù)|數(shù)據(jù)的重采樣與蠟燭圖(K線圖)的繪制
Python 與金融數(shù)據(jù)|網(wǎng)頁(yè)爬取上證50股票代碼
Python 與金融數(shù)據(jù)|批量抓取并保存上證50的交易數(shù)據(jù)
Python 與金融數(shù)據(jù)|上證50的收盤(pán)價(jià)匯總
Python 與金融數(shù)據(jù)|繪制股票間的相關(guān)性圖表
Python 與金融數(shù)據(jù)|為機(jī)器學(xué)習(xí)預(yù)處理數(shù)據(jù)
Python 與金融數(shù)據(jù)|生成機(jī)器學(xué)習(xí)的標(biāo)簽和特征
K近鄰算法在 Python 中有很多種免費(fèi)的機(jī)器學(xué)習(xí)庫(kù),其中之一是 sklearn,是針對(duì) Python 的免費(fèi)軟件機(jī)器學(xué)習(xí)庫(kù)。
sklearn 具有各種分類(lèi),回歸和聚類(lèi)算法,包括支持向量機(jī),隨機(jī)森林,梯度提升,k均值和DBSCAN等內(nèi)置方法。
K近鄰算法是機(jī)器學(xué)習(xí)中比較簡(jiǎn)單的算法之一,在 ?sklearn 工具包中提供可以直接調(diào)用的方法。
K近鄰算法是一個(gè)分類(lèi)算法,可以把待分類(lèi)的數(shù)據(jù)看作空間或者平面的一些點(diǎn),如果一個(gè)樣本點(diǎn)附近的K個(gè)最近的樣本點(diǎn)大多數(shù)都是屬于同一個(gè)類(lèi)別,那么,這個(gè)樣本點(diǎn)就也是屬于這個(gè)類(lèi)別。
與之前一樣,使用一個(gè)特定的函數(shù) doML()?來(lái)實(shí)現(xiàn)本期的內(nèi)容,因?yàn)橐褂蒙弦黄谔幚砗玫奶卣鲾?shù)據(jù)和標(biāo)簽來(lái)完成機(jī)器學(xué)習(xí)方法的訓(xùn)練,所以執(zhí)行上一期的函數(shù)獲取處理完成后的數(shù)據(jù):
def doML(ticker): X, y, dataFrame = extractFeaturesets(ticker)接下來(lái)我們從所有的數(shù)據(jù)中劃分出一部分來(lái)訓(xùn)練模型,另一部分的數(shù)據(jù)用來(lái)測(cè)試我們模型的準(zhǔn)確性。
可以使用 train_test_split?這個(gè)方法來(lái)劃分?jǐn)?shù)據(jù),這個(gè)方法來(lái)自于 sklearn?庫(kù),所以使用之前需要先導(dǎo)入這個(gè)方法:
from sklearn.model_selection import train_test_splittrain_test_split?方法一般有三個(gè)參數(shù),第一個(gè)參數(shù)為待劃分的特征數(shù)據(jù),第二個(gè)參數(shù)為待劃分的標(biāo)簽數(shù)據(jù),第三個(gè)參數(shù)為測(cè)試數(shù)據(jù)所占的比例,第三個(gè)參數(shù)的值是介于 0 和 1 之間:
XTrain, XTest, yTrain, yTest = train_test_split(X, y, test_size=0.25)這里使用 X 作為特征數(shù)據(jù),y 作為標(biāo)簽數(shù)據(jù),隨機(jī)取數(shù)據(jù)總量的 25% 作為測(cè)試數(shù)據(jù)。
接下來(lái)我們?cè)O(shè)置分類(lèi)模型,這里選擇 K近鄰分類(lèi)算法,前面說(shuō)過(guò),這是 sklearn 內(nèi)置的一個(gè)方法,使用之前需要先導(dǎo)入一下:
from sklearn import neighbors然后使用內(nèi)置的 K近鄰算法生成一個(gè)分類(lèi)器?clf:
clf = neighbors.KNeighborsClassifier()下一步要做的就是訓(xùn)練模型,借助于 sklearn 這個(gè)機(jī)器學(xué)習(xí)庫(kù),訓(xùn)練模型也變得很簡(jiǎn)單:
clf.fit(XTrain, yTrain)使用 fit?這個(gè)方法來(lái)訓(xùn)練模型,一般會(huì)有兩個(gè)參數(shù),第一個(gè)參數(shù)為訓(xùn)練用的特征數(shù)據(jù),第二個(gè)參數(shù)為訓(xùn)練用的標(biāo)簽數(shù)據(jù)。
執(zhí)行這行代碼后,我們生成的分類(lèi)器會(huì)自動(dòng)用給定的數(shù)據(jù)按照既定的模型完成訓(xùn)練。
還記得前面我們除了生成訓(xùn)練數(shù)據(jù),還生成了測(cè)試數(shù)據(jù)嗎?這時(shí)就可以使用測(cè)試數(shù)據(jù)來(lái)測(cè)試訓(xùn)練好的模型的準(zhǔn)確度,使用 score?這個(gè)方法可以返回測(cè)試測(cè)準(zhǔn)確率。
這個(gè)方法一般有兩個(gè)參數(shù),分別為測(cè)試用的特征數(shù)據(jù)和測(cè)試用的標(biāo)簽數(shù)據(jù):
confidence = clf.score(XTest, yTest)這個(gè)方法會(huì)首先將特征數(shù)據(jù)作為輸入,使用訓(xùn)練好的模型去給這些特征數(shù)據(jù)分類(lèi),也就是獲取每組數(shù)據(jù)對(duì)應(yīng)的標(biāo)簽。然后會(huì)將預(yù)測(cè)出來(lái)的結(jié)果與測(cè)試數(shù)據(jù)中的標(biāo)簽數(shù)據(jù)比對(duì),得到并返回一個(gè)準(zhǔn)確率。
獲取了測(cè)試的準(zhǔn)確率后,為了讓結(jié)果更直觀,我們把準(zhǔn)確率輸出:
print('Accuracy:', confidence)完成了模型的訓(xùn)練,就可以對(duì)數(shù)據(jù)進(jìn)行分類(lèi)預(yù)測(cè)了。例如我們給定測(cè)試用的特征數(shù)據(jù) XTest,使用 predict?方法就可以完成對(duì)特征數(shù)據(jù)的分類(lèi):
predictions = clf.predict(XTest)根據(jù)我們的訓(xùn)練數(shù)據(jù),這里得到的結(jié)果實(shí)際上是由 0、1 和 -1 這三個(gè)數(shù)構(gòu)成的列表,根據(jù)前面的分析,0表示繼續(xù)持有,1 表示買(mǎi)入,-1表示賣(mài)出。
為了更直觀的展示結(jié)果,我們使用 ?統(tǒng)計(jì)每個(gè)數(shù)出現(xiàn)的次數(shù)并將其輸出:
print('Predicted Spread:', Counter(predictions))這樣就完成了是用 K近鄰算法預(yù)測(cè)交易策略。接下來(lái)調(diào)用 doML?這個(gè)函數(shù),使用 '600036.SS'?這支股票來(lái)驗(yàn)證一下:
doML('600036.SS')觀察到的參考輸出為:
dataSpread: Counter({1: 1104, -1: 1082, 0: 463})Accuracy: 0.41389728096676737Predicted Spread: Counter({-1: 340, 1: 200, 0: 122})因?yàn)槊看问褂玫挠?xùn)練數(shù)據(jù)都是隨機(jī)選取的,所以每次得到的準(zhǔn)確率可能都不太一樣。
這里我們得到的準(zhǔn)確率是 41% 左右。對(duì)于隨機(jī)生成的測(cè)試數(shù)據(jù),預(yù)測(cè)則結(jié)果是由 340 天是建議賣(mài)出,200天建議買(mǎi)入,122天建議繼續(xù)持有。
如果實(shí)際中,我們想要去預(yù)測(cè)當(dāng)日的策略,只需要用之前的交易數(shù)據(jù)去訓(xùn)練模型,然后得到當(dāng)日的特征數(shù)據(jù),將特征數(shù)據(jù)輸入訓(xùn)練好的模型,就可以看到使用 K近鄰分類(lèi)算法輸出的建議交易策略了。
如果在某次的訓(xùn)練過(guò)程中,獲取到的準(zhǔn)確率比較高,還可以將這一次訓(xùn)練的模型保存為 pickle 格式,以后需要使用的時(shí)候只需要直接獲取這個(gè)模型即可。
集成學(xué)習(xí)
集成學(xué)習(xí)實(shí)際上就是分類(lèi)器的集成,就是構(gòu)建多個(gè)機(jī)器學(xué)習(xí)模型來(lái)完成學(xué)習(xí)任務(wù)。機(jī)器學(xué)習(xí)有很多種模型,對(duì)于同一個(gè)問(wèn)題,每一種模型都會(huì)產(chǎn)生不同的預(yù)測(cè)結(jié)果。對(duì)于多種模型預(yù)測(cè)結(jié)果如何選擇最合適的一個(gè)結(jié)果呢?這就是集成學(xué)習(xí)要解決的問(wèn)題之一:
把多種算法集中起來(lái),每種算法都會(huì)有一個(gè)自己的預(yù)測(cè)結(jié)果,然后對(duì)每種算法的結(jié)果進(jìn)行評(píng)估投票,綜合選擇出最好的結(jié)果。
在 sklearn 中提供一個(gè)封裝好的集成學(xué)習(xí)方法 VotingClassifier,按照慣例,使用之前先導(dǎo)入相關(guān)的庫(kù)文件:
from sklearn.ensemble import VotingClassifier在構(gòu)建集成學(xué)習(xí)的分類(lèi)器之前,首先按照第一部分的方法導(dǎo)入處理好的數(shù)據(jù)并獲取訓(xùn)練集和測(cè)試集:
def doML(ticker): X, y, dataFrame = extractFeaturesets(ticker) XTrain, XTest, yTrain, yTest = train_test_split(X, y, test_size=0.25)然后開(kāi)始構(gòu)建集成學(xué)習(xí)分類(lèi)器,這里我們集成使用三種分類(lèi)方法:
線性支持向量機(jī)、K近鄰算法和隨機(jī)森林分類(lèi)算法。
支持向量機(jī)是一種二類(lèi)分類(lèi)模型。它的基本思想是在特征空間中尋找間隔最大的分離超平面使數(shù)據(jù)得到高效的二分類(lèi)。
隨機(jī)森林分類(lèi)算法指的是利用多個(gè)決策樹(shù)對(duì)樣本進(jìn)行訓(xùn)練并預(yù)測(cè)的一種分類(lèi)器。
這是三種比較常見(jiàn)的分類(lèi)算法,在 sklearn 中都提供了可以直接調(diào)用的方法。如果使用線性支持向量機(jī)需要導(dǎo)入以下工具包:
from sklearn import svm使用 K近鄰算法 需要導(dǎo)入以下工具包:
from?sklearn?import?neighbors使用 隨機(jī)森林算法 需要導(dǎo)入以下工具包:
from?sklearn.ensemble?import?RandomForestClassifier想要使用集成學(xué)習(xí),只需要添加以下代碼:
clf = VotingClassifier([('lsvc', svm.LinearSVC()), ('knn', neighbors.KNeighborsClassifier()), ('rfor', RandomForestClassifier())] )這樣就完成了集成學(xué)習(xí)分類(lèi)器的構(gòu)建,接下里只需要按照與上一部分相同的方法用處理好的數(shù)據(jù)訓(xùn)練并驗(yàn)證模型:
clf.fit(XTrain, yTrain)confidence = clf.score(XTest, yTest)print('Accuracy:',?confidence)最后完成模型的預(yù)測(cè)并輸出結(jié)果:
predictions = clf.predict(XTest)print('Predicted Spread:', Counter(predictions))最后我們同樣用?'600036.SS'?這支股票來(lái)驗(yàn)證集成學(xué)習(xí)的預(yù)測(cè)結(jié)果,輸出內(nèi)容如下:
dataSpread: Counter({1: 1104, -1: 1082, 0: 463})Accuracy: 0.4501510574018127Predicted Spread: Counter({-1: 390, 1: 270, 0: 2})這里預(yù)測(cè)的準(zhǔn)確性可以達(dá)到 45%。對(duì)于這支股票,在測(cè)試集合中,集成學(xué)習(xí)方法預(yù)測(cè)的結(jié)果是有 390天 建議賣(mài)出,有 270天 建議買(mǎi)入,有 2 天建議繼續(xù)持有。
一般來(lái)說(shuō),使用集成學(xué)習(xí)預(yù)測(cè)的結(jié)果會(huì)比使用單一模型的預(yù)測(cè)結(jié)果好一些。
同樣的,如果希望預(yù)測(cè)其他時(shí)間點(diǎn)的交易策略,只需要更新測(cè)試數(shù)據(jù)樣本就可以了。
參考代碼
#!/usr/bin/env python3# -*- coding: utf-8 -*-"""@author: IT信息教室(微信公眾號(hào))訂閱/關(guān)注,在看、分享三連吧~"""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) # 構(gòu)建集成學(xué)習(xí)分類(lèi)器,使用的分類(lèi)算法有 線性支持向量機(jī)、K近鄰算法和隨機(jī)森林算法。 clf = VotingClassifier([('lsvc', svm.LinearSVC()), ('knn', neighbors.KNeighborsClassifier()), ('rfor', RandomForestClassifier())] ) # 構(gòu)建 K近鄰算法的分類(lèi)器 # 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
如果您對(duì)內(nèi)容有什么需求建議,或者遇到了什么軟件、應(yīng)用使用方面的問(wèn)題,請(qǐng)直接在公眾號(hào)主界面下發(fā)私信給我,我看都會(huì)及時(shí)回復(fù)。感謝大家的支持!
合作:?classroom.it@hotmail.com
Hi
你好呀
我是?M先森?
這是一個(gè)共同學(xué)習(xí)的平臺(tái)
我會(huì)把我會(huì)的?你們想學(xué)的
做成教程或者寫(xiě)成文章
我們?cè)谶@一起學(xué)英語(yǔ)?
學(xué)編程?學(xué)算法
學(xué)各種各樣
好玩的好用的軟件
記得要?;貋?lái)看看呀
(^_^)a(^_^)a
點(diǎn)擊?閱讀原文?查看Python入門(mén)教程~
喜歡就點(diǎn)個(gè) 分享?點(diǎn)贊?在看?三連吧!
總結(jié)
以上是生活随笔為你收集整理的python 预测算法_Python 与金融数据使用机器学习算法预测交易策略的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 橱‎柜定制哪个品牌好性价
- 下一篇: 煤气快切气缸维修要求