Posted by
Robert Kubrick on
URL: http://quantlib.414.s1.nabble.com/Caching-the-pricing-engine-tp6574p6578.html
Oops, my bad. The problem was due to the option arguments, not the
quotes. I thought setupArguments() was mean't to set payoff and
exercise at runtime, but it actually retrieves the current values.
Is there a way to change strike and exercise of an existing option?
Or can I setup an option with multiple strikes/exercises?
On Sep 20, 2008, at 6:56 PM, Robert Kubrick wrote:
> I'm doing exactly what you suggested for price, volatility and
> yield but I get the wrong npv and greeks values.
>
>
> Calc::Calc(double riskFreeRate, boost::gregorian::date settlement):
> _riskFreeRate(riskFreeRate),
> _settlement(Day(settlement.day()), Month(settlement.month
> ().as_enum()), Year(settlement.year())),
> _dayCounter(Actual365Fixed()),
> _calendar(TARGET()),
> _underlyingQuote(new SimpleQuote(1)),
> _volQuote(new SimpleQuote(1)),
> _yieldQuote(new SimpleQuote(1))
> {
> date today = day_clock::local_day();
> Settings::instance().evaluationDate() = Date(Day(today.day()),
> Month(today.month().as_enum()), Year(today.year()));
>
> Date exerciseDate(Day(30), Month(12), Year(2020));
> _pExercise = shared_ptr<Exercise>(new EuropeanExercise
> (exerciseDate));
>
> _pPayoff = shared_ptr<StrikedTypePayoff>(new PlainVanillaPayoff
> (Option::Call, 1));
>
> _pFlatVolTS = shared_ptr<BlackVolTermStructure>(new
> BlackConstantVol(_settlement,
>
> _calendar,
>
> Handle<Quote>(_volQuote),
>
> _dayCounter));
>
> _pFlatTermStruct = shared_ptr<YieldTermStructure>(new FlatForward
> (_settlement,
>
> _riskFreeRate,
>
> _dayCounter));
>
> _pFlatDividendTermStruct = shared_ptr<YieldTermStructure>(new
> FlatForward(_settlement,
>
> Handle<Quote>(_yieldQuote),
>
> _dayCounter));
>
> _pProcess = shared_ptr<BlackScholesMertonProcess>(new
> BlackScholesMertonProcess(Handle<Quote>(_underlyingQuote),
>
> Handle<YieldTermStructure>(_pFlatDividendTermStruct),
>
> Handle<YieldTermStructure>(_pFlatTermStruct),
>
> Handle<BlackVolTermStructure>(_pFlatVolTS)));
>
> _pPE = shared_ptr<PricingEngine>(new AnalyticEuropeanEngine
> (_pProcess));
>
> _pOption = new EuropeanOption(_pPayoff, _pExercise);
> _pOption->setPricingEngine(_pPE);
> }
>
>
> void Calc::run(Side side, double price, int strike, double yield,
> const date& exercise, double vol)
> {
> _underlyingQuote->setValue(price);
> _volQuote->setValue(vol);
> _yieldQuote->setValue(yield);
>
> QuantLib::Option::arguments args;
> args.payoff = shared_ptr<StrikedTypePayoff>(new PlainVanillaPayoff
> (side == CALL ? Option::Call : Option::Put, strike));
> args.exercise = shared_ptr<Exercise>(new EuropeanExercise(Date(Day
> (exercise.day()), Month(exercise.month().as_enum()), Year
> (exercise.year()))));
>
> _pOption->setupArguments(&args);
>
> cout << "NPV: " << _pOption->NPV() << endl;
> cout << "Delta: " << _pOption->delta() << endl;
> cout << "Gamma: " << _pOption->gamma() << endl;
>
> /*
> _npv = _pOption->NPV();
> _delta = _pOption->delta();
> _gamma = _pOption->gamma();
> _vega = _pOption->vega();
> _theta = _pOption->theta();
> _rho = _pOption->rho();
> */
> }
>
> On Sep 15, 2008, at 3:57 AM, Luigi Ballabio wrote:
>
>> On Sun, 2008-09-14 at 19:16 -0400, Robert Kubrick wrote:
>>> Is there a way to dynamically change the engine process parameters,
>>> volatility and yield in particular?
>>
>> Yes---when you write:
>>
>>
>>>> Handle<BlackVolTermStructure> flatVolTS
>>>> (shared_ptr<BlackVolTermStructure>(new BlackConstantVol
>>>> (_settlement,
>>>>
>>>> _calendar,
>>>>
>>>> vol,
>>>>
>>>> _dayCounter)));
>>>>
>>
>> Do instead:
>>
>> shared_ptr<SimpleQuote> volQuote(new SimpleQuote(0.20));
>>
>> Handle<BlackVolTermStructure>
>> flatVolTS(shared_ptr<BlackVolTermStructure>(
>> new BlackConstantVol(_settlement,
>> _calendar,
>> Handle<Quote>(volQuote),
>> _dayCounter)));
>>
>> after you've built your options, you can execute:
>>
>> volQuote->setValue(0.25);
>>
>> and all the options will see the new volatility (i.e., they'll
>> return a
>> different value when you call NPV() etc.)
>>
>> Luigi
>>
>>
>>
>> --
>>
>> Better to remain silent and be thought a fool than to speak out and
>> remove all doubt.
>> -- Abraham Lincoln
>>
>
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/_______________________________________________
QuantLib-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/quantlib-users