C++ finanzas curso – parte 2 – Black-Scholes a través de la integración numérica
objetivo
cálculo de opción de compra (Call) de Black-Scholes con c++
C++ y QuantLib tienen muchos tipos de variables. En las finanzas cuantitativas los tipos más útiles son:
double – para almacenar números reales
int – para almacenar números enteros
QuantLib :: Date – para almacenar fechas
QuantLib :: Array – guardar array de doubles
QuantLib :: Matrix – para almacenar la matriz 2D de doubles
vamos a empezar haciendo con integración numérica
borrar todos los contenidos del fichero source.cpp copiar y pegar el código siguiente
ejemplo – la integración numérica Call
este código calculará integral
$$ \int_ {0} ^ {1} e^x dx $$
#include#include //for using math functions //everything after // is a comment double f(double x) //declaration of function f(x)=exp(x) { return std::exp(x); } void main() { double dt=0.0001; //integration step double sum=0; //current value of integral for(double t=0;t<1.0;t+=dt) //for loop t+=dt means t=t+dt { sum+=f(t)*dt; // its equivalent to write sum=sum+f(t)*dt; } std::cout<<"integral "<< sum; //output int dummy;std::cin>>dummy;//screen delay }
leer acerca de las estructuras de control de bucle y otra aquí: http://www.cplusplus.com/doc/tutorial/control/
Notas importantes:
utilizar 1.0 en vez de 1
en c + + 1.0 y 1 son diferentes números 1.0 es el número real y 1 es el número entero
que significa que 1/2 = 0. mientras que 1.0/2 es 0.5
al hacer comparaciones de dobles no lo uses si (x == 0)
utilizar si (std :: abs (x) <epsilon) donde épsilon es su precisión (por ejemplo 10 ^ -8)
la variable t es «visible» sólo dentro loop
Consulte «Variables scope» aquí http://www.cplusplus.com/doc/tutorial/variables/
Aquí hemos utilizado la forma más simple de integración numérica
para un integratoin rápido / más precisa puede utilizar otros métodos
muchos de ellos se describen en el libro gratis «recetas numéricas en c»
este libro es para C, pero la estructura del código sería el mismo
ejemplo
– opción Call en Black Scholes usando integración
Ahora vamos a cambiar el programa anterior para calcular opción Call en modelo Black-Scholes con tasas de interés cero
dinámica neutral al riesgo:
$$ dS_t = S_t \sigma dWt $$
así
$$ S_T S_0 = exp (-0.5 \sigma^2 + \sigma \sqrt x T) $$
donde x es un estándar gaussiano
por lo que el precio de la opción llamada será
$$ Call = \int_{-\infty}^{+\infty} (S_0 e ^ {-0,5 \sigma ^ 2 + \sigma \sqrt T x} – K) ^ + \phi (x) dx $$
donde $$ \phi(x) = \frac {1} {\sqrt {2 \pi}} exp (-0.5 x ^ 2) $$ densidad gaussiana estándar
S0 = 100
volatilidad = 20%
vencimiento = T = 1 año
#include#include #include double density(double x) //normal density { const double pi = boost::math::constants::pi (); return 1.0/sqrt(2.0*pi)*std::exp(-0.5*x*x); } double pp(double x) //positive part x+ { if(x>0) return x; return 0; } double f(double K,double S0,double T,double sigma,double x) //function to integrate { return pp(S0*std::exp(-0.5*sigma*sigma*T+sigma*std::sqrt(T)*x)-K)*density(x); } void main() { double S0=100.0; double sigma=0.2; double T=1.0; double K=80.0; double dx=0.0001; double sum=0; for(double x=-10.0;x<10.0;x+=dx) { sum+=f(K,S0,T,sigma,x)*dx; } std::cout<<"call= "<< sum; int dummy;std::cin>>dummy; }
Notas:
tenemos que pasar argumentos de nuevo a la función integrada debido a que su alcance original está dentro main () , por lo que las variables K, S0 etc no son visibles en el interior función f (x)
usamos impulsar aquí para extraer constante Pi, por lo que será más fácil de portar a programas linux por ejemplo (estándar de C++ no tiene constantes matemáticas)
ejercicios
– Debugear primer programa mediante el establecimiento de puntos de interrupción y ver las variables de suma y t valor del cambio
– Cambiar el primer programa para integrar a través de regla trapezoidal , compruebe los resultados con respuesta conocida $$ e^1-1 $$
– Cambie segundo programa para incluir los tipos de interés no cero
– Cambie segundo programa para calcular el precio puesto
– Verificar llama poner la paridad
algunos trucos
si tienes un error siempre comienza corrigiendo primer error de compilación (doble clic en la línea de error de compilación)
algunos mensajes de error de + c + son bastante crípticos y son el resultado de errores anteriores
por ejemplo, eliminar el «;» después sentencia return
pulse F7 para compilar
Ahora haga doble clic en el primer error: