第三章 期权定价模型:从理论到实战
期权定价,说白了就是给「时间价值」和「不确定性」标个价。我刚开始做高频交易那会儿,总觉得定价模型是书本上的东西,直到有一次实盘因为模型选错亏了钱,才真正明白——选对模型,比算对数字更重要。
这一章,咱们聊聊三个最主流的定价模型:Black-Scholes、二叉树、蒙特卡洛模拟。我会结合自己的踩坑经验,告诉你什么时候该用哪个,什么时候千万别用哪个。
3.1 Black-Scholes模型:经典但有限
BS模型是期权定价的基石。1973年,Black和Scholes搞出了这个公式,直接拿了诺贝尔奖。公式长这样:
C = S₀·N(d₁) - K·e^(-rT)·N(d₂)
P = K·e^(-rT)·N(-d₂) - S₀·N(-d₁)
其中:
d₁ = [ln(S₀/K) + (r + σ²/2)T] / (σ√T)
d₂ = d₁ - σ√T
嗯,看着有点吓人。但实际用起来,核心就五个参数:标的价格S₀、行权价K、到期时间T、无风险利率r、波动率σ。
核心假设(也是坑点):
- 市场无摩擦(无交易成本、无税收)
- 标的资产价格服从对数正态分布
- 波动率恒定
- 无风险利率恒定
- 期权为欧式(只能到期行权)
我在项目中遇到过什么情况?有一次做ETF期权的高频策略,直接用BS算隐含波动率,结果发现盘中波动率曲线剧烈抖动。后来排查发现,BS假设波动率恒定,但高频数据里波动率每秒钟都在变。说白了,BS更适合日频、周频的定价,高频场景下你得小心。
避坑指南:我曾经用BS给深度实值期权定价,结果偏差很大。原因是BS假设标的收益率正态分布,但实际市场有肥尾效应。深度实值/虚值期权,BS的误差会放大。
3.2 二叉树模型:灵活但慢
二叉树模型,也叫Cox-Ross-Rubinstein模型。它的思路很简单:把时间切成很多小段,每段价格要么涨要么跌,像树枝分叉一样。
我习惯用二叉树来处理美式期权——因为BS搞不定提前行权的问题。二叉树的优势在于:
- 可以处理美式期权(提前行权)
- 可以加入股息、交易成本
- 直观易懂,适合教学
但缺点也很明显:
- 计算量大(步数越多越精确,但越慢)
- 对路径依赖型期权支持有限
举个代码例子,一个简单的二叉树定价:
def binomial_tree(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)
# 构建价格树
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_like(prices)
if option_type == 'call':
values[:, n] = np.maximum(prices[:, n] - K, 0)
else:
values[:, n] = np.maximum(K - prices[:, n], 0)
# 反向递推
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 option_type == 'call':
values[j, i] = max(values[j, i], prices[j, i] - K)
else:
values[j, i] = max(values[j, i], K - prices[j, i])
return values[0, 0]
你想想看,如果步数n=100,二叉树就有2^100种路径——当然实际计算时我们只存了n+1个节点,但计算量还是随着n线性增长。高频交易里,我一般只用n=50到100,再高就来不及了。
3.3 蒙特卡洛模拟:万能但贵
蒙特卡洛模拟,说白了就是「暴力枚举」。随机生成成千上万条价格路径,然后取平均值。这个方法特别适合处理复杂期权——比如亚式期权、障碍期权、回望期权。
我记得有一次做亚式期权的做市策略,BS和二叉树都搞不定路径依赖,最后只能用蒙特卡洛。代码大概长这样:
def monte_carlo_pricing(S, K, T, r, sigma, n_simulations=100000):
dt = 1/252 # 日频
n_steps = int(T / dt)
# 生成随机路径
Z = np.random.standard_normal((n_simulations, n_steps))
S_paths = S * np.exp(np.cumsum((r - 0.5 * sigma**2) * dt + sigma * np.sqrt(dt) * Z, axis=1))
# 亚式期权:取路径平均
avg_price = np.mean(S_paths, axis=1)
payoff = np.maximum(avg_price - K, 0)
# 折现
price = np.exp(-r * T) * np.mean(payoff)
return price
我的经验:蒙特卡洛的精度和模拟次数成正比。但次数每翻10倍,精度只提高√10倍。所以别盲目加次数,1万次够用就别跑100万次。高频场景下,我一般用5000到10000次,配合方差缩减技术(比如对偶变量法)来提升效率。
3.4 模型选择与局限性
三个模型各有各的脾气。我整理了一个对比表,方便你快速决策:
| 模型 | 适用场景 | 计算速度 | 精度 | 我的建议 |
|---|---|---|---|---|
| Black-Scholes | 欧式期权、流动性好的标的 | 极快(毫秒级) | 中等(肥尾时偏差大) | 适合做波动率曲面、快速定价 |
| 二叉树 | 美式期权、含股息 | 较快(秒级) | 较高(步数足够时) | 适合做美式期权定价 |
| 蒙特卡洛 | 路径依赖、奇异期权 | 慢(分钟级) | 高(模拟次数足够时) | 适合复杂结构、回测验证 |
为什么会这样?因为每个模型都在「精确」和「效率」之间做取舍。BS牺牲了灵活性换速度,蒙特卡洛牺牲了速度换通用性,二叉树则是个折中方案。
我个人习惯的做法是:
- 做市商策略:用BS算隐含波动率,实时监控
- 美式期权套利:用二叉树,步数设100
- 奇异期权回测:用蒙特卡洛,配合GPU加速
重要提醒:所有模型都是对现实的简化。我曾经用蒙特卡洛回测一个障碍期权策略,结果实盘完全对不上。后来发现,模型假设波动率恒定,但实盘里波动率会突变。所以,模型输出的是「参考价」,不是「成交价」。永远要留安全边际。
最后,用一张图总结这三个模型的关系和适用边界:
嗯,模型这东西,用多了你就知道——没有完美的,只有合适的。BS快但不准,蒙特卡洛准但慢,二叉树是个不错的折中。关键是你得清楚自己的交易场景需要什么。
公众号:蓝海资料掘金营,微信deep3321