Login  Register

Re: Problem by pricing quanto asian basket options with MC simulation (multipath)

Posted by Ed Colley on Feb 11, 2006; 3:54pm
URL: http://quantlib.414.s1.nabble.com/Problem-by-pricing-quanto-asian-basket-options-with-MC-simulation-multipath-tp4466p4467.html

I'm not familiar with quantlib, but for a MC approach to work, you  
will need to ensure that you pick a measure in which all the  
tradeable assets are martingales with respect to the same (tradeable)  
numeraire. I would guess that your asset 2 doesn't satisfy this  
condition.

Incidentally, the usual way to tackle these problems is to adjust the  
yield on the quanto underlying by the fx covariance.

  - Ed


On 10 Feb 2006, at 18:29, Giorgio Pazmandi wrote:

> Hi, we are having some problems by using the (multi)path simulation
> capabilities of quantlib for the  pricing of quanto asian basket  
> options
> (these are asian basket options where the underlying are in  different
> currencies but the payoff doesn't depend on any exchange rate). I  
> hope that
> this problem is not "out of topic" in this mailing list.
>
> To simulate this options we let run a MC simulation with 3 stocastic
> variables (the 2 underlying  prices and the exchange rate). We  
> compared our
> results with a commercial product wich prices this  kind of  
> options. As long
> as we put in the correlation matrix correlations beetwen the assets  
> our
> results match very well. When we add a correlation between the  
> assets and
> the exchange rate we get a  small effect on the price, while in the
> commercial product we see a bigger effect.
>
>
> test #1 (no correlation): Our simulation gives 8.65 +/- 0.09,  
> reference
> value is 8.64 +/- 0.08
>
> test #2: (only correlation beetween the 2 asset): Our simulation  
> gives 9.66
> +/- 0.10, reference  value is 9.65 +/- 0.09
>
> test #3: (only correlation between asset and ex.rate): Our  
> simulation gives
> 8.66 +/- 0.09 (similar  to the simulation #1), reference value is  
> 8.22 +/-
> 0.08
>
> test #4: (all the correlations): Our simulation gives 9.67 +/- 0.10  
> (similar
> simulation #2),  reference value is 9.24 +/- 0.09
>
>
> Maybe somebody has some experience with such kind of options and  
> can give us
> a hint of what we are  doing wrong. Details on our test case and on  
> our
> aproach to price it follows below.
>
> Thank in advance for any help
>
> Giorgio
>
>
>
>
>
>
> Here are the details of our test case: We consider a quanto asian  
> basket
> average rate option, which  has as underlying 2 equities quoted in
> currencies AAA and BBB (the values are not "real word"  datas):
>
> Underlying 1: current price = 75 AAA, dividend yield = 3.1%,  
> volatility =
> 20%
> Underlying 2: current price = 100 BBB, dividend yield = 2%,  
> volatility = 15%
>
> AAA risk free rate: 5.1%
> BBB risk free rate: 3.5%
> exchange rate AAA/BBB: 1.5
> volatility of exchange rate AAA/BBB: 15%
>
>
> The option is payed in currency AAA and has the payoff of a quanto  
> asian
> basket (note: in the payoff  there is no exchange rate):
>
> basket1 = underlying1[samplingDate1] + underlying2[samplingDate1]
> basket2 = underlying1[samplingDate2] + underlying2[samplingDate2]
> average = (basket1 + basket2) / 2
> payoff at expiry = max(0; average - strike)
>
> strike: 175
> sampling dates: 16.10.1998, 16.12.1998
> expiry date: 16.12.1998
>
> valuation date (today): 7.1.1998
>
> correlation matrix:
>                 ex. rate        underlying1     underlying2
> ex. rate        1               0               0.4
> underlying1     0               1               0.3
> underlying2     0.4             0.3             1
>
>
>
>
> Here is what we do to simulate this option:
>
>
> **********
>
> void RunSimulation()
> {
> // Ex. rate
> Handle<Quote> x0_1(boost::shared_ptr<Quote>(new SimpleQuote
> (1.5))); //
> current value
> Handle<YieldTermStructure> r_1(flatRate(0.051, Actual360())); //  
> "risk free
> rate"
> Handle<YieldTermStructure> q_1(flatRate(0.035, Actual360())); //  
> "dividend
> yield rate"
> Handle<BlackVolTermStructure> sigma_1(flatVol(0.15, Actual360())); //
> volatility
>
> // Underlying asset1
> Handle<Quote> x0_2(boost::shared_ptr<Quote>(new SimpleQuote
> (75.0))); //
> current value
> Handle<YieldTermStructure> r_2(flatRate(0.051, Actual360())); //  
> risk free
> rate
> Handle<YieldTermStructure> q_2(flatRate(0.031, Actual360())); //  
> dividend
> yield rate
> Handle<BlackVolTermStructure> sigma_2(flatVol(0.20, Actual360())); //
> volatility
>
> // Underlying asset2
> Handle<Quote> x0_3(boost::shared_ptr<Quote>(new SimpleQuote
> (100.0))); //
> current value
> Handle<YieldTermStructure> r_3(flatRate(0.035, Actual360())); //  
> risk free
> rate
> Handle<YieldTermStructure> q_3(flatRate(0.02, Actual360())); //  
> dividend
> yield rate
> Handle<BlackVolTermStructure> sigma_3(flatVol(0.15, Actual360())); //
> volatility
>
> Real strike = 175;
>
> // Creation of 3 stocastic processes (blackSholes)
> std::vector<boost::shared_ptr<StochasticProcess1D> > processes(3);
> processes[0] = boost::shared_ptr<StochasticProcess1D>(
>                                        new
> BlackScholesProcess(x0_1,q_1,r_1,sigma_1));
> processes[1] = boost::shared_ptr<StochasticProcess1D>(
>                                        new
> BlackScholesProcess(x0_2,q_2,r_2,sigma_2));
> processes[2] = boost::shared_ptr<StochasticProcess1D>(
>                                        new
> BlackScholesProcess(x0_3,q_3,r_3,sigma_3));
>
> // Correlation matrix
>
> /* Test #1
> Matrix correlation(3,3);
> correlation[0][0] =  1.00; correlation[0][1] =  0.00; correlation
> [0][2] =
> 0.00;
> correlation[1][0] =  0.00; correlation[1][1] =  1.00; correlation
> [1][2] =
> 0.00;
> correlation[2][0] =  0.00; correlation[2][1] =  0.00; correlation
> [2][2] =
> 1.00;
> */
>
> /* Test #2
> Matrix correlation(3,3);
> correlation[0][0] =  1.00; correlation[0][1] =  0.00; correlation
> [0][2] =
> 0.00;
> correlation[1][0] =  0.00; correlation[1][1] =  1.00; correlation
> [1][2] =
> 0.30;
> correlation[2][0] =  0.00; correlation[2][1] =  0.30; correlation
> [2][2] =
> 1.00;
> */
>
> /* Test #3
> Matrix correlation(3,3);
> correlation[0][0] =  1.00; correlation[0][1] =  0.00; correlation
> [0][2] =
> 0.40;
> correlation[1][0] =  0.00; correlation[1][1] =  1.00; correlation
> [1][2] =
> 0.00;
> correlation[2][0] =  0.40; correlation[2][1] =  0.00; correlation
> [2][2] =
> 1.00;
> */
>
> /* Test #4
> correlation[0][0] =  1.00; correlation[0][1] =  0.00; correlation
> [0][2] =
> 0.40;
> correlation[1][0] =  0.00; correlation[1][1] =  1.00; correlation
> [1][2] =
> 0.30;
> correlation[2][0] =  0.40; correlation[2][1] =  0.30; correlation
> [2][2] =
> 1.00;
> */
>
> Matrix correlation(3,3);
> correlation[0][0] =  1.00; correlation[0][1] =  0.00; correlation
> [0][2] =
> 0.40;
> correlation[1][0] =  0.00; correlation[1][1] =  1.00; correlation
> [1][2] =
> 0.30;
> correlation[2][0] =  0.40; correlation[2][1] =  0.30; correlation
> [2][2] =
> 1.00;
>
> // Creation of the stocastic process array
> boost::shared_ptr<StochasticProcess>
> process = boost::shared_ptr<StochasticProcess>(
>                            new StochasticProcessArray(processes,
> correlation));
>
> // Creation of time grid
> std::vector<Time> oTemp;
> oTemp.push_back((Time)282/365.0); // day diff between 16.10.1998 and
> 7.1.1998
> oTemp.push_back((Time)343/365.0); // day diff between 16.12.1998 and
> 7.1.1998
> TimeGrid timeGrid(oTemp.begin(), oTemp.end(), 1);
>
> std::cout << "Time grid" << std::endl;
> for (Size c = 0; c < timeGrid.size(); c++)
> std::cout << timeGrid[c] << std::endl;
> std::cout << std::endl;
>
> #ifdef USE_SOBOL
> // LowDiscrepancy (sobol)
> typedef LowDiscrepancy::rsg_type rsg_type;
> BigNatural seed = 42;
> rsg_type randomSequenceGenerator =
> LowDiscrepancy::make_sequence_generator((timeGrid.size()-1)*process-
> >size(),
> seed);
> #else
> // (pseudo)random
> typedef PseudoRandom::rsg_type rsg_type;
> BigNatural seed = 42;
> rsg_type randomSequenceGenerator =
> PseudoRandom::make_sequence_generator((timeGrid.size()-1)*process-
> >size(),
> seed);
> #endif
>
> // Creation of the (multi)path generator
> bool brownianBridge = false;
> MultiPathGenerator<rsg_type> generator(process,
>                                       timeGrid,
>                                       randomSequenceGenerator,
>                                       brownianBridge);
>
> // Setting some params
> Size numberOfSimulations = 10000;
> Size noUnderlyingAsset = 2;
> Size noSamplingDates = timeGrid.size()-1;
>
> // Running the simulation
> std::cout << "**********\nStarting simulation with " <<  
> numberOfSimulations
> << " simulation  paths" << std::endl;
> IncrementalStatistics payoffStat;
> Matrix prices(noUnderlyingAsset, noSamplingDates);
> for (Size i=1; i<=numberOfSimulations; i++)
> {
> // Simulate one path and calculates the payoff
> MultiPath path = generator.next().value;
> Real payoff = payoffFunctionAROBasket(prices, noUnderlyingAsset,
> noSamplingDates,  strike);
> payoffStat.add(payoff);
>
> // Antithetic path
> MultiPath path_anti = generator.antithetic().value;
> Real payoff_anti = payoffFunctionAROBasket(prices,  
> noUnderlyingAsset,
> noSamplingDates, strike);
> payoffStat.add(payoff_anti);
> }
>
> Real timeToExpiry = timeGrid[timeGrid.size()-1];
> Real DF = 1.0 / exp(timeToExpiry * log(1.0 + 0.051));
>
> std::cout << "Option Fair Value:\t" << (payoffStat.mean() * DF) <<  
> "\t
> Error estimate:\t" <<  (payoffStat.errorEstimate() * DF) << std::endl;
> }
>
>
> /* Not one of the best written functions, but it works ... :-) */
> Real payoffFunctionAROBasket(const Matrix& prices, Size noAsset, Size
> noSamplingDates, Real strike)
> {
> Real* basket = new Real[noSamplingDates];
> for (Size i=0; i<noSamplingDates; i++)
> {
> basket[i] = 0.0;
> for (Size j=0; j<noAsset; j++)
> {
> Real value = prices[j][i];
> basket[i] += value;
> }
> }
>
> Real sum = 0.0;
> for (Size i=0; i<noSamplingDates; i++)
> {
> Real value = basket[i];
> sum += value;
> }
>
> Real average = sum / noSamplingDates;
>
> Real payoff = (average - strike) < 0.0 ? 0.0 : (average - strike);
>
> delete[] basket;
> return payoff;
> }
>
> **********
>
>
>
> -------------------------------------------------------
> This SF.net email is sponsored by: Splunk Inc. Do you grep through  
> log files
> for problems?  Stop!  Download the new AJAX search engine that makes
> searching your log files as easy as surfing the  web.  DOWNLOAD  
> SPLUNK!
> http://sel.as-us.falkag.net/sel?
> cmd=lnk&kid=103432&bid=230486&dat=121642
> _______________________________________________
> Quantlib-users mailing list
> [hidden email]
> https://lists.sourceforge.net/lists/listinfo/quantlib-users