Professional Documents
Culture Documents
cuantitativas
std::cpp 2013
Quantitative and Business Solutions / Valuation Design Noviembre 2013
Agradecimientos
Pgina 2
ndice
1
Pgina 3
Introduccin a
las finanzas
cuantitativas
Pgina 4
Finanzas Cuantitativas
Aplicacin de las matemticas y la tecnologa a los mercados financieros
Se busca elaborar modelos matemticos que representen el rendimiento de un conjunto
de activos, basndose en un conjunto de hiptesis
Se toman los precios observables en mercado como inputs
El precio del producto es igual al coste de cobertura de sus riesgos. Esto exige disponer
de herramientas y sistemas
Consistencia matemtica vs teora econmica
Pgina 5
1952
1969
1997
Robert Merton
introduce el clculo
estocstico
Pgina 6
Quants: Herramientas
Mathematics
theory
Estadstica y teora de
la probabilidad
Ecuaciones
diferenciales
Variable compleja
Numerical
Methods
rboles/Diferencias
finitas
Simulacin Montecarlo
Optimizacin
multidimensional
Transformada de
Fourier
Computer
Science
Algoritmia
Reusabilidad
Eficiencia
Orientacin a Objetos
Conectividad
Tcnicas HPC: grid
computing, FPGAs,
GPUs
Pgina 7
Introduccin a
los derivados
financieros
Pgina 8
Qu es un derivado?
Los derivados son contratos financieros cuyo valor est ligado al valor de ciertos activos que cotizan
en un mercado de contado. De forma que a su vencimiento en tiempo T, su valor F(T) es conocido y
se puede determinar unvocamente en funcin de los valores de los activos subyacentes hasta
vencimiento ST
Funcin de pago de un futuro
4
Pago
Pago
2
0
-2
-4
10
12
-6
F(T) = ST-K
3
2
1
0
0
6
8
Valor del subyacente
10
12
K
Pago
Pago
2
0
-2
-4
-6
12
3
2
1
C0
ST
3
6
9
Valor del subyacente
12
ST
dWt ~ N 0, dt
Incertidumbre
20
18
16
14
12
10
8
6
4
2
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
Pgina 11
C++ en las
finanzas
cuantitativas
Pgina 12
Encapsulacin:
Fomenta la reutilizacin
de cdigo
Soporta desarrollo
multiparadigma
Lenguaje estandarizado
por ISO
3.1
Optimizacin
de un
esquema de
simulacin de
Montecarlo
Pgina 14
Objetivo
Acelerar la simulacin de un proceso estocstico bajo un esquema de simulacin de
Montecarlo
Resultado
Resultado resultado;
resultado;
Generador
Generador generador;
generador;
Simulador
simulador;
Simulador simulador;
Productor
Productor producto;
producto;
Inicializacion(generador,
Inicializacion(generador, simulador,
simulador, producto,
producto, resultado);
resultado);
for(unsigned
for(unsigned long
long ii == 0;
0; ii !=
!= nPaths;
nPaths; ++i)
++i)
{{
generador->camino();
generador->camino();
simulator->simula();
simulator->simula();
resultado
resultado +=
+= producto->calculaNPV();
producto->calculaNPV();
}}
resultado
resultado /=
/= nPaths;
nPaths;
{
{
Pgina 15
Puntos a considerar
a) Generacin de
nmeros
aleatorios
b) Uso eficiente
de la memoria
c) Diseo
Pgina 16
a)
Por qu?
Punto comn para todos los modelos que se resuelven por Montecarlo
Puede llegar a ser una parte importante del tiempo de simulacin:
Un
Unmodelo
modelode
desimulacin
simulacinde
detipo
tipoaacorto
cortoconsume
consume
aproximadamente
aproximadamentelalamitad
mitadde
desu
sutiempo
tiempode
desimulacin
simulacin
generando
generandonmeros
nmerosaleatorios
aleatorios
Pgina 17
a)
Puntos a considerar
Pgina 18
a)
Herramientas
std::rand
a)
Herramientas
C++11 /
#include <random>>
Pgina 20
a)
Herramientas
#include
#include <iostream>
<iostream>
#include
<boost/random.hpp>
#include <boost/random.hpp>
#include
#include <boost/generator_iterator.hpp>
<boost/generator_iterator.hpp>
#include
<boost/math/distributions/normal.hpp>
#include <boost/math/distributions/normal.hpp>
int
int main()
main() {{
boost::mt19937
boost::mt19937 randomGenerator;
randomGenerator; //mersenne
//mersenne twister
twister generator.
generator.
boost::normal_distribution<>
normalDistribution(5.0,
boost::normal_distribution<> normalDistribution(5.0, 2.0);
2.0);
boost::variate_generator<boost::mt19937&,
boost::variate_generator<boost::mt19937&,
boost::normal_distribution<>
boost::normal_distribution<> >>
var_nor(randomGenerator, normalDistribution);
var_nor(randomGenerator, normalDistribution);
}}
for
for (( unsigned
unsigned long
long ii == 0;
0; ii << 10000;
10000; i++
i++ )) {{
double
double nn == var_nor();
var_nor();
std::cout
<<
n
<<
std::cout << n << std::endl;
std::endl;
}}
-5 -4 -3 -2 -1
9 10 11 12 13 14 15 16
Pgina 21
b)
Por qu?
Menor
consumo de
memoria
Mayor
velocidad de
ejecucin
Main Memory
Bus
memoria
Menos tiempo manipulando memoria
L3 Cache
L2 Cache
L1i Cache
L1d Cache
CPU Core
Pgina 22
b)
Por qu?
Bajo un esquema de
Montecarlo sabemos a
priori casi toda la memoria
que vamos a usar
Pgina 23
b)
Herramientas
Programacin
Preventiva
const
const ClaseA
ClaseA operator+(const
operator+(const ClaseA&
ClaseA& a1,
a1, const
const ClaseA&
ClaseA& a2)
a2)
{{
return ClaseA(a1.getValue() + a2.getValue());
return ClaseA(a1.getValue() + a2.getValue());
}}
}
}
{{
b)
Herramientas
Smart
Pointers
C++03
C++11
std::auto_ptr
boost::scoped_ptr
boost::shared_ptr
boost::weak_ptr
std::unique_ptr
std::shared_ptr
std::weak_ptr
Pgina 25
b)
Herramientas C++03
auto_ptr
scoped_ptr
{ //auto_ptr example
{ //auto_ptr example
std::auto_ptr<std::string> myAutoPtrA(new std::string("Hola Mundo"));
std::auto_ptr<std::string> myAutoPtrA(new std::string("Hola Mundo"));
std::auto_ptr<std::string> myAutoPtrB = myAutoPtrA;
std::auto_ptr<std::string> myAutoPtrB = myAutoPtrA;
bool isEmpty = myAutoPtrA.get() == NULL;
bool isEmpty = myAutoPtrA.get() == NULL;
std::cout << std::boolalpha << isEmpty << std::endl; //true
std::cout << std::boolalpha << isEmpty << std::endl; //true
}
}
{ //scoped_ptr example
{ //scoped_ptr example
boost::scoped_ptr<std::string> myScopedPtrA(new std::string("Hola Mundo"));
boost::scoped_ptr<std::string> myScopedPtrA(new std::string("Hola Mundo"));
boost::scoped_ptr<std::string> myScopedPtrB = myScopedPtrA;
boost::scoped_ptr<std::string> myScopedPtrB = myScopedPtrA;
}
}
Error 1 error C2248: 'boost::scoped_ptr<T>::scoped_ptr' :
Error 1 error C2248: 'boost::scoped_ptr<T>::scoped_ptr' :
cannot access private member declared in class 'boost::scoped_ptr<T>' ...
cannot access private member declared in class 'boost::scoped_ptr<T>' ...
shared_ptr
b)
Herramientas
shared_ptr
Pgina 27
b)
Herramientas
unique_ptr
{ //unique_ptr example
{ //unique_ptr example
std::unique_ptr<std::string> myUniquePtrA(new std::string("Hola Mundo"));
std::unique_ptr<std::string> myUniquePtrA(new std::string("Hola Mundo"));
std::unique_ptr<std::string> myUniquePtrB (std::move(myAutoPtrA));
std::unique_ptr<std::string> myUniquePtrB (std::move(myAutoPtrA));
}
}
Pgina 28
b)
Herramientas
Patrones de
diseo
Flyweight
Implementacin boost de Joaqun M Lpez Muoz
Pgina 29
c)
No todas las
condiciones
cambian en cada
path
Puntos crticos
de ejecucin
Patrones de
Diseo
Composite, Strategy,
State,
Profiling
1/x, sqrt(), exp(),
Pgina 30