python 预测算法_通过机器学习的线性回归算法预测股票走势(用Python实现)
生活随笔
收集整理的這篇文章主要介紹了
python 预测算法_通过机器学习的线性回归算法预测股票走势(用Python实现)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
本文轉(zhuǎn)自博客園,作者為hsm_computer
原文鏈接:https://www.cnblogs.com/JavaArchitect/p/11717998.html在筆者的新書里,將通過股票案例講述Python知識點,讓大家在學習Python的同時還能掌握相關(guān)的股票知識,所謂一舉兩得。這里給出以線性回歸算法預測股票的案例,以此講述通過Python的sklearn庫實現(xiàn)線性回歸預測的技巧。本文先以波士頓房價數(shù)據(jù)為例,講述線性回歸預測模型的搭建方式,隨后將在這個基礎(chǔ)上,講述以線性預測模型預測股票的實現(xiàn)代碼。本文是從筆者的新書里摘取的,新書預計今年年底前出版,敬請大家關(guān)注。正文
1、波士頓房價數(shù)據(jù)分析
安裝好Python的Sklearn庫后,在安裝包下的路徑中就能看到描述波士頓房價的csv文件,具體路徑是“python安裝路徑\Lib\site-packages\sklearn\datasets\data”,在這個目錄中還包含了Sklearn庫會用到的其他數(shù)據(jù)文件,本節(jié)用到的是包含在boston_house_prices.csv文件中的波士頓房價信息。打開這個文件,可以看到如圖所示的數(shù)據(jù)。?第1行的506表示該文件中包含506條樣本數(shù)據(jù),即有506條房價數(shù)據(jù),而13表示有13個影響房價的特征值,即從A列到M列這13列的特征值數(shù)據(jù)會影響第N列MEDV(即房價值),在表13.1中列出了部分列的英文標題及其含義。波士頓房價文件部分中英文標題一覽表從表中可以看到,波士頓房價的數(shù)值(即MEDV)和諸如“住宅用地超過某數(shù)值的比例”等13個特征值有關(guān)。而線性回歸要解決的問題是,量化地找出這些特征值和目標值(即房價)的線性關(guān)系,即找出如下的k1到k13系數(shù)的數(shù)值和b這個常量值。MEDV = k1*CRIM + k2*ZN + … + k13*LITAT + b上述參數(shù)有13個,為了簡化問題,先計算1個特征值(DIS)與房價(MEDV)的關(guān)系,然后在此基礎(chǔ)上講述13個特征值與房價關(guān)系的計算方式。如果只有1個特征值DIS,它與房價的線性關(guān)系表達式如下所示。在計算出k1和b的值以后,如果再輸入對應DIS值,即可據(jù)此計算MEDV的值,以此實現(xiàn)線性回歸的預測效果。MEDV = k1*DIS + b2、以波士頓房價數(shù)據(jù)為案例,搭建含一個特征值的線性預測模型
在下面的OneParamLR.py范例程序中,通過調(diào)用Sklearn庫中的方法,以訓練加預測的方式,推算出一個特征值(DIS)與目標值(MEDV,即房價)的線性關(guān)系。??# !/usr/bin/env python# coding=utf-8import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn import datasets from sklearn.linear_model import LinearRegression在上述代碼中導入了必要的庫,其中第6行和第7行用于導入sklearn相關(guān)庫。? ??# 從文件中讀數(shù)據(jù),并轉(zhuǎn)換成DataFrame格式dataset=datasets.load_boston()data=pd.DataFrame(dataset.data)data.columns=dataset.feature_names # 特征值data['HousePrice']=dataset.target # 房價,即目標值# 這里單純計算離中心區(qū)域的距離和房價的關(guān)系dis=data.loc[0:data['DIS'].size-1,'DIS'].as_matrix()housePrice=data.loc[0:data['HousePrice'].size-1,'HousePrice'].as_matrix()在第9行中,加載了Sklearn庫下的波士頓房價數(shù)據(jù)文件,并賦值給dataset對象。在第10行通過dataset.data讀取了文件中的數(shù)據(jù)。在第11行通過dataset.feature_name讀取了特征值,如前文所述,data.columns對象中包含了13個特征值。在第12行通過dataset.target讀取目標值,即MEDV列的房價,并把目標值設(shè)置到data的HousePrice列中。在第14行讀取了DIS列的數(shù)據(jù),并調(diào)用as_matrix方法把讀到的數(shù)據(jù)轉(zhuǎn)換成矩陣中一列的格式,在第15行中,是用同樣的方法把房價數(shù)值轉(zhuǎn)換成矩陣中列的格式。# 轉(zhuǎn)置一下,否則數(shù)據(jù)是豎排的 dis=np.array([dis]).T housePrice=np.array([housePrice]).T# 訓練線性模型 lrTool=LinearRegression() lrTool.fit(dis,housePrice) # 輸出系數(shù)和截距 print(lrTool.coef_) print(lrTool.intercept_)由于當前在dis和housePrice變量中保存是的“列”形式的數(shù)據(jù),因此在第16行和第17行中,需要把它們轉(zhuǎn)換成行格式的數(shù)據(jù)。在第20行中,通過調(diào)用LinearRegression方法創(chuàng)建了一個用于線性回歸分析的lrTool對象,在第21行中,通過調(diào)用fit方法進行基于線性回歸的訓練。這里訓練的目的是,根據(jù)傳入的一組特征值dis和目標值MEDV,推算出MEDV = k1*DIS + b公式中的k1和b的值。調(diào)用fit方法進行訓練后,ltTool對象就內(nèi)含了系數(shù)和截距等線性回歸相關(guān)的參數(shù),通過第23行的打印語句輸出了系數(shù),即參數(shù)k1的值,而第24行的打印語句輸出了截距,即參數(shù)b的值。# 畫圖顯示plt.scatter(dis,housePrice,label='Real Data')plt.plot(dis,lrTool.predict(dis),c='R',linewidth='2',label='Predict')# 驗證數(shù)據(jù)print(dis[0])print(lrTool.predict(dis)[0])print(dis[2])print(lrTool.predict(dis)[2])plt.legend(loc='best') # 繪制圖例plt.rcParams['font.sans-serif']=['SimHei']plt.title("DIS與房價的線性關(guān)系")plt.xlabel("DIS")plt.ylabel("HousePrice")plt.show()在第26行中,通過調(diào)用scatter方法繪制出x值是DIS,y值是房價的諸多散點,第27行則是調(diào)用plot方法繪制出DIS和預測結(jié)果的關(guān)系,即一條直線。之后就是用Matplotlib庫中的方法繪制出x軸y軸文字和圖形標題等信息。運行上述代碼,即可看到如圖所示的結(jié)果。圖中各個點表示真實數(shù)據(jù),每個點的x坐標是DIS值,y坐標是房價。而紅線則表示根據(jù)當前DIS值,通過線性回歸預測出的房價結(jié)果。下面通過輸出的數(shù)據(jù),進一步說明圖中以紅線形式顯示的預測數(shù)據(jù)的含義。通過代碼的第23行和24行輸出了系數(shù)和截距,結(jié)果如下。[[1.09161302]][18.39008833]即房價和DIS滿足如下的一次函數(shù)關(guān)系:MEDV = 1.09161302*DIS + 18.39008833。從第29行到第32行輸出了兩組DIS和預測房價數(shù)據(jù),每兩行是一組,結(jié)果如下。[4.09][22.85478557][4.9671][23.81223934]在已經(jīng)得到的公式中,MEDV = 1.09161302*DIS + 18.39008833,把第1行的4.09代入DIS,把第2行的22.85478557代入MEDV,發(fā)現(xiàn)結(jié)果吻合。同理,把第3行的DIS和第4行MEDV值代入上述公式,結(jié)果也吻合。也就是說,通過基于線性回歸的fit方法,訓練了lrTool對象,使之包含了相關(guān)參數(shù),這樣如果輸入其他的DIS值,那么ltTool對象根據(jù)相關(guān)參數(shù)也能算出對應的房價值。從可視化的效果來看,用DIS預測MEDV房價的效果并不好,原因是畢竟只用了其中一個特征值。不過,通過這個范例程序,還是可以看出基于線性回歸實現(xiàn)預測的一般步驟:根據(jù)一組(506條)數(shù)據(jù)的特征值(本范例中是DIS)和目標值(房價),調(diào)用fit方法訓練ltTool等線性回歸中的對象,讓它包含相關(guān)系數(shù),隨后再調(diào)用predict方法,根據(jù)由相關(guān)系數(shù)組成的公式,通過計算預測目標結(jié)果。3、以波士頓房價數(shù)據(jù)為案例,實現(xiàn)基于多個特征值的線性回歸
如果要用到波士頓房價范例中13個特征值來進行預測,那么對應的公式如下,這里要做的工作是,通過fit方法,計算如下的k1到k13系數(shù)以及b截距值。MEDV = k1*CRIM + k2*ZN + … + k13*LITAT + b在下面的MoreParamLR.py范例程序中,實現(xiàn)用13個特征值預測房價的功能。# !/usr/bin/env python# coding=utf-8from sklearn import datasetsfrom sklearn.linear_model import LinearRegressionimport matplotlib.pyplot as plt# 加載數(shù)據(jù)dataset = datasets.load_boston()# 特征值集合,不包括目標值房價featureData = dataset.datahousePrice = dataset.target在第7行中加載了波士頓房價的數(shù)據(jù),在第9行和第10行分別把13個特征值和房價目標值放入featureData和housePrice這兩個變量中。
lrTool = LinearRegression()lrTool.fit(featureData, housePrice)# 輸出系數(shù)和截距print(lrTool.coef_)print(lrTool.intercept_)上述代碼和前文推算一個特征值和目標值關(guān)系的代碼很相似,只不過在第12行的fit方法中,傳入的特征值是13個,而不是1個。在第14行和第15行的程序語句同樣輸出了各項系數(shù)和截距數(shù)值。# 畫圖顯示plt.scatter(housePrice,housePrice,label='Real Data')plt.scatter(housePrice,lrTool.predict(featureData),c='R',label='Predicted Data')plt.legend(loc='best') # 繪制圖例plt.rcParams['font.sans-serif']=['SimHei']plt.xlabel("House Price")plt.ylabel("Predicted Price")plt.show()在第17行繪制了x坐標和y坐標都是房價值的散列點,這些點表示原始數(shù)據(jù),在第19行繪制散列點時,x坐標是原始房價,y坐標是根據(jù)線性回歸推算出的房價。運行上述代碼,即可看到如圖所示的結(jié)果。其中藍色散列點表示真實數(shù)據(jù),紅色散列點表示預測出的數(shù)據(jù),和圖13-4相比,預測出的房價結(jié)果數(shù)據(jù)更靠近真實房價數(shù)據(jù),這是因為這次用了13個特征值來預測,而之前只用了其中一個特征數(shù)據(jù)來預測。另外,從控制臺中可以看到由第14行和15行的程序語句打印出的各項系數(shù)和截距。1??? [-1.08011358e-01? 4.64204584e-02? 2.05586264e-02? 2.68673382e+00? -1.77666112e+01? 3.80986521e+00 6.92224640e-04 -1.47556685e+00? 3.06049479e-01 -1.23345939e-02 -9.52747232e-01? 9.31168327e-03 -5.24758378e-01]2??? 36.459488385089855其中,第1行表示13個特征值的系數(shù),而第2行表示截距。代入上述系數(shù),即可看到如下的13個特征值與目標房價的對應關(guān)系——預測公式。得出如下的公式后,再輸入其他的13個特征值,即可預測出對應的房價。MEDV = -1.08011358e-01*CRIM + 4.64204584e-02*ZN + … + -5.24758378e-01*LITAT + 36.4594883850898554、激動人心的時刻,預測股票價格
在這里,將在下面的predictStockByLR.py范例程序中,根據(jù)股票歷史的開盤價、收盤價和成交量等特征值,從數(shù)學角度來預測股票未來的收盤價。# !/usr/bin/env python# coding=utf-8import pandas as pdimport numpy as npimport math import matplotlib.pyplot as pltfrom sklearn.linear_model import LinearRegressionfrom sklearn.model_selection import train_test_split# 從文件中獲取數(shù)據(jù)origDf = pd.read_csv('D:/stockData/ch13/6035052018-09-012019-05-31.csv',encoding='gbk')df = origDf[['Close', 'High', 'Low','Open' ,'Volume']]featureData = df[['Open', 'High', 'Volume','Low']]# 劃分特征值和目標值feature = featureData.valuestarget = np.array(df['Close'])第10行的程序語句從包含股票信息的csv文件中讀取數(shù)據(jù),在第14行設(shè)置了特征值是開盤價、最高價、最低價和成交量,同時在第15行設(shè)置了要預測的目標列是收盤價。在后續(xù)的代碼中,需要將計算出開盤價、最高價、最低價和成交量這四個特征值和收盤價的線性關(guān)系,并在此基礎(chǔ)上預測收盤價。# 劃分訓練集,測試集feature_train,feature_test,target_train ,target_test = train_test_split(feature,target,test_size=0.05)pridectedDays = int(math.ceil(0.05 * len(origDf))) # 預測天數(shù)lrTool = LinearRegression()lrTool.fit(feature_train,target_train) # 訓練# 用測試集預測結(jié)果predictByTest = lrTool.predict(feature_test)第17行的程序語句通過調(diào)用train_test_split方法把包含在csv文件中的股票數(shù)據(jù)分成訓練集和測試集,這個方法前兩個參數(shù)分別是特征列和目標列,而第三個參數(shù)0.05則表示測試集的大小是總量的0.05。該方法返回的四個參數(shù)分別是特征值的訓練集、特征值的測試集、要預測目標列的訓練集和目標列的測試集。第18行的程序語句計算了要預測的交易日數(shù),在第19行中構(gòu)建了一個線性回歸預測的對象,在第20行是調(diào)用fit方法訓練特征值和目標值的線性關(guān)系,請注意這里的訓練是針對訓練集的,在第22行中,則是用特征值的測試集來預測目標值(即收盤價)。也就是說,是用多個交易日的股價來訓練lrTool對象,并在此基礎(chǔ)上預測后續(xù)交易日的收盤價。至此,上面的程序代碼完成了相關(guān)的計算工作。# 組裝數(shù)據(jù)index=0# 在前95%的交易日中,設(shè)置預測結(jié)果和收盤價一致while index < len(origDf) - pridectedDays:df.ix[index,'predictedVal']=origDf.ix[index,'Close']df.ix[index,'Date']=origDf.ix[index,'Date']index = index+1predictedCnt=0# 在后5%的交易日中,用測試集推算預測股價while predictedCntdf.ix[index,'predictedVal']=predictByTest[predictedCnt]df.ix[index,'Date']=origDf.ix[index,'Date']predictedCnt=predictedCnt+1index=index+1在第26行到第29行的while循環(huán)中,在第27行把訓練集部分的預測股價設(shè)置成收盤價,并在第28行設(shè)置了訓練集部分的日期。在第32行到第36行的while循環(huán)中,遍歷了測試集,在第33行的程序語句把df中表示測試結(jié)果的predictedVal列設(shè)置成相應的預測結(jié)果,同時也在第34行的程序語句逐行設(shè)置了每條記錄中的日期。plt.figure()df['predictedVal'].plot(color="red",label='predicted Data')df['Close'].plot(color="blue",label='Real Data')plt.legend(loc='best') # 繪制圖例# 設(shè)置x坐標的標簽major_index=df.index[df.index%10==0]major_xtics=df['Date'][df.index%10==0]plt.xticks(major_index,major_xtics)plt.setp(plt.gca().get_xticklabels(), rotation=30)# 帶網(wǎng)格線,且設(shè)置了網(wǎng)格樣式plt.grid(linestyle='-.')plt.show()在完成數(shù)據(jù)計算和數(shù)據(jù)組裝的工作后,從第37行到第48行程序代碼的最后,實現(xiàn)了可視化。第38行和第39行的程序代碼分別繪制了預測股價和真實收盤價,在繪制的時候設(shè)置了不同的顏色,也設(shè)置了不同的label標簽值,在第40行通過調(diào)用legend方法,根據(jù)收盤價和預測股價的標簽值,繪制了相應的圖例。從第42行到第45行設(shè)置了x軸顯示的標簽文字是日期,為了不讓標簽文字顯示過密,設(shè)置了“每10個日期里只顯示1個”的顯示方式,并且在第47行設(shè)置了網(wǎng)格線的效果,最后在第48行通過調(diào)用show方法繪制出整個圖形。運行本范例程序,即可看到如圖所示的結(jié)果。從圖中可以看出,藍線表示真實的收盤價(圖中完整的線),紅線表示預測股價(圖中靠右邊的線。因為本書黑白印刷的原因,在書中讀者看不到藍色和紅色,請讀者在自己的計算機上運行這個范例程序即可看到紅藍兩色的線)。雖然預測股價和真實價之間有差距,但漲跌的趨勢大致相同。而且在預測時沒有考慮到漲跌停的因素,所以預測結(jié)果的漲跌幅度比真實數(shù)據(jù)要大。本文轉(zhuǎn)載自博客園文章【通過機器學習的線性回歸算法預測股票走勢(用Python實現(xiàn))】
作者:hsm_computer
原文鏈接:
https://www.cnblogs.com/JavaArchitect/p/11717998.html
封面圖及頭圖來源:Photo by?Chris Liveranion?Unsplash總結(jié)
以上是生活随笔為你收集整理的python 预测算法_通过机器学习的线性回归算法预测股票走势(用Python实现)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python对异常_关于python中的
- 下一篇: python中del和remove的区别