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.
Victor Raul Miranda
CFA & FRM Level II
Market Risk Professional & Validation Expert
Enero 2026
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:
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.
| Nivel | Titulo Tipico | Salario Base (USD) | Bonus |
|---|---|---|---|
| Entry Level | Risk Analyst | $85,000 - $120,000 | 10-20% |
| Mid Level | Senior Risk Analyst / AVP | $130,000 - $180,000 | 20-40% |
| Senior | VP of Market Risk | $200,000 - $300,000 | 40-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.
La metrica mas importante que calcularas todos los dias
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?"
Si calculas un VaR diario de $5 millones al 95%, significa:
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."
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 |
Es el mas simple. Asumes que los retornos son normales y usas esta formula:
Donde:
Escalar a 10 dias (Basilea): \(\text{VaR}_{10d} = \text{VaR}_{1d} \times \sqrt{10}\)
Situacion: Tu desk tiene $50 millones en acciones de Apple. La volatilidad diaria de AAPL es 2.1%.
Calculo VaR 95% (1 dia):
Interpretacion para tu jefe: "Con 95% de confianza, la perdida maxima en AAPL manana sera de $1.73M."
VaR 10 dias (para Basilea):
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.
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):
| Ranking | Fecha | Retorno | P&L Hipotetico |
|---|---|---|---|
| 1 (peor) | 13-Jun-2022 | -3.88% | -$3,880,000 |
| 2 | 13-Sep-2022 | -4.32% | -$4,320,000 |
| 3 | 09-May-2022 | -3.20% | -$3,200,000 |
| 4 | 18-Jun-2022 | -3.01% | -$3,010,000 |
| 5 | 26-Sep-2022 | -2.86% | -$2,860,000 |
VaR Historico 99% = $2,860,000 (el 5to peor dia en 500 observaciones)
Simulas miles de escenarios posibles de precios futuros usando un modelo estocastico (tipicamente GBM). Ideal para derivados.
# 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
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.
El ES responde: "Cuando las cosas van mal (excedemos el VaR), cual es la perdida PROMEDIO?"
Para una distribucion normal:
Donde \(\phi(z)\) es la funcion de densidad de la normal estandar.
Posicion: $100M, volatilidad diaria 1.5%
| Metrica | Nivel | Valor | Interpretacion |
|---|---|---|---|
| VaR | 95% | $2.47M | Perdida maxima en 19 de 20 dias |
| VaR | 99% | $3.49M | Perdida maxima en 99 de 100 dias |
| ES | 97.5% | $3.71M | Perdida 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.
# 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
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.
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."
| 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) |
Interpretacion practica:
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.
Lo que debes saber:
Los market makers vendieron millones de calls de GME a retail traders. Estaban short gamma masivo. Cuando GME empezo a subir:
GME paso de $20 a $483 en 2 semanas. Los market makers perdieron billones.
Vega = 0.25 significa: si la volatilidad implicita sube 1 punto porcentual (ej: de 30% a 31%), tu opcion sube $0.25.
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.
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).
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.
# 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
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.
| 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 |
Donde \(r_t = \ln(P_t / P_{t-1})\) son los log-retornos.
Para anualizar: \(\sigma_{\text{anual}} = \sigma_{\text{diaria}} \times \sqrt{252}\)
NVIDIA en 2024 ha sido extremadamente volatil por el boom de AI:
| Periodo | Vol Diaria | Vol Anualizada |
|---|---|---|
| Enero 2024 | 2.8% | 44.4% |
| Febrero 2024 (post earnings) | 4.1% | 65.1% |
| Marzo 2024 | 3.2% | 50.8% |
| Promedio Q1 2024 | 3.4% | 54.0% |
Comparacion: El S&P 500 tiene volatilidad historica de ~15-20% anual. NVDA es 3x mas volatil.
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).
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.
# 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
GARCH (Generalized Autoregressive Conditional Heteroskedasticity) es el modelo de volatilidad mas usado en bancos. Permite pronosticar la volatilidad futura.
Donde:
Volatilidad de largo plazo: \(\bar{\sigma}^2 = \frac{\omega}{1 - \alpha - \beta}\)
# 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)")
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.
| Nivel VIX | Interpretacion | Accion Tipica |
|---|---|---|
| < 12 | Mercado muy tranquilo (complacencia) | Comprar puts baratos como seguro |
| 12-20 | Normal | Business as usual |
| 20-30 | Elevado, incertidumbre | Reducir riesgo, aumentar hedges |
| > 30 | Panico (crisis) | VIX en 2020 COVID llego a 82 |
Dato: En enero 2025, el VIX esta alrededor de 14-16, indicando calma relativa.
| Modelo | Formula |
|---|---|
| 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}\) |
| Confianza | Cuantil z | Uso |
|---|---|---|
| 90% | 1.282 | VaR conservador |
| 95% | 1.645 | VaR standard |
| 97.5% | 1.960 | ES (Basilea IV) |
| 99% | 2.326 | VaR regulatorio |
| 99.9% | 3.090 | Stress testing |
El stack tecnologico que usaras en el trabajo
El 99% de los trabajos en finanzas usan Bloomberg. Aqui estan los comandos que usaras diariamente en Market Risk:
| Comando | Funcion | Cuando Usarlo |
|---|---|---|
| HVG | Historical Volatility Graph | Ver volatilidad historica de cualquier activo |
| HIVG | Historical Implied Vol Graph | Ver evolucion de volatilidad implicita |
| GV | Volatility Surface | Ver superficie de volatilidad (por strike y tenor) |
| OMON | Option Monitor | Ver cadena de opciones con Greeks |
| OV | Option Valuation | Calcular precio y Greeks de una opcion |
| MARS | Multi-Asset Risk System | Calcular VaR de portafolio (sistema de Bloomberg) |
| PORT | Portfolio Analytics | Analisis de riesgo de portafolio |
| VIX | CBOE Volatility Index | Ver el "indice del miedo" |
| CORR | Correlation Matrix | Ver correlaciones entre activos |
| FLDS | Field Search | Buscar cualquier dato disponible |
# 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.
# 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
Los datos de riesgo se almacenan en bases de datos. Necesitas saber SQL basico:
-- 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;
Este es un ejemplo simplificado de lo que harias en tu trabajo cada manana:
""" 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()
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.