Re: Caching the pricing engine

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