Crisis soberana, banca y energía: auditoría reproducible¶
Fecha de corte: 4 de octubre de 2026. Este cuaderno no predice una fecha de crisis ni asigna probabilidades subjetivas. Comprueba la cadena causal planteada con datos oficiales, frecuencias base descriptivas y escenarios condicionales.
Separación metodológica: datos observados, previsiones oficiales, historia descriptiva y escenarios. Las elecciones estadounidenses del 3 de noviembre son calendario político, no una variable causal del modelo.
from pathlib import Path
import json
import pandas as pd
import matplotlib.pyplot as plt
ROOT = Path.cwd()
summary = json.loads((ROOT / 'data' / 'processed' / 'summary.json').read_text())
stress = pd.read_csv(ROOT / 'data' / 'processed' / 'stress_stack_monthly.csv')
summary['cutoff'], stress.shape
('2026-10-04', (429, 11))
1. Fotografía oficial actual¶
obs = summary['observed']
facts = summary['document_facts']
current = pd.DataFrame([
['Deuda federal total de EE. UU.', obs['us_total_public_debt_trillion_usd'], 'billones USD', obs['us_debt_record_date']],
['Deuda de EE. UU. en manos del público', obs['us_debt_held_public_trillion_usd'], 'billones USD', obs['us_debt_record_date']],
['Treasury a 10 años', obs['fred_latest']['treasury_10y']['value'], '%', obs['fred_latest']['treasury_10y']['date']],
['WTI', obs['fred_latest']['wti']['value'], 'USD/barril', obs['fred_latest']['wti']['date']],
['Diferencial Francia-Alemania', obs['france_germany_spread_latest_bp'], 'pb', obs['france_germany_spread_latest_period']],
['Deuda pública francesa', facts['france_2026_q1']['debt_pct_gdp'], '% PIB', '2026-T1'],
['CET1 banca UE/EEE', facts['eba_2026_q2']['cet1_pct'], '%', '2026-T2'],
], columns=['Indicador','Valor','Unidad','Fecha'])
current
| Indicador | Valor | Unidad | Fecha | |
|---|---|---|---|---|
| 0 | Deuda federal total de EE. UU. | 40.261 | billones USD | 2026-10-01 |
| 1 | Deuda de EE. UU. en manos del público | 32.434 | billones USD | 2026-10-01 |
| 2 | Treasury a 10 años | 5.240 | % | 2026-10-01 |
| 3 | WTI | 96.160 | USD/barril | 2026-09-29 |
| 4 | Diferencial Francia-Alemania | 81.500 | pb | 2026-08 |
| 5 | Deuda pública francesa | 117.600 | % PIB | 2026-T1 |
| 6 | CET1 banca UE/EEE | 16.100 | % | 2026-T2 |
Lectura: existe vulnerabilidad fiscal y un shock energético observable, pero no una crisis bancaria confirmada. En septiembre, el apilamiento temprano de EE. UU. activa solo la señal de energía; NFCI, SLOOS y Sahm no confirman todavía una cadena sistémica.
pd.DataFrame([summary['observed']['current_us_stress_stack']]).T.rename(columns={0:'valor'})
| valor | |
|---|---|
| month | 2026-09 |
| oil_yoy_pct | 52.15 |
| nfci | -0.548 |
| sloos_net_tightening_pct | 0.0 |
| sahm | 0.0 |
| early_stress_count | 1 |
| energy_shock | True |
| financial_conditions_tight | False |
| bank_credit_tightening | False |
| recession_active | False |
| recession_within_next_12m | None |
2. Base histórica descriptiva¶
hist = summary['historical_event_study']
monthly = pd.DataFrame([
[k, v['months'], v['recession_within_next_12m_pct']]
for k,v in hist.items() if k.startswith('stress_count_gte_')
], columns=['Umbral','Meses','Recesión iniciada en 12m (%)'])
monthly
| Umbral | Meses | Recesión iniciada en 12m (%) | |
|---|---|---|---|
| 0 | stress_count_gte_0 | 417 | 15.11 |
| 1 | stress_count_gte_1 | 131 | 33.59 |
| 2 | stress_count_gte_2 | 30 | 73.33 |
| 3 | stress_count_gte_3 | 10 | 100.00 |
episodes = pd.DataFrame([
['≥2 señales', hist['episodes_stress_count_gte_2']['episodes'], hist['episodes_stress_count_gte_2']['associated_with_recession']],
['3 señales', hist['episodes_stress_count_gte_3']['episodes'], hist['episodes_stress_count_gte_3']['associated_with_recession']],
], columns=['Umbral','Episodios independientes aprox.','Asociados a recesión'])
episodes
| Umbral | Episodios independientes aprox. | Asociados a recesión | |
|---|---|---|---|
| 0 | ≥2 señales | 6 | 4 |
| 1 | 3 señales | 2 | 2 |
Los meses se solapan y no son observaciones independientes. Al agruparlos en episodios, quedan solo seis episodios con al menos dos señales y dos con las tres. Es una muestra demasiado pequeña para estimar una probabilidad robusta. Sirve como detector de confirmación, no como reloj.
plot = monthly.copy()
plot['Señales'] = [0,1,2,3]
fig, ax = plt.subplots(figsize=(8,4.5))
bars = ax.bar(plot['Señales'], plot['Recesión iniciada en 12m (%)'], color=['#94a3b8','#38bdf8','#f59e0b','#dc2626'])
ax.set(xlabel='Número mínimo de señales tempranas simultáneas', ylabel='Meses seguidos de inicio de recesión (%)', xticks=[0,1,2,3], ylim=(0,110))
ax.set_title('Base histórica descriptiva de EE. UU., 1991–2026')
labels = [f"{rate:.1f}%\n(n={int(months)} meses)" for rate, months in zip(
plot['Recesión iniciada en 12m (%)'], plot['Meses']
)]
ax.bar_label(bars, labels=labels, padding=3)
ax.text(
0.5, -0.24,
'Meses solapados; frecuencias descriptivas, no probabilidades causales.',
transform=ax.transAxes, ha='center', va='top', fontsize=8, color='#475569'
)
ax.spines[['top','right']].set_visible(False)
fig.tight_layout()
chart = ROOT / 'reports' / 'stress_stack_base_rates.png'
fig.savefig(chart, dpi=180, bbox_inches='tight')
chart
PosixPath('/home/linuxboot/.openclaw/workspace/system-config/webgestor/finanzas-sin-miedo/2026-10-04/global-sovereign-crisis/reports/stress_stack_base_rates.png')
3. Escenarios condicionales, no probabilidades¶
scenarios = pd.DataFrame([
['Contención', 'Petróleo e inflación ceden; spreads y crédito estables', 'Volatilidad sin crisis sistémica', 'NFCI<0, SLOOS bajo, empleo estable'],
['Tensión soberana europea', 'Francia no estabiliza déficit y sube la prima', 'Coste de capital y crédito europeos al alza', 'Spread FR-DE persistente; banca y préstamos empeoran'],
['Estanflación energética', 'Energía alta persiste y limita recortes', 'Menor crecimiento con inflación y tipos altos', 'Petróleo/gas, expectativas, inflación subyacente'],
['Crisis global', 'Coinciden soberano, banca/fondos, energía y crédito', 'Ventas forzadas, recesión y contagio internacional', 'NFCI>0, SLOOS>20, Sahm≥0.5 y deterioro bancario'],
], columns=['Escenario','Condición necesaria','Mecanismo','Indicadores de confirmación'])
scenarios
| Escenario | Condición necesaria | Mecanismo | Indicadores de confirmación | |
|---|---|---|---|---|
| 0 | Contención | Petróleo e inflación ceden; spreads y crédito ... | Volatilidad sin crisis sistémica | NFCI<0, SLOOS bajo, empleo estable |
| 1 | Tensión soberana europea | Francia no estabiliza déficit y sube la prima | Coste de capital y crédito europeos al alza | Spread FR-DE persistente; banca y préstamos em... |
| 2 | Estanflación energética | Energía alta persiste y limita recortes | Menor crecimiento con inflación y tipos altos | Petróleo/gas, expectativas, inflación subyacente |
| 3 | Crisis global | Coinciden soberano, banca/fondos, energía y cr... | Ventas forzadas, recesión y contagio internaci... | NFCI>0, SLOOS>20, Sahm≥0.5 y deterioro bancario |
4. Conclusión¶
La hipótesis de una crisis global es económicamente posible, pero no está confirmada. Hoy coexisten deuda soberana elevada, tipos largos altos, un shock energético y una prima francesa inusualmente alta. Faltan, sin embargo, dos eslabones decisivos: endurecimiento bancario agregado y estrés financiero general. La fecha electoral no los sustituye.
La estrategia patrimonial debe ser robusta a varios escenarios —liquidez, poca deuda forzada y diversificación— y no una apuesta apalancada a una fecha.
Límites¶
- Los umbrales son transparentes, pero no convierten correlación en causalidad.
- Los meses se solapan; el recuento por episodios reduce, pero no elimina, dependencia.
- La historia contiene pocos episodios de crisis sistémica comparables.
- Los escenarios no incorporan una probabilidad subjetiva ni recomiendan operaciones concretas.