Lección 3.1.3 · 65 min
Gestión del roll, márgenes, SPAN y apalancamiento implícito
Mantener un futuro obliga a dos cosas que no tiene una acción: cambiar de contrato cada pocos meses y tener siempre efectivo para el margen. Esta lección mide en los datos sintéticos cuándo migra la liquidez y cuánto cuesta rodar, construye un cálculo de margen por escenarios como el de las cámaras, enseña qué le pasa al margen en una crisis y calcula el apalancamiento de una cartera diversificada, que es mucho mayor de lo que sugiere su margen.
- Módulo
- 3.1 · Futuros en profundidad
- Duración
- 65 min
Lecciones del nivel 3
3.1 · Futuros en profundidad
3.2 · Spreads de futuros
- 3.2.1 Spreads de calendario, butterflies y condors
- 3.2.2 Spreads intercommodity: crack, spark y crush
- 3.2.3 Spreads de tipos y de índices: 2s10s, NOB, NQ/ES y Europa frente a EE. UU.
- 3.2.4 Ratios de cobertura: por nominal, por DV01 y por volatilidad
- 3.2.5 Datos y backtesting de spreads: cotizados, sintéticos y por patas
- 3.2.6 Estacionalidad de spreads: análisis multi-año, patrones y trampas
3.3 · Forex avanzado
3.4 · Teoría y valoración de opciones
- 3.4.1 Payoffs, paridad put-call y límites de arbitraje
- 3.4.2 Árboles binomiales, Black-Scholes-Merton, Black-76 y Monte Carlo
- 3.4.3 Griegas: delta, gamma, vega, theta, rho, vanna, volga y charm
- 3.4.4 Volatilidad implícita: Newton-Raphson, Brent, py_vollib y QuantLib
- 3.4.5 Sonrisa, skew y estructura temporal; superficie de volatilidad con SVI
- 3.4.6 Volatilidad realizada frente a implícita; prima de riesgo de volatilidad; VIX y VSTOXX
- 3.4.7 Modelos avanzados: Heston, SABR y volatilidad local
3.5 · Estructuras de opciones en Python
- 3.5.1 Estructuras direccionales y verticales: call, put, covered call, collar y spreads
- 3.5.2 Estructuras de volatilidad y rango: straddles, strangles, cóndores y mariposas
- 3.5.3 Calendarios, diagonales, ratios, backspreads, risk reversals y jade lizard
- 3.5.4 Herramienta propia: payoff, griegas agregadas y escenarios
- 3.5.5 Gestión: ajustes, roll, cierre anticipado, asignación temprana y pin risk
3.6 · Estrategias sistemáticas de volatilidad y opciones
3.7 · Cripto derivados y estrategias específicas
Cuándo rodar
Un futuro vence; una posición en futuros no tiene por qué. Mantenerla obliga a rodar: cerrar el contrato que se tiene y abrir el siguiente antes de que el primero deje de servir. La lección 1.4.6 trató el roll desde el lado de los datos (cómo empalmar una serie continua). Aquí se trata desde el lado de la operación: cuándo, a qué coste y con qué riesgo. Las reglas de los datos sintéticos fijan la fecha de roll de cada contrato a partir de una referencia de su ficha:
import numpy as np
import pandas as pd
curvas = pd.read_parquet("futuros3_curvas.parquet")
ctr = pd.read_csv("futuros3_contratos.csv",
parse_dates=["vencimiento", "primer_aviso",
"fecha_alta", "fecha_roll"])
esp = pd.read_csv("futuros3_especificaciones.csv",
index_col="mercado")
MERCADOS = list(esp.index[esp["mercado_base"].isna()])
reglas = esp.loc[MERCADOS, ["meses", "referencia_roll", "dias_roll"]]
reglas["rolls_ano"] = reglas["meses"].str.len()
reglas.loc[["RVA", "RVH", "TPC", "PEC", "GNA", "MTO", "GRM", "DQE"]] meses referencia_roll dias_roll rolls_ano
mercado
RVA HMUZ vencimiento 8 4
RVH FGHJKMNQUVXZ vencimiento 2 12
TPC HMUZ primer_aviso 3 4
PEC FGHJKMNQUVXZ vencimiento 6 12
GNA FGHJKMNQUVXZ vencimiento 4 12
MTO GJMQVZ primer_aviso 3 6
GRM HKNUZ primer_aviso 10 5
DQE HMUZ vencimiento 5 4Los de entrega física con aviso (bonos, metales, agrícolas) ruedan un número de sesiones antes del primer aviso:
3 en la nota a 10 años y el oro, 10 en el maíz. Los demás, antes del vencimiento: 8 sesiones en RVA, 2 en el
índice español (que tiene contratos mensuales), 6 en el crudo. El número de rolls al año depende de los meses que se
tienen: 4 en los trimestrales, 12 en la energía, 5 en el maíz, 6 en el oro.
Fuente Mermaid
flowchart TB
A[Contrato actual] --> B{¿Física con aviso?}
B -- sí --> C[Roll antes aviso]
B -- no --> D{¿Liquidez migró?}
D -- sí --> E[Roll al migrar]
D -- no --> F[Esperar]
C --> G[Orden de spread]
E --> GLa regla de un sistema no tiene por qué ser la de los datos, pero tiene que cumplir dos condiciones: salir antes del primer aviso cuando lo hay y estar en el contrato que tiene la liquidez. La segunda se mide:
sesiones = pd.DatetimeIndex(sorted(curvas["fecha"].unique()))
oi = curvas.pivot_table(index="fecha", columns="contrato",
values="interes_abierto")
def migracion(mercado, desfases=range(-12, 4)):
"""Cuota del interés abierto del contrato que se deja (frente al
siguiente), por sesiones respecto a su fecha de roll."""
cm = ctr[(ctr["mercado"] == mercado)
& (ctr["fecha_roll"].between("2011-01-01",
"2024-12-31"))]
sig = ctr[ctr["mercado"] == mercado]["contrato"].to_numpy()
siguiente = dict(zip(sig[:-1], sig[1:]))
filas = []
for _, c in cm.iterrows():
p = sesiones.searchsorted(c["fecha_roll"])
for d in desfases:
f = sesiones[p + d]
a = oi.at[f, c["contrato"]]
b = oi.at[f, siguiente[c["contrato"]]]
filas.append((d, a / (a + b)))
return pd.DataFrame(filas, columns=["d", "cuota"]).groupby(
"d")["cuota"].mean()
mig = pd.DataFrame({m: migracion(m)
for m in ["RVA", "TPC", "PEC", "GRM"]})
(100 * mig.loc[[-12, -8, -5, -3, -1, 0, 1, 3]]).round(1) RVA TPC PEC GRM
d
-12 92.6 92.6 64.5 68.0
-8 84.4 92.6 62.5 44.0
-5 41.2 89.9 33.3 14.2
-3 12.7 48.4 9.1 4.1
-1 6.0 3.0 2.1 2.0
0 5.7 2.0 2.0 2.0
1 3.5 1.2 1.2 1.2
3 1.3 0.4 0.4 0.4La tabla y la figura promedian todos los rolls de 2011 a 2024. En el maíz, 12 sesiones antes del roll al contrato que vence le queda el 68,0 % del interés abierto, 5 sesiones antes solo el 14,2 % y la migración ha terminado antes del roll; en el crudo, del 64,5 % al 33,3 % en las mismas sesiones. En la nota a 10 años, el contrato viejo conserva el 92,6 % hasta 8 sesiones antes y el cambio se concentra en tres sesiones (del 89,9 % en la −5 al 3,0 % en la −1): es el patrón de los bonos reales, que ruedan casi todos en los mismos días antes del primer aviso. En la fecha de roll, al contrato que vence le queda entre el 2,0 % y el 5,7 % del interés abierto. Rodar después es negociar en un contrato que se vacía.
El roll como spread de calendario
Rodar es vender un contrato y comprar el siguiente a la vez: un spread de calendario. Las bolsas los cotizan como instrumento propio, con su libro, y una orden de spread se ejecuta como una sola operación. Los datos traen el cierre del libro de spreads de seis mercados junto con las patas:
sp = pd.read_parquet("spreads3_cotizados.parquet")
sp["tick"] = esp["tick"].reindex(sp["mercado"]).to_numpy()
sp["libro"] = (sp["ask"] - sp["bid"]) / sp["tick"]
sp["patas"] = ((sp["ask_cerca"] - sp["bid_lejos"])
- (sp["bid_cerca"] - sp["ask_lejos"])) / sp["tick"]
sp.groupby("mercado")[["libro", "patas"]].mean().round(2) libro patas
mercado
GNA 1.25 2.81
GRM 1.25 2.79
MTO 1.24 2.76
PEC 1.25 2.77
RVA 1.22 2.83
TPC 1.25 2.78El libro del spread cotiza con una horquilla media de 1,22 a 1,25 ticks; el spread construido con las dos patas (vender al bid de una y comprar al ask de la otra), de 2,76 a 2,83. Es la respuesta conocida de los datos: el libro del spread cotiza a 1 tick el 75 % de las veces y cada pata a 1-3 ticks. Rodar por patas cuesta más del doble y además expone al riesgo de ejecución entre patas (legging risk): si se vende el viejo y el precio se mueve antes de comprar el nuevo, el roll sale peor. La lección 3.2.5 mide ese riesgo con datos de minutos. En coste anual:
fx = pd.read_parquet("fx3_diario.parquet")
usd_qev = fx[fx["divisa"] == "QEV"].set_index("fecha")[
"usd_por_unidad"]
DIA = "2025-11-26"
def precio_que_se_tiene(mercado, dia):
cm = ctr[ctr["mercado"] == mercado].reset_index(drop=True)
k = cm["contrato"].iloc[cm["fecha_roll"].searchsorted(
pd.Timestamp(dia), side="right")]
fila = curvas[(curvas["fecha"] == dia)
& (curvas["contrato"] == k)]
return fila["liquidacion"].iloc[0]
filas = {}
for m in ["RVA", "TPC", "PEC", "GNA", "MTO", "GRM"]:
e = esp.loc[m]
nominal = precio_que_se_tiene(m, DIA) * e["multiplicador"]
medio_libro = sp.loc[sp["mercado"] == m, "libro"].mean() / 2
medio_patas = sp.loc[sp["mercado"] == m, "patas"].mean() / 2
por_roll = lambda t: t * e["valor_tick"] + 2 * e["comision"]
filas[m] = {"rolls": len(e["meses"]),
"libro_pb_ano": 1e4 * len(e["meses"])
* por_roll(medio_libro) / nominal,
"patas_pb_ano": 1e4 * len(e["meses"])
* por_roll(medio_patas) / nominal}
pd.DataFrame(filas).T.round(2) rolls libro_pb_ano patas_pb_ano
RVA 4.0 1.21 2.23
TPC 4.0 4.51 8.74
PEC 12.0 16.85 28.74
GNA 12.0 17.79 30.71
MTO 6.0 2.96 5.06
GRM 5.0 36.70 65.32Por roll se paga media horquilla y dos comisiones (una por pata). Al año, con los rolls de cada mercado y el nominal
del 26 de noviembre de 2025: 1,21 puntos básicos en RVA con el libro (2,23 por patas), 16,85 en el crudo (28,74),
17,79 en el gas (30,71) y 36,70 en el maíz (65,32). En los índices es irrelevante; en un mercado con contratos
pequeños, tick caro y doce rolls al año, el roll es un coste fijo de mantener la posición que un backtest sin costes de
roll no ve (lección 2.4.7).
Rodar antes o después
Con el roll se elige también en qué punto de la curva estar. Rodar antes significa tener un contrato más lejano:
def serie_con_roll(mercado, antes):
"""Rendimientos del contrato que se tiene si se rueda `antes`
sesiones antes del primer aviso (o del vencimiento)."""
c = curvas[curvas["mercado"] == mercado]
P = c.pivot(index="fecha", columns="contrato",
values="liquidacion")
cm = ctr[ctr["mercado"] == mercado].reset_index(drop=True)
ref = cm["primer_aviso"].fillna(cm["vencimiento"])
p = P.index.searchsorted(ref.to_numpy()) - antes
roll = P.index[np.clip(p, 0, len(P) - 1)].to_numpy()
pos = np.searchsorted(roll, P.index.to_numpy(), side="right")
pos = np.minimum(pos, len(cm) - 1)
i = P.columns.get_indexer(cm["contrato"].to_numpy()[pos])
f, Pv = np.arange(len(P)), P.to_numpy()
ayer = np.r_[i[0], i[:-1]]
r = np.log(Pv[f[1:], ayer[1:]] / Pv[f[1:] - 1, ayer[1:]])
return pd.Series(r, index=P.index[1:]).loc["2011":]
vol = {m: {a: serie_con_roll(m, a).std() * np.sqrt(252)
for a in (1, 5, 20, 40)} for m in ["RVA", "PEC", "GNA",
"GRM"]}
(100 * pd.DataFrame(vol)).round(1) RVA PEC GNA GRM
1 19.0 36.1 43.4 25.4
5 19.0 35.4 41.5 25.0
20 19.0 32.7 35.2 22.8
40 19.0 29.7 29.5 20.5En el índice, la volatilidad es la misma (19,0 %) se ruede cuando se ruede: todos los vencimientos se mueven igual. En los mercados con efecto Samuelson (lección 3.1.2), rodar 40 sesiones antes baja la volatilidad del contrato que se tiene: del 43,4 % al 29,5 % en el gas, del 36,1 % al 29,7 % en el crudo, del 25,4 % al 20,5 % en el maíz. No es una mejora gratis: el contrato más lejano responde menos a lo que mueve el primero (otra apuesta), su carry es otro y su liquidez, menor (en energía, el siguiente contrato tiene volumen; en otros mercados, no). Lo que sí da la tabla es un aviso: la volatilidad de una serie depende de su regla de roll, y un sistema que dimensiona por volatilidad tiene que estimarla con la misma regla con la que opera.
Margen inicial y de mantenimiento
La lección 1.2.3 simuló una cuenta de margen con llamadas de margen. En los datos, cada mercado tiene tres márgenes:
m = esp.loc[MERCADOS, ["margen_inicial", "margen_mantenimiento",
"margen_spread_calendario"]]
m["inicial_sobre_mant"] = m["margen_inicial"] / m[
"margen_mantenimiento"]
m["spread_sobre_inicial_pct"] = 100 * m[
"margen_spread_calendario"] / m["margen_inicial"]
m.loc[["RVA", "TPC", "PEC", "GNA", "ELB", "MTO", "GRM"],
["margen_inicial", "inicial_sobre_mant",
"margen_spread_calendario", "spread_sobre_inicial_pct"]
].round(2) margen_inicial inicial_sobre_mant margen_spread_calendario spread_sobre_inicial_pct
mercado
RVA 20200.0 1.10 610.0 3.02
TPC 2700.0 1.08 140.0 5.19
PEC 5600.0 1.10 670.0 11.96
GNA 8500.0 1.10 3300.0 38.82
ELB 7300.0 1.11 3200.0 43.84
MTO 9600.0 1.10 290.0 3.02
GRM 840.0 1.11 150.0 17.86- Inicial: lo que se deposita al abrir. En los datos es 1,1 veces el de mantenimiento (redondeado a la centena), una relación que existe en algunas cámaras para cierto tipo de cuentas; otras cámaras piden lo mismo de inicial que de mantenimiento y es el bróker el que añade su colchón.
- Mantenimiento: el mínimo por debajo del cual llega la llamada de margen.
- Spread de calendario: el margen de una posición larga en un mes y corta en otro del mismo mercado. Es una
fracción del inicial: el 3 % en
RVAy en el oro, donde los dos meses se mueven casi igual; el 38,8 % y el 43,8 % en el gas y la electricidad, donde la forma estacional hace que dos meses distintos se muevan de forma distinta.
SPAN: el margen como peor escenario
Las cámaras no suman márgenes de contratos sueltos: calculan el de la cartera entera con escenarios. El método clásico es SPAN, de CME, y otras cámaras usan variantes o métodos propios. BME Clearing describe el suyo para los derivados financieros de MEFF (MEFFCOM2) como «similar a un modelo SPAN»: evalúa la peor pérdida posible de la cartera en varios escenarios teóricos y solo compensa entre instrumentos con una correlación media igual o superior al 70 %. Eurex Clearing usa Prisma, que calcula el margen al nivel de la cartera agrupando los productos relacionados. La estructura de SPAN es la de este diagrama:
Fuente Mermaid
flowchart TB E[Escenarios] --> R[Riesgo de escaneo] R --> S[+ cargo spread] S --> C[− crédito] C --> M[Margen cartera] O[Mín. opc. vendidas] --> M
El riesgo de escaneo es la peor pérdida de la cartera en una rejilla de movimientos del precio (y, para las opciones, de la volatilidad), con un rango que fija la cámara por producto. Como mueve todos los meses de un mismo producto a la vez, un spread de calendario parece no tener riesgo: el cargo por spread lo corrige. El crédito entre productos reconoce que una posición larga en un producto y corta en otro correlado arriesga menos que las dos por separado. Un cálculo simplificado para futuros, con el margen inicial de la ficha como rango y una rejilla de movimientos de 0, ±1/3, ±2/3 y ±1 rangos (los parámetros son de esta lección, no los de una cámara real):
FRACCIONES = np.array([0, 1 / 3, -1 / 3, 2 / 3, -2 / 3, 1, -1])
def margen_escenarios(cartera, credito=0.0):
"""cartera: {contrato: número de contratos}. Cada mercado se
mueve con su rango (el margen inicial de un contrato, en USD);
todos los meses de un mercado, a la vez (correlación 1)."""
por_mercado = {}
for k, n in cartera.items():
m = k[:3]
por_mercado.setdefault(m, []).append(n)
riesgo, cargo = {}, {}
for m, ns in por_mercado.items():
rango = esp.loc[m, "margen_inicial"]
pyg = np.outer(FRACCIONES, ns).sum(axis=1) * rango
riesgo[m] = max(0.0, -pyg.min()) # peor escenario
largos = sum(n for n in ns if n > 0)
cortos = -sum(n for n in ns if n < 0)
cargo[m] = min(largos, cortos) * esp.loc[
m, "margen_spread_calendario"] # meses no iguales
total = sum(riesgo.values()) + sum(cargo.values())
# crédito entre mercados: fracción del menor riesgo de cada par
if credito and len(riesgo) == 2:
total -= credito * min(riesgo.values())
return {"escenarios": float(sum(riesgo.values())),
"cargo_spread": float(sum(cargo.values())),
"total": float(total)}
for nombre, c in {"largo 2 PECF26": {"PECF26": 2},
"largo F26, corto G26": {"PECF26": 1,
"PECG26": -1},
"largo 2 F26, corto 1 G26": {"PECF26": 2,
"PECG26": -1}}.items():
print(f"{nombre:26s}", margen_escenarios(c))largo 2 PECF26 {'escenarios': 11200.0, 'cargo_spread': 0.0, 'total': 11200.0}
largo F26, corto G26 {'escenarios': 0.0, 'cargo_spread': 670.0, 'total': 670.0}
largo 2 F26, corto 1 G26 {'escenarios': 5600.0, 'cargo_spread': 670.0, 'total': 6270.0}Dos contratos largos de crudo piden 11.200 USD, dos rangos. Largo en enero y corto en febrero, el escaneo no ve riesgo (los dos se mueven igual en cada escenario) y el margen es el cargo de spread, 670 USD: un 6 % de lo que pediría una posición suelta de dos contratos. Dos largos y un corto quedan en un largo neto (5.600) más un spread (670). Es la razón por la que los spreads de calendario se operan con mucho menos margen (lección 3.2.1), y también la razón por la que su apalancamiento puede ser engañoso: el cargo de spread cubre movimientos normales de la pendiente, no un estrechamiento extremo de la oferta en el mes cercano.
cartera = {"RVAH26": 1, "RVBH26": -1}
sin = margen_escenarios(cartera)
con = margen_escenarios(cartera, credito=0.5)
print("sin crédito:", sin["total"], " con un 50 %:", con["total"])sin crédito: 44900.0 con un 50 %: 34800.0Un largo en RVA y un corto en RVB (dos índices con una correlación de 0,91 en los datos) piden 44.900 USD si se
suman como dos riesgos independientes. Con un crédito del 50 % del menor (un valor de ejemplo: en la realidad lo fija
la cámara para cada par de productos y lo revisa), 34.800. El crédito existe porque la cámara reconoce que las dos
patas se compensan en casi todos los escenarios; no desaparece el riesgo de que dejen de hacerlo.
Márgenes en una crisis
El rango de escaneo no es fijo: las cámaras lo revisan con la volatilidad reciente, y en una crisis lo suben. Los
datos tienen márgenes constantes (calibrados con el último año), así que para ver el efecto hay que simular una regla.
El README de los datos dice que los márgenes cubren entre 3 y 10 desviaciones típicas diarias del nominal, 5,3 en
RVA. Una regla que mantiene esas 5,3 con la volatilidad de las últimas semanas:
def serie(mercado):
c = curvas[curvas["mercado"] == mercado]
P = c.pivot(index="fecha", columns="contrato",
values="liquidacion")
cm = ctr[ctr["mercado"] == mercado].reset_index(drop=True)
pos = np.searchsorted(cm["fecha_roll"].to_numpy(),
P.index.to_numpy(), side="right")
i = P.columns.get_indexer(cm["contrato"].to_numpy()[pos])
f, Pv = np.arange(len(P)), P.to_numpy()
ayer = np.r_[i[0], i[:-1]]
r = np.r_[np.nan, np.log(Pv[f[1:], ayer[1:]]
/ Pv[f[1:] - 1, ayer[1:]])]
return pd.DataFrame({"precio": Pv[f, i], "ret": r},
index=P.index)
rva = serie("RVA")
nominal = rva["precio"] * esp.loc["RVA", "multiplicador"]
K = 5.3 # desviaciones diarias (README de datos)
dinamico = K * rva["ret"].ewm(span=20).std() * nominal
t = dinamico.loc["2019-12-01":"2020-12-31"]
print(t.resample("ME").agg(["min", "max"]).round(-2).iloc[:7])
print(f"máximo / enero: {t.max() / t.loc['2020-01'].mean():.1f}") min max
fecha
2019-12-31 4800.0 7200.0
2020-01-31 4100.0 5900.0
2020-02-29 5200.0 11900.0
2020-03-31 10200.0 32600.0
2020-04-30 16300.0 33400.0
2020-05-31 14700.0 23900.0
2020-06-30 13600.0 17300.0
máximo / enero: 6.7En enero de 2020 la regla pide entre 4.100 y 5.900 USD por contrato; en marzo, hasta 32.600, y el máximo, el 1 de abril, es 6,7 veces la media de enero. Después baja despacio: en junio sigue entre 13.600 y 17.300, porque la volatilidad tarda en olvidarse. Los márgenes de las cámaras reales no siguen esta regla exacta, pero tienen el mismo defecto de fondo: son procíclicos. Suben cuando hay pérdidas, y un sistema que en calma usa casi todo su efectivo como margen recibe a la vez las llamadas por las pérdidas y las subidas del margen. Si no puede aportar, reduce posiciones en el peor momento.
Apalancamiento implícito de una cartera diversificada
Un sistema diversificado (lección 3.1.4) da el mismo riesgo a cada mercado. Con 5 millones de USD, un 20 % de volatilidad objetivo y el multiplicador de diversificación de 2,5 que se calcula en esa lección, las posiciones del 26 de noviembre de 2025, en nominal y en margen:
CAPITAL, RIESGO = 5_000_000, 0.20
filas = {}
for m in MERCADOS:
s = serie(m)
cambio = usd_qev[DIA] if esp.loc[m, "divisa"] == "QEV" else 1
nominal = s.loc[DIA, "precio"] * esp.loc[m, "multiplicador"] \
* cambio
vol = s["ret"].loc[:DIA].tail(252).std() * np.sqrt(252)
# IDM de 2,5 (lección 3.1.4) y el mismo peso a cada mercado
n = np.round(2.5 / len(MERCADOS) * CAPITAL * RIESGO
/ (nominal * vol))
filas[m] = {"sector": esp.loc[m, "sector"], "contratos": n,
"nominal": n * nominal,
"margen": n * esp.loc[m, "margen_inicial"] * cambio}
cart = pd.DataFrame(filas).T.infer_objects()
por_sector = cart.groupby("sector")[["nominal", "margen"]].sum()
print((100 * por_sector / CAPITAL).round(1))
print("total:", (100 * por_sector.sum() / CAPITAL).round(1).to_dict()) nominal margen
sector
agricolas 41.6 2.4
divisas 27.3 0.5
energia 28.4 2.6
indices 58.0 3.3
metales 25.9 1.4
tipos 244.9 4.4
total: {'nominal': 426.0, 'margen': 14.7}El nominal de la cartera es el 426 % del capital: un apalancamiento de 4,3 veces. Más de la mitad, el 244,9 % del capital, son bonos, porque un bono se mueve tan poco que hace falta mucho nominal para que aporte el mismo riesgo que un índice. El margen es el 14,7 % del capital. La figura de la cabecera pone los dos números por sector.
Ninguno de los dos mide el riesgo de la cartera. El apalancamiento nominal mezcla un 245 % en bonos que se mueven un 6 % al año con un 28 % en energía que se mueve un 35 %. El margen es lo que pide la cámara para cubrir uno o dos días malos, y cambia con su regla. El riesgo es el que se fija con el tamaño de cada posición (un 20 % anual de objetivo) y lo que no captura la volatilidad: que los bonos caigan todos a la vez, como en la cartera de carry de 2022 de la lección 2.3.4, o que las correlaciones cambien en una crisis. Por eso un sistema de futuros se gestiona en riesgo, con escenarios de estrés, y el margen se vigila como restricción de liquidez.
Ejercicios
- Calcula con
margen_escenariosel margen de una mariposa de calendario en el crudo (largo 1PECF26, corto 2PECG26, largo 1PECH26). ¿Qué cargo de spread le aplica la función y por qué es probablemente demasiado alto?
Solución
print(margen_escenarios({"PECF26": 1, "PECG26": -2, "PECH26": 1})){'escenarios': 0.0, 'cargo_spread': 1340.0, 'total': 1340.0}La posición neta es cero, así que el escaneo no ve riesgo. La función cuenta dos spreads (dos largos y dos cortos) y cobra dos cargos, 1.340 USD. Pero una mariposa es la diferencia de dos spreads con una pata en común, y su riesgo es menor que el de dos spreads independientes: las cámaras reales tienen tablas de cargos por tramos de la curva y pueden tratar estas combinaciones de otra forma. La lección 3.2.1 construye butterflies y condors de calendario.
- Repite la regla de margen dinámico de 2020 con una media exponencial de 60 sesiones en lugar de 20. ¿Sube menos? ¿Baja antes o después?
Solución
lento = K * rva["ret"].ewm(span=60).std() * nominal
t60 = lento.loc["2019-12-01":"2020-12-31"]
print(t60.resample("ME").agg(["min", "max"]).round(-2).iloc[:7])
print(f"máximo / enero: {t60.max() / t60.loc['2020-01'].mean():.1f}") min max
fecha
2019-12-31 7100.0 8200.0
2020-01-31 6200.0 7100.0
2020-02-29 6200.0 10000.0
2020-03-31 9800.0 35600.0
2020-04-30 34700.0 39200.0
2020-05-31 32600.0 38200.0
2020-06-30 26900.0 32700.0
máximo / enero: 6.0Con 60 sesiones la regla parte de un nivel más alto en enero (de 6.200 a 7.100 USD, porque su ventana aún recuerda la volatilidad de finales de 2019) y reacciona más tarde, pero no sube menos: su máximo de abril, 39.200, supera el de la regla de 20 sesiones, porque acumula más días malos en la ventana, y en junio sigue entre 26.900 y 32.700, cuando la otra ya ha bajado a la mitad. Frente a enero, el máximo es 6,0 veces en lugar de 6,7. Es el dilema de cualquier medida de riesgo: rápida y nerviosa o lenta y con memoria; la lenta no evita la subida, la retrasa y la alarga, y retiene el efectivo de la cuenta durante más tiempo.
- Con la tabla
cart, ¿qué pasaría con el margen total si la cámara duplicara el margen de los cinco bonos? ¿Y si lo duplicara en los cinco índices? ¿Qué te dice sobre dónde está la exposición de margen de la cartera?
Solución
El margen de los bonos es el 4,4 % del capital y el de los índices, el 3,3 %: duplicar el de los bonos llevaría el margen total del 14,7 % al 19,1 %, y el de los índices, al 18,0 %. Los bonos tienen el mayor nominal y el mayor margen de la cartera, aunque cada contrato pida poco, porque hay muchos contratos. Un cambio en el margen de un sector con muchas posiciones pesa más que uno en un sector con contratos caros pero pocos. Es otra forma de ver que el nominal y el margen se concentran en los bonos aunque el riesgo esté repartido.
Respuesta plegada en cada pregunta
Autoevaluación
En los datos, el interés abierto del maíz (GRM) cruza el 50 % hacia el siguiente contrato entre 9 y 8 sesiones antes de la fecha de roll, y el de la nota a 10 años (TPC), hacia la sesión −3. ¿Qué implica para la fecha de roll de un sistema?
- AQue da igual cuándo se rueda
- BQue cada mercado tiene su ventana: rodar más tarde de cuando migra la liquidez significa operar el último tramo en un contrato que se vacía, con horquillas más anchas y, en los de entrega física, cerca del primer aviso
- CQue hay que rodar siempre el día del vencimiento
- DQue el maíz no tiene roll
Ver respuesta
Respuesta B. Que cada mercado tiene su ventana: rodar más tarde de cuando migra la liquidez significa operar el último tramo en un contrato que se vacía, con horquillas más anchas y, en los de entrega física, cerca del primer aviso
La fecha de roll se fija por mercado: antes de que el contrato que se deja pierda la liquidez y, en los de entrega física, antes del primer aviso. En la fecha de roll de los datos, al contrato que vence le queda entre el 2 % y el 6 % del interés abierto.
En los spreads de calendario de los datos, el libro del spread cotiza con una horquilla media de 1,25 ticks y el spread sintético con las dos patas, de 2,78. ¿Cómo conviene rodar?
- AVendiendo el contrato viejo y comprando el nuevo a mercado por separado
- BCon una orden de spread de calendario: una sola horquilla, más estrecha, y sin el riesgo de que el precio se mueva entre la ejecución de una pata y la de la otra
- CDejando que el contrato venza
- DDa igual: el coste es el mismo
Ver respuesta
Respuesta B. Con una orden de spread de calendario: una sola horquilla, más estrecha, y sin el riesgo de que el precio se mueva entre la ejecución de una pata y la de la otra
Rodar es vender un contrato y comprar el siguiente a la vez, que es exactamente un spread de calendario. Negociado como spread, se paga media horquilla del libro del spread; por patas, media horquilla de cada una, y además se corre el riesgo de ejecución entre patas (lección 3.2.5).
Una posición larga en PECF26 y corta en PECG26 tiene un riesgo de escaneo nulo en el cálculo de la lección. ¿Por qué el margen no es cero?
- APorque la cámara cobra una comisión fija
- BPorque el escaneo mueve todos los meses de un mercado a la vez, como si la correlación fuera 1; el cargo por spread de calendario (670 USD) cubre el riesgo de que los dos meses se muevan distinto
- CPorque los cortos siempre pagan más margen
- DPorque es un error del cálculo
Ver respuesta
Respuesta B. Porque el escaneo mueve todos los meses de un mercado a la vez, como si la correlación fuera 1; el cargo por spread de calendario (670 USD) cubre el riesgo de que los dos meses se muevan distinto
Dos contratos del mismo mercado no se mueven exactamente igual (la pendiente cambia). El cargo de spread es pequeño frente al margen de un contrato suelto (5.600 USD en PEC) porque el riesgo del spread lo es: la lección 3.2.1 lo aprovecha.
Una regla de margen que cubre 5,3 desviaciones típicas diarias del nominal pasa de una media de 4.967 USD por contrato RVA en enero de 2020 a 33.406 el 1 de abril. ¿Qué consecuencia tiene para un sistema?
- ANinguna: el margen no es una pérdida
- BQue necesita efectivo de reserva: el margen sube justo cuando hay pérdidas, y quien no puede aportarlo tiene que reducir posiciones en el peor momento
- CQue hay que operar más contratos
- DQue el margen baja en las crisis
Ver respuesta
Respuesta B. Que necesita efectivo de reserva: el margen sube justo cuando hay pérdidas, y quien no puede aportarlo tiene que reducir posiciones en el peor momento
Los márgenes por escenarios dependen de la volatilidad reciente: son procíclicos. Un sistema que usa casi todo su efectivo como margen en calma recibe llamadas de margen y subidas de margen a la vez.
La cartera de la lección tiene un nominal del 426 % del capital y un margen del 14,7 %. ¿Qué número describe mejor su riesgo?
- AEl nominal: la cartera está apalancada 4,3 veces
- BEl margen: arriesga el 14,7 % del capital
- CNinguno de los dos: su riesgo es el objetivo de volatilidad (un 20 % anual), que depende de la volatilidad y la correlación de las posiciones, no de su nominal ni de su margen
- DLa suma de los dos
Ver respuesta
Respuesta C. Ninguno de los dos: su riesgo es el objetivo de volatilidad (un 20 % anual), que depende de la volatilidad y la correlación de las posiciones, no de su nominal ni de su margen
El 57 % del nominal son bonos (244,9 % del capital), que se mueven poco. El margen depende de lo que pide la cámara. El riesgo se mide en volatilidad (y en escenarios de estrés), y es lo que fija el tamaño de cada posición.
Ideas clave
- La fecha de roll se fija por mercado: antes del primer aviso en los de entrega física y cuando migra la liquidez en el resto. En los datos, el interés abierto cruza el 50 % entre 9 y 3 sesiones antes del roll, según el mercado.
- Rodar es un spread de calendario. Con una orden de spread se paga media horquilla de un libro de 1,25 ticks; por patas, media de cada una (2,78 ticks en total) y riesgo de ejecución entre patas. En el maíz, rodar cuesta 36,7 puntos básicos al año con el libro y 65,3 por patas.
- Rodar antes reduce la volatilidad del contrato que se tiene en los mercados con efecto Samuelson (gas: del 43,4 % al 29,5 % al rodar 40 sesiones antes), a cambio de alejarse del contrato con más liquidez.
- El margen por escenarios toma la peor pérdida de una rejilla de movimientos del precio, suma un cargo por los spreads dentro del mismo mercado y resta un crédito entre mercados correlados. Un spread de calendario de crudo pide 670 USD frente a 5.600 de un contrato suelto.
- Los márgenes son procíclicos: una regla que cubre 5,3 desviaciones diarias multiplica el margen de RVA por 6,7 entre enero y abril de 2020.
- Una cartera con el mismo riesgo en 23 mercados y un 20 % de volatilidad objetivo tiene un nominal del 426 % del capital (el 244,9 % en bonos) y un margen del 14,7 %: ni el apalancamiento ni el margen miden su riesgo.