Cliquet Pricing

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

Cliquet Pricing

animesh

I have taken the code from test-suite. Basically some form Cliquet and some from Heston. I wanted to pricing Cliquet option using Heston Process. If I simply use CliquetOption and setPricingEngine to AnalyticHestonEngine then it's giving ABORT SIGNAL. Can anyone help me with this??
Thanks in advance....

'The important lines for quick look are
    boost::shared_ptr<HestonModel> model(new HestonModel(process));
   
    boost::shared_ptr<PricingEngine> engine(
                                            new AnalyticHestonEngine(model, 64));
.......
......
....... (Model calibration)......
......
    CliquetOption option1(payoff, exercise, reset);
    option1.setPricingEngine(engine);
    Real ff = option1.NPV()
(error thrown just as NPV is called!)

Code pasted

SavedSettings backup;
   
    Date settlementDate(5, July, 2002);
    Settings::instance().evaluationDate() = settlementDate;
   
    DayCounter dayCounter = Actual365Fixed();
    Calendar calendar = TARGET();
   
    Integer t[] = { 13, 41, 75, 165, 256, 345, 524, 703 };
    Rate r[] = { 0.0357,0.0349,0.0341,0.0355,0.0359,0.0368,0.0386,0.0401 };
   
    std::vector<Date> dates;
    std::vector<Rate> rates;
    dates.push_back(settlementDate);
    rates.push_back(0.0357);
    Size i;
    for (i = 0; i < 8; ++i) {
        dates.push_back(settlementDate + t[i]);
        rates.push_back(r[i]);
    }
    // FLOATING_POINT_EXCEPTION
    Handle<YieldTermStructure> riskFreeTS(
                                          boost::shared_ptr<YieldTermStructure>(
                                                                                new ZeroCurve(dates, rates, dayCounter)));
   
    Handle<YieldTermStructure> dividendTS(
                                          flatRate(settlementDate, 0.0, dayCounter));
   
    Volatility v[] =
    { 0.6625,0.4875,0.4204,0.3667,0.3431,0.3267,0.3121,0.3121,
        0.6007,0.4543,0.3967,0.3511,0.3279,0.3154,0.2984,0.2921,
        0.5084,0.4221,0.3718,0.3327,0.3155,0.3027,0.2919,0.2889,
        0.4541,0.3869,0.3492,0.3149,0.2963,0.2926,0.2819,0.2800,
        0.4060,0.3607,0.3330,0.2999,0.2887,0.2811,0.2751,0.2775,
        0.3726,0.3396,0.3108,0.2781,0.2788,0.2722,0.2661,0.2686,
        0.3550,0.3277,0.3012,0.2781,0.2781,0.2661,0.2661,0.2681,
        0.3428,0.3209,0.2958,0.2740,0.2688,0.2627,0.2580,0.2620,
        0.3302,0.3062,0.2799,0.2631,0.2573,0.2533,0.2504,0.2544,
        0.3343,0.2959,0.2705,0.2540,0.2504,0.2464,0.2448,0.2462,
        0.3460,0.2845,0.2624,0.2463,0.2425,0.2385,0.2373,0.2422,
        0.3857,0.2860,0.2578,0.2399,0.2357,0.2327,0.2312,0.2351,
        0.3976,0.2860,0.2607,0.2356,0.2297,0.2268,0.2241,0.2320 };
   
    Handle<Quote> s0(boost::shared_ptr<Quote>(new SimpleQuote(4468.17)));
    Real strike[] = { 3400,3600,3800,4000,4200,4400,
        4500,4600,4800,5000,5200,5400,5600 };
   
    std::vector<boost::shared_ptr<CalibrationHelper> > options;
   
    for (Size s = 0; s < 13; ++s) {
        for (Size m = 0; m < 8; ++m) {
            Handle<Quote> vol(boost::shared_ptr<Quote>(
                                                       new SimpleQuote(v[s*8+m])));
           
            Period maturity((int)((t[m]+3)/7.), Weeks); // round to weeks
            options.push_back(boost::shared_ptr<CalibrationHelper>(
                                                                   new HestonModelHelper(maturity, calendar,
                                                                                         s0->value(), strike[s], vol,
                                                                                         riskFreeTS, dividendTS,
                                                                                         CalibrationHelper::ImpliedVolError)));
        }
    }
   
    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 (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));
   
   
    Date today = Date::todaysDate();
    DayCounter dc = Actual360();
   
    boost::shared_ptr<SimpleQuote> spot(new SimpleQuote(60.0));
    boost::shared_ptr<SimpleQuote> qRate(new SimpleQuote(0.04));
    boost::shared_ptr<YieldTermStructure> qTS = flatRate(today, qRate, dc);
    boost::shared_ptr<SimpleQuote> rRate(new SimpleQuote(0.08));
    boost::shared_ptr<YieldTermStructure> rTS = flatRate(today, rRate, dc);
    boost::shared_ptr<SimpleQuote> vol(new SimpleQuote(0.30));
    boost::shared_ptr<BlackVolTermStructure> volTS = flatVol(today, vol, dc);
   
    std::vector<Date> reset;
    reset.push_back(today + 90);
    Date maturity = today + 360;
    Option::Type type = Option::Call;
    Real moneyness = 1.1;
   
    boost::shared_ptr<PercentageStrikePayoff> payoff(
                                                     new PercentageStrikePayoff(type, moneyness));
    boost::shared_ptr<EuropeanExercise> exercise(
                                                 new EuropeanExercise(maturity));
   
    CliquetOption option1(payoff, exercise, reset);
    option1.setPricingEngine(engine);
    Real ff = option1.NPV()

-- 
Regards,
Animesh Saxena

(http://quantanalysis.wordpress.com)
Ph: (+91)9920098221

------------------------------------------------------------------------------
This SF.net Dev2Dev email is sponsored by:

Show off your parallel programming skills.
Enter the Intel(R) Threading Challenge 2010.
http://p.sf.net/sfu/intel-thread-sfd
_______________________________________________
QuantLib-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/quantlib-users
Reply | Threaded
Open this post in threaded view
|

Re: Cliquet Pricing

Luigi Ballabio
On Sat, 2010-09-04 at 03:32 +0530, animesh saxena wrote:
>
> I have taken the code from test-suite. Basically some form Cliquet and
> some from Heston. I wanted to pricing Cliquet option using Heston
> Process. If I simply use CliquetOption and setPricingEngine to
> AnalyticHestonEngine then it's giving ABORT SIGNAL. Can anyone help me
> with this??

There's a rather tight coupling between instruments and engines. The
AnalyticHestonEngine calculates the price of vanilla call/put options
and won't work with cliquet options (it doesn't know the formula for
those.)

Luigi


--

Always code as if the guy who ends up maintaining your code will be
a violent psychopath who knows where you live.
-- Martin Golding



------------------------------------------------------------------------------
Automate Storage Tiering Simply
Optimize IT performance and efficiency through flexible, powerful,
automated storage tiering capabilities. View this brief to learn how
you can reduce costs and improve performance.
http://p.sf.net/sfu/dell-sfdev2dev
_______________________________________________
QuantLib-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/quantlib-users