def gamma(fjs_, j, J): """ Estimación del parámetro :math:`\\gamma_j` requerido para calcular el error de estimación. :param np.array fjs_: Estimación de los factores de desarrollo :math:`f_j`. La lista fjs\_ debe contener las entradas computadas de los parámetros :math:`f_j` desde 0 hasta :math:`J-1`, donde se asume que la :math:`j`-ésima entrada de fjs\_ corresponde con :math:`f_j` (:math:`\\text{fjs_[j]} = f_j`). :param int j: Entero con valor entre 0 y :math:`J` (incluyendo 0 y :math:`J`). :param int J: Número de columnas de la :ref:`matriz de datos <triangle_format>`. :return: Si :math:`j = 0`, retorna :math:`\\gamma_0 = \\prod_{k=0}^{J-1}f_j`. Si :math:`j = J`, retorna :math:`\\gamma_J = 1-\\sum_{n=0}^{J-1}\\gamma_n` donde los parámetros :math:`\\gamma_n` se estiman con esta misma función. Si :math:`j = 1, \\cdots, J-1`, retorna :math:`\\gamma_j = \\left(1-\\frac{1}{f_{j-1}}\\right)\\prod_{k=j}^{J-1}\\frac{1}{f_k}`. :Posibles errores: + **AssertionError**: + El parámetro :math:`j` no es un valor entero entre 0 y :math:`J` + La longitud de la lista fjs\_ es menor que :math:`J`. """ assert j in range(J+1), "j debe ser menor o igual a J." assert len(fjs_) >= J, "No hay suficientes fjs para estimar gamma_j." if j == 0: beta = prod(1.0 / fjs_[: J]) return beta elif j == J: return 1 - sum([gamma(fjs_, a, J) for a in range(J)]) else: return prod(1.0 / fjs_[j: J]) * (1.0 - 1.0 / fjs_[j - 1])
def estimate_cij(triangle, fjs, cijs_ferguson, i, j): """ Estima :math:`C_{i, j}` mediante el modelo Hovinen entendido como el monto por concepto de incurridos en el período :math:`i` reportados hasta :math:`j` períodos después. :param np.ndarray triangle: Matriz de información. Véase la sección :ref:`preparación de los datos de entrada <triangle_format>` para más información. :param fjs: Array de tamaño :math:`J` donde el :math:`j`-ésimo elemento corresponde con el valor estimado del factor de desarrollo :math:`f_j`. :param cijs_ferguson: Matriz de tamaño :math:`I \\times J` donde la entrada :math:`i, j` corresponde con la estimación de :math:`C_{i, j}` por parte del modelo Ferguson. :param int i: Período en el que sucedió el siniestro. Toma valores desde 0 hasta :math:`I`. :param int j: Cantidad de períodos transcurridos después de sucedido el siniestro hasta que fue reportado. Toma valores desde 0 hasta :math:`J`. :return: Si :math:`i+j \\leq I`, devuelve la posición :math:`i, j` de la matriz triangle. Si no, retorna :math:`C_{i, j}^{Hov} = C_{i, I-i} + (1-\\beta_{I-i})C_{i, j}^{Fer}` donde :math:`\\beta_j=\\prod_{k=j}^{J-1}\\frac{1}{f_k}`, :math:`C_{i, j}^{Hov}` es la estimación mediante el modelo Hovinen de :math:`C_{i, j}`, y :math:`C_{i, j}^{Fer}` es la estimación mediante el modelo Ferguson de :math:`C_{i, j}`. :Posibles errores: + **AssertionError**: + El parámetro :math:`i` no es un valor entero entre 0 e I. + El parámetro :math:`j` no es un valor entero entre 0 y J. + No se han calculado los suficientes valores de :math:`f_j`. """ I, J = get_matrix_dimensions(triangle) assert i in range(I + 1), "Período de incurrido a estimar inválido" assert j in range(J + 1), "Período de reportado a estimar inválido" assert len( fjs) + 1 > j, "Se requieren más fj's calculados para estimar cij" if i + j <= I: return triangle[i, j] beta = prod(1.0 / fjs[I - i:J]) return triangle[i, I - i] + (1 - beta) * cijs_ferguson[i, j]
def estimate_cij(triangle, fjs_, i, j): """ Estimador de :math:`C_{i, j}` interpretado como el pago acumulado de siniestros incurridos en el período :math:`i` reportados hasta :math:`j` períodos después. :param np.ndarray fjs_: Estimación de los factores de desarrollo :math:`f_j`. La lista fjs\_ debe contener las entradas computadas de los parámetros :math:`f_j` desde 0 hasta :math:`j-1`, donde se asume que la :math:`j`-ésima entrada de fjs\_ corresponde con :math:`f_j` (:math:`\\text{fjs_[j]} = f_j`). :param np.ndarray triangle: Matriz de información. Véase la sección :ref:`preparación de los datos de entrada <triangle_format>` para más información. :param int i: Período en el que sucedió el siniestro. Toma valores desde 0 hasta :math:`I`. :param int j: Cantidad de períodos transcurridos después de sucedido el siniestro hasta que fue reportado. Toma valores desde 0 hasta :math:`J`. :return: Cuando :math:`i+j > I`, devuelve :math:`C_{i,j} = C_{i, I-i}f_{I-i}\\cdots f_{j-1}`. Cuando :math:`i+j \\leq I`, devuelve la posición :math:`i, j` de la matriz triangle. :Posibles errores: + **AssertionError**: + El parámetro :math:`i` no es un valor entero entre 0 e I. + El parámetro :math:`j` no es un valor entero entre 0 y J. + No se han calculado los suficientes valores de :math:`f_j`. + La estimación es **NaN**: Las entradas requeridas de la matriz para estimar :math:`f_j` son cero (o casi todas cero). """ I, J = get_matrix_dimensions(triangle) assert i in range(I + 1), "Período de incurrido a estimar inválido" assert j in range(J + 1), "Período de reportado a estimar inválido" assert len( fjs_) + 1 > j, "Se requieren más fj's calculados para estimar cij" if i + j <= I: return triangle[i, j] fjs = fjs_[I - i:j] cij = triangle[i, I - i] return prod(fjs) * cij
def estimate_cij(triangle, fjs_, i, j, nus): """ Estimación de :math:`C_{i, j}` mediante el modelo Ferguson interpretado como el pago acumulado de los siniestros incurridos en el período :math:`i` reportados hasta :math:`j` períodos después. El modelo Ferguson requiere de una estimación *a priori* por parte de un experto de :math:`C_{i, J}` (:math:`J` es el último período de desarrollo). En otras palabras se requiere de una estimación de los pagos acumulados de siniestros incurridos en cada período y reportados el último período de registro, en este caso, :math:`J`. Esta estimación se denota por :math:`\\nu_i = C_{i, J}`. :param np.array fjs_: Estimación de los factores de desarrollo :math:`f_j`. La lista fjs\_ debe contener las entradas computadas de los parámetros :math:`f_j` desde 0 hasta :math:`j-1`, donde se asume que la :math:`j`-ésima entrada de fjs\_ corresponde con :math:`f_j` (:math:`\\text{fjs_[j]} = f_j`). :param np.ndarray triangle: Matriz de información. Véase la sección :ref:`preparación de los datos de entrada <triangle_format>` para más información. :param int i: Período en el que sucedió el siniestro. Toma valores desde 0 hasta :math:`I`. :param int j: Cantidad de períodos transcurridos después de sucedido el siniestro hasta que fue reportado. Toma valores desde 0 hasta :math:`J`. :param np.array nus: Estimación *a priori* del parámetro :math:`\\nu_i`. Es una lista de tamaño :math:`I`, donde la :math:`i`-ésima entrada es la estimación *a priori* por parte de un experto de :math:`C_{i, J}` (pago de siniestros incurridos en el período :math:`i` reportados en el período :math:`J`). :return: Cuando :math:`i+j>I`, se calcula mediante la fórmula :math:`C_{i, j} = \\beta_jC_{i, J}` donde :math:`C_{i, J} = C_{i, I-i} + (1- \\beta_{I-i})\\nu_i` y donde :math:`\\beta_j=\\prod_{k=j}^{J-1}\\frac{1}{f_k}`. Cuando :math:`i+j \\leq I`, devuelve la posición :math:`i, j` de la matriz triangle. :Posibles errores: + **AssertionError**: + El parámetro :math:`i` no es un valor entero entre 0 e I. + El parámetro :math:`j` no es un valor entero entre 0 y J. + No se han calculado los suficientes valores de :math:`f_j`. + La lista :math:`\\mu_i` debe tener longitud al menos de i+1. """ I, J = get_matrix_dimensions(triangle) assert i in range(I+1), "Período de incurrido a estimar inválido" assert j in range(J+1), "Período de reportado a estimar inválido" assert len(fjs_)+1 > j, "Se requieren más fj's calculados para estimar cij" assert len(nus) > i, "se requieren mas estimacion es de ciJ para calcular cij" if i+j <= I: return triangle[i, j] beta_I_i = prod(1.0 / fjs_[I - i: J]) ciJ = triangle[i, I - i] + (1 - beta_I_i) * nus[i] betaj = prod(1.0 / fjs_[j: J]) return betaj * ciJ
def estimation_error(triangle, fjs_, sjs_, sigma_squares_, i, j): """ Error de estimación para el modelo Mack. :param np.ndarray triangle: Matriz de información. Véase la sección :ref:`preparación de los datos de entrada <triangle_format>` para más información. :param np.ndarray fjs_: Estimación de :math:`f_j`. La lista fjs\_ debe contener las entradas computadas de los parámetros :math:`f_j` desde 0 hasta j-1, donde se asume que la :math:`j`-ésima entrada de fjs\_ corresponde con :math:`f_j` (:math:`\\text{fjs_[j]} = f_j`). :param np.ndarray sjs_: Estimación de :math:`s_j`. La lista sjs\_ debe contener las entradas computadas de los parámetros :math:`s_j` desde 0 hasta j-1, donde se asume que la :math:`j`-ésima entrada de sjs\_ corresponde con :math:`s_j` (:math:`\\text{sjs_[j]} = s_j`). :param sigma_squares_: Estimación de :math:`\sigma_j`. La lista sigma_squares\_ debe contener las entradas computadas de los parámetros :math:`\sigma_j` desde 0 hasta j-1, donde se asume que la :math:`j`-ésima entrada de sigma_squares\_ corresponde con :math:`\sigma_j` (:math:`\\text{sigma_squares_[j]} = f_j`). :param int i: Período en el que sucedió el siniestro. Toma valores desde 0 hasta :math:`I`. :param int j: Cantidad de períodos transcurridos después de sucedido el siniestro hasta que fue reportado. Toma valores desde 0 hasta :math:`J`. :return: Cuando :math:`i+j > I`, devuelve: :math:`\\text{error estimación}_{i, j} = C_{i, I-i}^2\\left( \\prod_{k=I-i}^{j-1}\\left(f_k^2 + \\frac{\\sigma_k^2}{s_k}\\right) - \\prod_{k=I-i}^{j-1}f_k^2 \\right)` Cuando :math:`i+j \\leq I`, devuelve 0. :Posibles errores: + **AssertionError**: + El parámetro :math:`i` no es un valor entero entre 0 e I. + El parámetro :math:`j` no es un valor entero entre 0 y J. + No se han calculado los suficientes valores de :math:`f_j`. """ I, J = get_matrix_dimensions(triangle) assert i in range(I + 1), "Período de incurrido a estimar inválido" assert j in range(J + 1), "Período de reportado a estimar inválido" assert len( fjs_) + 1 > j, "Se requieren más fj's calculados para estimar cij" if i + j <= I: return 0.0 cij = triangle[i, I - i] fj_ = fjs_[I - i:j] sj_ = sjs_[I - i:j] sigma_sq = sigma_squares_[I - i:j] square_fjs = fj_**2 partial_res = prod(square_fjs + sigma_sq * 1.0 / sj_) - prod(square_fjs) return np.sqrt((cij**2) * partial_res)
def cij_deviation(cijs_deviations_mack, fjs, i, j): """ Desviación de :math:`C_i, j` con el modelo Hovinen. :param np.ndarray cijs_deviations_mack: Matriz donde la :math:`i, j`-ésima entrada corresponde con la desviación de :math:`C_{i, j}` según Mack. :param np.array fjs: Lista donde la :math:`j`-ésima entrada corresponde con el factor de desarrollo :math:`f_j`. :param i: Período de ocurrencia en el que se va a calcular la desviación. Puede tomar valores :math:`i=0, \\cdots, I` :param j: Período de reporte en el cuál se va a calcular la desviación. Puede tomar valores :math:`i=0, \\cdots, J`. :return: :math:`(1-\\beta_{I-i})\\beta_{I-i}C_{i, j}^{CL}` donde :math:`\\beta_j=\\prod_{k=j}^{J-1}\\frac{1}{f_k}`. """ I, J = get_matrix_dimensions(cijs_deviations_mack) if i + j <= I: return 0.0 beta = prod(1.0 / fjs[I - i:J]) return ((1 - beta) * beta) * cijs_deviations_mack[i, j]
def calc_mu(triangle, fjs_, i): """ Estimador del parámetro :math:`\\mu_i` requerido para la calcular el error de estimación. :param np.ndarray triangle: Matriz de información. Véase la sección :ref:`preparación de los datos de entrada <triangle_format>` para más información. :param np.array fjs_: Estimación de los factores de desarrollo :math:`f_j`. La lista fjs\_ debe contener las entradas computadas de los parámetros :math:`f_j` desde 0 hasta :math:`I-1`, donde se asume que la :math:`j`-ésima entrada de fjs\_ corresponde con :math:`f_j` (:math:`\\text{fjs_[j]} = f_j`). :param int i: Entero con valor entre 0 e :math:`I-1` (incluyendo 0 e :math:`I-1`). :return: :math:`\\mu_i = C_{i, I-i}\\prod_{k=I-i}^{I-1}f_k`. :Posibles errores: + **AssertionError**: + El parámetro :math:`i` no es un valor entero entre 0 e I. + No se han calculado los suficientes valores de :math:`f_j`. """ I, J = get_matrix_dimensions(triangle) assert i in range(I+1), "Período de incurrido a estimar inválido" assert len(fjs_) >= I, "Se requieren más fj's calculados para estimar cij" return triangle[i, I - i] * prod(fjs_[I - i: I])
def msep_hovinen(fjs, msep_cijs_ferguson, msep_cijs_mack, deviations_cij, i, I, J): """ Error de estimación de Hovinen. :param fjs: Factores de desarrollo. Es una lista con :math:`J` elementos donde el :math:`j`-ésimo elemento corresponde con :math:`f_j`. :param msep_cijs_ferguson: Array de tamaño :math:`J` donde la :math:`i`-ésima posición corresponde con el msep calculado para :math:`C_{I-J + i, J}` según el modelo Fergsuon. :param msep_cijs_mack: Array de tamaño :math:`J` donde la :math:`i`-ésima posición corresponde con el msep calculado para :math:`C_{I-J + i, J}` según el modelo Mack. :param i: Período reportado del suceso. :param I: Período hasta el que se tiene información. :param J: Período hasta el que se tiene información sobre reportados. :return: """ if i == 0: return 0.0 beta = prod(1.0 / fjs[I - i:J]) t = (1 - beta) * 1.0 / ( (1.0 / beta) * (msep_cijs_ferguson[i] * 1.0 / msep_cijs_mack[i]) - 1) msep_teorico = msep_cijs_mack[i] * beta * (1 - beta) * ( beta + 1.0 / (1 - beta) + ((1 - beta)**2) * 1.0 / t) result = max(msep_teorico, deviations_cij[i, -1]**2) return result