创作不易,您的关注、点赞、收藏和转发是我坚持下去的动力!
Heston 模型是一种用于期权定价的随机波动率模型,它是由 Steven Heston 在 1993 年提出的。Heston 模型与经典的 Black-Scholes 模型的主要不同点在于 Heston 模型假设资产的波动率本身也是随机的。具体来说,它通过引入一个随机过程来描述波动率的动态变化,从而更好地捕捉实际金融市场中波动率变化的特性(例如波动率聚集性和波动率微笑现象)。
Heston 模型的原理
Heston 模型假设基础资产价格 ( S(t) ) 和波动率 ( v(t) ) 分别满足以下两个随机微分方程(SDE):
-
资产价格的动态:
[
dS(t) = \mu S(t) dt + \sqrt{v(t)} S(t) dW_S(t)
]
其中:- ( S(t) ) 是资产价格。
- ( \mu ) 是资产的漂移率(通常等于无风险利率)。
- ( v(t) ) 是波动率平方的过程,即方差。
- ( W_S(t) ) 是资产价格的 Wiener 过程。
-
波动率的动态(方差过程):
[
dv(t) = \kappa (\theta - v(t)) dt + \sigma \sqrt{v(t)} dW_v(t)
]
其中:- ( v(t) ) 是资产波动率的平方(即方差)。
- ( \kappa ) 是均值回复速度,表示波动率回复到长期均值 ( \theta ) 的速率。
- ( \theta ) 是长期均值,表示波动率倾向于回归的值。
- ( \sigma ) 是波动率的波动率(也称为波动率的方差)。
- ( W_v(t) ) 是波动率的 Wiener 过程。
- ( dW_S(t) ) 和 ( dW_v(t) ) 之间的相关系数为 ( \rho )。
Python 代码实现 Heston 模型
为了模拟 Heston 模型的期权价格,我们需要使用数值方法来求解上述随机微分方程。最常用的数值方法之一是蒙特卡罗模拟。以下是一个实现 Heston 模型并模拟欧式期权价格的 Python 示例代码:
import numpy as np
import matplotlib.pyplot as plt
# Heston模型参数
S0 = 100 # 初始资产价格
v0 = 0.04 # 初始方差
r = 0.05 # 无风险利率
kappa = 2.0 # 均值回复速度
theta = 0.04 # 长期均值
sigma = 0.3 # 波动率的波动率
rho = -0.7 # 相关系数
T = 1.0 # 到期时间
K = 100 # 执行价格
num_paths = 10000 # 模拟路径数
num_steps = 1000 # 时间步数
# 计算每个时间步的时间长度
dt = T / num_steps
# 生成两个相关的Wiener过程
def generate_correlated_wiener_processes(num_steps, num_paths, dt, rho):
dW1 = np.random.normal(0, np.sqrt(dt), (num_steps, num_paths))
dW2 = np.random.normal(0, np.sqrt(dt), (num_steps, num_paths))
dW2 = rho * dW1 + np.sqrt(1 - rho ** 2) * dW2 # 调整相关性
return dW1, dW2
# Heston模型的蒙特卡罗模拟
def heston_simulation(S0, v0, r, kappa, theta, sigma, rho, T, K, num_paths, num_steps):
dt = T / num_steps
S = np.zeros((num_steps + 1, num_paths))
v = np.zeros((num_steps + 1, num_paths))
S[0] = S0
v[0] = v0
dW1, dW2 = generate_correlated_wiener_processes(num_steps, num_paths, dt, rho)
for t in range(1, num_steps + 1):
v[t] = v[t - 1] + kappa * (theta - v[t - 1]) * dt + sigma * np.sqrt(v[t - 1]) * dW2[t - 1]
v[t] = np.maximum(v[t], 0) # 确保方差非负
S[t] = S[t - 1] * np.exp((r - 0.5 * v[t - 1]) * dt + np.sqrt(v[t - 1]) * dW1[t - 1])
# 计算期权价格
payoff = np.maximum(S[-1] - K, 0)
option_price = np.exp(-r * T) * np.mean(payoff)
return option_price, S, v
# 运行模拟
option_price, S, v = heston_simulation(S0, v0, r, kappa, theta, sigma, rho, T, K, num_paths, num_steps)
print(f"Heston模型模拟得到的欧式期权价格为: {option_price:.4f}")
# 绘制价格和波动率的路径
plt.figure(figsize=(10, 6))
plt.plot(S[:, :10], label="价格路径", lw=1.5)
plt.title('Heston模型中的价格路径模拟')
plt.xlabel('时间步数')
plt.ylabel('资产价格')
plt.show()
plt.figure(figsize=(10, 6))
plt.plot(v[:, :10], label="波动率路径", lw=1.5)
plt.title('Heston模型中的波动率路径模拟')
plt.xlabel('时间步数')
plt.ylabel('方差')
plt.show()
代码说明
- 参数初始化:设定资产的初始价格、初始波动率、无风险利率、均值回复速度、长期均值、波动率的波动率和时间步数等参数。
- 生成Wiener过程:通过
generate_correlated_wiener_processes
函数生成两个相关的 Wiener 过程 ( dW_S(t) ) 和 ( dW_v(t) )。 - Heston 模型模拟:在
heston_simulation
函数中使用蒙特卡罗方法模拟资产价格和波动率的演变。每个时间步更新资产价格 ( S(t) ) 和波动率 ( v(t) ),最后计算期权的价格。 - 结果展示:输出模拟得到的欧式期权价格,并绘制资产价格和波动率的路径图。
你可以根据不同的参数修改代码,以适应不同的模拟需求。