
干貨丨 用 Python 進行股票分析
人們很容易被豐富的數據和各種免費開源工具所吸引。在研究了quandl financial library和prophet modeling library之后,我打算試著探究簡單的股票數據。我花了幾天的時間,前后寫了1000多行Python代碼,最終得出了一個完整的股票分析預測工具。雖然我沒有自信用這個來投資某些個股,但在整個過程中我學到了很多Python的知識。秉承開源的精神,在這里我打算分享這些代碼,讓更多的人受益。
本文將展示如何使用Stocker,這是基于Python的股票分析預測工具。我看過一些對象導向的Python編程書籍,但就像大多數編程書籍一樣,當我閱讀這些書時,我并沒有真正理解當中的內容。只有當我在深入一個項目,且遇到從未解決問題時,我才會終于理解那些概念,這也再次證明了實踐比理論更重要。除了探索Stocker之外,我們還會涉及一些重要的內容,包括Python的基礎知識和加性模型(additive model)。如果你想使用Stocker,可以在GitHub上找到完整的代碼以及使用文檔。Stocker很簡單易用,即使是Python初學者也能學會,我建議每個人都試試。下面讓我們一起看看Stocker的分析能力!
Stocker入門
在安裝完需要的庫之后,我們首先要將Stocker類導入到Python會話中。這里可以使用交互式Python會話或者在腳本目錄中啟動Jupyter Notebook。
from stocker import Stocker
現在,我們的Python會話中有了Stocker類,接著可以用它來創建類的實例。在Python中,類的實例稱為對象,創建對象有時稱為實例化或構造。為了創建一個Stocker對象,我們需要傳遞一個有效的股票代碼。
microsoft = Stocker('MSFT') MSFT Stocker Initialized. Data covers 1986-03-13 to 2018-01-16.
現在,我們有了具有Stocker類屬性的microsoft對象。Stocker建立在quandl WIKI數據庫上,因此我們可以訪問3000多只美國股票,并且可以查看多年的每日價格數據。這里我建議使用微軟的數據。盡管微軟被認為是開源的對立面,但他們最近做了一些改變,因此我認為他們正在接受開源社區(包括Python)。
Python中的類由兩個主要部分組成:屬性和方法。沒有太多的細節,屬性是與類相關的值或數據,或者是類的特定實例(對象)。方法是類中可用于數據的函數。Stocker對象的一個屬性是特定公司的股票數據,當我們進行構造時,屬性與該對象相關聯。我們可以訪問該屬性,并將其分配給另一變量進行檢查:
# Stock is an attribute of the microsoft object stock_history = microsoft.stock stock_history.head()
微軟股票數據
Python類的好處是方法(函數)和所操作的數據與同一個對象相關聯。我們可以使用Stocker對象的方法來繪制股票的歷史股價。
# A method (function) requires parentheses microsoft.plot_stock() Maximum Adj. Close = 89.58 on 2018-01-12. Minimum Adj. Close = 0.06 on 1986-03-24. Current Adj. Close = 88.35.
默認值是調整后的收盤價格,這解釋了股票拆分的原因(當一只股票被拆分成多只股票,比如2,每個新股票的價值是原始價格的1/2)。
這個圖可以在谷歌搜索中輕松找到,但是這里我們可以用Python代碼完成。plot_stock函數有許多可選的參數。默認情況下,這種方法會繪制整個日期范圍的調整收盤價格,但我們還可以選擇范圍、統計數據和繪圖類型。例如,如果我們想比較每日價格變化與交易量(股票數量),我們可以在函數指定那些變量。
microsoft.plot_stock(start_date = '2000-01-03', end_date = '2018-01-16', stats = ['Daily Change', 'Adj. Volume'], plot_type='pct') Maximum Daily Change = 2.08 on 2008-10-13. Minimum Daily Change = -3.34 on 2017-12-04. Current Daily Change = -1.75. Maximum Adj. Volume = 591052200.00 on 2006-04-28. Minimum Adj. Volume = 7425503.00 on 2017-11-24. Current Adj. Volume = 35945428.00.
注意,y軸的百分比變化對應統計的平均值。這個規模是有必要的,因為股票的日常交易量數以億計,而每日價格變化通常是幾美元!通過轉換為百分比的變化,我們可以用類似的規模查看這兩個數據集。該圖表顯示,交易的股票數量和每日價格變化之間沒有相關性,這很令人驚訝。我們通常認為,在股價變動大的時候股票交易更多。然而,真正的情況是交易量隨著時間而下降。2017年12月4日,價格大幅度下降,我們可以聯系相關微軟新聞。12月3日的新聞如下:
不確定這些新聞來源是否可靠
當然,沒有任何跡象表明微軟股票將在第二天出現十年來最大的下跌。
使用plot_stock,我們可以查看任何日期的數據,并查找與現實事件(如果有的話)的相關性。接下來,我們看到Stocker當中很有意思的部分。
假設我們很有遠見的在公司首次公開募股(IPO)中投資了100股微軟股票。那如今我們肯定賺翻了!
microsoft.buy_and_hold(start_date='1986-03-13', end_date='2018-01-16', nshares=100) MSFT Total buy and hold profit from 1986-03-13 to 2018-01-16 for 100 shares = $8829.11
除了讓我們感覺更好,使用這些結果能讓我們對之后進行規劃,實現利潤最大化。
microsoft.buy_and_hold(start_date='1999-01-05', end_date='2002-01-03', nshares=100) MSFT Total buy and hold profit from 1999-01-05 to 2002-01-03 for 100 shares = $-56.92
加性模型
加性模型是分析和預測時間序列的強大工具,而且是最常見的數據類型之一。這個概念很簡單:將時間序列表示為不同時間范圍和整體趨勢的組合。眾所周知,微軟股票的長期趨勢是穩步增長的,但也可能會有每年、每天的增長模式,比如每個星期二增長一次。由Facebook開發的Prophet是通過日常觀察,從而分析時間序列的庫。Stocker用Prophet完成了所有建模的工作,因此我們可以用簡單的方法創建、檢查模型。
model, model_data = microsoft.create_prophet_model()
加性模型可以消除數據中的噪音,這就是為什么建模線與觀測結果不完全一致的原因。Prophet模型能夠計算不確定性,這是建模的一個重要部分。我們也可以用Prophet模式來預測未來,但現在我們更關注過去的數據。注意,這個方法調用返回了兩個對象,模型和一些數據,我們將它們分配給變量?,F在我們用用這些變量繪制時間序列組件。
# model and model_data are from previous method call model.plot_components(model_data) plt.show()
總體趨勢是過去三年來的明顯增長。此外,還有一個值得注意的年度模式(下圖),股價在9月份和10月份觸底,11月份和1月份達到峰值。隨著時間范圍的縮短,數據中變化幅度越來越大。如果我們認為可能存在周模式,那么可以更改Stocker對象的weekly_seasonality屬性,并將其添加到prophet 模型中:
print(microsoft.weekly_seasonality) microsoft.weekly_seasonality = True print(microsoft.weekly_seasonality) False True
weekly_seasonality的默認值是False,但我們改變該值,從而讓模型包含周模式。然后,我們再次調用create_prophet_model并繪制結果組件。以下是新模式的每周模式。
我們可以忽略周末,因為價格只會在一周內發生變化。在繼續建模之前,我們將關閉每周的季節性。股票的走勢基本是隨機的,只能從每年的大范圍才能看到趨勢。
變點 (Change points)
當時間序列從遞增到遞減或相反情況時,會出現變點(嚴格地說,變點位于時間序列變化率最大的地方)。這是非常重要的,因為知道什么時候股票將上漲或達到頂峰會帶來顯著的經濟效益。識別變點能夠讓我們預測股票價格的未來波動。Stocker對象能夠自動為我們找到10個最大的變點。
microsoft.changepoint_date_analysis() Changepoints sorted by slope rate of change (2nd derivative): Date Adj. Close delta 48 2015-03-30 38.238066 2.580296 337 2016-05-20 48.886934 2.231580 409 2016-09-01 55.966886 -2.053965 72 2015-05-04 45.034285 -2.040387 313 2016-04-18 54.141111 -1.936257
變點往往與股價的高峰和低谷一致。Prophet只能在前80%的數據中找到變點,但是這些結果是有用的,因為我們可以嘗試將其與真實事件相關聯。我們可以重復之前的做法,比如在這些日期手動搜索相關新聞資訊,但是如果能讓Stocker完成就更好了。你也許知道搜索趨勢工具,該工具可讓你隨時查看谷歌搜索中的關鍵字的流行度。Stocker可以自動檢索任何搜索內容,并將結果繪制在原始數據上。為了查找和繪制搜索詞的頻率,我們修改了之前的方法調用。
# same method but with a search term microsoft.changepoint_date_analysis(search = 'Microsoft profit') Top Related Queries: query value 0 microsoft non profit 100 1 microsoft office 55 2 apple 30 3 microsoft 365 30 4 microsoft office 365 20 Rising Related Queries: query value 0 microsoft 365 120 1 microsoft office 365 90 2 microsoft profit 2014 70
除了繪制相關的搜索頻率外,Stocker還會顯示圖表日期范圍內的熱門搜索詞。通過將值除以最大值將y軸的值控制在0和1之間,從而讓我們比較兩個不同比例的變量。從圖中可以看出,搜索“微軟利潤”和微軟股價之間沒有任何聯系。
即使找到了相關性,還是存在因果關系的問題。我們不知道新聞是否導致價格變化,或價格變化導致搜索??赡苡袝业揭恍┯杏眯畔?,但也可能是偶然的。你可以試試不同的詞,看看能否找到相關趨勢。
microsoft.changepoint_date_analysis(search = 'Microsoft Office')
預測
到目前為止,我們只探索了Stocker一半的作用,另一半可以用來預測未來股價。雖然這可不會帶來收益,但在這個過程中能夠學到很多東西。
# specify number of days in future to make a prediction model, future = microsoft.create_prophet_model(days=180) Predicted Price on 2018-07-15 = $97.67
盡管Stocker的所有功能已經公開可用,但是創建這個工具的過程很有趣。重要的是相比大學課程,這能讓我學到更多的數據科學、Python和股票市場的知識。如今在大數據的時代,每個人都能學習編程、機器學習。如果你有項目創意,但不確定自己有能力去完成,不要讓它阻止你。你可能會得出更好的解決方案,即使沒有成功你也在過程中學到很多知識。
數據分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
CDA數據分析師證書考試體系(更新于2025年05月22日)
2025-05-26解碼數據基因:從數字敏感度到邏輯思維 每當看到超市貨架上商品的排列變化,你是否會聯想到背后的銷售數據波動?三年前在零售行 ...
2025-05-23在本文中,我們將探討 AI 為何能夠加速數據分析、如何在每個步驟中實現數據分析自動化以及使用哪些工具。 數據分析中的AI是什么 ...
2025-05-20當數據遇見人生:我的第一個分析項目 記得三年前接手第一個數據分析項目時,我面對Excel里密密麻麻的銷售數據手足無措。那些跳動 ...
2025-05-20在數字化運營的時代,企業每天都在產生海量數據:用戶點擊行為、商品銷售記錄、廣告投放反饋…… 這些數據就像散落的拼圖,而相 ...
2025-05-19在當今數字化營銷時代,小紅書作為國內領先的社交電商平臺,其銷售數據蘊含著巨大的商業價值。通過對小紅書銷售數據的深入分析, ...
2025-05-16Excel作為最常用的數據分析工具,有沒有什么工具可以幫助我們快速地使用excel表格,只要輕松幾步甚至輸入幾項指令就能搞定呢? ...
2025-05-15數據,如同無形的燃料,驅動著現代社會的運轉。從全球互聯網用戶每天產生的2.5億TB數據,到制造業的傳感器、金融交易 ...
2025-05-15大數據是什么_數據分析師培訓 其實,現在的大數據指的并不僅僅是海量數據,更準確而言是對大數據分析的方法。傳統的數 ...
2025-05-14CDA持證人簡介: 萬木,CDA L1持證人,某電商中廠BI工程師 ,5年數據經驗1年BI內訓師,高級數據分析師,擁有豐富的行業經驗。 ...
2025-05-13CDA持證人簡介: 王明月 ,CDA 數據分析師二級持證人,2年數據產品工作經驗,管理學博士在讀。 學習入口:https://edu.cda.cn/g ...
2025-05-12CDA持證人簡介: 楊貞璽 ,CDA一級持證人,鄭州大學情報學碩士研究生,某上市公司數據分析師。 學習入口:https://edu.cda.cn/g ...
2025-05-09CDA持證人簡介 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度、美團、阿里等 ...
2025-05-07相信很多做數據分析的小伙伴,都接到過一些高階的數據分析需求,實現的過程需要用到一些數據獲取,數據清洗轉換,建模方法等,這 ...
2025-05-06以下的文章內容來源于劉靜老師的專欄,如果您想閱讀專欄《10大業務分析模型突破業務瓶頸》,點擊下方鏈接 https://edu.cda.cn/g ...
2025-04-30CDA持證人簡介: 邱立峰 CDA 數據分析師二級持證人,數字化轉型專家,數據治理專家,高級數據分析師,擁有豐富的行業經驗。 ...
2025-04-29CDA持證人簡介: 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度,美團,阿里等 ...
2025-04-28CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-27數據分析在當今信息時代發揮著重要作用。單因素方差分析(One-Way ANOVA)是一種關鍵的統計方法,用于比較三個或更多獨立樣本組 ...
2025-04-25CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-25