23/3/2021

Nociones de riesgo colectivo

Consideremos el problema de calcular cuantiles para sumas compuestas, como el cuantil al 99.5% (v.gr. capital económico, valor en riesgo, Solvencia II). Desde una perspectiva probabilística, tenemos que calcular, para todo \(s \in \mathbb{R}\),

\[ F(s) = P(S \leq s),\,\ \text{donde} \,\ S = \sum_{i=1}^N X_i .\] Por independencia, se puede utilizar una fórmula de convolución sencilla:

\[ F(s) = \sum_{n=0}^{\infty} F^*_X(n)\cdot P(N=n) .\]

Desde la perspectiva estadística, las distribuciones de \(N\) y \(X_i\) son desconocidas pero pueden estimarse usando muestras. Para ilustrar esto,se tiene la siguiente muestra (simulada), con \(200\) cantidades de reclamaciones

set.seed(1)
X <- rexp(200,rate=1/100)
print(X[1:5])
## [1]  75.51818 118.16428  14.57067  13.97953  43.60686

Con esta muestra se pueden usar técnicas estadísticas para estimar la distribución de las \(X_i\).

Una distribución estándar para los montos de las pérdidas es la distribución \(Gam.- α, β\).

Para estimar los parámetros de la distribución Gamma, podemos resolver las ecuaciones normales, que pueden escribirse como

\[ \log \hat{\alpha} - \frac{\Gamma'(\hat{\alpha})}{\Gamma(\hat{\alpha})} - \log \overline{X} + \overline{\log X} = 0 \,\ \text{y} \,\ \overline{\beta} = \frac{\hat{\alpha}}{\overline{X}}.\] Para resolver la primera ecuación, existen tablas para \(\hat{\alpha}\) en función de \(M = \log{\overline{X}} - \overline{\log X}\), pero usando la función digamma \(Γ ' (\hat{α}) / Γ (α)\), es relativamente trivial mediante la función \(\texttt{uniroot()}\) como se indica a continuación:

f <- function(x) log(x)-digamma(x)-log(mean(X))+mean(log(X))
alpha <- uniroot(f,c(1e-8,1e8))$root
beta <- alpha/mean(X)

Para el proceso de conteo, se supone una distribución Poisson para \(N\), con una media de \(100\). Numéricamente se puede calcular la suma en la fórmula de convolución anterior, pues una suma de variables aleatorias Gamma independientes todavía tiene una distribución Gamma,

  F <- function(x,lambda=100,nmax=1000) {n <- 0:nmax
  sum(pgamma(x,n*alpha,beta)*dpois(n,lambda))}

Una vez que tenemos una función para calcular la función de distribución acumulada de \(S\), solo necesitamos invertirla. Encontrar \(x\) tal que \(F (x) = .995\) es lo mismo que encontrar la raíz de la función \(x → F (x) - .995\).

  uniroot(function(x) F(x)-.995,c(1e-8,1e8))$root
## [1] 13654.43

Se puede emplear la transformada rápida de Fourier al calcular la distribución de una suma compuesta usando una versión discretizada de las \(X_i ' s\). Para calcular la función de probabilidad de \(S\) se discretiza la distribución Gamma en \(N = \{0, 1, 2,...\}\) con un límite superior de \(2^{20}\), lo que da

n <- 2^20; lambda <- 100
p <- diff(pgamma(0:n-.5,alpha,beta))
f <- Re(fft(exp(lambda*(fft(p)-1)),inverse=TRUE))/n

Para calcular el cuantil al nivel \(α\), solo tenemos que encontrar \(x_α\) tal que \(F (x _α - 1) <α ≤ F (x_α)\) y ese valor es

sum(cumsum(f)<.995)
## [1] 13654

\(\texttt{R}\)

\(\texttt{R}\), http://cran.r-project.org/, es un paquete de software de código abierto, bajo la Licencia Pública General GNU (GPL). \(\texttt{R}\) se puede instalar de forma gratuita en la mayoría de equipos y servidores. Esta independencia de la plataforma y la filosofía de código abierto hacen de \(\texttt{R}\) un entorno ideal para la investigación reproducible. \(\texttt{R}\) es un lenguaje de secuencias de comandos para la manipulación de datos, el análisis estadístico y la visualización gráfica. Se inspiró en el entorno \(\texttt{S}\), desarrollado por John Chambers, Douglas Bates, Rick Becker, Bill Cleveland, Trevor Hastie, Daryl Pregibon y Allan Wilks del equipo de investigación de AT&T en la década de 1970. En 1998, la Association for Computing Machinery (ACM) otorga a John Chambers el premio Software System Award. \(\texttt{R}\) fue escrito por Ross Ihaka y Robert Gentleman, en el Departamento de Estadística de la Universidad de Auckland.

John Chambers contribuyó en los primeros días de Rand y más tarde se convirtió en miembro del equipo central. \(\texttt{R}\) es el resultado de un proyecto colaborativo, impulsado por este equipo central, con contribuciones de usuarios de todo el mundo. \(\texttt{R}\) es un lenguaje interpretado: cuando se ingresan expresiones en la consola de \(\texttt{R}\), un programa dentro del sistema \(\texttt{R}\) (llamado intérprete) ejecuta el código, a diferencia de \(\texttt{C}\) / \(\texttt{C++}\) pero como \(\texttt{JavaScript}\). Por ejemplo, al escribir \(\texttt{2+3}\) en el símbolo del sistema y presionar \(\texttt{Enter}\), la computadora responde con \(\texttt{5}\). \(\texttt{R}\) guarda las declaraciones de la sesión actual en un búfer. Se pueden usar las teclas ↑ y ↓ para recordar declaraciones anteriores o para moverse hacia abajo desde una declaración anterior. La línea activa es la última línea en la ventana de sesión (llamada consola), y se pueden usar las teclas ← y → para moverse dentro de una declaración en esta línea activa. Para ejecutar una línea, presionamos \(\texttt{Enter}\).

Editores como \(\texttt{RStudio}\), \(\texttt{Tinn-R}\) o \(\texttt{JGR}\) (\(\texttt{Java}\) \(\texttt{Gui}\) \(\texttt{R}\)) permiten seleccionar líneas de código y luego ejecutar. La extensión natural para el script de \(\texttt{R}\) es un archivo \(\texttt{.R}\) y para el espacio de trabajo es \(\texttt{.RData}\). \(\texttt{R}\) es un lenguaje de programación orientado a objetos con la idea de contener información útil y que pueda ser invocada por otras funciones. Por ejemplo, al ajustar modelos lineales y mandar llamar a la función \(\texttt{lm}\) en \(\texttt{R}\), se devuelve un objeto que contiene los coeficientes estimados \(\hat{β}\), los residuos implícitos \(\hat{ε}\), la matriz de varianza estimada de los coeficientes \(\text{var} (\hat{β})\), etc. Esto significa que en \(\texttt{R}\), el análisis generalmente se realiza en una serie de pasos consecutivos, donde los resultados intermedios se almacenan en objetos que se manipulan aún más para obtener la información requerida, utilizando funciones dedicadas.

Los vectores y las matrices no solo son objetos que pueden pasarse y devolverse mediante funciones, sino que las funciones en sí mismas también son objetos, incluso llamadas a funciones. En \(\texttt{R}\), el operador de asignación preferido (por la comunidad de usuarios) es la flecha formada por dos caracteres \(\texttt{<-}\), aunque en su lugar se puede usar el símbolo \(\texttt{=}\). La principal ventaja de \(\texttt{<-}\) es que permite asignar objetos dentro de una función.

En \(\texttt{R}\), los comentarios seguirán la etiqueta #, todo después de la etiqueta # no será interpretado por \(\texttt{R}\).

T <- 10 # horizonte temporal
r <- .05 # tasa de descuento = 5%
(1+r)^(-T) # 1$ en T años
## [1] 0.6139133

Usar paréntesis (o llaves, pero no corchetes, que se usan para indexar matrices) es recomendable para obtener una mejor comprensión.

{1+r}^(-T)
## [1] 0.6139133

Los cálculos en \(\texttt{R}\) seguirán al símbolo \(\texttt{[1]}\). Es posible utilizar espacios para ayudar leer el código, así como utilizar un \(;\) para escribir dos comandos en la misma línea.

(1 + r)^( -T ); {1+r/2}^(-T)
## [1] 0.6139133
## [1] 0.7811984

Un paquete en \(\texttt{R}\) es un conjunto de funciones relacionadas, incluidos archivos de ayuda y archivos de datos, que se han agrupado y se comparten entre la comunidad de \(\texttt{R}\). Esos paquetes son similares a bibliotecas en \(\texttt{C}\) / \(\texttt{C++}\) y clases en \(\texttt{Java}\). Para obtener la lista de paquetes cargados por defecto, el comando \(\texttt{getOption}\) se puede utilizar:

getOption("defaultPackages")
## [1] "datasets"  "utils"     "grDevices" "graphics"  "stats"     "methods"

Para disponer de un paquetes sólo se tiene que cargar. Pero antes, se debe instalar (por ejemplo, \(\texttt{quantreg}\) para ejecutar regresión de cuantiles)

install.packages("quantreg", dependencies=TRUE)

y luego seleccionamos un sitio espejo para descargar. La opción \(\texttt{dependencies = TRUE}\) se usa porque el paquete \(\texttt{quantreg}\) puede estar usando funciones provenientes de otros paquetes. Una vez se ha cargado un paquete, es posible llamar a las funciones asociada. Para cargar un paquete en \(\texttt{R}\), se debe usar el comando \(\texttt{library()}\) o \(\texttt{require()}\),

library("quantreg")

También es posible obtener una descripción general de los paquetes existentes sobre diferentes temas en la página de vistas de tareas, http://cran.r-project.org/web/views/, como finanzas empíricas o econometría.