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

#include "marketmodel_smmcapletalphacalibration.hpp"
#include "utilities.hpp"
#include <ql/models/marketmodels/models/capletcoterminalalphacalibration.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/optimization/simplex.hpp>
#include <ql/math/statistics/sequencestatistics.hpp>
#include <sstream>using namespace QuantLib;
using namespace boost::unit_test_framework;namespace market_model_smm_caplet_alpha_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.0;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 MarketModelSmmCapletAlphaCalibrationTest::testFunction() {BOOST_TEST_MESSAGE("Testing alpha caplet calibration ""in a lognormal coterminal swap market model...");using namespace market_model_smm_caplet_alpha_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> alphaInitial(numberOfRates, alpha_);std::vector<Real> alphaMax(numberOfRates,  1.0);std::vector<Real> alphaMin(numberOfRates, -1.0);bool maximizeHomogeneity = false; //?if (printReport_) {BOOST_TEST_MESSAGE("caplet market vols: " << std::fixed <<std::setprecision(4) << io::sequence(capletVols_));BOOST_TEST_MESSAGE("alphaMin:           " << alphaMin_);BOOST_TEST_MESSAGE("alphaInitial:       " << alpha_);BOOST_TEST_MESSAGE("alphaMax:           " << alphaMax_);BOOST_TEST_MESSAGE("maximizeHomogeneity:" << maximizeHomogeneity);}CTSMMCapletAlphaFormCalibration calibrator(evolution,corr,swapVariances,capletVols_,cs,displacement_,alphaInitial,alphaMax,alphaMin,maximizeHomogeneity);// calibrateNatural maxIterations = 10;Real capletTolerance = 1e-4; // i.e. 1 bpNatural innerMaxIterations = 100;Real innerTolerance = 1e-8;if (printReport_) {BOOST_TEST_MESSAGE("numberOfFactors:    " << numberOfFactors_);BOOST_TEST_MESSAGE("maxIterations:      " << maxIterations);BOOST_TEST_MESSAGE("capletTolerance:    " << io::rate(capletTolerance));BOOST_TEST_MESSAGE("innerMaxIterations: " << innerMaxIterations);BOOST_TEST_MESSAGE("innerTolerance:     " << io::rate(innerTolerance));}bool result = calibrator.calibrate(numberOfFactors_,maxIterations,capletTolerance,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* MarketModelSmmCapletAlphaCalibrationTest::suite() {auto* suite = BOOST_TEST_SUITE("SMM Caplet alpha calibration test");suite->add(QUANTLIB_TEST_CASE(&MarketModelSmmCapletAlphaCalibrationTest::testFunction));return suite;
}

该博文为原创文章,未经博主同意不得转。
本文章博客地址:https://cplusplus.blog.csdn.net/article/details/128364433

C++:实现量化SMM Caplet α 校准测试实例相关推荐

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

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

  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. hbase put 异步 java_java – HBase BufferedMutator vs PutList性能
  2. QT的QAudioRecorder类的使用
  3. 内购订单进行二次处理_独家独到飞豹FBA亚马逊退货处理,实现二次销售不是问题...
  4. Java面向对象(4) ——多态
  5. python手机自动化测试脚本语言_Python+Appium实现APP自动化测试
  6. Python如何创建装饰器时保留函数元信息
  7. sql sum()对空值的处理
  8. java并发编程LockSupport讲解
  9. vmware:Cannot open the disk 'XXX' or one of the snapshot disks it depends on.
  10. Java中FilterInputStream和FilterOutputStream的用法
  11. c语言鼠标游戏,c语言写的鼠标操作的五子棋游戏,欢迎观赏!
  12. win10系统如何解除端口占用
  13. 清北复交人浙南 计算机交叉学科项目大盘点!
  14. Twitter上热门的技巧与思路
  15. 2020 微信头像圣诞帽来啦,快给 TA 戴帽子吧~
  16. 示波器20M硬件带宽限制与数字滤波高低通功能
  17. Crashing Balloon
  18. mcu 与电量计 BQ40Z80 通信,读取电芯电量
  19. Mybatis的where标签,还有这么多知识点
  20. 成组链接法 恩赐解脱

热门文章

  1. python warning ignore
  2. 首场百度大脑开放日来袭 | 全新开放24项AI技术
  3. ldp hello报文接收的处理流程
  4. 华为nova7se和华为nova7的区别 哪个好
  5. 【学习笔记】联邦计算
  6. HTTP常见请求头/响应头
  7. 原生小程序使用二维码扫码调用接口
  8. mysql 8.0.26学习笔记超详细入门到精通
  9. Denouncing Mafia
  10. 函数式编程[Lambda 表达式,Optional,Stream流]从入门到精通(一)