C++ 实现量化 Heston 和 Hull-White 模型混合测试实例
项目简介
Heston 模型和 Hull-White 模型是金融领域两种重要的随机过程模型,用于模拟资产价格和利率的动态行为。在衍生品定价和风险管理中,Heston 模型通常用于描述波动率的随机性,而 Hull-White 模型用于模拟利率的变化。两者的混合模型可以同时考虑波动率和利率的不确定性,适合更复杂的定价场景,例如利率挂钩的股票期权或混合资产的衍生品。
本项目目标是用 C++ 实现 Heston 和 Hull-White 模型的混合测试实例,包括模型的基本理论推导、数值模拟实现,以及针对期权定价的测试。
实现思路
-
模型概述:
-
Heston 模型: 模拟资产价格 S_tS 和波动率 v_t 的随机过程:
其中:
- r:无风险利率;
- κ:均值回复速率;
- θ:长期均值;
- σ_v:波动率的波动性;
- W_t^S 和 W_t^v:两组相关的维纳过程。
-
Hull-White 模型: 模拟短期利率 r_t 的动态变化:
其中:
- a:均值回复速率;
- b:长期均值;
- σ_r:利率波动性;
- W_t^r:维纳过程。
-
-
模型混合:
- 将 Heston 模型的无风险利率 r 替换为 Hull-White 模型模拟的短期利率 r_t。
- 两组维纳过程之间引入相关性 ρ,即:
-
功能设计:
- 模型参数初始化:允许用户配置 Heston 和 Hull-White 的参数。
- 蒙特卡洛模拟:使用随机数生成器模拟资产价格和利率路径。
- 期权定价:通过模拟结果计算欧式看涨期权价格。
-
主要模块:
- 随机路径生成模块:基于 Heston 和 Hull-White 模型生成价格和利率路径。
- 期权定价模块:基于生成路径计算期权价格。
- 结果输出模块:展示模拟和定价结果。
实现代码
#include <iostream>
#include <vector>
#include <cmath>
#include <random>
#include <iomanip>
// 定义模型参数
struct HestonParams {
double kappa; // 均值回复速率
double theta; // 长期均值
double sigma_v; // 波动率的波动性
double rho; // 相关系数
double v0; // 初始波动率
};
struct HullWhiteParams {
double a; // 均值回复速率
double b; // 长期均值
double sigma_r; // 利率波动性
double r0; // 初始利率
};
// 随机数生成器初始化
std::random_device rd;
std::mt19937 generator(rd());
std::normal_distribution<double> distribution(0.0, 1.0);
// 蒙特卡洛路径生成
void simulatePaths(
const HestonParams& hestonParams,
const HullWhiteParams& hwParams,
double S0, double T, int steps, int numPaths,
std::vector<std::vector<double>>& stockPaths,
std::vector<std::vector<double>>& ratePaths
) {
double dt = T / steps;
stockPaths.resize(numPaths, std::vector<double>(steps + 1, S0));
ratePaths.resize(numPaths, std::vector<double>(steps + 1, hwParams.r0));
for (int i = 0; i < numPaths; ++i) {
double S = S0, v = hestonParams.v0, r = hwParams.r0;
for (int j = 1; j <= steps; ++j) {
// 生成相关的正态随机数
double dW1 = distribution(generator);
double dW2 = hestonParams.rho * dW1 + std::sqrt(1 - hestonParams.rho * hestonParams.rho) * distribution(generator);
// Heston 模型更新
v = std::max(0.0, v + hestonParams.kappa * (hestonParams.theta - v) * dt + hestonParams.sigma_v * std::sqrt(v) * dW1);
S = S * std::exp((r - 0.5 * v) * dt + std::sqrt(v * dt) * dW2);
// Hull-White 模型更新
r = r + hwParams.a * (hwParams.b - r) * dt + hwParams.sigma_r * std::sqrt(dt) * distribution(generator);
// 保存路径
stockPaths[i][j] = S;
ratePaths[i][j] = r;
}
}
}
// 欧式看涨期权定价
double priceEuropeanCall(
const std::vector<std::vector<double>>& stockPaths,
double K, double r, double T
) {
double payoffSum = 0.0;
int numPaths = stockPaths.size();
for (const auto& path : stockPaths) {
double ST = path.back(); // 终点价格
payoffSum += std::max(ST - K, 0.0);
}
return std::exp(-r * T) * payoffSum / numPaths;
}
// 主函数
int main() {
// 初始化模型参数
HestonParams hestonParams = {2.0, 0.02, 0.1, -0.7, 0.02}; // Heston 参数
HullWhiteParams hwParams = {0.1, 0.03, 0.01, 0.03}; // Hull-White 参数
double S0 = 100.0; // 初始股票价格
double K = 100.0; // 执行价格
double T = 1.0; // 到期时间(1年)
int steps = 100; // 时间步数
int numPaths = 10000; // 模拟路径数量
// 路径存储
std::vector<std::vector<double>> stockPaths, ratePaths;
// 模拟路径
simulatePaths(hestonParams, hwParams, S0, T, steps, numPaths, stockPaths, ratePaths);
// 使用平均利率计算折现因子
double avgRate = 0.0;
for (const auto& path : ratePaths) {
avgRate += path.back();
}
avgRate /= numPaths;
// 定价欧式看涨期权
double optionPrice = priceEuropeanCall(stockPaths, K, avgRate, T);
// 输出结果
std::cout << std::fixed << std::setprecision(4);
std::cout << "欧式看涨期权价格: " << optionPrice << std::endl;
return 0;
}
代码解读
-
参数初始化:
HestonParams
和HullWhiteParams
分别存储两种模型的参数。
-
路径模拟:
simulatePaths
使用 Euler 离散方法生成 Heston 和 Hull-White 模型的联合路径,考虑两者之间的相关性。
-
期权定价:
priceEuropeanCall
基于蒙特卡洛模拟路径计算欧式看涨期权的价格。
-
结果输出:
- 打印期权价格,用户可以根据路径数量和时间步数调整精度。
项目总结
-
实现效果:
- 通过联合模拟 Heston 和 Hull-White 模型,成功实现了复杂场景下的路径生成和期权定价。
-
优点:
- 考虑波动率和利率的不确定性,更贴近市场真实动态。
- 模块化设计,便于扩展到其他金融模型。
-
不足:
- 未实现解析解对比,验证结果的准确性需进一步改进。
- 计算性能有限,大规模路径模拟需优化。
-
未来改进:
- 引入长时间步精确算法(如 Milstein 方法)。
- 支持其他类型衍生品(如亚式期权、巴里尔期权)。
通过该项目,我们深入理解了 Heston 和 Hull-White 模型的数学原理和应用,为复杂金融产品定价提供了基础工具。