CursoPython2020 SegundaParte PDF
CursoPython2020 SegundaParte PDF
para finanzas
UDC. 2019 − 20
Indice
Yves Hilpisch, Python for Finance. Analize big financial data, O’Reilly, 2015
Gouthan Balaraman and Luigi Ballagio, QuantLib Python Cookbook, 2019
James Ma Weiming, Mastering Python for Finance, Packt Publishing 2015
https://docs.python.org/3/
https://www.numpy.org/
https://www.scipy.org/
https://matplotlib.org/
http://www.python-excel.org
http://pandas.pydata.org
http://quantlib.org
Python para finanzas cuantitativas
En el mundo de las finanzas es necesario procesar y analizar grandes cantidades de datos.
Python se está utilizando en muchos sectores como la banca, los seguros, etc, para construir
herramientas que permitan obtener precios de activos o gestionar riesgos, por ejemplo.
¿Por qué utilizar Python?
simple sintaxis: los programas resultan fáciles de leer.
Python dispone de una gran variedad de herramientas para realizar cuanquier tipo de
tarea: cálculo cientı́fico, desarrollo de aplicaciones web, tareas de administración de
sistemas, bases de datos, ...
facilidad de integración en aplicaciones desarrolladas con otros lenguajes de programación
como C, C++ o Fortran.
eficiencia y productividad: módulos testeados por amplia comunidad de usuarios y
lenguaje interactivo y dinámico.
disponibilidad de muchas librerı́as para finanzas.
Python para finanzas cuantitativas
1 a1=np . a r r a y ( [ 0 . 2 , − 1 . 8 7 , 2 . 3 4 , − 4 . , 2 ] )
2 a2=np . a r r a y ( [ 2 . 2 , − 3 . 7 , 5 . 2 4 , 4 . 1 7 , − 2 . 3 1 ] )
3 np . z e r o s l i k e ( a1 )#c r e a un a r r a y de c e r o s con e l mismo número de e l e m e n t o s que
a1
4 Out [ 1 9 9 ] : a r r a y ( [ 0 . , 0 . , 0 . , 0 . , 0 . ] )
5 np . o n e s l i k e ( a2 )#c r e a un a r r a y de unos con e l mismo número de e l e m e n t o s que a2
6 Out [ 2 0 0 ] : a r r a y ( [ 1 . , 1 . , 1 . , 1 . , 1 . ] )
7 a1 [ a1<a2 ]#d e v u e l v e un a r r a y con l o s e l e m e n t o s de a1 menores que l o s de a2
8 Out [ 2 0 1 ] : a r r a y ( [ 0 . 2 , 2 . 3 4 , −4. ] )
9 a2 [ a1>a2 ]#d e v u e l v e un a r r a y con l o s e l e m e n t o s de a2 que s o n menores que l o s de
a1
10 Out [ 2 0 2 ] : a r r a y ( [ − 3 . 7 , − 2 . 3 1 ] )
NumPy
1 a =[[1 ,3 ,2.6] ,[4 , −2.9 ,5]]
2 a1=np . a r r a y ( a )
3 a1 . s h a p e #d e v u e l v e e l número de f i l a s y c o l u m n a s d e l a r r a y
4 Out [ 2 1 3 ] : ( 2 , 3 )
5 a1 . s h a p e [ 0 ] #d e v u e l v e e l número de f i l a s
6 Out [ 2 1 4 ] : 2
7 a1 . s h a p e [ 1 ] #d e v u e l v e e l número de c o l u m n a s
8 Out [ 2 1 5 ] : 3
9 a1 . s h a p e =(3 ,2) #cambia l a s d i m e n s i o n e s d e l a r r a y
10 a1
11 Out [ 2 1 8 ] :
12 array ( [ [ 1. , 3. ] ,
13 [ 2.6 , 4. ] ,
14 [ −2.9 , 5 . ] ] )
15 a1 . s i z e #d e v u e l v e e l número de e l e m e n t o s d e l a r r a y
16 Out [ 2 1 9 ] : 6
NumPy
1 a2=np . a r r a y ( [ [ 1 . , 3 . 4 , − 4 ] , [ 1 , 3 , − 7 ] , [ 1 . 2 , − 3 . 5 , − 7 ] ] )
2 np . d i a g ( a2 )#d e v u e l v e l a d i a g o n a l de a2
3 Out [ 2 3 3 ] : a r r a y ( [ 1 . , 3 . , −7.])
4 np . t r i u ( a2 )#o b t i e n e una m a t r i z t r i a n g u l a r s u p e r i o r a p a r t i r de a2
5 a r r a y ( [ [ 1 . , 3 . 4 , −4. ] ,
6 [ 0 . , 3 . , −7. ] ,
7 [ 0 . , 0 . , −7. ] ] )
8 np . t r i l ( a2 )#o b t i e n e una m a t r i z t r i a n g u l a r i n f e r i o r a p a r t i r de a2
9 array ( [ [ 1. , 0. , 0. ] ,
10 [ 1. , 3. , 0. ] ,
11 [ 1 . 2 , −3.5 , −7. ] ] )
12 np . l i n a l g . i n v ( a2 ) #c a l c u l a l a i n v e r s a de una m a t r i z
13 a r r a y ( [ [ 2 . 0 8 1 4 2 7 2 6 , −1.72918573 , 0 . 5 3 9 7 9 8 7 2 ] ,
14 [ 0.06404392 , 0.10064044 , −0.13723696] ,
15 [ 0 . 3 2 4 7 9 4 1 4 , −0.34675206 , 0 . 0 1 8 2 9 8 2 6 ] ] )
16 np . t r a n s p o s e ( a2 )#c a l c u l a l a t r a s p u e s t a de una m a t r i z
NumPy
I si se aplican a un array y a un valor real, comparan cada componente del array con el escalar,
y devuelven un array cuyos componentes son True o False.
1 v>=3
2 Out [ 2 8 7 ] : a r r a y ( [ F a l s e , True , True ] )
Operadores lógicos (and, or, not): se combinan con los operadores relacionales para
comprobar condiciones múltiples.
NumPy
Objeto Matrix: es una subclase de la clase array. Permite manejar matrices (un objeto
Matrix va a ser siempre un objeto bidimensional). Este objeto se utiliza para realizar
operaciones algebraicas con matrices de forma sencilla.
1 i m p o r t numpy a s np
2 np . m a t r i x ( ’ 1 2 3 ; 4 5 6 ’ ) #c r e a una m a t r i z a p a r t i r de un s t r i n g
3 np . mat ( [ [ 2 , 4 , 1 ] , [ 7 , 3 , 9 ] ] ) #c r e a una m a t r i z a p a r t i r de una s e c u e n c i a
anidada
4 A=np . m a t r i x ( np . random . r a n d ( 3 , 2 ) ) #c r e a una m a t r i z a p a r t i r de un a r r a y
5 B=np . m a t r i x ( np . random . r a n d ( 2 , 3 ) )
6 C=A*B #m u l t i p l i c a m a t r i c e s
7 A . T #t r a s p u e s t a de una m a t r i z
8 C . I #i n v e r s a de una m a t r i z
NumPy
Método asarray(objeto): crea un array que es una copia por referencia de objeto.
1 m=np . mat ( ’ 3 . 1 . 2 5 ; 6 . 2 9 ’ )
2 a=np . a s a r r a y (m) #a e s una c o p i a de m p o r r e f e r e n c i a
3 m[0 ,0]= −25 #s i cambia m t a m b ié n cambia a y v i c e v e r s a
4 m
5 Out [ 3 5 1 ] :
6 matrix ([[ −25. , 1.25] ,
7 [ 6.2 , 9. ]])
8 a
9 Out [ 3 5 2 ] :
10 array ([[ −25. , 1.25] ,
11 [ 6.2 , 9. ]])
12 d e l ( a ) # s e b o r r a a p e r o no m
13 m
14 Out [ 3 5 3 ] :
15 matrix ([[ −25. , 1.25] ,
16 [ 6.2 , 9. ]])
NumPy
Manejo de polinomios en NumPy:
1 p=np . p o l y 1 d ( [ 4 , 2 , 3 , 1 ] ) #c r e a un p o l i n o m i o a p a r t i r de l a l i s t a de
coeficientes
2 p=np . p o l y 1 d ( [ 4 , 2 , 3 , 1 ] , r=True ) #l o c r e a a p a r t i r de una l i s t a de r a i c e s
3 p . r #d e v u e l v e l a s r a i c e s d e l p o l i n o m i o
4 Out [ 3 5 9 ] : a r r a y ( [ 4 . , 3 . , 2 . , 1 . ] )
5 p ( 0 . 5 ) #e v a l ú a e l p o l i n o m i o en un pu n t o
6 p o l y v a l ( p , 0 . 5 ) #e v a l ú a e l p o l i n o m i o en un p u n t o
7 p ( [ 2 , − 3 , 4 ] ) #e v a l ú a e l p o l i n o m i o en una l i s t a de p u n t o s
8 p r i n t ( p . d e r i v (m=2) )#i m p r i m e l a s e g u n d a d e r i v a d a d e l p o l i n o m i o
9 2
10 12 x − 60 x + 70
11 p r i n t ( p . d e r i v (m=1) )
12 3 2
13 4 x − 30 x + 70 x − 50
14 p r i n t ( p . i n t e g ( ) ) #i m p r i m e l a p r i m i t i v a d e l p o l i n o m i o
15 5 4 3 2
16 0 . 2 x − 2 . 5 x + 1 1 . 6 7 x − 25 x + 24 x
NumPy
I randn(d0,d1,...,dn): devuelve un array de una forma dada con muestras de una distribución
normal estándard.
1 npr . randn (3)
2 Out [ 1 1 ] : a r r a y ( [ 0 . 2 3 1 6 0 0 3 6 , −0.67115477 , − 0 . 9 8 5 3 1 4 7 6 ] )
NumPy
Algunas funciones para generar números aleatorios:
I random(size): devuelve un array con números aleatorios en el intervalo abierto [0, 1).
1 n p r . random ( 4 )
2 Out [ 4 ] : a r r a y ( [ 0 . 6 6 5 3 7 0 3 5 , 0 . 9 3 9 2 9 1 1 1 , 0 . 6 5 7 5 6 2 8 4 , 0 . 6 6 0 7 9 5 1 3 ] )
I standard normal(size): devuelve un array con muestras de una distribución normal estándard.
1 npr . standard normal (4)
2 Out [ 6 ] : a r r a y ( [ − 0 . 4 1 5 6 0 9 3 6 , 1 . 1 3 4 3 1 0 9 , −0.02431827 , − 0 . 1 3 1 7 0 5 5 2 ] )
I normal(mean,std,size): devuelve un array con muestras de una distribución normal con media
mean y desviación tı́pica std.
1 npr . normal (100 ,20 ,4)
2 Out [ 1 0 ] : a r r a y ( [ 7 6 . 7 5 6 3 0 0 7 9 , 1 0 0 . 6 9 1 3 2 7 8 4 , 1 3 1 . 3 7 8 4 7 0 5 3 ,
59.46042839])
Numpy financial
Instalación paquete:
1 pip i n s t a l l numpy financial
Ejemplo 2 (anualidades) : Supongamos que recibimos pagos de 250¿ al final de cada año
durante 5 años. ¿Cuál será el valor presente de esta anualidad si el tipo de interés que nos
ofrece el banco es del 6 %?.
1 i m p o r t n u m p y f i n a n c i a l a s n p f #a n u a l i d a d e s
2 PV=n p f . pv ( r a t e =0.06 , n p e r =5,pmt=250 , f v =0,when= ’ end ’ ) #v a l o r p r e s e n t e
3 PV
4 Out [ 5 ] : −1053.090946391429
Numpy financial
Ejemplo 2 : Supongamos que tenemos que invertir hoy 4000¿ para recibir en los próximos 5
años estas cantidades: 500¿ al final del primer año, 750¿ al final del segundo, 1000¿al final
del tercer año, 1250¿al final del cuarto año y 500¿al final del quinto año. ¿Serı́a rentable la
inversión?.
1 import n u m p y f i n a n c i a l as npf
2 NPV=n p f . npv ( r a t e =0.06 , v a l u e s =[ −4000 , 5 0 0 , 7 5 0 , 1 0 0 0 , 1 2 5 0 , 5 0 0 ] )
3 NPV
4 Out [ 8 ] : −657.4391082689172
Numpy financial
Al ser la tasa interna de rendimiento mayor que la tasa que nos ofrece el banco, deberı́amos
invertir el dinero en la compañı́a.
SciPy
SciPy contiene el paquete de álgebra lineal linalg, que contiene más métodos que el
paquete linalg de NumPy.
1 i m p o r t numpy a s np
2 import s c i p y . l i n a l g as s c i l
3 A=np . a r r a y ( [ [ 1 , 0 , 0 , 0 ] , [ 0 , − 1 , − 1 , 0 ] , [ 0 , 0 , − 1 , 0 ] , [ 0 , 0 , 0 , 2 ] ] )
4 b=np . a r r a y ( [ 2 , 3 , 4 , 0 ] )
5 s c i l . d e t (A)#c a l c u l a e l d e t e r m i n a n t e de A
6 s c i l . i n v (A)#c a l c u l a l a i n v e r s a de A
7 s c i l . s o l v e (A , b )#r e s u e l v e e l s i s t e m a l i n e a l
8 s c i l . e i g (A) #c a l c u l a a u t o v a l o r e s y a u t o v e c t o r e s
9 s c i l . e i g v a l s (A) #c a l c u l a s o l o l o s a u t o v a l o r e s
Resolución de sistemas lineales
Factorización LU: dada una matriz A no singular, existen unas matrices L triangular
inferior y U triangular superior tales que: A = LU
1 from s c i p y i m p o r t l i n a l g
2 A=np . a r r a y ( [ [ 4 , − 2 , 1 ] , [ 2 0 , − 7 , 1 2 ] , [ − 8 , 1 3 , 1 7 ] ] )
3 P , L , U= l i n a l g . l u (A) #A=P * L *U
4 PL , U= l i n a l g . l u (A , p e r m u t e l =1) #A=PL *U
Factorización de Cholesky: dada una matriz A simétrica y definida positiva, existe una
matriz L triangular inferior tal que: A = LLT
1 A=np . a r r a y ( [ [ 5 , − 3 , 4 ] , [ − 3 , 3 , − 4 ] , [ 4 , −4, 6 ] ] )
2 L= l i n a l g . c h o l e s k y (A , l o w e r=True )
Resolución de sistemas lineales
Factorización QR: dada una matriz A no singular existen unas matrices Q ortogonal y R
triangular superior tales que: A = QR
1 A=np . a r r a y ( [ [ 1 , − 2 , 1 ] , [ − 1 , 3 , 2 ] , [ 1 , −1, − 4 ] ] )
2 Q, R= l i n a l g . q r (A)
Módulo de interpolación en Scipy
1 from s c i p y i m p o r t i n t e r p o l a t e a s i n t e r
2 i m p o r t numpy a s np
3 i m p o r t math
4 import m a t p l o t l i b . pyplot as p l t
5 x=np . l i n s p a c e ( 0 , 2 * math . p i , 5 )
6 y=np . s i n ( x )+x ** 2
7
8 s l f =i n t e r . s p l r e p ( x , y , k=1) #c á l c u l o s p l i n e l i n e a l
9 s c f=i n t e r . s p l r e p ( x , y ) #c á l c u l o s p l i n e c ú b i c o
10 x s=np . l i n s p a c e ( 0 , 2 * math . p i , 5 0 )
11 y s 1=i n t e r . s p l e v ( xs , s l f ) #e v a l u a c i ó n d e l s p l i n e en l o s p u n t o s
12 y s 3=i n t e r . s p l e v ( xs , s c f )
13 p l t . p l o t ( x , y , ’ o ’ , xs , ys1 , ’− ’ , xs , ys3 , ’−− ’ )
14 l e g e n d ( [ ’ d a t o s ’ , ’ l i n e a l ’ , ’ c ú b i c o ’ ] , l o c= ’ b e s t ’ )
El paquete integrate de SciPy
R 2π
Ejemplo: Calcular 0 (sin(x) + 0,5x) dx:
I pasando como argumento una función:
1 import s c i p y import i n t e g r a t e
2 i m p o r t numpy a s np
3 v a l o r , e r r o r=i n t e g r a t e . quad ( lambda x : np . s i n ( x ) +0.5 * x , 0 , 2 * np . p i )
4 #pasamos como argumento una f u n c i ó n
5
6 valor , error
7 Out [ 4 1 ] : ( 9 . 8 6 9 6 0 4 4 0 1 0 8 9 3 5 8 , 1 . 0 9 5 7 4 6 2 0 5 0 0 3 1 1 8 4 e −13)
El paquete integrate de SciPy
R 2π
Ejemplo: Calcular 0 (sin(x) + 0,5x) dx:
I pasando como argumento un objeto ndarray:
1 x i=np . l i n s p a c e ( 0 , 2 * np . p i )
2 f x i =np . s i n ( x i ) +0.5 * x i
3 #R e g l a t r a p e c i o
4 v a l o r t r a p e c i o=i n t e g r a t e . t r a p z ( f x i , x i ) #pasamos como argumento un
l i s t a u objeto ndarray
5 valor trapecio
6 #r e g l a Simpson
7 v a l o r s i m p s o n=i n t e g r a t e . s i m p s ( f x i , x i )
8 valor simpson
El paquete optimize de SciPy:
donde x e y son listas o arrays conteniendo los valores de las abscisas y de las ordenadas,
respectivamente.
Propiedad Abrev. Valor
color c Color de matplotlib
label - Cadena de texto opcionalmente usada para la leyenda
linestyle ls Estilo de lı́nea
linewidth lw Un float, ancho de la lı́nea en puntos
marker - Se especifica el tipo de sı́mbolo
markeredgewidth mew Ancho de la lı́nea entorno al sı́mbolo
markeredgecolor mec Color del borde del sı́mbolo usado
markerfacecolor mfc Color del sı́mbolo
markersize ms Tamaño del sı́mbolo
Gráficos 2-D con Matplotlib
Ejemplos:
1 import m a t p l o t l i b . pyplot as p l t
2 y=np . random . s t a n d a r d n o r m a l ( 2 0 ) #g e n e r a m o s 20 números p s e u d o a l e a t o r i o s
3 x=r a n g e ( l e n ( y ) )
4 plt . plot (x , y)
5 p l t . p l o t ( y )# s i no pasamos x toma l o s v a l o r e s de l o s i n d i c e s como
coordenadas x
6 p l t . p l o t ( y . cumsum ( ) )#l o s métodos d e v u e l v e n de nuevo un o b j e t o n d a r r a y con
l o s mismos d a t o s
Gráficos 2-D con Matplotlib
Ejemplo:
1 x=np . a r a n g e ( 0 , 2 . 2 5 , 0 . 2 5 )
2 y=x **3+x ** 2
3 p l t . p l o t ( x , y , c= ’ r ’ , l s = ’−− ’ , m a r k e r= ’ d ’ , ms=4)
Gráficos 2-D con Matplotlib
1 p l t . f i g u r e ( f i g s i z e =(7 ,4) )
2 y=np . random . s t a n d a r d n o r m a l ( ( 1 0 , 3 ) )
3 p l t . s u b p l o t ( 1 , 2 , 1 )#no s o n n e c e s a r i a s l a s comas
4 p l t . p l o t ( y [ : , 0 ] , c= ’ g ’ , l a b e l= ’ p r i m e r a ’ )
5 p l t . l e g e n d ( l o c= ’ b e s t ’ )
6 plt . subplot (1 ,2 ,2)
7 p l t . p l o t ( y [ : , 1 ] , c= ’ r ’ , l a b e l= ’ s e g u n d a ’ )
8 p l t . l e g e n d ( l o c= ’ b e s t ’ )
Gráficos 2-D con Matplotlib
Otros tipos de gráficos:
I Gráficos de dispersión:
1 p l t . f i g u r e ( f i g s i z e =(7 ,4) )
2 y=np . random . s t a n d a r d n o r m a l ( ( 5 0 0 , 2 ) )
3 p l t . s c a t t e r ( y [ : , 0 ] , y [ : , 1 ] , m a r k e r= ’ o ’ )
4 p l t . x l a b e l ( ’ primero ’ )
5 p l t . y l a b e l ( ’ segundo ’ )
6 p l t . t i t l e ( ’ G r á f i c o de d i s p e r s i ó n ’ )
Gráficos 2-D con Matplotlib
Otros tipos de gráficos
I Histogramas:
1 p l t . f i g u r e ( f i g s i z e =(7 ,4) )
2 y=np . random . s t a n d a r d n o r m a l ( ( 5 0 0 , 3 ) )
3 p l t . h i s t ( y , l a b e l =[ ’ P r i m e r o ’ , ’ Segundo ’ , ’ T e r c e r o ’ ] , b i n s =30)
4 p l t . x l a b e l ( ’ primero ’ )
5 p l t . y l a b e l ( ’ segundo ’ )
6 p l t . t i t l e ( ’ Histograma ’ )
Gráficos 3-D con Matplotlib
Aplicación: representación de una superficie de volatilidades mostrando las volatilidades
implı́citas de manera simultánea para diferentes vencimientos y strikes.
Consideramos:
I Strikes entre 50 y 150
I Vencimientos entre 0.5 y 2.5 años
Por tanto, tenemos un sistema de coordenadas en 2 dimensiones. Utilizamos la función
meshgrid de NumPy para generar dicho sistema de coordenadas a partir de dos objetos
ndarray de 1 dimensión:
1 i m p o r t numpy a s np
2 #from m p l t o o l k i t s . mplot3d i m p o r t Axes3D
3 s t r i k e =np . l i n s p a c e ( 5 0 , 1 5 0 , 2 4 )
4 m a t u r i t y=np . l i n s p a c e ( 0 . 5 , 2 . 5 , 2 4 )
5 s t r i k e , m a t u r i t y=np . m e s h g r i d ( s t r i k e , m a t u r i t y )
6 #r e p i t e l o s v a l o r e s o r i g i n a l e s
Gráficos 3-D con Matplotlib
Generamos ”falsas”volatilidades implı́citas:
1 v i =( s t r i k e −100) * * 2 / ( 1 0 0 * s t r i k e ) / m a t u r i t y #” f a l s a s ” v o l a t i l i d a d e s
i m p lı́ c i t a s
Representamos la superficie:
1 import m a t p l o t l i b . pyplot as p l t
2 f i g =p l t . f i g u r e ( )
3 ax= f i g . gca ( p r o j e c t i o n= ’ 3d ’ ) #o t r a a l t e r n a t i v a ax=Axes3D ( f i g )
4 s u r f=ax . p l o t s u r f a c e ( s t r i k e , m a t u r i t y , v i , cmap=p l t . cm . r a i n b o w )
5 ax . s e t x l a b e l ( ’ s t r i k e ’ )
6 ax . s e t y l a b e l ( ’ v e n c i m i e n t o ’ )
7 ax . s e t z l a b e l ( ’ i m p l i e d v o l a t i l i t y ’ )
8 fig . colorbar ( surf )
Gráficos 3-D con Matplotlib
Superficie de volatilidades:
Simulación de procesos estocásticos-Variables aleatorias
En el modelo de Black-Scholes para para valorar opciones, el precio del activo ST en una fecha
futura T y conocido el valor en tiempo t = t0 , S0 , viene dado por la siguiente ecuación:
√
1 2
ST = S0 exp (r − σ )T + σ T z
2
donde
ST es el precio del activo en tiempo T
r es el tipo de interés libre de riesgo
σ es la volatilidad constante de S
z variable aleatoria con distribución normal
Simulación de procesos estocásticos-Variables aleatorias
h(ST ) = máx(ST − K, 0)
donde
I ST es el precio del subyacente en vencimiento
I T es el vencimiento de la opción
I K es el precio de ejercicio (strike)
Precio de la opción hoy (t = 0) viene dado por la esperanza:
C0 = e−rT EQ
0 (h(ST ))
El método de Monte Carlo
Procedimiento de valoración:
I Generamos I números aleatorios, z(i), i = 1, ..., I, con una distribución normal estándard.
I Calculamos los precios del subyacente en vencimiento ST (i) para cada z(i) dado.
I Calculamos todos los valores de la opción en vencimiento a partir de la función de pago
(payoff).
I Estimamos el valor presente de la opción utilizando el estimador de Monte Carlo.
Valoración de una opción vainilla europea de compra con el método de
Monte Carlo
1 i m p o r t numpy a s np
2 S0 =100. #v a l o r i n i c i a l
3 K=105. #s t r i k e
4 r =0.05 #t i p o de i n t e r é s c o n s t a n t e
5 s i g m a =0.25 #v o l a t i l i d a d
6 T=1. # en a ñ o s
7 I =10000000 #número de t r a y e c t o r i a s
8 N=50
9 d t=T/N
10 S=np . z e r o s ( [ N+1 , I ] )
11 S [ 0 ] = S0
12 f o r t i n r a n g e ( 1 ,N+1) :
13 S [ t ]=S [ t −1] * np . exp ( ( r−s i g m a * * 2 / 2 ) * d t \
14 +s i g m a * np . s q r t ( d t ) * np . random . s t a n d a r d n o r m a l ( I ) )
15 hT=np . maximum ( S[−1]−K, 0 )
16 V0=np . exp (− r *T) * np . sum ( hT ) / I
17 p r i n t ( ’ E l p r e c i o de l a o p c i ó n e s %f ’ %V0 )
Valoración de una opción vainilla europea de compra con el método de
Monte Carlo
1 #C á l c u l o d e l i n t e r v a l o de c o n f i a n z a a l 95 %
2 s t d=np . s q r t ( sum ( ( np . exp (− r *T) * hT−V0 ) * * 2 ) / I )#d e s v i a c i ó n tı́ p i c a
3 s=r ’ %’
4 p r i n t ( ” I n t e r v a l o de c o n f i a n z a a l 95 ”+s+”( %f , % f ) ” %(V0−1.96 * s t d / np . s q r t ( I ) , V0
+1.96 * s t d / np . s q r t ( I ) ) )
5 E l p r e c i o de l a o p c i ó n e s 1 0 . 0 0 2 8 1 7
6 I n t e r v a l o de c o n f i a n z a a l 9 5 % ( 9 . 9 8 3 8 5 3 , 1 0 . 0 5 0 4 9 0 )
Valoración de una opción vainilla europea de compra con la fórmula
analı́tica de Black-Scholes
Solución exacta del modelo de Black-Scholes:
log(S/K) + (r + σ 2 /2)(T − t)
d1 = √
σ T −t
log(S/K) + (r − σ 2 /2)(T − t)
d2 = √
σ T −t
Rx
N (x) = √1 2 /2) dy
2π −∞ exp(−y es la función de distribución acumulada de una distribución
normal
Valoración de una opción vainilla europea de compra con la fórmula
analı́tica de Black-Scholes
h(ST ) = máx(K − ST , 0)
donde
I ST es el precio del subyacente en vencimiento
I T es el vencimiento de la opción
I K es el precio de ejercicio (strike)
Precio de la opción hoy (t = 0) viene dado por la esperanza:
P0 = e−rT EQ
0 (h(ST ))
Ejercicio 1: Implementar el método de Monte Carlo en una función que permita valorar
tanto opciones vainilla europeas de compra como de venta.
Ejercicio 2: Implementar la fórmula analı́tica de Black-Scholes en una función que me
permita valorar tanto opciones vainilla europeas de compra como de venta.
Ejercicio 3: Valorar con ambas funciones una opción europea de compra y otra de venta
con vencimiento 3 meses, precio de ejercicio 15.00, precio del activo hoy 17.00, tipo de
interés 3 % y volatilidad del activo 25 %.
Modelo de Black-Scholes para dividendos continuos
log(S/K) + (r − D0 + σ 2 /2)(T − t)
d1 = √
σ T −t
log(S/K) + (r − D0 − σ 2 /2)(T − t)
d2 = √
σ T −t
Modelo de Black-Scholes con dividendos continuos