跳至主要內容
FinLab

超簡單用 Python 預測股價:Facebook Prophet 預言家模型實戰教學

多虧了 python,用最先進的統計模型來預測股價,程式交易超簡單! 不用安裝程式,今天我們雲端寫 code,適合完完全全的初學者! 非常多非常多的人都用 python 在開發程式, 因此,有很多高深數學軟體,都會有很多民間高手來實做, 而我們只要會用就好了!學 python 從這篇開始!

用 Python 與 Machine Learning 預測股價示意圖

我們還是來稍微科普一下相關的程式交易知識好了

什麼是 model(模型)

模型就是一種能夠預測真實資料的數學公式, 通常會是一個 function,例如 f 好了, 假如我們有一條時間序列 f(t) = at + b 只要知道了變數 a 跟 b,就可以計算出 t 每一刻的 f(t) 是多少

要怎麼知道 a 跟 b 是多少? 只要看其中兩個歷史時刻的位置即可:例如我們知道 f(1) = 1 且 f(2) = 2 則我們可以推算出 a = 1 且 b = 0, 並且預知 f(3) = 3 、 f(4) = 4 、 f(5) = 5 …

股價模型也是一樣,但是這個模型會比較複雜,不會只有 a、b 而已 不過規則是一樣的,我們要用歷史股價去計算類似 a、b 的變數,通常稱之為 fitting 找到 a、b 後就能夠用模型來預測股價了!

用什麼模型預測股價呢?

Facebook 最近推出了一個新型的時間序列預測模型 Prophet,中文叫作預言家, 預言家可以預測一些週期性的時間序列 例如下圖,一個 FB 每天 PO 文的數量圖,隨時間關係圖:

Facebook 每天發文數量隨時間變化的時間序列圖

截圖自 fb論文

圖中,每個時間都只會對應到一個點,就是每天的 PO 文數量 我們可以觀察到一些現象:

以每週來檢視

上圖中,顏色的不同代表每週的變化量,禮拜六看起來明顯就比較少人用 FB, (週末都跑去玩了?XD)

以每年來檢視

我們也可以發現,以年度來說,暑假時 PO 文數會下降 (大家都去放暑假了?)

每個週期下都有各自的規律,傳統的模型能夠成功預測嗎?

傳統模型的限制

其實已經有很多模型了,但為什麼 FB 還要推出一個新的呢? 原因是,以前的模型並沒有辦法多週期性的預測 f(t) :

傳統時間序列模型對多週期資料的預測結果不夠準確

這張圖的每個 row 是不同的模型 圖中每條「實線」就是預測模型的結果, 可以看出以往的模型,預測出來結果並不是很準

預言家模型

下圖中,可以發現預言家模型比上述的模型預測的更準確

Prophet 預言家模型比傳統模型預測更準確的比較圖

預言家模型最厲害的地方, 就是用多條 Fourier Series,去擬合(fitting)時間序列 在這邊就不把可怕的公式放上來了, 有興趣可以參考 fb論文 可以將週期調整至「每年」「每季」「每週」! 模型簡單可以寫成這樣:

f(t) = year(t) + season(t) + week(t) + trend(t)

甚至在 fitting 完(找到 a、b 等參數後)可以將 f(t) 的成分拆解出來看:

Prophet 模型將時間序列拆解成趨勢與週期成分的分解圖

而最後的 f(t) 就是這些曲線的疊加, 由上圖第三張,我們可以額外發現,聖誕節的時候,使用 FB 的人數下降非常快 外國的聖誕節,就是與家人團聚的時光,(像是我們的農曆新年) 所以不太會用手機的緣故

這篇論文大意就講到這裡, 詳情可以參考:此論文

用預言家預測股票

看完了學術的部分,接下來我們就實際的來使用預言家模型預測股價吧! 要預測的精準,我們要找有週期性的股票來分析, 這邊我就隨性的拿台積電當作是標的來預測囉~

超簡單環境設定

安裝 python、安裝 jupyter? 不用,google 提供了強大的雲端 notebook,讓我們可以直接玩程式: https://colab.research.google.com/ 打開連結,開啟新的 notebook,在雲端寫程式! 當然你有 python 也可以開自己的,快的多

這次為了方便大家學習,我已經將環境建設好了! 在任意 cell 輸入:

顯示程式碼
!git clone https://github.com/koreal6803/Stocker.git
!pip install -r Stocker/requirements.txt

即可完成! 需要一段安裝時間,使用 google colab 的話,可以去休息一下,喝個水再回來 XD

在 Google Colab 中安裝 Stocker 套件的執行畫面

上述代碼中,每行開頭的驚嘆號,可以讓你把 jupyter 當作 terminal 在用, (不過假如 windows 用戶沒有 git 可能就無法…點上面 google 線上程式連結)

去除煩人的 warrning

接下來,我們先來刪除惱人的 warrning,最近 pandas 越來越煩 一堆 warrning…看了心煩直接刪除

顯示程式碼
import warnings
 
### 去除煩人的 warrning
warnings.filterwarnings('ignore')

讀入台積電股價

接下來就讀入附帶的台積點股價:

顯示程式碼
import pandas as pd
 
### 讀入series
df = pd.read_csv('Stocker/price.csv', index_col='date', parse_dates=['date'])
price = df.squeeze()
price.head()

讀入台積電股價 CSV 後的 pandas series 資料預覽

其中的 squeeze 就是將 dataframe 變成 series 的 function, 你可以用

顯示程式碼
print(df)
print(df.squeeze)

來查看其中差別

創建 Stocker

這個 Stocker 並不是我寫的 package, 而是利用國外別人寫好的 ,再額外修改成更方便的版本

用法很簡單,把股價的 series 丟進去就可以了:

顯示程式碼
from Stocker.stocker import Stocker
tsmc = Stocker(price)

預測中期走勢

接下來我們就可以用它來預測中期走勢,只需要一行

顯示程式碼
model, model_data = tsmc.create_prophet_model(days=90)

Stocker 預測台積電中期走勢的股價與信賴區間圖

其中綠色的就是預測出來的股價,而淺綠色區域就是信賴區間,股價大約就會落於此區間內, 程式中的信賴區間為 80%,也代表了,每五天就約有一天的股價會落於信賴區間之外, 可以看到預測時間越久(沒實際股價的地方),不確定性越大,所以綠色的區間也就稍微變大 可以用來當作布林區間的感覺

這樣預測準確嗎?

不確定,所以我們可以把時間還原到一年前,來看看假如當時預測的結果,跟至今是不是有差別, 我們不讓 Stocker 使用近一年的股價來 fitting,出來的曲線跟實際的股價做比較:

顯示程式碼
tsmc.evaluate_prediction()

Stocker 將預測結果與真實股價比較的回測評估圖

上圖中,紅色虛線就是開始預測的當下,紅色線以後的時間都是預言家預測的結果 而藍色則為預測的真實股價,黃色則是信賴區間

不準怎麼辦?

沒關係,我們可以調整短中長期的參數,讓它預測短中長期股價:

顯示程式碼
tsmc.changepoint_prior_analysis(changepoint_priors=[0.001, 0.05, 0.1, 0.2])

下圖中,可以看到藍色的線比較偏趨勢,不隨當下股價起舞,算是長期的趨勢預測 而黃色則是非常貼近股價,算是短期的預測 使用者可以自行調整參數,來決定短中長線的應用

調整 changepoint prior 參數比較短中長期股價預測曲線的圖

拿來預測股價了!

我們藉由上述的參數枚舉,可以知道哪一個參數(changepoint_prior)是最好的 我們可以藉由執行 predict_future 來預測股價囉!

顯示程式碼
tsmc.predict_future(days=100)

使用 Stocker 的 predict_future 預測台積電未來股價的圖

藉由 Stocker,我們可以很輕易的預測股價, 至於其準確性,還有待各位看官們回測看看囉!

有上左方課程的同學,可以很輕易的使用 Stocker 來檢驗歷史報酬率是多少! 可以試著找到最佳的參數,並盡量選擇有週期性的股票~ 期待你們的成果!

此程式的一些連結: 此程式的github 此程式的notebook 國外Stocker文章 國外github 預言家github

想建立自己的策略?

用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案

免費開始