Login  Register

Re: Markov Functional Model

Posted by Klaus Spanderen-2 on Dec 03, 2012; 8:57pm
URL: http://quantlib.414.s1.nabble.com/Markov-Functional-Model-tp13770p13778.html

Hi Peter,

 

impressive! ...and it will take some time to browse throw the code.

 

regards

Klaus

 

On Sunday, December 02, 2012 09:03:54 PM Peter Caspers wrote:

> Hi,

>

> I implemented a Markov functional model which I would like to contribute

> to the lib. I would consider the development to be something like an

> alpha version.

>

> The model is an one factor interest rate model with a non parametric

> numeraire that can be fitted to a set of (arbitrage free) smiles on an

> option expiry grid. In addition a volatility function can be used to

> calibrate to a second instrument set (but only for one strike per

> expiry). An example would be a numeraire calibration to constant

> maturity swaption smiles which allows to recover market cms coupon

> prices. As a second instrument set atm coterminal swaptions can be

> chosen. The resulting model is then a good candidate for pricing

> callable cms swaps. The mean reversion parameter in the model is fixed,

> i.e. it can not be calibrated, but must be given externally. It can be

> used to control intertemporal correlations. References can be found in

> the documentation mentioned below.

>

> The package comes with the model, an implementation of Kahale's method

> for arbitrage free smile extrapolation (because arbitrage free smile

> input is essential for the numeraire to calibrate) and vanilla pricing

> engines for caps and swaptions. The swaption engine can also handle

> bermudan exercise rights. At the moment all engines are based on

> numerical integration. PDE engines and more product support will follow

> soon.

>

> You can find the code on github. I updated only the project files for

> msvc10, but it should be easy to include the relevant files in other

> enviroments. They are located in ql/experimental/models/markovfunctional.

>

> https://github.com/pcaspers/quantlib/commit/879c0fdd4f4149facdc8e771d838acaf

> a7d6aae9

>

> A good starting point is probably running the test-suite to which I

> added a suite for the mf model which can be found in

> test-suite/markovfunctional.xpp.

>

> There are some changes in the ql I made, some essential for the model to

> work, others which I found worthwhile to do in the context and which

> support the test cases to run smoothly. I posted some of these changes

> on this list in the past, but I summarize all of them at the end of this

> mail.

>

> Any feedback is highly appreciated. There is also some documentation

> available here

>

> http://papers.ssrn.com/sol3/papers.cfm?abstract_id=2183721

>

> Thank you and kind regards

> Peter

>

>

> Changes to the lib I made:

>

> 1 ql/math/cubicinterpolation.hpp

>

> essential for mf model, I added the Lagrange boundary condition. I

> tested against the MatLab implementation. Works fine.

>

>

> 2 ql/math/sabrinterpolation.hpp

>

> not essential for mf model, but necessary for the test suite to run.

>

> I use a derivative of swaptionvolcube1 for daily swaption smile

> calibration for quite a time now. I noticed that two problems occur from

> time to time: First, calibration is not satisfactory because of unlucky

> start values. The solution for this I implemented is not very smart, but

> it is working well and is still fast enough. Secondly (very rarely)

> calibration stops with error values. I located the problem to be the

> transformation of valid parameters to numeric error values during

> optimization. Fix is very easy.

>

> More specifically I added a try and error method for calibration. Up to

> maxGuesses start values for the calibration are generated. If the error

> is below errorAccept the current calibration is returned immedeately

> without further tries. Otherwise the best calibration seen is returned.

> The error here may be specified to be the average error instead of the

> maximum error. The parameter transformation is adjusted to ensure that

> valid parameter values are not

> transformed into error values during calibration.

>

>

> 3 ql/models/calibrationhelper.xpp

>

> not essential for mf model, but necessary for test suite to run.

>

> I made the calibration helpers lazy objects. Seems reasonable because

> otherwise market data structures loose their lazy behaviour.

>

>

> 4 ql/models/model.xpp

>

> essential for mf model. I replaced the update() call during calibration

> by generateArguments() and notifyObservers(). This allows to separate

> the smile update triggered by market data change from the numeraire

> update triggered by model volatility changes.

> The calibration to a second instrument set is faster then. Behaviour of

> existing models is not affected by this change.

>

>

> 5 ql/pricingengines/blackformula.xpp

>

> not essential for mf model, but model trace output may contain false

> vega for zero strike, which I corrected.

>

>

> 6 ql/termstructures/volatility/optionlet/strippedoptionletadapter.xpp

>

> not essential for mf model, but if you want to calibrate the numeraire

> to caplet smiles, you need a volatility structure returning a smile section.

>

> I added a smile section section implementation returning a smooth spline

> interpolated smile curve. The markov functional

> model requires the volatility structure to provide a smile section. In

> addition this should be smooth in prices, at least C^1,

> to ensure smooth digital prices. I did not put much energy in this

> enhancement, just wanted to make the model work with cap smiles.

>

>

> 7 ql/termstructures/volatility/sabrsmilesection.xpp

>

> not essential for mf model, but needed if you want to feed

> sabrsmilesections for numeraire calibration. I floored the strike at

> 0.1bp for volatility computation to avoid problems for strikes near zero.

>

>

> 8 ql/termstructures/volatility/smilesection.xpp

>

> essential for mf model. I added some supporting functions including

> arbitrage tests and option price calculation. The best place for these

> functions seemed here.

>

>

> 9 ql/termstructures/volatility/swaption/swaptionvolcube1.xpp

>

> not essential for mf model, just the same comments as under 2 apply.

>

> I added functionality to exclude negative strikes in single smiles, so

> that the -200bp quotes can be used where reasonable. Furthermore I added

> the same functionality as in sabrinterpolation above.

>

>

> ----------------------------------------------------------------------------

> -- Keep yourself connected to Go Parallel:

> DESIGN Expert tips on starting your parallel project right.

> http://goparallel.sourceforge.net/

> _______________________________________________

> QuantLib-dev mailing list

> [hidden email]

> https://lists.sourceforge.net/lists/listinfo/quantlib-dev


------------------------------------------------------------------------------
Keep yourself connected to Go Parallel:
BUILD Helping you discover the best ways to construct your parallel projects.
http://goparallel.sourceforge.net
_______________________________________________
QuantLib-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/quantlib-dev