一、題目: 如何用 DTW 在市場趨勢下時逆向獲利
二、使用環境: NSPO server (conda_python3)(如圖一)
圖一、NSPO server使用快照
三、介紹與動機
我們的題目為「如何用 DTW 在市場趨勢下時逆向獲利」。想做這個題目的動機是之前在看個股走勢的時,經常發現某兩支股票走勢相似(圖二),走勢相反(圖三),或僅部分相似等(圖四)。但往往只能以過去經驗做主觀判斷,並沒有確切的數值佐證,所以我想藉由這次比賽機會,量化不同股票間的相似度,這就是第一部分的內容。此外,我們進一步使用此具體的數值,判斷哪些個股的走勢在下跌時與大盤相反。只考慮「下跌時」的走勢的原因為在大盤上漲時,基本上個股都是上漲的;但在大盤下跌時,因為機構的資金必須離場保護獲利,但是機構又不能持有太多現金,因此必定會找幾支股票去做投資,這就是我們第二部分,「尋找英雄股」主要想做的事情,也就是所謂的超績效股。
圖二、道瓊斯與那斯達克走勢圖
圖三、道瓊斯與美元指數走勢圖
圖四、台灣大盤與韓國大盤走勢圖
代號說明如下,下面在介紹各項研究時,時間標註會用如表一的代號表示,而在圖片的圖例中,會出現 (3mo/1d) 這樣的表示法,其意思為括號內前者的 3mo 代表取樣總時長,此例為3個月,後者 1d 代表取樣間隔,此例為1天,代表每天取一次收盤價格總共取三個月。
代號 |
時間 |
m |
分鐘 |
h |
小時 |
d |
天 |
wk |
周 |
mo |
月 |
y |
年 |
表一、代號對照表
四、Dynamic Time Wraping (DTW)
比較時間序列很常遇到的情況兩種情形:兩序列有相位差或相同的走勢但是有時間前後差異。例如加密貨幣經常是BTC先漲,接著ETH或其他的小幣種再跟漲,若這時用傳統的計算方式,如Euclidean 或 MAPE,則無法看出這種前後的趨勢,而DTW則可以[1]。DTW的運作原理為將兩時間序列連連看,看有沒有相似的走勢,上漲連到上漲,下跌連到下跌,若無對應則連到旁邊的點,並計算有多少點被迫連到旁邊,以此計算DTW值。
因此DTW可以很好的用於計算兩時間序列的相似度,尤其是不同長度,不同節奏與頻率的系統。
本研究使用在github上開源的一個數據庫dtaidistance [2],dtaidistance除了提供基本DTW計算的函數,也提供了DTW熱力圖的函數,讓我們可以根據不同需求選擇不同的工具。
五、數據來源
本研究資料皆由yahoo finance所提供的yfinance API [3]取得,yahoo finance提供許多股票、指數、大眾商品等的價格與交易量等資訊,且完全免費,最小單位也可到1分鐘,是很好的資料來源。
六、實作與結果
(一) 市場指標
機構在進行交易時,往往會有個參考的指標,並依照該指標進行手中的股票或大眾商品的買賣,這個指標有很多可能,一般是大盤、大眾商品走勢或是加密貨幣的走勢等,指標漲我就買股票。當然指標也有可能是相反的,即指標漲賣手中的股票,我們的第一階段就是試圖找出市場中的這些指標。
透過DTW函數庫的distance_matrix函數,將待測目標們兩兩比對,並在計算出DTW值之後畫成熱力圖,以紅色表示走勢相近,藍色表示走勢差異較大,如下圖五。
圖五、十一個指數、大眾商品、加密貨幣等的DTW熱力圖 (1mo/1h)
可以看出美國大盤之對應的期貨間的DTW值較小 (第三行最下列與第四行倒數第二列),這個是很合理的,因為指數跟對應的期貨價格之走勢應要相同,然後台灣與韓國的大盤或是ETH基本上也是跟著美國大盤走,然後最後一行是美元指數,基本上就是一個相反的指標,美元指數漲,大盤就跌,反之亦然。值得觀察的是,BTC (第五行)的走勢與大盤稍大,與其走勢最像的是GC=F (第七行)即金價,這或許可以進一步說明BTC正朝著數位黃金發展。
我們計算同一個資料對,在不同時間(如表二)下的DTW值,並以此來觀察各對在不同時間長度下的DTW,來觀察其變化,此外我們同時也計算了Pearson Correlation,以此做一個比較,如圖六。
假設一天交易時數 6小時 |
|
總時長 (取樣週期) |
資料筆數 |
一週 (15m) |
4*6*5=120 |
一個月 (1h) |
6*22*1=132 |
三個月 (3h) |
2*22*3=132 |
半年 (1d) |
1*22*6=132 |
一年 (2d) |
(5*52)/2*1=130 |
表二、使用的時間長度與取樣週期
圖六、不同數據對在不同時間週期下的DTW值
可以發現兩個美國大盤間(第一行)的走勢都是相近的,DTW數值都很小,Pearson相關係數也說明了這點,然後BTC跟ETF(第四行)的方面,從長線(365d)到中短線(30d、90d)有越來越不像的趨勢,但可能因為在寫這份報告時美股處於大下跌趨勢,所以BTC跟ETF都一起跌,因此在短線(7d)的走勢上相似度較高。
前面有提過兩個商品或指數的大盤的相似度不一定是永遠一樣或是相反的,我們第三個研究的目的就是要探討這個現象,我們使用移動窗口(rolling window)的方式來計算一段時間內的DTW數值變化,舉例來說,若窗口設為100天,則今天的DTW是由今天到100天前的數值計算出來的,而前一天就是用前一天到101天前的數值來求DTW,以此類推。圖七、圖八為結果圖。
圖七、恒生中國企業指數與中國上證綜合指數的三個月DTW走勢圖
圖八、韓國大盤與台灣大盤之DTW走勢圖
由圖七可以看到中國的兩大指數走勢通常時候下DTW值都是較低的,但是在近一個月開始出現分歧,DTW值也開始增大,而現在是一個向下的趨勢,代表兩個指數的走勢可能將回歸相似。圖八的部分可以看到,台灣跟韓國在2021年11月到2022年5月間走勢是有差異的,但是到了六月開始,DTW值開始下降,也代表了兩支大盤的走勢漸漸開始相似,由圖上也可以明顯看出。
(二) 英雄股
上面有提到說,機構不可持有過多的現金,必須投入市場,在下跌趨勢時亦須如此,因此英雄股也必定存在,而我們的第二階段,就是要找尋找我們的英雄股。因為英雄股的發生通常位於短周期,所以我們也鎖定在短時間線上,如表三。另外,機構可以進場的股票必定是市值有一定量能的公司,所以我們鎖定美國市值前150大的公司做研究,雖然正確來說應該考慮前1000或2000大,但是因為過多的股票會導致計算時間過久,因此就只採用前150大公司的資料。
假設一天交易時數 6小時 | |
總時長 (取樣週期) |
資料筆數 |
1天 (3m) |
20*6=120 |
3天 (10m) |
6*6*3=108 |
1周 (15m) |
4*6*5=120 |
表三、找尋英雄股所使用的時間維度
圖九、美國市值前150大的公司與道瓊斯指數的DTW熱力圖
圖十、與道瓊斯指數走勢差異最大的前16名之走勢圖
圖九為美國市值前150大的公司與道瓊斯指數的DTW熱力圖,並且經過排序,可以很清楚的看到大部分個股的走勢接與道瓊斯指數相近,但是有少部分的差異很大,我們就將這些圖畫出來(圖十),並在之後一一的做公司的分析,探討背後的原因。
六、心得與未來展望
「沒有百分之百正確的預測」,如果有那也不會是我們先發現,上述的研究基本上都是提供工具,最後是否進場的選擇還是要靠自己的經驗與判斷,包括英雄股也是,在大盤下跌時若發現走勢與大盤差異很大的個股,必須探究原因如是否因為公司出了新產品、是否有該公司有新的合作案等等,等走勢差異的理由充足才可進場,不然容易變成散戶口中最怕成為的「韭菜」。
在未來,我們希望可以加入更多的個股進入英雄股的系統,但到時候就不能做DTW熱力圖了,因為這會讓計算大大幅度增加,可能會變成全部股票都跟某指數或某商品比,而不是任意兩兩比較了。此外我們也打算將此系統結合Telegram Bot,透過Telegram發送指令給電腦,電腦在計算後回傳DTW值或DTW趨勢圖等,讓使用上更方便。圖十一為測試階段的畫面。
圖十一、將本研究與Telegram Bot結合
七、參考資料
[1] 知乎 https://zhuanlan.zhihu.com/p/72672298
[2] dtaidistance wannesm/dtaidistance: Time series distances: Dynamic Time Warping (fast DTW implementation in C) (github.com)
[3] yfinance ranaroussi/yfinance: Download market data from Yahoo! Finance's API (github.com)