3. 雪球产品定价原理:蒙特卡洛模拟基础、路径依赖型产品定价、波动率曲面与定价
好,我们直接进入正题。雪球产品的定价,说白了就是回答一个问题:这个产品到底值多少钱? 或者说,券商卖给你一个雪球,他收的期权费合理吗?
我个人习惯把雪球定价拆成三个核心模块:路径模拟、路径依赖处理、波动率输入。这三个东西搞定了,定价模型基本就立住了。
3.1 蒙特卡洛模拟基础
蒙特卡洛模拟,名字听着高大上,其实就是“扔骰子”。你想想看,我们不知道未来股价怎么走,那就假设它服从某个随机过程,然后生成成千上万条可能的路径,最后取个平均值。
对于雪球产品,我们通常假设标的价格服从几何布朗运动(GBM):
dS = μS dt + σS dW
其中,μ 是漂移率(通常用无风险利率),σ 是波动率,dW 是标准布朗运动。
离散化之后,我们可以在代码里这样模拟一条路径:
import numpy as np
def simulate_path(S0, r, sigma, T, N):
dt = T / N
S = np.zeros(N+1)
S[0] = S0
for i in range(N):
z = np.random.standard_normal()
S[i+1] = S[i] * np.exp((r - 0.5*sigma**2)*dt + sigma*np.sqrt(dt)*z)
return S
嗯,这里要注意:随机数种子。我在项目中遇到过,不同交易员用不同种子,结果定价差了好几个基点。后来我们统一了随机数生成器,并且用对偶变量法减少方差。
3.2 路径依赖型产品定价
雪球产品是典型的路径依赖型产品。什么意思?它的收益不光看终点价格,还看一路上发生了什么。
具体来说,雪球有两个关键观察点:
- 敲出观察日:通常是每月一次。如果标的价格高于敲出价,产品提前结束,你拿回本金+票息。
- 敲入观察日:通常是每日观察。如果标的价格低于敲入价,你就得承担亏损。
定价时,我们需要在每条模拟路径上实时跟踪这两个条件。代码逻辑大概是这样的:
def price_snowball(S0, K, H, B, r, sigma, T, N, num_paths):
dt = T / N
knock_out_dates = np.arange(1, N+1, 21) # 假设每月21个交易日
total_pv = 0.0
for _ in range(num_paths):
S = S0
knocked_in = False
knocked_out = False
for i in range(1, N+1):
z = np.random.standard_normal()
S = S * np.exp((r - 0.5*sigma**2)*dt + sigma*np.sqrt(dt)*z)
# 敲入检查(每日)
if S < B:
knocked_in = True
# 敲出检查(每月)
if i in knock_out_dates and S >= H:
knocked_out = True
break
# 计算该路径的现值
if knocked_out:
pv = K * np.exp(-r * i * dt) # 本金+票息
elif knocked_in:
pv = min(S / S0, 1) * K * np.exp(-r * T) # 亏损
else:
pv = K * np.exp(-r * T) # 保本
total_pv += pv
return total_pv / num_paths
np.arange 生成日期,记得确认最后一个观察日是否包含到期日。差一天,定价可能差 0.5%。
3.3 波动率曲面与定价
波动率是雪球定价的灵魂。你想想看,如果波动率输入错了,再精密的蒙特卡洛模拟也是白搭。
实际市场中,波动率不是常数,而是随行就市的。我们需要从期权市场中提取波动率曲面:
| 期限 \ 行权价 | 80% | 90% | 100% | 110% | 120% |
|---|---|---|---|---|---|
| 1M | 25.3% | 22.1% | 20.0% | 22.5% | 26.8% |
| 3M | 24.8% | 21.5% | 19.5% | 22.0% | 26.2% |
| 6M | 24.0% | 21.0% | 19.0% | 21.5% | 25.5% |
| 1Y | 23.5% | 20.5% | 18.5% | 21.0% | 25.0% |
上面这个表,就是典型的波动率微笑。你会发现,虚值看涨和虚值看跌的波动率都比平值高。为什么会这样?因为市场在定价尾部风险。
在雪球定价中,我们需要从波动率曲面上插值出每个时间点、每个价格水平对应的波动率。我个人习惯用三次样条插值,因为它平滑且不会过度震荡。
最后,我画了一张图,把这三个模块的关系串起来:
说白了,雪球定价就是用蒙特卡洛模拟生成路径,在每条路径上判断敲出/敲入,然后用波动率曲面提供输入参数。这三步走完,价格就出来了。
我在实际项目中还发现一个细节:波动率曲面的时间维度。雪球产品期限通常是一年或两年,但敲出可能发生在任何一个月。这意味着你需要用到不同期限的波动率。如果只用平值波动率,定价会系统性偏低。
好了,这一章的内容就到这里。记住,定价模型只是工具,真正决定盈亏的,是你对波动率的理解和市场判断。