量化分析預(yù)測(cè)股市?試試這個(gè) Python 庫(kù)
Python中文社區(qū)(ID:python-china)
本文將展示如何使用 Python 的第三方庫(kù) Stocker 來(lái)進(jìn)行股票分析和預(yù)測(cè)。
安裝第三方庫(kù)
安裝所需的庫(kù)后,我們要做的第一件事就是將 Stocker 類導(dǎo)入到我們的 Python 代碼中。我們可以通過(guò)在腳本目錄中啟動(dòng)的 Jupyter Notebook 執(zhí)行此操作。
- !pip install quandl
- !pip install fbprophet
- !pip install plotly
- from stocker importStocker
現(xiàn)在在 Python 代碼中有 Stocker 類,我們可以使用它來(lái)創(chuàng)建該類的實(shí)例。在 Python 中,類的實(shí)例稱為對(duì)象,創(chuàng)建對(duì)象的行為有時(shí)稱為實(shí)例化或構(gòu)造。為了創(chuàng)建 Stocker 對(duì)象,我們需要傳入有效股票代碼的名稱。
- # 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.
現(xiàn)在,我們有一個(gè)包含 Stocker 類所有屬性的 microsoft 對(duì)象。Stocker 建立在 quandl WIKI 數(shù)據(jù)庫(kù)上,該數(shù)據(jù)庫(kù)使我們可以訪問 3000 多只美國(guó)股票以及多年的每日價(jià)格數(shù)據(jù)(完整列表)。對(duì)于此示例,我們將堅(jiān)持使用 Microsoft 數(shù)據(jù)。因?yàn)槲④浾趽肀ч_源社區(qū)(包括 Python)。
Python 中的類由兩個(gè)主要部分組成:屬性和方法。無(wú)需贅述,屬性是與整個(gè)類或與類的特定實(shí)例(對(duì)象)相關(guān)聯(lián)的值或數(shù)據(jù)。方法是包含在類中的可以作用于該數(shù)據(jù)的函數(shù)。Stocker 對(duì)象的一個(gè)屬性是特定公司的股票數(shù)據(jù),當(dāng)我們構(gòu)造對(duì)象時(shí),該屬性與該對(duì)象相關(guān)聯(lián)。我們可以訪問該屬性并將其分配給另一個(gè)變量進(jìn)行檢查:
- # Stock is an attribute of the microsoft object
- stock_history = microsoft.stock
- stock_history.head()
Python 類的好處是方法(或函數(shù))和它們作用的數(shù)據(jù)與同一個(gè)對(duì)象相關(guān)聯(lián)。我們可以使用 Stocker 對(duì)象的一個(gè)方法來(lái)繪制股票的整個(gè)歷史數(shù)據(jù)。
- # 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.
繪制的默認(rèn)值是調(diào)整后的收盤價(jià),它考慮了股票的分割(當(dāng)一只股票被分割成多只股票時(shí),比如 2 只,每只新股票價(jià)值是原始價(jià)格的 1/2)。
這是我們可以從 Google 搜索中找到的一個(gè)非?;镜膱D,但是我們自己用幾行 Python 來(lái)完成它是令人滿意的! plot_stock 函數(shù)有許多可選參數(shù)。默認(rèn)情況下,此方法繪制整個(gè)日期范圍的調(diào)整后收盤價(jià),但我們可以選擇范圍、要繪制的統(tǒng)計(jì)數(shù)據(jù)以及繪圖類型。例如,如果我們想將價(jià)格的每日變化與調(diào)整后的交易量(股票數(shù)量)進(jìn)行比較,我們可以在函數(shù)調(diào)用中指定這些。
- 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 軸是相對(duì)于統(tǒng)計(jì)平均值的百分比變化。這個(gè)單位是必要的,因?yàn)槊刻斓慕灰琢勘緛?lái)就是股票,范圍在數(shù)億,而每天的價(jià)格變化通常是幾美元!通過(guò)轉(zhuǎn)換為百分比變化,我們可以以相似的比例查看兩個(gè)數(shù)據(jù)集。該圖顯示交易的股票數(shù)量與價(jià)格的每日變化之間沒有相關(guān)性。這是令人驚訝的,因?yàn)槲覀兛赡芷谕趦r(jià)格變化較大的日子里交易更多股票,因?yàn)槿藗兗庇诶貌▌?dòng)。然而,唯一真正的趨勢(shì)似乎是交易量隨著時(shí)間的推移而減少。2017 年 12 月 4 日的價(jià)格也大幅下降,我們可以嘗試將其與有關(guān) Microsoft 的新聞報(bào)道聯(lián)系起來(lái)。
使用 plot_stock,我們可以調(diào)查任何日期范圍內(nèi)數(shù)據(jù)中的任何數(shù)量,并尋找與現(xiàn)實(shí)世界事件的相關(guān)性。現(xiàn)在,我們將繼續(xù)討論 Stocker 中更有趣的部分之一:賺假錢!
讓我們暫時(shí)假設(shè)我們有信心在公司的首次公開募股 (IPO) 上投資 100 股微軟股票。我們現(xiàn)在有多富有?
- 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
使用這些結(jié)果將使我們能夠及時(shí)調(diào)整我們的計(jì)劃,以最大限度地提高利潤(rùn)。
加法模型
加法模型是分析和預(yù)測(cè)時(shí)間序列的強(qiáng)大工具,時(shí)間序列是最常見的現(xiàn)實(shí)世界數(shù)據(jù)類型之一。這個(gè)概念很簡(jiǎn)單:將時(shí)間序列表示為不同時(shí)間尺度上的模式和整體趨勢(shì)的組合。我們知道微軟股票的長(zhǎng)期趨勢(shì)是穩(wěn)步上漲,但也可能有每年或每天的模式,例如每周二上漲,這在經(jīng)濟(jì)上是有益的。由 Facebook 開發(fā)的 Prophet 是一個(gè)用于通過(guò)日常觀察(例如股票)分析時(shí)間序列的第三方庫(kù)。Stocker 在底層使用 Prophet 為我們完成所有建模工作,因此我們可以使用簡(jiǎn)單的方法調(diào)用來(lái)創(chuàng)建和檢查模型。
- model, model_data = microsoft.create_prophet_model()
加法模型消除了數(shù)據(jù)中的噪聲,這就是模型線與觀測(cè)值不完全一致的原因。Prophet 模型還計(jì)算不確定性,這是建模的重要組成部分,因?yàn)樵谔幚聿▌?dòng)的現(xiàn)實(shí)過(guò)程時(shí),我們永遠(yuǎn)無(wú)法確定我們的預(yù)測(cè)結(jié)果。我們也可以使用prophet模型對(duì)未來(lái)進(jìn)行預(yù)測(cè),但現(xiàn)在我們更關(guān)心過(guò)去的數(shù)據(jù)。請(qǐng)注意,此方法調(diào)用返回了兩個(gè)對(duì)象,一個(gè)模型和一些我們分配給變量的數(shù)據(jù)。我們現(xiàn)在使用這些變量來(lái)繪制時(shí)間序列分量。
- model.plot_components(model_data)
- plt.show()
總體趨勢(shì)是在過(guò)去三年中明顯增加。似乎還有一個(gè)明顯的年度模式,價(jià)格在 9 月和 10 月觸底,并在 11 月和 1 月達(dá)到峰值。隨著時(shí)間尺度的減小,數(shù)據(jù)變得更加嘈雜。在一個(gè)典型的月份中,信號(hào)多于噪音!如果我們認(rèn)為可能存在每周模式,我們可以通過(guò)更改 Stocker 對(duì)象的weekly_seasonality 屬性將其添加到先知模型中:
- print(microsoft.weekly_seasonality)
- microsoft.weekly_seasonality = True
- print(microsoft.weekly_seasonality)
- False
- True
weekly_seasonality 的默認(rèn)值為 False,但我們更改了該值以在我們的模型中包含每周模式。然后我們?cè)俅握{(diào)用 create_prophet_model 并繪制結(jié)果組件。
我們可以忽略周末,因?yàn)閮r(jià)格只會(huì)在一周內(nèi)變化(實(shí)際上在下班后的期間價(jià)格變化很小,但不影響我們的分析)。不幸的是,沒有一周的趨勢(shì)可供我們使用,在我們繼續(xù)建模之前,我們將關(guān)閉每周季節(jié)性。這種行為是意料之中的:對(duì)于股票數(shù)據(jù),隨著時(shí)間尺度的減小,噪聲開始沖刷掉信號(hào)。從日常來(lái)看,股票的走勢(shì)本質(zhì)上是隨機(jī)的,只有縮小到年度范圍,我們才能看到趨勢(shì)。
變化點(diǎn)
變化點(diǎn)發(fā)生在時(shí)間序列從增加到減少或相反時(shí)(在更嚴(yán)格的意義上,它們位于時(shí)間序列速率變化最大的地方)。這些時(shí)間非常重要,因?yàn)榱私夤善焙螘r(shí)會(huì)達(dá)到頂峰或即將起飛可能會(huì)帶來(lái)顯著的經(jīng)濟(jì)效益。確定變化點(diǎn)的原因可能讓我們預(yù)測(cè)股票價(jià)值的未來(lái)波動(dòng)。Stocker 對(duì)象可以自動(dòng)為我們找到 10 個(gè)最大的變化點(diǎn)。
- 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
變化點(diǎn)往往與股價(jià)的高峰和低谷一致。Prophet 只在前 80% 的數(shù)據(jù)中找到變化點(diǎn),但盡管如此,這些結(jié)果還是很有用的,因?yàn)槲覀兛梢試L試將它們與現(xiàn)實(shí)世界的事件相關(guān)聯(lián)。我們可以重復(fù)我們之前所做的并在這些日期前后手動(dòng)搜索 Google 新聞,但我認(rèn)為如果Stocker 為我們這樣做會(huì)更好。您可能已經(jīng)看過(guò) Google 搜索趨勢(shì)工具,該工具可讓您查看任何搜索詞在 Google 搜索中隨時(shí)間的流行程度。Stocker 可以自動(dòng)檢索我們指定的任何搜索詞的數(shù)據(jù),并在原始數(shù)據(jù)上繪制結(jié)果。為了找到并繪制搜索詞的頻率,我們修改了之前的方法調(diào)用。
- 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
除了繪制相對(duì)搜索頻率的圖形之外,Stocker 還顯示了圖表日期范圍內(nèi)相關(guān)度最高的查詢和上升最快的查詢。在圖中,y 軸通過(guò)將值除以其最大值而在 0 和 1 之間歸一化,使我們能夠比較具有不同尺度的兩個(gè)變量。從圖中可以看出,搜索“Microsoft profit”與微軟股價(jià)之間似乎沒有相關(guān)性。
如果我們發(fā)現(xiàn)了相關(guān)性,那么仍然會(huì)有因果關(guān)系的問題。我們不知道是搜索還是新聞導(dǎo)致了價(jià)格的變化,還是價(jià)格的變化導(dǎo)致了搜索??赡軙?huì)找到一些有用的信息,但也有很多機(jī)會(huì)相關(guān)性。隨意嘗試一些不同的搜索詞語(yǔ),看看是否能找到任何有趣的趨勢(shì)!
- 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
看起來(lái)對(duì)Microsoft Office 的搜索量下降會(huì)導(dǎo)致股價(jià)上漲。也許有人應(yīng)該讓微軟知道。
預(yù)測(cè)
我們只探索了 Stocker 功能的前半部分。后半部分用于預(yù)測(cè),或預(yù)測(cè)未來(lái)的股票價(jià)格。如下圖所示:
- model, future = microsoft.create_prophet_model(days=180)
- PredictedPrice on 2018-07-21= $102.40