第三章:期权定价模型——给期权估值的四把手术刀
做量化交易这些年,我越来越觉得期权定价就像给一个会变形的怪物量尺寸。你永远不知道它下一秒会变成什么形状,但你必须给出一个价格。今天咱们就来聊聊这四把常用的手术刀:Black-Scholes、二叉树、蒙特卡洛,还有隐含波动率曲面。
核心观点:没有完美的定价模型,只有最适合当前场景的工具。我个人的习惯是——简单问题用BS,路径依赖用二叉树,复杂奇异期权上蒙特卡洛,而隐含波动率曲面,那是用来发现市场定价错误的。
3.1 Black-Scholes模型:经典但别迷信
Black-Scholes公式,说白了就是一个偏微分方程的解。它假设股价服从几何布朗运动,波动率恒定,无交易成本,可以连续对冲。嗯,这些假设在真实市场里一个都不成立。
但为什么我们还在用?因为它快,而且有解析解。我在做高频套利时,BS公式的运算速度是其他模型的几十倍。你想想看,当你在微秒级别竞争时,这点优势就是生死线。
# Python实现BS看涨期权定价
import numpy as np
from scipy.stats import norm
def bs_call(S, K, T, r, sigma):
d1 = (np.log(S/K) + (r + 0.5*sigma**2)*T) / (sigma*np.sqrt(T))
d2 = d1 - sigma*np.sqrt(T)
return S*norm.cdf(d1) - K*np.exp(-r*T)*norm.cdf(d2)
# 举个例子:S=100, K=105, T=30天, r=5%, sigma=20%
price = bs_call(100, 105, 30/365, 0.05, 0.20)
print(f"看涨期权价格: {price:.4f}")
⚠️ 避坑指南:我曾经在实盘交易中直接用BS公式定价深度虚值期权,结果发现市场价格比理论值高了30%。后来才意识到,BS模型对尾部风险的定价严重不足。记住,BS只适用于平值附近的欧式期权。
3.2 二叉树模型:美式期权的救星
为什么需要二叉树?因为美式期权可以提前行权,BS公式搞不定这个。二叉树的思路很简单:把时间切成小段,每段股价要么涨要么跌,然后从后往前倒推期权价值。
我个人习惯用Cox-Ross-Rubinstein的二叉树,参数设置比较直观。步数越多越精确,但计算量也越大。一般100步就够用了,再往上边际收益递减。
def binomial_tree(S, K, T, r, sigma, n=100, is_call=True):
dt = T/n
u = np.exp(sigma*np.sqrt(dt))
d = 1/u
p = (np.exp(r*dt) - d)/(u - d)
# 构建价格树
prices = np.zeros((n+1, n+1))
for i in range(n+1):
for j in range(i+1):
prices[j, i] = S * (u**(i-j)) * (d**j)
# 计算期权价值
values = np.zeros((n+1, n+1))
for j in range(n+1):
if is_call:
values[j, n] = max(0, prices[j, n] - K)
else:
values[j, n] = max(0, K - prices[j, n])
# 倒推
for i in range(n-1, -1, -1):
for j in range(i+1):
values[j, i] = np.exp(-r*dt) * (p*values[j, i+1] + (1-p)*values[j+1, i+1])
# 美式期权提前行权检查
if not is_call:
values[j, i] = max(values[j, i], K - prices[j, i])
return values[0, 0]
💡 实战技巧:我在做可转债定价时,二叉树模型特别好用。因为可转债有转股权、回售权、赎回权,这些路径依赖的特性二叉树都能处理。你只需要在每一步都检查是否触发这些条款就行。
3.3 蒙特卡洛模拟:复杂期权的终极武器
当期权涉及到多个标的资产、路径依赖、或者奇异条款时,二叉树就力不从心了。这时候蒙特卡洛模拟上场。说白了就是:模拟一万次股价路径,算每条路径的收益,然后取平均。
但有个坑——美式期权用蒙特卡洛很难处理,因为你需要知道每个时间点是否提前行权。我一般用最小二乘蒙特卡洛(LSM)来解决这个问题。
def monte_carlo_option(S, K, T, r, sigma, n_sims=100000):
np.random.seed(42)
z = np.random.standard_normal(n_sims)
ST = S * np.exp((r - 0.5*sigma**2)*T + sigma*np.sqrt(T)*z)
payoff = np.maximum(ST - K, 0)
return np.exp(-r*T) * np.mean(payoff)
# 亚式期权(路径依赖)
def asian_option(S, K, T, r, sigma, n_steps=252, n_sims=50000):
dt = T/n_steps
paths = np.zeros((n_sims, n_steps+1))
paths[:, 0] = S
for t in range(1, n_steps+1):
z = np.random.standard_normal(n_sims)
paths[:, t] = paths[:, t-1] * np.exp((r-0.5*sigma**2)*dt + sigma*np.sqrt(dt)*z)
avg_price = np.mean(paths[:, 1:], axis=1)
payoff = np.maximum(avg_price - K, 0)
return np.exp(-r*T) * np.mean(payoff)
⚠️ 我曾经踩过的坑:蒙特卡洛的收敛速度是O(1/√N),想提高精度10倍,模拟次数要增加100倍。有一次我为了追求精度跑了1000万次模拟,结果服务器跑了3个小时。后来改用对偶变量法和控制变量法,同样的精度只需要1/10的计算量。
3.4 隐含波动率曲面:市场的真实声音
隐含波动率是什么?就是把市场价格代入BS公式,反推出来的波动率。它反映了市场对未来波动的一致预期。
你想想看,如果BS模型是对的,那么不同行权价、不同到期日的期权应该算出相同的隐含波动率。但现实是——波动率微笑和波动率期限结构普遍存在。这就是市场的定价偏差,也是套利机会的来源。
| 行权价 | 1个月 | 3个月 | 6个月 | 1年 |
|---|---|---|---|---|
| 90 | 28.5% | 26.2% | 24.8% | 23.1% |
| 100 | 22.3% | 21.5% | 20.9% | 20.2% |
| 110 | 25.1% | 23.8% | 22.6% | 21.5% |
| 120 | 30.2% | 27.5% | 25.3% | 23.8% |
上面这张表就是典型的波动率微笑。平值期权(100)的波动率最低,两边的虚值和实值期权波动率更高。为什么会这样?因为市场认为极端行情发生的概率比BS模型假设的要高。
核心应用:我在做波动率套利时,会先构建隐含波动率曲面,然后找出曲面上异常凸起的点。如果某个期权的隐含波动率明显高于周围点,我就卖出它并用其他期权对冲,赚取波动率回归的钱。
知识体系总览
下面这张图是我自己整理的期权定价模型选择逻辑,你可以把它当作决策地图来用。
💡 我的建议:刚开始学的时候,别急着搞复杂的模型。先把BS公式吃透,理解每个参数的含义。然后慢慢加二叉树,再上蒙特卡洛。至于隐含波动率曲面,那是你真正开始赚钱的地方——市场定价错误就是你的利润来源。
记住,模型只是工具,市场才是老师。我见过太多人沉迷于模型的数学美感,却忽略了市场的真实行为。嗯,希望这四把手术刀能帮你切开期权的定价迷雾。