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校准测试实例相关推荐

  1. C++:实现量化SMM Caplet α 校准测试实例

    C++:实现量化SMM Caplet α 校准测试实例 #include "marketmodel_smmcapletalphacalibration.hpp" #include ...

  2. C++:实现量化SMM Caplet均匀校准测试实例

    C++:实现量化SMM Caplet均匀校准测试实例 #include "markovfunctional.hpp" #include "utilities.hpp&qu ...

  3. C++:实现量化Libor市场模型流程测试实例

    C++:实现量化Libor市场模型流程测试实例 #include "libormarketmodelprocess.hpp" #include "utilities.hp ...

  4. C++:实现量化daycounters 日计数器测试实例

    C++:实现量化daycounters 日计数器测试实例 #include "daycounters.hpp" #include "utilities.hpp" ...

  5. C++:实现量化CPI债券交换测试实例

    C++:实现量化CPI债券交换测试实例 #include "utilities.hpp" #include "inflationcpiswap.hpp" #in ...

  6. C++:实现量化Piecewise yield曲线测试实例

    C++:实现量化Piecewise yield曲线测试实例 #include "piecewiseyieldcurve.hpp" #include "utilities. ...

  7. C++:实现量化N阶导数运算测试实例

    C++:实现量化N阶导数运算测试实例 #include "nthorderderivativeop.hpp" #include "utilities.hpp"# ...

  8. C++:实现量化Jump-diffusion跳跃扩散过程测试实例

    C++:实现量化Jump-diffusion跳跃扩散过程测试实例 #include "jumpdiffusion.hpp" #include "utilities.hpp ...

  9. C++:实现量化投资组合孤注一掷BasketLosses测试实例

    C++:实现量化投资组合孤注一掷BasketLosses测试实例 #include <ql/qldefines.hpp> #if !defined(BOOST_ALL_NO_LIB) &a ...

最新文章

  1. python中字符串中文乱码_[python] 中文乱码问题
  2. HDU 2457 DNA repair (AC自动机+DP)
  3. 全方位绕过软WAF攻略
  4. java逻辑代码_Java逻辑代码判断字数
  5. 算法导论 CLRS 22.4-4 解答
  6. linux查看spare盘的数量,戴尔Dell服务器使用OMSA软件omreport查看硬件信息|磁盘阵列健康监控...
  7. struts2无法调用类静态方法的解决办法
  8. SaaS-HRM(5)系统用户权限设计(角色管理、权限和资源管理)
  9. java url解码_URL的编码和解码
  10. CAN总线标准及协议分析
  11. pyqt5和spyder版本对应_pyqt5 spyder 项目 记录
  12. ctc系统数据库服务器采用,CTC系统构成
  13. 强化学习:确定性策略梯度(DDPG)
  14. Debezium系列之:永久保存history topic中的数据
  15. python的argparse模块add_argument详解
  16. 利用vbs维护qtp的虚拟对象的坐标
  17. HTTP常用端口号与对应的服务说明
  18. stm32mp157a-dk1 编译 Ubuntu 20.04固件
  19. 数据探索性分析(EDA)——异常值处理
  20. vue 孙子组件获取祖先组件数据

热门文章

  1. HTC 8X电信版连接WIN7电脑的真正解决办法
  2. Go 格式化输出 %v、%+v、%#v 的区别:
  3. Java List 多维度排序 jdk8
  4. hive通过grouping sets多维度组合去重统计避免使用distinct
  5. CM311-3_YS_晨星MSO9385芯片刷机分享
  6. Clickhouse LB实践
  7. Deepin Linux设置环境变量时出现【Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings=gasp】的解决方法
  8. ALtera DE2开发板学习
  9. npm-run-all 同时运行多条命令
  10. 重学Android基础系列篇(五):Android虚拟机指令