最近一直再看金融投资相关的东西,刚好也学习了期权的一些知识,顺道了解了一下怎么用期权对冲股票市场带来的风险。

什么是期权

定义直接抄了

期权(Option)是一种金融衍生品,它赋予持有人在约定的时间或时间范围内,以预定的价格(称为执行价格或行权价)买入或卖出标的资产的权利,但并不负有必须执行的义务。期权的主要特点包括:

  1. 期权类型
    • 看涨期权(Call Option):持有人有权以约定价格买入标的资产。
    • 看跌期权(Put Option):持有人有权以约定价格卖出标的资产。
  2. 期权的参与者
    • 买方:支付期权费(Premium),获取执行权利。
    • 卖方:收取期权费,承担履行买方权利的义务。
  3. 标的资产:期权的标的资产可以是股票、指数、商品、货币等。
  4. 到期日:期权合约规定的有效期限。到期后,期权将失效。
  5. 执行方式
    • 欧式期权:仅能在到期日行权。
    • 美式期权:可以在到期日及之前任何时间行权。

用途

  • 风险管理:投资者利用期权对冲市场风险。
  • 投机获利:通过预测标的资产价格的波动方向获取收益。
  • 增强收益:通过出售期权赚取期权费。

保护性看跌期权(Protective Put)

投资者通过购买标的资产(如股票)和同时买入对应的看跌期权,来降低资产价格下跌可能带来的损失。保留上涨潜力的同时限制潜在的下行风险。

直接举个例子:
我现在持有100股台积电股票(TSM),当前价格为 $211.5。我担心价格下跌,因此购买了一张执行价格为 $210每股的看跌期权,每张能保护100股,期权费为每股$2.76,也就是总期权费为$100 \times $ 2.76 = $276$。以下是可能的情形:

  • 价格上涨至 $230
    我持有的股票增值,赚取 $100 * ($230 - $ 211.5) = $1850$,但需要支付 $276 的期权费,净收益为 $1574。
  • 价格下跌至 $190
    我可以以 $210 行使看跌期权,损失被限制为 $100 *($211.5 - $210)= $150$,再加上 $276 的期权费,总亏损为 $426。
  • 价格维持在 $211.5
    我的股票未亏损,但需要支付 $276 的期权费,总收益为 -$276。

可以注意到,尽管这个策略可能会减少我的最大收益,但如果我没有保护措施,我将直接损失 $100 *($211.5 - $190)= $2150$,保护性期权将大大减少我的损失。

用Yahoo Finance获取信息以及期权链,代码如下:

import yfinance as yf

# 获取台积电股票数据

tsmc = yf.Ticker("TSM")
stock_data = tsmc.history(period="1d")
current_price = stock_data['Close'].iloc[-1]  # 当前收盘价
print(f"台积电当前股价: ${current_price:.2f}")

## output: 台积电当前股价: $211.50
# 获取台积电期权链
options_dates = tsmc.options
opt_chain = tsmc.option_chain(options_dates[0])  # 选择第一个到期日的期权链
puts = opt_chain.puts

# 筛选合适的看跌期权
puts_filtered = puts[(puts['strike'] <= current_price) & (puts['strike'] >= current_price * 0.9)]
puts_filtered = puts_filtered.sort_values('strike')
print(puts_filtered[['contractSymbol', 'strike', 'lastPrice', 'bid', 'ask', 'volume', 'openInterest']])

## output: 
        contractSymbol  strike  lastPrice   bid   ask  volume  openInterest
21  TSM250124P00192500   192.5       0.25  0.16  0.26   232.0         652.0
22  TSM250124P00195000   195.0       0.30  0.30  0.32  1186.0        4802.0
23  TSM250124P00197500   197.5       0.41  0.38  0.41   498.0         269.0
24  TSM250124P00200000   200.0       0.54  0.53  0.57  1891.0        5360.0
25  TSM250124P00202500   202.5       0.81  0.77  0.82  1379.0         613.0
26  TSM250124P00205000   205.0       1.20  1.17  1.23  2805.0        1787.0
27  TSM250124P00207500   207.5       1.86  1.78  1.86  2030.0         565.0
28  TSM250124P00210000   210.0       2.71  2.66  2.76  5930.0        1793.0
import numpy as np
import matplotlib.pyplot as plt

from matplotlib import rcParams
rcParams['font.sans-serif'] = ['SimHei']  # 黑体
rcParams['axes.unicode_minus'] = False  # 用于正常显示负号


current_price = current_price  # 当前股价
strike_price = puts_filtered.iloc[-1]['strike']  # 行权价
option_premium = puts_filtered.iloc[-1]['ask']  # 每股期权费
stock_prices = np.linspace(190, 230, 100)  # 模拟股价范围
shares = 100  # 股票数量

# 盈亏计算
stock_profit = (stock_prices - current_price) * shares
put_profit = np.maximum(strike_price - stock_prices, 0) * shares - option_premium * shares
total_profit = stock_profit + put_profit

# 绘制盈亏图
plt.figure(figsize=(10, 6))
plt.plot(stock_prices, stock_profit, label="股票盈亏", linestyle="--")
plt.plot(stock_prices, put_profit, label="看跌期权盈亏", linestyle="--")
plt.plot(stock_prices, total_profit, label="组合总盈亏", linewidth=2, color="black")
plt.axhline(0, color="red", linestyle="--", linewidth=1)
plt.title("保护性看跌期权(台积电)盈亏图")
plt.xlabel("股价 ($)")
plt.ylabel("盈亏 ($)")
plt.legend()
plt.grid()
plt.show()

收益略有下降,但规避极大损失

附录:美式期权定价模型

介于最近在研究美股,所以暂时只附上美式期权定价模型。

了解定价模型能帮助我们知道一个期权的“理论价值”是否合理。

二叉树模型(Binomial Tree Model)

1. 二叉树模型的核心思想

  1. 将标的资产的价格运动分解为一个离散时间的模型。
  2. 每个时间步标的资产的价格只有两种可能性:上涨(u)下跌(d)
  3. 通过构建资产价格的树状结构,并从期权到期日倒推回当前时间,计算期权的价值。

2. 二叉树模型的关键参数

输入参数
  • $S_0$: 当前标的资产价格。
  • $K$: 行权价格。
  • $T$: 期权到期时间(年)。
  • $r$: 无风险利率(年化)。
  • $\sigma$: 波动率(年化)。
  • $N$: 二叉树的步数(时间被离散成 $N$ 个小步)。
计算出的参数
  1. 时间步长 ($\Delta t$): $\Delta t = \frac{T}{N}$
  2. 价格的上涨因子 ($u$) 和下跌因子 ($d$): $u = e^{\sigma \sqrt{\Delta t}}, \quad d = \frac{1}{u}$ (上涨和下跌因子对称,符合对数正态分布的假设)。
  3. 风险中性概率 ($p$): $p = \frac{e^{r \Delta t} - d}{u - d}$ (表示在风险中性世界中,资产价格上涨的概率)。

3. 二叉树模型的步骤

Step 1: 构建资产价格树
  1. 从当前价格 $S_0$ 开始。
  2. 每个时间步:
    • 上涨价格:$S_u = S_0 \cdot u$
    • 下跌价格:$S_d = S_0 \cdot d$

价格树最终形成一个树状结构。


Step 2: 计算期权的终点价值
  1. 在期权到期时,根据标的资产价格和行权价,计算期权的价值:
    • 看涨期权(Call):$V = \max(S - K, 0)$
    • 看跌期权(Put):$V = \max(K - S, 0)$

Step 3: 递归倒推期权价值
  1. 从到期日开始,逐步向前倒推。

  2. 每个节点的期权价值是以下两者的较大值:

    • 持有期权的价值: $V_{\text{hold}} = e^{-r \Delta t} \cdot \left(p \cdot V_{\text{up}} + (1 - p) \cdot V_{\text{down}}\right)$

    • 提前行权的价值

      • 看涨期权:$V_{\text{exercise}} = \max(S - K, 0)$
      • 看跌期权:$V_{\text{exercise}} = \max(K - S, 0)$
  3. 如果是美式期权,则取两者的较大值: $V = \max(V_{\text{hold}}, V_{\text{exercise}})$


4. 二叉树模型的优点和缺点

优点
  1. 适合美式期权:可以随时考虑提前行权的情况。
  2. 灵活性:可适应不同的资产或期权类型(如看涨、看跌、障碍期权等)。
  3. 简单直观:通过逐步倒推,容易理解计算过程。
缺点
  1. 计算量大:随着步数增加,计算复杂度迅速上升$(O(N^2))$。
  2. 精度受步数限制:步数太少会导致结果不精确,步数太多计算耗时长。

5. 示例代码

import numpy as np

def binomial_tree_american(S, K, T, r, sigma, N, option_type="call"):
    dt = T / N  # 每一步的时间间隔
    u = np.exp(sigma * np.sqrt(dt))  # 上涨因子
    d = 1 / u  # 下跌因子
    p = (np.exp(r * dt) - d) / (u - d)  # 风险中性概率
    discount = np.exp(-r * dt)  # 折现因子

    # 构建价格树
    asset_prices = np.zeros((N + 1, N + 1))
    for i in range(N + 1):
        for j in range(i + 1):
            asset_prices[j, i] = S * (u ** (i - j)) * (d ** j)

    # 计算期权价值
    option_values = np.zeros((N + 1, N + 1))
    for j in range(N + 1):
        if option_type == "call":
            option_values[j, N] = max(0, asset_prices[j, N] - K)
        elif option_type == "put":
            option_values[j, N] = max(0, K - asset_prices[j, N])

    # 递归倒推
    for i in range(N - 1, -1, -1):
        for j in range(i + 1):
            hold_value = discount * (p * option_values[j, i + 1] + (1 - p) * option_values[j + 1, i + 1])
            exercise_value = 0
            if option_type == "call":
                exercise_value = max(0, asset_prices[j, i] - K)
            elif option_type == "put":
                exercise_value = max(0, K - asset_prices[j, i])
            option_values[j, i] = max(hold_value, exercise_value)

    return option_values[0, 0]

# 示例参数
S = 211.5  # 当前标的资产价格
K = 210  # 行权价
T = 1   # 到期时间(年)
r = 0.05  # 无风险利率
sigma = 0.3  # 波动率
N = 100  # 二叉树步数

# 计算美式看涨期权和看跌期权价格
call_price = binomial_tree_american(S, K, T, r, sigma, N, option_type="call")
put_price = binomial_tree_american(S, K, T, r, sigma, N, option_type="put")

print("美式看涨期权价格:", call_price)
print("美式看跌期权价格:", put_price)

## output:
美式看涨期权价格: 30.816545596666153
美式看跌期权价格: 20.12084028958185