2021年11月27日 星期六

用FB Prophet預測美股未來行情

最近覺得自己美股轉換標的的時機都不是很好, 抄底常抄在半山腰, 就想說來研究一下預測趨勢好了, 雖然知道要預測市場趨勢基本上不可能, 變因變數太多, 不過就當作小參考也好, 至少能大概知道從過去來看目前大致的趨勢是向上或向下也不錯~。

決定好要做之後就先隨便google一下, 剛好看到FB有發布一個簡易使用的時序預測模型, 基本公式如下:


從公式看可以知道主要是以趨勢跟週期的變化去擬合未來的預測結果, 詳細介紹可以參考這篇。 基本上單針對行情預測這件事來說, 最重要的就是趨勢的預測, 年週期的部分則是對淡旺季有所幫助, 節假日的部分或許也或多或少有幫助 (e.g. 感恩節, 黑色星期五等?)。

這篇介紹有含簡單跑模型的sample code

再來關於股價資料這塊, 我之前做的Norn-StockScreener有設定好Github Action每天自動抓美股6000多檔的近一年OHLCV日報價, 這樣就可以直接開工了, 第一版做好的Github如下:

https://github.com/zmcx16/stock-forecast

再來跑跑看效果如何, 因為FB Prophet基本上是單變數模型, 所以先把近一年的資料拆成9:1, 前10.8個月當訓練資料, 後1.2個月當測試資料, 再來評估模型的效果, 先來跑AT&T測試看看:


上面黑色的點是真實資料的點價位, 藍色的線則是模型訓練完後模擬出的結果, 淺藍色的區塊則是預測線的上限及下限, 可以當成模型認為可能的最大誤差, 至於Y軸的值為什麼跟股價不一樣, 是因為有先對資料做對數轉換, 把資料變得更平穩並且預測的趨勢能更趨於線性, 想更瞭解可以參考下面這兩篇:

https://pythondata.com/forecasting-time-series-data-with-prophet-part-1/

https://people.duke.edu/~rnau/411log.htm



第二張圖則是Prophet其他component的圖, 上面那張是趨勢預測圖, 基本上前大半部分會跟這一年的股價差不多擬合, 而最後面那一段有淡藍色區塊的則是實際預測的部分。 而下面那張圖是用每週循環的預測, 基本上意義不大就不看了~。




最後第三張圖則是在把資料做對數反轉換, 還原回原本的股價資料, 光從AT&T本身的股價趨勢就覺得會繼續往下跌, 模型預測出的結果也就是符合他近期的下跌趨勢, 在加一些怪怪的小循環震盪, 比較有意思的地方是, 預測的股價下限趨勢差不多是維持一樣的斜率, 可是上限則是往上持平, 應該可以想成模型認為股價之後可能會繼續用差不多的速度往下跌, 或是轉為盤整趨勢。 再來最後我們可以用測試資料跟預測資料算一下平均誤差跟均方誤差:

MSE: 1.2798056068411054   MAE: 1.0764610288441487


單純用平均誤差看, 跟真實股價平均差一塊錢左右, 以25塊的股價算差不多是4%, 1.8個月的預測資料跟真實資料落差4%價格, 這樣的結果是好或不好, 其實我也不太能把握, 畢竟AT&T的beta本來就小, 如果是波動大的個股, 只落差4%的話我是會覺得很厲害...。

跑完上面的模型, 在來重新思考一下, 上面的模型只是單純用近10.2個月的收盤價, 去預測後面1.8個月的收盤價, 就只是個單變數的模型, 可是股票市場的變數何其多, 單用收盤價就去預測未來資訊太少了, 能準確預測反而才奇怪。 

關於這點, Prophet本身是可以接受添加附加的回歸量來訓練模型的, 只不過必須在訓練資料跟預測資料上都有想加的回歸量才行, 可是未來的資料不可能會有, 只能用某些方法才能生成出來, 關於這問題我是直接參考這篇:

https://stackoverflow.com/questions/54544285/is-it-possible-to-do-multivariate-multi-step-forecasting-using-fb-prophet/58781257#58781257

簡單作法就是, 先把你想加的回歸量都做一遍預測, 然後拿這些預測的回歸量當作你真正要預測的模型的附加回歸量, 這樣就可以只依靠訓練資料就能做多變數預測模型了, 在這邊我額外加入了Open High Low Volume作為附加的回歸量, 並來預測未來收盤價的結果:

 





恩....看第一張圖跟第三張圖, 可以發現預測線跟上下限極度貼合實際的股價, 其實這結果不太意外, 因為附加的回歸量有開盤價跟最高價以及最低價, 而這三種資料跟收盤價本來就是極度相近的, 所以畫出來的會長這樣我倒是不太意外...。

再來看最後一段預測的結果, 趨勢來說還是一樣的, 只是上下限的部分也極度貼合, 這通常就兩種情況, 一是真的精準度很高, 預測神準, 不過想也知道不太可能; 而第二種情況是最有可能的, 就是overfitting過度學習了, 來看看最終測試資料的平均誤差跟均方誤差結果:

MSE: 1.1426736398003121  MAE: 0.9865404828745983

結果還真的比只用收盤價的模型好了近10%, 我是覺得只是運氣好啦... 關於這個問題就先放一邊, 因為上面的預測模型看起來就太overfitting了, 這次附加回歸量我去掉Open High Low, 只用Volume試試看, 因為Volume本身跟價格無關, 應該不會在有上面那種極度擬合的預測圖, 下面是跑完的結果:




MSE: 1.3153719245816298  MAE: 1.0991889378931168

看起來跟只用收盤價預測差不多, 不過均方差跟平均差反而更大了, 其實要說不意外也是不意外, 畢竟交易量大增有可能大漲也有可能大跌, 至於到底往上走還是往下走都是概率的問題, 猜錯方向就是大錯...。


最後再來跑另一檔個股吧, 這次挑AAPL好了, 挑市值最大的公司應該很有參考價值, 首先只用收盤價訓練模型:





MSE: 100.25974199043638   MAE: 9.25843258960275

預測結果整個超差, 畢竟預測值是往下跌的, 而AAPL在10月低點是開始往上漲, 所以模型猜錯方向導致結果超差其實不意外。  

再來看看用Open High Low Volume作為模型附加回歸量的結果:






MSE: 227.09063258654962  MAE: 12.947364146372168

嚇死人, 是怎麼得出這種鬼東西的..., 看起來是把週期性的東西考慮進去了, 可是為什麼下限的波動這麼大, 完全搞不明白, 理所當然的結果當然更差了...。 

最後再來看只用Volume作為附加回歸量的結果:





MSE: 98.57041352599616  MAE: 9.165440570506956

結果只用Volume做附加回歸量反而結果是最好的, 還真是符合預測市場的名言: "沒有絕對賺錢的聖杯..." 

基本上這樣做下來, 我應該會把這個預測作為肉眼&均線看趨勢以外的工具, 拿來當作額外參考用的工具這樣~。

關於FB Prophet的使用經驗大概就分享到這, 後面會繼續分享把這個工具佈署到Github Action跟Google GCP的經驗談, 有想看的在繼續看下去吧~。

2021年11月20日 星期六

MahoMangaDownloaderVer15.4更新

這次主要修復兩個問題, 都是這兩三天使用者回報的:

1. 無限動漫小改版導致下載器parser抓取話(集數)失敗

基本上就是防爬蟲的小改版, 修一下parser就好了。 不過修好後發現有個問題更麻煩, 用瀏覽器瀏覽無限動漫時發現圖片載入超慢, 一張圖片甚至要好幾分鐘才會載入完畢, 不知道是伺服器不穩還是有針對台灣IP限流, 因為基本上這問題沒辦法解決, 我只能把下載圖片的timeout從兩分鐘拉長到五分鐘, 至於能不能下載成功就只能聽天由命了...。


2. hitomi小改版導致下載器抓取不到圖片正確網址

主要是圖片位址的html碼改了, 圖片的tag多了一個class=\"lillie\", 導致下載器的爬蟲抓不到正確的圖片位址, 改一下爬蟲就好了。

不過一樣有個更噁心難解的問題, hitomi現在圖源預設有三種: avif, webp, jpg(這個應該才是原檔), 然後預設都會以avif為主, 只有avif跟webp出問題, 網頁才會顯示原檔的圖片, 然後我測試噁心的地方是, 只有jpg原檔的部分下載會非常容易pending(一張圖下載慢的時候甚至要幾分鐘以上), 而avif雖然下載快(畢竟是預設給人線上看的圖源), 黑白的圖片avif雖然跟原檔品質相同, 可是彩圖的轉檔品質讓人絕望:

因為上面差異真的太大, 個人很不想讓下載器改下載avif, 所以能做的就是把parser改好, 然後一樣把下載的timeout時間拉長(2分鐘->5分鐘), 至於到底能不能載成功, 以及下載速度會變超慢的問題, 我就沒辦法了, 一樣只能聽天由命...。


至於慣例的推坑時間, 因為最近在忙新的side project沒什麼餘裕, 乾脆這次就純推廣阿克西斯教好了, 附上之前做的阿克西斯教傳教網站:

https://axiscult.zmcx16.moe/#zh-TW

Github:

https://github.com/zmcx16/AxisCult


iframe demo:

2021年11月7日 星期日

[網站開發] 選股器新增近N天最高價/最低價/最大量條件 - 美股搜尋網站 Norn-StockScreener

最近開始更換手中的美股持股, 其中在換股選股時有想到說, 除了基本面選股之外, 能不能多看高檔準備突破的, 或是低檔盤整以久的個股, 不只選公司也選買入的時機, 只是之前選股器的條件過濾只有52週高價以及52週低價, 搭配現在市價雖然也是堪用了, 可是卻不知道現在市價跟之前新高/低價的時間距離, 沒辦法設更細緻的條件, 變成還是得手動在進一步過濾個股, 一個一個看才知道, 感覺有點麻煩..., 剛好我之前有幫爬蟲加自動取得每檔個股近一年的每日OHLCV資料, 就決定來加這一塊功能了~。

做好的功能如下,  主要幫選股器加了近N天最高價 / 近N天最低價 / 近N天最大量 (近一年資料):

https://norn-stockscreener.zmcx16.moe/



至於怎麼使用, 以上圖的參數來說(N-Day Price High), 選股器會找出近7天價格有破新高的個股, 總共有333筆近7天個股股價有破新高, 例如搜尋結果第一檔個股AB:


另外用N-Day Price Low, 可以找出近N天破新低的個股; N-Day Vol High則是找出近N天破新高量的個股。 另外搭配52W High跟52W Low, 就可以針對需求做更進階的搜尋:

1. 近7天爆量破新高 (N-Day Price High: 7, N-Day Vol High: 7):



2. 近15~30天爆量破新高, 而且現在價格必須在高點5%以內(高點盤整) (N-Day Price High: 15-30, N-Day Vol High: 15-30, 52W High: -5):



3. 近60~90天破新低, 近7天爆量, 而且現在價格必須超出低點10%以上(不再破新低 & 低點爆量上漲) (N-Day Price Low: 60-90, N-Day Vol High: 7, 52W Low: 10):



這次的新功能差不多就是這樣, 我在來想換股時應該會搭配基本面一起使用(e.g. P/B<2 & P/E<15 & 低檔盤整+爆量上漲), 想些情境&做個版面每天讓程式自動搜尋~。

P.S. Norn-StockScreener的資料庫只有市值超過5000W鎂的個股(大概4000多檔個股), 並且網站搜尋有預設搜尋條件, 如果真的要搜尋Norn-StockScreener資料庫的所有個股, 記得先把搜尋條件都關掉(基本搜尋 & Norn-minehunter搜尋)

MahoMangaDownloaderVer15.3更新

這次更新也是使用者回報問題, 第一個是cocomanga在中系漫畫時, 如果跳轉的是舊網域名(cocomanhua.com), 會沒辦法下載問題; 第二個是hitomi.la在某次改版後, 網址上都會自帶頁碼(#1), 如果使用者貼上網址時也帶頁碼, 下載器就會全部圖片都下載到第一頁, 因為已經是第二個人詢問這問題, 乾脆就趁這次加自動濾除頁碼了(只限首頁), 基本上下載器不支援部分頁數下載, 所以不管什麼網站, 網址只要帶頁碼下載通常就一定會失敗, 只能麻煩使用者自己注意下了, 畢竟幫每個網站加防呆超級累, 完全不想幹...。


慣例推坑時間, 最近在看異世界魔王與召喚少女的奴隸魔術(15禁), 有點澀澀的異世界轉生動畫, 當初會想看這部是Youtube聽歌時剛好聽到第二季OP, 因為很歡樂就決定來填填坑, 沒想到還蠻對我胃口的, 第二季ED電波也超對我好球帶, 非常洗腦XD



巴哈動畫瘋: 

https://ani.gamer.com.tw/animeVideo.php?sn=11977


S1 OP



S1 ED (找不到動畫ED, 該不會是尺度問題吧...)


S2 OP


S2 ED


 

2021年10月30日 星期六

MahoMangaDownloaderVer15.2更新

這次更新新增支援優酷漫畫, 會新增這個網站除了是有使用者提feature request之外, 沒想到這網站有持續更新宇宙兄弟, 就決定支援這網站了!  研究了下發現其實這網站應該前身是漫畫堆, 所以不少爬蟲rule都不用重寫, 套用一下在小修改就好~。


至於慣例推坑時間, 最近把P.A. Works工作女孩系列: 櫻花任務補完了, 個人超喜歡這部城鎮復興作品, 甚至以我來說比起白箱我更喜歡這部, 看到一半還直接買了女主角由乃的黏土人, 推薦有興趣的人入坑, 巴哈動畫瘋也有上架!!


巴哈動畫瘋: https://ani.gamer.com.tw/animeVideo.php?sn=23506


OP1:


ED1:


OP2:


ED2:

 

2021年10月24日 星期日

ReclassifyAnimeCG - 來用深度學習整理CG圖庫吧

會想寫這個工具的主要原因是, 我有追蹤一些繪師並且用下載器去追蹤下載那些繪師的作品, 不過基本上繪師畫的圖通常就是幾天放個一張, 或是一次推出的CG圖庫都是複合的動漫畫主題, 然後下載器下載又不可能自動幫我分類這些圖片, 導致這些圖片就越來越雜亂, 每個資料夾都混雜複數個主題&角色, 每個資料夾的名稱又沒有特定的主題性, 讓我自己事後很難找圖不說, 連看都懶得看了...。 後來就想到現在深度學習分類圖片已經很強了, 那我乾脆來寫個工具輔助我整理圖庫吧!!

做好的成果如下:

使用的方法大致如下:

1. 設置config.yaml
設定想整理的圖庫位置(predict_data_path), 以及先手動整理好一小部分的資料當訓練資料(train_data_path), 還有預定之後模型分類完存放圖庫的位置(output_data_path), 還有設定想訓練/使用的深度學習模型。

2. 執行preprocess.py
preprocess.py會生成 train.txt, test.txt, index.txt 到 label_path 位置。train.txt儲存訓練資料的每張圖片的位置, 以及對應的資料夾名稱(類別); test.txt則是根據config.yaml裡的train_ratio來決定要從training_data裡拿多少資料做為testing data, 如果今天是想測試模型好壞或調參數會設定到, 如果是單純想使用來整理圖片不調參數, 就直接設定成1.0; index.txt則是記錄每個類別index對應的資料夾名稱。

3. 執行train.py
train.py會開始訓練模型, 並把訓練好的模型存在train_model_path位置

4. 執行predict.py
如果config.yaml設定use_test_txt = true, predict.py會使用之前preprocess.py生成的testing data來做分類預測, 並計算這次分類的準確率, 可以根據分類好壞來調整模型跟參數改善模型; 如果use_test_txt = false, predict.py會遍歷predict_data_path位置的所有圖檔, 並針對這些圖檔做分類預測, 以及根據預測結果儲存到output_data_path。

5. 如果是調整或訓練模型到步驟4就結束了, 而如果是要整體圖庫的話, 手動確認分類結果, 把分類錯誤的部分砍掉, 之後把剩餘正確(部分)的分類結果複製到training_data內。

6. 跳回步驟2, 反覆做到個人滿意分類結果為止。

2021年10月16日 星期六

[網站開發] 新增Industry Insiders頁面 - 美股搜尋網站 Norn-StockScreener

目前自己的美股持股中, 有不少景氣循環股 (鋼鐵, 石油, 動力煤, 航運等), 當初會投資這些標的主要是觀察產業-市場指標:

當發現原物料或運價指數跟相關產業的績效乖離過大時, 我就會適當投資一些相關產業的個股, 之後也打算等這些原物料現貨價格 / 運價指數下跌到一定程度後再賣出持股, 不過以景氣循環股來說, 通常行情的最高點也是該相關市場指標的最高點, 單看市場指標下跌在賣出的話, 可能持有的美股標的已經跌一大半了, 對整體的投資績效也會大打折扣, 所以就想說是不是可以多參考幾個市場指標以外的指標, 第一個想到可以做的就是內幕投資人的投資紀錄了。

如果一家公司的CEO / CFO 以及高階主管持續買入自家公司的股票, 通知有很大機率是對自己公司 / 產業的未來很有信心, 才會想用自己的錢買自家公司的股票; 對投資人而言也比較能放心投資這間公司, 畢竟這代表經營這間公司的人跟自己是坐在同一條船上, 要沉也是一起沉XD 

美股上市公司的內幕投資人交易依法必須要登錄在SEC網站上, 基本上像Yahoo財經, Finviz這些大型的財經網站都可以看到每間公司的內幕投資人交易, 這些資料也都是從SEC網站來的, 如果今天我們只是想關注自己想買 / 想賣的公司, 只要追蹤這些公司的標的就好。

但是, 不是每間公司都有頻繁的內幕人交易, 如果剛好我們想買的 / 賣的公司都沒有這些資料, 那我們能參考的, 就只有相同產業的其他公司, 如果這些公司數量還不少, 那追蹤起來就會十分累人, 如果有個統計每個產業的所有公司的內幕投資人交易並整理成一張表的話, 就可以輕鬆許多, 所以就決定來做一個產業 - 內幕投資人頁面在Norn-StockScreener網站上了。

做完的成果如下:




這個表格左半部是每個產業的最近一日的整體漲跌幅, 以及週、月、季、半年、近一年、今年迄今的整體漲跌幅績效; 而右半部則是該產業的所有公司的內幕交易資料統整起來, 最後分別計算週、月、季、半年、近一年、今年迄今佔近一整年內幕交易量市值的比例。 

舉例來說, 上圖第一筆月內幕交易最大值的產業是多元化房地產信託投資, 週買超量(買進-賣出) / (近一年買進+賣出+選擇權執行) 為7.116%, 月買超量為26.934%, 而近一年買超量則只佔26%, 這代表這個產業最近一個月有某間或數間公司被內幕交易人瘋狂買進, 如果想知道交易細節, 可以在點進去最右邊Detail連結, 可以看到那個產業近一年所有公司的每一筆內幕投資交易:





再來看最近因為鐵礦石現貨大跌50%導致整體大跌的鋼鐵產業:



圖右半邊全部都是紅色的賣超, 這個基本上很正常, 因為大多數的公司員工不太會拿自己的錢去買股票, 可是會拿到公司的股票選擇權, 所以對大多數公司來說賣出>>買進是合理的, 要區分到底是選擇權到期後賣出, 還是看壞公司 / 產業才賣出, 只能一家家公司分別看才知道...。 總之先來看一下鋼鐵產業的內幕投資交易:






剛好就有我3天前撿便宜的美國鋼鐵(X), 來看一下Finviz網站的美國鋼鐵資料:





剛好5/10跟8/18這兩波大賣都是股價相對高點, 5/10的賣出是5/12 SEC才公告, 可以看出那根大紅棒應該很大可能是SEC公告才直接摔下去的, 而8/18則是後續又緩跌了幾天, 才重重摔下去, 我自己目前是打算熱軋鋼捲價格大跌或有上述內幕投資人大賣出再出清X持股。


看完鋼鐵產業的例子, 再來看看航運好了:



從整體產業頁面看不太出什麼關係, 只看出今年迄今的賣超量大於近一年的賣出量, 這代表大部分的賣出都是在今年發生的, 去年應該有不少內幕投資人積極買入自家公司的股票。




至於內幕投資的交易列表, MATX就超過了一半的交易, 看一下Finviz的資料:






這是一家高階主管不斷狂賣股票的公司, 基本上對於產業來說沒有參考價值, 而以公司來說我也完全不會想持有這間公司, 目前的網頁也沒辦法自動把這類的公司濾除掉, 殘念...。

基本上這種高階主管不想持有股票的公司非常多, 這不代表說這間公司不好, 畢竟每個人想把錢放在哪裡都是他個人的自由; 反過來說內幕投資人不斷買進的公司也不能代表公司或產業前景一定好, 有可能是公司高層自己看錯趨勢, 或是不管盈虧就是對自家公司情有獨鍾, 或是戰略意義上的買進 (e.g. 母公司增加子公司持有比例, 公司經營權戰爭等等), 不能僅僅單看這個指標, 還是要分析基本面, 產業前景, 總體經濟等全方面的評估在投資會比較適當。

最後題外話, 對我來說, 我喜歡跟投資人坐在同一條船上的經營層, 這樣我也才能安心把錢放在這間公司上面。 之前疫情時有注意到ZM的內幕投資人交易, 公司高層幾乎每個月都在賣股票, 拿到選擇權後也是一直賣, 所以我完全不會想投資ZM這間公司, 不過認真說ZOOM軟體真的做得比微軟的Teams好用太多, 只是我還是不會因為這樣就投資這間公司就是了...。

這次分享就到這邊, 有空再來想想還有什麼好玩的東西可以做~~。