Heston Model Code in test suite

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Heston Model Code in test suite

Theo Boafo
Hi,

I copied the code below for heston model in test-suite into a separate project and run it in debug, 

The initial heston parameters, which I think are initial guesses do not change after model calibation. ie when I check say kappa value via model->kappa(), its value is the same as before.  Am I missing something here.

Also the check for feller condition being satisfied ie 2kappa*theta > vol of vol * vol of vol, does it apply to the initial guess parameters?

Regards

Theo

void HestonModelTest::testDAXCalibration() {

    BOOST_TEST_MESSAGE(
             "Testing Heston model calibration using DAX volatility data...");

    SavedSettings backup;

    Date settlementDate(5, July, 2002);
    Settings::instance().evaluationDate() = settlementDate;

    CalibrationMarketData marketData = getDAXCalibrationMarketData();
    
    const Handle<YieldTermStructure> riskFreeTS = marketData.riskFreeTS;
    const Handle<YieldTermStructure> dividendTS = marketData.dividendYield;
    const Handle<Quote> s0 = marketData.s0;

    const std::vector<boost::shared_ptr<CalibrationHelper> > options
                                                    = marketData.options;

    const Real v0=0.1;
    const Real kappa=1.0;
    const Real theta=0.1;
    const Real sigma=0.5;
    const Real rho=-0.5;

    boost::shared_ptr<HestonProcess> process(new HestonProcess(
              riskFreeTS, dividendTS, s0, v0, kappa, theta, sigma, rho));

    boost::shared_ptr<HestonModel> model(new HestonModel(process));

    boost::shared_ptr<PricingEngine> engine(
                                         new AnalyticHestonEngine(model, 64));

    for (Size i = 0; i < options.size(); ++i)
        options[i]->setPricingEngine(engine);

    LevenbergMarquardt om(1e-8, 1e-8, 1e-8);
    model->calibrate(options, om, EndCriteria(400, 40, 1.0e-8, 1.0e-8, 1.0e-8));


------------------------------------------------------------------------------
CenturyLink Cloud: The Leader in Enterprise Cloud Services.
Learn Why More Businesses Are Choosing CenturyLink Cloud For
Critical Workloads, Development Environments & Everything In Between.
Get a Quote or Start a Free Trial Today.
http://pubads.g.doubleclick.net/gampad/clk?id=119420431&iu=/4140/ostg.clktrk
_______________________________________________
QuantLib-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/quantlib-users
Reply | Threaded
Open this post in threaded view
|

Re: Heston Model Code in test suite

Klaus Spanderen-2

Hi

 

if I'm adding the following lines after the calibrate method

 

std::cout << "v0 : " << model->v0() << std::endl

<< "kappa: " <<model->kappa() << std::endl

<< "theta: " <<model->theta() << std::endl

<< "sigma: " <<model->sigma() << std::endl

<< "rho : " <<model->rho() << std::endl;

 

then I'm getting the expected result

 

v0 : 0.195662

kappa: 15.6628

theta: 0.0745911

sigma: 3.3619

rho : -0.511493

 

The Feller constraint is only applied if you add an instance of the class FellerConstraint to the calibrate call, e.g.

 

model->calibrate(options, om, EndCriteria(400, 40,

1.0e-8, 1.0e-8,1.0e-8),

HestonModel::FellerConstraint());

 

 

can you please send a copy of your standalone program?

 

regards

Klaus

 

On Thursday, January 23, 2014 11:28:21 AM Theo Boafo wrote:

Hi,


I copied the code below for heston model in test-suite into a separate project and run it in debug, 


The initial heston parameters, which I think are initial guesses do not change after model calibation. ie when I check say kappa value via model->kappa(), its value is the same as before.  Am I missing something here.


Also the check for feller condition being satisfied ie 2kappa*theta > vol of vol * vol of vol, does it apply to the initial guess parameters?


Regards


Theo


void HestonModelTest::testDAXCalibration() {


    BOOST_TEST_MESSAGE(

             "Testing Heston model calibration using DAX volatility data...");


    SavedSettings backup;


    Date settlementDate(5, July, 2002);

    Settings::instance().evaluationDate() = settlementDate;


    CalibrationMarketData marketData = getDAXCalibrationMarketData();

    

    const Handle<YieldTermStructure> riskFreeTS = marketData.riskFreeTS;

    const Handle<YieldTermStructure> dividendTS = marketData.dividendYield;

    const Handle<Quote> s0 = marketData.s0;


    const std::vector<boost::shared_ptr<CalibrationHelper> > options

                                                    = marketData.options;


    const Real v0=0.1;

    const Real kappa=1.0;

    const Real theta=0.1;

    const Real sigma=0.5;

    const Real rho=-0.5;


    boost::shared_ptr<HestonProcess> process(new HestonProcess(

              riskFreeTS, dividendTS, s0, v0, kappa, theta, sigma, rho));


    boost::shared_ptr<HestonModel> model(new HestonModel(process));


    boost::shared_ptr<PricingEngine> engine(

                                         new AnalyticHestonEngine(model, 64));


    for (Size i = 0; i < options.size(); ++i)

        options[i]->setPricingEngine(engine);


    LevenbergMarquardt om(1e-8, 1e-8, 1e-8);

    model->calibrate(options, om, EndCriteria(400, 40, 1.0e-8, 1.0e-8, 1.0e-8));





------------------------------------------------------------------------------
CenturyLink Cloud: The Leader in Enterprise Cloud Services.
Learn Why More Businesses Are Choosing CenturyLink Cloud For
Critical Workloads, Development Environments & Everything In Between.
Get a Quote or Start a Free Trial Today.
http://pubads.g.doubleclick.net/gampad/clk?id=119420431&iu=/4140/ostg.clktrk
_______________________________________________
QuantLib-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/quantlib-users