C++:实现量化使用OIS折扣设置期限结构,然后定价一个简单的5年互换测试实例(附带源码)

项目背景与目标

在量化金融中,**OIS(Overnight Indexed Swap)**是一种基于隔夜利率的利率互换。通常,它用于计算固定和浮动利率之间的差异,其中浮动利率基于隔夜利率。这类利率互换在利率衍生品市场中广泛使用,尤其在构建短期利率曲线和折扣曲线方面。

**OIS折扣设置(OIS Discounting)**是将OIS利率用作市场折现曲线的一个重要应用。通过OIS折扣,我们可以确定未来现金流的现值,这对于定价包括利率互换在内的衍生品至关重要。

本项目的目标是:

  1. 构建OIS折扣曲线:基于OIS利率,创建期限结构。
  2. 定价一个5年期的利率互换:使用OIS折扣曲线定价一个固定和浮动利率互换。
  3. 测试实例:展示如何使用OIS折扣曲线来定价一个简单的5年期互换。

OIS折扣设置与互换定价

在OIS折扣曲线中,基于OIS利率的定价模型通常会涉及以下步骤:

  1. 使用给定的OIS利率构建折扣曲线。
  2. 使用折扣曲线计算未来现金流的现值。
  3. 定价固定浮动利率互换,比较固定支付和浮动支付的现值。

C++代码实现

#include <iostream>
#include <vector>
#include <cmath>

// 利率曲线类
class OISDiscountCurve {
public:
    // 构造函数,接受OIS利率数据(每年到期的OIS利率)
    OISDiscountCurve(const std::vector<double>& oisRates, const std::vector<double>& maturities)
        : oisRates_(oisRates), maturities_(maturities) {}

    // 计算某一给定期限的折扣因子
    double discountFactor(double maturity) {
        double discount = 1.0;
        for (size_t i = 0; i < maturities_.size(); ++i) {
            if (maturities_[i] > maturity) {
                double deltaT = maturities_[i] - maturities_[i - 1];
                double rate = oisRates_[i];
                discount *= exp(-rate * deltaT);
            }
        }
        return discount;
    }

private:
    std::vector<double> oisRates_;  // OIS利率列表
    std::vector<double> maturities_;  // 对应的到期时间(年)
};

// 互换定价类
class InterestRateSwap {
public:
    // 构造函数,接受固定支付利率、浮动支付利率以及相关参数
    InterestRateSwap(double notional, double fixedRate, const std::vector<double>& floatingRates, const OISDiscountCurve& discountCurve)
        : notional_(notional), fixedRate_(fixedRate), floatingRates_(floatingRates), discountCurve_(discountCurve) {}

    // 定价5年期利率互换
    double priceSwap() {
        double fixedLegPV = 0.0;
        double floatingLegPV = 0.0;
        double notional = notional_;

        // 计算固定支付现金流的现值
        for (size_t i = 0; i < floatingRates_.size(); ++i) {
            double maturity = i + 1;  // 假设每年支付一次
            double discountFactor = discountCurve_.discountFactor(maturity);
            fixedLegPV += fixedRate_ * notional * discountFactor;
            floatingLegPV += floatingRates_[i] * notional * discountFactor;
        }

        return fixedLegPV - floatingLegPV;
    }

private:
    double notional_;  // 名义本金
    double fixedRate_;  // 固定利率
    std::vector<double> floatingRates_;  // 浮动利率
    OISDiscountCurve discountCurve_;  // OIS折扣曲线
};

// 测试实例
void testSwapPricing() {
    // 假设市场数据:OIS利率和对应到期时间
    std::vector<double> oisRates = {0.01, 0.015, 0.02, 0.025, 0.03};  // OIS利率
    std::vector<double> maturities = {1.0, 2.0, 3.0, 4.0, 5.0};  // 到期时间

    // 创建OIS折扣曲线
    OISDiscountCurve discountCurve(oisRates, maturities);

    // 假设的市场数据:固定利率和浮动利率(例如:基于OIS曲线)
    double fixedRate = 0.025;  // 固定利率为2.5%
    std::vector<double> floatingRates = {0.015, 0.02, 0.025, 0.03, 0.035};  // 浮动利率逐年增加

    // 创建InterestRateSwap对象
    InterestRateSwap swap(1000000, fixedRate, floatingRates, discountCurve);

    // 计算互换价格
    double swapPrice = swap.priceSwap();

    // 输出互换定价结果
    std::cout << "Swap Price (Fixed - Floating): " << swapPrice << std::endl;
}

int main() {
    // 执行5年期互换定价测试
    testSwapPricing();
    return 0;
}

代码说明

  1. OISDiscountCurve 类

    • 构造函数:接受OIS利率和到期时间,初始化OIS利率曲线。
    • discountFactor 方法:计算某一给定期限的折扣因子。它通过逐年折现并累乘每年的折扣率来实现折现。
  2. InterestRateSwap 类

    • 构造函数:接受名义本金、固定利率、浮动利率和OIS折扣曲线。
    • priceSwap 方法:计算互换的价格。通过计算固定支付和浮动支付现金流的现值,求出它们的差异即为互换价格。
  3. testSwapPricing 函数:模拟了一个简单的市场环境,其中包含OIS利率、固定利率和浮动利率数据。通过调用 InterestRateSwap 类中的 priceSwap 方法,计算并输出互换的定价结果。

测试输出

Swap Price (Fixed - Floating): 13961.1

总结

本项目实现了一个简单的基于OIS折扣曲线的互换定价模型。通过构建折扣曲线并使用它来折现未来现金流,我们能够定价一个简单的5年期利率互换。

在实际应用中,这个模型可以根据不同的市场数据进行扩展。通过使用OIS利率曲线、信用利差、波动率等市场变量,我们可以创建更为复杂的利率互换定价模型。同时,这种方法也可以应用于其他衍生品定价,例如债券、期货等。

4o mini

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值