C++:实现量化SMM Caplet校准测试实例
C++:实现量化SMM Caplet校准测试实例
#include "marketmodel_smmcapletcalibration.hpp"
#include "utilities.hpp"
#include <ql/models/marketmodels/correlations/cotswapfromfwdcorrelation.hpp>
#include <ql/models/marketmodels/correlations/timehomogeneousforwardcorrelation.hpp>
#include <ql/models/marketmodels/models/piecewiseconstantabcdvariance.hpp>
#include <ql/models/marketmodels/models/capletcoterminalswaptioncalibration.hpp>
#include <ql/models/marketmodels/models/cotswaptofwdadapter.hpp>
#include <ql/models/marketmodels/models/pseudorootfacade.hpp>
#include <ql/models/marketmodels/products/multistep/multistepcoterminalswaps.hpp>
#include <ql/models/marketmodels/products/multistep/multistepcoterminalswaptions.hpp>
#include <ql/models/marketmodels/products/multistep/multistepswap.hpp>
#include <ql/models/marketmodels/products/multiproductcomposite.hpp>
#include <ql/models/marketmodels/accountingengine.hpp>
#include <ql/models/marketmodels/utilities.hpp>
#include <ql/models/marketmodels/evolvers/lognormalcotswapratepc.hpp>
#include <ql/models/marketmodels/evolvers/lognormalfwdratepc.hpp>
#include <ql/models/marketmodels/correlations/expcorrelations.hpp>
#include <ql/models/marketmodels/models/flatvol.hpp>
#include <ql/models/marketmodels/models/abcdvol.hpp>
#include <ql/models/marketmodels/browniangenerators/mtbrowniangenerator.hpp>
#include <ql/models/marketmodels/browniangenerators/sobolbrowniangenerator.hpp>
#include <ql/models/marketmodels/swapforwardmappings.hpp>
#include <ql/models/marketmodels/curvestates/coterminalswapcurvestate.hpp>
#include <ql/methods/montecarlo/genericlsregression.hpp>
#include <ql/legacy/libormarketmodels/lmlinexpcorrmodel.hpp>
#include <ql/legacy/libormarketmodels/lmextlinexpvolmodel.hpp>
#include <ql/time/schedule.hpp>
#include <ql/time/calendars/nullcalendar.hpp>
#include <ql/time/daycounters/simpledaycounter.hpp>
#include <ql/pricingengines/blackformula.hpp>
#include <ql/pricingengines/blackcalculator.hpp>
#include <ql/utilities/dataformatters.hpp>
#include <ql/math/integrals/segmentintegral.hpp>
#include <ql/math/statistics/convergencestatistics.hpp>
#include <ql/math/statistics/sequencestatistics.hpp>
#include <sstream>using namespace QuantLib;
using namespace boost::unit_test_framework;namespace market_model_smm_caplet_calibration_test {Date todaysDate_, startDate_, endDate_;std::vector<Time> rateTimes_;std::vector<Real> accruals_;Calendar calendar_;DayCounter dayCounter_;std::vector<Rate> todaysForwards_, todaysSwaps_;std::vector<Real> coterminalAnnuity_;Size numberOfFactors_;Real alpha_, alphaMax_, alphaMin_;Spread displacement_;std::vector<DiscountFactor> todaysDiscounts_;std::vector<Volatility> swaptionDisplacedVols_, swaptionVols_;std::vector<Volatility> capletDisplacedVols_, capletVols_;Real a_, b_, c_, d_;Real longTermCorrelation_, beta_;Size measureOffset_;unsigned long seed_;Size paths_, trainingPaths_;bool printReport_ = false;void setup() {// Timescalendar_ = NullCalendar();todaysDate_ = Settings::instance().evaluationDate();//startDate = todaysDate + 5*Years;endDate_ = todaysDate_ + 66*Months;Schedule dates(todaysDate_, endDate_, Period(Semiannual),calendar_, Following, Following, DateGeneration::Backward, false);rateTimes_ = std::vector<Time>(dates.size()-1);accruals_ = std::vector<Real>(rateTimes_.size()-1);dayCounter_ = SimpleDayCounter();for (Size i=1; i<dates.size(); ++i)rateTimes_[i-1] = dayCounter_.yearFraction(todaysDate_, dates[i]);for (Size i=1; i<rateTimes_.size(); ++i)accruals_[i-1] = rateTimes_[i] - rateTimes_[i-1];// Rates & displacementtodaysForwards_ = std::vector<Rate>(accruals_.size());numberOfFactors_ = 3;alpha_ = -0.05;alphaMax_ = 1.0;alphaMin_ = -1.0;displacement_ = 0.0;for (Size i=0; i<todaysForwards_.size(); ++i) {todaysForwards_[i] = 0.03 + 0.0025*i;//todaysForwards_[i] = 0.03;}LMMCurveState curveState_lmm(rateTimes_);curveState_lmm.setOnForwardRates(todaysForwards_);todaysSwaps_ = curveState_lmm.coterminalSwapRates();// DiscountstodaysDiscounts_ = std::vector<DiscountFactor>(rateTimes_.size());todaysDiscounts_[0] = 0.95;for (Size i=1; i<rateTimes_.size(); ++i)todaysDiscounts_[i] = todaysDiscounts_[i-1] /(1.0+todaysForwards_[i-1]*accruals_[i-1]); Swaption Volatilities//Volatility mktSwaptionVols[] = {// 0.15541283,// 0.18719678,// 0.20890740,// 0.22318179,// 0.23212717,// 0.23731450,// 0.23988649,// 0.24066384,// 0.24023111,// 0.23900189,// 0.23726699,// 0.23522952,// 0.23303022,// 0.23076564,// 0.22850101,// 0.22627951,// 0.22412881,// 0.22206569,// 0.22009939//};//a = -0.0597;//b = 0.1677;//c = 0.5403;//d = 0.1710;a_ = 0.0;b_ = 0.17;c_ = 1.0;d_ = 0.10;Volatility mktCapletVols[] = {0.1640,0.1740,0.1840,0.1940,0.1840,0.1740,0.1640,0.1540,0.1440,0.1340376439125532};//swaptionDisplacedVols = std::vector<Volatility>(todaysSwaps.size());//swaptionVols = std::vector<Volatility>(todaysSwaps.size());//capletDisplacedVols = std::vector<Volatility>(todaysSwaps.size());capletVols_.resize(todaysSwaps_.size());for (Size i=0; i<todaysSwaps_.size(); i++) {// swaptionDisplacedVols[i] = todaysSwaps[i]*mktSwaptionVols[i]/// (todaysSwaps[i]+displacement);// swaptionVols[i]= mktSwaptionVols[i];// capletDisplacedVols[i] = todaysForwards[i]*mktCapletVols[i]/// (todaysForwards[i]+displacement);capletVols_[i]= mktCapletVols[i];}// Cap/Floor CorrelationlongTermCorrelation_ = 0.5;beta_ = 0.2;measureOffset_ = 5;// Monte Carloseed_ = 42;#ifdef _DEBUGpaths_ = 127;trainingPaths_ = 31;
#elsepaths_ = 32767; //262144-1; //; // 2^15-1trainingPaths_ = 8191; // 2^13-1
#endif}enum MarketModelType { ExponentialCorrelationFlatVolatility,ExponentialCorrelationAbcdVolatility/*,CalibratedMM*/};enum MeasureType { ProductSuggested, Terminal,MoneyMarket, MoneyMarketPlus };enum EvolverType { Ipc, Pc , NormalPc };}void MarketModelSmmCapletCalibrationTest::testFunction() {BOOST_TEST_MESSAGE("Testing GHLS caplet calibration ""in a lognormal coterminal swap market model...");using namespace market_model_smm_caplet_calibration_test;setup();Size numberOfRates = todaysForwards_.size();EvolutionDescription evolution(rateTimes_);// Size numberOfSteps = evolution.numberOfSteps();ext::shared_ptr<PiecewiseConstantCorrelation> fwdCorr(newExponentialForwardCorrelation(rateTimes_,longTermCorrelation_,beta_));ext::shared_ptr<LMMCurveState> cs(new LMMCurveState(rateTimes_));cs->setOnForwardRates(todaysForwards_);ext::shared_ptr<PiecewiseConstantCorrelation> corr(newCotSwapFromFwdCorrelation(fwdCorr, *cs, displacement_));std::vector<ext::shared_ptr<PiecewiseConstantVariance> >swapVariances(numberOfRates);for (Size i=0; i<numberOfRates; ++i) {swapVariances[i] = ext::shared_ptr<PiecewiseConstantVariance>(newPiecewiseConstantAbcdVariance(a_, b_, c_, d_,i, rateTimes_));}// create calibratorstd::vector<Real> alpha(numberOfRates, alpha_);bool lowestRoot = true;bool useFullApprox = false;if (printReport_) {BOOST_TEST_MESSAGE("caplet market vols: " << std::fixed <<std::setprecision(4) << io::sequence(capletVols_));BOOST_TEST_MESSAGE("alpha: " << alpha_);BOOST_TEST_MESSAGE("lowestRoot: " << lowestRoot);BOOST_TEST_MESSAGE("useFullApprox: " << useFullApprox);}CTSMMCapletOriginalCalibration calibrator(evolution,corr,swapVariances,capletVols_,cs,displacement_,alpha,lowestRoot,useFullApprox);// calibrateNatural maxIterations = 2;Real capletTolerance = 0.0001;Natural innerMaxIterations = 50;Real innerTolerance = 1e-9;if (printReport_) {BOOST_TEST_MESSAGE("alpha: " << alpha_);BOOST_TEST_MESSAGE("lowestRoot: " << lowestRoot);BOOST_TEST_MESSAGE("useFullApprox: " << useFullApprox);}bool result = calibrator.calibrate(numberOfFactors_,maxIterations,capletTolerance/10,innerMaxIterations,innerTolerance);if (!result)BOOST_ERROR("calibration failed");const std::vector<Matrix>& swapPseudoRoots = calibrator.swapPseudoRoots();ext::shared_ptr<MarketModel> smm(newPseudoRootFacade(swapPseudoRoots,rateTimes_,cs->coterminalSwapRates(),std::vector<Spread>(numberOfRates, displacement_)));CotSwapToFwdAdapter flmm(smm);Matrix capletTotCovariance = flmm.totalCovariance(numberOfRates-1);std::vector<Volatility> capletVols(numberOfRates);for (Size i=0; i<numberOfRates; ++i) {capletVols[i] = std::sqrt(capletTotCovariance[i][i]/rateTimes_[i]);}if (printReport_) {BOOST_TEST_MESSAGE("caplet smm implied vols: " << std::fixed <<std::setprecision(4) << io::sequence(capletVols));BOOST_TEST_MESSAGE("failures: " << calibrator.failures());BOOST_TEST_MESSAGE("deformationSize: " << calibrator.deformationSize());BOOST_TEST_MESSAGE("capletRmsError: " << calibrator.capletRmsError());BOOST_TEST_MESSAGE("capletMaxError: " << calibrator.capletMaxError());BOOST_TEST_MESSAGE("swaptionRmsError: " << calibrator.swaptionRmsError());BOOST_TEST_MESSAGE("swaptionMaxError: " << calibrator.swaptionMaxError());}// check perfect swaption fitReal error, swapTolerance = 1e-14;Matrix swapTerminalCovariance(numberOfRates, numberOfRates, 0.0);for (Size i=0; i<numberOfRates; ++i) {Volatility expSwaptionVol = swapVariances[i]->totalVolatility(i);swapTerminalCovariance += swapPseudoRoots[i] * transpose(swapPseudoRoots[i]);Volatility swaptionVol = std::sqrt(swapTerminalCovariance[i][i]/rateTimes_[i]);error = std::fabs(swaptionVol-expSwaptionVol);if (error>swapTolerance)BOOST_ERROR("failed to reproduce " << io::ordinal(i+1) << " swaption vol:""\n expected: " << io::rate(expSwaptionVol) <<"\n realized: " << io::rate(swaptionVol) <<"\n error: " << error <<"\n tolerance: " << swapTolerance);}// check caplet fitfor (Size i=0; i<numberOfRates; ++i) {error = std::fabs(capletVols[i]-capletVols_[i]);if (error>capletTolerance)BOOST_ERROR("failed to reproduce " << io::ordinal(i+1) << " caplet vol:""\n expected: " << io::rate(capletVols_[i]) <<"\n realized: " << io::rate(capletVols[i]) <<"\n percentage error: " << error/capletVols_[i] <<"\n error: " << error <<"\n tolerance: " << capletTolerance);}
}// --- Call the desired tests
test_suite* MarketModelSmmCapletCalibrationTest::suite() {auto* suite = BOOST_TEST_SUITE("SMM Caplet calibration test");suite->add(QUANTLIB_TEST_CASE(&MarketModelSmmCapletCalibrationTest::testFunction));return suite;
}
该博文为原创文章,未经博主同意不得转。
本文章博客地址:https://cplusplus.blog.csdn.net/article/details/128364447
C++:实现量化SMM Caplet校准测试实例相关推荐
- C++:实现量化SMM Caplet α 校准测试实例
C++:实现量化SMM Caplet α 校准测试实例 #include "marketmodel_smmcapletalphacalibration.hpp" #include ...
- C++:实现量化SMM Caplet均匀校准测试实例
C++:实现量化SMM Caplet均匀校准测试实例 #include "markovfunctional.hpp" #include "utilities.hpp&qu ...
- C++:实现量化Libor市场模型流程测试实例
C++:实现量化Libor市场模型流程测试实例 #include "libormarketmodelprocess.hpp" #include "utilities.hp ...
- C++:实现量化daycounters 日计数器测试实例
C++:实现量化daycounters 日计数器测试实例 #include "daycounters.hpp" #include "utilities.hpp" ...
- C++:实现量化CPI债券交换测试实例
C++:实现量化CPI债券交换测试实例 #include "utilities.hpp" #include "inflationcpiswap.hpp" #in ...
- C++:实现量化Piecewise yield曲线测试实例
C++:实现量化Piecewise yield曲线测试实例 #include "piecewiseyieldcurve.hpp" #include "utilities. ...
- C++:实现量化N阶导数运算测试实例
C++:实现量化N阶导数运算测试实例 #include "nthorderderivativeop.hpp" #include "utilities.hpp"# ...
- C++:实现量化Jump-diffusion跳跃扩散过程测试实例
C++:实现量化Jump-diffusion跳跃扩散过程测试实例 #include "jumpdiffusion.hpp" #include "utilities.hpp ...
- C++:实现量化投资组合孤注一掷BasketLosses测试实例
C++:实现量化投资组合孤注一掷BasketLosses测试实例 #include <ql/qldefines.hpp> #if !defined(BOOST_ALL_NO_LIB) &a ...
最新文章
- python中字符串中文乱码_[python] 中文乱码问题
- HDU 2457 DNA repair (AC自动机+DP)
- 全方位绕过软WAF攻略
- java逻辑代码_Java逻辑代码判断字数
- 算法导论 CLRS 22.4-4 解答
- linux查看spare盘的数量,戴尔Dell服务器使用OMSA软件omreport查看硬件信息|磁盘阵列健康监控...
- struts2无法调用类静态方法的解决办法
- SaaS-HRM(5)系统用户权限设计(角色管理、权限和资源管理)
- java url解码_URL的编码和解码
- CAN总线标准及协议分析
- pyqt5和spyder版本对应_pyqt5 spyder 项目 记录
- ctc系统数据库服务器采用,CTC系统构成
- 强化学习:确定性策略梯度(DDPG)
- Debezium系列之:永久保存history topic中的数据
- python的argparse模块add_argument详解
- 利用vbs维护qtp的虚拟对象的坐标
- HTTP常用端口号与对应的服务说明
- stm32mp157a-dk1 编译 Ubuntu 20.04固件
- 数据探索性分析(EDA)——异常值处理
- vue 孙子组件获取祖先组件数据
热门文章
- HTC 8X电信版连接WIN7电脑的真正解决办法
- Go 格式化输出 %v、%+v、%#v 的区别:
- Java List 多维度排序 jdk8
- hive通过grouping sets多维度组合去重统计避免使用distinct
- CM311-3_YS_晨星MSO9385芯片刷机分享
- Clickhouse LB实践
- Deepin Linux设置环境变量时出现【Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings=gasp】的解决方法
- ALtera DE2开发板学习
- npm-run-all 同时运行多条命令
- 重学Android基础系列篇(五):Android虚拟机指令