2022年1月24日 星期一

[網站開發] 美股選擇權定價模型

最近開始研究美股選擇權, 其實美股選擇權好幾年前就稍有接觸, 基本規則也都了解, 不過過去自己都是Naked Put亂買, 或是Cover Call簡單就把持股賣掉了, 常常權利金小賺但賠錢在持股, 後來就好幾年沒碰選擇權了..., 最近開始又興起了重新學習選擇權的念頭, 希望能讓自己的投資績效更好一些!

既然決定重新學習選擇權, 就決定買本書來看了, 目前是買了這本: 

選擇權價格波動率與訂價理論:高級交易策略與技巧


算是有K完了一遍, 基本上這本書算淺顯易懂(扣掉公式的部分不提的話), 從最基礎的規則到選擇權的估價以及各種指標都有介紹說明, 蠻推薦給已經對選擇權的規則有簡單理解的人閱讀。


接著就是要來想想, 如果我想靠選擇權賺錢, 可以用哪些方法, 分析了下有以下這些方法:

1. 短線買賣合約賺差價 -> 短線投機成分太重, 加上對身心都不太好, 自己想像了下也覺得不適合自己, 故不考慮。

2. 尋找套利機會 -> 難度很高, 要有高規格的設備去即時掃描所有市場, 就算真的找到有套利機會的標的, 自己的資本額也完全不足以賺到錢, 再加上交易成本等等, 基本上也是完全不用考慮了...。

3. 搭配現股做避險或加碼操作, 做中長線投資 -> 感覺最適合自己, 不過以前自己這樣做成效不彰, 必須要想辦法改進自己的策略

4. 尋找市價跟估值乖離過大的合約交易, 只要不是黑天鵝事件等級, 在均值回歸下長久下來應該能賺錢 -> 這個感覺也有研究的價值, 不過如果只是找乖離過大標的, 在不考慮公司基本面的話, 就只是單純的做交易而不是當股東, 風險控管部分得更確實, 而且某方面來說可能會搞成像方案1, 如果要做這塊必須更小心謹慎。


這樣看來能玩的就是3 & 4了, 如果要做這兩塊, 最重要的就是針對選擇權做估值, 估算目前市場上的選擇權合約, 相對於標的價格到底是貴還是便宜, 如果合約市價比合理價貴, 我們就可以賣出合約賺權利金; 相反的如果合約市價比合理價便宜, 那我們就可以買進合約, 賭賭看能不能履約賺到標的價差。 至於合理價要如何計算得出, 就可以靠選擇權估價模型, 而最具代表性的有以下三種:

1. Black-Scholes Model - 參考資料

套入數學公式就能計算出合約理論價格, 公式太複雜恕小弟不解釋(我也有看沒懂, 頂多知道參數代表的意義而已, 為什麼公式長這樣我也霧煞煞)


2. Monte Carlo Simulation - 參考資料

對標的價格的變化做隨機模擬, 在假設符合常態分佈的情況下進一步推算出合約價格。 公式其實我也是看不懂, 只懂概念而已。


3. Binomial Tree (二元數, 二項式定理) - 參考資料

從估值日開始建樹, 每次的分支都是一個時間的價格的變化(波動率), 持續建樹直到節點到行權日為止。 也是這三種模型中唯一可以計算美式賣權的模型。


現在知道有三種代表性的模型, 再來要做的, 就是對美股市面上所有的選擇權合約做估值, 這塊當然不可能靠人工計算, 包含抓市場資料以及計算估值, 都打算直接透過程式處理, 幸好三種估值模型網路上有一堆程式碼了, 抓Yahoo財經資料的library也有, 我只要專心串起來做整合就好, 做好的成果如下:

Github:

https://github.com/zmcx16/Norn-Finance-API-Server

程式寫成Web API Server的形式, 這樣之後可以直接串我寫的其他網站, 目前提供四種API:

  • [GET] /stock/history
  • [GET] /option/quote
  • [GET] /option/quote-valuation
  • [Websocket] /option/quote-valuation

第一個API是取得個股歷史股價, 這個API我主要拿來計算個股的歷史波動率, 第二個API則是取得美股個股的期權鏈, 也就是個股的所有選擇權合約, 前兩個API就只是直接抓Yahoo財經的資料, 而第三個API則是取得選擇權的合約以及估值結果, 只要輸入個股代號就會幫你抓該個股的所有合約以及針對每一份合約算出上述三種模型的合理估值。 至於為什麼還有第四個Websocket API, 原因是這個網站我是架在Heroku當免費server用, 可是卻因為選擇權估值模型計算太久採到Heroku 30秒timeout的雷, 為了workaround才開的API, 有興趣的人可以看這篇文章


另外網站前端的部分則是直接在Norn-Stockscreener多開一個選擇權估值頁面:

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

這頁面提供兩種模式:

1. 美股個股盤後選擇權估值

2. 查詢&計算個股選擇權估值




上面的表格是Calls, 下面的表格是Puts, 以(1.) 美股個股盤後選擇權估值來說, 就是收盤後掃全部美股的期權鏈資料, 在分別計算上面提到的三種選擇權估值模型.....是很想這麼做, 可惜做不到..., 原因在於美股有幾千甚至一萬多檔個股, 然後每檔個股的選擇權合約數量又會隨著行權日跟行權價格的組合成倍數成長, 以AAPL來說, 光是一個月內的近月選擇權就有幾百檔合約, 要去爬這些資料並計算估值, 跑沒多久就會被Yahoo財經ban IP, 更不用說還需要龐大的電腦運算資源跑估值模型(Black-Scholes Model只需要一行公式就能算出, 可是Monte Carlo Simulation & Binomial Tree得跑超久...), 所以只能加上一些限制條件, 只針對比較有用的合約跑估值就好, 我目前是只針對以下的個股選擇權跑估值模型:

1. 標的(個股)市值超過500萬鎂

2. 近月選擇權 (近45日內行權)

3. 最小成交量 >= 10

4. 最近一次交易日 (3天內)

這樣過濾後就能只針對比較有機會交易 & 流動性風險也較低的合約做估值, 不過即便如此, 符合這些條件的合約做完估值後還是一大把, 我必須得讓程式自動挑出我感興趣的合約, 所以又針對這些已經做完估值的合約, 計算估值後的價格以及目前市場價格的乖離率(Bias), 乖離率越大代表市場價格跟理論價格差異越大, 在均值回歸下獲利的可能性也較大。 以我目前想交易的策略來說, 我主要針對下面兩種情況做過濾:

1. Valuation Bias: last price > 0.1; premium > 100% (合約現價被嚴重低估)

last price > 0.1 代表最近一次交易的權利金價格超過0.1元, 畢竟權利金要是更低, 光是交易手續費就不划算了, 在加上權利金低於0.1塊八成也很難交易成功(除非有地上的鈔票可撿), premium > 100%表示理論價格大於目前市價100%以上, 代表現在合約價格是被嚴重低估的, 如果我們buy call或buy put, 那獲利的機率可能會比較高。


2. Valuation Bias: last price > 0.1; discount > 50% (合約現價被嚴重高估)

一樣last price > 0.1 , 而discount > 50%表示現在合約價格跟理論價格比至少打折超過50%以上, 代表現在的合約價格是被嚴重高估的, 如果我們sell call或sell put, 那獲利的機率可能會比較高。


3. Self Query

其實就是打上面提到的/option/quote-valuation API, 即時查詢&計算個股的選擇權合約以及三種模型的理論估值, 不過因為是用免費的伺服器, 計算估值模型又要花很多運算資源, 如果是像AAPL那種超多行權價以及行權日的合約, 就得跑超久, 如果真的需要做大量查詢或是常常失敗, 上面也有提供程式原始碼, 可以自己架個Server用自己的環境跑API。


說明就先到這邊, 接著來試著使用看看吧, 首先我想找合約現價被嚴重低估的call或put合約, 表格的Valuation (Avg) 是三種估值模型計算後的平均合約價, Bias (Price) 則是上述價格跟合約最後成交價(Last Price)的乖離程度。 從下圖可以看到, 針對Bias排序後, ARNA行權價100元, 行權日2/18的合約, Bias竟然有70倍。 看一下合約市價只有0.1元, 可是理論估值卻是7.19元, 的確是超過70倍沒錯:


可是這樣就代表真的是超划算的賺錢機會嗎? 這可不一定, 我們可以看看合約標的ARNA的股價走勢看看:

可以看到, ARNA在12/13後忽然暴漲80%以上, Google了一下原因是這則新聞:

輝瑞收購喜訊加持 Arena Pharmaceuticals
美國生技公司 Arena Pharmaceuticals 周一(13 日)傳出輝瑞同意以 67 億美元收購喜訊,換算每股收購報價為 100 美元,為上周五收盤價的 2 倍,盤中股價應聲大漲近 80%,接續盤前漲勢。

如果對選擇權估值模型的公式還有印象的話, 其中有一項最重要的參數為"波動率", 選擇權簡單一句話解釋, 就是買合約的有行權的權利, 賣合約的有履約的義務, 最終還是在賭會不會行權, 行權時的價差有多大。  而估值模型的所有輸入參數中, 波動率是最重要且未知的參數, 波動率大就代表行權的可能性大, 波動率小則相反, 所以波動率越大, 合約價格就會越貴; 相反若波動率越小則越便宜。

But, 雖然你提供的未來波動率參數越準確, 則估值模型計算出的合約價格就越精確, 可是未來是不可知的, 我上面跑估值模型是直接計算標的過去一年的波動率, 所以遇到上述情況, 可以預期提供給模型的波動率是嚴重高於未來波動率的, 所以這個估值並不可信, 不能單純看這個乖離率去買進買權。

繼續往下看, 那些乖離率極高的, 幾乎也都是上述這種情況, 所以還是得一個一個過濾, 把這些雜訊濾除掉, 不過靠這表格至少已經從恆河沙數的合約過濾到剩92筆合約。 

繼續往下看, 看到有一檔FAF:




標的現價73.64, 行權價75.00, 離行權只差1.85%價差, 而合約現價只有0.25, 估值價則是1.08, 乖離率3.33倍, 其實不看乖離率就覺得這合約超便宜, 會這麼便宜應該是這幾天大跌, 市場情緒是覺得這檔會繼續下跌吧, 可是如果止跌了可以預期會獲利頗豐, 要賭我也會想賭這種的。


再來試著找合約現價被嚴重高估的合約吧, 看表格符合條件的call合約有3304筆, put合約有2221筆, 因為是當賣方, 最好結果也就合約到期不用行權, 所以乖離率最高就等於1, 也就是合約其實完全沒價值(即便還沒到期也一樣):



看表格一排的AMZN(Amazon), 來看看AMZN到底發生了什麼事:


這樣看就很清楚了, 因為最近美股大跌, AMZN近一年的波動率其實不大, 可是最近這兩根大跌破讓股價大跌, 上面表格的行權價看起來都不太可能行權了, 所以合約市價極低。不過因為AMZN過去的歷史波動率低, 而我的估值模型又是直接套用歷史波動率, 所以估值模型計算出來這合約根本不可能行權, 合約價格直接給0, 所以才會乖離率為1。 

這個問題其實有點麻煩, 照理說估值模型如果算出合約價為0, 那我們應該可以爽爽的賣合約爽賺權利金, 可是合約市價現在也跟屎沒兩樣, 就算比0好也不代表一定要賣合約, 畢竟過去的波動率不代表未來的波動率, 模型就算真的運氣好用歷史波動率給你算很準, 也都還是機率問題, 沒有確定的答案, 來個肥尾效應就輸到脫褲了。

會有3000多檔符合條件的合約, 應該有一大半都是上述這種情況, 這邊改一下表格的過濾條件, Valuation (Avg) > 0.05, 並且不看AMZN, 排序下來找到ALGN, 標的現價462.78, 行權價570.00, 離行權差23.17%價差, 合約現價6.77元, 可是估值只有0.06元, 乖離率高達0.99。 


離行權日只剩兩週, 照理說兩週要漲23%感覺很有難度, 感覺這權利金應該很好賺, 來看下ALGN股價走勢:



原因跟AMZN一樣是最近暴跌, 不過看起來比AMZN還要有賺頭(合約跟行權價差有1.18%, 兩個禮拜賺1.18%算很不錯), 不過問題是裸賣空是很危險的, 要是來個V轉就會為了賺1.18%賠十幾二十%都說不準, 真的要玩也得做好避險才行...。

這次DEMO大概就到這邊結束, 下面會開始講估值模型的歷史波動率計算, 以及一些開發歷程踩的雷, 有興趣的在繼續往下看吧~。


上面文章有簡單提到, 選擇權估值模型中, 最重要也最未知的參數即為未來波動率, 因為這個值我沒方法推算出來(有不少研究有去試著計算跟預測, 不過我還沒研究), 所以我不打算去預測未來, 而是直接用歷史波動率做為估值模型的參數, 只要沒有黑天鵝或肥尾效應或重大突發事件, 並且手動去除雜訊的輸出, 在均值回歸的作用下, 對乖離率偏差過大的合約做反向操作, 獲利的機率應該是比擲銅板還高。 至於歷史波動率的計算, 可以參考下面這兩篇:

Historical Volatility Calculation

How to Calculate Historical Volatility in Excel

因為我只看過去一年的股價資料, 所以我也只計算過去一年的波動率, 而波動週期因為我主要想交易近月選擇權, 所以週期選一個月工作天數(21天)比較符合我的需求, 之後就是計算sliding windows的平均波動率, 就可以得出月週期的年平均波動率。

再來重點來了, 以過去歷史股價資訊來說, 我們都知道越近期的資料參考價值越高, 而越古老的資料則參考價值越低, 所以我們直接用年平均波動率並不太好, 應該要以權重的方式, 越近期的波動率權重越高, 越遠期的波動率權重越低, 這樣參考的歷史波動率才更能反映未來(單純跟平均波動率相比來說)。

這個問題可以透過EWMA(指數加權移動平均)解決, 書中公式如下:


λ越小近期資料權重越大, 相反λ如果趨近於1, 則就相當於平均權重。 不過書中的a_(n) > a_(n-1) 好像寫錯了, 因為λ介於0~1之間, 照理說n越大a_(n)會越小, 應該反過來a_(n) < a_(n-1) 才對, 所以這裡我實作是把a_(1)當最近期資料, a_(n)則是最遠期資料。

https://github.com/zmcx16/Norn-Finance-API-Server/blob/master/models/formula.py#L24


歷史波動率的問題解決了, 不過我在實作cron job天天抓所有個股期權鏈時也遇到不少問題, 像是Yahoo Finance v8 API 特別容易被ban IP, 試了一週參數還是繞不過去, 然後試著用GCP Cloud Function跑Yahoo API也沒用, IP一開始就被鎖死了...。 不過幸好抓期權鏈不用v8 API, 只有抓歷史股價才會用到v8 API, 這邊歷史股價就新增marketwatch作為資料源, 幸好順利解決了ban IP的問題, 不過也讓我的Server API變成更四不像就是了...。

這次分享就差不多到這, 再來打算針對選擇權這塊做更多嘗試, 看能不能找到更多賺錢的機會!!

2022年1月21日 星期五

MahoMangaDownloaderVer15.6更新

Note: 因為上一版關閉視窗提示針對線上更新的部分有少改, 上一版線上更新跑到一半時會無法自動關閉舊程式, 當更新程式跳出來並卡住時, 只要手動關閉舊程式就能繼續順利進行更新, 這問題會在這版程式更新後修復!!


這次更新內容如下:

1. 修復古風漫畫新增漫畫時使用到舊網域名問題(gufengmh8->gufengmh9)

2. 修復古風漫畫改版後會下載到假圖檔的問題

3. 支援welovemanga新網域名: https://welovemanga.one/

4. 新增下載器關閉提示設置開關


上面1, 2, 4項是使用者提的feature request以及回報的問題, 2則是今天要出新版時測試發現古風開始擋爬蟲了, 被偵測到非法request都會下載到假圖, 所以小改版下載的方式修復這問題。


再來是慣例的推坑時間, 最近把放置很久的動畫: "要聽爸爸的話" 動畫追完了, 比想像中的好看許多!  看完都開始讓我想組織家庭了~~~。  會忽然開始填這個古老的坑, 主要是偶然知道這作品完結後一年作者就肝癌過世了, 就有種使命感覺得一定要填完這坑, 也真的幸好自己有填, 沒有錯過這部神作~~。

最後補上作者松智洋wiki: 

2016年5月2日,松智洋因肝癌去世,享年43歲。松智洋告別式中,依松智洋遺願,棺材正面及側面畫滿曾為其輕小說畫插圖的插畫家與漫畫家畫的美少女角色,堪稱可媲美痛車的「痛棺材」;出棺時播放的歌曲,是《嬌蠻貓娘大橫行》動畫主題曲〈はっぴぃ にゅう にゃあ〉

沒想到遺願這麼厲害, 真希望我的人生也能活得這麼燦爛!!





動畫OP:

動畫ED (只找到畫面lag版的...):




再來就是補PSP遊戲跟全套18集小說了, 希望過年這段時間能完美填坑XD

2022年1月9日 星期日

Heroku的30秒Request Timeout限制 & workaround

好久沒寫純技術文了, 這次會寫這篇文章的原因, 主要是想新做一個web server, 可是我Azure目前的cost一個月花費已經快超過NT 1000, 就決定把這次新做的server, 放到申請後一直放著生草的Heroku上。

關於Heroku的介紹, 最大的優點就是他會送你每個月550小時的實例(一台server), 如果有綁信用卡就會再送450小時, 合計1000小時>一個月(720小時), 等於你可以完全擁有一台免費的server可用, 如果有佈署多台server則是平均分攤, 網路上的介紹很多, 這邊就不多提及了。


這次要做的新的server github如下:

https://github.com/zmcx16/Norn-Finance-API-Server


主要用途為抓取股價以及選擇權合約資料, 並且跑選擇權定價模型, 計算目前選擇權的價格以及估價模型的價格差異, 從中找出獲利機會, 不過實際上放到Heroku上跑, 會發生只要是合約過多的個股選擇權, 會因為估值模型跑太久(Black-Scholes,  Monte Carlo, Binomial Tree), 觸發Heroku router的30秒Request Timeout問題, 一般來說自己架的server的request timeout是可調的, 可是像Heroku這種PaaS的代管服務可能會因為架構設計問題使得彈性受限(在共用router的情況下, 不能允許各個客戶設定自己的router timeout好像也挺合理的...)。 

關於這個問題Heroku官網上文件也有關於Request Timeout的說明:

https://devcenter.heroku.com/articles/request-timeout

文件提供的建議是, 如果有超過30秒的request task, 請設計async job的request形式, 把long-time job移到background job去做, 最常見的做法就是把API request拆成兩個以上, 第一個request會請server開始計算工作, 並拿回一個task id, 之後再用這個task id去polling問server, 直到server做完在回覆結果。 這個做法的好處是可以讓web server專注在響應客戶端的請求, 後台再用其他service去處理CPU bound或是long-time job類型的工作, 對使用者體驗以及伺服器穩定度都會更好。

不過以我個人來說, 我只是想做個簡單的小server用, 而且我也不想花錢去架其他service跑background job, 為了省錢, 只能想想怎麼workaround了, 幸好要避免Heroku router timeout還是有辦法的:

https://devcenter.heroku.com/articles/http-routing#timeouts

Timeouts

After a dyno connection has been established, HTTP requests have an initial 30 second window in which the web process must return response data (either the completed response or some amount of response data to indicate that the process is active). Processes that do not send response data within the initial 30-second window will see an H12 error in their logs.

After the initial response, each byte sent (either from the client or from your app process) resets a rolling 55 second window. If no data is sent during this 55 second window then the connection is terminated and a H15 or H28 error is logged.

Additional details can be found in the Request Timeout article.

簡單說明的話, 就是雖然會有30秒的Request timeout, 可是只要這中間有傳遞資料(不論是client端還是server端), 就會再重置一次55秒的timeout, 所以如果想避免Request timeout, 只要維持connection不要斷, 並且每幾十秒ping一下就沒問題了。 大概下面幾種方法都可以實現:

  1. SSE (Server-Sent Events)
  2. Stream Response
  3. Websocket
SSE基本上就是connection建立後不斷開, 只靠server主動通知client事件(只允許server單向跟client溝通), 只要在server端工作時不時的ping一下client就能解決; Stream Response則是server在回覆資料給client時不一口氣傳完, 在不超過55秒的情況一次一次write直到最後發送end才讓整個request結束; 至於Websocket則是全雙工, 建立連線後client跟server可以互相通訊, 一樣只要時不時的ping一下(client or server都可以)就能解決。

考慮了一下上述幾個作法, 最後決定選用Websocket, 原因是以我的需求來說, 如果用Stream Response, 會變成需要拆解整個Request body分成heartbeat區以及data區, 太過複雜所以不允考慮; 而SSE跟Websocket以我的需求來說, 只差在server去heartbeat client或client heartbeat server, 以server的loading考慮的話, 最終決定選用Websocket, 做起來也最單純。

至於websocket client - server溝通的interface, 一般作法是建一個萬用的websocket連線, 之後再根據event的內容決定要做什麼, 不過基本上我開的API本來就是以restful為準, 非常不想讓websocket跟原本的API差異過大, 所以就決定把websocket連線當成一次性用途, query parameter則是跟原始的restful API一模一樣, 只要處理完工作就關閉連線, 這樣也乾淨許多(畢竟這個API本來就是restful就夠用了, 根本不需要websocket, 一切都是為了workaround...)。

實作好的具體demo如下, 首先看一下原本會timeout的restful API:



Restful API error:



Heroku log:


這邊說明一下, 會是H13 connection close error主要是因為uvicorn --ws-ping-interval & --ws-ping-timeout預設值是20秒, 所以在Heroku H12 timeout error之前uvicorn就自己timeout了, 如果今天我有設定上述的--ws-ping-interval & --ws-ping-timeout參數讓他大於30秒, 就會變成觸發的是Heroku H12 timeout error, 因為反正我都要打heartbeat了, 我就索性不加參數了, 因為我的uvicorn是用gunicorn管理的, 要改預設參數會很麻煩, 反正問題能解決就不用管細部參數了。


Websocket (手動測試, heartbeat on client):



用websocket做restful API, 這也真夠奢侈的了~。 而且因為是開websocket, OpenAPI 自動產生document文件的方式也不適用websocket, 不過反正這個API也只有我在用, 其實也沒差就是了, 反正query parameter跟restful API一模一樣, 也不用特別去記他~。


這次分享大概就醬, 最後記錄一個踩到的雷, 原本我的backend code, 在處理heartbeat的部分是寫multi-thread去接heartbeat message, 這在local端實測有效, 可是不知道為什麼放到Heroku上client端有打heartbeat server端也有收到, 可是還是會觸發Heroku Request timeout, 最後沒辦法只能接收heartbeat還是用main thread, 抓資料&計算估值在用mulit-thread處理, 完全搞不懂為什麼會這樣...。

2022年1月1日 星期六

2021年投資績效

資產報酬率: 54.22%

VTI: 25.67%





個別報酬率(未實現&已實現):


交易日誌:

https://github.com/zmcx16/zmcx16.github.io/commits/master/.github/trade-data


2021 Q1~Q3 投資心得:

https://www.ptt.cc/bbs/Stock/M.1634402678.A.8F0.html


2020年績效: 2%

https://blog.zmcx16.moe/2020/12/2020.html


2019年績效: 51.9%

https://blog.zmcx16.moe/2019/12/2019.html

https://blog.zmcx16.moe/2019/09/20191-9.html


今年大盤大漲, 只做多頭的我獲益也很不錯, 績效多贏大盤一倍多一點點, 也勉強突破個人年績效紀錄一點點, 算是有些微的小突破吧。  不過今年跟往年很不一樣的是, 有針對選股多做了許多嘗試, 也寫了不少投資工具&網站來輔助自己的交易, 而且有些大報酬像是煤, 鋼鐵就是從今年做的產業-市場績效比較的網站來的(細節可以參考上面ptt的2021 Q1~Q3心得連結)。

至於其他選股的部分就一樣還是透過自己做的選股網站, 只選被低估的價值股, 成長股跟科技股還是一樣不敢碰, 以我個人來說, 選低估的價值股我至少還可以做大概的估值, 知道什麼價位是自己可以接受的, 也可以透過財報知道自己是不是該出場了, 只要財報沒有變壞或沒有找到更好的標的, 我就可以繼續安心持有, 不怕一直看錯停損, 或是沒看錯但是又一直被洗出場, 或是更慘的不知道自己看錯卻也依然不停損..., 不過相對的只買價值股的話, 就沒辦法像買成長股那樣, 有機會賺好幾倍的獲利就是了...。 

因為個別的買股賣股操作, 在上面的交易日誌連結都有了, 下面會以條列式的方式說明自己的投資做法:


1. 資產配置

基本上就是把自己當大盤價值股ETF, 只做多不做空, 美股帳戶的現金部位很少超過1000鎂, 工作收入存到一萬鎂就匯到美股帳戶並投入個股, 另外也不融資&開任何槓桿, 只用自己的錢做投資。 另外分散投資方面, 我大概會分散10~15檔個股, 單一個股最多不超過總資產15%, 單一產業最多不超過30%, 雖然這樣分散下來, 爆賺的可能性會變小, 可是至少能避免看錯時的大幅虧損。


2. 買賣基準

買進的話, 主要就是挑被低估的價值股選便宜, 挑選的方式主要是透過自己做的選股網站:

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

https://project.zmcx16.moe/?page=investment-formula

過去主要是挑本益比低於15, ROE、ROA、ROI為正, 近期股價在低檔的公司為主, 過濾出符合條件的標的之後, 在一間一間公司看哪些公司值得買進, 檢查的基準主要就是看近4季&近3年財報, 內幕投資人買賣紀錄等等, 主要只挑營收有持續成長的公司, 或是只有單季營收衰減但是被大幅低估的公司等等。

不過用上述過濾器過濾的標的有時候太多, 而且過濾出來的標的也沒辦法分出哪個比較好, 哪個比較壞, 所以後來會直接搭配多因子選股模型, 透過計算總分的方式由上往下看, 選股效率比起過去單純用過濾器的方式好得多。

至於賣出方面, 反而沒有什麼準則, 不如說自己的賣出方式還差勁許多, 需要在加強, 像是2021年初我用價值投資選股在12.23塊買進了BGFV, 後來他一路上漲到17~18塊, 可是在財報公布前一個月, 公司內幕人士VP, CEO大賣股票, 想說苗頭不對先獲利出場, 結果財報出來獲利好到爆, 股價一飛衝天到30塊up, 只有賺到50%, 沒賺到後面超過一倍的利潤, 真的是很可惜QQ  

不過之後這一年, 這間公司股價波動極大, 而公司內幕人士依然持續賣, 就這樣一年過去了, 股價最高甚至還到42塊, 現在則只剩19塊了..., 雖然早就受好幾次教訓, 投資市場就是要賺這些不理性的錢, 不過要賺到真的是好難啊..., 即便最終是看對的, 過程中賺不到錢也沒有意義阿~。


除了看內部人士買賣紀錄, 我最主要出場的準則還是看財報, 不過財報基本上還是落後指標, 沒辦法跑得及時不過至少還是跑得掉, 這塊就未來繼續改善出場策略了。

另外從2021年開始, 我也開始透過看產業-市場績效指標找有沒有乖離過大的產業, 有的話就從該產業挑比較符合選股標的的公司買進, 今年大概有一半以上的報酬都是從這賺來的, 不過那也是得益於2021年原物料通膨的大行情, 今年不知道有沒有機會在找到類似的機會...。


3. 股息 & IB股票收益提升計畫

因為我都不留現金, 而且挑的都是價值股, 雖然挑選個股時看配息率挑的標的很少(畢竟境外投資人預扣25%的稅超重), 不過今年領到的股息還是有9341鎂, 其中被扣的稅款則是1075鎂, 沒有到25%我猜應該是我買的一些標的是ADR, 非美股的個股扣的是ADR的稅這樣, 單以股息來看, 其實已經夠我全年的開銷了(不含房租的話)。  

另外IB還有股票收益提升計畫, 簡單說就是讓IB把你的持股借給其他人放空, IB則是會押一份保證金給你, 然後付你利息, 基本上近乎於零風險, 不過我看了下明細, 大部分的獲利都是從某一兩個月來的, 而且利率高得嚇人(1X~2X%), 其他月份反而利率都極低, 看起來是只有波動極大&流通量低的情況才賺得到高利率。



另外這一年借出的股票IB收到的總利息收入有648鎂, 可是最後只給我325鎂, 抽成竟然達到50%, 這種系統自動能處理的事情抽成抽這麼兇, 感覺好黑阿... 雖然IB也是要付出抵押金等風險啦...。 




4. 選擇權

選擇權其實自己只懂基本規則(buy call, buy put, sell call, sell put), 前兩年有試著交易(sell put, cover call)不過感覺常常賺了權利金虧了本金, 所以後來就都沒什麼在碰了, 不過整個Q4幾乎沒什交易, 資產報酬也從高點跌了1X%, 所以想重新開始學習選擇權這塊, 至少把定價模型理論學起來, 之後看能不能靠選擇權多增加點收益。

目前這塊還在學習中, 12月底有先試著交易一月底行權的極價外sell put & cover call, 權利金收了995鎂, 目前看起來除了Intel可能有機會在55塊行權之外, 其他標的行權的機率應該蠻低的, 如果真的行權了, call就當提前獲利了結, put的部分就當打折加碼, 真的行權時在拿工作收入跟抽股票的錢補上去就好, 基本上也是沒有用槓桿操作, 可以安心地睡好覺, 再來就看這塊有沒有機會做到更好, 持續改善投資績效。


5. 未來展望

從開始工作這四年多, 只要工作收入存滿一萬鎂, 我就會持續投入投資帳戶, 一開始對投資獲益其實蠻無感的, 獲利的程度最多就補貼生活費或房租, 後來隨著工作收入的提高, 能投入的資金也越來越多, 本金擴大的速度也變更快, 然後隨著本金的擴大速度變快, 總投資收入的獲利又跟著獲利%數大增加。 而隨著資產的成長擴大, 現在反而工作收入再投入的影響程度又變小了, 著實心中有不少感概。

2019年的51.9%資產報酬率當時略微超過我當時的年薪, 而這兩年我的工作收入也比我預期的成長不少, 可是2021年的54.2%資產報酬率, 卻已經超過我現在的兩倍年薪, 平平是50%報酬率, 隨著本金規模的不同卻有全然不同的樣貌, 本金&複利的魔力真的著實驚人。

目前對未來的想法是, 如果資產規模再增加兩倍, 或是我繳的稅已經不用再繳綜所稅, 而是繳基本所得額的情況時, 我應該就會從受雇工程師轉職畢業, 開始做跟金錢無關, 各種自己想從事的工作吧, 雖然我也蠻喜歡當工程師的, 不過我更想自由的隨時選擇自己想做的事, 而不僅僅是寫程式領薪水工作這樣~。

2021年12月30日 星期四

MahoMangaDownloaderVer15.5更新

久違一個月的更新, 其實這次沒有修什麼不能下載的問題, 只是剛好有收到幾個問題回報, 剛好2021年也要結束了, 就想說今年出個最後一版把一些enhance消化一下~, 更新內容如下:

1. 下載器關閉時跳出關閉提示訊息

主要就是下載器被關閉時, 會在跳出一個dialog跟使用者確認是否真的要關閉應用程式, 會加這功能主要是有使用者反應把下載器視窗最大化之後, 有時候關閉瀏覽器或其他應用程式會誤按到下載器關閉, 希望能改善使用者體驗。

2. 下載完成時有機率出現重命名資料夾錯誤, 造成過度retry導致被ban ip

這個問題其實我幾乎沒遇過, 不過好像有幾個使用者有遇到下載器在下載一本漫畫結束時, 會有機率被ban ip, 看log原因是.net move api出現錯誤, 當下載器在下載時, 資料夾名稱會有_tmp_前綴, 等下載完畢時才會重新命名資料夾把_tmp_前綴拿掉, 我是猜可能是那時候可能圖片已下載完畢(sync download api), 或是其實還沒下載完畢, 可是file還沒unlock, 所以才導致重新命名資料夾失敗, 然後失敗後下載器又重新嘗試下載, 循環之下就被ban ip了。

我目前是猜可能下載圖檔過大比較容易會遇到download api unlock failed的問題, 不過我這邊也沒辦法reproduce, 所以就只能做簡單的改善方式, 遇到這種錯誤就不重試, 直接進行下一個task, 讓使用者自己去重命名資料夾把_tmp_前綴拿掉了。

最後慣例推坑時間, 這一個多月除了新番以外, 又追了一些作品:

1. 最強學生會長:


其實很久以前就一直想看了, 不過一直放置著直到最近看到一個MAD重新感興趣起來, 就一口氣把動畫跟漫畫都補完了, 雖然以劇情來說伏筆的回收有點牽強, 不過故事很熱血好笑角色又很有特色, 讓人看了就停不下來~。


最後附上一張香香的安心院~~




2. 瀨戶的花嫁:


高中時候有追動畫, 最近聽歌回憶起來又想重新填坑, 重新看動畫真的再一次覺得岸誠二真的很猛XDD


3. 高校艦隊劇場版:


巴哈動畫瘋(TV版):

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

TV版剛出來時就有看了, 以高中生x軍武題材來說, 比起少戰我更喜歡高校艦隊, 最主要應該還是在於劇情方面, 少戰是和平的校園生活, 高校艦隊則是真的有重大事件需要解決的差異吧, 再來就是個人來說比起戰車更喜歡船艦, 然後OP也超好聽XD  下面附上兩個我很喜歡的TV版MAD:




 

2021年12月5日 星期日

個人網站新增美股 / 市場指標預測頁面

接前篇:

上次文章有提到, 原本想幫norn-stockscreener網站新增所有美股以及對應的市場指標的預測網頁, 不過因為運算資源太大, 沒辦法單靠Github Action以及Google Cloud Function免費額度解決, 所以決定退而求其次, 至少只針對個人需求做了, 只做我目前持有以及感興趣的個股以及市場指標預測表單, 每天運算完結果再顯示在我的個人網站上, 做好成果如下:

https://project.zmcx16.moe/?page=investment-forecast



主要是預測未來30日的漲跌幅, 以及對應個股 / 市場指標的統整資料, 然後也可以看預測線圖:



基本上預測是件極度困難的事, 我也只是拿來當個小參考, 最多就是拿來當趨勢線看, 不過上面兩張圖還挺有意思的(第一張原油價格, 第二張KGC黃金採礦公司股價), 價格最近都大跌, 可是預測趨勢卻看起來沒當一回事, 就不知道到底準不準了, 過個幾天再來看看結果如何XD

至於黃金價格的圖也頗有意思, 預測顯示再來一個月波動會變大許多, 期待看一個月後的結果如何~。



目前這個頁面支援以下{data source}-{algorithm}-{regressors}:

  1. Stock-FBProphet-Empty
  2. Stock-FBProphet-OHLV
  3. Stock-FBProphet-Volume
  4. Market-FBProphet-Empty
再來預計幫Stock增加更多regressors (Market data), 之後應該這個project就先告一段落, 之後有閒再來研究其他時序預測模型(algorithm)~。

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的經驗談, 有想看的在繼續看下去吧~。