台股突破21,000,居高思危,用選擇權未平倉量避開股市潛在下跌風險

截止至2024-05-31,加權指數收21,174點,下跌190點(-0.89%)。在股市征戰的各位肯定也覺得最近股市漲幅頗大,年初至今已漲超3200點(+18%),市場一有風吹草動,就會遭遇強勁的獲利了結賣壓。此時我們應居高思危,尋找空頭避險的指標,避開潛在下跌風險。本文我們將帶領讀者了解【選擇權未平倉量】,以及如何使用這個指標來做避險。

選擇權未平倉量

在選擇權市場中,所謂的OI指的是選擇權未平倉量,選擇權未平倉量是指某特定市場在某交易日結束時,多方所持有或空方所拋空的契約口數。它代表市場當時所存在的契約口數,未平倉量等於多頭的總部位或空頭的總部位。當未平倉量越多,代表有越多人將資金押注在這個衍生性商品上,也代表影響越多資金的賺賠,所以有些投資人會將未平倉量當作市場的籌碼數據。

OI

Put/Call 未平倉比率

Put/Call 未平倉比率 = (Put未平倉量 / Call未平倉量 – 1) * 100%

透過賣權未平倉量除以買權未平倉量後減 1,再乘上 100%,以 0 為基準點。數據大於 0 表示賣權未平倉大於買權未平倉,反之則小於。

台灣的選擇權交易中,以法人機構為主的大戶多為賣方(sell),因為法人擁有較佳的風險控管能力與行情判斷能力。散戶通常為選擇權的買方(buy),一買(buy)一賣(sell)就成為法人賣給散戶的行為,成交後就計算為未平倉。

從選擇權賣方角度看,Put/Call 未平倉比率數值越大通常看成偏多指標,因為Put未平倉量比Call未平倉量多,可以推斷賣Put多,更不容易跌破支撐;如果Put/Call 未平倉比率越小則相反,代表賣CALL較多,看上漲遇壓不容易突破。

Put/Call 未平倉比率通常用來判斷市場情緒,當 Put/Call 未平倉比率創下新高或新低時,代表市場出現極端悲觀或樂觀的狀況,後續容易發生轉折。

OI

避險指標

由於 Put/Call 未平倉比率是雜訊非常多,常常前一天是未平倉比率大於0,隔天又變小於0了,指標雜訊過多會讓投資人信心不足,因此我們將用簡單移動平均將數據平滑化。如下圖所示,每日的雜訊減少不少,且指標在小於0時,大盤多伴隨劇烈跌幅。

 import matplotlib

  import matplotlib.pyplot as plt

matplotlib.rc("font", family="Microsoft JhengHei")

  from finlab import data, login



  login("FINLAB_TOKEN")



  index_price = data.get("stock_index_price:收盤指數")["上市發行量加權股價指數"]

  pc_ratio = get_put_call_ratio() # 需自行至期交所網頁下載資料



  indexes = index_price.index.intersection(pc_ratio.index)

  index_price = index_price.loc[indexes]

  pc_ratio = pc_ratio.loc[indexes]



  fig, ax = plt.subplots(nrows=2, ncols=1, sharex=True, figsize=(10, 8))

  index_price.plot(ax=ax[0], label="加權指數")

  ax[0].legend(loc="upper left")

  pc_ratio.rolling(window=30, min_periods=1).mean().plot(

    ax=ax[1], label="Put/Call 未平倉比率 - MA(30)"

  )

  ax[1].axhline(y=0, color="black", line)

  ax[1].legend(loc="upper left")
OI

災難情境

我們觀察過去一些股市大幅回落的時期,2008年金融海嘯、2012年Fed縮減購債恐慌、2015年中國股災、2018年中美貿易戰爭、2020年新冠疫情、2022-23年Fed快速升息,可以看到股市大幅回落的時期,Put/Call 未平倉比率(MA30)的數值大部分皆是負值。

相信讀者一定也有發現,上述6個災難時期有一個特別例外,Put/Call 未平倉比率(MA30)的數值非常的高,從指標完全看不出股是曾經經歷30-40%的下跌。筆者至今仍沒有好的解釋,期待能收到經歷這段時期的讀者們解答。

disaster
disaster
disaster

回測

回測期間: 2001-12-24 ~ 2024-05-30 

避險邏輯: 

當 Put/Call 未平倉比率(MA30) >= 0 時,持有大盤指數

當 Put/Call 未平倉比率(MA30) < 0 時,出清持股

from finlab import data, login

  import matplotlib

  import matplotlib.pyplot as plt



  matplotlib.rc("font", family="Microsoft JhengHei")



  login("FINLAB_TOKEN")



  # data

  benchmark = data.get("stock_index_price:收盤指數")["上市發行量加權股價指數"]

  pc_ratio = get_put_call_ratio()["20100101":] # 需自行至期交所網頁下載資料

  indexes = benchmark.index.intersection(pc_ratio.index)

  benchmark = benchmark.loc[indexes]

  pc_ratio = pc_ratio.loc[indexes]



  # position

  position = (

    ((pc_ratio.rolling(window=30, min_periods=1).mean() > 0)).shift(1).fillna(False)

  ) # 需做shift(1),因 Put/Call 未平倉量是盤後資料



  rets = benchmark.pct_change()

  rets.loc[~position] = 0

  s_equity = (rets + 1).cumprod()

  mdd = s_equity / s_equity.rolling(window=s_equity.shape[0], min_periods=1).max() - 1



  # benchmark

  rets_benchmark = benchmark.pct_change()

  s_benchmark = (rets_benchmark + 1).cumprod()

  mdd_benchmark = (

    s_benchmark

    / s_benchmark.rolling(window=s_benchmark.shape[0], min_periods=1).max()

    - 1

  )

  

  # plot

  fig, ax = plt.subplots(nrows=2, ncols=1, sharex=True, figsize=(10, 8))

  s_equity.plot(ax=ax[0], label="benchmark (hedge)")

  s_benchmark.plot(ax=ax[0], label="benchmark")

  ax[0].legend()



  mdd.plot(ax=ax[1], label="MDD - benchmark (hedge)")

  mdd_benchmark.plot(ax=ax[1], label="MDD - benchmark")

  ax[1].legend()

回測避險後的大盤指數,年化報酬率為8.5%(原始:8.2%),最大回撤為28.7%(原始:58.3%),雖然報酬率僅些微優於未避險的大盤指數,但最大回撤卻少了將近一半!這也是避險帶來最大的好處,讓你在持有大盤指數ETF時,能控制下檔風險。

backtest

相信讀者仍然沒有感受到Put/Call 未平倉比率帶來的效益,我們將持有的指數改成櫃買指數試試。年化報酬率8.8%(原始:5.6%),最大回撤37.4%(原始:76.4%),不僅年化報酬率有幅提升,最大回撤也減少不少。這也說明了,當市場趨於恐慌時,中小型股會遭受更嚴重的賣壓,因此避險的效果會更加明顯。

backtest

結論

  1. 選擇權未平倉量代表市場當時所存在的契約口數,當未平倉量越多,代表有越多人將資金押注在這個衍生性商品上,也代表影響越多資金的賺賠,所以有些投資人會將未平倉量當作市場的籌碼數據。
  2. Put/Call 未平倉比率數值越大通常看成偏多指標,因為Put未平倉量比Call未平倉量多,可以推斷賣Put多,更不容易跌破支撐;如果Put/Call 未平倉比率越小則相反,代表賣CALL較多,看上漲遇壓不容易突破。
  3. 觀察過去一些股市大幅回落的時期,Put/Call 未平倉比率(MA30)的數值大部分皆是負值。
  4. 使用Put/Call 未平倉比率(MA30)作為避險工具,能夠大幅降低最大回撤,控制下檔風險。
  5. 櫃買指數的避險效果較加權指數為佳。

用程式自動下單

FinLab 提供永豐金 Python API,下單非常簡單,只要短短幾行,程式就會幫你計算現在應該有的部位,並且進行「買賣」只需要在適當的時間(例如開盤、收盤)執行,程式就會自動下單買進賣出,將你的帳戶部位調整成獲利的形狀!再也不用自己計算每檔股票要買幾張了!非常的方便喔!

sep

import os

from finlab.online.sinopac_account import SinopacAccount

from finlab.online.order_executor import OrderExecutor, Position

# 設定帳號金鑰

os.environ[‘SHIOAJI_API_KEY’] = ‘永豐證券API_KEY’

os.environ[‘SHIOAJI_SECRET_KEY’] = ‘永豐證券SECRET_KEY’

os.environ[‘SHIOAJI_CERT_PERSON_ID’]= ‘身份證字號’

os.environ[‘SHIOAJI_CERT_PATH’]= ‘永豐證券憑證路徑’

os.environ[‘SHIOAJI_CERT_PASSWORD’] = ‘永豐證券憑證密碼’ # 預設與身份證字號

# 以 100 萬台幣計算當前帳戶應該有的股票

fund = 1000000

target_position = Position.from_report(report, fund)

# 進行下單

acc = SinopacAccount()

order_executor = OrderExecutor(target_position, acc)

order_executor.create_orders()

sep

程式預設使用當前價格進行「限價單」但你也可以透過客製化的方式,調整成「漲跌停」、「零股」、「融資券」,非常的簡單方便,讓你在股市中複製好策略的績效!

FinLab - 韓承佑

嗨大家好,我是韓承佑,FinLab創辦人,畢業於巴黎薩克雷大學資工博士,目前擔任臺灣量化交易協會 學術顧問、台北商業大學 創新育成中心 創業技術顧問與上市科技公司 量化交易顧問。當初,我喜歡寫程式、無意間因為軟體比賽接觸Fintech,從此開始了財經跟程式的學習之路。我們成立 FinLab 量化投資部落格,用自己研發的軟體,對台灣股市做大量快速的實驗。希望可以在量化投資的路上,當大家的「武器製造商」!