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變成更四不像就是了...。

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

2 則留言:

  1. 大大非常厲害,很佩服

    回覆刪除
    回覆
    1. 謝謝誇獎, 投資是終生學習之路, 希望能繼續學習創造好績效XD

      刪除