截止至2024-05-31,加權指數收21,174點,下跌190點(-0.89%)。在股市征戰的各位肯定也覺得最近股市漲幅頗大,年初至今已漲超3200點(+18%),市場一有風吹草動,就會遭遇強勁的獲利了結賣壓。此時我們應居高思危,尋找空頭避險的指標,避開潛在下跌風險。本文我們將帶領讀者了解【選擇權未平倉量】,以及如何使用這個指標來做避險。
選擇權未平倉量
在選擇權市場中,所謂的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 未平倉比率創下新高或新低時,代表市場出現極端悲觀或樂觀的狀況,後續容易發生轉折。
避險指標
由於 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")
災難情境
我們觀察過去一些股市大幅回落的時期,2008年金融海嘯、2012年Fed縮減購債恐慌、2015年中國股災、2018年中美貿易戰爭、2020年新冠疫情、2022-23年Fed快速升息,可以看到股市大幅回落的時期,Put/Call 未平倉比率(MA30)的數值大部分皆是負值。
相信讀者一定也有發現,上述6個災難時期有一個特別例外,Put/Call 未平倉比率(MA30)的數值非常的高,從指標完全看不出股是曾經經歷30-40%的下跌。筆者至今仍沒有好的解釋,期待能收到經歷這段時期的讀者們解答。
回測
回測期間: 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時,能控制下檔風險。
相信讀者仍然沒有感受到Put/Call 未平倉比率帶來的效益,我們將持有的指數改成櫃買指數試試。年化報酬率8.8%(原始:5.6%),最大回撤37.4%(原始:76.4%),不僅年化報酬率有幅提升,最大回撤也減少不少。這也說明了,當市場趨於恐慌時,中小型股會遭受更嚴重的賣壓,因此避險的效果會更加明顯。
結論
- 選擇權未平倉量代表市場當時所存在的契約口數,當未平倉量越多,代表有越多人將資金押注在這個衍生性商品上,也代表影響越多資金的賺賠,所以有些投資人會將未平倉量當作市場的籌碼數據。
- Put/Call 未平倉比率數值越大通常看成偏多指標,因為Put未平倉量比Call未平倉量多,可以推斷賣Put多,更不容易跌破支撐;如果Put/Call 未平倉比率越小則相反,代表賣CALL較多,看上漲遇壓不容易突破。
- 觀察過去一些股市大幅回落的時期,Put/Call 未平倉比率(MA30)的數值大部分皆是負值。
- 使用Put/Call 未平倉比率(MA30)作為避險工具,能夠大幅降低最大回撤,控制下檔風險。
- 櫃買指數的避險效果較加權指數為佳。
用程式自動下單
FinLab 提供永豐金 Python API,下單非常簡單,只要短短幾行,程式就會幫你計算現在應該有的部位,並且進行「買賣」只需要在適當的時間(例如開盤、收盤)執行,程式就會自動下單買進賣出,將你的帳戶部位調整成獲利的形狀!再也不用自己計算每檔股票要買幾張了!非常的方便喔!
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()
程式預設使用當前價格進行「限價單」但你也可以透過客製化的方式,調整成「漲跌停」、「零股」、「融資券」,非常的簡單方便,讓你在股市中複製好策略的績效!