第26章 曲面在结构化产品中的应用:雪球产品、自动赎回产品的定价
结构化产品,听起来挺高大上的。说白了,就是把期权、债券这些东西打包成一个理财产品卖给你。我最早接触这类产品是在2018年,那时候雪球产品刚在国内火起来。当时我就在想,这玩意儿定价的核心,不就是波动率曲面嘛。
今天咱们就聊聊,波动率曲面在雪球产品和自动赎回产品(Auto-Callable)里到底怎么用。嗯,这部分内容实战性很强,建议你边看边想。
26.1 雪球产品的定价逻辑
雪球产品,本质上是一个向下敲入、向上敲出的奇异期权组合。你想想看,投资者买入雪球,相当于卖出了一个看跌期权,同时买入了一个看涨期权,还附带了一些障碍条款。
定价的核心难点在哪?在于敲入和敲出事件的发生概率。这两个概率,直接受波动率曲面的形状影响。
核心公式:雪球产品的价格 = 票息收益的现值 - 敲入损失的现值 + 敲出收益的现值
我习惯用蒙特卡洛模拟来做雪球定价。为什么?因为路径依赖太强了。敲入敲出都是路径依赖事件,解析解很难搞。
来看一段代码,这是我实际项目中用过的简化版:
import numpy as np
from scipy.interpolate import interp1d
def snowball_pricer(spot, strike, barrier_in, barrier_out,
T, r, div, vol_surface, n_sims=100000):
"""
雪球产品蒙特卡洛定价
vol_surface: 波动率曲面对象,提供不同期限和行权价的波动率
"""
dt = 1/252 # 日频
n_steps = int(T * 252)
# 从曲面获取不同期限的波动率
tenors = np.array([0.25, 0.5, 1.0, 2.0])
vols = np.array([vol_surface.get_vol(t, strike) for t in tenors])
vol_interp = interp1d(tenors, vols, kind='linear', fill_value='extrapolate')
knock_in_count = 0
knock_out_count = 0
total_pv = 0
for i in range(n_sims):
path = np.zeros(n_steps + 1)
path[0] = spot
knocked_in = False
knocked_out = False
for j in range(1, n_steps + 1):
t = j * dt
sigma = vol_interp(t)
z = np.random.normal()
path[j] = path[j-1] * np.exp((r - div - 0.5*sigma**2)*dt + sigma*np.sqrt(dt)*z)
# 检查敲出
if path[j] >= barrier_out and not knocked_in:
knocked_out = True
break
# 检查敲入
if path[j] <= barrier_in:
knocked_in = True
# 计算收益
if knocked_out:
total_pv += coupon * np.exp(-r * (j+1) * dt)
knock_out_count += 1
elif knocked_in:
# 敲入后承担损失
final_price = path[-1]
loss = max(0, strike - final_price) / strike
total_pv -= loss * np.exp(-r * T)
knock_in_count += 1
else:
total_pv += coupon * np.exp(-r * T)
price = total_pv / n_sims
knock_in_prob = knock_in_count / n_sims
knock_out_prob = knock_out_count / n_sims
return price, knock_in_prob, knock_out_prob
我的经验:模拟次数建议至少50万次。我曾经用10万次模拟,结果定价偏差了0.5%,被风控部门追着问了一下午。嗯,从那以后我再也不敢偷懒了。
26.2 波动率曲面对雪球定价的影响
波动率曲面怎么影响雪球价格?我总结了三个关键点:
- 短期波动率:影响敲出概率。短期波动率越高,标的资产越容易触及敲出线,雪球越早结束。
- 长期波动率:影响敲入概率。长期波动率越高,标的资产越容易在观察期内敲入。
- 偏斜(Skew):影响敲入后的损失程度。左偏越严重,深度虚值看跌期权越贵,敲入后的潜在损失越大。
说白了,波动率曲面的形状直接决定了雪球产品的定价是否合理。我记得有一次,某券商发行了一款雪球产品,定价时用了平坦的波动率曲面。结果实际市场波动率曲面是左偏的,导致产品定价偏低,发行方亏了不少。
避坑指南:千万不要用常数波动率给雪球定价。我曾经见过一个团队,用BS公式的隐含波动率直接套用,结果定价误差超过3%。雪球产品的路径依赖特性,要求我们必须使用完整的波动率曲面。
26.3 自动赎回产品的定价
自动赎回产品(Auto-Callable),跟雪球有点像,但机制更简单。它会在每个观察日检查是否触发赎回条件。如果触发,产品提前结束,投资者拿回本金和票息。
定价的核心,在于计算每个观察日的赎回概率。这个概率,同样依赖于波动率曲面。
我习惯用有限差分法来定价自动赎回产品。为什么?因为它的障碍条件相对简单,有限差分法比蒙特卡洛更快、更稳定。
def autocallable_pricer_fdm(spot, strike, barrier_call,
observation_dates, T, r, div, vol_surface):
"""
自动赎回产品有限差分定价
observation_dates: 观察日列表(年化)
"""
# 构建网格
n_s = 200 # 价格网格数
n_t = 500 # 时间网格数
s_max = spot * 3
s_min = spot * 0.1
ds = (s_max - s_min) / n_s
dt = T / n_t
s_grid = np.linspace(s_min, s_max, n_s + 1)
v_grid = np.zeros(n_s + 1)
# 到期收益
for i in range(n_s + 1):
if s_grid[i] >= strike:
v_grid[i] = 1.0 # 保本
else:
v_grid[i] = s_grid[i] / strike # 承担损失
# 逆向迭代
for j in range(n_t - 1, -1, -1):
t = j * dt
sigma = vol_surface.get_vol(t, strike)
# 构建三对角矩阵(Crank-Nicolson)
alpha = 0.25 * dt * (sigma**2 * (np.arange(n_s + 1)**2) -
(r - div) * np.arange(n_s + 1))
beta = -0.5 * dt * (sigma**2 * (np.arange(n_s + 1)**2) + r)
gamma = 0.25 * dt * (sigma**2 * (np.arange(n_s + 1)**2) +
(r - div) * np.arange(n_s + 1))
# 解线性方程组(简化版)
v_new = v_grid.copy()
for i in range(1, n_s):
v_new[i] = (alpha[i] * v_grid[i-1] +
(1 + beta[i]) * v_grid[i] +
gamma[i] * v_grid[i+1])
v_grid = v_new
# 检查观察日
if any(abs(t - obs_date) < dt/2 for obs_date in observation_dates):
for i in range(n_s + 1):
if s_grid[i] >= barrier_call:
v_grid[i] = 1.0 + coupon # 赎回
# 插值得到当前价格
price = np.interp(spot, s_grid, v_grid)
return price
我的建议:有限差分法虽然快,但要注意边界条件。我习惯在边界处使用线性外推,这样能避免数值震荡。另外,时间步长不要太大,dt最好小于0.01年。
26.4 曲面校准的实际问题
在实际项目中,曲面校准是最头疼的一步。为什么?因为结构化产品的条款太复杂了,不同期限、不同行权价的期权都需要校准。
我总结了一套校准流程:
- 数据清洗:剔除流动性差的期权报价,尤其是深度虚值和深度实值的。
- 插值方法选择:我习惯用SVI(Stochastic Volatility Inspired)模型,它在处理偏斜和期限结构上表现不错。
- 参数优化:用最小二乘法拟合市场报价,目标函数是RMSE最小化。
- 交叉验证:用未参与校准的期权验证曲面质量。
嗯,这里要注意一点。校准的时候,不要只盯着RMSE看。我见过有人把RMSE降到0.1%以下,结果曲面形状完全不合理,出现负的远期波动率。这种曲面拿去定价雪球,结果可想而知。
关键指标:一个好的波动率曲面,不仅要拟合精度高,还要满足无套利条件。具体来说,就是不能有日历套利和蝶式套利的机会。
26.5 实战中的避坑指南
最后,分享几个我在实战中踩过的坑:
- 坑一:忽略股息率。股息率对雪球定价影响很大,尤其是高股息股票。我见过有人用0股息率定价,结果偏差了1.5%。
- 坑二:使用过时的曲面。波动率曲面是时变的,今天校准的曲面明天可能就不适用了。我习惯每天重新校准一次。
- 坑三:忽视相关性。如果是多资产雪球,不同资产之间的相关性也要考虑。这个我后面会专门讲。
好了,这一章的内容就到这里。波动率曲面在结构化产品中的应用,说白了就是一句话:曲面的形状决定了产品的价格和风险。你想想看,如果曲面校准不准,再复杂的定价模型也是白搭。
下一章,我会聊聊曲面在风险管理中的应用,尤其是希腊字母的计算和对冲策略。到时候见。
公众号:蓝海资料掘金营,微信deep3321