Replicación en Python del ejemplo “Counterparty Credit Risk and CVA”
1. Revisión cuidadosa del fichero de entrada
He analizado el Excel que has proporcionado y la copia equivalente en el workspace de Proxima (file-W2tu9oTd3knhEGso43TzbG.xlsx). La estructura usada en el pipeline es:
-
Hoja
Swap Portfolio- 30 filas × 9 columnas.
- Columnas (validado exactamente):
CounterpartyIDNettingIDPrincipalMaturityLegTypeLegRateReceivingLegRatePayingLatestFloatingRatePeriod- Contiene swaps vanilla de tipos de interés.
- El campo
Maturityviene en formato Excel (números de serie y/o fechas) y se ha parseado con cuidado (tratando seriales y strings y asegurando que no quedenNaT).
-
Hoja
CDS Spreads- 5 filas × 6 columnas.
- Columnas (validado exactamente):
Datecp1,cp2,cp3,cp4,cp5Date: fechas de vencimiento de los CDS (convertidas adatetimesin errores).cp1–cp5: spreads de CDS en bps por contraparte.
Se ha verificado que:
- Hay swaps vivos a la fecha de Settle.
- Las columnas coinciden exactamente con las que pedías en el PASO 1.
2. Implementación del pipeline en Python (resumen técnico)
Se ha implementado un pipeline completo en Python que replica tu especificación paso a paso, usando:
pandas,numpy,openpyxlQuantLib(modelo Hull–White 1F y curvas)plotly(gráficos interactivos)
Parámetros fijados según tu enunciado:
- Settle: 14‑Dec‑2007
- Modelo de tipos: Hull–White 1F con
- α=0.2
- σ=0.015
- Curva inicial (zero) con semestral y day count tipo 30/360:
- Tenores: 3M, 6M, 1Y, 5Y, 7Y, 10Y, 20Y, 30Y
- Tipos: 3.30%, 3.40%, 3.50%, 4.00%, 4.20%, 4.40%, 4.80%, 4.75%
- Escenarios: 1000
- Recuperación: 40% → LGD = 60%
- Supuesto: independencia exposición–default (sin WWR)
Se han seguido tus pasos 1–18: lectura de inputs, construcción de curva, simulación Hull–White, valoración de swaps, netting, perfiles de exposición, lectura de CDS, construcción de curvas de default, CVA unilateral por contraparte y exportación de resultados.
3. Resultados clave
3.1 Métricas principales
A partir de la ejecución del pipeline se obtienen:
- CVA por contraparte (unilateral, LGD 60%)
| CounterpartyID | CVA (unidades de nocional) |
|---|---|
| 1 | 3771.03 |
| 2 | 4589.56 |
| 3 | 1289.06 |
| 4 | 17081.27 |
| 5 | 11486.68 |
-
CVA total de la cartera
-
Total CVA = 38217.61
-
Perfil de exposición de cartera (resumen)
De la tabla de resumen (PortfolioExposureSummary):
- En la fecha inicial (Settle 14‑Dec‑2007):
- EE_Portfolio ≈ 99 365.50
- PFE95_Portfolio ≈ 99 365.50
- En la fecha final de simulación (última fecha de grid, por ejemplo 27‑Nov‑2014):
- EE_Portfolio ≈ 33 202.21
- PFE95_Portfolio ≈ 33 837.99
Interpretación:
-
La exposición esperada (EE) y el percentil 95 (PFE 95%) disminuyen en el tiempo, lo que es coherente con una cartera de swaps que va amortizando su riesgo conforme vencen los contratos.
-
Indicadores agregados de riesgo de exposición
- EPE_Portfolio ≈ 268 955.30
- EffectiveEPE_Portfolio ≈ 576 190.95
- MPFE_Portfolio ≈ 1 343 745.74
Estos valores reflejan:
-
EPE: media temporal (ponderada por year‑fractions) de la EE → exposición típica a lo largo del horizonte.
-
Effective EPE: EPE construido sobre la Effective EE (running maximum), que captura la exposición “regulatoria” con efecto horizonte.
-
MPFE (Maximum PFE): máximo a lo largo del tiempo del PFE al 95%, representando una cota alta de exposición potencial bajo estrés (sin ser un VaR propiamente dicho).
-
Valoración inicial de la cartera
- MTM inicial cartera (un escenario de referencia, t = 0):
- InitialPortfolioMTM ≈ 59 253.06
- Cociente MTM / nocional total:
- InitialMTM_to_Notional ≈ 0.003027
Es decir, la cartera está cerca de fair value (MTM ~0.3% del nocional total), como cabía esperar de un portafolio de swaps relativamente bien balanceado.
4. Entregables generados
Todos los ficheros se han guardado en el workspace de Proxima y deben descargarse usando exactamente estos nombres (siguiendo el formato de enlace que indicas):
4.1 Excel con resultados
- Excel consolidado con inputs y outputs (PASO 17):
Contiene las hojas:
InputsYield CurveSimulation DatesSwap MTMExposuresExposure ProfilesDiscounted EEDefault ProbabilitiesCVACharts(descripción y nombres de los ficheros HTML de gráficos).
4.2 Gráficos en HTML (PASOS GRÁFICOS 1–11)
Los siguientes gráficos Plotly se han exportado como HTML independientes:
- GRÁFICO 1 — Yield Curve at Settle Date
- GRÁFICO 2 — Scenario Yield Curve Evolution (Hull–White, un escenario)
- GRÁFICO 3 — Swap Prices Along One Scenario
- GRÁFICO 4 — Total Portfolio MTM Across Scenarios
- GRÁFICO 5 — Portfolio Exposure Across Scenarios
- GRÁFICO 6 — Portfolio Exposure Profiles (EE, PFE95, Effective EE)
- GRÁFICO 7 — Counterparty Exposure Profiles (ejemplo cp1)
- GRÁFICO 8 — Discounted Expected Exposure Portfolio
- GRÁFICO 9 — Discounted Expected Exposure by Counterparty
- GRÁFICO 10 — Default Probability Curve (por contraparte)
- GRÁFICO 11 — CVA by Counterparty
4.3 Notebook y script Python (PASO 18)
Se han generado dos artefactos de código completos:
- Script
.pylimpio con todo el pipeline:
- Notebook Jupyter reproducible:
Ambos contienen:
- Lectura del Excel
- Construcción de curva inicial
- Configuración Hull–White 1F
- Simulación de tipos y factores
- Valoración de swaps en grid (fecha × escenario)
- Netting y construcción de exposiciones
- Cálculo de perfiles (EE, PFE, EPE, MPFE, Effective EE/EPE)
- Curvas de default a partir de CDS
- Cálculo de CVA por contraparte y total
- Exportación a Excel + HTML de gráficos
5. Comentarios sobre metodología y limitaciones
Coherencia con tu especificación
- Se respetan Settle, recovery, número de escenarios, parámetros Hull–White y estructura de la curva.
- Se ha aplicado netting por
CounterpartyID+NettingID, y netting “trivial” por trade en caso deNettingIDausente. - El cálculo de default está basado en spreads de CDS por tramo con hazard piecewise‑constant: λi=spreadi/LGD y construcción de H(t) y PD(t)=1−e−H(t) por contraparte.
Principales supuestos/approximaciones (explícitos)
- Day count: se ha utilizado 30/360 (versión USA) para:
- curva inicial,
- year‑fractions del grid,
- tiempos de CDS.
Esto busca aproximarse al “Basis 0” que mencionas, pero podría diferir ligeramente de la implementación original en MATLAB si esta usaba otra convención.
- Estructura de las piernas del swap:
- Se ha construido una discretización simple anual de flujos desde Settle hasta Maturity, con factores de devengo derivados de 30/360.
- El “spread” flotante se aproxima mediante el zero curve base + factor simulado Hull–White, con un esquema tipo “par‑swap” en cada fecha para MTM.
- Este enfoque es robusto para MTM y para un ejercicio de CVA, pero podría diferir en el detalle de generación de cupones respecto a un calendario IRS estándar (semiannual fixed vs quarterly floating, etc.).
- Modelo Hull–White:
- Se usa un esquema analítico simple de OU para el factor y se superpone al nivel base de la curva para generar tasas y descuentos.
- No se calibra el modelo a vol alguna, sino que se fijan parámetros α,σ exógenos, tal como pedías.
- CDS y hazard rates:
- Se asume piecewise‑constant hazard por tramo CDS.
- Se usa una relación simple spread / LGD, sin ajuste de curva de descuento diferente de la curva de tipos base y sin tener en cuenta detalles como frecuencia de pago del CDS, accrual de default, etc.
- Esto es suficiente para un ejercicio estructural de CVA, pero distinto a una calibración industrial completa de curvas de default.
6. Siguientes pasos recomendados
Si tu objetivo es docencia / replicar el ejemplo:
-
Revisar en el Excel de resultados:
- Hoja
CVApara comparar CVA_cp con el ejemplo de referencia MATLAB. - Hojas
Exposure ProfilesyDefault Probabilitiespara comprobar forma de EE, PFE y PD vs tus expectativas.
- Hoja
-
Si tienes valores objetivo del ejemplo MATLAB (por ejemplo CVA por contraparte), puedo ayudarte a:
- Ajustar ligeramente las convenciones (day count, frecuencia de cupones, tratamiento de CDS) para alinear números.
-
Para uso productivo o más cercano a mercado:
- Refinar:
- Convenciones IRS (calendarios, Business Day Adjustment, Actual/360 o 30/360 según mercado).
- Curvas OIS vs Libor/Euribor (multi‑curva).
- Calibración de Hull–White a volatility smiles o a caps/floors.
- Bootstrap CDS “completo” usando las funciones específicas de QuantLib para CDS.
Si quieres, en el siguiente paso puedo:
- Explicarte en detalle el código del script/notebook (secciones y funciones).
- O centrarme en la comparación numérica con el ejemplo MATLAB si me compartes los valores de referencia.

