---
title: "3.1.3 Roll, márgenes, SPAN y apalancamiento"
description: "Cuándo y cómo rodar un futuro y lo que cuesta, margen inicial y de mantenimiento, margen por escenarios tipo SPAN y apalancamiento implícito."
url: "https://pythonparatrading.com/curso-python-trading/nivel-3/roll-margenes-span-y-apalancamiento/"
lang: "es"
image: "https://pythonparatrading.com/og/curso-python-trading/nivel-3/roll-margenes-span-y-apalancamiento.png"
---

# 3.1.3 · 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.

- Curso: [Nivel 3: Derivados: futuros, spreads, forex y opciones](https://pythonparatrading.com/curso-python-trading/nivel-3/)
- Módulo: 3.1 · Futuros en profundidad
- Duración: 65 min
- Requisitos: [3.1.1 · Contratos de futuros principales](https://pythonparatrading.com/curso-python-trading/nivel-3/contratos-de-futuros-principales/), [3.1.2 · Curva de futuros: base, cost of carry, contango y roll yield](https://pythonparatrading.com/curso-python-trading/nivel-3/curva-de-futuros-base-contango-y-roll-yield/), [1.2.3 · Futuros: especificaciones, margen, roll y contango](https://pythonparatrading.com/curso-python-trading/nivel-1/futuros-especificaciones-margen-y-roll/)

## Al terminar esta lección

- Elegir la fecha de roll de cada mercado según su referencia (primer aviso o vencimiento) y la migración del interés abierto.
- Ejecutar el roll como un spread de calendario y medir lo que cuesta frente a negociar las dos patas por separado.
- Distinguir margen inicial, de mantenimiento y de spread, y calcular el margen de una cartera por escenarios (riesgo de escaneo, cargo por spread, crédito entre mercados).
- Explicar por qué los márgenes suben en las crisis y simular una regla de margen que sigue a la volatilidad.
- Calcular el apalancamiento nominal y el margen de una cartera diversificada, y por qué ninguno de los dos mide su riesgo.

## 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:

```python
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"]]
```
```output
                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          4
```

Los 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.

```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 --> G
```

La 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:

```python
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)
```
```output
      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.4
```

*Fig. — Migración del interés abierto alrededor del roll: cuota del contrato que vence frente al siguiente, media de los rolls de 2011 a 2024.* Cuatro líneas con la cuota del interés abierto del contrato que vence frente al siguiente, de 15 sesiones antes de la fecha de roll a 3 después. El maíz (GRM), desde el 69 %, cruza el 50 % entre 9 y 8 sesiones antes del roll; el crudo (PEC), desde el 65 %, entre 7 y 6; el índice (RVA), desde el 93 %, entre 6 y 5; la nota a 10 años (TPC, destacada) se mantiene en el 93 % hasta la sesión −6, cruza el 50 % hacia la −3 y llega al 3 % en la −1. En la fecha de roll, al contrato que vence le queda entre el 2 % y el 6 % del interés abierto.

La 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.

<aside class="callout" data-kind="nota">

En los mercados reales, el calendario de roll de los grandes índices de materias primas y de los ETF que replican
futuros es público, y su volumen se concentra en unos pocos días. Rodar justo esos días es rodar a la vez que ellos; hay
sistemas que adelantan o retrasan un poco su roll para no coincidir. Lo que no cambia es la condición del primer aviso.

</aside>

## 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:

```python
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)
```
```output
         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.78
```

El 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:

```python
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)
```
```output
     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.32
```

Por 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:

```python
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)
```
```output
     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.5
```

En 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:

```python
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)
```
```output
         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 `RVA` y 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:

```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):

```python
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))
```
```output
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.

```python
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"])
```
```output
sin crédito: 44900.0  con un 50 %: 34800.0
```

Un 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:

```python
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}")
```
```output
                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.7
```

*Fig. — Un margen que sigue a la volatilidad: 5,3 desviaciones típicas diarias (media exponencial de 20 sesiones) del nominal de un contrato RVA, de diciembre de 2019 a diciembre de 2020.* Una línea con el margen por contrato de una regla que sigue a la volatilidad, de diciembre de 2019 a diciembre de 2020. En enero de 2020 ronda los 5.000 USD (media de 4.967, línea discontinua); sube en marzo hasta un máximo de 33.406 el 1 de abril (destacado), 6,7 veces la media de enero, y baja despacio: en torno a 15.000 en verano y a 8.000-10.000 en diciembre.

En 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.

<aside class="callout" data-kind="riesgo">

Regla práctica de cualquier sistema con futuros: el margen usado en calma tiene que ser una fracción pequeña del
capital, para que un margen varias veces mayor y unas semanas de pérdidas quepan en la cuenta. La cartera de la sección
siguiente usa un 14,7 % del capital; con el margen multiplicado por 6,7, como en la simulación de 2020, necesitaría casi
todo.

</aside>

## 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:

```python
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())
```
```output
           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

1. Calcula con `margen_escenarios` el margen de una mariposa de calendario en el crudo (largo 1 `PECF26`, corto 2
   `PECG26`, largo 1 `PECH26`). ¿Qué cargo de spread le aplica la función y por qué es probablemente demasiado alto?

**Solución.**

```python
print(margen_escenarios({"PECF26": 1, "PECG26": -2, "PECH26": 1}))
```
```output
{'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.

2. 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.**

```python
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}")
```
```output
                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.0
```

Con 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.

3. 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.

## Autoevaluación

1. 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?

   - A. Que da igual cuándo se rueda
   - 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
   - C. Que hay que rodar siempre el día del vencimiento
   - D. Que el maíz no tiene roll

   *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.

2. 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?

   - A. Vendiendo el contrato viejo y comprando el nuevo a mercado por separado
   - 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
   - C. Dejando que el contrato venza
   - D. Da igual: el coste es el mismo

   *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).

3. 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?

   - A. Porque la cámara cobra una comisión fija
   - 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
   - C. Porque los cortos siempre pagan más margen
   - D. Porque es un error del cálculo

   *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.

4. 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?

   - A. Ninguna: el margen no es una pérdida
   - 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
   - C. Que hay que operar más contratos
   - D. Que el margen baja en las crisis

   *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.

5. 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?

   - A. El nominal: la cartera está apalancada 4,3 veces
   - B. El margen: arriesga el 14,7 % del capital
   - 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
   - D. La suma de los dos

   *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.

## Recursos

### Research

- [Introducción a la volatilidad y la liquidez](https://pythonparatrading.com/introduccion-a-la-volatilidad-liquidez/) · Research-0001 · 6 min

### Documentación

- [BME Clearing: gestión del riesgo (MEFFCOM2, método de escenarios similar a SPAN)](https://www.bolsasymercados.es/en/securities-services/bme-clearing/services/risk-management.html) · bolsasymercados.es
- [Eurex Clearing: Prisma (márgenes por cartera)](https://www.eurex.com/ec-en/services/margining/eurex-clearing-prisma) · eurex.com
- [Eurex: Euro-Bund Futures (día de entrega y último día de negociación)](https://www.eurex.com/ex-en/markets/int/long-term-interest-rates/fix/government-bonds/Euro-Bund-Futures-137298) · eurex.com

### Libros

- [Robert Carver: Leveraged Trading (Harriman House, 2019)](https://www.harriman-house.com/authors/robert-carver/leveraged-trading/9780857197214) · harriman-house.com

### Datos

- [Datos del nivel 3: spreads de calendario cotizados (Parquet)](https://pythonparatrading.com/curso/datos/nivel-3/spreads3_cotizados.parquet) · Descarga · spreads3_cotizados.parquet
- [Datos del nivel 3: calendario de contratos (CSV)](https://pythonparatrading.com/curso/datos/nivel-3/futuros3_contratos.csv) · Descarga · futuros3_contratos.csv

Lección anterior: [3.1.2 · Curva de futuros: base, cost of carry, contango y roll yield](https://pythonparatrading.com/curso-python-trading/nivel-3/curva-de-futuros-base-contango-y-roll-yield/)

Lección siguiente: [3.1.4 · Sistemas de futuros diversificados: el enfoque de Carver](https://pythonparatrading.com/curso-python-trading/nivel-3/sistemas-de-futuros-diversificados-carver/)
