Market Risk Modelling

Guia Practica para Profesionales del Sector Financiero

Lo que realmente necesitas saber para trabajar en Risk Management: desde el dia 1 en un banco hasta entrevistas en hedge funds

Este documento NO es teoria academica. Es una guia practica basada en lo que se usa diariamente en JPMorgan, Goldman Sachs, Morgan Stanley, BlackRock, Citadel y otras instituciones financieras globales. Incluye preguntas reales de entrevistas y el codigo Python que usaras en tu trabajo.

Enfoque Practico Ejemplos Reales 2024 Codigo Python Preguntas de Entrevista

Victor Raul Miranda

CFA & FRM Level II

Market Risk Professional & Validation Expert

Enero 2026

Que Hace un Profesional de Market Risk?

Antes de entrar en formulas, entendamos que hacen los equipos de Market Risk en la vida real. Si consigues un trabajo en este sector, estas seran tus responsabilidades diarias:

Tu Dia Tipico en Market Risk (Banco Tier 1)

7:30 AM - Llegas y revisas el P&L overnight del trading desk. Verificas si hubo alguna excedencia del VaR.

8:00 AM - Morning meeting con traders. Explicas por que el VaR aumento ayer (ej: volatilidad del USD/JPY subio 15%).

9:00 AM - Calculas el VaR del dia usando los precios de cierre de ayer. Generas reportes para reguladores.

11:00 AM - Un trader quiere poner una posicion grande en opciones de Tesla. Calculas el impacto en el VaR del desk.

2:00 PM - ReuniΓ³n con el CRO (Chief Risk Officer). Presentas el stress test mensual: "Que pasa si hay otra crisis como 2008?"

4:00 PM - Backtesting: comparas el VaR de ayer con la perdida real. Si hubo excedencia, documentas por que.

Salarios en Market Risk (2024 - USA/UK)

NivelTitulo TipicoSalario Base (USD)Bonus
Entry LevelRisk Analyst$85,000 - $120,00010-20%
Mid LevelSenior Risk Analyst / AVP$130,000 - $180,00020-40%
SeniorVP of Market Risk$200,000 - $300,00040-80%
Director+Director / MD$350,000 - $500,000+80-150%

Fuente: Levels.fyi, Glassdoor, y ofertas reales en LinkedIn (Q4 2024). Hedge funds como Citadel o Two Sigma pagan 30-50% mas.

Herramientas que Usaras en el Trabajo

Python pandas numpy scipy SQL Bloomberg Terminal Excel/VBA Tableau/PowerBI Git Jira

Seccion 1

Value-at-Risk (VaR)

La metrica mas importante que calcularas todos los dias

1.1 Que es el VaR en Terminos Simples

El VaR responde una pregunta simple que tu jefe (y los reguladores) quieren saber: "Cual es lo maximo que podemos perder manana con 95% o 99% de confianza?"

πŸ“– VaR - Definicion Practica

Si calculas un VaR diario de $5 millones al 95%, significa:

🎯 Pregunta Real de Entrevista (Goldman Sachs, 2024)

Entrevistador: "Tienes un portafolio con VaR diario de $10M al 99%. El lunes perdiste $15M. Esta roto tu modelo?"

Respuesta correcta: "No necesariamente. Un VaR al 99% significa que esperamos exceder el VaR aproximadamente 2-3 veces al aΓ±o (1% de 252 dias = 2.52 dias). Una excedencia aislada es normal. Lo preocupante seria si tenemos 5+ excedencias en un aΓ±o, lo cual indicaria que el modelo subestima el riesgo."

1.2 Las Tres Formas de Calcular VaR

En la practica, usaras tres metodologias. Cada banco tiene su preferencia:

Metodo Quien lo Usa Ventaja Principal Cuando Falla
Parametrico Reportes rapidos, posiciones lineales Super rapido (milisegundos) Opciones, colas gruesas
Historico JPMorgan, reguladores (favorito) No asume distribucion Si el pasado no tiene eventos extremos
Monte Carlo Derivados complejos, CDOs Maneja cualquier payoff Lento, riesgo de modelo

1.2.1 VaR Parametrico (Delta-Normal)

Es el mas simple. Asumes que los retornos son normales y usas esta formula:

πŸ“ Formula del VaR Parametrico
$$\text{VaR}_{\alpha} = \text{Posicion} \times z_{\alpha} \times \sigma_{\text{diaria}}$$ (1)

Donde:

Escalar a 10 dias (Basilea): \(\text{VaR}_{10d} = \text{VaR}_{1d} \times \sqrt{10}\)

πŸ’‘ Ejemplo Real: VaR de una Posicion en Apple (AAPL)

Situacion: Tu desk tiene $50 millones en acciones de Apple. La volatilidad diaria de AAPL es 2.1%.

Calculo VaR 95% (1 dia):

$$\text{VaR}_{95} = \$50M \times 1.645 \times 0.021 = \$1,727,250$$

Interpretacion para tu jefe: "Con 95% de confianza, la perdida maxima en AAPL manana sera de $1.73M."

VaR 10 dias (para Basilea):

$$\text{VaR}_{10d} = \$1.73M \times \sqrt{10} = \$5.47M$$

1.2.2 VaR por Simulacion Historica

Este es el metodo favorito de los reguladores porque no asume ninguna distribucion. Simplemente tomas los ultimos 500-1000 dias de retornos historicos y miras el percentil.

πŸ“ Algoritmo de VaR Historico
  1. Descarga los ultimos 500 retornos diarios del activo
  2. Multiplica cada retorno por tu posicion actual: P&L_i = Posicion Γ— r_i
  3. Ordena los 500 P&L de menor a mayor
  4. El VaR al 95% es el P&L en la posicion #25 (5% de 500)
  5. El VaR al 99% es el P&L en la posicion #5 (1% de 500)
πŸ’‘ Ejemplo Real: VaR Historico del S&P 500 (SPY)

Situacion: Gestionas un ETF de $100M que replica el S&P 500. Usas datos de 2022-2024.

Los 5 peores dias en tus datos (2022-2024):

RankingFechaRetornoP&L Hipotetico
1 (peor)13-Jun-2022-3.88%-$3,880,000
213-Sep-2022-4.32%-$4,320,000
309-May-2022-3.20%-$3,200,000
418-Jun-2022-3.01%-$3,010,000
526-Sep-2022-2.86%-$2,860,000

VaR Historico 99% = $2,860,000 (el 5to peor dia en 500 observaciones)

1.2.3 VaR por Monte Carlo

Simulas miles de escenarios posibles de precios futuros usando un modelo estocastico (tipicamente GBM). Ideal para derivados.

Python var_montecarlo.py
# VaR Monte Carlo - Lo que usaras en el trabajo
# βœ… Este codigo se puede ejecutar directamente en Google Colab
import numpy as np
from scipy.stats import norm

def var_monte_carlo(position, mu, sigma, days=1, n_sims=100000, confidence=0.95):
    """
    Calcula VaR usando Monte Carlo.
    
    Args:
        position: Valor de la posicion en USD
        mu: Retorno esperado diario (tipicamente ~0 para VaR)
        sigma: Volatilidad diaria
        days: Horizonte (1 para diario, 10 para Basilea)
        n_sims: Numero de simulaciones (100k es standard)
        confidence: 0.95 o 0.99
    
    Returns:
        VaR en USD
    """
    # Simular retornos
    np.random.seed(42)  # Para reproducibilidad
    returns = np.random.normal(mu * days, sigma * np.sqrt(days), n_sims)
    
    # Calcular P&L
    pnl = position * returns
    
    # VaR es el percentil negativo
    var = -np.percentile(pnl, (1 - confidence) * 100)
    
    return var

# Ejemplo: $50M en AAPL, vol diaria 2.1%
var_95 = var_monte_carlo(
    position=50_000_000,
    mu=0,           # Asumimos drift 0 para VaR
    sigma=0.021,    # 2.1% vol diaria
    days=1,
    confidence=0.95
)

print(f"VaR 95% (1 dia): ${var_95:,.0f}")
# Output: VaR 95% (1 dia): $1,726,842

1.3 Expected Shortfall (ES) - El Reemplazo del VaR

⚠️ Importante: Basilea IV ya Reemplazo VaR por ES

Desde enero 2023, los bancos deben reportar Expected Shortfall al 97.5% en lugar de VaR al 99% para calcular capital regulatorio. Si buscas trabajo, DEBES saber ES.

πŸ“– Expected Shortfall - Definicion

El ES responde: "Cuando las cosas van mal (excedemos el VaR), cual es la perdida PROMEDIO?"

$$\text{ES}_{\alpha} = E[\text{Perdida} \,|\, \text{Perdida} > \text{VaR}_{\alpha}]$$ (2)

Para una distribucion normal:

$$\text{ES}_{\alpha} = \sigma \times \frac{\phi(z_{\alpha})}{1 - \alpha}$$ (3)

Donde \(\phi(z)\) es la funcion de densidad de la normal estandar.

πŸ’‘ Ejemplo: ES vs VaR

Posicion: $100M, volatilidad diaria 1.5%

MetricaNivelValorInterpretacion
VaR95%$2.47MPerdida maxima en 19 de 20 dias
VaR99%$3.49MPerdida maxima en 99 de 100 dias
ES97.5%$3.71MPerdida promedio en el peor 2.5%

Por que ES es mejor: El VaR ignora que tan malo puede ser el dia malo. El ES te dice el promedio de esos dias malos.

Python expected_shortfall.py
# Expected Shortfall - Codigo de produccion
# βœ… Este codigo se puede ejecutar directamente en Google Colab
import numpy as np
from scipy.stats import norm

def expected_shortfall(position, sigma, confidence=0.975):
    """
    ES parametrico (asumiendo normalidad).
    Basilea IV usa 97.5% de confianza.
    """
    z = norm.ppf(confidence)
    phi_z = norm.pdf(z)  # Densidad en el cuantil
    es = position * sigma * phi_z / (1 - confidence)
    return es

def es_historico(returns, position, confidence=0.975):
    """
    ES historico - promedio de perdidas peores que VaR.
    """
    pnl = position * returns
    var = -np.percentile(pnl, (1 - confidence) * 100)
    # Promedio de perdidas que exceden el VaR
    tail_losses = pnl[pnl < -var]
    es = -np.mean(tail_losses)
    return es

# Ejemplo
position = 100_000_000
sigma_daily = 0.015

es_param = expected_shortfall(position, sigma_daily)
print(f"ES 97.5% (parametrico): ${es_param:,.0f}")
# Output: ES 97.5% (parametrico): $3,709,823

Seccion 2

Las Griegas (Greeks)

Como medir y cubrir el riesgo de opciones - Pregunta obligatoria en entrevistas

Si trabajas en un desk que tiene opciones (equity derivatives, FX options, rates), las Griegas seran tu pan de cada dia. Son las sensibilidades del precio de la opcion a diferentes factores de riesgo.

🎯 Pregunta de Entrevista (Morgan Stanley, 2024)

Q: "Tienes una call con Delta 0.6 y Gamma 0.02. El subyacente sube $5. Cual es tu nuevo Delta?"

A: "Nuevo Delta = Delta inicial + Gamma Γ— Cambio en S = 0.6 + 0.02 Γ— 5 = 0.70"

Follow-up: "Por que importa esto para hedging?"

A: "Porque si solo hago delta-hedge una vez, mi hedge se vuelve impreciso cuando el precio se mueve. El Gamma me dice que tan rapido cambia mi Delta, y por tanto, que tan frecuentemente necesito rebalancear mi hedge."

2.1 Las 5 Griegas Principales

Griega Simbolo Mide Sensibilidad a... Valor Tipico (Call ATM) Uso en Trading
Delta \(\Delta\) Precio del subyacente ~0.50 Cuantas acciones comprar para hedge
Gamma \(\Gamma\) Cambio en Delta ~0.02-0.05 Frecuencia de rebalanceo
Vega \(\nu\) Volatilidad implicita ~0.20-0.40 Exposicion a cambios en IV
Theta \(\Theta\) Paso del tiempo ~-0.05 (negativo) Cuanto pierdes por dia
Rho \(\rho\) Tasa de interes ~0.10 Menos importante (tasas estables)
πŸ“– Delta - La Griega Mas Importante
$$\Delta = \frac{\partial V}{\partial S}$$ (4)

Interpretacion practica:

πŸ’‘ Ejemplo Real: Delta Hedging en Tesla Options

Situacion: Un cliente te compra 1,000 calls de TSLA. Eres el market maker.

Tu posicion: Short 1,000 calls = Short 100,000 acciones equivalentes Γ— 0.48 = Short 48,000 deltas

Para hedge: Compras 48,000 acciones de TSLA a $248 = $11,904,000

Resultado: Ahora eres delta-neutral. Si TSLA sube $1, pierdes ~$48,000 en las calls pero ganas ~$48,000 en las acciones.

πŸ“ Gamma - El Riesgo de Grandes Movimientos
$$\Gamma = \frac{\partial^2 V}{\partial S^2} = \frac{\partial \Delta}{\partial S}$$ (5)

Lo que debes saber:

⚠️ Caso Real: El Gamma Squeeze de GameStop (Enero 2021)

Los market makers vendieron millones de calls de GME a retail traders. Estaban short gamma masivo. Cuando GME empezo a subir:

  1. El Delta de sus calls aumento (por el Gamma positivo de las calls)
  2. Tuvieron que comprar mas acciones para mantener delta-neutral
  3. Sus compras empujaron el precio aun mas arriba
  4. Loop infinito: precio sube β†’ Delta sube β†’ compran mas β†’ precio sube mas

GME paso de $20 a $483 en 2 semanas. Los market makers perdieron billones.

2.2 Vega - El Riesgo de Volatilidad

πŸ“– Vega
$$\nu = \frac{\partial V}{\partial \sigma}$$ (6)

Vega = 0.25 significa: si la volatilidad implicita sube 1 punto porcentual (ej: de 30% a 31%), tu opcion sube $0.25.

πŸ’‘ Ejemplo: Trading el VIX Spike de Marzo 2020

En marzo 2020 (COVID crash), el VIX paso de 15 a 82 en 3 semanas.

Si tenias: Long 100 calls SPY con Vega = $0.30 cada una

Ganancia solo por Vega: 100 Γ— $0.30 Γ— (82 - 15) = $2,010 por contrato

Leccion: Aunque el mercado cayo (malo para calls), el spike en volatilidad fue tan grande que muchas calls SUBIERON de precio.

2.3 Theta - El Costo del Tiempo

πŸ“– Theta (Time Decay)
$$\Theta = \frac{\partial V}{\partial t}$$ (7)

Theta es casi siempre negativo para posiciones largas en opciones. Representa cuanto valor pierde tu opcion cada dia que pasa.

Theta = -0.05 significa: tu opcion pierde $0.05 de valor cada dia (asumiendo que nada mas cambia).

πŸ”§ Estrategia Real: Theta Farming

Muchos fondos (como las "wheel strategies" populares en Reddit) viven de vender opciones y cobrar theta. Venden puts/calls y esperan que expiren sin valor.

Riesgo: Ganas pequeΓ±o cada dia (theta positivo), pero cuando hay un crash, pierdes GRANDE porque estas short gamma.

2.4 Codigo Python: Calcular Greeks con Black-Scholes

Python black_scholes_greeks.py
# Black-Scholes Greeks - Codigo de produccion
# βœ… Este codigo se puede ejecutar directamente en Google Colab
import numpy as np
from scipy.stats import norm

def black_scholes_greeks(S, K, T, r, sigma, option_type='call'):
    """
    Calcula precio y Greeks de una opcion europea.
    
    Args:
        S: Precio spot del subyacente
        K: Strike price
        T: Tiempo al vencimiento (en aΓ±os)
        r: Tasa libre de riesgo (anual)
        sigma: Volatilidad implicita (anual)
        option_type: 'call' o 'put'
    
    Returns:
        dict con precio y todas las Greeks
    """
    # d1 y d2
    d1 = (np.log(S/K) + (r + sigma**2/2)*T) / (sigma*np.sqrt(T))
    d2 = d1 - sigma*np.sqrt(T)
    
    # Precio
    if option_type == 'call':
        price = S*norm.cdf(d1) - K*np.exp(-r*T)*norm.cdf(d2)
        delta = norm.cdf(d1)
    else:  # put
        price = K*np.exp(-r*T)*norm.cdf(-d2) - S*norm.cdf(-d1)
        delta = norm.cdf(d1) - 1
    
    # Greeks (iguales para call y put excepto Delta y Rho)
    gamma = norm.pdf(d1) / (S * sigma * np.sqrt(T))
    vega = S * norm.pdf(d1) * np.sqrt(T) / 100  # Por 1% cambio en vol
    theta = -(S*norm.pdf(d1)*sigma)/(2*np.sqrt(T)) - r*K*np.exp(-r*T)*norm.cdf(d2)
    theta = theta / 365  # Por dia
    
    return {
        'price': price,
        'delta': delta,
        'gamma': gamma,
        'vega': vega,
        'theta': theta
    }

# Ejemplo: Tesla call option
greeks = black_scholes_greeks(
    S=248,      # TSLA spot price
    K=250,      # Strike
    T=30/365,   # 30 dias
    r=0.05,     # 5% risk-free rate
    sigma=0.45  # 45% implied vol (TSLA es volatil)
)

print("TSLA $250 Call (30 dias):")
print(f"  Precio:  ${greeks['price']:.2f}")
print(f"  Delta:   {greeks['delta']:.4f}")
print(f"  Gamma:   {greeks['gamma']:.4f}")
print(f"  Vega:    ${greeks['vega']:.4f} por 1% vol")
print(f"  Theta:   ${greeks['theta']:.4f} por dia")

# Output:
# TSLA $250 Call (30 dias):
#   Precio:  $12.47
#   Delta:   0.4892
#   Gamma:   0.0142
#   Vega:    $0.2834 por 1% vol
#   Theta:   $-0.1523 por dia

Seccion 3

Volatilidad

Como estimar y pronosticar la volatilidad - La variable mas importante

La volatilidad es el parametro mas critico en risk management. Todo depende de ella: el VaR, el precio de opciones, los limites de trading. Estimarla correctamente es literalmente tu trabajo.

3.1 Tres Tipos de Volatilidad que Debes Conocer

Tipo Como se Calcula Uso Principal Fuente de Datos
Historica (Realizada) Desviacion estandar de retornos pasados VaR, backtesting Bloomberg: HIST_VOL
Implicita Extraida de precios de opciones (invertir Black-Scholes) Pricing de opciones, sentiment VIX, VVIX, Bloomberg: IVOL
Pronosticada (GARCH) Modelo econometrico VaR forward-looking Calculas tu mismo

3.1.1 Volatilidad Historica

πŸ“ Formula de Volatilidad Historica
$$\sigma_{\text{hist}} = \sqrt{\frac{1}{n-1} \sum_{t=1}^{n} (r_t - \bar{r})^2}$$ (8)

Donde \(r_t = \ln(P_t / P_{t-1})\) son los log-retornos.

Para anualizar: \(\sigma_{\text{anual}} = \sigma_{\text{diaria}} \times \sqrt{252}\)

πŸ’‘ Ejemplo: Calcular Volatilidad de NVIDIA (NVDA)

NVIDIA en 2024 ha sido extremadamente volatil por el boom de AI:

PeriodoVol DiariaVol Anualizada
Enero 20242.8%44.4%
Febrero 2024 (post earnings)4.1%65.1%
Marzo 20243.2%50.8%
Promedio Q1 20243.4%54.0%

Comparacion: El S&P 500 tiene volatilidad historica de ~15-20% anual. NVDA es 3x mas volatil.

3.1.2 EWMA - Volatilidad con Pesos Exponenciales

El problema con la volatilidad historica simple es que pesa igual un retorno de hace 1 dia que uno de hace 100 dias. En la realidad, los retornos recientes importan mas. Por eso usamos EWMA (Exponentially Weighted Moving Average).

πŸ“ EWMA - El Metodo de RiskMetrics (JPMorgan)
$$\sigma_t^2 = \lambda \sigma_{t-1}^2 + (1-\lambda) r_{t-1}^2$$ (9)

Donde \(\lambda = 0.94\) es el valor estandar de la industria (RiskMetrics).

Interpretacion: La varianza de hoy es 94% la varianza de ayer + 6% el retorno al cuadrado de ayer.

Python ewma_volatility.py
# EWMA Volatility - Metodo RiskMetrics
# βœ… Este codigo se puede ejecutar directamente en Google Colab
import numpy as np
import pandas as pd

def ewma_volatility(returns, lambda_param=0.94):
    """
    Calcula volatilidad EWMA (metodo RiskMetrics).
    
    Args:
        returns: Serie de retornos
        lambda_param: Factor de decaimiento (0.94 es standard)
    
    Returns:
        Serie de volatilidades EWMA
    """
    returns = np.array(returns)
    n = len(returns)
    
    # Inicializar con varianza muestral
    var = np.zeros(n)
    var[0] = returns[0]**2
    
    # Recursion EWMA
    for t in range(1, n):
        var[t] = lambda_param * var[t-1] + (1 - lambda_param) * returns[t-1]**2
    
    return np.sqrt(var)

# Ejemplo con datos reales de SPY
np.random.seed(42)
# Simular retornos con cluster de volatilidad (como en la vida real)
returns = np.concatenate([
    np.random.normal(0, 0.01, 50),    # Periodo tranquilo
    np.random.normal(0, 0.03, 30),    # Spike de volatilidad
    np.random.normal(0, 0.015, 40)   # Vuelve a la normalidad
])

vol_ewma = ewma_volatility(returns)
vol_simple = pd.Series(returns).rolling(20).std()

print(f"EWMA vol al final: {vol_ewma[-1]*100:.2f}% diaria")
print(f"Simple vol (20d):  {vol_simple.iloc[-1]*100:.2f}% diaria")

# EWMA reacciona mas rapido a cambios en volatilidad

3.1.3 GARCH - El Modelo Profesional

GARCH (Generalized Autoregressive Conditional Heteroskedasticity) es el modelo de volatilidad mas usado en bancos. Permite pronosticar la volatilidad futura.

πŸ“ GARCH(1,1) - El Modelo Standard
$$\sigma_t^2 = \omega + \alpha r_{t-1}^2 + \beta \sigma_{t-1}^2$$ (10)

Donde:

Volatilidad de largo plazo: \(\bar{\sigma}^2 = \frac{\omega}{1 - \alpha - \beta}\)

Python garch_model.py
# GARCH usando la libreria arch (standard en la industria)
# βœ… Este codigo se puede ejecutar en Google Colab
# Ejecuta primero: !pip install arch

from arch import arch_model
import pandas as pd
import numpy as np

# Simular retornos (en produccion usas datos reales de Bloomberg)
np.random.seed(42)
returns = np.random.normal(0, 0.01, 1000) * 100  # En porcentaje

# Fit GARCH(1,1)
model = arch_model(returns, vol='Garch', p=1, q=1)
result = model.fit(disp='off')

print(result.summary())

# Pronosticar volatilidad para los proximos 5 dias
forecast = result.forecast(horizon=5)
vol_forecast = np.sqrt(forecast.variance.iloc[-1])

print("\nPronostico de volatilidad (proximos 5 dias):")
for i, v in enumerate(vol_forecast, 1):
    print(f"  Dia {i}: {v:.2f}% diaria ({v*np.sqrt(252):.1f}% anual)")

3.2 Volatilidad Implicita y el VIX

πŸ“– Volatilidad Implicita

La volatilidad implicita es la volatilidad que, insertada en Black-Scholes, produce el precio de mercado de la opcion. Es una medida de las expectativas del mercado sobre volatilidad futura.

VIX = Volatilidad implicita del S&P 500 a 30 dias, calculada de opciones.

πŸ’‘ Interpretando el VIX (Enero 2025)
Nivel VIXInterpretacionAccion Tipica
< 12Mercado muy tranquilo (complacencia)Comprar puts baratos como seguro
12-20NormalBusiness as usual
20-30Elevado, incertidumbreReducir riesgo, aumentar hedges
> 30Panico (crisis)VIX en 2020 COVID llego a 82

Dato: En enero 2025, el VIX esta alrededor de 14-16, indicando calma relativa.


πŸ“‹ Volatilidad

ModeloFormula
Historica\(\sigma = \sqrt{\frac{1}{n-1}\sum(r_t - \bar{r})^2}\)
EWMA\(\sigma_t^2 = 0.94 \sigma_{t-1}^2 + 0.06 r_{t-1}^2\)
GARCH(1,1)\(\sigma_t^2 = \omega + \alpha r_{t-1}^2 + \beta \sigma_{t-1}^2\)
Anualizar\(\sigma_{anual} = \sigma_{diaria} \times \sqrt{252}\)

πŸ“‹ Cuantiles de la Normal Estandar

ConfianzaCuantil zUso
90%1.282VaR conservador
95%1.645VaR standard
97.5%1.960ES (Basilea IV)
99%2.326VaR regulatorio
99.9%3.090Stress testing

Seccion 6

Herramientas del Mundo Real

El stack tecnologico que usaras en el trabajo

6.1 Bloomberg Terminal - Comandos Esenciales

El 99% de los trabajos en finanzas usan Bloomberg. Aqui estan los comandos que usaras diariamente en Market Risk:

ComandoFuncionCuando Usarlo
HVGHistorical Volatility GraphVer volatilidad historica de cualquier activo
HIVGHistorical Implied Vol GraphVer evolucion de volatilidad implicita
GVVolatility SurfaceVer superficie de volatilidad (por strike y tenor)
OMONOption MonitorVer cadena de opciones con Greeks
OVOption ValuationCalcular precio y Greeks de una opcion
MARSMulti-Asset Risk SystemCalcular VaR de portafolio (sistema de Bloomberg)
PORTPortfolio AnalyticsAnalisis de riesgo de portafolio
VIXCBOE Volatility IndexVer el "indice del miedo"
CORRCorrelation MatrixVer correlaciones entre activos
FLDSField SearchBuscar cualquier dato disponible
πŸ”§ Tip Practico: Exportar Datos de Bloomberg a Python
Python bloomberg_export.py
# Usando la API de Bloomberg (blpapi)
from xbbg import blp

# Descargar precios historicos
df = blp.bdh(
    tickers=['AAPL US Equity', 'MSFT US Equity', 'SPY US Equity'],
    flds=['PX_LAST'],
    start_date='2023-01-01',
    end_date='2024-01-01'
)

# Descargar volatilidad implicita de opciones
iv = blp.bdp('AAPL US Equity', 'IVOL_VOLATILITY_30D')

Nota: Necesitas licencia de Bloomberg para usar la API.

6.2 Python - Librerias Esenciales para Risk

Python requirements_risk.txt
# Librerias para Risk Management
# βœ… Instalar en Google Colab: !pip install numpy pandas scipy arch statsmodels

# Data manipulation
numpy==1.24.0
pandas==2.0.0
scipy==1.11.0

# Time series y volatilidad
arch==6.1.0          # GARCH models
statsmodels==0.14.0  # Econometrics

# Opciones y derivados
py_vollib==1.0.1     # Black-Scholes, Greeks
QuantLib==1.31       # Libreria profesional de pricing

# Visualizacion
matplotlib==3.7.0
seaborn==0.12.0
plotly==5.15.0

# Bloomberg (si tienes licencia)
xbbg==0.7.0
blpapi==3.19.1

# Bases de datos
sqlalchemy==2.0.0
psycopg2==2.9.6      # PostgreSQL

6.3 SQL - Queries que Usaras

Los datos de riesgo se almacenan en bases de datos. Necesitas saber SQL basico:

SQL risk_queries.sql
-- Query 1: Obtener VaR historico por desk
SELECT 
    trade_date,
    desk_name,
    var_99_1d,
    var_99_10d,
    actual_pnl,
    CASE WHEN actual_pnl < -var_99_1d THEN 1 ELSE 0 END AS exception
FROM daily_var_report
WHERE trade_date >= '2024-01-01'
ORDER BY trade_date DESC;

-- Query 2: Contar excedencias por trimestre
SELECT 
    DATE_TRUNC('quarter', trade_date) AS quarter,
    desk_name,
    COUNT(*) AS trading_days,
    SUM(CASE WHEN actual_pnl < -var_99_1d THEN 1 ELSE 0 END) AS exceptions,
    AVG(var_99_1d) AS avg_var
FROM daily_var_report
GROUP BY 1, 2
ORDER BY 1 DESC, 3 DESC;

-- Query 3: Top 10 posiciones por contribucion al VaR
SELECT 
    position_id,
    instrument_name,
    notional_usd,
    marginal_var,
    marginal_var / total_var * 100 AS pct_contribution
FROM position_risk
WHERE trade_date = CURRENT_DATE - 1
ORDER BY marginal_var DESC
LIMIT 10;

6.4 Ejemplo Completo: Pipeline de VaR Diario

Este es un ejemplo simplificado de lo que harias en tu trabajo cada manana:

Python daily_var_pipeline.py
"""
Pipeline de VaR Diario - Ejemplo simplificado
En produccion esto correria automaticamente a las 6am
βœ… Este codigo se puede ejecutar directamente en Google Colab
"""

import numpy as np
import pandas as pd
from datetime import datetime, timedelta
from scipy.stats import norm

class DailyVaRCalculator:
    def __init__(self, lookback_days=500, confidence=0.99):
        self.lookback = lookback_days
        self.confidence = confidence
    
    def load_positions(self):
        """Cargar posiciones del sistema de trading (simulado)"""
        return pd.DataFrame({
            'ticker': ['AAPL', 'MSFT', 'GOOGL', 'TSLA', 'SPY'],
            'position_usd': [50e6, 40e6, 30e6, 20e6, 60e6]
        })
    
    def load_market_data(self, tickers):
        """Cargar precios historicos (simulado)"""
        np.random.seed(42)
        dates = pd.date_range(end=datetime.now(), periods=self.lookback, freq='B')
        
        # Simular retornos con diferentes volatilidades
        vols = {'AAPL': 0.02, 'MSFT': 0.018, 'GOOGL': 0.022, 
                'TSLA': 0.035, 'SPY': 0.012}
        
        returns = pd.DataFrame({
            ticker: np.random.normal(0.0003, vols[ticker], len(dates))
            for ticker in tickers
        }, index=dates)
        
        return returns
    
    def calculate_var_parametric(self, positions, returns):
        """VaR parametrico del portafolio"""
        # Volatilidades individuales
        vols = returns.std()
        
        # Matriz de covarianza
        cov_matrix = returns.cov()
        
        # Pesos del portafolio
        weights = positions.set_index('ticker')['position_usd']
        total_position = weights.sum()
        w = weights / total_position
        
        # Volatilidad del portafolio
        port_var = np.sqrt(w @ cov_matrix @ w)
        
        # VaR
        z = norm.ppf(self.confidence)
        var_1d = total_position * z * port_var
        var_10d = var_1d * np.sqrt(10)
        
        return {
            'var_1d': var_1d,
            'var_10d': var_10d,
            'portfolio_vol': port_var,
            'total_position': total_position
        }
    
    def calculate_var_historical(self, positions, returns):
        """VaR por simulacion historica"""
        # P&L historico del portafolio
        weights = positions.set_index('ticker')['position_usd']
        portfolio_returns = (returns * weights).sum(axis=1)
        
        # VaR como percentil
        var_1d = -np.percentile(portfolio_returns, (1 - self.confidence) * 100)
        var_10d = var_1d * np.sqrt(10)
        
        return {'var_1d': var_1d, 'var_10d': var_10d}
    
    def run_daily_report(self):
        """Ejecutar reporte diario completo"""
        print("=" * 60)
        print(f"REPORTE DE VaR DIARIO - {datetime.now().strftime('%Y-%m-%d')}")
        print("=" * 60)
        
        # 1. Cargar datos
        positions = self.load_positions()
        returns = self.load_market_data(positions['ticker'].tolist())
        
        # 2. Calcular VaR parametrico
        var_param = self.calculate_var_parametric(positions, returns)
        
        # 3. Calcular VaR historico
        var_hist = self.calculate_var_historical(positions, returns)
        
        # 4. Imprimir resultados
        print(f"\nPosicion Total: ${var_param['total_position']/1e6:.1f}M")
        print(f"Volatilidad del Portafolio: {var_param['portfolio_vol']*100:.2f}% diaria")
        print(f"\nVaR {self.confidence:.0%} (Parametrico):")
        print(f"  1-dia:  ${var_param['var_1d']/1e6:.2f}M")
        print(f"  10-dia: ${var_param['var_10d']/1e6:.2f}M")
        print(f"\nVaR {self.confidence:.0%} (Historico):")
        print(f"  1-dia:  ${var_hist['var_1d']/1e6:.2f}M")
        print(f"  10-dia: ${var_hist['var_10d']/1e6:.2f}M")
        
        return var_param, var_hist

# Ejecutar
calculator = DailyVaRCalculator(lookback_days=500, confidence=0.99)
calculator.run_daily_report()

Resumen Final: Lo que Debes Saber para tu Entrevista

πŸ“Œ Los 10 Conceptos que DEBES Dominar

  1. VaR - Que es, como calcularlo (3 metodos), sus limitaciones
  2. Expected Shortfall - Por que es mejor que VaR, formula
  3. Greeks - Delta, Gamma, Vega, Theta - que miden y como usarlos para hedging
  4. Volatilidad - Historica vs implicita, EWMA, GARCH
  5. Backtesting - Traffic light de Basilea, test de Kupiec
  6. Basilea III/IV - Por que cambio a ES, que es FRTB
  7. Correlaciones - Como afectan al VaR de portafolio, diversificacion
  8. Stress Testing - Escenarios historicos vs hipoteticos
  9. Python - Saber calcular VaR, Greeks, volatilidad en codigo
  10. Bloomberg - Comandos basicos (HVG, OMON, MARS)

🎯 Checklist Pre-Entrevista

Market Risk Modelling: Guia Practica para Profesionales
Autor: Victor Raul Miranda | CFA & FRM Level II | Market Risk Professional & Validation Expert
Documento orientado a preparacion de entrevistas y trabajo real en el sector.
Contenido basado en practicas actuales de JPMorgan, Goldman Sachs, Morgan Stanley, y Citadel.

Enero 2026 | Disclaimer: Este material es solo para propositos educativos. Los ejemplos son ilustrativos y no constituyen asesoria financiera o de inversion.