Entonces este swap "SOFR vs fixed" tiene una pata fija que paga un 5.231% anual y una pata flotante que paga anualmente la tasa SOFR compuesta anualmente, y tiene un plazo de 1 semana. Si ha comenzado hoy, no tendrá intercambio de flujos de efectivo ya que 1 semana < 1 año. Entonces necesariamente es un swap que ha comenzado antes, pero entonces, ¿cuál es swap es?
Respuesta
¿Demasiados anuncios?La página DES siempre muestra información muy genérica, las convenciones básicas de intercambio SOFR en el caso de US0SFR1Z
.
El acuerdo, el plazo y la comilla son específicos para el ticker. Así que tienes un intercambio SOFR fijo-variable, que se liquida el 25 de julio y vence en 1 semana (1 de agosto).
En cuanto a la computación, en realidad es más simple con intercambios a corto plazo. La siguiente captura de pantalla muestra cómo SWPM coincide con el HP, que es el intercambio cotizado con liquidación estándar T+2.
Elegí una fecha de inicio histórica porque puedes observar directamente los ajustes en la pestaña Resets
para calcular los flujos de efectivo reales.
Replicar la computación en Python se ve así:
from datetime import date
import pandas as pd
from math import prod
start = date(2023, 7, 13)
end = date(2023, 7, 20)
pd.date_range(start, end, freq='B')
df = pd.DataFrame({"Dates" : pd.date_range(start, end, freq='B'), "Reset Rate" : [5.06,5.05,5.06,5.06,5.05, 5.06]})
days = [(df.Dates[i+1]-df.Dates[i]).days for i in range(0,len(df)-1)]
days.append(0)
df["Days"] = days
df["Rate"] = 1+df["Reset Rate"]/100*df.Days/360
df
Esto crea un DataFrame que muestra las fechas, los ajustes asociados y la tasa calculada, que se calcula como $1+df["Reset Rate"]/100*df.Days/360$ para ajustar por el día de ACT/360.
La pierna fija es trivial, y para la pierna variable, uno necesita redondear el valor compuesto por 7 decimales y ajustar nuevamente por el día para obtener un valor anual, llamado Cupón Equivalente
en SWPM.
N = 10000000
quote = 0.05058
fixed_leg = N*(1+quote*7/360)
Equiv_Coupon = round((prod(df.Rate[0:5])-1)*360/7,7)
float_leg = 10000000*(1+Equiv_Coupon*7/360)
pd.set_option('display.float_format', lambda x: '%.7f' % x)
pd.DataFrame({"Notional" : [N], "Quote" : [quote], "Fixed Leg Payment" : fixed_leg, "Equivalent Coupon" : Equiv_Coupon, "Float Leg Payment" : float_leg,})