1 votos

Trama una curva ACS en QuantLib

IRS bajo un CSA

Consideremos un ejemplo de un Intercambio de Tasas de Interés bajo un CSA. Para calcular los factores de descuento que se pueden utilizar para descontar flujos de efectivo en una moneda, $C_{1}$, colateralizados en otra moneda, $C_{2}$, todo lo que necesitamos son los tipos de cambio al contado y a plazo de $C_{1}$ a $C_{2}$ y los factores de descuento en $C_{2}$. Sea

$FX_{C1\rightarrow C2}^{FWD}(T)$ = $Tipo\: de\: cambio\: a\: plazo\: para\: convertir\: de$ $C_{1}$ $a$ $C_{1}$ $en\: el\: tiempo\: T$

$FX_{C1\rightarrow C2}^{SPOT}$ = $FX_{C1\rightarrow C2}^{FWD}(0)$ = $Tipo\: de\: cambio\: al\: contado\: para\: convertir\: de$ $C_{1}$ $a$ $C_{1}$

$DF_{C2}(T)$ = $factor\: de\: descuento\: en\: el\: tiempo\: T\: para\: la\: moneda$ $C_{2}$,

Luego, bajo la suposición de que los tipos de cambio a futuro son independientes de la colateralización, concluimos que

$\Large\frac{FX_{C1\rightarrow\:C2}^{CSA}(T)}{DF_{C2}(T)}$ $\Large=$ $\Large\frac{FX_{C1\rightarrow\:C2}^{FWD}(T)}{FX_{C1\rightarrow\:C2}^{FWD}(0)}$

Pregunta

¿Es posible encontrar tales funciones en QuantLib que encuentren directamente los factores de descuento de la curva de CSA (¿Y sabemos cómo construir una Curva de ZeroRate aquí)? Por favor, guíame en la dirección correcta.

¡Gracias!

3voto

dotnetcoder Puntos 1262

También puedes validar la implementación de QuantLib con rateslib.

Para definir la moneda local EUR y USD necesitas especificar dos curvas RFR:

from rateslib import *

eureur = Curve({dt(2024, 2, 16): 1.0, dt(2024, 8, 16): 1.0, dt(2025, 2, 19): 1.0}, calendar="tgt", convention="act360", interpolation="log_linear")
usdusd = Curve({dt(2024, 2, 16): 1.0, dt(2024, 8, 16): 1.0, dt(2025, 2, 19): 1.0}, calendar="nyc", convention="act360", interpolation="log_linear")

Para definir mercados de intercambio de divisas o FXswap, necesitas una curva CSA para flujos de caja en EUR con colateral en USD.

eurusd = Curve({dt(2024, 2, 16): 1.0, dt(2024, 8, 16): 1.0, dt(2025, 2, 19): 1.0}, convention="act360", interpolation="log_linear")

Los puntos de los factores de descuento se colocan en los puntos de 6m y 1Y en todas las curvas.

Ahora asociaremos estos objetos en un marco de FXForwards con los actuales FXRates

fxf = FXForwards(
    fx_rates=FXRates({"eurusd": 1.080}, settlement=dt(2024, 2, 20)),
    fx_curves={"usdusd": usdusd, "eureur": eureur, "eurusd": eurusd}
)

Ahora resuelve y actualiza estas Curves según las tasas de los instrumentos de mercado al 16 de febrero de 2024, alineándolos con los instrumentos de 6m y 1Y para simplificar.

solver = Solver(
    curves=[eureur, usdusd, eurusd],
    instruments=[
        IRS(dt(2024, 2, 16), "6m", spec="usd_irs", curves=usdusd),
        IRS(dt(2024, 2, 16), "1y", spec="usd_irs", curves=usdusd),
        IRS(dt(2024, 2, 16), "6m", spec="eur_irs", curves=eureur),
        IRS(dt(2024, 2, 16), "1y", spec="eur_irs", curves=eureur),
        XCS(dt(2024, 2, 16), "6m", spec="eurusd_xcs", curves=[eureur, eurusd, usdusd, usdusd]),
        XCS(dt(2024, 2, 16), "1y", spec="eurusd_xcs", curves=[eureur, eurusd, usdusd, usdusd]),
    ],
    s=[5.205, 5.00, 3.72, 3.40, -6.1, -11.9],
    instrument_labels=["6mUS", "1yUS", "6mEU", "1yEU", "6mUS/EU", "1yUS/EU"],
    fx=fxf,
)
ÉXITO: `func_tol` alcanzado después de 3 iteraciones (levenberg_marquardt) , `f_val`: 4.884e-12, `tiempo`: 0.0580s

El objeto actualizado de FXForwards ahora puede devolver Curves para cualquiera de los siguientes casos:

  • Flujos de caja en USD con:

    • Collateral en USD: fxf.curve("usd", "usd") # tipo: Curve
    • Collateral en EUR: fxf.curve("usd", "eur") # tipo: ProxyCurve
    • Collateral en USD+EUR: fxf.curve("usd", ["usd", "eur"]) # tipo: MultiCsaCurve
  • Flujos de caja en EUR con:

    • Collateral en USD: fxf.curve("eur", "usd") # tipo: Curve
    • Collateral en EUR: fxf.curve("eur", "eur") # tipo: Curve
    • Collateral en USD+EUR: fxf.curve("eur", ["usd", "eur"]) # tipo: MultiCsaCurve

ProxyCurves toman factores de descuento de las Curves subyacentes relevantes y realizan multiplicaciones cruzadas (similar a tus fórmulas). Son objetos capaces de calcular factores de descuento o tasas, etc.

MultiCsaCurves combinan curvas de colateral para calcular curvas de colateral múltiple intrínsecas (sin opcionalidad). Nuevamente son objetos de curva capaces de producir factores de descuento y tasas.

También pueden plot.

fxf.curve("usd", "usd").plot("1b", 
    comparators=[fxf.curve("usd", "eur"), fxf.curve("usd", ["usd", "eur"])],
    labels=["local", "eur", "local+eur"],
)

enter image description here

1voto

tekki Puntos 6

Sí, esto está soportado en QuantLib - ver la respuesta en https://quant.stackexchange.com/a/78325/70402

El ejemplo vinculado allí está modelando el caso de uso que describes.

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X