最近開始研究美股選擇權, 其實美股選擇權好幾年前就稍有接觸, 基本規則也都了解, 不過過去自己都是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了一下原因是這則新聞:標的現價73.64, 行權價75.00, 離行權只差1.85%價差, 而合約現價只有0.25, 估值價則是1.08, 乖離率3.33倍, 其實不看乖離率就覺得這合約超便宜, 會這麼便宜應該是這幾天大跌, 市場情緒是覺得這檔會繼續下跌吧, 可是如果止跌了可以預期會獲利頗豐, 要賭我也會想賭這種的。
這樣看就很清楚了, 因為最近美股大跌, AMZN近一年的波動率其實不大, 可是最近這兩根大跌破讓股價大跌, 上面表格的行權價看起來都不太可能行權了, 所以合約市價極低。不過因為AMZN過去的歷史波動率低, 而我的估值模型又是直接套用歷史波動率, 所以估值模型計算出來這合約根本不可能行權, 合約價格直接給0, 所以才會乖離率為1。
會有3000多檔符合條件的合約, 應該有一大半都是上述這種情況, 這邊改一下表格的過濾條件, Valuation (Avg) > 0.05, 並且不看AMZN, 排序下來找到ALGN, 標的現價462.78, 行權價570.00, 離行權差23.17%價差, 合約現價6.77元, 可是估值只有0.06元, 乖離率高達0.99。
原因跟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變成更四不像就是了...。
這次分享就差不多到這, 再來打算針對選擇權這塊做更多嘗試, 看能不能找到更多賺錢的機會!!