前言 – 阿嬤碎碎念
這篇文章將教大家如何從 yahoo finance
取得股價歷史資料,並使用 Stocker
這個強大的工具來預測股價,詳細理論請參考 Facebook 於 2017年發表的論文 Forecasting at Scale 。
此外我有修改過原始 Stocker 的原始程式碼以串接台股資料。因此請想親自跑跑看程式的人下載完整程式碼,並安裝 Anaconda
,使用Jupyter-notebook
開啟 grandma_stocker.ipynb
。
看完這篇文章將學到:
- 使用 yfinance 從 Yahoo Finance 抓股歷史股價下來
- 使用 Stocker 視覺化歷史股價
- 使用 Stocker 中的 Prophet 預言家模型預測股價
給進階的使用者:
因為臺灣證券交易所包含的公司較齊全、資料較詳細,程式碼中也提供範例讓你可以使用從臺灣證券交易所下載的日成交資訊。檔案中有附上台積電 (2330)
及元大台灣50 (0050)
的範例資料 (在 stock_data 資料夾內),詳細程式碼請參考grandma_stocker_local.ipynb
。
附註:
會寫這篇主要是因為看到過去有文章在介紹 Stocker 套件時提供的程式碼不完善,因此想發一篇比較完整的教學給大家參考,修改過原作者的開源程式碼後,現在除了可以使用 Yahoo Finance 的資料也可以使用從台灣證券交易所下載的歷史股價。
安裝 Anaconda
如果你還沒有安裝 Anaconda ,這是一個方便的 Python 套件整合工具,裡面也包含 Jupyter Notebook 可以跑這篇文章附上的程式碼,強烈建議安裝 Anaconda,他可以讓你的人生更簡單快樂。請參考以下文章使用Anaconda 開啟 Jupyter Notebook
安裝相關套件
首先要先安裝一些 stocker 會用到的套件
pip install -U quandl numpy pandas matplotlib pystan pytrends plotly yfinance
再來用 conda 安裝 fbprophet
conda install -c conda-forge fbprophet
從 Yahoo Finance 取得歷史股價
我們可以用 yfinance 套件來從 Yahoo Finance 取得歷史股價,並存成 pandas 的 DataFrame 模式。 (若要串接從台灣證券交易所下載的資料,請參考程式碼中的grandma_stocker_local.ipynb)
繪製圖表
使用 stock.plot_stock()
函式來作圖
Prophet 預言家模型
使用 stock.create_prophet_model()
函式預測未來10天的股價
想要看看我們的模型好不好,我們可以使用 stock.evaluate_prediction()
函式,將最近一年的資料當成測試資料,看看如果使用過去三年的資料來訓練我們的模型,那在這一年的測試資料上表現如何。看看下圖…乾那賽。紅線左邊是訓練資料,紅線右邊是模型預測出來的。可以看出來完全偏離黑色的真實資料。
我們可以試著調整參數讓模型預測有不同的表現,調整不同的 changepoint_prior
,讓模型以不同的強度去 fit 訓練資料,可以看到 changepoint_prior 越高 (黃色) 會越貼近黑色的真實資料,但也越容易產生過度擬合 (overfitting),changepoint_prior 越低 (藍色) 則較容易反應長期的趨勢,但也越容易產生欠擬合 (underfitting)。
將 changepoint_prior 設為 0.5 來看看模型表現
關於該如何調整參數,可以參考 Stocker 的作者在 Medium 發布的文章,有更詳細提到如何使用 training set、validation set、test set 來找比較好的參數。
結論
這篇教學是希望給大家一個簡單的 Python 股票市場分析的啟發,可以實際使用看看 Facebook 這種大公司所提出的預測模型來預測股價。結果參考就好,至於預言家模型背後的理論請參考 Prophet 專案及其論文。
參考資料
- Will Koehrsen. “Stock Prediction in Python – Towards Data Science”
- Taylor, Sean J., and Benjamin Letham. “Forecasting at scale.” The American Statistician 72.1 (2018): 37-45.
註: 安裝原始 Stocker 套件
Stocker
套件是一個非常實用的股票分析工具。 這裡附上如何使用原作者在 Github 上面的 Stocker 套件,因為他不能直接使用 pip install 安裝,所以架設過程會比較複雜。不過我們一步一步來,總共需要這些套件:
- quandl
- numpy
- pandas
- matplotlib
- pytrends
- pystan
- plotly
- fbprophet
先安裝前面幾個套件
pip install -U quandl numpy pandas matplotlib pystan pytrends plotly
再來安裝 fbprophet
conda install -c conda-forge fbprophet
我們還需要把 Stocker 從 Github 上面下載下來,由於 Github 的機制,只能把 Data-Analysis 整個 repo 下載下來,Stocker 放在這個 repo 的其中一個資料夾裡。我們只要把程式碼放在 Data-Analysis/Stocker 下 (與 stocker.py 放在一起) 就可以使用 stocker 了。
您好,請問 grandma_tutorial.ipynb這個程式碼是放在哪邊呢? 因為在GitHub上沒有看到,感謝您!
不好意思,是 grandma_stocker.ipynb
已經更正,謝謝!
Hi,謝謝您的範例,但是執行到stock = Stocker(stockNo, df)時顯示
Error Retrieving Data.
The column index must be expressed as an integer for Date Open High Low Close Adj Close Volume
0 2015-01-05 140.5 140.5 137.5 139.5 112.638245 32046000
…
1483 2021-01-29 619.0 619.0 591.0 591.0 591.000000 90745237
[1484 rows x 7 columns]/2330.TW.
能否告知問題所在?感謝!
感謝您的回饋,日後我將發布colab版本的stocker教學,確保大家版本皆一致,幫助大家學習。
遇到一樣的問題~
感謝您的回饋,日後我將發布colab版本的stocker教學,確保大家版本皆一致,幫助大家學習。
你好,
我執行到from stocker import Stocker 出現
ImportError: cannot import name ‘Stocker’ from ‘stocker’ (C:\Users\kathe\anaconda3\lib\site-packages\stocker\__init__.py)
我用Anaconda- spyder 執行此網頁的步驟
我的pip list 有出現stocker 但卻無法執行from stocker import Stocker
請問我是忽略了哪一步驟嗎 謝謝
感謝您的回饋,日後我將發布colab版本的stocker教學,確保大家版本皆一致,幫助大家學習。
使用 colab 請把stocker.py 改成mylib.py
from mylib import Stocker
算是遇上保留字
能夠提供套件版本以及python的版本嗎?感謝
很有可能是路徑的問題喔,stocker.py要跟你的py檔在同一個資料夾裡面
也遇到Error Retrieving Data.
The column index must be expressed as an integer for Date Open High Low Close Adj Close Volume…感覺是column沒對整齊…但是也不知道該怎麼改…
懇求老人家先幫幫我們這個錯誤點…
我這邊沒辦法重新產生您碰到的error,想請問你是執行到這邊的時候產生error的嗎? 可以讓我看一下你的 df 長什麼樣子?
https://i.imgur.com/nbn0JOt.png
你好,我在執行 from stocker import Stocker 的時候出現了以下Error:
AttributeError: module ‘keras.utils.generic_utils’ has no attribute ‘populate_dict_with_module_objects’
請問是哪裏出了問題呢?
您好,我也遇到相同問題
以下附上圖片。
https://imgur.com/a/uRc8Tlq