Saltar a contenido

Configurar un SwapICPCLP de Mercado

Se muestra una forma posible de configurar una operación de Swap ICPCLP de mercado. Se definirán algunos parámetros por default y sólo será necesario especificar el nocional, el plazo, el valor de la tasa fija y si ésta se recibe o se paga para obtener la estructura completa.

Para ejecutar todos los ejemplos se debe importar la librería. Se sugiere utilizar siempre el alias qcf.

import qcfinancial as qcf
import pandas as pd

import aux_functions as aux

Se verifica la versión y build de qcfinancial.

qcf.id()
'version: 0.11.0, build: 2024-06-16 09:00'

Parámetros por Default de la Operación

Se comienza estableciendo una fecha de trade y dando de alta un dict con los parámetros por default comunes y los específicos de ambas patas.

trade_date = qcf.QCDate(14, 6, 2024)
both_default_values = {
    "bus_adj_rule": qcf.BusyAdjRules.MODFOLLOW,
    "settlement_calendar": qcf.BusinessCalendar(trade_date, 20),
    "settlement_lag": 1,
    "amort_is_cashflow": False,
    "notional_currency": qcf.QCCLP(),
    "sett_lag_behaviour": qcf.SettLagBehaviour.DONT_MOVE
}

icpclp_default_values = {
    "stub_period": qcf.StubPeriod.NO,
    "fix_adj_rule": qcf.BusyAdjRules.MODFOLLOW,
    "fixing_calendar": qcf.BusinessCalendar(trade_date, 20),
    "dates_for_eq_rate": qcf.DatesForEquivalentRate.ACCRUAL,
    "interest_rate": qcf.QCInterestRate(.0, qcf.QCAct360(), qcf.QCLinearWf()),
    "eq_rate_decimal_places": 4,
}

fixed_rate_default_values = {
    "settlement_stub_period": qcf.StubPeriod.NO,
    "is_bond":False,  
}

Pata Fija

Se da de alta los parámetros variables de la pata fija. Notar la utilización del parámetro auxiliar maturity que permite calcular la fecha final.

str_maturity = "1Y"
maturity = qcf.Tenor(str_maturity)
meses = maturity.get_months() + 12 * maturity.get_years()

Se da de alta el objeto.

fixed_rate_value = .03
fixed_rate_leg_other_values = {
    "settlement_periodicity": qcf.Tenor('2Y') if str_maturity in ['1M', '2M', '3M', '6M', '9M', '12M', '1Y', '18M'] else qcf.Tenor('6M'),
    "rec_pay": qcf.RecPay.RECEIVE,
    "initial_notional": 1_000_000_000.0,
    "start_date": (start_date:=qcf.QCDate(18, 6, 2024)),
    "end_date": start_date.add_months(meses),
    "interest_rate": qcf.QCInterestRate(fixed_rate_value, qcf.QCAct360(), qcf.QCLinearWf()),  
}
fixed_rate_leg = qcf.LegFactory.build_bullet_fixed_rate_leg(
    **(both_default_values | fixed_rate_default_values | fixed_rate_leg_other_values)
)

Se visualiza el resultado.

aux.leg_as_dataframe(fixed_rate_leg).style.format(aux.format_dict)
  fecha_inicial fecha_final fecha_pago nominal amortizacion interes amort_es_flujo flujo moneda valor_tasa tipo_tasa
0 2024-06-18 2025-06-18 2025-06-19 1,000,000,000.00 1,000,000,000.00 30,416,666.67 False 30,416,666.67 CLP 3.0000% LinAct360

Pata OvernightIndex

Se da de alta los parámetros variables de la pata OvernightIndex. Notar que se reutilizan algunos de los parámetros de la pata fija.

rp = qcf.RecPay.RECEIVE if fixed_rate_leg_other_values['rec_pay'] == qcf.RecPay.PAY else qcf.RecPay.RECEIVE

icpclp_leg_other_values = {
    "rec_pay": rp,
    "initial_notional": fixed_rate_leg_other_values["initial_notional"],
    "start_date": fixed_rate_leg_other_values["start_date"],
    "end_date": fixed_rate_leg_other_values["end_date"],
    "settlement_periodicity": fixed_rate_leg_other_values["settlement_periodicity"],
    "interest_rate": qcf.QCInterestRate(0.0, qcf.QCAct360(), qcf.QCLinearWf()),
    "index_name": "ICPCLP",
    "spread": 0.0,
    "gearing": 1.0,
}

Finalmente, se da de alta el objeto.

on_index_leg = qcf.LegFactory.build_bullet_overnight_index_leg(
    **(both_default_values | icpclp_default_values | icpclp_leg_other_values)
)

Se visualiza.

aux.leg_as_dataframe(on_index_leg).style.format(aux.format_dict)
  fecha_inicial_devengo fecha_final_devengo fecha_inicial_indice fecha_final_indice fecha_pago nocional amortizacion amort_es_flujo moneda_nocional nombre_indice valor_indice_inicial valor_indice_final valor_tasa_equivalente tipo_tasa interes flujo spread gearing
0 2024-06-18 2025-06-18 2024-06-18 2025-06-18 2025-06-19 1,000,000,000.00 1,000,000,000.00 False CLP ICPCLP 1.000000 1.000000 0.0000% LinAct360 0.00 0.00 0.0000% 1.00