Python 股票分析:Stocker 強大的股價預測分析工具 (附完整程式碼)

前言 – 阿嬤碎碎念

Github 完整程式碼

這篇文章將教大家如何從 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 專案及其論文。

參考資料

  1. Will Koehrsen. “Stock Prediction in Python – Towards Data Science”
  2. 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 了。

16 Comments

  1. 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.
    能否告知問題所在?感謝!

    1. 感謝您的回饋,日後我將發布colab版本的stocker教學,確保大家版本皆一致,幫助大家學習。

    1. 感謝您的回饋,日後我將發布colab版本的stocker教學,確保大家版本皆一致,幫助大家學習。

  2. 你好,
    我執行到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
    請問我是忽略了哪一步驟嗎 謝謝

    1. 感謝您的回饋,日後我將發布colab版本的stocker教學,確保大家版本皆一致,幫助大家學習。

  3. 也遇到Error Retrieving Data.
    The column index must be expressed as an integer for Date Open High Low Close Adj Close Volume…感覺是column沒對整齊…但是也不知道該怎麼改…

  4. 你好,我在執行 from stocker import Stocker 的時候出現了以下Error:
    AttributeError: module ‘keras.utils.generic_utils’ has no attribute ‘populate_dict_with_module_objects’
    請問是哪裏出了問題呢?

留言討論區