python 預測算法_Python 與金融數據使用機器學習算法預測交易策略

記得?關注、分享、點在看?呀~ 這樣您就能持續收到優質的推送啦
這一期,我們將使用上一期處理好的數據特征和標簽訓練機器,然后預測交易策略。我們將分別使用 K近鄰算法和集成學習兩種方法分別完成模型的訓練和預測。
FinTech History

Python 與金融數據|股票數據的獲取與可視化

Python 與金融數據|數據的滑動平均值及多圖可視化

Python 與金融數據|數據的重采樣與蠟燭圖(K線圖)的繪制

Python 與金融數據|網頁爬取上證50股票代碼

Python 與金融數據|批量抓取并保存上證50的交易數據

Python 與金融數據|上證50的收盤價匯總

Python 與金融數據|繪制股票間的相關性圖表

Python 與金融數據|為機器學習預處理數據

Python 與金融數據|生成機器學習的標簽和特征

f26de93ec44f6e3ab6f5ed7edc18f7f6.pngK近鄰算法

在 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 格式,以后需要使用的時候只需要直接獲取這個模型即可。

c71dfe6452bd0c5ecce15c97458aefac.png

集成學習

集成學習實際上就是分類器的集成,就是構建多個機器學習模型來完成學習任務。機器學習有很多種模型,對于同一個問題,每一種模型都會產生不同的預測結果。對于多種模型預測結果如何選擇最合適的一個結果呢?這就是集成學習要解決的問題之一:

把多種算法集中起來,每種算法都會有一個自己的預測結果,然后對每種算法的結果進行評估投票,綜合選擇出最好的結果。

在 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 天建議繼續持有。

一般來說,使用集成學習預測的結果會比使用單一模型的預測結果好一些。

同樣的,如果希望預測其他時間點的交易策略,只需要更新測試數據樣本就可以了。

823bb69839c5fbcfa895914b27f21612.png

參考代碼

#!/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先森看世界
bc432e75bfd8c16899f2c562c15d74eb.gif9b03f09b6aabf5468f8d16465384c88d.png58ab0196f5b45c9762dc491b38909632.png0f4753d552eb68ea08d2efe45f1793de.png3b91286094915829a0783b8d66938d33.pngb91b5ecf97f3fee9a1cef4c275ab8bf3.png4d814b6d450f26ae7d57c5393b670840.png
ONE MORE THING

如果您對內容有什么需求建議,或者遇到了什么軟件、應用使用方面的問題,請直接在公眾號主界面下發私信給我,我看都會及時回復。感謝大家的支持!


合作:?classroom.it@hotmail.com

d6e6ede35b0786455782f8b6df383a5c.gif

Hi

你好呀

我是?M先森?

這是一個共同學習的平臺

我會把我會的?你們想學的

做成教程或者寫成文章
我們在這一起學英語?

學編程?學算法

學各種各樣

好玩的好用的軟件

記得要常回來看看呀

(^_^)a(^_^)a


點擊?閱讀原文?查看Python入門教程~

喜歡就點個 分享?點贊?在看?三連吧!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/530578.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/530578.shtml
英文地址,請注明出處:http://en.pswp.cn/news/530578.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql主從表結構差異_mysqldiff對比主從表結構是否一致

mysqldiff該工具是官方mysql-utilities工具集的一個腳本,可以實現主從服務器表結構是否一致。數據校驗需要使用Percona的pt-table-checksum工具。安裝:# tar zxvf mysql-utilities-1.5.4.tar.gz# cd mysql-utilities-1.5.4# python setup.py install使用…

mysql 存儲過程插入慢_mysql存儲過程太慢怎么辦

mysql存儲過程太慢的解決方法:首先打開my.cnf配置文件;然后添加配置【long_query_time1】;接著通過【tail -f /tmp/logs/mysqld.log】命令監控sql;最后進行針對性的優化即可。解決方法:第一步:修改/etc/my.…

mongoose換成mysql_Package - tms-koa

tms-koa基于koa的輕量級快速開發框架,包含 MVC 中的 M 和 C 兩部分,適合于實現 API 服務和前后端徹底分離的應用。內置基于 access_token 的訪問鑒權機制,更容易實現 API 調用的負載分擔。內置通過連接池訪問 MySQL 數據庫,支持進…

導出遠程mysql數據庫中的表_shell腳本實現導出遠程mysql數據庫表數據至本地

bin/main.sh腳本內容 #!/bin/bash#作用:用于同步遠程mysql數據庫表數據至本地#作者:丁藝博source /etc/profilesource ~/.bash_profileexport LANGen_US.UTF-8export RUN_HOME$(cd "$(dirname "$0")"; echo "${PWD%/*}")s…

商業智能解決方案_格至智能開關:簡單便捷的商業智能照明解決方案

美萊恩智能照明推出的格至智能調光開關,是一款便捷、可輕松實現擴展的智能照明系統。它能夠節約能源,并在為各種空間工作或者學習的人們,營造最舒適的照明環境。借助美萊恩SLT單火線傳輸技術,在新建或者改造項目中,你將…

vue 安裝 less_解決舊Vue項目升級less-loader 6.0.0報錯

作為一個愛折騰的主,我的package隨時都是ncu -u! 何為ncu,就是檢查nodejs npm/yarn項目依賴最新版本package.json一個插件! 這不,前幾天less-loader 升級了最新版,我也迫不及待升級。 升級最新版軟件依賴有很多好處,總之作為一個開發者你發布新版本肯定是升級改造的工作…

php讀取mysql數據無法修改時間_php設置mysql查詢讀取數據的超時時間

php可以設置mysql查詢的超時時間估計大家不知道吧,一般都直接在mysql中進行設置了,下面我們來為各位介紹一下php設置mysql查詢讀取數據的超時時間吧。現象:php能通過代理正常連接到mysql。但是,執行query后,一直等待&a…

mysql無序id怎么優化limit_MYSQL分頁limit速度太慢優化方法

原標題:MYSQL分頁limit速度太慢優化方法在mysql中limit可以實現快速分頁,但是如果數據到了幾百萬時我們的limit必須優化才能有效的合理的實現分頁了,否則可能卡死你的服務器哦。當一個表數據有幾百萬的數據的時候成了問題!如 * fr…

反積分飽和 程序_用抗積分飽和PID控制傳遞函數為G(s)的被控對象

題目:用抗積分飽和PID控制傳遞函數為G(s)的被控對象G(s)523500/(s^387.35s^210470s)二、抗積分飽和原理積分飽和現象是在系統存在一個方向的偏差,PID控制器的輸出由于積分作用的不斷加大而加大,從而導致執行器達到極限位置,如果控…

mysql top 1效率_TOP 1比不加TOP慢的疑惑

問題描述: 有一個查詢如下,去掉 TOP 1 的時候,很快就出來結果了,但加上 TOP 1 的時候,一般要 2~3 秒才出數據,何解? SELECT TOP 1 ??? A . INVNO FROM A , B WHERE A . Item B . ItemNumber…

jieba庫詞頻統計_用jieba庫統計文本詞頻及云詞圖的生成

一、安裝jieba庫:\>pip install jieba #或者 pip3 install jieba二、jieba庫解析jieba庫主要提供提供分詞功能,可以輔助自定義分詞詞典。jieba庫中包含的主要函數如下:jieba.cut(s) …

mysql查看表描述_MySQL表記錄操作介紹(重點介紹查詢操作)

MySQL表記錄操作指的是對數據庫表中數據進行CRUD增刪改查操作,一下將一一給大家介紹,重點介紹查詢操作。一、插入數據(INSERT)二、刪除數據(DELETE)三、修改數據(UPDATE)四、查詢數據(SELECT)下面將以例子對數據查詢進行詳細講解:例子&#x…

python郵件的圖片放在哪里_用python保存電子郵件中的嵌入圖像

我試圖在一個嵌入的電子郵件中抓取圖像。問題是我保存的圖像不可讀&#xff0c;我不知道為什么。電子郵件(保存為我在代碼開頭加載的文件)&#xff1a;MIME-Version: 1.0Received: by 10.100.120.7 with HTTP; Tue, 18 Oct 2011 10:36:48 -0700 (PDT)In-Reply-To: <8B4FDE07…

sqoop從mysql導入hdfs_sqoop 從mysql導入數據到hdfs、hive

1.上傳sqoop安裝包 2.安裝和配置 在添加sqoop到環境變量 將數據庫連接驅動拷貝到$SQOOP_HOME/lib里 3.使用 第一類&#xff1a;數據庫中的數據導入到HDFS上 sqoop import --connect jdbc:mysql://hadoop07:3306/test --username root --password 123 --table user_info--colum…

安卓mysql插入數據_【11-25求助】關于Android 的SQLite數據庫插入數據報錯問題

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓運行程序&#xff0c;不知道為何點插入數據按鈕會報錯&#xff0c;請萬能的吧友幫我看看&#xff0c;謝謝&#xff0c;不廢話&#xff0c;直接上代碼MainActivity.javapackage com.example.activity16;import android.support.v7.a…

安裝python擴展庫時只能使用pip_安裝 Python 擴展庫時只能使用 pip 工具在線安裝,如果安裝不成功就沒有別的辦法了。_學小易找答案...

【單選題】關于Python中的復數,下列說法錯誤的是_________________。【填空題】在Python程序中,導入sys模塊后,可以通過列表________________訪問命令行參數。_________________表示Python腳本名;____________________表示第一個參數。【簡答題】嘗試用顏色 表達 冷暖 感覺 !【…

opencv java_opencv的Java開發環境配置(IntelliJ idea)

1、首先我們先到官網下載opencv的包&#xff0c;在官網下載到的是一個可運行文件&#xff0c;其實就是一個解壓程序&#xff0c;運行后會把opencv的相關文件解壓到填寫的路徑。2、 在編輯環境變量窗口&#xff0c;點擊新建&#xff0c;然后將opencv文件夾里的bin路徑復制進去&a…

java session 永不過期_Java Web Application使Session永不失效(利用cookie隱藏登錄)

在做 Web Application 時&#xff0c;因為 Web Project 有 session 自動失效的問題&#xff0c;所以如何讓用戶登錄一次系統就能長時間運行三個月&#xff0c;就是個問題。后來&#xff0c;看到 session 失效的攔截器代碼&#xff0c;就猜想能否通過攔截器來實現。查資料發現可…

java is-a_java中 is - a和 has - a的區別

Java中is-a和has-a的區別1.“is-a”是繼承的關系,比如人是動物,人和動物是繼承的關系;2.“has-a”是聚合的關系,比如人有眼睛,人和眼睛是聚合的關系;也可以理解為 is-a 是“繼承”但has-a是“接口”關系。是“相互依賴”的關系&#xff0c;同時它們的生命周期都是一樣的。我們以…

支付寶支付對賬單java_[Java]解析支付寶對賬單csv

配置相關公鑰和私鑰這些需要在支付寶的賬戶中心配置image.png這些內容在支付寶平臺上都有教程,因為下載對賬單這個功能比較簡單,不需要入聚石塔下載對賬單https://docs.open.alipay.com/20180417160701241302/fd3qt1官方文檔寫的很清楚,而且能直接用,將配置好的公鑰私鑰APPID等…