Note: The first version of this file was written in Mathematica 4.2. However, the author hopes that all algorithms and functions were successfully (and regurarly) rewritten to be in line with up-to-date version of Mathematica.

Option pricing via Monte Carlo simulation
(Odhad ceny opce dle simulace Monte Carlo)

Symbols and Notations

Bellow, we review the notations and symbols which are most frequently used in this text.

"Simulace na web_DDD_PUB_1.gif" spot spot price of the underlying asset at time zero spotová cena podkladového aktiva v čase nula
"Simulace na web_DDD_PUB_2.gif" spotT spot price of the underlying asset at maturity time spotová cena podkladového aktiva v době zralosti
K exe exercise price (strike price) realizační cena
T mat maturity time doba zralosti
τ timeto time to maturity doba do zralosti
r r riskless rate bezrizikový výnos
σ vol volatility of returns of S volatilita výnosů S
q q dividend yield dividendový výnos
N number number of independent scenarios počet nezávislých scénářů
length length of the time interval used for simulation délka časového úseku pro simulaci
θ driftVG(NIG) skewness parameter parametr řídící šikmost
ν gammavariance kurtosis parameter parametr řídící špičatost
ω omega mean correcting parameter parametr upravující střední hodnotu
dist[θ] distribution a general notation to a target distribution with parameters θ obecné označení cílového rozdělení pravděpodobnosti s parametry θ
G[a,b] gamma dist. gamma distribution with shape and scale parameters a and b gama pravděpodobnostní rozdělení s parametry a a b

Required functions of Mathematica: Table, Mean, StandardDeviation, Variance, Skewness, Kurtosis, Module, SeedRandom, RandomReal, Clear, Take, Drop, Append, Delete, Flatten, Timing, Join, Quantile, CharacteristicFunction, PDF, UniformDistribution, Grid, GraphicsArray, Histogram, Plot, NormalDistribution, CDF, GammaDistribution, ...

"Simulace na web_DDD_PUB_3.gif"

"Simulace na web_DDD_PUB_4.gif"

Some basic facts about probability, random numbers and statistical estimation

This section is under construction...

Random numbers from prespecified distributions

In this section we provide basic moduls to generate random numbers from selected distributions, useful in Financial modeling. However, we start with general moduls, without specifying the target distribution.

Define first the vector of parameters for further utilization (head of resulting tables, head), the function for grid to provide the table of particular results, ResultsGrid, and the parameter to set the maximal number of trials (kk):

"Simulace na web_DDD_PUB_5.gif"

General modules

PMC (Plain Monte Carlo)

This is the simplest approach, since we use solely the predefined algorithm of Mathematica specified within the function RandomReal[dist[θ],{number}]. Here, dist[θ] refers to the target distribution with a given set of parameters θ, number is the number of independent scenarios we generate. Within the algorithm bellow, when we specify the internal module for pN, we use nn to allow us to recover exactly the same "random" realizations later, if needed. Thus, the algorithm PMCrannumPar has three variables, dist[θ], nn, and number. It produces the vector of random variables, rannum, for which the estimations of the sample mean, standard deviation, variance, skewness, and kurtosis is obtained. Moreover, the algorithm returns also the number of generated scenarios. Finally, we show how to run the algoritm to get the vector of estimated parameters accompanied by the overall time costs for "Simulace na web_DDD_PUB_6.gif"  random scenarios. Note: We start the definition by clearing the function (PMCrannumPar)

In[39]:=

"Simulace na web_DDD_PUB_7.gif"

"Simulace na web_DDD_PUB_8.gif"

Alternatively, we can define a simple algorithm that will not produce the estimation of the paramaters, but solely the random numbers. Although it takes more memory to rember the results, it is the only way how to picture (approximate) the probability density function. Basically, we have three choices - the approximation of the PDF by a histogram; smoothing it by a Kernel function; comparing the quantiles (QQ plot). As above, we first realize "Simulace na web_DDD_PUB_9.gif" random scenarios.

In[42]:=

"Simulace na web_DDD_PUB_10.gif"

"Simulace na web_DDD_PUB_11.gif"

Another way we can proceed is to produce everything within a single algoritm. Subsequently, we pick up separately the parameters of a given random number distribution, including the time costs, and the set of random numbers, see bellow.

"Simulace na web_DDD_PUB_12.gif"

"Simulace na web_DDD_PUB_13.gif"

To conclude, when we are interested mainly in desriptive statistic parameters, we use the modul with "Par", PMCrannumPar. By contrast, when we need to get the numbers for further utilization, we can use the modul with "Num", PMCrannumNum. Finally, to get both, we use just PMCrannum.

The approach described above can be used in connection with any predefiened distribution. Obviously, if there is a need for a distribution which is not predefined in Mathematica  (eg. VarianceGamma), it must be defined before running the procedure.

AVMC (Monte Carlo with antithetic variates)

The Monte Carlo approach with antithetic variates in its basic form gives an additional path for each original one obtained due to the predefined algorithm of Mathematica, see PMC. Thus, we call only for a given fraction of the required amount of variables, rannum. More particularly, in its simplest form we obtain directly one half of the variables we actually need, rannumpart=number/2 The drawback of the approach is that it can be used directly only for symmetric distributions. If the mean is nonzero, we have to deduce the random realizations from its value MEAN.

"Simulace na web_DDD_PUB_14.gif"

"Simulace na web_DDD_PUB_15.gif"

Similarly to PMC, we can define two alternative algoritms. First, we state the one to produce the set of random numbers:

"Simulace na web_DDD_PUB_16.gif"

"Simulace na web_DDD_PUB_17.gif"

And here is the other one:

"Simulace na web_DDD_PUB_18.gif"

"Simulace na web_DDD_PUB_19.gif"

If the target distribution is not symmetric, we can reformulate the algorithm to produce first random numbers due to the standard uniform distribution, ie we obtain randomly the probabilities, and then apply the inverse transform method.

ITMC (Inverse Transforme Monte Carlo)

Assume that we are able to generate random variables from the standard uniform distribution, but we are interested in some more complex one. In other words, the standard uniform variates provide us randomly with probabilities, ie values of the target distribution function. Assuming that the inverse function to the target distribution function exists, we can transform such variables to obtain the target ones. In Mathematica, we can use the function called Quantile. We state only the basic algorithm.

"Simulace na web_DDD_PUB_20.gif"

"Simulace na web_DDD_PUB_21.gif"

A strong drawback of ITMC is that the calculation of inverse functions often takes too much time - it is several times more time consuming than PMC.

SSMC (Stratified Sampling Monte Carlo)

The key step of this improvement to simple Monte Carlo approach is to stratify the interval of admissible resutls into subintervals with equal probabilities of occurence (alternativelly, we call these subintervals stratas). In general, there exist two approaches to stratified sampling. We can stratify either the original set or the unit interval, ie probabilites. The latter case is generally more tractable, since it is not required to deal with infinite bounds and the subintervals have equal length. We first define an internal module to provide random numbers due to the standard uniform distribution, pU. Next, we table whole numbers (vector P1) up to the total quantity of scenarios considered, number. Subsequently, we stratify the unit interval and generate one random number for each of them. Finally, we produce random numbers from the target distribution applying function Quantile.

"Simulace na web_DDD_PUB_22.gif"

"Simulace na web_DDD_PUB_23.gif"

As we will seevlater this algorithm extends ITMC approach to provide more efficient results at almost same time costs. Clearly, the algorithm can be redefined to produce more independent random numbers for each of the stratas. As above, we state the two alternative algorithms bellow. This is the first one:

"Simulace na web_DDD_PUB_24.gif"

"Simulace na web_DDD_PUB_25.gif"

And here is the other one:

"Simulace na web_DDD_PUB_26.gif"

"Simulace na web_DDD_PUB_27.gif"

It is obvious, that such approach works only for one-dimensional problems. If more dimensional random vector must be considered, this approach can be easily extended to LHS (Latin Hypercube Sampling) Monte Carlo method. The application is easy. We only need to permute randomly the vector of boundaries for particular stratas P.

AV-SSMC (Stratified Sampling with Antithetic Variates Monte Carlo)

The stratified Monte Carlo approach presented above is based on generating random numbers from Uniform Distribution first. Clearly, we can also think about improving the generator by e.g. AVMC approach. In this subsection we present several alternatives. For simplicity, we will deal only with algorithms of SSMCrannumNum class. We start with algorithm, that provides two paths for each strata: we accompine the original one by a mirrored one, due to the mean of the strata.

"Simulace na web_DDD_PUB_28.gif"

Alternatively, both realizations can be symmetric with respect to the mean of the entire interval.

"Simulace na web_DDD_PUB_29.gif"

Next choice can be to...

Uniform Distribution

Definition

Uniform distribution indicates that all admissible values can arise with the same probability, ie the probabilities of particular outcomes are equal. In Mathematica, we can get uniformly distributed random numbers calling UniformDistribution[{a, b}], where a and b indicates the bounds of admissible values, b>a. It can be defined either by a characteristic function:

"Simulace na web_DDD_PUB_30.gif"

"Simulace na web_DDD_PUB_31.gif"

or a distribution function:

"Simulace na web_DDD_PUB_32.gif"

"Simulace na web_DDD_PUB_33.gif"

Clearly, it is a horizontal line for any x∈[a,b].

Generally we apply a standard uniform distribution, ie uniform distribution with unit margins,  a=0 and  b=1, which we can call for by typing UniformDistribution[{0,1}] or in order to get random variables RandomReal[{}]. Now, we ask Mathematica to calculate analytically the first four moments of the distribution function and we accompany them by the number of scenarios and the time costs.

"Simulace na web_DDD_PUB_34.gif"

"Simulace na web_DDD_PUB_35.gif"

Algorithms

This part is under construction...

PMC (Plain Monte Carlo)

Now, we utilize the algorithm PMCrannumPar defined above. Before getting the table of results, we must specify kk, the first row head and the last row lr with analytically obtained parameters.

"Simulace na web_DDD_PUB_36.gif"

"Simulace na web_DDD_PUB_37.gif"

Scenarios Mean StandardDeviation Variance Skewness Kurtosis Time
10 0.408312 0.284703 0.0810556 0.324249 1.54837 1.48326*10^^-13
100 0.464006 0.267273 0.0714351 0.112971 1.94004 1.48326*10^^-13
1000 0.501675 0.285255 0.0813701 -0.0580989 1.8471 1.48326*10^^-13
10000 0.50299 0.287051 0.0823985 -0.0163006 1.82057 1.48326*10^^-13
100000 0.498979 0.288403 0.0831763 0.00472851 1.80442 0.031
1000000 0.499671 0.288485 0.0832236 -0.000298105 1.80108 0.219
Analytically 0. 0.144553 0.0208957 -0.80556 4.14235

In order to compare the density/distribution we apply the other algorithm.

"Simulace na web_DDD_PUB_38.gif"

Now we map the Histogram function to vectors of random numbers generated for particular k.

"Simulace na web_DDD_PUB_39.gif"

"Simulace na web_DDD_PUB_40.gif"

AVMC (Monte Carlo with antithetic variates)

AVMC approach needs to run only one half of scenarios comparing with PMC. We examine if a decrease in time costs is adequate. We should be also interested, if the estimated parameters converge to the true values rapidly.

"Simulace na web_DDD_PUB_41.gif"

"Simulace na web_DDD_PUB_42.gif"

Scenarios Mean StandardDeviation Variance Skewness Kurtosis Time
10 0.5 0.333306 0.111093 0. 1.07933 1.50704*10^^-17
100 0.5 0.264249 0.0698278 -8.38837*10^^-21 1.91573 1.50704*10^^-17
1000 0.5 0.291552 0.0850024 -3.28607*10^^-21 1.744 1.50704*10^^-17
10000 0.5 0.28749 0.0826508 -3.08041*10^^-21 1.81256 1.50704*10^^-17
100000 0.5 0.287799 0.082828 1.28653*10^^-20 1.80739 0.031
1000000 0.5 0.288598 0.0832889 -1.82542*10^^-20 1.80062 0.265
Analytically 0.5 0.288675 0.0833333 0. 1.8

Alternatively, we use the other algorithm to compare the overall distribution.

"Simulace na web_DDD_PUB_43.gif"

Now we map the Histogram function to vectors of random numbers generated for particular k.

"Simulace na web_DDD_PUB_44.gif"

"Simulace na web_DDD_PUB_45.gif"

"Simulace na web_DDD_PUB_46.gif"

ITMC (Monte Carlo on the basis of inverse transform method)

In order to separate the effect of stratification and the inverse function to the distribution function evaluation, we should run ITMC alone.

"Simulace na web_DDD_PUB_47.gif"

"Simulace na web_DDD_PUB_48.gif"

Scenarios Mean StandardDeviation Variance Skewness Kurtosis Time
10 0.408312 0.284703 0.0810556 0.324249 1.54837 7.37257*10^^-17
100 0.464006 0.267273 0.0714351 0.112971 1.94004 7.37257*10^^-17
1000 0.501675 0.285255 0.0813701 -0.0580989 1.8471 7.37257*10^^-17
10000 0.50299 0.287051 0.0823985 -0.0163006 1.82057 0.016
100000 0.498979 0.288403 0.0831763 0.00472851 1.80442 0.062
1000000 0.499671 0.288485 0.0832236 -0.000298105 1.80108 0.609
Analytically 0.5 0.288675 0.0833333 0. 1.8

"Simulace na web_DDD_PUB_49.gif"

SSMC (Stratified Monte Carlo)

Now we can proceed to stratified Monte Carlo. Since it generally shows to be very time consuming to evaluate the inverse function to any distribution function, we switch to the following algorithm:

"Simulace na web_DDD_PUB_50.gif"

"Simulace na web_DDD_PUB_51.gif"

Scenarios Mean StandardDeviation Variance Skewness Kurtosis Time
10 0.490831 0.302334 0.0914058 0.132533 1.81545 0.
100 0.49964 0.289999 0.0840992 -0.00361333 1.79589 0.
1000 0.500002 0.288832 0.083424 -6.86584*10^^-6 1.80008 0.
10000 0.5 0.288689 0.0833415 -2.36153*10^^-6 1.8 0.015
100000 0.5 0.288677 0.0833342 2.21808*10^^-7 1.8 0.047
1000000 0.5 0.288675 0.0833334 -1.48766*10^^-9 1.8 0.748
Analytically 0.5 0.288675 0.0833333 0. 1.8

Now we map the Histogram function to particular vectors of random numbers generated for particular k.

"Simulace na web_DDD_PUB_52.gif"

"Simulace na web_DDD_PUB_53.gif"

"Simulace na web_DDD_PUB_54.gif"

Normal (Gaussian) Distribution

Definition

The term normal distribution is commonly used instead of Gaussian distribution, since such a distribution of random variables is supposed to be the most frequent in practice considerations. In Mathematica, we call for it by typing NormalDistribution[μ, σ], ie with mean μ and its standard deviation σ>0. It can be defined either by a characteristic function:

"Simulace na web_DDD_PUB_55.gif"

"Simulace na web_DDD_PUB_56.gif"

or a distribution function:

"Simulace na web_DDD_PUB_57.gif"

"Simulace na web_DDD_PUB_58.gif"

We plot the probability distribution functions for various σ and μ, respectivelly, bellow.

"Simulace na web_DDD_PUB_59.gif"

"Simulace na web_DDD_PUB_60.gif"

Note: with plain settings the first function is drawn with blue, the second with violet, etc.

Generally we apply a standard normal distribution, ie normal distribution with zero mean and unit variance, for which we can call simply by NormalDistribution[ , ]. The reason is that it can be easilly transformed, with insignificant time costs, into the target distribution by multiplying the original vector by σ and adding μ. Now, we analytically calculate the first four moments of the distribution function and we accompany them by the number of scenarios and the time costs.

"Simulace na web_DDD_PUB_61.gif"

"Simulace na web_DDD_PUB_62.gif"

Algorithms

This part is under construction...

PMC (Plain Monte Carlo)

Here, we utilize the algorithm PMCrannumPar defined above. Before getting the table of results, we must specify kk, the first row head and the last row lr with analytically obtained parameters.

"Simulace na web_DDD_PUB_63.gif"

"Simulace na web_DDD_PUB_64.gif"

Scenarios Mean StandardDeviation Variance Skewness Kurtosis Time
10 0.353029 0.78523 0.616586 -0.673941 3.27474 0.
100 -0.00966945 1.01417 1.02854 0.136525 2.85647 0.
1000 -0.0457642 0.972646 0.94604 0.016272 2.89682 0.
10000 -0.0042003 0.98622 0.972629 0.0255267 2.9847 0.
100000 0.00458268 0.999197 0.998395 0.0130988 2.99755 0.046
1000000 -0.000799485 1.00061 1.00123 0.00340776 2.99843 0.344
Analytically 0 1 1 0 3

Next, in order to compare the density/distribution we apply the other algorithm.

"Simulace na web_DDD_PUB_65.gif"

Now we map the Histogram function to vectors of random numbers generated for particular k.

"Simulace na web_DDD_PUB_66.gif"

"Simulace na web_DDD_PUB_67.gif"

"Simulace na web_DDD_PUB_68.gif"

To draw the QQ plot we first specify self-defined function to evaluate the CDF for each random number from the data set, specifing the DataRange on the x-axes. Next, we sort the original series of data and map the QQplot function to them.

"Simulace na web_DDD_PUB_69.gif"

"Simulace na web_DDD_PUB_70.gif"

"Simulace na web_DDD_PUB_71.gif"

In order to complete the comparison, we can evaluate the Kolmogorov-Smirnov test, ie we look for the widest distance between the simulated distribution function and the teoretical one.

"Simulace na web_DDD_PUB_72.gif"

"Simulace na web_DDD_PUB_73.gif"

AVMC (Monte Carlo with antithetic variates)

AVMC approach needs to run one half of scenarios comparing with PMC. We examine if a decrease in time costs is adequate. We should be also interested, if the estimated parameters converge to true values rapidly.

"Simulace na web_DDD_PUB_74.gif"

"Simulace na web_DDD_PUB_75.gif"

Scenarios Mean StandardDeviation Variance Skewness Kurtosis Time
10 0. 0.851245 0.724618 0. 2.79288 0.
100 0. 0.984274 0.968796 1.84684*10^^-20 3.12288 0.
1000 1.30104*10^^-21 0.978274 0.95702 -3.9433*10^^-21 2.86486 0.
10000 1.04083*10^^-21 0.975888 0.952358 7.93385*10^^-21 2.92746 0.015
100000 -7.11237*10^^-22 0.996044 0.992104 -3.61194*10^^-21 2.97502 0.031
1000000 1.44329*10^^-21 0.999972 0.999945 -3.55786*10^^-20 3.00156 0.281
Analytically 0 1 1 0 3

Alternatively, we use the other algorithm to compare the overall distribution.

"Simulace na web_DDD_PUB_76.gif"

Now we map the Histogram function to vectors of random numbers generated for particular k.

"Simulace na web_DDD_PUB_77.gif"

"Simulace na web_DDD_PUB_78.gif"

"Simulace na web_DDD_PUB_79.gif"

To draw the QQ plot we first specify self-defined function to evaluate the CDF for each random number from the data set, specifing the DataRange on the x-axes. Next, we sort the original series of data and map the QQplot function to them.

"Simulace na web_DDD_PUB_80.gif"

"Simulace na web_DDD_PUB_81.gif"

"Simulace na web_DDD_PUB_82.gif"

In order to complete the comparison, we can evaluate the Kolmogorov-Smirnov test, ie we look for the widest distance between the simulated distribution function and the teoretical one.

"Simulace na web_DDD_PUB_83.gif"

"Simulace na web_DDD_PUB_84.gif"

ITMC (Monte Carlo on the basis of inverse transform method)

In order to separate the effect of stratification and applying the inverse function to the distribution function within SSMC approach, we need to run ITMC alone.

"Simulace na web_DDD_PUB_85.gif"

"Simulace na web_DDD_PUB_86.gif"

Scenarios Mean StandardDeviation Variance Skewness Kurtosis Time
10 -0.297192 0.851177 0.724503 0.149367 1.67205 6.46705*10^^-15
100 -0.123177 0.88752 0.787692 -0.039672 2.97797 0.031
1000 -0.00439253 0.996385 0.992783 -0.064306 3.30474 0.187
10000 0.0092563 0.993181 0.986409 -0.00842903 2.98872 1.982
100000 -0.00350102 1.00007 1.00013 0.000704593 3.02202 19.562
1000000 -0.00136684 0.998922 0.997845 -0.000932943 3.00355 197.357
Analytically 0 1 1 0 3

"Simulace na web_DDD_PUB_87.gif"

SSMC (Stratified Monte Carlo)

We can proceed now to stratified Monte Carlo. Since it generally seems to be very time consuming to evaluate the inverse function to any distribution function, we switch to the following algorithm:

"Simulace na web_DDD_PUB_88.gif"

"Simulace na web_DDD_PUB_89.gif"

Scenarios Mean StandardDeviation Variance Skewness Kurtosis Time
10 0.00173221 1.00372 1.00746 0.350424 2.40684 1.78746*10^^-14
100 -0.00403324 0.990024 0.980148 -0.0323878 2.71479 0.016
1000 -0.000071616 0.999577 0.999154 -0.00196509 2.95589 0.203
10000 -2.1631*10^^-6 0.999975 0.99995 0.0000151301 2.99534 2.012
100000 7.80981*10^^-8 0.999998 0.999996 2.2293*10^^-6 2.99938 19.781
1000000 2.26954*10^^-8 1. 1. 1.99489*10^^-6 2.99994 197.591
Analytically 0 1 1 0 3

Now we map the Histogram function to particular vectors of random numbers generated for particular k.

"Simulace na web_DDD_PUB_90.gif"

"Simulace na web_DDD_PUB_91.gif"

"Simulace na web_DDD_PUB_92.gif"

To draw the QQ plot we first specify self-defined function to evaluate the CDF for each random number from the data set, specifing the DataRange on the x-axes. Next, we sort the original series of data and map the QQplot function to them.

"Simulace na web_DDD_PUB_93.gif"

"Simulace na web_DDD_PUB_94.gif"

"Simulace na web_DDD_PUB_95.gif"

In order to complete the comparison, we can evaluate the Kolmogorov-Smirnov test, ie we look for the widest distance between the simulated distribution function and the teoretical one.

"Simulace na web_DDD_PUB_96.gif"

"Simulace na web_DDD_PUB_97.gif"

Gamma Distribution

Definition

Gamma distribution belongs to the large family of distributions with non-negative realizations. It is therefore useful when modeling of stochastic processes with non-negative realizations (eg. time increments) is considered. In Mathematica, we call for it by GammaDistribution[a, b], ie with parameters of shape a > 0 and scale b > 0. With basic conditions, we can defined it either by a characteristic function:

"Simulace na web_DDD_PUB_98.gif"

"Simulace na web_DDD_PUB_99.gif"

or a distribution function:

"Simulace na web_DDD_PUB_100.gif"

"Simulace na web_DDD_PUB_101.gif"

The mean and the variance can be precalculated as follows:

"Simulace na web_DDD_PUB_102.gif"

"Simulace na web_DDD_PUB_103.gif"

"Simulace na web_DDD_PUB_104.gif"

"Simulace na web_DDD_PUB_105.gif"

Due to

"Simulace na web_DDD_PUB_106.gif"

"Simulace na web_DDD_PUB_107.gif"

it follows that "Simulace na web_DDD_PUB_108.gif" and "Simulace na web_DDD_PUB_109.gif" Later, whitin modeling the asset price evolutions, we will require: μ=1 and ν=0.2264. Note also that the Gamma distribution is often defined by parameters α and β with relations to a and b. Under suitable choice of parameters, the Gamma distribution gives us either an Exponential distribution or a Chi-2 distribution.

We plot the probability distribution function bellow.

"Simulace na web_DDD_PUB_110.gif"

"Simulace na web_DDD_PUB_111.gif"

Note: with plain settings the first function is drawn with blue, the second with violet.

It is important to know that it is sufficient to generate GammaDistribution[a, 1]. The reason is that it can be easilly transformed into target distribution GammaDistribution[a, b] when the results are multiplied by b. Now we analytically calculate the first four moments of the distribution function and we accompany them by the number of scenarios and the time costs, respectivelly.

"Simulace na web_DDD_PUB_112.gif"

"Simulace na web_DDD_PUB_113.gif"

Algorithms

This part is under construction...

PMC (Plain Monte Carlo)

Here, we utilize the algorithm PMCrannumPar defined above setting the distribution to be GammaDistribution[a,b]. Moreover, before getting the table of results, we must specify kk, the first row head and the last row lr with analytically obtained parameters.

"Simulace na web_DDD_PUB_114.gif"

"Simulace na web_DDD_PUB_115.gif"

"Simulace na web_DDD_PUB_116.gif"

Scenarios Mean StandardDeviation Variance Skewness Kurtosis Time
10 0.982436 0.526539 0.277244 0.616026 2.24096 0.
100 0.95087 0.409521 0.167708 0.579633 2.88648 0.
1000 0.991652 0.463546 0.214875 0.886468 4.12201 0.
10000 1.00034 0.471482 0.222295 0.979527 4.50121 0.016
100000 1.00128 0.477557 0.228061 0.965656 4.4205 0.062
1000000 1.00023 0.475257 0.22587 0.951665 4.36562 0.593
Analytically 1. 0.475815 0.2264 0.95163 4.3584

Now we map the Histogram function to vectors of random numbers generated for particular k.

"Simulace na web_DDD_PUB_117.gif"

"Simulace na web_DDD_PUB_118.gif"

"Simulace na web_DDD_PUB_119.gif"

To draw the QQ plot we first specify self-defined function to evaluate the CDF for each random number from the data set, specifing the DataRange on the x-axes. Next, we sort the original series of data and map the QQplot function to them.

"Simulace na web_DDD_PUB_120.gif"

"Simulace na web_DDD_PUB_121.gif"

"Simulace na web_DDD_PUB_122.gif"

In order to complete the comparison, we can evaluate the Kolmogorov-Smirnov test, ie we look for the widest distance between the simulated distribution function and the teoretical one.

"Simulace na web_DDD_PUB_123.gif"

"Simulace na web_DDD_PUB_124.gif"

AVMC (Monte Carlo with antithetic variates)

Since the Gamma probability distribution is not a symmetric one, there is obviously no reason to apply the AVMC method in its basic form.

SSMC (Stratified Monte Carlo)

We can proceed now to stratified Monte Carlo. Since it generally seems to be very time consuming to evaluate the inverse function to any distribution function, we switch directly to the following algorithm to produce both (i) random numbers and (ii) inputs for the tables:

"Simulace na web_DDD_PUB_125.gif"

"Simulace na web_DDD_PUB_126.gif"

"Simulace na web_DDD_PUB_127.gif"

Scenarios Mean StandardDeviation Variance Skewness Kurtosis Time
10 0.994972 0.495258 0.24528 0.926469 3.17805 0.031
100 0.995893 0.465135 0.216351 0.761664 3.36312 0.203
1000 0.999832 0.475037 0.22566 0.922427 4.12768 1.888
10000 0.999989 0.475762 0.22635 0.948922 4.33162 19.359
100000 0.999999 0.475809 0.226394 0.951198 4.35303 203.597
1000000 1. 0.475815 0.2264 0.951591 4.35782 1922.14
Analytically 1. 0.475815 0.2264 0.95163 4.3584

Now we map the Histogram function to vectors of random numbers generated for particular k.

"Simulace na web_DDD_PUB_128.gif"

"Simulace na web_DDD_PUB_129.gif"

"Simulace na web_DDD_PUB_130.gif"

To draw the QQ plot we first specify self-defined function to evaluate the CDF for each random number from the data set, specifing the DataRange on the x-axes. Next, we sort the original series of data and map the QQplot function to them.

"Simulace na web_DDD_PUB_131.gif"

"Simulace na web_DDD_PUB_132.gif"

"Simulace na web_DDD_PUB_133.gif"

In order to complete the comparison, we can evaluate the Kolmogorov-Smirnov test, ie we look for the widest distance between the simulated distribution function and the teoretical one.

"Simulace na web_DDD_PUB_134.gif"

"Simulace na web_DDD_PUB_135.gif"

Variance Gamma Distribution

Definition

Variance gamma distribution is related to one of the most popular examples of Lévy processes, the Variance gamma process. There are several ways to its formulation, either as a difference of two gamma processes, which are, clearly, independent, or as a (geometric) Brownian motion subordinated by a gamma process, ie the gamma process gives an internal time for the overall process. Since VG distribution can be obtained by putting a random number from Gamma distribution into Gaussian distribution, we can denote it as VG[g(t,ν);θ,ϑ], ie the Brownian motion with mean θ - it drives the skewness, and standard deviation ϑ within a random time specified by Gamma distribution with unique mean and variance ν - it determines the kurtosis. Hence, defining the Brownian motion on the basis of standard normal distribution variates, ε, within standard clock time t, "Simulace na web_DDD_PUB_136.gif", we get VG process as follows: "Simulace na web_DDD_PUB_137.gif".

The characteristic function of VG distribution is (assuming the triple of parameters ν, θ, and ϑ):

"Simulace na web_DDD_PUB_138.gif"

"Simulace na web_DDD_PUB_139.gif"

It can be obtained by combining the characteristic functions of gamma and normal distribution. Similarly, when we put together the probability distribution function of Gamma and Normal distribution, or a distribution function:

"Simulace na web_DDD_PUB_140.gif"

"Simulace na web_DDD_PUB_141.gif"

we get a probability distribution function of VG distribution:

"Simulace na web_DDD_PUB_142.gif"

"Simulace na web_DDD_PUB_143.gif"

"Simulace na web_DDD_PUB_144.gif"

"Simulace na web_DDD_PUB_145.gif"

In order to precalculate particular moments we should utilize the characteristic function. That is, k-th moment of random variable X∈VG: "Simulace na web_DDD_PUB_146.gif". This can be easily transformed to centered moments and also to normalized moments (skewness and kurtosis).

"Simulace na web_DDD_PUB_147.gif"

"Simulace na web_DDD_PUB_148.gif"

"Simulace na web_DDD_PUB_149.gif"

"Simulace na web_DDD_PUB_150.gif"

"Simulace na web_DDD_PUB_151.gif"

We plot the probability distribution function bellow.

"Simulace na web_DDD_PUB_152.gif"

"Simulace na web_DDD_PUB_153.gif"

"Simulace na web_DDD_PUB_154.gif"

Note: with plain settings the first function is drawn with blue, the second with violet.

"Simulace na web_DDD_PUB_155.gif"

"Simulace na web_DDD_PUB_156.gif"

Algorithms

This part is under construction...

Since there is no predefined algorithm in Mathematica to obtain VG random numbers, we must define some, at elast on the basis of normally and gamma distributed variates. However, it is very slow.

"Simulace na web_DDD_PUB_157.gif"

"Simulace na web_DDD_PUB_158.gif"

"Simulace na web_DDD_PUB_159.gif"

"Simulace na web_DDD_PUB_160.gif"

"Simulace na web_DDD_PUB_161.gif"

PMC (Plain Monte Carlo)

In order to realize the simplest method, we need to utilize adjusted PMCrannum algorithm. Alternatively, we could put VGrandom algorithm, however, it requires more time.

"Simulace na web_DDD_PUB_162.gif"

"Simulace na web_DDD_PUB_163.gif"

"Simulace na web_DDD_PUB_164.gif"

"Simulace na web_DDD_PUB_165.gif"

"Simulace na web_DDD_PUB_166.gif"

"Simulace na web_DDD_PUB_167.gif"

Scenarios Mean StandardDeviation Variance Skewness Kurtosis Time
10 0.00248015 0.158892 0.0252465 -1.51248 5.37175 0.
100 0.00335067 0.142203 0.0202217 -0.917584 4.5419 0.
1000 -0.00626222 0.14707 0.0216295 -0.838033 3.92918 0.016
10000 -0.00024377 0.143984 0.0207313 -0.83575 4.33681 0.015
100000 0.000499727 0.144436 0.0208617 -0.801033 4.15896 0.141
1000000 7.51492*10^^-6 0.144408 0.0208537 -0.800551 4.13222 0.717
Analytically 0. 0.144553 0.0208957 -0.80556 4.14235

Now we map the Histogram function to vectors of random numbers generated for particular k.

"Simulace na web_DDD_PUB_168.gif"

"Simulace na web_DDD_PUB_169.gif"

To draw the QQ plot we first specify self-defined function to evaluate the CDF for each random number from the data set, specifing the DataRange on the x-axes. Next, we sort the original series of data and map the QQplot function to them.

"Simulace na web_DDD_PUB_170.gif"

"Simulace na web_DDD_PUB_171.gif"

"Simulace na web_DDD_PUB_172.gif"

"Simulace na web_DDD_PUB_173.gif"

"Simulace na web_DDD_PUB_174.gif"

"Simulace na web_DDD_PUB_175.gif"

"Simulace na web_DDD_PUB_176.gif"

In order to complete the comparison, we can evaluate the Kolmogorov-Smirnov test, ie we look for the widest distance between the simulated distribution function and the teoretical one.

"Simulace na web_DDD_PUB_177.gif"

"Simulace na web_DDD_PUB_178.gif"

AVMC (Monte Carlo with antithetic variates)

The most intuitive utilization of antithetic variates approach to MC simulation is to create a pair of normally distributed variates, keeping the rest of the original PMC algorithm intact.

"Simulace na web_DDD_PUB_179.gif"

"Simulace na web_DDD_PUB_180.gif"

"Simulace na web_DDD_PUB_181.gif"

"Simulace na web_DDD_PUB_182.gif"

Scenarios Mean StandardDeviation Variance Skewness Kurtosis Time
10 -0.0416492 0.175181 0.0306883 -0.885868 3.85279 0.016
100 0.0025748 0.142118 0.0201976 -0.796581 4.20435 0.
1000 -0.00108812 0.146042 0.0213284 -0.803396 3.79889 0.
10000 0.00054537 0.141468 0.0200132 -0.809136 4.23777 0.
100000 -0.0000246755 0.144275 0.0208153 -0.806563 4.15606 0.078
1000000 0.0000484112 0.144481 0.0208749 -0.802266 4.13804 0.718
Analytically 0. 0.144553 0.0208957 -0.80556 4.14235

Now we map the Histogram function to vectors of random numbers generated for particular k.

"Simulace na web_DDD_PUB_183.gif"

"Simulace na web_DDD_PUB_184.gif"

To draw the QQ plot we first specify self-defined function to evaluate the CDF for each random number from the data set, specifing the DataRange on the x-axes. Next, we sort the original series of data and map the QQplot function to them.

"Simulace na web_DDD_PUB_185.gif"

"Simulace na web_DDD_PUB_186.gif"

"Simulace na web_DDD_PUB_187.gif"

"Simulace na web_DDD_PUB_188.gif"

"Simulace na web_DDD_PUB_189.gif"

"Simulace na web_DDD_PUB_190.gif"

In order to complete the comparison, we can evaluate the Kolmogorov-Smirnov test, ie we look for the widest distance between the simulated distribution function and the teoretical one.

"Simulace na web_DDD_PUB_191.gif"

LHSMC (Latin Hypercube Monte Carlo)

The most intuitive utilization of antithetic variates approach to MC simulation is to create a pair of normally distributed variates, keeping the rest of the original PMC algorithm intact.

"Simulace na web_DDD_PUB_192.gif"

"Simulace na web_DDD_PUB_193.gif"

"Simulace na web_DDD_PUB_194.gif"

"Simulace na web_DDD_PUB_195.gif"

Scenarios Mean StandardDeviation Variance Skewness Kurtosis Time
10 0.00355704 0.1341 0.0179828 -0.00604478 1.51669 0.016
100 -0.00103866 0.145109 0.0210565 -0.992879 4.77368 0.218
1000 -0.0000838418 0.144901 0.0209962 -0.769672 3.79216 2.075
10000 0.000282842 0.143544 0.020605 -0.818834 4.2742 20.295
100000 -2.21942*10^^-6 0.144899 0.0209958 -0.830363 4.2689 204.799
1000000 -0.0000192361 0.144652 0.0209241 -0.80708 4.14154 2052.61
Analytically 0. 0.144553 0.0208957 -0.80556 4.14235

Now we map the Histogram function to vectors of random numbers generated for particular k.

"Simulace na web_DDD_PUB_196.gif"

"Simulace na web_DDD_PUB_197.gif"

To draw the QQ plot we first specify self-defined function to evaluate the CDF for each random number from the data set, specifing the DataRange on the x-axes. Next, we sort the original series of data and map the QQplot function to them.

"Simulace na web_DDD_PUB_198.gif"

"Simulace na web_DDD_PUB_199.gif"

"Simulace na web_DDD_PUB_200.gif"

"Simulace na web_DDD_PUB_201.gif"

"Simulace na web_DDD_PUB_202.gif"

"Simulace na web_DDD_PUB_203.gif"

In order to complete the comparison, we can evaluate the Kolmogorov-Smirnov test, ie we look for the widest distance between the simulated distribution function and the teoretical one.

"Simulace na web_DDD_PUB_204.gif"

AV-LHSMC (Latin Hypercube Sampled Monte Carlo with antithetic variates)

The most intuitive utilization of antithetic variates approach to MC simulation is to create a pair of normally distributed variates, keeping the rest of the original PMC algorithm intact.

"Simulace na web_DDD_PUB_205.gif"

"Simulace na web_DDD_PUB_206.gif"

"Simulace na web_DDD_PUB_207.gif"

"Simulace na web_DDD_PUB_208.gif"

"Simulace na web_DDD_PUB_209.gif"

"Simulace na web_DDD_PUB_210.gif"

Scenarios Mean StandardDeviation Variance Skewness Kurtosis Time
10 0.00999564 0.108902 0.0118597 0.456717 2.58034 0.016
100 -0.00815104 0.174699 0.0305197 -1.41255 6.39834 0.281
1000 0.000110044 0.144065 0.0207548 -0.788809 4.02744 2.137
10000 0.0000790131 0.143488 0.0205887 -0.768128 4.0388 21.294
100000 -1.2555*10^^-6 0.14481 0.0209699 -0.811448 4.18621 211.74
1000000 -0.0000208493 0.1446 0.0209091 -0.806458 4.14924 2196.43
Analytically 0. 0.144553 0.0208957 -0.80556 4.14235

"Simulace na web_DDD_PUB_211.gif"

Scenarios Mean StandardDeviation Variance Skewness Kurtosis Time
10 0.00348365 0.109608 0.012014 0.394537 2.12934 0.015
100 0.00014285 0.146903 0.0215806 -1.29747 7.05952 0.203
1000 0.000030729 0.143368 0.0205542 -0.771469 4.11234 2.122
10000 3.15478*10^^-6 0.144282 0.0208173 -0.804605 4.16212 21.622
100000 2.66927*10^^-7 0.144603 0.02091 -0.800487 4.12062 210.226
1000000 1.41594*10^^-8 0.144509 0.0208828 -0.804002 4.13649 1967.5
Analytically 0. 0.144553 0.0208957 -0.80556 4.14235

Now we map the Histogram function to vectors of random numbers generated for particular k.

"Simulace na web_DDD_PUB_212.gif"

"Simulace na web_DDD_PUB_213.gif"

"Simulace na web_DDD_PUB_214.gif"

"Simulace na web_DDD_PUB_215.gif"

To draw the QQ plot we first specify self-defined function to evaluate the CDF for each random number from the data set, specifing the DataRange on the x-axes. Next, we sort the original series of data and map the QQplot function to them.

"Simulace na web_DDD_PUB_216.gif"

"Simulace na web_DDD_PUB_217.gif"

"Simulace na web_DDD_PUB_218.gif"

"Simulace na web_DDD_PUB_219.gif"

"Simulace na web_DDD_PUB_220.gif"

"Simulace na web_DDD_PUB_221.gif"

In order to complete the comparison, we can evaluate the Kolmogorov-Smirnov test, ie we look for the widest distance between the simulated distribution function and the teoretical one.

"Simulace na web_DDD_PUB_222.gif"

SSMC (Stratified Monte Carlo on the basis of VG distribution function)

The most intuitive utilization of antithetic variates approach to MC simulation is to create a pair of normally distributed variates, keeping the rest of the original PMC algorithm intact.

"Simulace na web_DDD_PUB_223.gif"

"Simulace na web_DDD_PUB_224.gif"

"Simulace na web_DDD_PUB_225.gif"

"Simulace na web_DDD_PUB_226.gif"

Scenarios Mean StandardDeviation Variance Skewness Kurtosis Time
10 0.00348365 0.109608 0.012014 0.394537 2.12934 0.015
100 0.00014285 0.146903 0.0215806 -1.29747 7.05952 0.203
1000 0.000030729 0.143368 0.0205542 -0.771469 4.11234 2.122
10000 3.15478*10^^-6 0.144282 0.0208173 -0.804605 4.16212 21.622
100000 2.66927*10^^-7 0.144603 0.02091 -0.800487 4.12062 210.226
1000000 1.41594*10^^-8 0.144509 0.0208828 -0.804002 4.13649 1967.5
Analytically 0. 0.144553 0.0208957 -0.80556 4.14235

Now we map the Histogram function to vectors of random numbers generated for particular k.

"Simulace na web_DDD_PUB_227.gif"

"Simulace na web_DDD_PUB_228.gif"

To draw the QQ plot we first specify self-defined function to evaluate the CDF for each random number from the data set, specifing the DataRange on the x-axes. Next, we sort the original series of data and map the QQplot function to them.

"Simulace na web_DDD_PUB_229.gif"

"Simulace na web_DDD_PUB_230.gif"

In order to complete the comparison, we can evaluate the Kolmogorov-Smirnov test, ie we look for the widest distance between the simulated distribution function and the teoretical one.

"Simulace na web_DDD_PUB_231.gif"

Inverse Gaussian Distribution

Generally, we proceed in the same way as for the Gamma distribution, though, prespecified algorithm InverseGaussianDistribution can be used.

Normal Inverse Gaussian Distribution

Any of the algorithms that were stated above for Variance Gamma distribution can be used if Gamma distribution is replaced by Inverse Gaussian Distribution.

Plain vanilla call

Note: In this section we provide a sample for estimation of option price by MC approach under BS model. Particular models and approach differes only when error is required to be estimated, too. Otherwise, it is sufficient to replace suitable modul (see above).

Payoff function

In[25]:=

"Simulace na web_DDD_PUB_232.gif"

In[33]:=

"Simulace na web_DDD_PUB_233.gif"

In[34]:=

"Simulace na web_DDD_PUB_234.gif"

Out[34]=

"Simulace na web_DDD_PUB_235.gif"

BS model

Inputs (Vstupy)

Here we define basic input data: spot price of the underlying asset, exercise price, time to maturity, riskless rate, dividend rate (costs of cary), volatility of undelying returns, length of one time interval:

In[37]:=

"Simulace na web_DDD_PUB_236.gif"

Within the Black and Scholes model (BS model) the underlying asset price follows the Geometric Brownian motion: "Simulace na web_DDD_PUB_237.gif".

This gives us:

"Simulace na web_DDD_PUB_238.gif"

"Simulace na web_DDD_PUB_239.gif"

Analytical pricing (Analytické ocenění)

The first formula is the Black and Scholes call option pricing formula, which works also for the maturity time (it includes the payoff function). The second and the third formulas calculate the arguments to the distribution function of the normal distribution, which is defined in the last formula.

In[35]:=

"Simulace na web_DDD_PUB_240.gif"

For a given set of input data, the option price is as follows.

In[38]:=

"Simulace na web_DDD_PUB_241.gif"

Out[38]=

"Simulace na web_DDD_PUB_242.gif"

MC - general module

The simplest way to estimate the option price is to apply any of the modules defined above and obtain a vector of N random numbers. After that, terminal price of the underlying asset is calculated and the payoff function is evaluated. It can be done as follows.

In[49]:=

"Simulace na web_DDD_PUB_243.gif"

Such a definition of the module allows us to estimate the option price (the mean) and the error of the estimation. The next line gives us the resutls for N = "Simulace na web_DDD_PUB_244.gif" scenarios, including its error and total time costs, for i=2,3,4,5,6.

In[51]:=

"Simulace na web_DDD_PUB_245.gif"

Out[51]//MatrixForm=

"Simulace na web_DDD_PUB_246.gif"

Spikey Created with Wolfram Mathematica 7.0