【机器学习】线性回归实战案例三:股票数据价格区间预测模型(国外+国内数据)
股票數(shù)據(jù)價格區(qū)間預(yù)測模型(國外+國內(nèi)數(shù)據(jù))
- 案例三:股票數(shù)據(jù)價格區(qū)間預(yù)測模型(國外+國內(nèi)數(shù)據(jù))
- 2.3.1 模塊加載與忽略警告設(shè)置
- 2.3.2 加載數(shù)據(jù)和數(shù)據(jù)篩選
- 2.3.3 探索式數(shù)據(jù)分析(EDA)
- 2.3.4 探究字段之間的關(guān)聯(lián)性
- 2.3.5 特征工程
- 2.3.6 模型創(chuàng)建與應(yīng)用
- 2.3.7 模型對比
- 2.3.8 預(yù)測結(jié)果可視化
- 2.3.9 國內(nèi)茅臺股票數(shù)據(jù)集應(yīng)用
手動反爬蟲,禁止轉(zhuǎn)載: 原博地址 https://blog.csdn.net/lys_828/article/details/121452962(CSDN博主:Be_melting) 知識梳理不易,請尊重勞動成果,文章僅發(fā)布在CSDN網(wǎng)站上,在其他網(wǎng)站看到該博文均屬于未經(jīng)作者授權(quán)的惡意爬取信息
案例三:股票數(shù)據(jù)價格區(qū)間預(yù)測模型(國外+國內(nèi)數(shù)據(jù))
2.3.1 模塊加載與忽略警告設(shè)置
打開Jupyter notebook,然后新建一個python3文件,命名為股票時序數(shù)據(jù)回歸預(yù)測模型1.ipynb。文件首個cell中導(dǎo)入數(shù)據(jù)分析常用模塊和模型相關(guān)的模塊,設(shè)置提示警告的過濾,代碼如下。
import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression import math import seaborn as sns import datetime import matplotlib.pyplot as plt from matplotlib import style import timeimport warnings warnings.filterwarnings('ignore')2.3.2 加載數(shù)據(jù)和數(shù)據(jù)篩選
準(zhǔn)備的數(shù)據(jù)集為谷歌2004年的股票數(shù)據(jù),讀取過程中將Date字段進(jìn)行時間字段轉(zhuǎn)化,并設(shè)置為索引,然后查看數(shù)據(jù)的維度。
df=pd.read_csv('./data/google-stockdata.csv',index_col='Date',parse_dates=True) df輸出結(jié)果如下。(直接輸出讀取后文件數(shù)據(jù)對應(yīng)的變量,最后面一行會有提示數(shù)據(jù)的維度,一共有3424行,12列,相當(dāng)于最后輸出了df.shape)
了解一下股票數(shù)據(jù)的基本信息,一般就是包含了前六個字段(包含索引),即股票的開盤時間、開盤價、最高點(diǎn)、最低點(diǎn)、收盤價和成交量。最后面的五個字段是經(jīng)過復(fù)權(quán)后的衍生字段,而中間的兩個字段是在案例中沒有使用到。
2.3.3 探索式數(shù)據(jù)分析(EDA)
之前的兩個案例中均展示了探索式數(shù)據(jù)分析的幾個步驟,這里就不再進(jìn)行贅述。但是對于字段中的缺失值的查看一定是要做的,如果存在著缺失值就要進(jìn)行缺失值處理,確保傳入模型的數(shù)據(jù)是一個完整的數(shù)據(jù),輸出結(jié)果如下。
在提供的數(shù)據(jù)中并沒有缺失的數(shù)據(jù),但是經(jīng)過仔細(xì)研究發(fā)現(xiàn)股票數(shù)據(jù)中并沒有一個標(biāo)簽字段,因此要進(jìn)行線性回歸模型創(chuàng)建前需要先解決標(biāo)簽數(shù)據(jù)的問題。本案例的目標(biāo):預(yù)測未來股票的價格區(qū)間,需要根據(jù)歷史的股票價錢(收盤價)來預(yù)測未來股票價錢的情況。
考慮數(shù)據(jù)量進(jìn)行時間范圍的確定。數(shù)據(jù)量一共3424行,假定按照數(shù)據(jù)量除以100取上限進(jìn)行預(yù)測天數(shù)的確定,然后就可以構(gòu)造對應(yīng)標(biāo)簽數(shù)值。為了便于理解這個構(gòu)建標(biāo)簽數(shù)值的過程,可以進(jìn)行一個簡單的示例,先以5天為基準(zhǔn)構(gòu)建數(shù)據(jù)。為了不破壞數(shù)據(jù)和方便查看,對原數(shù)據(jù)進(jìn)行備份后取出10條數(shù)據(jù)進(jìn)行演示。
接著就是利用pandas應(yīng)用基礎(chǔ)中第10小結(jié)的內(nèi)容,shift時間平移操作。首先提取經(jīng)過復(fù)權(quán)后的收盤價字段并轉(zhuǎn)化為DataFrame數(shù)據(jù)類型,進(jìn)一步應(yīng)用shift(-5)變換并賦值給新字段,最后就是新字段與原字段相減獲得相差5天的數(shù)據(jù)。
輸出結(jié)果如下。(采用 shift 加上負(fù)值的方法 可以把同一組數(shù)據(jù)錯位的放在一起,這個錯位是把5天后的數(shù)據(jù)與當(dāng)前天的數(shù)據(jù)放在同一行中,然后兩個字段數(shù)值相減就可以獲得對應(yīng)天數(shù)股票價格的差值)
利用上面的原理,應(yīng)用到整個股票數(shù)據(jù)集中,
forecast_col = 'Adj. Close' forecast_out = int(math.ceil(0.01 * len(df))) df['label'] = df[forecast_col].shift(-forecast_out) df[-40:-30]輸出結(jié)果如下。(為了核實(shí)是否處理正確,切片獲取倒數(shù)第40到第30行的數(shù)據(jù),輸出結(jié)果中l(wèi)abel字段數(shù)據(jù)有一半缺失一般完整,說明操作過程正確)
也可以直接查看各字段的缺失值進(jìn)行核實(shí),輸出結(jié)果如下,最終就是創(chuàng)建的字段label中存在著35條缺失值,滿足要求。
2.3.4 探究字段之間的關(guān)聯(lián)性
完成了標(biāo)簽字段數(shù)據(jù)的構(gòu)建,接下來就可以查看特征字段與標(biāo)簽字段的關(guān)聯(lián)性,直接利用熱力圖進(jìn)行展示輸出。
確定標(biāo)簽字段后,在熱力圖中只需要查看標(biāo)簽字段label對應(yīng)的行或者列即可,比如上圖紅框標(biāo)注的列。根據(jù)圖中的結(jié)果,首先看兩個不相關(guān)的字段,也就是中間的那兩個字段在整個案例中沒有進(jìn)行介紹也和標(biāo)簽字段無關(guān),后續(xù)直接進(jìn)行剔除;然后就是股票除時間外的剩下的5個信息與調(diào)整后的5個信息,由于標(biāo)簽字段就是利用調(diào)整后的收盤價字段構(gòu)造的,所以會和調(diào)整后的收盤價相相關(guān)性為0.99,然而調(diào)整后的4個信息之間的相關(guān)性都為1,自然標(biāo)簽字段和剩下的3個信息直接的相關(guān)性也是0.99,至于未調(diào)整前的數(shù)據(jù),是經(jīng)過一定的計算轉(zhuǎn)化而來,相關(guān)性數(shù)值相對較小一些,但是也是存在很強(qiáng)的相關(guān)性。
2.3.5 特征工程
根據(jù)關(guān)聯(lián)性分析的結(jié)果重新提取字段數(shù)據(jù),構(gòu)建數(shù)據(jù)集,創(chuàng)建兩個新字段為高低價變化差和漲跌幅,并進(jìn)行缺失值的處理。
df = df[['Adj. Open', 'Adj. High', 'Adj. Low', 'Adj. Close', 'Adj. Volume','label']] df['HL_PCT'] = (df['Adj. High'] - df['Adj. Low']) / df['Adj. Close'] * 100.0 df['PCT_change'] = (df['Adj. Close'] - df['Adj. Open']) / df['Adj. Open'] * 100.0 df.dropna(inplace=True) df.isnull().sum()輸出結(jié)果如下。(在進(jìn)行創(chuàng)建模型之前,數(shù)據(jù)中的缺失值需要清洗干凈,此外添加的兩個字段也在數(shù)據(jù)集中)
2.3.6 模型創(chuàng)建與應(yīng)用
(1)劃分特征數(shù)據(jù)X和標(biāo)簽數(shù)據(jù)Y
(2)劃分訓(xùn)練集和測試集。這里的數(shù)據(jù)集需要特別注意,在刪除最后的缺失值后,中最后35條數(shù)據(jù)label值其實(shí)就是已經(jīng)要預(yù)測的數(shù)據(jù)值,因此在數(shù)據(jù)集也需要進(jìn)行刪除。比如最后一行數(shù)據(jù)是2018年2月5號,對應(yīng)的label就是2018年3月27號的數(shù)據(jù)(去掉了周末),最后的35天就作為真實(shí)值要進(jìn)行預(yù)測35天后的價格進(jìn)行差值對比,所以需要再將最后35行數(shù)據(jù)刪除。
然后才是進(jìn)行訓(xùn)練集和測試集的劃分,按照9:1的比例進(jìn)行。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)(3)模型創(chuàng)建與擬合。
clf=LinearRegression() clf.fit(X_train,y_train)(4)模型預(yù)測與評估。
forecast_set = clf.predict(X_lately) forecast_set輸出結(jié)果如下。(最終的股票價錢是在1082-1262之間)
然后查看一下當(dāng)前模型預(yù)測股票區(qū)間的正確率得分有多少,代碼及輸出結(jié)果如下。(未來35天的股票價格區(qū)間預(yù)測,有97.4%的正確率使得最終的股票價格落在1082-1262之間)
2.3.7 模型對比
在進(jìn)行數(shù)據(jù)集構(gòu)建時,細(xì)心點(diǎn)可以發(fā)現(xiàn)特征字段的量綱不一致,比如價錢字段和成交量字段數(shù)值。接下來就是確定特征數(shù)據(jù)標(biāo)準(zhǔn)化會不會對模型有一定的優(yōu)化,需要添加一個標(biāo)量處理器,之后的模型步驟保持一致,建模部分全部代碼和最終測試得分如下。
#劃分特征數(shù)據(jù)和標(biāo)簽數(shù)據(jù) X = np.array(df.drop(['label'], 1)) y = np.array(df['label'])#特征數(shù)據(jù)標(biāo)量化 from sklearn import preprocessing X = preprocessing.scale(X)#進(jìn)行最后35行數(shù)據(jù)剔除 X_lately = X[-forecast_out:] X = X[:-forecast_out] y = y[:-forecast_out]#劃分訓(xùn)練數(shù)據(jù)與測試數(shù)據(jù) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)#創(chuàng)建線性回歸模型 clf=LinearRegression()#模型擬合 clf.fit(X_train,y_train)#模型預(yù)測結(jié)果及輸出股票價格區(qū)間 forecast_set = clf.predict(X_lately) min(forecast_set),max(forecast_set)#模型得分 confidence = clf.score(X_test, y_test) confidence最終輸出的模型預(yù)測的股票價格區(qū)間(1080-1217之間)與模型得分結(jié)果(正確率為97.7%)如下。由于沒有指定隨機(jī)種子,每次程序跑出的結(jié)果基本上都不會完全一致。
2.3.8 預(yù)測結(jié)果可視化
由于標(biāo)簽的結(jié)果帶有時序性且是數(shù)值型,就可以對預(yù)測的結(jié)果進(jìn)行可視化展示。由于刪除了倒數(shù)35行的數(shù)據(jù),因此要得到繪制35天后的數(shù)據(jù),就需要先獲得最后35行對應(yīng)的時間,代碼如下。
df['Forecast'] = np.nan last_date = df.iloc[-1].name last_unix = last_date.timestamp() last_unix = time.mktime(last_date.timetuple()) one_day = 864006 next_unix = last_unix + one_day輸出結(jié)果如下。(之前進(jìn)行數(shù)據(jù)集處理的時候?qū)⒆詈?5條數(shù)據(jù)刪除,現(xiàn)在輸出結(jié)果匯總把添加了Forecast字段)
然后將預(yù)測的結(jié)果進(jìn)行填充到對應(yīng)的時間中去,就可以獲得預(yù)測結(jié)果,代碼如下。
輸出結(jié)果如下。(需要留意,模型數(shù)據(jù)中最后日期是2018年2月5號,預(yù)測的結(jié)果對應(yīng)label值,這個數(shù)據(jù)就是35天后的股票價格,映射到對應(yīng)的時間段就如下)
有了數(shù)據(jù)后,進(jìn)行可視化,代碼及輸出結(jié)果如下。
繪制預(yù)測數(shù)據(jù)的圖像代碼與結(jié)果輸出如下。
添加兩圖合并后,代碼及可視化圖形輸出如下。
2.3.9 國內(nèi)茅臺股票數(shù)據(jù)集應(yīng)用
在使用國外谷歌的數(shù)據(jù)進(jìn)行線性回歸回歸模型的預(yù)測中,模型得分正確率達(dá)到了97%,而對于國內(nèi)股票的預(yù)測效果如何,接下來進(jìn)行探究。創(chuàng)建一個新的python3文件,命名為股票時序數(shù)據(jù)回歸預(yù)測模型2.ipynb,數(shù)據(jù)集為茅臺酒的股票數(shù)據(jù)(對應(yīng)的編號為600519)。首先導(dǎo)入模塊和加載數(shù)據(jù),代碼如下。
import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression import math import seaborn as sns import matplotlib.pyplot as pltdf2 = pd.read_csv('./data/600519d4.csv',index_col='trade_date',parse_dates=True)輸出結(jié)果如下:(股票數(shù)據(jù)的時間跨度為2020年1月2日到2021年10月21日,可以通過tushare接口下載)
按照習(xí)慣,時間索引一般是按照從前到后(即從以前到現(xiàn)在)的方式設(shè)置,也方便繪制圖形,進(jìn)行反序操作后繪制折線圖查看茅臺股票走勢圖,代碼及輸出結(jié)果如下。
剩下的步驟就是按照前面國外數(shù)據(jù)的處理方式一致,首先進(jìn)行預(yù)測時間長短的設(shè)置,需要根據(jù)數(shù)據(jù)量來確定,這里的時間設(shè)定為22天。
進(jìn)一步構(gòu)建數(shù)據(jù)集和缺失值處理,并進(jìn)行特征數(shù)據(jù)以及標(biāo)簽數(shù)據(jù)的劃分,并剔除最后22天的數(shù)據(jù),代碼如下。
最后就是進(jìn)行模型的創(chuàng)建,訓(xùn)練,預(yù)測和評估,代碼及輸出結(jié)果如下。
模型最后的準(zhǔn)確率只有0.796,遠(yuǎn)遠(yuǎn)低于使用國外數(shù)據(jù)進(jìn)行建模時候的得分,更進(jìn)一步采用以往進(jìn)行模型評估的方法查看一下平均絕對誤差和R方值(就是模型的score得分),輸出結(jié)果如下。
利用預(yù)測結(jié)果的平均值結(jié)合平均絕對誤差,可以推測該模型預(yù)測單次預(yù)測股票數(shù)據(jù)的漲跌幅范圍,即正負(fù)7.13%,而股票一天的最大漲跌幅就是正負(fù)10%,這個預(yù)測結(jié)果太過粗糙了,基本上沒有意義。根本原因在于國內(nèi)的股票數(shù)據(jù)的波動幅度太大,就會導(dǎo)致預(yù)測數(shù)值與真實(shí)數(shù)值之間的誤差就會擴(kuò)大,模型最終的得分也就下降,對于未來數(shù)據(jù)的預(yù)測效果就很差,因此在對此類數(shù)據(jù)進(jìn)行建模之前需要對數(shù)據(jù)進(jìn)行平滑處理。
對于金融類數(shù)據(jù),可以嘗試ta模塊,各種指標(biāo)已經(jīng)封裝在pandas中了,只需要進(jìn)行pip install pandas_ta即可進(jìn)行安裝。
查看具體有哪些指標(biāo)可以按照如下代碼進(jìn)行輸出,當(dāng)前一共有205個指標(biāo)。
假定選取里面的EMA指標(biāo)進(jìn)行數(shù)據(jù)平滑處理,以收盤價字段和10天為依據(jù),將處理后的內(nèi)容添加到新的字段中。
也是和手動設(shè)定天數(shù)的步驟一樣,需要進(jìn)行缺失值的查看,除去和核實(shí),代碼如下。
也可以借助圖形查看經(jīng)過平滑處理過后的股票數(shù)據(jù)折線圖和原數(shù)據(jù)折線圖之間的對比,代碼及輸出結(jié)果如下。
數(shù)據(jù)處理完畢后,進(jìn)一步構(gòu)建數(shù)據(jù)集和缺失值處理,并進(jìn)行特征數(shù)據(jù)以及標(biāo)簽數(shù)據(jù)的劃分,代碼如下。(對于采用EMA指標(biāo)處理數(shù)據(jù)后,這里的標(biāo)簽數(shù)據(jù)和特征數(shù)據(jù)就不需要再次進(jìn)行最后10條數(shù)據(jù)的剔除,因?yàn)槭褂玫牟⒉皇窃瓉碚鎸?shí)的數(shù)據(jù),而是一個計算的數(shù)據(jù),并非直接線性相關(guān))
最終的輸出股票價格區(qū)間和對應(yīng)的模型得分,以及預(yù)測股票價格的漲跌幅結(jié)果如下。數(shù)據(jù)經(jīng)過平滑處理過后,模型預(yù)測的準(zhǔn)確度要大大提升,最后的漲跌幅度的范圍拿捏著也很準(zhǔn)確。
總結(jié)
以上是生活随笔為你收集整理的【机器学习】线性回归实战案例三:股票数据价格区间预测模型(国外+国内数据)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows下的Tomcat7安装与环
- 下一篇: ChIP-Atlas:基于公共chip_