熱線電話:13121318867

登錄
首頁精彩閱讀干貨丨 用 Python 進行股票分析
干貨丨 用 Python 進行股票分析
2018-02-09
收藏

干貨丨 用 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

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢