python数据生成正态分布图_Python 与金融数据生成机器学习的特征数据
接下來幾期我們將使用機器學習方法幫助我們預測未來股票交易數據的走勢。在此之前我們需要對數據進行預處理以供機器學習方法使用。這一期我們將以復權收盤價數據為例,學習如何生成有效的特征數據。
FinTech History
Python 與金融數據|股票數據的獲取與可視化
Python 與金融數據|數據的滑動平均值及多圖可視化
Python 與金融數據|數據的重采樣與蠟燭圖(K線圖)的繪制
Python 與金融數據|網頁爬取上證50股票代碼
Python 與金融數據|批量抓取并保存上證50的交易數據
Python 與金融數據|上證50的收盤價匯總
Python 與金融數據|繪制股票間的相關性圖表
概??述前面幾期的教程中,我們學習了從網上獲取交易數據的方法,學習了將數據可視化的方法,學習了簡單的數據清洗和數據合并的方法,另外,我們還學習了分析數據之間的相關性以及將相關性關系以可視化的方式展現出來。
接下來,我們將進一步處理這些數據,并基于這些數據,借助機器學習的一些方法幫助我們更深入的分析和預測現有以及未來的數據。
同樣以這里的股票數據為例,我們知道,隨著時間的推移,數據之間可能存在一些相關性。例如,一個公司的股票走勢,可能會受到其他相關公司的股票走勢的影響,那么如果能夠讓計算機找到并且模擬這一相關性的關系,從某種程度上來說,我們就可以預測特定公司未來的交易信息。
這一目標可以通過‘機器學習’來實現。機器學習的過程實際上是去建立數據的特征與標簽的映射關系,并把所有的標簽分類。有了這樣一種關系之后,給定一個特征,‘機器’ 就會將特征映射為一個‘標簽’,這個標簽所屬的類別就可以作為預測的結果。
對于股票數據來說,特征可以是股票的價格。一般的,為了讓預測結果更加準確,需要選取一些有代表性的特征。
我們選取未來幾天內每一支股票價格的變化率作為特征,將股票的變化趨勢作為標簽,我們將一部分標簽分為繼續買入一類,一部分作為賣出類,其余部分作為繼續持有類。
例如我們可以規定,對于股票 A,如果在接下來的 x 天內,股票成交價的增幅可能在 y% 以上,我們就在當前時間點繼續買入這家股票。如果未來 x 天成交價的降幅在 y% 以上,我們就在當前時間點賣出這家股票。對于其他預測結果,我們選擇繼續持有這家股票。
所以,我們的目標是使用機器學習方法,預測未來 x 天的交易信息,并給出指導性的交易方案(買入/賣出/繼續持有)。
數據特征的生成
我們首先生成交易信息的特征數據,按照前面的分析,在當前時間點,我們選取最多 x 天后股價相對于當前時間點股票變化的百分比作為特征。
例如取 x=7,那么對于股票 A,我們就建立 7 列特征數據,分別表示 1 天后,2 天后,...,7 天后的股價相比于當前股價的變化率。我們使用函數 processDataForLables?來實現這一功能:
def processDataForLables(ticker):函數的參數是股票代碼,我們需要為每一支想要分析的股票建立特征數據。
這一期我們主要還是以每支股票的復權收盤價為例,與往常一樣,首先讀取交易數據:
dataFrame = pd.read_csv('SS50JoinedClose.csv', index_col=0)然后對數據進行簡單的過濾清洗,將空白數據都用 0 填充:
dataFrame.fillna(0, inplace=True)另外,為了方便后續的一些操作,先提取所有的股票代碼,以列表的格式保存在變量 tickers?中備用:
tickers?=?dataFrame.columns.values接下來,設置數據的特征:
nDays = 7for i in range(1, nDays+1): dataFrame['{}_{}d'.format(ticker, i)] = (dataFrame[ticker].shift(-i) - dataFrame[ticker]) / dataFrame[ticker]我們使用?shift(-i)?這個方法獲取 i 天后的收盤價。這里生成了 7?天內的特征值,對于名稱為 ticker 的股票,生成 7 列特征值,每一列的索引名稱為?'ticker_1d', 'ticker_2d', ... , 'ticker_7d'。
接下來,再對生成的數據進行簡單的處理,同樣的方法,將空白的位置填充上 0:
dataFrame.fillna(0, inplace=True)這樣對于任意給定的股票,就生成了它的特征信息,最后函數范圍生成的特征值,為了后續方便使用,我們同時返回所有的股票代碼:
return tickers, dataFrame最后測試一下,以 '600585.SS'?這支股票為例:
tickers, dataFrame = processDataForLables('600585.SS')print(dataFrame)參考輸出如下:
600036.SS 601229.SS ... 600585.SS_6d 600585.SS_7dDate ... 2010-01-04 11.171289 0.00 ... -0.050209 -0.0900432010-01-05 11.183971 0.00 ... -0.078956 -0.0724492010-01-06 10.950527 0.00 ... -0.074588 -0.0783602010-01-07 10.666690 0.00 ... -0.048042 -0.0456592010-01-08 10.666690 0.00 ... -0.047514 -0.011015 ... ... ... ... ...2020-11-23 45.400002 7.98 ... 0.000000 0.0000002020-11-24 44.869999 7.94 ... 0.000000 0.0000002020-11-25 44.430000 7.93 ... 0.000000 0.0000002020-11-26 45.090000 7.96 ... 0.000000 0.0000002020-11-27 45.849998 8.09 ... 0.000000 0.000000[2649 rows x 57 columns]參考代碼
#!/usr/bin/env python3# -*- coding: utf-8 -*-"""@author: IT信息教室(微信公眾號)訂閱/關注,在看、分享三連吧~"""def?processDataForLables(ticker): dataFrame = pd.read_csv('SS50JoinedClose.csv', index_col=0) dataFrame.fillna(0, inplace=True) tickers = dataFrame.columns.values nDays = 7 for i in range(1, nDays+1): # The increasing rate of adj close with i day(s). dataFrame['{}_{}d'.format(ticker, i)] = (dataFrame[ticker].shift(-i) - dataFrame[ticker]) / dataFrame[ticker] dataFrame.fillna(0, inplace=True) ????return?tickers,?dataFrametickers, dataFrame = processDataForLables('600585.SS')print(dataFrame)Codes: M先森看世界Edit: M先森看世界
ONE MORE THING
如果您對內容有什么需求建議,或者遇到了什么軟件、應用使用方面的問題,請直接在公眾號主界面下發私信給我,我看都會及時回復。感謝大家的支持!
合作:?classroom.it@hotmail.com
Hi
你好呀
我是?M先森?
這是一個共同學習的平臺
我會把我會的?你們想學的
做成教程或者寫成文章
我們在這一起學英語?
學編程?學算法
學各種各樣
好玩的好用的軟件
記得要?;貋砜纯囱?/p>
(^_^)a(^_^)a
點擊?閱讀原文?查看Python入門教程~
喜歡就點個 分享?點贊?在看?三連吧!
總結
以上是生活随笔為你收集整理的python数据生成正态分布图_Python 与金融数据生成机器学习的特征数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dlink无线路由器手机怎么设置dlin
- 下一篇: websocket python爬虫_p