C++:实现量化Heston和HullWhite模型混合测试实例(附带源码)

C++ 实现量化 Heston 和 Hull-White 模型混合测试实例

项目简介

Heston 模型和 Hull-White 模型是金融领域两种重要的随机过程模型,用于模拟资产价格和利率的动态行为。在衍生品定价和风险管理中,Heston 模型通常用于描述波动率的随机性,而 Hull-White 模型用于模拟利率的变化。两者的混合模型可以同时考虑波动率和利率的不确定性,适合更复杂的定价场景,例如利率挂钩的股票期权或混合资产的衍生品。

本项目目标是用 C++ 实现 Heston 和 Hull-White 模型的混合测试实例,包括模型的基本理论推导、数值模拟实现,以及针对期权定价的测试。


实现思路
  1. 模型概述

    • Heston 模型: 模拟资产价格 S_tS 和波动率 v_t 的随机过程:

      其中:

      • r:无风险利率;
      • κ:均值回复速率;
      • θ:长期均值;
      • σ_v​:波动率的波动性;
      • W_t^S​ 和 W_t^v​:两组相关的维纳过程。
    • Hull-White 模型: 模拟短期利率 r_t​ 的动态变化:

      其中:

      • a:均值回复速率;
      • b:长期均值;
      • σ_r:利率波动性;
      • W_t^r​:维纳过程。
  2. 模型混合

    • 将 Heston 模型的无风险利率 r 替换为 Hull-White 模型模拟的短期利率 r_t。
    • 两组维纳过程之间引入相关性 ρ,即:
  3. 功能设计

    • 模型参数初始化:允许用户配置 Heston 和 Hull-White 的参数。
    • 蒙特卡洛模拟:使用随机数生成器模拟资产价格和利率路径。
    • 期权定价:通过模拟结果计算欧式看涨期权价格。
  4. 主要模块

    • 随机路径生成模块:基于 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;
}
代码解读
  1. 参数初始化

    • HestonParamsHullWhiteParams 分别存储两种模型的参数。
  2. 路径模拟

    • simulatePaths 使用 Euler 离散方法生成 Heston 和 Hull-White 模型的联合路径,考虑两者之间的相关性。
  3. 期权定价

    • priceEuropeanCall 基于蒙特卡洛模拟路径计算欧式看涨期权的价格。
  4. 结果输出

    • 打印期权价格,用户可以根据路径数量和时间步数调整精度。

项目总结
  1. 实现效果

    • 通过联合模拟 Heston 和 Hull-White 模型,成功实现了复杂场景下的路径生成和期权定价。
  2. 优点

    • 考虑波动率和利率的不确定性,更贴近市场真实动态。
    • 模块化设计,便于扩展到其他金融模型。
  3. 不足

    • 未实现解析解对比,验证结果的准确性需进一步改进。
    • 计算性能有限,大规模路径模拟需优化。
  4. 未来改进

    • 引入长时间步精确算法(如 Milstein 方法)。
    • 支持其他类型衍生品(如亚式期权、巴里尔期权)。

通过该项目,我们深入理解了 Heston 和 Hull-White 模型的数学原理和应用,为复杂金融产品定价提供了基础工具。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值