curso c++ finanzas [parte 5] – opciones cesta con monte carlo c++

Parte 5

curso c++ finanzas

Monte-Carlo c++ – opciones cesta

Objectivos

-implementar valoración opciones cesta (basket, himalaya, rainbow , spread options, autocallables)

Opcion Cesta

vamos a ver como calcular con c++ opciones cesta con 2 subyacentes con payoff:

$$ ( w_1S_1+w_2S_2-K)^+ $$
donde $$ w_i $$ son pesos de cada acción en el payoff (lo normal es pesos iguales que suman 1)
como siempre consideramos tipos de interés 0 y las acciones no pagan dividendos (sino hay que añadir termino $$ (r-q)dt$$ en la dinámica

$$dS_1=S_1 \sigma_1 dW_1(t)$$
$$dS_2=S_2 \sigma_2 dW_2(t)$$

$$ dW_i dW_j=\rho_{i,j} dt$$

donde $$\rho_{i,j}$$ es la matriz de correlaciones.
una vez tenemos la matriz de correlaciones construimos su descomposición Cholesky.
la podemos hacer con boost o con Quantlib , con quantlib es mas facil.ya que usamos quantlib usaremos sus clases para matrices y vectores.
QuantLib::Matrix para matrices y QuantLib::Array para Así podemos escribir A=B*x para multiplicar matriz por vector.

para obtener las gaussianas con matriz correlación dada generaremos primero las gaussianas independientes $$\vec{\epsilon}= (\epsilon_1, \epsilon_2)$$ .
Asi que el vector de gaussianas correladas sera $$M_{cholesky} \vec{\epsilon}$$

aqui viene el codigo (con pesos=1)

#include 
#include 
#include 
#include 
#include 


double pp(double x) //positive part   x+   
{
if(x>0) return x;
return 0;
}

void main()
{

	boost::mt19937 mt; 
    boost::normal_distribution<> distribution;
    boost::variate_generator>* normal(new boost::variate_generator>(mt,distribution));
	
	int numberSimulations=10000;

	std::vector S0(2);
	S0[0]=100.0;// S1(0) - spot price of first stock
	S0[1]=100.0;//S2(0) - spot price of second stock

	std::vector sigma(2);
	sigma[0]=0.2; //volatility of S1
	sigma[1]=0.2;//volatility of S2

	double T=1.0;//maturity in years
	double K=100.0;//strike of option
	double sum=0;//for monte-carlo averaging
	double payoff=0;
	double NT=100;//number of time intervals
	double dt=T/NT;
	
	QuantLib::Matrix rho(2,2);//correlation matrix

	rho[0][0]=1;rho[0][1]=0.5;
	rho[1][0]=0.5;rho[1][1]=1;

	QuantLib::Matrix cholesky=QuantLib::CholeskyDecomposition(rho);
	
	for(int iSim=0;iSim Sprev(S0); //create a vector equal to S0 with its values
		std::vector Snext(2);//create vector with 2 elemens

		for(double t=0;t
					
					
				
Publicado en curso c++ finanzas