项目背景与目标
在量化金融中,**OIS(Overnight Indexed Swap)**是一种基于隔夜利率的利率互换。通常,它用于计算固定和浮动利率之间的差异,其中浮动利率基于隔夜利率。这类利率互换在利率衍生品市场中广泛使用,尤其在构建短期利率曲线和折扣曲线方面。
**OIS折扣设置(OIS Discounting)**是将OIS利率用作市场折现曲线的一个重要应用。通过OIS折扣,我们可以确定未来现金流的现值,这对于定价包括利率互换在内的衍生品至关重要。
本项目的目标是:
- 构建OIS折扣曲线:基于OIS利率,创建期限结构。
- 定价一个5年期的利率互换:使用OIS折扣曲线定价一个固定和浮动利率互换。
- 测试实例:展示如何使用OIS折扣曲线来定价一个简单的5年期互换。
OIS折扣设置与互换定价
在OIS折扣曲线中,基于OIS利率的定价模型通常会涉及以下步骤:
- 使用给定的OIS利率构建折扣曲线。
- 使用折扣曲线计算未来现金流的现值。
- 定价固定浮动利率互换,比较固定支付和浮动支付的现值。
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;
}
代码说明
-
OISDiscountCurve 类:
- 构造函数:接受OIS利率和到期时间,初始化OIS利率曲线。
- discountFactor 方法:计算某一给定期限的折扣因子。它通过逐年折现并累乘每年的折扣率来实现折现。
-
InterestRateSwap 类:
- 构造函数:接受名义本金、固定利率、浮动利率和OIS折扣曲线。
- priceSwap 方法:计算互换的价格。通过计算固定支付和浮动支付现金流的现值,求出它们的差异即为互换价格。
-
testSwapPricing 函数:模拟了一个简单的市场环境,其中包含OIS利率、固定利率和浮动利率数据。通过调用
InterestRateSwap
类中的priceSwap
方法,计算并输出互换的定价结果。
测试输出
Swap Price (Fixed - Floating): 13961.1
总结
本项目实现了一个简单的基于OIS折扣曲线的互换定价模型。通过构建折扣曲线并使用它来折现未来现金流,我们能够定价一个简单的5年期利率互换。
在实际应用中,这个模型可以根据不同的市场数据进行扩展。通过使用OIS利率曲线、信用利差、波动率等市场变量,我们可以创建更为复杂的利率互换定价模型。同时,这种方法也可以应用于其他衍生品定价,例如债券、期货等。
4o mini