swaptionvolcube1.cpp
来自「有很多的函数库」· C++ 代码 · 共 783 行 · 第 1/3 页
CPP
783 行
Real interpolationError =
sabrInterpolation->interpolationError();
calibrationResult[0]=sabrInterpolation->alpha();
calibrationResult[1]=sabrInterpolation->beta();
calibrationResult[2]=sabrInterpolation->nu();
calibrationResult[3]=sabrInterpolation->rho();
calibrationResult[4]=atmForward;
calibrationResult[5]=interpolationError;
calibrationResult[6]=sabrInterpolation->interpolationMaxError();
calibrationResult[7]=sabrInterpolation->endCriteria();
QL_ENSURE(calibrationResult[7]!=EndCriteria::MaxIterations,
"section calibration failed: "
"option tenor " << optionDates[j] <<
", swap tenor " << swapTenors[k] <<
": max iteration (" <<
endCriteria_->maxIterations() << ")" <<
", alpha " << calibrationResult[0]<<
", beta " << calibrationResult[1] <<
", nu " << calibrationResult[2] <<
", rho " << calibrationResult[3] <<
", error " << calibrationResult[5]
);
QL_ENSURE(calibrationResult[6]< maxErrorTolerance_,
"section calibration failed: "
"option tenor " << optionDates[j] <<
", swap tenor " << swapTenors[k] <<
": max error " << calibrationResult[6] <<
", alpha " << calibrationResult[0] <<
", beta " << calibrationResult[1] <<
", nu " << calibrationResult[2] <<
", rho " << calibrationResult[3] <<
", error " << calibrationResult[5]
);
parametersCube.setPoint(optionDates[j], swapTenors[k],
optionTimes[j], swapLengths[k],
calibrationResult);
parametersCube.updateInterpolators();
}
}
void SwaptionVolCube1::fillVolatilityCube() const{
const boost::shared_ptr<SwaptionVolatilityMatrix> atmVolStructure =
boost::dynamic_pointer_cast<SwaptionVolatilityMatrix>(
atmVol_.currentLink());
std::vector<Time> atmOptionTimes(atmVolStructure->optionTimes());
std::vector<Time> optionTimes(volCubeAtmCalibrated_.optionTimes());
atmOptionTimes.insert(atmOptionTimes.end(),
optionTimes.begin(), optionTimes.end());
std::sort(atmOptionTimes.begin(),atmOptionTimes.end());
std::vector<Time> atmSwapLengths(atmVolStructure->swapLengths());
std::vector<Time> swapLengths(volCubeAtmCalibrated_.swapLengths());
atmSwapLengths.insert(atmSwapLengths.end(),
swapLengths.begin(), swapLengths.end());
std::sort(atmSwapLengths.begin(),atmSwapLengths.end());
std::vector<Date> atmOptionDates = atmVolStructure->optionDates();
std::vector<Date> optionDates(volCubeAtmCalibrated_.optionDates());
atmOptionDates.insert(atmOptionDates.end(),
optionDates.begin(), optionDates.end());
std::sort(atmOptionDates.begin(),atmOptionDates.end());
std::vector<Period> atmSwapTenors = atmVolStructure->swapTenors();
std::vector<Period> swapTenors(volCubeAtmCalibrated_.swapTenors());
atmSwapTenors.insert(atmSwapTenors.end(),
swapTenors.begin(), swapTenors.end());
std::sort(atmSwapTenors.begin(),atmSwapTenors.end());
createSparseSmiles();
for (Size j=0; j<atmOptionTimes.size(); j++) {
for (Size k=0; k<atmSwapLengths.size(); k++) {
bool expandOptionTimes =
!(std::binary_search(optionTimes.begin(),
optionTimes.end(),
atmOptionTimes[j]));
bool expandSwapLengths =
!(std::binary_search(swapLengths.begin(),
swapLengths.end(),
atmSwapLengths[k]));
if(expandOptionTimes || expandSwapLengths){
Rate atmForward = atmStrike(atmOptionDates[j],
atmSwapTenors[k]);
Volatility atmVol = atmVol_->volatility(
atmOptionDates[j], atmSwapTenors[k], atmForward);
std::vector<Real> spreadVols =
spreadVolInterpolation(atmOptionDates[j],
atmSwapTenors[k]);
std::vector<Real> volAtmCalibrated;
volAtmCalibrated.reserve(nStrikes_);
for (Size i=0; i<nStrikes_; i++)
volAtmCalibrated.push_back(atmVol + spreadVols[i]);
volCubeAtmCalibrated_.setPoint(
atmOptionDates[j], atmSwapTenors[k],
atmOptionTimes[j], atmSwapLengths[k],
volAtmCalibrated);
}
}
}
volCubeAtmCalibrated_.updateInterpolators();
}
void SwaptionVolCube1::createSparseSmiles() const {
std::vector<Time> optionTimes(sparseParameters_.optionTimes());
std::vector<Time> swapLengths(sparseParameters_.swapLengths());
for (Size j=0; j<optionTimes.size(); j++) {
std::vector<boost::shared_ptr<SmileSection> > tmp;
Size n = swapLengths.size();
tmp.reserve(n);
for (Size k=0; k<n; ++k) {
tmp.push_back(smileSection(optionTimes[j], swapLengths[k],
sparseParameters_));
}
sparseSmiles_.push_back(tmp);
}
}
std::vector<Real> SwaptionVolCube1::spreadVolInterpolation(
const Date& atmOptionDate, const Period& atmSwapTenor) const {
const std::pair<Time, Time> p =
convertDates(atmOptionDate, atmSwapTenor);
Time atmOptionTime = p.first, atmTimeLength = p.second;
std::vector<Real> result;
const std::vector<Time>& optionTimes(sparseParameters_.optionTimes());
const std::vector<Time>& swapLengths(sparseParameters_.swapLengths());
const std::vector<Date>& optionDates =
sparseParameters_.optionDates();
const std::vector<Period>& swapTenors = sparseParameters_.swapTenors();
std::vector<Real>::const_iterator optionTimesPreviousNode,
swapLengthsPreviousNode;
optionTimesPreviousNode = std::lower_bound(optionTimes.begin(),
optionTimes.end(),
atmOptionTime);
Size optionTimesPreviousIndex
= optionTimesPreviousNode - optionTimes.begin();
if (optionTimesPreviousIndex >= optionTimes.size()-1)
optionTimesPreviousIndex = optionTimes.size()-2;
swapLengthsPreviousNode = std::lower_bound(swapLengths.begin(),
swapLengths.end(),
atmTimeLength);
Size swapLengthsPreviousIndex = swapLengthsPreviousNode - swapLengths.begin();
if (swapLengthsPreviousIndex >= swapLengths.size()-1)
swapLengthsPreviousIndex = swapLengths.size()-2;
std::vector< std::vector<boost::shared_ptr<SmileSection> > > smiles;
std::vector<boost::shared_ptr<SmileSection> > smilesOnPreviousExpiry;
std::vector<boost::shared_ptr<SmileSection> > smilesOnNextExpiry;
QL_REQUIRE(optionTimesPreviousIndex+1 < sparseSmiles_.size(),
"optionTimesPreviousIndex+1 >= sparseSmiles_.size()");
QL_REQUIRE(swapLengthsPreviousIndex+1 < sparseSmiles_[0].size(),
"swapLengthsPreviousIndex+1 >= sparseSmiles_[0].size()");
smilesOnPreviousExpiry.push_back(
sparseSmiles_[optionTimesPreviousIndex][swapLengthsPreviousIndex]);
smilesOnPreviousExpiry.push_back(
sparseSmiles_[optionTimesPreviousIndex][swapLengthsPreviousIndex+1]);
smilesOnNextExpiry.push_back(
sparseSmiles_[optionTimesPreviousIndex+1][swapLengthsPreviousIndex]);
smilesOnNextExpiry.push_back(
sparseSmiles_[optionTimesPreviousIndex+1][swapLengthsPreviousIndex+1]);
smiles.push_back(smilesOnPreviousExpiry);
smiles.push_back(smilesOnNextExpiry);
std::vector<Real> optionsNodes(2);
optionsNodes[0] = optionTimes[optionTimesPreviousIndex];
optionsNodes[1] = optionTimes[optionTimesPreviousIndex+1];
std::vector<Date> optionsDateNodes(2);
optionsDateNodes[0] = optionDates[optionTimesPreviousIndex];
optionsDateNodes[1] = optionDates[optionTimesPreviousIndex+1];
std::vector<Real> swapLengthsNodes(2);
swapLengthsNodes[0] = swapLengths[swapLengthsPreviousIndex];
swapLengthsNodes[1] = swapLengths[swapLengthsPreviousIndex+1];
std::vector<Period> swapTenorNodes(2);
swapTenorNodes[0] = swapTenors[swapLengthsPreviousIndex];
swapTenorNodes[1] = swapTenors[swapLengthsPreviousIndex+1];
const Rate atmForward = atmStrike(atmOptionDate, atmSwapTenor);
Matrix atmForwards(2, 2, 0.0);
Matrix atmVols(2, 2, 0.0);
for (Size i=0; i<2; i++) {
for (Size j=0; j<2; j++) {
atmForwards[i][j] = atmStrike(optionsDateNodes[i],
swapTenorNodes[j]);
atmVols[i][j] = smiles[i][j]->volatility(atmForwards[i][j]);
}
}
for (Size k=0; k<nStrikes_; k++){
const Real strike = atmForward + strikeSpreads_[k];
const Real moneyness = atmForward/strike;
Matrix strikes(2,2,0.);
Matrix spreadVols(2,2,0.);
for (Size i=0; i<2; i++){
for (Size j=0; j<2; j++){
strikes[i][j] = atmForwards[i][j]/moneyness;
spreadVols[i][j] =
smiles[i][j]->volatility(strikes[i][j])-atmVols[i][j];
}
}
Cube localInterpolator(optionsDateNodes, swapTenorNodes,
optionsNodes, swapLengthsNodes, 1);
localInterpolator.setLayer(0, spreadVols);
localInterpolator.updateInterpolators();
result.push_back(
localInterpolator(atmOptionTime, atmTimeLength)[0]);
}
return result;
}
boost::shared_ptr<SmileSection>
SwaptionVolCube1::smileSection(Time optionTime, Time swapLength,
const Cube& sabrParametersCube) const {
calculate();
const std::vector<Real> sabrParameters =
sabrParametersCube(optionTime, swapLength);
return boost::shared_ptr<SmileSection>(new
SabrSmileSection(optionTime, sabrParameters[4], sabrParameters));
}
boost::shared_ptr<SmileSection>
SwaptionVolCube1::smileSectionImpl(Time optionTime,
Time swapLength) const {
if (isAtmCalibrated_)
return smileSection(optionTime, swapLength, denseParameters_);
else
return smileSection(optionTime, swapLength, sparseParameters_);
}
Matrix SwaptionVolCube1::sparseSabrParameters() const {
calculate();
return sparseParameters_.browse();
}
Matrix SwaptionVolCube1::denseSabrParameters() const {
calculate();
return denseParameters_.browse();
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?