Modeling stock price and write to cloud database (02)

建立股票五線譜模型並寫入資料庫 (02)

Chris Lee
8 min readSep 29, 2020

前一篇內容提到,我們想要使用五線譜方式來衡量股價,我們已經順利爬取股票清單,並更新到資料庫中,接下來我們繼續後續的開發流程。

股票清單有了以後,接下來就是根據股票代碼,抓取歷史股價算出回歸線,歷史股價有很多方法可以取得,爬網是一個方法,但如果網頁更新會很麻煩,所以我們使用 python 的 yfinance 套件來抓取股價,詳細可以看這裡

pip install yfinance

五線譜的原理是根據均值回歸特性,往回抓 3.5 年的股價,計算出回歸趨勢線,所以我們以台積電 2330 為例,使用 yfinance 抓歷史股價:

import datetime
import yfinance as yf
def get_stock_history(stock_no):
DT_DIFF = 365.25*3.5
END_DT = datetime.datetime.now()
START_DT = END_DT+datetime.timedelta(days=-DT_DIFF)
STOCK_TW = stock_no+'.TW'
df = yf.Ticker(STOCK_TW).history(start=START_DT.strftime("%Y-%m-%d"), end=END_DT.strftime("%Y-%m-%d"))
df.dropna(subset = ["Close"], inplace=True)
return df

再來就是五線譜的部分了,要完成五線譜需要有一部分的統計知識,首先五線譜是根據常態分佈的特性,有 68.2% 股價落在一倍標準差之內,有 95.4% 股價落在兩倍標準差之內,所以要先找到標準差是多少。

而標準差是反應股價的波動性,所以我們使用回歸的殘差標準差(Residual standard error)來當作標準差值,並且再將標準差值,回推個區間常態分佈的位子,再推回股價的值。

聽起來很崩潰,沒關係我們用程式慢慢解析,首先先安裝需要的套件,都是資料科學常用的工具:

pip install scipy
pip install sklearn
pip install numpy

再來是回歸的程式,sklearn 內建的模型,模型資訊少得可憐,除非你今天是用 R 來做,使用 summary(model) 就有豐富的統計資訊給你,python 的話就摸摸鼻子自己刻吧,下面提供我自己的版本,塞 x,y 就可以有回歸的詳細資訊了:

然後我們把剛剛的歷史股價組裝起來:

stock_history = get_stock_history('2330')
x = (np.arange(len(stock_history))+1).reshape((-1, 1))
y = np.array(stock_history.Close)
stock_reg = detailed_linear_regression(x,y)
stock_reg

oa_stats 的第一個元素就是我們要的結果,其他資訊也可以當做模型的表現來用。

再來就是回推各個時間區間,股價在該標準差的值是多少,使用方法是 norm.ppf 函數,詳細可以參考這裡,統計的內容太深我就不贅述了。

簡言之,我現在要希望在給定標準差區間的狀況下,幫我計算該股票每個時間點的五線譜數值,及顯示模型解釋率 Rsquared、斜率、標準差,整理成函數如下:

然後我想要給定一個時間點的資料,幫我判斷當天股價是在哪個區間,並且回傳一個區間代碼,以利後續分析使用,函數如下:

看起來台積電股價太高了呢XD

最後就是把前面的函數組合起來,輸入股票代號,可以回傳所有我們想知道的資訊:

看起來還不錯,資訊都有了,接下來就是撈取股票清單,把每隻股票跑一遍,然後寫進資料庫了。

我們先建立一個函數專門跑所有股票資料:

然後我們把到目前為止的程式,寫成一隻完整的 script 丟到 VM 去運行看看,使用 vim five_line.py 編輯:

一樣使用下面語法執行看看:

python five_line.py

有些股票沒有抓到是因為 yfinance 那邊沒有資料,通常都是上櫃或特殊 ETF 比較會有問題,不影響我們對大部分上市股票的評估。

接下來就是上排程讓他定期跑了,Linux 的基本排程工具叫 crontab,裡面操作博大精深,詳細可以參考這裡,我們只需使用幾個簡單的功能執行就好。

首先我們先建立一個 shell script 來打包我們的兩個 python script,分別是抓取股票清單及運算五線譜,vim stock.sh

完成後可以跑一下看看,是否能正常運行:

bash stock.sh

都可以了之後就可以上排程囉,我們可以使用下面語法編輯排程:

crontab -e

如果第一次使用的話會要你選擇編輯器,選擇第一個 nano 比較簡單,而排程設定的方式是由五個參數所構成,大家可以自行安排:

# ┌───────────── 分鐘   (0 - 59)
# │ ┌─────────── 小時 (0 - 23)
# │ │ ┌───────── 日 (1 - 31)
# │ │ │ ┌─────── 月 (1 - 12)
# │ │ │ │ ┌───── 星期幾 (0 - 7,0 是週日,6 是週六,7 也是週日)
# │ │ │ │ │
# * * * * * /path/to/command
# 每天早上 8 點 30 分執行
30 08 * * * /home/gtwang/script.sh --your --parameter

# 每週日下午 6 點 30 分執行
30 18 * * 0 /home/gtwang/script.sh --your --parameter

# 每週日下午 6 點 30 分執行
30 18 * * Sun /home/gtwang/script.sh --your --parameter

# 每年 6 月 10 日早上 8 點 30 分執行
30 08 10 06 * /home/gtwang/script.sh --your --parameter

# 每月 1 日、15 日、29 日晚上 9 點 30 分各執行一次
30 21 1,15,29 * * /home/gtwang/script.sh --your --parameter

# 每隔 10 分鐘執行一次
*/10 * * * * /home/gtwang/script.sh --your --parameter

# 從早上 9 點到下午 6 點,凡遇到整點就執行
00 09-18 * * * /home/gtwang/script.sh --your --parameter

基本上只要固定一個時間點讓他跑即可,所以我設定如下:

0 20 * * * bash /home/chrislee_ml05/stock/stock.sh

可以用 crontab -l 來檢視排程,或是用 crontab -r 刪除排程,如果要看排程有沒有正常跑,可以用下面語法將排程 log 輸出成檔案,下次只要開打 crontab.log 看即可。

grep CRON /var/log/syslog* &> crontab.log

以上就完成我們的股票五線譜工程了,因為會定期運算並寫入 SQL 中,後面要接其他應用就會很方便,我們可以做成 Data API 給其他程式調用,變化無窮無盡,就等其他篇在示範應用場景囉。

--

--

Chris Lee
Chris Lee

Written by Chris Lee

隱身在金融業的資料科學家

No responses yet