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

我們還是來稍微科普一下相關的程式交易知識好了
什麼是 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 文的數量圖,隨時間關係圖:

截圖自 fb論文
圖中,每個時間都只會對應到一個點,就是每天的 PO 文數量 我們可以觀察到一些現象:
以每週來檢視
上圖中,顏色的不同代表每週的變化量,禮拜六看起來明顯就比較少人用 FB, (週末都跑去玩了?XD)
以每年來檢視
我們也可以發現,以年度來說,暑假時 PO 文數會下降 (大家都去放暑假了?)
每個週期下都有各自的規律,傳統的模型能夠成功預測嗎?
傳統模型的限制
其實已經有很多模型了,但為什麼 FB 還要推出一個新的呢? 原因是,以前的模型並沒有辦法多週期性的預測 f(t) :

這張圖的每個 row 是不同的模型 圖中每條「實線」就是預測模型的結果, 可以看出以往的模型,預測出來結果並不是很準
預言家模型
下圖中,可以發現預言家模型比上述的模型預測的更準確

預言家模型最厲害的地方, 就是用多條 Fourier Series,去擬合(fitting)時間序列 在這邊就不把可怕的公式放上來了, 有興趣可以參考 fb論文 可以將週期調整至「每年」「每季」「每週」! 模型簡單可以寫成這樣:
f(t) = year(t) + season(t) + week(t) + trend(t)
甚至在 fitting 完(找到 a、b 等參數後)可以將 f(t) 的成分拆解出來看:

而最後的 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

上述代碼中,每行開頭的驚嘆號,可以讓你把 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()
其中的 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)
其中綠色的就是預測出來的股價,而淺綠色區域就是信賴區間,股價大約就會落於此區間內, 程式中的信賴區間為 80%,也代表了,每五天就約有一天的股價會落於信賴區間之外, 可以看到預測時間越久(沒實際股價的地方),不確定性越大,所以綠色的區間也就稍微變大 可以用來當作布林區間的感覺
這樣預測準確嗎?
不確定,所以我們可以把時間還原到一年前,來看看假如當時預測的結果,跟至今是不是有差別, 我們不讓 Stocker 使用近一年的股價來 fitting,出來的曲線跟實際的股價做比較:
顯示程式碼
tsmc.evaluate_prediction()
上圖中,紅色虛線就是開始預測的當下,紅色線以後的時間都是預言家預測的結果 而藍色則為預測的真實股價,黃色則是信賴區間
不準怎麼辦?
沒關係,我們可以調整短中長期的參數,讓它預測短中長期股價:
顯示程式碼
tsmc.changepoint_prior_analysis(changepoint_priors=[0.001, 0.05, 0.1, 0.2])下圖中,可以看到藍色的線比較偏趨勢,不隨當下股價起舞,算是長期的趨勢預測 而黃色則是非常貼近股價,算是短期的預測 使用者可以自行調整參數,來決定短中長線的應用

拿來預測股價了!
我們藉由上述的參數枚舉,可以知道哪一個參數(changepoint_prior)是最好的
我們可以藉由執行 predict_future 來預測股價囉!
顯示程式碼
tsmc.predict_future(days=100)
藉由 Stocker,我們可以很輕易的預測股價, 至於其準確性,還有待各位看官們回測看看囉!
有上左方課程的同學,可以很輕易的使用 Stocker 來檢驗歷史報酬率是多少! 可以試著找到最佳的參數,並盡量選擇有週期性的股票~ 期待你們的成果!
此程式的一些連結: 此程式的github 此程式的notebook 國外Stocker文章 國外github 預言家github