Ok the problem was the debug mode,thanks a lot,Igor------------------------------------------------------------------------------2017-04-29 19:25 GMT+02:00 Peter Caspers <[hidden email]>:Hi Igor,
this is what I get
~/tmp$ ./igor
Option type = Call
Option maturity = April 4th, 2018
Underlying = 0.748571
Strike = 0.74
Risk-free interest rate = 2.2538 %
Dividend yield = 4.1250 %
Volatility = 7.0537 %
Time-length between successive fixings = weekly time step
Previous fixings = 0
Discrete ArithMC Price: 0.04753356095
in 0.821526 s
Are you on Windows? Maybe you compiled in Debug mode then? That activates a lot of runtime diagnostics.
Best Regards
Peter
> ------------------------------------------------------------------------------
> On 28 Apr 2017, at 10:12, Igor Swie <[hidden email]> wrote:
>
> Hi,
> I have tried to price arithmetic asian options with the Monte Carlo pricer and a complete volatility surface.
> There are about 80 points for the construction of the volatility surface and I run the Monte Carlo simulation with 1500 paths.
> I get the result after 1 or 2 minutes which is incredibly slow compared to other fiancnial softwares (less than 1s).
> Who would have an idea of the problem?
>
> Besides is the code I used:
>
> /*************************************code********************************/
>
> void asian()
> {
> // Calendar set up
> Calendar calendar = TARGET();
> Date todaysDate(4, April, 2017);
> Settings::instance().evaluationDate() = todaysDate;
>
> DayCounter dayCounter = Actual360();
>
> // Option parameters Asian FX
> Option::Type optionType(Option::Call);
> Average::Type averageType = Average::Arithmetic;
> Date maturity(4, April, 2018);
> Real strike = 0.74;
> Volatility volatility = 0.07053702474;
> Date obsStart(4, March, 2018);
>
> Real runningSum = 0;
> Size pastFixings = 0;
> vector<Date> fixingDates;
> for (Date incrementedDate = obsStart; incrementedDate <= maturity; incrementedDate += 1)
> {
> if (calendar.isBusinessDay(incrementedDate))
> {
> fixingDates.push_back(incrementedDate);
> }
> }
>
> // Option exercise type
> boost::shared_ptr<Exercise> europeanExercise(
> new EuropeanExercise(maturity));
>
> //Model param
> Real underlying = 0.748571186;
> Spread dividendYield = 0.04125;
> Rate riskFreeRate = 0.0225377;
>
>
> // Quote handling
> Handle<Quote> underlyingH(
> boost::shared_ptr<Quote>(new SimpleQuote(underlying)));
>
> // Yield term structure handling
> Handle<YieldTermStructure> flatTermStructure(
> boost::shared_ptr<YieldTermStructure>(new FlatForward(todaysDate, dividendYield, dayCounter)));
>
> // Dividend term structure handling
> Handle<YieldTermStructure> flatDividendTermStructure(
> boost::shared_ptr<YieldTermStructure>(new FlatForward(todaysDate, riskFreeRate, dayCounter)));
>
> // Volatility structure handling: constant volatility
> Handle<BlackVolTermStructure> flatVolTermStructure(
> boost::shared_ptr<BlackVolTermStructure>(new BlackConstantVol(todaysDate, calendar, volatility, dayCounter)));
>
>
> string path = "E:\\Libraries\\QuantLib-1.9.1\\VolMatrixA.csv";
> vector<Real> strikes = {};
> GetStrikes(path, strikes);
> vector<Date> expirations;
> GetExpiryDates(path, expirations);
> Matrix volMatrix = GetVolData(path, expirations, strikes);
>
>
> BlackVarianceSurface volatilitySurface(Settings::instance().evaluationDate(),
> calendar, expirations, strikes, volMatrix, dayCounter);
>
>
> volatilitySurface.setInterpolation<Bicubic>();
> volatilitySurface.enableExtrapolation(true);
>
> const boost::shared_ptr<BlackVarianceSurface> volatilitySurfaceH(
> new BlackVarianceSurface(volatilitySurface));
> Handle<BlackVolTermStructure> volTermStructure(volatilitySurfaceH);
>
>
> // the BS equation behind
> boost::shared_ptr<BlackScholesMertonProcess> bsmProcess(
> new BlackScholesMertonProcess(underlyingH, flatDividendTermStructure, flatTermStructure, volTermStructure));
>
>
> // Payoff
> boost::shared_ptr<StrikedTypePayoff> payoffAsianOption(
> new PlainVanillaPayoff(
> Option::Type(optionType),
> strike));
>
> // Options
> DiscreteAveragingAsianOption discreteArithmeticAsianAverageOption(
> averageType,
> runningSum,
> pastFixings,
> fixingDates,
> payoffAsianOption,
> europeanExercise);
>
> // Ouputting on the screen
> cout << "Option type = " << optionType << endl;
> cout << "Option maturity = " << maturity << endl;
> cout << "Underlying = " << underlying << endl;
> cout << "Strike = " << strike << endl;
> cout << "Risk-free interest rate = " << setprecision(4) << io::rate(riskFreeRate) << endl;
> cout << "Dividend yield = " << setprecision(4) << io::rate(dividendYield) << endl;
> cout << "Volatility = " << setprecision(4) << io::volatility(volatility) << endl;
> cout << "Time-length between successive fixings = weekly time step" << endl;
> cout << "Previous fixings = " << pastFixings << endl;
> cout << setprecision(10) << endl;
>
> boost::timer timer;
>
> //Pricing engine
> discreteArithmeticAsianAverageOption.setPricingEngine(
> boost::shared_ptr<PricingEngine>(
> MakeMCDiscreteArithmeticAPEngine<LowDiscrepancy>(bsmProcess)
> .withSamples(1500)));
>
> timer.restart();
> try
> {
> cout << "Discrete ArithMC Price: " << discreteArithmeticAsianAverageOption.NPV() << endl;
> }
> catch (exception const& e) { cout << "Erreur: " << e.what() << endl; }
> cout << " in " << timer.elapsed() << " s" << endl;
>
> timer.restart();
> }
>
> /**************************end ************************************************/
>
> and the volatility data used in .csv format: first column the strikes, second column volatilities at maturity 6/27/2017 for the corresponding strikes ans so on.
>
>
> /***************************volatility data**************************************/
> Strike ,6/27/2017,9/27/2017,12/27/2017,6/27/2018,
> 0.67263,0.144183920277296,0.139374695503699,0.135526204819277,0.12885
> 0.71865,0.133703802426343,0.129893056346044,0.126909006024096,0.12175
> 0.7487,0.126860526863085,0.123701764371087,0.121209416342412,0.11695
> 0.77129,0.121720863192182,0.118881707209199,0.116979766476388,0.11381
> 0.78984,0.117581136690647,<a href="tel:+52%201%20842%20882%204572" value="+5218428824572" target="_blank">0.115218428824572,0.113899219047619,0.11163
> 0.80587,0.114363421052632,0.112523118729097,0.111637193240265,0.11019
> 0.82034,0.111728795180723,0.110489402985075,0.109987692307692,0.10921
> 0.83379,0.109805703883495,0.109100413723512,0.108870460584588,0.1086
> 0.84658,0.108581646586345,0.108250493273543,0.108197213114754,0.10829
> 0.85792,0.108190964125561,0.107986172506739,0.10796631037213,0.10822
> 0.87354,0.10859510460251,0.108310304612707,0.108232350773766,0.10849
> 0.89085,0.110043016488846,0.109404567049808,0.109102906403941,0.10919
> 0.90904,0.112447321958457,0.111343238289206,0.110615417475728,0.11036
> 0.9289,0.115567066189624,0.113888152866242,0.112830993150685,0.11201
> 0.95157,0.119454321849106,0.117151688909342,0.115569047072331,0.11433
> 0.97862,0.123858310308183,0.121275916334661,0.119199029605263,0.11731
> 1.01337,0.129434558979809,0.126231870274572,0.123929902439024,0.12145
> 1.06261,0.137335982996812,0.133099606048548,0.12994278699187,0.12723
> 1.14631,0.150767120085016,0.144773641066454,0.140163713821138,0.13547
>
> /********************************end vol data ***************************/
>
> I think it's because too many calls are made to get the local volatility.
>
> Thanks,
>
> Igor
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot_______________________________________________
> QuantLib-users mailing list
> [hidden email]
> https://lists.sourceforge.net/lists/listinfo/quantlib-users
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot_______________________________________________
QuantLib-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/quantlib-users
Free forum by Nabble | Disable Popup Ads | Edit this page |