超簡單用Python預測股價

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

j4

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

什麼是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文的數量圖,隨時間關係圖:

pp1

截圖自fb論文

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

以每週來檢視

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

以每年來檢視

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

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

傳統模型的限制

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

pp2

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

預言家模型

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

pp3

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

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

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

pp5

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

j0

上述代碼中,每行開頭的驚嘆號,可以讓你把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()
j1

其中的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)
j2

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

這樣預測準確嗎?

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

tsmc.evaluate_prediction()
j3

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

不準怎麼辦?

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

tsmc.changepoint_prior_analysis(changepoint_priors=[0.001, 0.05, 0.1, 0.2])

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

j4 1

拿來預測股價了!

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

tsmc.predict_future(days=100)
j5

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

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

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

FinLab - 韓承佑

嗨大家好,我是韓承佑,FinLab創辦人,畢業於巴黎薩克雷大學資工博士,目前擔任臺灣量化交易協會 學術顧問、台北商業大學 創新育成中心 創業技術顧問與上市科技公司 量化交易顧問。當初,我喜歡寫程式、無意間因為軟體比賽接觸Fintech,從此開始了財經跟程式的學習之路。我們成立 FinLab 量化投資部落格,用自己研發的軟體,對台灣股市做大量快速的實驗。希望可以在量化投資的路上,當大家的「武器製造商」!