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]
示例#3
0
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
示例#5
0
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