Posted by
animesh on
Aug 31, 2010; 12:17pm
URL: http://quantlib.414.s1.nabble.com/Himalayan-Option-Worries-tp6914p6915.html
I located the error in the code. I think this is probably due to
design.
Generally people would like to price options using different
processes. For example Himalayan Option is priced using BlackScholes
process in the example. When I change it to another process like
Merton76Process (which also is Stochastic1D - as per the
guidelines), I should be able to price it. The error is when it
delegates to casting to generalized Black Scholes process, the
following code in file mchimalayaengine.hpp.
template <class RNG, class S>
inline
boost::shared_ptr<typename
MCHimalayaEngine<RNG,S>::path_pricer_type>
MCHimalayaEngine<RNG,S>::pathPricer() const {
boost::shared_ptr<GeneralizedBlackScholesProcess> process
=
boost::dynamic_pointer_cast<GeneralizedBlackScholesProcess>(
processes_->process(0));
QL_REQUIRE(process, "Black-Scholes process required");
return boost::shared_ptr<
typename
MCHimalayaEngine<RNG,S>::path_pricer_type>(
new HimalayaMultiPathPricer(arguments_.payoff,
process->riskFreeRate()->discount(
arguments_.exercise->lastDate())));
}
The cast is throwing the error. If I change it to
"STATIC CAST", the error is
gone!
boost::shared_ptr<GeneralizedBlackScholesProcess>
process =
boost::static_pointer_cast<GeneralizedBlackScholesProcess>(
processes_->process(0));
The developer's might have better suggestions. Any views on this??
Is this a design problem?
Thanks in advance.
On 8/31/10 1:57 AM, animesh saxena wrote:
Below
is the sample code for Himalayan Option valuation. It works for
BlackScholes process but if I change it to slightly fancier
Merton76Process (Jumps), it throws out an ugly SIG ABORT
exception. Can anyone help me in figuring out the mistake. "Just
copy paste the code below to test it out".
Thanks in advance!
Date today = Settings::instance().evaluationDate();
DayCounter dc = Actual360();
std::vector<Date> fixingDates;
for (Size i=0; i<5; ++i)
fixingDates.push_back(today+i*90);
Real strike = 100.0;
HimalayaOption option(fixingDates, strike);
Handle<YieldTermStructure> riskFreeRate(flatRate(today,
0.05, dc));
std::vector<boost::shared_ptr<StochasticProcess1D>
> processes(4);
boost::shared_ptr<SimpleQuote> spot(new
SimpleQuote(100));
boost::shared_ptr<SimpleQuote> qRate(new
SimpleQuote(0.01));
boost::shared_ptr<YieldTermStructure> qTS =
flatRate(today, qRate, dc);
boost::shared_ptr<SimpleQuote> rRate(new
SimpleQuote(0.05));
boost::shared_ptr<YieldTermStructure> rTS =
flatRate(today, rRate, dc);
boost::shared_ptr<SimpleQuote> vol(new
SimpleQuote(0.20));
boost::shared_ptr<BlackVolTermStructure> volTS =
flatVol(today, vol, dc);
boost::shared_ptr<SimpleQuote> jumpIntensity(new
SimpleQuote(1));
boost::shared_ptr<SimpleQuote> meanLogJump(new
SimpleQuote(0.2));
boost::shared_ptr<SimpleQuote> jumpVol(new
SimpleQuote(0.2));
processes[0]= boost::shared_ptr<StochasticProcess1D>(new
Merton76Process(Handle<Quote>(spot),Handle<YieldTermStructure>(qTS),Handle<YieldTermStructure>(rTS),Handle<BlackVolTermStructure>(volTS),Handle<Quote>(jumpIntensity),Handle<Quote>(meanLogJump),Handle<Quote>(jumpVol)));
processes[1]= boost::shared_ptr<StochasticProcess1D>(new
Merton76Process(Handle<Quote>(spot),Handle<YieldTermStructure>(qTS),Handle<YieldTermStructure>(rTS),Handle<BlackVolTermStructure>(volTS),Handle<Quote>(jumpIntensity),Handle<Quote>(meanLogJump),Handle<Quote>(jumpVol)));
processes[2]= boost::shared_ptr<StochasticProcess1D>(new
Merton76Process(Handle<Quote>(spot),Handle<YieldTermStructure>(qTS),Handle<YieldTermStructure>(rTS),Handle<BlackVolTermStructure>(volTS),Handle<Quote>(jumpIntensity),Handle<Quote>(meanLogJump),Handle<Quote>(jumpVol)));
processes[3]= boost::shared_ptr<StochasticProcess1D>(new
Merton76Process(Handle<Quote>(spot),Handle<YieldTermStructure>(qTS),Handle<YieldTermStructure>(rTS),Handle<BlackVolTermStructure>(volTS),Handle<Quote>(jumpIntensity),Handle<Quote>(meanLogJump),Handle<Quote>(jumpVol)));
Matrix correlation(4,4);
correlation[0][1] = 0.29;
correlation[0][2] = 0.29;
correlation[0][3] = 0.39;
correlation[1][0] = 0.49;
correlation[1][2] = 0.59;
correlation[1][3] = 0.69;
correlation[2][2] = 0.19;
correlation[2][3] = 0.29;
correlation[3][0] = correlation[0][3];
correlation[3][1] = correlation[1][3];
correlation[3][2] = correlation[2][3];
correlation[2][0] = correlation[0][2];
correlation[2][1] = correlation[1][2];
correlation[1][1] = 1.00;
correlation[0][0] = 1.00;
correlation[3][3] = 1.00;
BigNatural seed = 42;
int i_samples;
i_samples = 4999;
Size fixedSamples;
boost::shared_ptr<StochasticProcessArray> process(new
StochasticProcessArray(processes, correlation));
Real value;
option.setPricingEngine(MakeMCHimalayaEngine<PseudoRandom>(process).withSamples(fixedSamples).withSeed(seed));
value = option.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