量化分析預測股市?試試這個 Python 庫
Python中文社區(ID:python-china)
本文將展示如何使用 Python 的第三方庫 Stocker 來進行股票分析和預測。
安裝第三方庫
安裝所需的庫后,我們要做的第一件事就是將 Stocker 類導入到我們的 Python 代碼中。我們可以通過在腳本目錄中啟動的 Jupyter Notebook 執行此操作。
- !pip install quandl
- !pip install fbprophet
- !pip install plotly
- from stocker importStocker
現在在 Python 代碼中有 Stocker 類,我們可以使用它來創建該類的實例。在 Python 中,類的實例稱為對象,創建對象的行為有時稱為實例化或構造。為了創建 Stocker 對象,我們需要傳入有效股票代碼的名稱。
- # MSFT Stocker Initialized. Data covers 1986-03-13 to 2018-01-16.
- microsoft = Stocker('MSFT')
- MSFT StockerInitialized. Data covers 1986-03-1300:00:00 to 2018-03-2700:00:00.
現在,我們有一個包含 Stocker 類所有屬性的 microsoft 對象。Stocker 建立在 quandl WIKI 數據庫上,該數據庫使我們可以訪問 3000 多只美國股票以及多年的每日價格數據(完整列表)。對于此示例,我們將堅持使用 Microsoft 數據。因為微軟正在擁抱開源社區(包括 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()
- MaximumAdj. Close= 96.77 on 2018-03-1200:00:00.
- MinimumAdj. Close= 0.06 on 1986-03-2400:00:00.
- CurrentAdj. Close= 89.47 on 2018-03-2700:00:00.
繪制的默認值是調整后的收盤價,它考慮了股票的分割(當一只股票被分割成多只股票時,比如 2 只,每只新股票價值是原始價格的 1/2)。
這是我們可以從 Google 搜索中找到的一個非常基本的圖,但是我們自己用幾行 Python 來完成它是令人滿意的! plot_stock 函數有許多可選參數。默認情況下,此方法繪制整個日期范圍的調整后收盤價,但我們可以選擇范圍、要繪制的統計數據以及繪圖類型。例如,如果我們想將價格的每日變化與調整后的交易量(股票數量)進行比較,我們可以在函數調用中指定這些。
- microsoft.plot_stock(start_date = '2000-01-03', end_date = '2018-01-16', stats = ['Daily Change', 'Adj. Volume'], plot_type='pct')
- MaximumDailyChange= 2.08 on 2008-10-1300:00:00.
- MinimumDailyChange= -3.34 on 2017-12-0400:00:00.
- CurrentDailyChange= -5.47 on 2018-03-2700:00:00.
- MaximumAdj. Volume= 591052200.00 on 2006-04-2800:00:00.
- MinimumAdj. Volume= 7425503.00 on 2017-11-2400:00:00.
- CurrentAdj. Volume= 53704562.00 on 2018-03-2700:00:00.
注意,y 軸是相對于統計平均值的百分比變化。這個單位是必要的,因為每天的交易量本來就是股票,范圍在數億,而每天的價格變化通常是幾美元!通過轉換為百分比變化,我們可以以相似的比例查看兩個數據集。該圖顯示交易的股票數量與價格的每日變化之間沒有相關性。這是令人驚訝的,因為我們可能期望在價格變化較大的日子里交易更多股票,因為人們急于利用波動。然而,唯一真正的趨勢似乎是交易量隨著時間的推移而減少。2017 年 12 月 4 日的價格也大幅下降,我們可以嘗試將其與有關 Microsoft 的新聞報道聯系起來。
使用 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 from1986-03-13 to 2018-01-16for100 shares = $8829.11
使用這些結果將使我們能夠及時調整我們的計劃,以最大限度地提高利潤。
加法模型
加法模型是分析和預測時間序列的強大工具,時間序列是最常見的現實世界數據類型之一。這個概念很簡單:將時間序列表示為不同時間尺度上的模式和整體趨勢的組合。我們知道微軟股票的長期趨勢是穩步上漲,但也可能有每年或每天的模式,例如每周二上漲,這在經濟上是有益的。由 Facebook 開發的 Prophet 是一個用于通過日常觀察(例如股票)分析時間序列的第三方庫。Stocker 在底層使用 Prophet 為我們完成所有建模工作,因此我們可以使用簡單的方法調用來創建和檢查模型。
- model, model_data = microsoft.create_prophet_model()
加法模型消除了數據中的噪聲,這就是模型線與觀測值不完全一致的原因。Prophet 模型還計算不確定性,這是建模的重要組成部分,因為在處理波動的現實過程時,我們永遠無法確定我們的預測結果。我們也可以使用prophet模型對未來進行預測,但現在我們更關心過去的數據。請注意,此方法調用返回了兩個對象,一個模型和一些我們分配給變量的數據。我們現在使用這些變量來繪制時間序列分量。
- model.plot_components(model_data)
- plt.show()
總體趨勢是在過去三年中明顯增加。似乎還有一個明顯的年度模式,價格在 9 月和 10 月觸底,并在 11 月和 1 月達到峰值。隨著時間尺度的減小,數據變得更加嘈雜。在一個典型的月份中,信號多于噪音!如果我們認為可能存在每周模式,我們可以通過更改 Stocker 對象的weekly_seasonality 屬性將其添加到先知模型中:
- print(microsoft.weekly_seasonality)
- microsoft.weekly_seasonality = True
- print(microsoft.weekly_seasonality)
- False
- True
weekly_seasonality 的默認值為 False,但我們更改了該值以在我們的模型中包含每周模式。然后我們再次調用 create_prophet_model 并繪制結果組件。
我們可以忽略周末,因為價格只會在一周內變化(實際上在下班后的期間價格變化很小,但不影響我們的分析)。不幸的是,沒有一周的趨勢可供我們使用,在我們繼續建模之前,我們將關閉每周季節性。這種行為是意料之中的:對于股票數據,隨著時間尺度的減小,噪聲開始沖刷掉信號。從日常來看,股票的走勢本質上是隨機的,只有縮小到年度范圍,我們才能看到趨勢。
變化點
變化點發生在時間序列從增加到減少或相反時(在更嚴格的意義上,它們位于時間序列速率變化最大的地方)。這些時間非常重要,因為了解股票何時會達到頂峰或即將起飛可能會帶來顯著的經濟效益。確定變化點的原因可能讓我們預測股票價值的未來波動。Stocker 對象可以自動為我們找到 10 個最大的變化點。
- microsoft.changepoint_date_analysis()
- Changepoints sorted by slope rate of change (2nd derivative):
- DateAdj. Close delta
- 4102016-09-0855.811396-1.378093
- 3382016-05-2650.1134531.116720
- 2172015-12-0252.572008-0.882359
- 4582016-11-1557.5898190.603127
- 482015-04-0237.6125900.442776
變化點往往與股價的高峰和低谷一致。Prophet 只在前 80% 的數據中找到變化點,但盡管如此,這些結果還是很有用的,因為我們可以嘗試將它們與現實世界的事件相關聯。我們可以重復我們之前所做的并在這些日期前后手動搜索 Google 新聞,但我認為如果Stocker 為我們這樣做會更好。您可能已經看過 Google 搜索趨勢工具,該工具可讓您查看任何搜索詞在 Google 搜索中隨時間的流行程度。Stocker 可以自動檢索我們指定的任何搜索詞的數據,并在原始數據上繪制結果。為了找到并繪制搜索詞的頻率,我們修改了之前的方法調用。
- microsoft.changepoint_date_analysis(search = 'Microsoft profit')
- TopRelatedQueries:
- query value
- 0 microsoft non profit 100
- 1 microsoft office 60
- 2 apple profit 40
- 3 microsoft 36540
- 4 apple 35
- RisingRelatedQueries:
- query value
- 0 apple stock 170
- 1 microsoft 365130
- 2 apple profit 50
除了繪制相對搜索頻率的圖形之外,Stocker 還顯示了圖表日期范圍內相關度最高的查詢和上升最快的查詢。在圖中,y 軸通過將值除以其最大值而在 0 和 1 之間歸一化,使我們能夠比較具有不同尺度的兩個變量。從圖中可以看出,搜索“Microsoft profit”與微軟股價之間似乎沒有相關性。
如果我們發現了相關性,那么仍然會有因果關系的問題。我們不知道是搜索還是新聞導致了價格的變化,還是價格的變化導致了搜索。可能會找到一些有用的信息,但也有很多機會相關性。隨意嘗試一些不同的搜索詞語,看看是否能找到任何有趣的趨勢!
- microsoft.changepoint_date_analysis(search = 'Microsoft Office')
- TopRelatedQueries:
- query value
- 0 microsoft office download 100
- 1 microsoft office 201090
- 2 office 201085
- 3 microsoft office 201375
- 4 office 201370
- RisingRelatedQueries:
- query value
- 0 microsoft office 2016 key 80300
- 1 office 201673200
- 2 download microsoft office 201672150
- 3 microsoft office 2016 mac 69350
- 4 microsoft office 201667650
看起來對Microsoft Office 的搜索量下降會導致股價上漲。也許有人應該讓微軟知道。
預測
我們只探索了 Stocker 功能的前半部分。后半部分用于預測,或預測未來的股票價格。如下圖所示:
- model, future = microsoft.create_prophet_model(days=180)
- PredictedPrice on 2018-07-21= $102.40