# Caps y Floors

Hasta ahora sólo hemos visto productos lineales de tasa de interés. Hoy introducimos el primer ejemplo de productos no lineales (u opciones) de tasa de interés.

## Configuración

```python
from finrisk import QC_Financial_3 as Qcf
from IPython.core.display import HTML
from IPython.display import Image
import modules.auxiliary as aux
from scipy.stats import norm
import pandas as pd
import math
```

Se genera el calendario NY.

```python
bus_cal = aux.get_cal(aux.BusCal.NY)
```

Esta función devuelve una pata flotante con Libor USD 3M.

```python
def get_libor_usd_3m_leg(
        rp: Qcf.RecPay,
        notional: float,
        fecha_inicio: Qcf.QCDate,
        maturity: Qcf.Tenor,
        spread: float = 0.0
) -> Qcf.Leg:

    # Se da de alta los parámetros requeridos
    periodicidad_pago = Qcf.Tenor('3M')
    periodo_irregular_pago = Qcf.StubPeriod.SHORTFRONT
    lag_pago = 0
    periodicidad_fijacion = Qcf.Tenor('3M')
    periodo_irregular_fijacion = Qcf.StubPeriod.SHORTFRONT
    bus_adj_rule = Qcf.BusyAdjRules.MODFOLLOW
    amort_es_flujo = True
    gearing = 1.0  # intereses -> gearing * Libor + spread

    # vamos a usar el mismo calendario para pago y fijaciones
    lag_de_fijacion = 2

    # Definición del índice
    codigo = 'LIBORUSD3M'
    lin_act360 = Qcf.QCInterestRate(0.0, Qcf.QCAct360(), Qcf.QCLinearWf())
    fixing_lag = Qcf.Tenor('2d')
    tenor = Qcf.Tenor('3m')
    usd = Qcf.QCUSD()
    libor_usd_3m = Qcf.InterestRateIndex(
        codigo,
        lin_act360,
        fixing_lag,
        tenor,
        bus_cal,
        bus_cal,
        usd
    )
    # Fin índice

    meses = maturity.get_years() * 12 + maturity.get_months()
    fecha_final = fecha_inicio.add_months(meses)
    ibor_leg = Qcf.LegFactory.build_bullet_ibor2_leg(
        rp,
        fecha_inicio,
        fecha_final,
        bus_adj_rule,
        periodicidad_pago,
        periodo_irregular_pago,
        bus_cal,
        lag_pago,
        periodicidad_fijacion,
        periodo_irregular_fijacion,
        bus_cal,
        lag_de_fijacion,
        libor_usd_3m,
        notional,
        amort_es_flujo,
        usd,
        spread,
        gearing)

    return ibor_leg
```

Formato para la visualización de los `DataFrame`.

```python
frmt = {
    'nominal': '{:,.2f}',
    'amortizacion': '{:,.2f}',
    'interes': '{:,.2f}',
    'flujo': '{:,.2f}',
    'interes_cap': '{:,.2f}',
    'interes_floor': '{:,.2f}',
    'interes_total': '{:,.2f}',
    'valor_tasa': '{:.6%}',
    'tasa': '{:.6%}'
}
```

## Black-Scholes-Merton Revisited

Recordemos la fórmula para una *call* sobre una acción que no paga dividendos.

$$
\begin{equation}
C\left(S,t\right)=e^{-rT}\left[Se^{rT}\cdot N\left(d_1\right)-K\cdot N\left(d_2\right)\right]
\end{equation}
$$

$$
\begin{equation}
d_1=\frac{\ln\frac{Se^{rT}}{K}+\frac{1}{2}\sigma^2T}{\sigma\sqrt{T}}
\end{equation}
$$

$$
\begin{equation}
d_2=d_1-\sigma\sqrt{T}
\end{equation}
$$

En la medida ajustada por riesgo tenemos que $Se^{rT}=\mathbb{E}_t^Q\left(S_T\right)$ y por lo tanto:

$$
\begin{equation}
C\left(S,t\right)=df\left(r,T\right)\left[\mathbb{E}_t^Q\left(S_T\right)\cdot N\left(d_1\right)-K\cdot N\left(d_2\right)\right]
\end{equation}
$$

$$
\begin{equation}
d_1=\frac{\ln\frac{\mathbb{E}_t^Q\left(S_T\right)}{K}+\frac{1}{2}\sigma^2T}{\sigma\sqrt{T}}
\end{equation}
$$

$$
\begin{equation}
d_2=d_1-\sigma\sqrt{T}
\end{equation}
$$

## Caps

- Un Cap es una opción que ofrece protección contra subidas de alguna tasa de interés.
- Por ejemplo, una empresa puede tener un financiamiento a tasa variable y estar interesada en tener protección contra incrementos de la tasa de referencia por sobre un cierto umbral.
- Veamos el ejemplo de un Cap al 0.35% para proteger un crédito en USD a 2Y a tasa flotante Libor 3M.

### Crédito a Libor USD 3M

Se construye un crédito a Libor USD 3M a 2Y.

```python
credito = get_libor_usd_3m_leg(
    rp=Qcf.RecPay.PAY,
    notional=10000000,
    fecha_inicio=Qcf.QCDate(26, 10, 2020),
    maturity=Qcf.Tenor('2Y')
)
```

Visualizamos y vemos como ninguno de los cupones tiene su *fixing*, es decir el valor de la Libor a la fecha de fixing.

```python
aux.show_leg(credito, 'IborCashflow2', '').style.format(frmt)
```

        	        fecha_inicial	        fecha_final	        fecha_fixing	        fecha_pago	        nominal	        amortizacion	        interes	        amort_es_flujo	        flujo	        moneda	        codigo_indice_tasa	        valor_tasa	        spread	        gearing	        tipo_tasa

                        0
                        2020-10-26
                        2021-01-26
                        2020-10-22
                        2021-01-26
                        -10,000,000.00
                        0.00
                        -0.00
                        True
                        0.00
                        USD
                        LIBORUSD3M
                        0.000000%
                        0.000000
                        1.000000
                        LinAct360

                        1
                        2021-01-26
                        2021-04-26
                        2021-01-22
                        2021-04-26
                        -10,000,000.00
                        0.00
                        -0.00
                        True
                        0.00
                        USD
                        LIBORUSD3M
                        0.000000%
                        0.000000
                        1.000000
                        LinAct360

                        2
                        2021-04-26
                        2021-07-26
                        2021-04-22
                        2021-07-26
                        -10,000,000.00
                        0.00
                        -0.00
                        True
                        0.00
                        USD
                        LIBORUSD3M
                        0.000000%
                        0.000000
                        1.000000
                        LinAct360

                        3
                        2021-07-26
                        2021-10-26
                        2021-07-22
                        2021-10-26
                        -10,000,000.00
                        0.00
                        -0.00
                        True
                        0.00
                        USD
                        LIBORUSD3M
                        0.000000%
                        0.000000
                        1.000000
                        LinAct360

                        4
                        2021-10-26
                        2022-01-26
                        2021-10-22
                        2022-01-26
                        -10,000,000.00
                        0.00
                        -0.00
                        True
                        0.00
                        USD
                        LIBORUSD3M
                        0.000000%
                        0.000000
                        1.000000
                        LinAct360

                        5
                        2022-01-26
                        2022-04-26
                        2022-01-24
                        2022-04-26
                        -10,000,000.00
                        0.00
                        -0.00
                        True
                        0.00
                        USD
                        LIBORUSD3M
                        0.000000%
                        0.000000
                        1.000000
                        LinAct360

                        6
                        2022-04-26
                        2022-07-26
                        2022-04-22
                        2022-07-26
                        -10,000,000.00
                        0.00
                        -0.00
                        True
                        0.00
                        USD
                        LIBORUSD3M
                        0.000000%
                        0.000000
                        1.000000
                        LinAct360

                        7
                        2022-07-26
                        2022-10-26
                        2022-07-22
                        2022-10-26
                        -10,000,000.00
                        -10,000,000.00
                        -0.00
                        True
                        -10,000,000.00
                        USD
                        LIBORUSD3M
                        0.000000%
                        0.000000
                        1.000000
                        LinAct360

[www.global-rates.com (valores Libor USD)](https://www.global-rates.com/en/interest-rates/libor/american-dollar/american-dollar.aspx)

Vamos a considerar un **escenario arbitrario** en que los *fixings* de la Libor aumentan 0.04% en cada nuevo cupón. El *fixing* del primer cupón corresponde al valor de la Libor USD 3M del 22-10-2020.

```python
first_fixing = .0021475
increment = .0004 # Suponemos que los fixings sucesivos van aumentando en este monto.
for i in range(credito.size()):
    cshflw = credito.get_cashflow_at(i)
    cshflw.set_rate_value(first_fixing + i * increment)
```

Vemos como, en este escenario, los intereses a pagar aumentan hasta más del doble del monto de intereses del primer cupón.

```python
df_cred = aux.show_leg(credito, 'IborCashflow', '')
df_cred.style.format(frmt)
```

        	        fecha_inicial	        fecha_final	        fecha_fixing	        fecha_pago	        nominal	        amortizacion	        interes	        amort_es_flujo	        flujo	        moneda	        codigo_indice_tasa	        valor_tasa	        spread	        gearing	        tipo_tasa

                        0
                        2020-10-26
                        2021-01-26
                        2020-10-22
                        2021-01-26
                        -10,000,000.00
                        0.00
                        -5,488.06
                        True
                        -5,488.06
                        USD
                        LIBORUSD3M
                        0.214750%
                        0.000000
                        1.000000
                        LinAct360

                        1
                        2021-01-26
                        2021-04-26
                        2021-01-22
                        2021-04-26
                        -10,000,000.00
                        0.00
                        -6,368.75
                        True
                        -6,368.75
                        USD
                        LIBORUSD3M
                        0.254750%
                        0.000000
                        1.000000
                        LinAct360

                        2
                        2021-04-26
                        2021-07-26
                        2021-04-22
                        2021-07-26
                        -10,000,000.00
                        0.00
                        -7,450.63
                        True
                        -7,450.63
                        USD
                        LIBORUSD3M
                        0.294750%
                        0.000000
                        1.000000
                        LinAct360

                        3
                        2021-07-26
                        2021-10-26
                        2021-07-22
                        2021-10-26
                        -10,000,000.00
                        0.00
                        -8,554.72
                        True
                        -8,554.72
                        USD
                        LIBORUSD3M
                        0.334750%
                        0.000000
                        1.000000
                        LinAct360

                        4
                        2021-10-26
                        2022-01-26
                        2021-10-22
                        2022-01-26
                        -10,000,000.00
                        0.00
                        -9,576.94
                        True
                        -9,576.94
                        USD
                        LIBORUSD3M
                        0.374750%
                        0.000000
                        1.000000
                        LinAct360

                        5
                        2022-01-26
                        2022-04-26
                        2022-01-24
                        2022-04-26
                        -10,000,000.00
                        0.00
                        -10,368.75
                        True
                        -10,368.75
                        USD
                        LIBORUSD3M
                        0.414750%
                        0.000000
                        1.000000
                        LinAct360

                        6
                        2022-04-26
                        2022-07-26
                        2022-04-22
                        2022-07-26
                        -10,000,000.00
                        0.00
                        -11,495.07
                        True
                        -11,495.07
                        USD
                        LIBORUSD3M
                        0.454750%
                        0.000000
                        1.000000
                        LinAct360

                        7
                        2022-07-26
                        2022-10-26
                        2022-07-22
                        2022-10-26
                        -10,000,000.00
                        -10,000,000.00
                        -12,643.61
                        True
                        -10,012,643.61
                        USD
                        LIBORUSD3M
                        0.494750%
                        0.000000
                        1.000000
                        LinAct360

### Crédito a Libor USD 3M + Cap

En un escenario como el anterior, quien ha suscrito el crédito, podría tener interés en contratar protección contra las subidas de la Libor. En particular, podría contratar un Cap de Libor a 2Y.

El payoff de un Cap, está dado por la siguiente función `caplet` asociada a cada uno de los cupones del crédito.

**NB:** la función se llama `caplet` por que corresponde a una componente del Cap total.

```python
def caplet(
    notional: float,
    fixing: float,
    strike: float,
    fecha_inicio: Qcf.QCDate,
    fecha_final: Qcf.QCDate
) -> float:

    valor_tasa = max(fixing - strike, 0) # Call de Libor3M

    lin_act360 = Qcf.QCInterestRate(
        valor_tasa,
        Qcf.QCAct360(),
        Qcf.QCLinearWf()
    )

    # wf = 1 + valor_tasa * (fecha_final - fecha_inicio) / 360
    wf = lin_act360.wf(fecha_inicio, fecha_final)

    # Los interes que se devengan con valor_tasa entre la fecha_inicio y la fecha_final
    return notional * (wf - 1)
```

Apliquemos `caplet` a cada uno de los cupones y *fixings* del escenario, considerando una tasa Cap (o strike) de 0.35%.

```python
strike = .0035
df_cred['interes_cap'] = df_cred.apply(
    lambda row: -caplet(
        row['nominal'],
        row['valor_tasa'],
        strike,
        Qcf.build_qcdate_from_string(row['fecha_inicial']),
        Qcf.build_qcdate_from_string(row['fecha_final'])
    ),
    axis=1
)

df_cred['interes_total'] = df_cred['interes'] + df_cred['interes_cap']
```

Vemos como cada `caplet` provee un flujo de caja positivo, cada vez que el *fixing* de la Libor supera el valor de la tasa Cap o strike del Cap.

Los últimos pagos de intereses (total) están a una tasa efectiva igual al *strike* (0.35%).

```python
df_cred.style.format(frmt)
```

        	        fecha_inicial	        fecha_final	        fecha_fixing	        fecha_pago	        nominal	        amortizacion	        interes	        amort_es_flujo	        flujo	        moneda	        codigo_indice_tasa	        valor_tasa	        spread	        gearing	        tipo_tasa	        interes_cap	        interes_total

                        0
                        2020-10-26
                        2021-01-26
                        2020-10-22
                        2021-01-26
                        -10,000,000.00
                        0.00
                        -5,488.06
                        True
                        -5,488.06
                        USD
                        LIBORUSD3M
                        0.214750%
                        0.000000
                        1.000000
                        LinAct360
                        0.00
                        -5,488.06

                        1
                        2021-01-26
                        2021-04-26
                        2021-01-22
                        2021-04-26
                        -10,000,000.00
                        0.00
                        -6,368.75
                        True
                        -6,368.75
                        USD
                        LIBORUSD3M
                        0.254750%
                        0.000000
                        1.000000
                        LinAct360
                        0.00
                        -6,368.75

                        2
                        2021-04-26
                        2021-07-26
                        2021-04-22
                        2021-07-26
                        -10,000,000.00
                        0.00
                        -7,450.63
                        True
                        -7,450.63
                        USD
                        LIBORUSD3M
                        0.294750%
                        0.000000
                        1.000000
                        LinAct360
                        0.00
                        -7,450.63

                        3
                        2021-07-26
                        2021-10-26
                        2021-07-22
                        2021-10-26
                        -10,000,000.00
                        0.00
                        -8,554.72
                        True
                        -8,554.72
                        USD
                        LIBORUSD3M
                        0.334750%
                        0.000000
                        1.000000
                        LinAct360
                        0.00
                        -8,554.72

                        4
                        2021-10-26
                        2022-01-26
                        2021-10-22
                        2022-01-26
                        -10,000,000.00
                        0.00
                        -9,576.94
                        True
                        -9,576.94
                        USD
                        LIBORUSD3M
                        0.374750%
                        0.000000
                        1.000000
                        LinAct360
                        632.50
                        -8,944.44

                        5
                        2022-01-26
                        2022-04-26
                        2022-01-24
                        2022-04-26
                        -10,000,000.00
                        0.00
                        -10,368.75
                        True
                        -10,368.75
                        USD
                        LIBORUSD3M
                        0.414750%
                        0.000000
                        1.000000
                        LinAct360
                        1,618.75
                        -8,750.00

                        6
                        2022-04-26
                        2022-07-26
                        2022-04-22
                        2022-07-26
                        -10,000,000.00
                        0.00
                        -11,495.07
                        True
                        -11,495.07
                        USD
                        LIBORUSD3M
                        0.454750%
                        0.000000
                        1.000000
                        LinAct360
                        2,647.85
                        -8,847.22

                        7
                        2022-07-26
                        2022-10-26
                        2022-07-22
                        2022-10-26
                        -10,000,000.00
                        -10,000,000.00
                        -12,643.61
                        True
                        -10,012,643.61
                        USD
                        LIBORUSD3M
                        0.494750%
                        0.000000
                        1.000000
                        LinAct360
                        3,699.17
                        -8,944.44

### Fórmula de Valorización

- Cada componente individual de un Cap se dice caplet
- Evaluemos un caplet: su pago está dado por

$$
\begin{equation}
yf\cdot N\cdot max\left(L_{T_f}-L_K,0\right)
\end{equation}
$$

- Donde $yf$ es la fracción de año que se usa para la tasa de referencia (lo más usual es Act/360), $N$ es el nocional del contrato, $L_K$ es la tasa Cap y $T_f$ es la fecha en la que se produce el *fixing*.
- Notar que, aunque el pago queda determinado al tiempo $T_f$, éste se realiza sólo cuando ha concluido el período de devengo dado por $yf$.

- Vemos, por lo tanto, que el pago de cada caplet está dado por una fórmula de Call sobre $L_{T_f}$ con strike $L_K$.
- Queremos entonces poder aplicar una fórmula de BSM para el valor del caplet.
- El mercado ha adoptado como estándar el uso de la fórmula de BSM para este producto (en el formato fácil de recordar que es utilizando el valor esperado del activo subyacente).

De esta forma se obtiene que:

$$
\begin{equation}
caplet=yf\cdot N\cdot e^{-r_{OIS}\cdot T_v}\left[\mathbb{E}_t^Q\left(L_{T_f}\right)\cdot N\left(d_1\right)-L_K\cdot N\left(d_2\right)\right]
\end{equation}
$$

$$
\begin{equation}
d_1=\frac{\ln\frac{\mathbb{E}_t^Q\left(L_{T_f}\right)}{L_K}+\frac{1}{2}\sigma^2T_f}{\sigma\sqrt{T_f}}
\end{equation}
$$

$$
\begin{equation}
d_2=d_1-\sigma\sqrt{T_f}
\end{equation}
$$

Donde $T_f$ es el plazo hasta el fixing de la opción, $T_v$ es el plazo hasta el pago de la opción y la tasa de descuento es la que proviene de la curva *OIS*.

## Floors

- Un Floor es una opción que ofrece protección contra bajadas de alguna tasa de interés.
- Por ejemplo, un inversionista puede tener activos a tasa variable y estar interesado en protección contra disminuciones de la tasa de referencia por debajo un cierto umbral.
- Veamos el ejemplo de un Floor al 0.01% para proteger un activo en USD a 2Y a tasa flotante Libor 3M.

### Activo a Libor USD 3M

Se construye un activo al Libor USD 3M. Podría ser un bono o el mismo crédito anterior desde el punto de vista del banco que lo otorga.

```python
activo = get_libor_usd_3m_leg(
    Qcf.RecPay.RECEIVE,
    10000000,
    Qcf.QCDate(26, 10, 2020),
    Qcf.Tenor('2Y')
)
```

Visualizamos y vemos como ninguno de los cupones tiene su *fixing*, es decir el valor de la Libor a la fecha de fixing.

```python
aux.show_leg(activo, 'IborCashflow', '').style.format(frmt)
```

        	        fecha_inicial	        fecha_final	        fecha_fixing	        fecha_pago	        nominal	        amortizacion	        interes	        amort_es_flujo	        flujo	        moneda	        codigo_indice_tasa	        valor_tasa	        spread	        gearing	        tipo_tasa

                        0
                        2020-10-26
                        2021-01-26
                        2020-10-22
                        2021-01-26
                        10,000,000.00
                        0.00
                        0.00
                        True
                        0.00
                        USD
                        LIBORUSD3M
                        0.000000%
                        0.000000
                        1.000000
                        LinAct360

                        1
                        2021-01-26
                        2021-04-26
                        2021-01-22
                        2021-04-26
                        10,000,000.00
                        0.00
                        0.00
                        True
                        0.00
                        USD
                        LIBORUSD3M
                        0.000000%
                        0.000000
                        1.000000
                        LinAct360

                        2
                        2021-04-26
                        2021-07-26
                        2021-04-22
                        2021-07-26
                        10,000,000.00
                        0.00
                        0.00
                        True
                        0.00
                        USD
                        LIBORUSD3M
                        0.000000%
                        0.000000
                        1.000000
                        LinAct360

                        3
                        2021-07-26
                        2021-10-26
                        2021-07-22
                        2021-10-26
                        10,000,000.00
                        0.00
                        0.00
                        True
                        0.00
                        USD
                        LIBORUSD3M
                        0.000000%
                        0.000000
                        1.000000
                        LinAct360

                        4
                        2021-10-26
                        2022-01-26
                        2021-10-22
                        2022-01-26
                        10,000,000.00
                        0.00
                        0.00
                        True
                        0.00
                        USD
                        LIBORUSD3M
                        0.000000%
                        0.000000
                        1.000000
                        LinAct360

                        5
                        2022-01-26
                        2022-04-26
                        2022-01-24
                        2022-04-26
                        10,000,000.00
                        0.00
                        0.00
                        True
                        0.00
                        USD
                        LIBORUSD3M
                        0.000000%
                        0.000000
                        1.000000
                        LinAct360

                        6
                        2022-04-26
                        2022-07-26
                        2022-04-22
                        2022-07-26
                        10,000,000.00
                        0.00
                        0.00
                        True
                        0.00
                        USD
                        LIBORUSD3M
                        0.000000%
                        0.000000
                        1.000000
                        LinAct360

                        7
                        2022-07-26
                        2022-10-26
                        2022-07-22
                        2022-10-26
                        10,000,000.00
                        10,000,000.00
                        0.00
                        True
                        10,000,000.00
                        USD
                        LIBORUSD3M
                        0.000000%
                        0.000000
                        1.000000
                        LinAct360

Vamos a considerar un **escenario arbitrario** en que los *fixings* de la Libor disminuyen 0.03% en cada nuevo cupón. El *fixing* del primer cupón corresponde al valor de la Libor USD 3M del 22-10-2020.

```python
increment = -.0003 # Suponemos que los fixings sucesivos van cambiando en este monto.
for i in range(activo.size()):
    cshflw = activo.get_cashflow_at(i)
    cshflw.set_rate_value(first_fixing + i * increment)
```

Vemos como, en este escenario, los intereses por recibir llegan casi a 0 en el último cupón.

```python
df_activo = aux.show_leg(activo, 'IborCashflow', '')
df_activo.style.format(frmt)
```

        	        fecha_inicial	        fecha_final	        fecha_fixing	        fecha_pago	        nominal	        amortizacion	        interes	        amort_es_flujo	        flujo	        moneda	        codigo_indice_tasa	        valor_tasa	        spread	        gearing	        tipo_tasa

                        0
                        2020-10-26
                        2021-01-26
                        2020-10-22
                        2021-01-26
                        10,000,000.00
                        0.00
                        5,488.06
                        True
                        5,488.06
                        USD
                        LIBORUSD3M
                        0.214750%
                        0.000000
                        1.000000
                        LinAct360

                        1
                        2021-01-26
                        2021-04-26
                        2021-01-22
                        2021-04-26
                        10,000,000.00
                        0.00
                        4,618.75
                        True
                        4,618.75
                        USD
                        LIBORUSD3M
                        0.184750%
                        0.000000
                        1.000000
                        LinAct360

                        2
                        2021-04-26
                        2021-07-26
                        2021-04-22
                        2021-07-26
                        10,000,000.00
                        0.00
                        3,911.74
                        True
                        3,911.74
                        USD
                        LIBORUSD3M
                        0.154750%
                        0.000000
                        1.000000
                        LinAct360

                        3
                        2021-07-26
                        2021-10-26
                        2021-07-22
                        2021-10-26
                        10,000,000.00
                        0.00
                        3,188.06
                        True
                        3,188.06
                        USD
                        LIBORUSD3M
                        0.124750%
                        0.000000
                        1.000000
                        LinAct360

                        4
                        2021-10-26
                        2022-01-26
                        2021-10-22
                        2022-01-26
                        10,000,000.00
                        0.00
                        2,421.39
                        True
                        2,421.39
                        USD
                        LIBORUSD3M
                        0.094750%
                        0.000000
                        1.000000
                        LinAct360

                        5
                        2022-01-26
                        2022-04-26
                        2022-01-24
                        2022-04-26
                        10,000,000.00
                        0.00
                        1,618.75
                        True
                        1,618.75
                        USD
                        LIBORUSD3M
                        0.064750%
                        0.000000
                        1.000000
                        LinAct360

                        6
                        2022-04-26
                        2022-07-26
                        2022-04-22
                        2022-07-26
                        10,000,000.00
                        0.00
                        878.40
                        True
                        878.40
                        USD
                        LIBORUSD3M
                        0.034750%
                        0.000000
                        1.000000
                        LinAct360

                        7
                        2022-07-26
                        2022-10-26
                        2022-07-22
                        2022-10-26
                        10,000,000.00
                        10,000,000.00
                        121.39
                        True
                        10,000,121.39
                        USD
                        LIBORUSD3M
                        0.004750%
                        0.000000
                        1.000000
                        LinAct360

### Activo a Libor USD 3M + Floor

En un escenario como el anterior, el tenedor del bono o crédito, podría tener interés en contratar protección contra las bajadas de la Libor. En particular, podría contratar un Floor de Libor a 2Y.

El payoff de un Floor, está dado por la siguiente función `floorlet` asociada a cada uno de los cupones del activo.

**NB:** la función se llama `floorlet` por que corresponde a una componente del Floor total.

```python
def floorlet(
    notional: float,
    fixing: float,
    strike: float,
    fecha_inicio: Qcf.QCDate,
    fecha_final: Qcf.QCDate
) -> float:

    valor_tasa = max(strike - fixing, 0)
    lin_act360 = Qcf.QCInterestRate(
        valor_tasa,
        Qcf.QCAct360(),
        Qcf.QCLinearWf()
    )
    wf = lin_act360.wf(fecha_inicio, fecha_final)
    return notional * (wf - 1)
```

Apliquemos `floorlet` a cada uno de los cupones y *fixings* del escenario, considerando una tasa Floor (o strike) de 0.15%.

```python
strike = .0015
df_activo['interes_floor'] = df_activo.apply(
    lambda row: floorlet(
        row['nominal'],
        row['valor_tasa'],
        strike,
        Qcf.build_qcdate_from_string(row['fecha_inicial']),
        Qcf.build_qcdate_from_string(row['fecha_final'])
    ),
    axis=1
)

df_activo['interes_total'] = df_activo['interes'] + df_activo['interes_floor']
```

Vemos como cada `floorlet` provee un flujo de caja positivo, cada vez que el *fixing* de la Libor es inferior al valor de la tasa Floor o strike del Floor.

Los últimos pagos de intereses (total) están a una tasa efectiva igual al *strike* (0.15%).

```python
df_activo.style.format(frmt)
```

        	        fecha_inicial	        fecha_final	        fecha_fixing	        fecha_pago	        nominal	        amortizacion	        interes	        amort_es_flujo	        flujo	        moneda	        codigo_indice_tasa	        valor_tasa	        spread	        gearing	        tipo_tasa	        interes_floor	        interes_total

                        0
                        2020-10-26
                        2021-01-26
                        2020-10-22
                        2021-01-26
                        10,000,000.00
                        0.00
                        5,488.06
                        True
                        5,488.06
                        USD
                        LIBORUSD3M
                        0.214750%
                        0.000000
                        1.000000
                        LinAct360
                        0.00
                        5,488.06

                        1
                        2021-01-26
                        2021-04-26
                        2021-01-22
                        2021-04-26
                        10,000,000.00
                        0.00
                        4,618.75
                        True
                        4,618.75
                        USD
                        LIBORUSD3M
                        0.184750%
                        0.000000
                        1.000000
                        LinAct360
                        0.00
                        4,618.75

                        2
                        2021-04-26
                        2021-07-26
                        2021-04-22
                        2021-07-26
                        10,000,000.00
                        0.00
                        3,911.74
                        True
                        3,911.74
                        USD
                        LIBORUSD3M
                        0.154750%
                        0.000000
                        1.000000
                        LinAct360
                        0.00
                        3,911.74

                        3
                        2021-07-26
                        2021-10-26
                        2021-07-22
                        2021-10-26
                        10,000,000.00
                        0.00
                        3,188.06
                        True
                        3,188.06
                        USD
                        LIBORUSD3M
                        0.124750%
                        0.000000
                        1.000000
                        LinAct360
                        645.28
                        3,833.33

                        4
                        2021-10-26
                        2022-01-26
                        2021-10-22
                        2022-01-26
                        10,000,000.00
                        0.00
                        2,421.39
                        True
                        2,421.39
                        USD
                        LIBORUSD3M
                        0.094750%
                        0.000000
                        1.000000
                        LinAct360
                        1,411.94
                        3,833.33

                        5
                        2022-01-26
                        2022-04-26
                        2022-01-24
                        2022-04-26
                        10,000,000.00
                        0.00
                        1,618.75
                        True
                        1,618.75
                        USD
                        LIBORUSD3M
                        0.064750%
                        0.000000
                        1.000000
                        LinAct360
                        2,131.25
                        3,750.00

                        6
                        2022-04-26
                        2022-07-26
                        2022-04-22
                        2022-07-26
                        10,000,000.00
                        0.00
                        878.40
                        True
                        878.40
                        USD
                        LIBORUSD3M
                        0.034750%
                        0.000000
                        1.000000
                        LinAct360
                        2,913.26
                        3,791.67

                        7
                        2022-07-26
                        2022-10-26
                        2022-07-22
                        2022-10-26
                        10,000,000.00
                        10,000,000.00
                        121.39
                        True
                        10,000,121.39
                        USD
                        LIBORUSD3M
                        0.004750%
                        0.000000
                        1.000000
                        LinAct360
                        3,711.94
                        3,833.33

### Fórmula de Valorización

- Cada componente individual de un floor se dice floorlet.
- Evaluemos un floorlet: su pago está dado por

$$
\begin{equation}
yf\cdot N\cdot max\left(L_K-L_{T_f},0\right)
\end{equation}
$$

- Donde $yf$ es la fracción de año que se usa para la tasa de referencia (lo más usual es Act/360), $N$ es el nocional del contrato y $L_K$ es la tasa floor.
- Notar que, aunque el pago queda determinado al tiempo $T_f$, éste se realiza sólo cuando ha concluido el período de devengo dado por $yf$.

- Vemos, por lo tanto, que el pago de cada floorlet está dado por una fórmula de Put sobre $L_{T_f}$ con strike $L_K$
- Queremos entonces poder aplicar una fórmula de BSM para el valor del floorlet.
- El mercado ha adoptado como estándar el uso de la fórmula de BSM para este producto (en el formato fácil de recordar que es utilizando el valor esperado del activo subyacente).

De esta forma se obtiene que:

$$
\begin{equation}
floorlet=yf\cdot N\cdot e^{-r_{OIS}\cdot T_v}\left[L_K\cdot N\left(-d_2\right)-\mathbb{E}_t^Q\left(L_{T_f}\right)\cdot N\left(-d_1\right)\right]
\end{equation}
$$

$$
\begin{equation}
d_1=\frac{\ln\frac{\mathbb{E}_t^Q\left(L_{T_f}\right)}{L_K}+\frac{1}{2}\sigma^2T_f}{\sigma\sqrt{T_f}}
\end{equation}
$$

$$
\begin{equation}
d_2=d_1-\sigma\sqrt{T_f}
\end{equation}
$$

Donde $T_f$ es el plazo hasta el fixing de la opción, $T_v$ es el plazo hasta el pago de la opción y la tasa de descuento es la que proviene de la curva *OIS*.

## Ejercicio

Recordemos la Put – Call parity, ésta nos dice que:

$$
\begin{equation}
Call\left(T,K\right)-Put\left(T,K\right)=Forward\left(T,K\right)
\end{equation}
$$

- ¿Qué forma asume esta relación para el caso de Caps y Floors?
- Notar que si compro un Cap y un Floor con la misma estructura temporal y el mismo strike sucede que:
  - Si la tasa flotante está por arriba del strike recibo este exceso
  - Si la tasa flotante está por debajo del strike pago este déficit

**Respuesta:** $Cap-Floor=Swap$

$$
\begin{equation}
max\left(L-K,0\right)-max\left(K-L,0\right)=L-K
\end{equation}
$$

## Matriz de Volatilidad

En esta pantalla para cotizar Caps, se puede ver el valor del parámetro de volatilidad utilizado para calcular el valor del Cap (campo NPV).

```python
Image(url="img/20201027_cap.gif", width=900, height=720)
```

Dicha volatilidad se deduce de la siguiente matriz de volatilidad, la cual, a su vez, proviene de cotizaciones de bancos y otras instituciones activas en este mercado.

```python
Image(url="img/20201027_cap_vol.gif", width=900, height=720)
```

```python
curvas = pd.read_csv('data/20201027_curvas.csv')
curvas.columns = ['fecha', 'plazo', 'tasa', 'codigo']
```

```python
curvas.style.format(frmt)
```

        	        fecha	        plazo	        tasa	        codigo

                        0
                        2020-10-27
                        1
                        -0.473373%
                        EURIBOR6M

                        1
                        2020-10-27
                        4
                        -0.509682%
                        EURIBOR6M

                        2
                        2020-10-27
                        7
                        -0.545975%
                        EURIBOR6M

                        3
                        2020-10-27
                        14
                        -0.545947%
                        EURIBOR6M

                        4
                        2020-10-27
                        32
                        -0.549275%
                        EURIBOR6M

                        5
                        2020-10-27
                        61
                        -0.533269%
                        EURIBOR6M

                        6
                        2020-10-27
                        92
                        -0.516071%
                        EURIBOR6M

                        7
                        2020-10-27
                        120
                        -0.515312%
                        EURIBOR6M

                        8
                        2020-10-27
                        151
                        -0.514439%
                        EURIBOR6M

                        9
                        2020-10-27
                        182
                        -0.513428%
                        EURIBOR6M

                        10
                        2020-10-27
                        214
                        -0.512320%
                        EURIBOR6M

                        11
                        2020-10-27
                        243
                        -0.513078%
                        EURIBOR6M

                        12
                        2020-10-27
                        273
                        -0.513167%
                        EURIBOR6M

                        13
                        2020-10-27
                        305
                        -0.512171%
                        EURIBOR6M

                        14
                        2020-10-27
                        335
                        -0.513040%
                        EURIBOR6M

                        15
                        2020-10-27
                        365
                        -0.513895%
                        EURIBOR6M

                        16
                        2020-10-27
                        547
                        -0.522153%
                        EURIBOR6M

                        17
                        2020-10-27
                        732
                        -0.525765%
                        EURIBOR6M

                        18
                        2020-10-27
                        1096
                        -0.523011%
                        EURIBOR6M

                        19
                        2020-10-27
                        1461
                        -0.504153%
                        EURIBOR6M

                        20
                        2020-10-27
                        1826
                        -0.478194%
                        EURIBOR6M

                        21
                        2020-10-27
                        2556
                        -0.407062%
                        EURIBOR6M

                        22
                        2020-10-27
                        3652
                        -0.278615%
                        EURIBOR6M

                        23
                        2020-10-27
                        4383
                        -0.194625%
                        EURIBOR6M

                        24
                        2020-10-27
                        5478
                        -0.094742%
                        EURIBOR6M

                        25
                        2020-10-27
                        7305
                        -0.020922%
                        EURIBOR6M

                        26
                        2020-10-27
                        9132
                        -0.023148%
                        EURIBOR6M

                        27
                        2020-10-27
                        10959
                        -0.053014%
                        EURIBOR6M

                        28
                        2020-10-27
                        1
                        0.073027%
                        LIBORUSD3MBBG

                        29
                        2020-10-27
                        4
                        0.091292%
                        LIBORUSD3MBBG

                        30
                        2020-10-27
                        7
                        0.093902%
                        LIBORUSD3MBBG

                        31
                        2020-10-27
                        14
                        0.109562%
                        LIBORUSD3MBBG

                        32
                        2020-10-27
                        32
                        0.146116%
                        LIBORUSD3MBBG

                        33
                        2020-10-27
                        61
                        0.172501%
                        LIBORUSD3MBBG

                        34
                        2020-10-27
                        92
                        0.216516%
                        LIBORUSD3MBBG

                        35
                        2020-10-27
                        120
                        0.230912%
                        LIBORUSD3MBBG

                        36
                        2020-10-27
                        151
                        0.235829%
                        LIBORUSD3MBBG

                        37
                        2020-10-27
                        182
                        0.232641%
                        LIBORUSD3MBBG

                        38
                        2020-10-27
                        211
                        0.230663%
                        LIBORUSD3MBBG

                        39
                        2020-10-27
                        243
                        0.227994%
                        LIBORUSD3MBBG

                        40
                        2020-10-27
                        273
                        0.225191%
                        LIBORUSD3MBBG

                        41
                        2020-10-27
                        306
                        0.222675%
                        LIBORUSD3MBBG

                        42
                        2020-10-27
                        335
                        0.220774%
                        LIBORUSD3MBBG

                        43
                        2020-10-27
                        365
                        0.219179%
                        LIBORUSD3MBBG

                        44
                        2020-10-27
                        547
                        0.223157%
                        LIBORUSD3MBBG

                        45
                        2020-10-27
                        732
                        0.232801%
                        LIBORUSD3MBBG

                        46
                        2020-10-27
                        1096
                        0.266422%
                        LIBORUSD3MBBG

                        47
                        2020-10-27
                        1461
                        0.325791%
                        LIBORUSD3MBBG

                        48
                        2020-10-27
                        1826
                        0.405632%
                        LIBORUSD3MBBG

                        49
                        2020-10-27
                        2556
                        0.583247%
                        LIBORUSD3MBBG

                        50
                        2020-10-27
                        3652
                        0.818369%
                        LIBORUSD3MBBG

                        51
                        2020-10-27
                        4383
                        0.940271%
                        LIBORUSD3MBBG

                        52
                        2020-10-27
                        5478
                        1.065859%
                        LIBORUSD3MBBG

                        53
                        2020-10-27
                        7305
                        1.191864%
                        LIBORUSD3MBBG

                        54
                        2020-10-27
                        9132
                        1.243035%
                        LIBORUSD3MBBG

                        55
                        2020-10-27
                        10959
                        1.265036%
                        LIBORUSD3MBBG

                        56
                        2020-10-27
                        1
                        0.219241%
                        LIBOR6MBBG

                        57
                        2020-10-27
                        4
                        0.228388%
                        LIBOR6MBBG

                        58
                        2020-10-27
                        7
                        0.234924%
                        LIBOR6MBBG

                        59
                        2020-10-27
                        14
                        0.232315%
                        LIBOR6MBBG

                        60
                        2020-10-27
                        32
                        0.234126%
                        LIBOR6MBBG

                        61
                        2020-10-27
                        61
                        0.233679%
                        LIBOR6MBBG

                        62
                        2020-10-27
                        92
                        0.233624%
                        LIBOR6MBBG

                        63
                        2020-10-27
                        120
                        0.248305%
                        LIBOR6MBBG

                        64
                        2020-10-27
                        151
                        0.253051%
                        LIBOR6MBBG

                        65
                        2020-10-27
                        182
                        0.250152%
                        LIBOR6MBBG

                        66
                        2020-10-27
                        211
                        0.253671%
                        LIBOR6MBBG

                        67
                        2020-10-27
                        243
                        0.255819%
                        LIBOR6MBBG

                        68
                        2020-10-27
                        273
                        0.256340%
                        LIBOR6MBBG

                        69
                        2020-10-27
                        306
                        0.256761%
                        LIBOR6MBBG

                        70
                        2020-10-27
                        335
                        0.257058%
                        LIBOR6MBBG

                        71
                        2020-10-27
                        365
                        0.257260%
                        LIBOR6MBBG

                        72
                        2020-10-27
                        547
                        0.262732%
                        LIBOR6MBBG

                        73
                        2020-10-27
                        732
                        0.300910%
                        LIBOR6MBBG

                        74
                        2020-10-27
                        1096
                        0.364513%
                        LIBOR6MBBG

                        75
                        2020-10-27
                        1461
                        0.438432%
                        LIBOR6MBBG

                        76
                        2020-10-27
                        1826
                        0.527113%
                        LIBOR6MBBG

                        77
                        2020-10-27
                        2556
                        0.717528%
                        LIBOR6MBBG

                        78
                        2020-10-27
                        3652
                        0.961599%
                        LIBOR6MBBG

                        79
                        2020-10-27
                        4383
                        1.087461%
                        LIBOR6MBBG

                        80
                        2020-10-27
                        5478
                        1.217227%
                        LIBOR6MBBG

                        81
                        2020-10-27
                        7305
                        1.346548%
                        LIBOR6MBBG

                        82
                        2020-10-27
                        9132
                        1.396844%
                        LIBOR6MBBG

                        83
                        2020-10-27
                        10959
                        1.420908%
                        LIBOR6MBBG

                        84
                        2020-10-27
                        1
                        0.329042%
                        LIBORUSD12MBBG

                        85
                        2020-10-27
                        4
                        0.338202%
                        LIBORUSD12MBBG

                        86
                        2020-10-27
                        7
                        0.334282%
                        LIBORUSD12MBBG

                        87
                        2020-10-27
                        14
                        0.336909%
                        LIBORUSD12MBBG

                        88
                        2020-10-27
                        32
                        0.335956%
                        LIBORUSD12MBBG

                        89
                        2020-10-27
                        61
                        0.336339%
                        LIBORUSD12MBBG

                        90
                        2020-10-27
                        92
                        0.336348%
                        LIBORUSD12MBBG

                        91
                        2020-10-27
                        120
                        0.336245%
                        LIBORUSD12MBBG

                        92
                        2020-10-27
                        151
                        0.336307%
                        LIBORUSD12MBBG

                        93
                        2020-10-27
                        182
                        0.336365%
                        LIBORUSD12MBBG

                        94
                        2020-10-27
                        211
                        0.336309%
                        LIBORUSD12MBBG

                        95
                        2020-10-27
                        243
                        0.336349%
                        LIBORUSD12MBBG

                        96
                        2020-10-27
                        273
                        0.336304%
                        LIBORUSD12MBBG

                        97
                        2020-10-27
                        306
                        0.336336%
                        LIBORUSD12MBBG

                        98
                        2020-10-27
                        335
                        0.336336%
                        LIBORUSD12MBBG

                        99
                        2020-10-27
                        365
                        0.336327%
                        LIBORUSD12MBBG

                        100
                        2020-10-27
                        547
                        0.390821%
                        LIBORUSD12MBBG

                        101
                        2020-10-27
                        732
                        0.418427%
                        LIBORUSD12MBBG

                        102
                        2020-10-27
                        1096
                        0.535385%
                        LIBORUSD12MBBG

                        103
                        2020-10-27
                        1461
                        0.636915%
                        LIBORUSD12MBBG

                        104
                        2020-10-27
                        1826
                        0.737168%
                        LIBORUSD12MBBG

                        105
                        2020-10-27
                        2556
                        0.946149%
                        LIBORUSD12MBBG

                        106
                        2020-10-27
                        3652
                        1.206352%
                        LIBORUSD12MBBG

                        107
                        2020-10-27
                        4383
                        1.328154%
                        LIBORUSD12MBBG

                        108
                        2020-10-27
                        5478
                        1.461553%
                        LIBORUSD12MBBG

                        109
                        2020-10-27
                        7305
                        1.593587%
                        LIBORUSD12MBBG

                        110
                        2020-10-27
                        9132
                        1.647409%
                        LIBORUSD12MBBG

                        111
                        2020-10-27
                        10959
                        1.671933%
                        LIBORUSD12MBBG

                        112
                        2020-10-27
                        1
                        0.073027%
                        USDSOFR

                        113
                        2020-10-27
                        4
                        0.082159%
                        USDSOFR

                        114
                        2020-10-27
                        7
                        0.083464%
                        USDSOFR

                        115
                        2020-10-27
                        14
                        0.084769%
                        USDSOFR

                        116
                        2020-10-27
                        32
                        0.085587%
                        USDSOFR

                        117
                        2020-10-27
                        61
                        0.082913%
                        USDSOFR

                        118
                        2020-10-27
                        92
                        0.083954%
                        USDSOFR

                        119
                        2020-10-27
                        120
                        0.081865%
                        USDSOFR

                        120
                        2020-10-27
                        151
                        0.079934%
                        USDSOFR

                        121
                        2020-10-27
                        182
                        0.078561%
                        USDSOFR

                        122
                        2020-10-27
                        211
                        0.075467%
                        USDSOFR

                        123
                        2020-10-27
                        243
                        0.073496%
                        USDSOFR

                        124
                        2020-10-27
                        273
                        0.072511%
                        USDSOFR

                        125
                        2020-10-27
                        306
                        0.072512%
                        USDSOFR

                        126
                        2020-10-27
                        335
                        0.071469%
                        USDSOFR

                        127
                        2020-10-27
                        365
                        0.070800%
                        USDSOFR

                        128
                        2020-10-27
                        547
                        0.061336%
                        USDSOFR

                        129
                        2020-10-27
                        732
                        0.054770%
                        USDSOFR

                        130
                        2020-10-27
                        1096
                        0.066411%
                        USDSOFR

                        131
                        2020-10-27
                        1461
                        0.115014%
                        USDSOFR

                        132
                        2020-10-27
                        1826
                        0.185709%
                        USDSOFR

                        133
                        2020-10-27
                        2556
                        0.352623%
                        USDSOFR

                        134
                        2020-10-27
                        3652
                        0.580231%
                        USDSOFR

                        135
                        2020-10-27
                        4383
                        0.698839%
                        USDSOFR

                        136
                        2020-10-27
                        5478
                        0.819661%
                        USDSOFR

                        137
                        2020-10-27
                        7305
                        0.939151%
                        USDSOFR

                        138
                        2020-10-27
                        9132
                        0.978000%
                        USDSOFR

                        139
                        2020-10-27
                        10959
                        1.002141%
                        USDSOFR

```python
df_libor3m = curvas[curvas.codigo == 'LIBORUSD3MBBG']
df_sofr = curvas[curvas.codigo == 'USDSOFR']
```

```python
df_sofr.style.format(frmt)
```

        	        fecha	        plazo	        tasa	        codigo

                        112
                        2020-10-27
                        1
                        0.073027%
                        USDSOFR

                        113
                        2020-10-27
                        4
                        0.082159%
                        USDSOFR

                        114
                        2020-10-27
                        7
                        0.083464%
                        USDSOFR

                        115
                        2020-10-27
                        14
                        0.084769%
                        USDSOFR

                        116
                        2020-10-27
                        32
                        0.085587%
                        USDSOFR

                        117
                        2020-10-27
                        61
                        0.082913%
                        USDSOFR

                        118
                        2020-10-27
                        92
                        0.083954%
                        USDSOFR

                        119
                        2020-10-27
                        120
                        0.081865%
                        USDSOFR

                        120
                        2020-10-27
                        151
                        0.079934%
                        USDSOFR

                        121
                        2020-10-27
                        182
                        0.078561%
                        USDSOFR

                        122
                        2020-10-27
                        211
                        0.075467%
                        USDSOFR

                        123
                        2020-10-27
                        243
                        0.073496%
                        USDSOFR

                        124
                        2020-10-27
                        273
                        0.072511%
                        USDSOFR

                        125
                        2020-10-27
                        306
                        0.072512%
                        USDSOFR

                        126
                        2020-10-27
                        335
                        0.071469%
                        USDSOFR

                        127
                        2020-10-27
                        365
                        0.070800%
                        USDSOFR

                        128
                        2020-10-27
                        547
                        0.061336%
                        USDSOFR

                        129
                        2020-10-27
                        732
                        0.054770%
                        USDSOFR

                        130
                        2020-10-27
                        1096
                        0.066411%
                        USDSOFR

                        131
                        2020-10-27
                        1461
                        0.115014%
                        USDSOFR

                        132
                        2020-10-27
                        1826
                        0.185709%
                        USDSOFR

                        133
                        2020-10-27
                        2556
                        0.352623%
                        USDSOFR

                        134
                        2020-10-27
                        3652
                        0.580231%
                        USDSOFR

                        135
                        2020-10-27
                        4383
                        0.698839%
                        USDSOFR

                        136
                        2020-10-27
                        5478
                        0.819661%
                        USDSOFR

                        137
                        2020-10-27
                        7305
                        0.939151%
                        USDSOFR

                        138
                        2020-10-27
                        9132
                        0.978000%
                        USDSOFR

                        139
                        2020-10-27
                        10959
                        1.002141%
                        USDSOFR

## Ejercicio

Utilizando las curvas *Libor* y *SOFR* de más arriba, valorice el Cap a 5Y con strike igual a 3.00%. Las convenciones de tasas de ambas curvas es Com Act/365.

**NOTA:** El valor esperado de la Libor a una cierta fecha usando la curva **Libor de BBG** se calcula como:

$$
\begin{equation}
\mathbb{E}_t^Q\left(L_{T_f}\right)=\left(\frac{P_L\left(t,T_f\right)}{P_L\left(t,T_{f+3M}\right)}-1\right)\cdot\frac{1}{yf\left(T_f,T_{f+3M}\right)}=FWD\left(T_f,T_{f+3M}\right)
\end{equation}
$$

Donde $P_L\left(t,T\right)$ es el factor de descuento obtenido desde la curva Libor entre $t=hoy$ y $T$ y $f$ es la fecha de inicio de la Libor.

Usar funciones de la librería o usar Excel.

### Mini Ejemplo de Cálculo de $E\left(L\right)$.

```python
plazos = [90, 180, 270, 360]
tasas = [.01, .012, .014, .016]

df_90 = 1/(1+tasas[0])**(plazos[0]/365)
print(f'df_90: {df_90:.8%}')

df_180 = 1/(1+tasas[1])**(plazos[1]/365)
print(f'df_180: {df_180:.8%}')

ValorEsperado_L3M_en_90D = (df_90 / df_180 - 1) * 360 / (plazos[1] - plazos[0])
print(f'ValorEsperado_L3M_en_90D: {ValorEsperado_L3M_en_90D:.6%}')
```

    df_90: 99.75495011%
    df_180: 99.41346856%
    ValorEsperado_L3M_en_90D: 1.373985%

### Solución

```python
fecha_inicio = Qcf.QCDate(26, 10, 2020)
cap = get_libor_usd_3m_leg(Qcf.RecPay.RECEIVE, 10000000, fecha_inicio, Qcf.Tenor('5Y'))
```

```python
libor_zero_curve = aux.get_curve_from_dataframe(Qcf.QCAct365(), Qcf.QCCompoundWf(), df_libor3m)
```

```python
type(libor_zero_curve)
```

    finrisk.QC_Financial_3.ZeroCouponCurve

```python
libor_zero_curve.get_discount_factor_at(900)
```

    0.9939033236572831

```python
sofr_zero_curve = aux.get_curve_from_dataframe(Qcf.QCAct365(), Qcf.QCCompoundWf(), df_sofr)
```

```python
fwd = Qcf.ForwardRates()
```

```python
fwd.set_rates_ibor_leg(Qcf.QCDate(26, 10, 2020), cap, libor_zero_curve)
```

```python
cap.get_cashflow_at(0).set_rate_value(first_fixing)
```

```python
df_cap = aux.show_leg(cap, 'IborCashflow', '')
df_cap.head().style.format(frmt)
```

        	        fecha_inicial	        fecha_final	        fecha_fixing	        fecha_pago	        nominal	        amortizacion	        interes	        amort_es_flujo	        flujo	        moneda	        codigo_indice_tasa	        valor_tasa	        spread	        gearing	        tipo_tasa

                        0
                        2020-10-26
                        2021-01-26
                        2020-10-22
                        2021-01-26
                        10,000,000.00
                        0.00
                        5,488.06
                        True
                        5,488.06
                        USD
                        LIBORUSD3M
                        0.214750%
                        0.000000
                        1.000000
                        LinAct360

                        1
                        2021-01-26
                        2021-04-26
                        2021-01-22
                        2021-04-26
                        10,000,000.00
                        0.00
                        6,137.11
                        True
                        6,137.11
                        USD
                        LIBORUSD3M
                        0.245484%
                        0.000000
                        1.000000
                        LinAct360

                        2
                        2021-04-26
                        2021-07-26
                        2021-04-22
                        2021-07-26
                        10,000,000.00
                        0.00
                        5,238.81
                        True
                        5,238.81
                        USD
                        LIBORUSD3M
                        0.207249%
                        0.000000
                        1.000000
                        LinAct360

                        3
                        2021-07-26
                        2021-10-26
                        2021-07-22
                        2021-10-26
                        10,000,000.00
                        0.00
                        5,071.09
                        True
                        5,071.09
                        USD
                        LIBORUSD3M
                        0.198434%
                        0.000000
                        1.000000
                        LinAct360

                        4
                        2021-10-26
                        2022-01-26
                        2021-10-22
                        2022-01-26
                        10,000,000.00
                        0.00
                        5,771.34
                        True
                        5,771.34
                        USD
                        LIBORUSD3M
                        0.225835%
                        0.000000
                        1.000000
                        LinAct360

```python
p1 = fecha_inicio.day_diff(Qcf.build_qcdate_from_string('2021-01-26'))
p2 = fecha_inicio.day_diff(Qcf.build_qcdate_from_string('2021-04-26'))
el = libor_zero_curve.get_forward_rate_with_rate(
    Qcf.QCInterestRate(
        0.0,
        Qcf.QCAct360(),
        Qcf.QCLinearWf()
    ),
    p1,
    p2
)
print(f'Libor esperada: {el:.6%}')
```

    Libor esperada: 0.245484%

```python
df1 = libor_zero_curve.get_discount_factor_at(p1)
df2 = libor_zero_curve.get_discount_factor_at(p2)
el2 = (df1 / df2 - 1) * 360.0 / (p2 - p1)
print(f'Libor esperada: {el2:.6%}')
print(df1)
```

    Libor esperada: 0.245484%
    0.9994550000000001

```python
r1 = libor_zero_curve.get_rate_at(p1)
df1 = (1 + r1)**(-p1/365)
df1
```

    0.9994550000000001

```python
df_cap['plazo_a_pago'] = df_cap.apply(
    lambda row: fecha_inicio.day_diff(
        Qcf.build_qcdate_from_string(row['fecha_pago'])),
    axis=1)
```

```python
df_cap.head().style.format(frmt)
```

        	        fecha_inicial	        fecha_final	        fecha_fixing	        fecha_pago	        nominal	        amortizacion	        interes	        amort_es_flujo	        flujo	        moneda	        codigo_indice_tasa	        valor_tasa	        spread	        gearing	        tipo_tasa	        plazo_a_pago

                        0
                        2020-10-26
                        2021-01-26
                        2020-10-22
                        2021-01-26
                        10,000,000.00
                        0.00
                        5,488.06
                        True
                        5,488.06
                        USD
                        LIBORUSD3M
                        0.214750%
                        0.000000
                        1.000000
                        LinAct360
                        92

                        1
                        2021-01-26
                        2021-04-26
                        2021-01-22
                        2021-04-26
                        10,000,000.00
                        0.00
                        6,137.11
                        True
                        6,137.11
                        USD
                        LIBORUSD3M
                        0.245484%
                        0.000000
                        1.000000
                        LinAct360
                        182

                        2
                        2021-04-26
                        2021-07-26
                        2021-04-22
                        2021-07-26
                        10,000,000.00
                        0.00
                        5,238.81
                        True
                        5,238.81
                        USD
                        LIBORUSD3M
                        0.207249%
                        0.000000
                        1.000000
                        LinAct360
                        273

                        3
                        2021-07-26
                        2021-10-26
                        2021-07-22
                        2021-10-26
                        10,000,000.00
                        0.00
                        5,071.09
                        True
                        5,071.09
                        USD
                        LIBORUSD3M
                        0.198434%
                        0.000000
                        1.000000
                        LinAct360
                        365

                        4
                        2021-10-26
                        2022-01-26
                        2021-10-22
                        2022-01-26
                        10,000,000.00
                        0.00
                        5,771.34
                        True
                        5,771.34
                        USD
                        LIBORUSD3M
                        0.225835%
                        0.000000
                        1.000000
                        LinAct360
                        457

```python
df_cap['disc_factor'] = df_cap.apply(
    lambda row: sofr_zero_curve.get_discount_factor_at(row['plazo_a_pago']),
    axis=1)
```

```python
df_cap.head().style.format(frmt)
```

        	        fecha_inicial	        fecha_final	        fecha_fixing	        fecha_pago	        nominal	        amortizacion	        interes	        amort_es_flujo	        flujo	        moneda	        codigo_indice_tasa	        valor_tasa	        spread	        gearing	        tipo_tasa	        plazo_a_pago	        disc_factor

                        0
                        2020-10-26
                        2021-01-26
                        2020-10-22
                        2021-01-26
                        10,000,000.00
                        0.00
                        5,488.06
                        True
                        5,488.06
                        USD
                        LIBORUSD3M
                        0.214750%
                        0.000000
                        1.000000
                        LinAct360
                        92
                        0.999789

                        1
                        2021-01-26
                        2021-04-26
                        2021-01-22
                        2021-04-26
                        10,000,000.00
                        0.00
                        6,137.11
                        True
                        6,137.11
                        USD
                        LIBORUSD3M
                        0.245484%
                        0.000000
                        1.000000
                        LinAct360
                        182
                        0.999608

                        2
                        2021-04-26
                        2021-07-26
                        2021-04-22
                        2021-07-26
                        10,000,000.00
                        0.00
                        5,238.81
                        True
                        5,238.81
                        USD
                        LIBORUSD3M
                        0.207249%
                        0.000000
                        1.000000
                        LinAct360
                        273
                        0.999458

                        3
                        2021-07-26
                        2021-10-26
                        2021-07-22
                        2021-10-26
                        10,000,000.00
                        0.00
                        5,071.09
                        True
                        5,071.09
                        USD
                        LIBORUSD3M
                        0.198434%
                        0.000000
                        1.000000
                        LinAct360
                        365
                        0.999292

                        4
                        2021-10-26
                        2022-01-26
                        2021-10-22
                        2022-01-26
                        10,000,000.00
                        0.00
                        5,771.34
                        True
                        5,771.34
                        USD
                        LIBORUSD3M
                        0.225835%
                        0.000000
                        1.000000
                        LinAct360
                        457
                        0.999174

```python
def bsm(fecha_val: str,
        fecha_inicio: str,
        fecha_final: str,
        nominal: float,
        strike: float,
        tasa: float,
        df: float,
        sigma: float):
    """
    """
    act_365 = Qcf.QCAct365() # Ojo con esto

    qfecha_inicio = Qcf.build_qcdate_from_string(fecha_inicio)
    t = act_365.yf(Qcf.build_qcdate_from_string(fecha_val), qfecha_inicio)

    # Retornan 0 si el caplet
    if t == 0:
        return max(tasa - strike, 0)

    s_sq_t = sigma * math.sqrt(t)

    d1 = (math.log(tasa / strike) + .5 * sigma**2 * t) / (s_sq_t)
    d2 = d1 - s_sq_t

    act_360 = Qcf.QCAct360() # Ojo con esto

    yf = act_360.yf(qfecha_inicio, Qcf.build_qcdate_from_string(fecha_final))
    return nominal * yf * df * (tasa * norm.cdf(d1) - strike * norm.cdf(d2))
```

```python
strike = 0.00420769
sigma = .8715
df_cap['premium'] = df_cap.apply(
    lambda row: bsm(
        '2020-10-26',
        row['fecha_inicial'],
        row['fecha_final'],
        row['nominal'],
        strike,
        row['valor_tasa'],
        row['disc_factor'],
        sigma),
    axis=1)
```

```python
df_cap.style.format(frmt)
```

        	        fecha_inicial	        fecha_final	        fecha_fixing	        fecha_pago	        nominal	        amortizacion	        interes	        amort_es_flujo	        flujo	        moneda	        codigo_indice_tasa	        valor_tasa	        spread	        gearing	        tipo_tasa	        plazo_a_pago	        disc_factor	        premium

                        0
                        2020-10-26
                        2021-01-26
                        2020-10-22
                        2021-01-26
                        10,000,000.00
                        0.00
                        5,488.06
                        True
                        5,488.06
                        USD
                        LIBORUSD3M
                        0.214750%
                        0.000000
                        1.000000
                        LinAct360
                        92
                        0.999789
                        0.000000

                        1
                        2021-01-26
                        2021-04-26
                        2021-01-22
                        2021-04-26
                        10,000,000.00
                        0.00
                        6,137.11
                        True
                        6,137.11
                        USD
                        LIBORUSD3M
                        0.245484%
                        0.000000
                        1.000000
                        LinAct360
                        182
                        0.999608
                        181.750158

                        2
                        2021-04-26
                        2021-07-26
                        2021-04-22
                        2021-07-26
                        10,000,000.00
                        0.00
                        5,238.81
                        True
                        5,238.81
                        USD
                        LIBORUSD3M
                        0.207249%
                        0.000000
                        1.000000
                        LinAct360
                        273
                        0.999458
                        275.905444

                        3
                        2021-07-26
                        2021-10-26
                        2021-07-22
                        2021-10-26
                        10,000,000.00
                        0.00
                        5,071.09
                        True
                        5,071.09
                        USD
                        LIBORUSD3M
                        0.198434%
                        0.000000
                        1.000000
                        LinAct360
                        365
                        0.999292
                        445.363201

                        4
                        2021-10-26
                        2022-01-26
                        2021-10-22
                        2022-01-26
                        10,000,000.00
                        0.00
                        5,771.34
                        True
                        5,771.34
                        USD
                        LIBORUSD3M
                        0.225835%
                        0.000000
                        1.000000
                        LinAct360
                        457
                        0.999174
                        906.990489

                        5
                        2022-01-26
                        2022-04-26
                        2022-01-24
                        2022-04-26
                        10,000,000.00
                        0.00
                        5,743.76
                        True
                        5,743.76
                        USD
                        LIBORUSD3M
                        0.229750%
                        0.000000
                        1.000000
                        LinAct360
                        547
                        0.999081
                        1158.480328

                        6
                        2022-04-26
                        2022-07-26
                        2022-04-22
                        2022-07-26
                        10,000,000.00
                        0.00
                        6,386.83
                        True
                        6,386.83
                        USD
                        LIBORUSD3M
                        0.252666%
                        0.000000
                        1.000000
                        LinAct360
                        638
                        0.998985
                        1674.693753

                        7
                        2022-07-26
                        2022-10-26
                        2022-07-22
                        2022-10-26
                        10,000,000.00
                        0.00
                        6,697.07
                        True
                        6,697.07
                        USD
                        LIBORUSD3M
                        0.262059%
                        0.000000
                        1.000000
                        LinAct360
                        730
                        0.998904
                        2045.622537

                        8
                        2022-10-26
                        2023-01-26
                        2022-10-24
                        2023-01-26
                        10,000,000.00
                        0.00
                        7,752.54
                        True
                        7,752.54
                        USD
                        LIBORUSD3M
                        0.303360%
                        0.000000
                        1.000000
                        LinAct360
                        822
                        0.998703
                        2903.584637

                        9
                        2023-01-26
                        2023-04-26
                        2023-01-24
                        2023-04-26
                        10,000,000.00
                        0.00
                        8,013.33
                        True
                        8,013.33
                        USD
                        LIBORUSD3M
                        0.320533%
                        0.000000
                        1.000000
                        LinAct360
                        912
                        0.998489
                        3336.735654

                        10
                        2023-04-26
                        2023-07-26
                        2023-04-24
                        2023-07-26
                        10,000,000.00
                        0.00
                        8,518.35
                        True
                        8,518.35
                        USD
                        LIBORUSD3M
                        0.336990%
                        0.000000
                        1.000000
                        LinAct360
                        1003
                        0.998259
                        3863.169018

                        11
                        2023-07-26
                        2023-10-26
                        2023-07-24
                        2023-10-26
                        10,000,000.00
                        0.00
                        9,037.12
                        True
                        9,037.12
                        USD
                        LIBORUSD3M
                        0.353627%
                        0.000000
                        1.000000
                        LinAct360
                        1095
                        0.998011
                        4408.484604

                        12
                        2023-10-26
                        2024-01-26
                        2023-10-24
                        2024-01-26
                        10,000,000.00
                        0.00
                        11,541.08
                        True
                        11,541.08
                        USD
                        LIBORUSD3M
                        0.451608%
                        0.000000
                        1.000000
                        LinAct360
                        1187
                        0.997450
                        6509.312615

                        13
                        2024-01-26
                        2024-04-26
                        2024-01-24
                        2024-04-26
                        10,000,000.00
                        0.00
                        12,176.58
                        True
                        12,176.58
                        USD
                        LIBORUSD3M
                        0.481711%
                        0.000000
                        1.000000
                        LinAct360
                        1278
                        0.996833
                        7245.646611

                        14
                        2024-04-26
                        2024-07-26
                        2024-04-24
                        2024-07-26
                        10,000,000.00
                        0.00
                        12,912.62
                        True
                        12,912.62
                        USD
                        LIBORUSD3M
                        0.510829%
                        0.000000
                        1.000000
                        LinAct360
                        1369
                        0.996155
                        8035.561003

                        15
                        2024-07-26
                        2024-10-28
                        2024-07-24
                        2024-10-28
                        10,000,000.00
                        0.00
                        14,156.22
                        True
                        14,156.22
                        USD
                        LIBORUSD3M
                        0.542153%
                        0.000000
                        1.000000
                        LinAct360
                        1463
                        0.995388
                        9167.481688

                        16
                        2024-10-28
                        2025-01-27
                        2024-10-24
                        2025-01-27
                        10,000,000.00
                        0.00
                        16,585.92
                        True
                        16,585.92
                        USD
                        LIBORUSD3M
                        0.656146%
                        0.000000
                        1.000000
                        LinAct360
                        1554
                        0.994356
                        11512.273806

                        17
                        2025-01-27
                        2025-04-28
                        2025-01-23
                        2025-04-28
                        10,000,000.00
                        0.00
                        17,569.48
                        True
                        17,569.48
                        USD
                        LIBORUSD3M
                        0.695056%
                        0.000000
                        1.000000
                        LinAct360
                        1645
                        0.993238
                        12540.632945

                        18
                        2025-04-28
                        2025-07-28
                        2025-04-24
                        2025-07-28
                        10,000,000.00
                        0.00
                        18,558.42
                        True
                        18,558.42
                        USD
                        LIBORUSD3M
                        0.734179%
                        0.000000
                        1.000000
                        LinAct360
                        1736
                        0.992035
                        13574.101217

                        19
                        2025-07-28
                        2025-10-27
                        2025-07-24
                        2025-10-27
                        10,000,000.00
                        10,000,000.00
                        19,577.09
                        True
                        10,019,577.09
                        USD
                        LIBORUSD3M
                        0.774478%
                        0.000000
                        1.000000
                        LinAct360
                        1827
                        0.990745
                        14633.245275

```python
total_premium = df_cap['premium'].sum()
print(f'Prima total: {total_premium:,.2f}')
```

    Prima total: 104,419.03