Está en la página 1de 7

Proyecto 2: VaR y CVar de un portafolio mexicano

Métodos Cuantitativos en Finanzas


8 de abril de 2020

1. Denición del proyecto


Se utilizarán los conocimientos obtenidos en Python (o en cualquier otro lenguaje de programación de
su preferencia) para:

• Obtener un código que graque el VaR (Value at Risk) y CVaR (Conditional Value at Risk)
[o ES (Expected Shortfall)] a un día de un portafolio de 100 pesos, que contenga partes iguales
en acciones de Alfa S.A.B. de C.V., en el bono M dic-24 y en dólares. (4 puntos VaR y 4 puntos
CVaR)

• El método para calcular estas medidas de riesgo deberá ser elegido por el alumno: simulación
histórica, paramétrico (varianzas y covarianzas) o Monte Carlo.

• Se utilizarán los precios desde diciembre de 2007 para los 3 activos mencionados, compartidos
desde un inicio en un archivo con formato csv.

• Se deberán considerar ventanas móviles de 100 días, es decir, se deberán calcular el VaR y CVaR
con los primeros 100 cambios logarítmicos del 2008, y estos se deberán comparar con la ganancia
real que se tuvo el día 101. Después, con los rendimientos del segundo día del 2008 y los siguientes
99, calcular VaR y CVaR y comparar con ganancia del día 102, y así sucesivamente. Grácando
al nal todos estos resultados.

• El nivel de conanza (α) deberá ser un parámetro que se pueda cambiar de manera fácil para
obtener un gráco diferente.

El resultado deberá ser parecido al siguiente:

1
• Finalmente se deberá hacer un recuento del número de violaciones que se tienen del VaR con
respecto al total de observaciones y ver cómo se compara contra el nivel de conanza. (2 puntos)

Fecha de entrega: Sábado 24 de abril de 2020.


El proyecto se entregará en equipos de 4 personas. Para los proyectos que se programen en Python se
otorgará 1 punto extra sobre la calicación nal del proyecto.
El nombre del archivo que envíen, al igual que el asunto del correo, deberá tener el
siguiente formato: Proyecto2_Equipo[nn].[extensión]. Es decir, si son el equipo 4 y re-
alizan un código en R, el archivo se deberá llamar Proyecto2_Equipo04.R. Únicamente
adjuntar un archivo de código.
Cabe destacar que si el proyecto no se entrega a más tardar las 23:59 horas del día establecido, se
recibirá únicamente dentro de las siguientes 24 horas con solo derecho a la mitad de la calicación.
Finalmente, cualquier duda que tengan la pueden preguntar a través de correo electrónico.

2. Denición de VaR y CVaR


Sea X la distribución de ganancias de un portafolio, así, el VaR, la peor pérdida esperada en un
horizonte de tiempo dado un nivel de conanza α se dene como:

−1
V aRα (X) = −FX (1 − α)
−1
Donde FX es la función de distribución inversa de X.
Mientras que el CVaR se dene como:

CV aRα (X) = −E [X |X <= −V aRα (X) ]

2
Así, vemos que realmente estos valores dependen de las hipótesis que se realicen acerca de la función
de distribución de X.

3. Simulación histórica
Supongamos se tiene un portafolio P con m activos, y los precios de estos para n días, sean:
N : valor nocional del portafolio.
k Si : precio del activo k a tiempo i ∈ {1, . . . , n}, k ∈ {1, . . . , m}.
k ri : rendimiento discreto del activo k a tiempo i.
P ri : redimiento del portafolio P a tiempo i.
percY (β) : percentil β de la distribución empírica de observaciones P de Y .
m
k w : peso del activo k en el portafolio, cumpliendo únicamente que k=1 k w = 1.
Así para i ∈ {2, . . . , n}, los rendimientos discretos del activo k son:

k Si− k Si−1
k ri =
k Si−1

Luego:

m
X
P ri = kw · k ri
k=1

Si R es la variable aleatoria de los rendimientos de P , de la cuál tenemos las observaciones P r1 , . . . , P rn ,


entonces denimos el VaR de simulación histórica de un portafolio con distrtibución de ganancias X
como:

V aRα (X) = −N · percR (1 − α)


Para calcular el CVaR solo se debe considerar

z = promedio ({P ri |P ri ≤ percR (1 − α) })


Y así:

CV aRα (X) = −N · z
En el caso particular de un bono las observaciones para R se pueden calcular como las diferencias
simples de las tasas, y entonces el VaR y CVaR se pueden aproximar como:

M acD · P (y) · percR (1 − α)


V aRα (X) = −
1 + ky


M acD · P (y) · z
CV aRα (X) = −
1 + ky


Cabe destacar que en este modelo no se hacen supuestos de ningún tipo sobre la distribución de
ganancias X.

3
4. Varianzas y covarianzas
Para este modelo la hipótesis importante es que los rendimientos R de un activo tienen distribución
normal con media µP y desviación estándar σP , así:

V aRα (X) = −N (µP − σP Zα )


Donde N es el valor nocional del portafolio y Zα = FZ−1 (α) con FZ la función de distribución de una
normal estándar. También:

 
Z2
− 2α
e
CV aRα (X) = −N µP − σP √ 
(1 − α) 2π

Para el caso de un portafolio de m activos cada uno con rendimientos R1 , . . . , Rm distribuidos de


manera normal con vector de medias µT = [µ1 µ2 · · · µm ], se considera la media del rendimiento del
portafolio como un producto matricial:

µP = wT µ
Con wT = [w1 w2 · · · wm ] el vector de pesos de cada uno de los activos del portafolio. Y la desviación
del portafolio:


σP = wT Σw
Donde Σ es la matriz de varianzas y covarianzas, es decir, cada entrada es:

σij = Cov (Ri , Rj ) = ρij σi σj


Con i, j ∈ {1, . . . , m}, Cov la covarianza y ρij la correlación entre Ri y Rj . Y se sigue cumpliendo el
cálculo de V aRα (X) y CV aRα (X). Para aproximar µP y σP se pueden utilizar estimadores insesgados
con los rendimientos logarítmicos diarios.
Cabe destacar que para cambiar la temporalidad del V aR y CV aR de 1 día a T días:


V aRT = V aR T


CV aRT = CV aR T
Siempre que los rendimientos sigan una distribución normal estándar con media cero, si esto último
no se cumple siempre se puede hacer una transformación.

5. Simulación Montecarlo

Utilizando el modelo de un movimiento browniano geométrico para el precio, se tiene que cambios
pequeños en el precio de un activo están denidos por:

dSt = µt St dt + σt St dz
Donde dz es una variable aleatoria normal con media cero y varianza dt. Discretizando y tomando µt
y σt constantes a través del tiempo:

∆St √
rt = = µ∆t + σ ∆t
St−1
Con  una normal estándar. Para calcular la simulación Montecarlo en un tiempo T con l pasos se
T
debe considerar ∆t = l . Y suponiendo que se hacen n simulaciones:

4
l l r !
Y Y T T
ir = (1 +i rj ) − 1 = 1 + µ + σ −1
j=1 j=1
l l

Es el rendimiento acumulado de la simulación i ∈ {1, . . . , n} durante el periodo T. Aproximando µ y


σ con estimadores insesgados para los rendimientos logarítmicos diarios y tomando 1 r, . . . , n r como las
observaciones de la variable aleatoria R, se pueden obtener el V aRα (X) y CV aRα (X) de la misma
forma que en la simulación histórica.
Para el caso de un portafolio con m activos se puede utilizar lo siguiente:


V aRP = N wT Ωw
Donde cada entrada de Ω es:

ωij = V aRi V aRj ρij


Con i, j ∈ {1, . . . , m}. Esto se cumple siempre que los rendimientos de cada activo sigan una distribu-
ción normal estándar con media cero, si esto último no se cumple se puede hacer una transformación,
de igual manera es válido para el cálculo del CV aR. Para aproximar el coeciente de correlación ρij
se puede utilizar el modelo no paramétrico de Spearman o el lineal de Pearson.

6. Funciones en Python
Biblioteca pandas
Es una biblioteca útil para el manejo de data frames y realizar operaciones iterativas dentro de ellos.

p a n d a s . r e a d _ c s v ( "C : / U s e r s / u s u a r i o / Documents / P r e c i o s . c s v " )

Permite acceder a un archivo en formato csv especicando ruta y nombre para obetener un data frame.

data_frame . drop ( l a b e l s , a x i s )

Permite borrar las o columnas (axis = 0 o axis = 1) de un data frame con labels como un vector de
identicadores.

data_frame . pct_change ( )

Calcula los cambios porcentuales de las columnas de un data frame.

data_frame . a p p l y ( f u n c t i o n , a x i s )

Calcula el resultado de aplicar una función denida anteriormente (por ejemplo function = lambda x:
sum(x) calcula la suma de las entradas de x) sobre las o columnas (axis = 0 o axis = 1).

data_frame . d t y p e s

Últil para saber el tipo de variables dentro de un data frame.

data_frame . l o c [ a , b ]

Devuelve un dataframe con las las a y las columnas b, donde a y b son vectores de índices. Para
elegir una la o columna completa se debe utilizar el símbolo  :.

p a n d a s . t o _ d a t e t i m e ( d a t a _ f r a m e [ ' Date ' ] , f o r m a t ) . d t . d a t e

Convierte una columna que se llama Date a formato date, f ormat se reere al formato original de la
fecha, por ejemplo f ormat =0 %d/%m/%Y 0 sería para fechas con el formato 24/05/1994.

5
Biblioteca numpy
Es una biblioteca útil para el manejo de arrays, incluyendo matrices, y operaciones que se pueden
realizar con ellas.

numpy . a s a r r a y ( x )

Convierte un objeto no array (como un data frame) a un array.

numpy . z e r o s ( (m, n ) )
numpy . o n e s ( k )

Crea una matriz de tamaño m×n o un array de tamaño k de ceros o unos.

numpy . l o g ( a r r a y )

Calcula el logaritmo natural a todas las entradas de un array.

numpy . s o r t ( a r r a y )

Ordena los elementos de un array.

numpy . p e r c e n t i l e ( a r r a y , a l f a )

Calcula el percentil alfa (entre 0 y 100) de los elementos en el array.

numpy . a v e r a g e ( a r r a y )

Obtiene el promedio de los elementos dentro de un array.

numpy . c o v ( m a t r i x , r o w v a r , b i a s )

Calcula la matriz de varianzas y covarianzas de otra matriz o data frame. Rowvar es un booleano que
Veradero (default) implica que cada una de las las es la serie de una variable, Falso serían las columnas.
Bias es un booleano que Falso (default) implica el cálculo de estimadores insesgados, Veradero serían
sesgados.

numpy . d o t ( a r r a y 1 , a r r a y 2 )

Da como resultado el producto matricial de array1 y array2.

numpy . t r a n s p o s e ( a r r a y )

Obtiene el transpuesto de un array.

numpy . random . n o r m a l ( mean , sd , s i z e )

Regresa un vector de tamaño size de normales aleatorias con media mean y desviación estándar sd.

Biblioteca math
math . e x p ( x )

Da como resultado la constante de Euler elevada al número x.

math . p i

Da como resultado la constante del número de veces que cabe el diámetro de un círculo en su perímetro.

Otros
from scipy . stats import norm
norm . p p f ( b e t a )

Calcula la función de distribución inversa de una normal estándar para un valor beta.

array [ a , b ]

6
Obtiene el valor a en las las, b en las columnas de un array (los índices empiezan en 0). Se puede
utilizar en una sola dimensión omitiendo la segunda entrada.

import matplotlib . pyplot as plt


plt . plot (x , y)

Se obtiene una gráca de línea con x como el eje horizontal y y el eje vertical.

array [ l o g i c a r r a y ]

Cuando array y logicarray tienen las mismas dimensiones, se otienen solo los valores del array en los
que logicarray es verdadero. Por ejemplo:

x[x < 5]

Nos regresaría un array con todos los valores de x que son menores a 5.

7. Bibliografía
• Jorion, Philippe (2007). Value at Risk. McGraw Hill. Partes 2 y 3.

• Hull, John C. (2008). Risk Management and Financial Institutions. Wiley. Capítulos 11-13.

También podría gustarte