QuantLib: a free/open-source library for quantitative finance
fully annotated source code - version 1.34
|
#include <markovfunctional.hpp>
Classes | |
struct | CalibrationPoint |
class | CustomSmileFactory |
class | CustomSmileSection |
struct | ModelOutputs |
struct | ModelSettings |
class | ZeroHelper |
Public Member Functions | |
MarkovFunctional (const Handle< YieldTermStructure > &termStructure, Real reversion, std::vector< Date > volstepdates, std::vector< Real > volatilities, const Handle< SwaptionVolatilityStructure > &swaptionVol, const std::vector< Date > &swaptionExpiries, const std::vector< Period > &swaptionTenors, const ext::shared_ptr< SwapIndex > &swapIndexBase, MarkovFunctional::ModelSettings modelSettings=ModelSettings()) | |
MarkovFunctional (const Handle< YieldTermStructure > &termStructure, Real reversion, std::vector< Date > volstepdates, std::vector< Real > volatilities, const Handle< OptionletVolatilityStructure > &capletVol, const std::vector< Date > &capletExpiries, ext::shared_ptr< IborIndex > iborIndex, MarkovFunctional::ModelSettings modelSettings=ModelSettings()) | |
const ModelSettings & | modelSettings () const |
const ModelOutputs & | modelOutputs () const |
const Date & | numeraireDate () const |
const Time & | numeraireTime () const |
const Array & | volatility () const |
void | calibrate (const std::vector< ext::shared_ptr< CalibrationHelper > > &helpers, OptimizationMethod &method, const EndCriteria &endCriteria, const Constraint &constraint=Constraint(), const std::vector< Real > &weights=std::vector< Real >(), const std::vector< bool > &fixParameters=std::vector< bool >()) override |
Calibrate to a set of market instruments (usually caps/swaptions) More... | |
void | calibrate (const std::vector< ext::shared_ptr< BlackCalibrationHelper > > &helpers, OptimizationMethod &method, const EndCriteria &endCriteria, const Constraint &constraint=Constraint(), const std::vector< Real > &weights=std::vector< Real >(), const std::vector< bool > &fixParameters=std::vector< bool >()) |
void | update () override |
std::vector< std::pair< Size, Size > > | arbitrageIndices () const |
void | forceArbitrageIndices (const std::vector< std::pair< Size, Size > > &indices) |
![]() | |
ext::shared_ptr< StochasticProcess1D > | stateProcess () const |
Real | numeraire (Time t, Real y=0.0, const Handle< YieldTermStructure > &yts=Handle< YieldTermStructure >()) const |
Real | zerobond (Time T, Time t=0.0, Real y=0.0, const Handle< YieldTermStructure > &yts=Handle< YieldTermStructure >()) const |
Real | numeraire (const Date &referenceDate, Real y=0.0, const Handle< YieldTermStructure > &yts=Handle< YieldTermStructure >()) const |
Real | zerobond (const Date &maturity, const Date &referenceDate=Null< Date >(), Real y=0.0, const Handle< YieldTermStructure > &yts=Handle< YieldTermStructure >()) const |
Real | zerobondOption (const Option::Type &type, const Date &expiry, const Date &valueDate, const Date &maturity, Rate strike, const Date &referenceDate=Null< Date >(), Real y=0.0, const Handle< YieldTermStructure > &yts=Handle< YieldTermStructure >(), Real yStdDevs=7.0, Size yGridPoints=64, bool extrapolatePayoff=true, bool flatPayoffExtrapolation=false) const |
Real | forwardRate (const Date &fixing, const Date &referenceDate=Null< Date >(), Real y=0.0, const ext::shared_ptr< IborIndex > &iborIdx=ext::shared_ptr< IborIndex >()) const |
Real | swapRate (const Date &fixing, const Period &tenor, const Date &referenceDate=Null< Date >(), Real y=0.0, const ext::shared_ptr< SwapIndex > &swapIdx=ext::shared_ptr< SwapIndex >()) const |
Real | swapAnnuity (const Date &fixing, const Period &tenor, const Date &referenceDate=Null< Date >(), Real y=0.0, const ext::shared_ptr< SwapIndex > &swapIdx=ext::shared_ptr< SwapIndex >()) const |
Array | yGrid (Real yStdDevs, int gridPoints, Real T=1.0, Real t=0, Real y=0) const |
![]() | |
TermStructureConsistentModel (Handle< YieldTermStructure > termStructure) | |
const Handle< YieldTermStructure > & | termStructure () const |
![]() | |
Observable () | |
Observable (const Observable &) | |
Observable & | operator= (const Observable &) |
Observable (Observable &&)=delete | |
Observable & | operator= (Observable &&)=delete |
virtual | ~Observable ()=default |
void | notifyObservers () |
![]() | |
LazyObject () | |
~LazyObject () override=default | |
void | update () override |
bool | isCalculated () const |
void | forwardFirstNotificationOnly () |
void | alwaysForwardNotifications () |
void | recalculate () |
void | freeze () |
void | unfreeze () |
![]() | |
Observer ()=default | |
Observer (const Observer &) | |
Observer & | operator= (const Observer &) |
virtual | ~Observer () |
std::pair< iterator, bool > | registerWith (const ext::shared_ptr< Observable > &) |
void | registerWithObservables (const ext::shared_ptr< Observer > &) |
Size | unregisterWith (const ext::shared_ptr< Observable > &) |
void | unregisterWithAll () |
virtual void | update ()=0 |
virtual void | deepUpdate () |
![]() | |
CalibratedModel (Size nArguments) | |
void | update () override |
virtual void | calibrate (const std::vector< ext::shared_ptr< CalibrationHelper > > &, OptimizationMethod &method, const EndCriteria &endCriteria, const Constraint &constraint=Constraint(), const std::vector< Real > &weights=std::vector< Real >(), const std::vector< bool > &fixParameters=std::vector< bool >()) |
Calibrate to a set of market instruments (usually caps/swaptions) More... | |
Real | value (const Array ¶ms, const std::vector< ext::shared_ptr< CalibrationHelper > > &) |
const ext::shared_ptr< Constraint > & | constraint () const |
EndCriteria::Type | endCriteria () const |
Returns end criteria result. More... | |
const Array & | problemValues () const |
Returns the problem values. More... | |
Array | params () const |
Returns array of arguments on which calibration is done. More... | |
virtual void | setParams (const Array ¶ms) |
Integer | functionEvaluation () const |
Protected Member Functions | |
Real | numeraireImpl (Time t, Real y, const Handle< YieldTermStructure > &yts) const override |
Real | zerobondImpl (Time T, Time t, Real y, const Handle< YieldTermStructure > &yts) const override |
void | generateArguments () override |
void | performCalculations () const override |
std::vector< bool > | FixedFirstVolatility () const |
![]() | |
Gaussian1dModel (const Handle< YieldTermStructure > &yieldTermStructure) | |
virtual Real | numeraireImpl (Time t, Real y, const Handle< YieldTermStructure > &yts) const =0 |
virtual Real | zerobondImpl (Time T, Time t, Real y, const Handle< YieldTermStructure > &yts) const =0 |
void | performCalculations () const override |
void | generateArguments () |
ext::shared_ptr< VanillaSwap > | underlyingSwap (const ext::shared_ptr< SwapIndex > &index, const Date &expiry, const Period &tenor) const |
![]() | |
virtual void | calculate () const |
virtual void | generateArguments () |
Private Member Functions | |
void | initialize () |
void | updateTimes () const |
void | updateTimes1 () const |
void | updateTimes2 () const |
void | updateSmiles () const |
void | updateNumeraireTabulation () const |
void | makeSwaptionCalibrationPoint (const Date &expiry, const Period &tenor) |
void | makeCapletCalibrationPoint (const Date &expiry) |
Real | marketSwapRate (const Date &expiry, const CalibrationPoint &p, Real digitalPrice, Real guess=0.03, Real shift=0.0) const |
Real | marketDigitalPrice (const Date &expiry, const CalibrationPoint &p, const Option::Type &type, Real strike) const |
Array | deflatedZerobondArray (Time T, Time t, const Array &y) const |
Array | numeraireArray (Time t, const Array &y) const |
Array | zerobondArray (Time T, Time t, const Array &y) const |
Real | deflatedZerobond (Time T, Time t=0.0, Real y=0.0) const |
Real | forwardRateInternal (const Date &fixing, const Date &referenceDate=Null< Date >(), Real y=0.0, bool zeroFixingDays=false, ext::shared_ptr< IborIndex > iborIdx=ext::shared_ptr< IborIndex >()) const |
Real | swapRateInternal (const Date &fixing, const Period &tenor, const Date &referenceDate=Null< Date >(), Real y=0.0, bool zeroFixingDays=false, ext::shared_ptr< SwapIndex > swapIdx=ext::shared_ptr< SwapIndex >()) const |
Real | swapAnnuityInternal (const Date &fixing, const Period &tenor, const Date &referenceDate=Null< Date >(), Real y=0.0, bool zeroFixingDays=false, ext::shared_ptr< SwapIndex > swapIdx=ext::shared_ptr< SwapIndex >()) const |
Real | capletPriceInternal (const Option::Type &type, const Date &expiry, Rate strike, const Date &referenceDate=Null< Date >(), Real y=0.0, bool zeroFixingDays=false, ext::shared_ptr< IborIndex > iborIdx=ext::shared_ptr< IborIndex >()) const |
Real | swaptionPriceInternal (const Option::Type &type, const Date &expiry, const Period &tenor, Rate strike, const Date &referenceDate=Null< Date >(), Real y=0.0, bool zeroFixingDays=false, const ext::shared_ptr< SwapIndex > &swapIdx=ext::shared_ptr< SwapIndex >()) const |
Private Attributes | |
ModelSettings | modelSettings_ |
ModelOutputs | modelOutputs_ |
const bool | capletCalibrated_ |
ext::shared_ptr< Matrix > | discreteNumeraire_ |
std::vector< ext::shared_ptr< Interpolation > > | numeraire_ |
Parameter | reversion_ |
Parameter & | sigma_ |
std::vector< Date > | volstepdates_ |
std::vector< Time > | volsteptimes_ |
Array | volsteptimesArray_ |
std::vector< Real > | volatilities_ |
Date | numeraireDate_ |
Time | numeraireTime_ |
Handle< SwaptionVolatilityStructure > | swaptionVol_ |
Handle< OptionletVolatilityStructure > | capletVol_ |
std::vector< Date > | swaptionExpiries_ |
std::vector< Date > | capletExpiries_ |
std::vector< Period > | swaptionTenors_ |
ext::shared_ptr< SwapIndex > | swapIndexBase_ |
ext::shared_ptr< IborIndex > | iborIndex_ |
std::map< Date, CalibrationPoint > | calibrationPoints_ |
std::vector< Real > | times_ |
Array | y_ |
Array | normalIntegralX_ |
Array | normalIntegralW_ |
std::vector< std::pair< Size, Size > > | arbitrageIndices_ |
std::vector< std::pair< Size, Size > > | forcedArbitrageIndices_ |
Additional Inherited Members | |
![]() | |
typedef set_type::iterator | iterator |
![]() | |
static Real | gaussianPolynomialIntegral (Real a, Real b, Real c, Real d, Real e, Real x0, Real x1) |
static Real | gaussianShiftedPolynomialIntegral (Real a, Real b, Real c, Real d, Real e, Real h, Real x0, Real x1) |
![]() | |
ext::shared_ptr< StochasticProcess1D > | stateProcess_ |
Date | evaluationDate_ |
bool | enforcesTodaysHistoricFixings_ |
![]() | |
bool | calculated_ = false |
bool | frozen_ = false |
bool | alwaysForward_ |
![]() | |
std::vector< Parameter > | arguments_ |
ext::shared_ptr< Constraint > | constraint_ |
EndCriteria::Type | shortRateEndCriteria_ = EndCriteria::None |
Array | problemValues_ |
Integer | functionEvaluation_ |
One factor Markov Functional model class. Some documentation is available here http://ssrn.com/abstract_id=2183721 http://quantlib.org/slides/qlws13/caspers.pdf
The model requires a suitable input smile which means it should be arbitrage free, smooth (at least implying a C^1 call price function) and with a call price function not decreasing too slow in strike direction.
A method for arbitrage free extra- and interpolation due to Kahale is provided and may be used to improve an input smile. Alternatively a SABR smile with arbitrage free wings can be fitted to the input smile to provide an appropriate input smile.
If you use the Kahale or SABR method for smile pretreatment then this implies zero density for underlying rates below minus the displacement parameter. This means that in this case the market yield term structure must imply underlying atm forward rates greater than minus displacement.
If you do not use a smile pretreatment you should ensure that the input smileSection is arbitrage free and that the input smileSection covers the strikes from lowerRateBound to upperRateBound.
During calibration a monocurve setup is assumed with the given yield term structure determining the rates throughout, no matter what curves are linked to the indices in the volatility term structures. The yield term structure should therefore be the main risk curve, i.e. the forwarding curve for the respective swaption or cap underlyings.
The model uses a simplified formula for the npv of a swaps floating leg namely $P(t,T_0)-P(t,T_1)$ with $T_0$ being the start date of the leg and $T_1$ being the last payment date, which is an approximation to the true npv.
The model calibrates to slightly modified market options in the sense that the start date is set equal to the fixing date, i.e. there is no delay. The model diagnostic outputs refer to this modified instrument. In general the actual market instrument including the delay is still matched very well though the calibration is done on a slightly different instrument.
AdjustYts and AdjustDigitals are experimental options. Specifying AdjustYts may have a negative impact on the volatility smile match, so it should be used with special care. For long term calibration it seems an interesting option though.
A bad fit to the initial yield term structure may be due to a non suitable input smile or accumulating numerical errors in very long term calibrations. The former point is adressed by smile pretreatment options. The latter point may be tackled by higher values for the numerical parameters possibly together with NTL high precision computing.
When using a shifted lognormal smile input the lower rate bound is adjusted by the shift so that a lower bound of 0.0 always corresponds to the lower bound of the shifted distribution.
If a custom smile is used, this will take full responsibility of inverting digital prices to market rates, so digitalGap, marketRateAccuracy, lowerRateBound, upperRateBound are irrelavant and the smile moneyness checkpoints are only used for the debug model output in this setup.
Definition at line 99 of file markovfunctional.hpp.
MarkovFunctional | ( | const Handle< YieldTermStructure > & | termStructure, |
Real | reversion, | ||
std::vector< Date > | volstepdates, | ||
std::vector< Real > | volatilities, | ||
const Handle< SwaptionVolatilityStructure > & | swaptionVol, | ||
const std::vector< Date > & | swaptionExpiries, | ||
const std::vector< Period > & | swaptionTenors, | ||
const ext::shared_ptr< SwapIndex > & | swapIndexBase, | ||
MarkovFunctional::ModelSettings | modelSettings = ModelSettings() |
||
) |
MarkovFunctional | ( | const Handle< YieldTermStructure > & | termStructure, |
Real | reversion, | ||
std::vector< Date > | volstepdates, | ||
std::vector< Real > | volatilities, | ||
const Handle< OptionletVolatilityStructure > & | capletVol, | ||
const std::vector< Date > & | capletExpiries, | ||
ext::shared_ptr< IborIndex > | iborIndex, | ||
MarkovFunctional::ModelSettings | modelSettings = ModelSettings() |
||
) |
const ModelSettings & modelSettings | ( | ) | const |
Definition at line 325 of file markovfunctional.hpp.
const MarkovFunctional::ModelOutputs & modelOutputs | ( | ) | const |
const Date & numeraireDate | ( | ) | const |
Definition at line 328 of file markovfunctional.hpp.
const Time & numeraireTime | ( | ) | const |
const Array & volatility | ( | ) | const |
|
overridevirtual |
Calibrate to a set of market instruments (usually caps/swaptions)
An additional constraint can be passed which must be satisfied in addition to the constraints of the model.
Reimplemented from CalibratedModel.
Definition at line 333 of file markovfunctional.hpp.
void calibrate | ( | const std::vector< ext::shared_ptr< BlackCalibrationHelper > > & | helpers, |
OptimizationMethod & | method, | ||
const EndCriteria & | endCriteria, | ||
const Constraint & | constraint = Constraint() , |
||
const std::vector< Real > & | weights = std::vector<Real>() , |
||
const std::vector< bool > & | fixParameters = std::vector<bool>() |
||
) |
|
overridevirtual |
This method must be implemented in derived classes. An instance of Observer does not call this method directly: instead, it will be called by the observables the instance registered with when they need to notify any changes.
Reimplemented from CalibratedModel.
Definition at line 359 of file markovfunctional.hpp.
|
overrideprotectedvirtual |
Implements Gaussian1dModel.
Definition at line 774 of file markovfunctional.cpp.
|
overrideprotectedvirtual |
Implements Gaussian1dModel.
Definition at line 792 of file markovfunctional.cpp.
|
overrideprotectedvirtual |
Reimplemented from CalibratedModel.
Definition at line 380 of file markovfunctional.hpp.
|
overrideprotectedvirtual |
This method must implement any calculations which must be (re)done in order to calculate the desired results.
Reimplemented from Gaussian1dModel.
Definition at line 389 of file markovfunctional.hpp.
|
protected |
|
private |
Definition at line 132 of file markovfunctional.cpp.
|
private |
Definition at line 88 of file markovfunctional.cpp.
|
private |
Definition at line 94 of file markovfunctional.cpp.
|
private |
Definition at line 112 of file markovfunctional.cpp.
|
private |
Definition at line 284 of file markovfunctional.cpp.
|
private |
Definition at line 439 of file markovfunctional.cpp.
Definition at line 234 of file markovfunctional.cpp.
|
private |
|
private |
Definition at line 746 of file markovfunctional.cpp.
Definition at line 702 of file markovfunctional.cpp.
Definition at line 741 of file markovfunctional.cpp.
Definition at line 805 of file markovfunctional.cpp.
|
private |
Definition at line 942 of file markovfunctional.cpp.
|
private |
Definition at line 965 of file markovfunctional.cpp.
|
private |
Definition at line 991 of file markovfunctional.cpp.
|
private |
Definition at line 1090 of file markovfunctional.cpp.
|
private |
Definition at line 1019 of file markovfunctional.cpp.
|
private |
Definition at line 497 of file markovfunctional.hpp.
|
mutableprivate |
Definition at line 498 of file markovfunctional.hpp.
|
private |
Definition at line 500 of file markovfunctional.hpp.
|
private |
Definition at line 502 of file markovfunctional.hpp.
|
private |
Definition at line 505 of file markovfunctional.hpp.
|
private |
Definition at line 507 of file markovfunctional.hpp.
|
private |
Definition at line 508 of file markovfunctional.hpp.
|
private |
Definition at line 510 of file markovfunctional.hpp.
|
mutableprivate |
Definition at line 511 of file markovfunctional.hpp.
|
mutableprivate |
Definition at line 512 of file markovfunctional.hpp.
|
private |
Definition at line 514 of file markovfunctional.hpp.
|
private |
Definition at line 516 of file markovfunctional.hpp.
|
mutableprivate |
Definition at line 517 of file markovfunctional.hpp.
|
private |
Definition at line 519 of file markovfunctional.hpp.
|
private |
Definition at line 520 of file markovfunctional.hpp.
|
private |
Definition at line 522 of file markovfunctional.hpp.
|
private |
Definition at line 522 of file markovfunctional.hpp.
|
private |
Definition at line 523 of file markovfunctional.hpp.
|
private |
Definition at line 524 of file markovfunctional.hpp.
|
private |
Definition at line 525 of file markovfunctional.hpp.
|
mutableprivate |
Definition at line 527 of file markovfunctional.hpp.
|
mutableprivate |
Definition at line 528 of file markovfunctional.hpp.
|
private |
Definition at line 529 of file markovfunctional.hpp.
|
private |
Definition at line 531 of file markovfunctional.hpp.
|
private |
Definition at line 532 of file markovfunctional.hpp.
Definition at line 534 of file markovfunctional.hpp.
Definition at line 535 of file markovfunctional.hpp.