Heston模型:随机波动率下的期权定价与蒙特卡罗模拟实现

创作不易,您的关注、点赞、收藏和转发是我坚持下去的动力!

Heston 模型

Heston 模型是一种用于期权定价的随机波动率模型,它是由 Steven Heston 在 1993 年提出的。Heston 模型与经典的 Black-Scholes 模型的主要不同点在于 Heston 模型假设资产的波动率本身也是随机的。具体来说,它通过引入一个随机过程来描述波动率的动态变化,从而更好地捕捉实际金融市场中波动率变化的特性(例如波动率聚集性和波动率微笑现象)。

Heston 模型的原理

Heston 模型假设基础资产价格 ( S(t) ) 和波动率 ( v(t) ) 分别满足以下两个随机微分方程(SDE):

  1. 资产价格的动态:
    [
    dS(t) = \mu S(t) dt + \sqrt{v(t)} S(t) dW_S(t)
    ]
    其中:

    • ( S(t) ) 是资产价格。
    • ( \mu ) 是资产的漂移率(通常等于无风险利率)。
    • ( v(t) ) 是波动率平方的过程,即方差。
    • ( W_S(t) ) 是资产价格的 Wiener 过程。
  2. 波动率的动态(方差过程):
    [
    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()

代码说明

  1. 参数初始化:设定资产的初始价格、初始波动率、无风险利率、均值回复速度、长期均值、波动率的波动率和时间步数等参数。
  2. 生成Wiener过程:通过 generate_correlated_wiener_processes 函数生成两个相关的 Wiener 过程 ( dW_S(t) ) 和 ( dW_v(t) )。
  3. Heston 模型模拟:在 heston_simulation 函数中使用蒙特卡罗方法模拟资产价格和波动率的演变。每个时间步更新资产价格 ( S(t) ) 和波动率 ( v(t) ),最后计算期权的价格。
  4. 结果展示:输出模拟得到的欧式期权价格,并绘制资产价格和波动率的路径图。

你可以根据不同的参数修改代码,以适应不同的模拟需求。

大家有技术交流指导、论文及技术文档写作指导、项目开发合作的需求可以搜索关注我的微信号(QianyanKejiTech),私信联系我的微信公众号(智能科技前沿)。智能科技前沿

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智能科技前沿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值