---
title: "1.2.3 Futuros: especificaciones, margen, roll y contango"
description: "Qué fija un contrato de futuros, cómo funcionan el margen y la liquidación diaria, por qué converge al contado y cómo migra la liquidez en el roll."
url: "https://pythonparatrading.com/curso-python-trading/nivel-1/futuros-especificaciones-margen-y-roll/"
lang: "es"
image: "https://pythonparatrading.com/og/curso-python-trading/nivel-1/futuros-especificaciones-margen-y-roll.png"
---

# 1.2.3 · Futuros: especificaciones, margen, roll y contango

> Un futuro es un compromiso estandarizado de comprar o vender un activo en una fecha a un precio fijado hoy. No se paga al entrar: se deposita una garantía y cada día se cobran o pagan las diferencias. Esta lección desmonta un contrato ficticio sobre un índice, FIX, con siete años de precios de liquidación de todos sus vencimientos.

- Curso: [Nivel 1: Datos financieros, mercados y análisis](https://pythonparatrading.com/curso-python-trading/nivel-1/)
- Módulo: 1.2 · Clases de activos
- Duración: 65 min
- Requisitos: [1.1.5 · Costes, liquidación, apalancamiento y margen](https://pythonparatrading.com/curso-python-trading/nivel-1/costes-liquidacion-apalancamiento-y-margen/), [1.2.1 · Acciones: splits, dividendos y eventos corporativos](https://pythonparatrading.com/curso-python-trading/nivel-1/acciones-splits-dividendos-y-eventos-corporativos/)

## Al terminar esta lección

- Leer las especificaciones de un contrato de futuros (multiplicador, tick, valor del tick, vencimientos, liquidación) y calcular su nominal.
- Simular la liquidación diaria de una posición y su cuenta de margen, con margen inicial, de mantenimiento y llamadas de margen.
- Explicar la relación entre el futuro y el contado (coste de mantenimiento) y medir la base y su convergencia al vencimiento.
- Distinguir contango y backwardation y medirlos en la estructura temporal de los datos.
- Reconocer la migración de volumen e interés abierto en el roll y saber por qué importa para construir una serie continua.

## Un contrato estandarizado

Un **futuro** es un contrato por el que dos partes se comprometen a comprar y vender un activo (el **subyacente**) en
una fecha futura (el **vencimiento**) a un precio que se fija hoy. A diferencia de un contrato a plazo privado
(*forward*, lección 1.2.4), un futuro se negocia en una bolsa, con condiciones idénticas para todos, y una cámara de
contrapartida se interpone entre comprador y vendedor (lección 1.1.1). Lo único que se negocia es el precio; todo lo
demás lo fija la **ficha del contrato**.

Los datos del curso incluyen un futuro ficticio, **FIX**, sobre un índice de acciones de precios (sin dividendos). Su
ficha:

```python
import numpy as np
import pandas as pd

esp = pd.read_csv("fix_especificaciones.csv").iloc[0]
print(esp.drop("regla_vencimiento").to_string())
print(esp["regla_vencimiento"])
```
```output
multiplicador                50
tick                       0.25
valor_tick                 12.5
margen_inicial            16500
margen_mantenimiento      15000
meses                   H,M,U,Z
tercer viernes del mes del contrato (si no hay sesión, la anterior); liquidación final en efectivo al cierre del índice ese día; último día de negociación = vencimiento
```

Cada campo responde a una pregunta:

| Campo | Pregunta | FIX |
|---|---|---|
| Subyacente | ¿Sobre qué? | Índice FIX de precios |
| Multiplicador | ¿Cuánto vale un punto? | 50 USD |
| Tick | ¿Cuál es la variación mínima del precio? | 0,25 puntos |
| Valor del tick | ¿Cuánto se gana o pierde por tick y contrato? | 0,25 × 50 = 12,50 USD |
| Meses | ¿Qué vencimientos hay? | Marzo, junio, septiembre, diciembre (H, M, U, Z) |
| Vencimiento | ¿Qué día? | Tercer viernes del mes (o la sesión anterior) |
| Liquidación final | ¿Cómo se cierra? | En efectivo, al cierre del índice ese día |
| Márgenes | ¿Qué garantía se deposita? | 16.500 USD iniciales, 15.000 de mantenimiento |

Los códigos de mes (H marzo, M junio, U septiembre, Z diciembre) son la convención de las bolsas de EE. UU.; el
contrato `FIXH24` es el de marzo de 2024. Con un precio y la ficha se calcula todo lo demás:

```python
indice = pd.read_csv("fix_indice_diario.csv", parse_dates=["fecha"],
                     index_col="fecha")["indice"]
S = indice["2025-06-02"]
nominal = S * esp["multiplicador"]
print(f"Índice: {S:.2f}  nominal de un contrato: {nominal:,.0f} USD")
print(f"Margen inicial: {esp['margen_inicial']:,} USD"
      f" = {esp['margen_inicial'] / nominal:.1%} del nominal")
print(f"Apalancamiento: {nominal / esp['margen_inicial']:.1f} a 1")
print(f"Un 1 % del índice: {0.01 * nominal:,.0f} USD por contrato")
```
```output
Índice: 6359.10  nominal de un contrato: 317,955 USD
Margen inicial: 16,500 USD = 5.2% del nominal
Apalancamiento: 19.3 a 1
Un 1 % del índice: 3,180 USD por contrato
```

Un contrato controla 317.955 USD de índice con 16.500 de garantía: un apalancamiento de 19,3 a 1. Un movimiento del 1 %
del índice son 3.180 USD, casi una quinta parte del margen. Para dimensionar una posición en futuros hay que pensar
siempre en el nominal, nunca en el margen (lección 0.1.2).

Los contratos reales siguen el mismo esquema. Algunas cifras de sus fichas oficiales:

| Contrato | Multiplicador | Tick | Vencimiento y liquidación final |
|---|---|---|---|
| E-mini S&P 500 (CME) | 50 USD × índice | 0,25 puntos = 12,50 USD | Efectivo; cotización especial de apertura del índice el tercer viernes del mes |
| Futuro IBEX 35 (MEFF) | 10 EUR × índice | Por circular | Tercer viernes; media del índice de 16:15 a 16:45, un valor por minuto |
| Futuro Mini IBEX 35 (MEFF) | 1 EUR × índice | 5 puntos = 5 EUR | Tercer viernes; igual que el IBEX 35 |

FIX imita al E-mini S&P 500 en multiplicador y tick. La diferencia está en la liquidación final: en el E-mini no es el
cierre del índice sino una cotización especial calculada con los precios de apertura de sus acciones el día del
vencimiento (regla 35803.A del capítulo 358), y la negociación del contrato que vence termina al empezar la sesión de
la NYSE ese día. En MEFF, la liquidación diaria del primer vencimiento es la media ponderada por volumen de las
operaciones del libro entre las 17:29 y las 17:30. Detalles así importan cuando se compara un futuro con su índice en
la fecha de vencimiento.

## Muchos contratos vivos a la vez

Cada día cotizan varios vencimientos del mismo futuro. `fix_contratos.parquet` tiene una fila por sesión y contrato,
con el precio de liquidación diario (el que fija la cámara al cierre para calcular pérdidas y ganancias), el volumen y
el interés abierto (contratos vivos, no cerrados):

```python
fut = pd.read_parquet("fix_contratos.parquet")
fut["dias"] = (fut["vencimiento"] - fut["fecha"]).dt.days
dia = fut[fut["fecha"] == "2025-06-02"]
dia[["contrato", "vencimiento", "dias", "liquidacion", "volumen",
     "interes_abierto"]]
```
```output
     contrato vencimiento  dias  liquidacion  volumen  interes_abierto
4867   FIXM25  2025-06-20    18      6367.75   315854           786283
4868   FIXU25  2025-09-19   109      6419.00     4406            24548
4869   FIXZ25  2025-12-19   200      6462.50      729             3201
```

El 2 de junio de 2025 hay tres vencimientos vivos. El de junio, a 18 días, concentra casi todo: 786.283 contratos de
interés abierto frente a 24.548 del de septiembre. Es el **contrato cercano** (*front month*). Los demás existen, pero
casi nadie los negocia hasta que se acerca su turno.

La figura de la cabecera es la «escalera» de 2024 y 2025: cada contrato cotiza unos nueve meses, pero solo es el
cercano durante los tres últimos. La línea gruesa marca cuándo cada uno tiene el mayor interés abierto. Todos vencen
en viernes:

```python
venc = fut.groupby("contrato")["vencimiento"].first()
venc = venc[venc.dt.year == 2025]
pd.DataFrame({"vencimiento": venc.dt.date,
              "dia": venc.dt.day_name()})
```
```output
         vencimiento     dia
contrato
FIXH25    2025-03-21  Friday
FIXM25    2025-06-20  Friday
FIXU25    2025-09-19  Friday
FIXZ25    2025-12-19  Friday
```

## Margen y liquidación diaria

Comprar un futuro no cuesta su nominal. El comprador y el vendedor depositan una garantía, el **margen inicial**, y a
partir de ahí la cámara liquida cada día la diferencia entre el precio de liquidación de hoy y el de ayer (*mark to
market*): la parte que gana cobra y la que pierde paga, en efectivo, antes de la sesión siguiente. El ejemplo de la
ficha de MEFF lo resume: comprar 30 futuros IBEX 35 a 10.000 con una liquidación de 10.020 al final de la sesión da
(10.020 − 10.000) × 30 × 10 = +6.000 euros ese día.

```mermaid
flowchart LR
  C[Comprador] --> MC[Miembro]
  V[Vendedor] --> MV[Miembro]
  MC -- liquidación diaria --> K[Cámara]
  MV -- liquidación diaria --> K
```

Si las pérdidas dejan el saldo de la cuenta por debajo del **margen de mantenimiento**, el bróker hace una **llamada de
margen**: hay que aportar efectivo hasta volver al margen inicial. Si no se aporta, el bróker cierra la posición.

```mermaid
stateDiagram-v2
  [*] --> Abierta
  Abierta --> Llamada: saldo bajo mínimo
  Llamada --> Abierta: aporta efectivo
  Llamada --> Cerrada: no aporta
  Abierta --> Cerrada: vende o vence
  Cerrada --> [*]
```

Con los precios de liquidación de FIX se puede simular la cuenta de margen de un largo en el contrato de marzo de 2025,
abierto el 16 de diciembre de 2024 y mantenido hasta el vencimiento:

```python
def cuenta_margen(precios, contratos=1, lado=1):
    """Saldo de la cuenta de margen con liquidación diaria.

    lado = 1 para un largo, -1 para un corto. Si el saldo baja del
    margen de mantenimiento, se aporta lo necesario para volver al
    margen inicial.
    """
    saldo, filas = float(esp["margen_inicial"]) * contratos, []
    anterior = precios.iloc[0]
    for fecha, precio in precios.items():
        puntos = lado * (precio - anterior)
        pyg = puntos * esp["multiplicador"] * contratos
        saldo += pyg
        aporte = 0.0
        if saldo < esp["margen_mantenimiento"] * contratos:
            aporte = esp["margen_inicial"] * contratos - saldo
            saldo += aporte
        filas.append((fecha, precio, pyg, aporte, saldo))
        anterior = precio
    cols = ["liquidacion", "pyg", "aporte", "saldo"]
    tabla = pd.DataFrame(filas, columns=["fecha"] + cols)
    return tabla.set_index("fecha")

h25 = fut[fut["contrato"] == "FIXH25"].set_index("fecha")["liquidacion"]
cm = cuenta_margen(h25.loc["2024-12-16":])
cm.loc["2025-02-26":"2025-03-07"]
```
```output
            liquidacion     pyg  aporte    saldo
fecha
2025-02-26      5836.25 -1150.0  2500.0  16500.0
2025-02-27      5757.50 -3937.5  3937.5  16500.0
2025-02-28      5753.75  -187.5     0.0  16312.5
2025-03-03      5601.25 -7625.0  7812.5  16500.0
2025-03-04      5618.25   850.0     0.0  17350.0
2025-03-05      5503.50 -5737.5  4887.5  16500.0
2025-03-06      5334.50 -8450.0  8450.0  16500.0
2025-03-07      5234.75 -4987.5  4987.5  16500.0
```

A finales de febrero de 2025 el índice empieza a caer con fuerza. Cada día de pérdidas grandes deja el saldo por
debajo de 15.000 USD y obliga a aportar hasta volver a 16.500: 2.500 USD el 26 de febrero, 3.937,50 el 27, 7.812,50 el
3 de marzo y, del 5 al 7 de marzo, 4.887,50, 8.450 y 4.987,50. En los seis días de la tabla con aportación, la cuenta
pide 32.575 USD: casi el doble del margen inicial entero.

```python
llamadas = cm[cm["aporte"] > 0]
print("Llamadas de margen:", len(llamadas))
print(f"Efectivo aportado: {llamadas['aporte'].sum():,.2f} USD")
print(f"Resultado de la posición: {cm['pyg'].sum():,.2f} USD")
print(f"Saldo final de la cuenta: {cm['saldo'].iloc[-1]:,.2f} USD")
```
```output
Llamadas de margen: 12
Efectivo aportado: 64,112.50 USD
Resultado de la posición: -65,332.50 USD
Saldo final de la cuenta: 15,280.00 USD
```

*Fig. — Un largo en FIXH25 del 16 de diciembre de 2024 al vencimiento: resultado acumulado y efectivo aportado en llamadas de margen.* Dos líneas en miles de USD. El resultado acumulado de un contrato largo oscila cerca de cero hasta febrero y cae con fuerza desde finales de febrero hasta −65,3 mil al vencimiento del 21 de marzo de 2025. En escalera, destacado, el efectivo aportado en las 12 llamadas de margen, que sube casi en espejo hasta 64,1 mil.

La posición pierde 65.332,50 USD: cuatro veces el margen inicial. El inversor ha tenido que aportar 64.112,50 USD en
12 llamadas, y al vencimiento le quedan 15.280 en la cuenta. Las cuentas cuadran: 16.500 + 64.112,50 − 65.332,50 =
15.280. El margen inicial no es la pérdida máxima: es solo lo que la cámara pide para cubrir uno o dos días malos.

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

Los márgenes reales los fija la cámara y cambian: en episodios de volatilidad suben, justo cuando más pérdidas hay.
Un sistema con futuros necesita efectivo de reserva para las llamadas de margen; sin él, el bróker cierra la posición
en el peor momento, aunque la idea fuera correcta. En FIXH25, quien no pudiera aportar el 3 de marzo habría cerrado con
pérdidas cerca del mínimo.

</aside>

## Base, coste de mantenimiento y convergencia

¿Por qué un futuro cotiza a un precio distinto del contado? Porque comprar el futuro y comprar el índice no son lo
mismo. Quien compra el índice paga hoy todo su valor (y deja de cobrar intereses por ese dinero) y cobra los
dividendos; quien compra el futuro no paga nada hoy y no cobra dividendos. Para que no haya arbitraje, el futuro tiene
que compensar esa diferencia, el **coste de mantenimiento** (*cost of carry*):

$$
F_t = S_t \, e^{(r - q)\,\tau}
$$

donde $S_t$ es el índice, $r$ el tipo de interés, $q$ el rendimiento por dividendo del índice y $\tau$ el tiempo al
vencimiento en años. La diferencia $F_t - S_t$ es la **base**. El 2 de junio de 2025, con el tipo a tres meses de la
curva del curso y un rendimiento por dividendo del 1,35 %:

```python
curva = pd.read_csv("curva_tipos_diaria.csv", parse_dates=["fecha"],
                    index_col="fecha")
r = curva.loc["2025-06-02", "3m"] / 100
q = 0.0135
dia = dia.assign(teorico=S * np.exp((r - q) * dia["dias"] / 365))
dia["base"] = dia["liquidacion"] - S
print(f"Índice {S}, r = {r:.3%}, q = {q:.2%}")
dia[["contrato", "dias", "liquidacion", "teorico", "base"]].round(2)
```
```output
Índice 6359.1, r = 4.354%, q = 1.35%
     contrato  dias  liquidacion  teorico    base
4867   FIXM25    18      6367.75  6368.53    8.65
4868   FIXU25   109      6419.00  6416.40   59.90
4869   FIXZ25   200      6462.50  6464.64  103.40
```

Los tres precios de liquidación están a menos de tres puntos de su valor teórico: la diferencia es el redondeo al tick
y un pequeño ruido. La base crece con el plazo: 8,65 puntos a 18 días, 59,90 a 109 y 103,40 a 200. Y como el plazo se
acorta cada día, la base de un contrato se va consumiendo hasta desaparecer:

```python
z25 = fut[fut["contrato"] == "FIXZ25"].set_index("fecha")
base = (z25["liquidacion"] - indice.reindex(z25.index)).rename("base")
pd.concat([z25["dias"], base.round(2)], axis=1).iloc[[0, 50, 100,
                                                      150, -2, -1]]
```
```output
            dias    base
fecha
2025-03-19   275  109.70
2025-05-30   203  103.12
2025-08-12   129   63.00
2025-10-22    58   27.06
2025-12-18     1    0.65
2025-12-19     0    0.00
```

*Fig. — Base del futuro FIXZ25 frente al índice, de su primer día de cotización a su vencimiento.* Línea diaria de la base, futuro menos índice en puntos, del 19 de marzo al 19 de diciembre de 2025. Empieza en 109,7 puntos a 275 días del vencimiento, baja con oscilaciones pequeñas casi en línea recta y llega a cero, destacado, el día del vencimiento, cuando la liquidación final es el cierre del índice.

El FIXZ25 empieza a cotizar en marzo de 2025 con una base de 109,70 puntos a 275 días y termina el 19 de diciembre con
base cero: su liquidación final es el cierre del índice. Por eso un futuro sobre índice «pierde» frente al índice
cuando el tipo supera al dividendo: no es una mala rentabilidad, es el interés que el comprador del futuro no paga y
que sí cobra el dinero que no ha gastado.

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

En futuros sobre materias primas, la relación cambia: el coste de mantenimiento incluye el almacenamiento y un
«rendimiento de conveniencia» por tener la mercancía física, y la estructura temporal refleja también la oferta y la
demanda esperadas. En los financieros (índices, bonos, divisas), el arbitraje la ata casi exactamente al tipo y al
rendimiento del subyacente.

</aside>

## Contango y backwardation

La **estructura temporal** es el precio de cada vencimiento en un mismo día. Tiene dos formas básicas:

- **Contango**: los vencimientos lejanos cotizan más caros que los cercanos (y que el contado). En un índice, cuando
  $r > q$.
- **Backwardation**: los lejanos cotizan más baratos. En un índice, cuando $r < q$.

```python
def curva_futuros(fecha):
    d = fut[(fut["fecha"] == fecha) & (fut["dias"] > 0)]
    s = indice[fecha]
    return d.assign(sobre_contado_pct=100 * (d["liquidacion"] / s - 1))

for fecha in ["2021-06-01", "2025-06-02"]:
    print(fecha, f"tipo 3m: {curva.loc[fecha, '3m']:.2f} %")
    print(curva_futuros(fecha)[["contrato", "dias", "liquidacion",
                                "sobre_contado_pct"]].round(2))
```
```output
2021-06-01 tipo 3m: 0.16 %
     contrato  dias  liquidacion  sobre_contado_pct
1836   FIXM21    17      4040.75              -0.07
1837   FIXU21   108      4022.25              -0.52
1838   FIXZ21   199      4010.75              -0.81
2025-06-02 tipo 3m: 4.35 %
     contrato  dias  liquidacion  sobre_contado_pct
4867   FIXM25    18      6367.75               0.14
4868   FIXU25   109      6419.00               0.94
4869   FIXZ25   200      6462.50               1.63
```

*Fig. — Estructura temporal de los futuros FIX en dos fechas: backwardation en 2021 y contango en 2025.* Dos curvas con el precio de cada vencimiento sobre el índice al contado, en porcentaje, frente a los días al vencimiento. El 2 de junio de 2025, con un tipo del 4,35 %, en azul, la curva sube: +0,14 % a 18 días, +0,94 % a 109 y +1,63 % a 200. El 1 de junio de 2021, con un tipo del 0,16 %, en naranja, baja: −0,07 %, −0,52 % y −0,81 % a 17, 108 y 199 días.

El 1 de junio de 2021, con el tipo a tres meses en el 0,16 %, por debajo del rendimiento por dividendo, la curva baja:
backwardation. El 2 de junio de 2025, con el tipo en el 4,35 %, sube: contango. Para medir los periodos con todos los
datos, basta comparar cada día los dos vencimientos más cercanos y anualizar la diferencia:

```python
vivos = fut[fut["dias"] > 0].sort_values(["fecha", "vencimiento"])
dos = vivos.groupby("fecha").head(2)
par = dos.groupby("fecha").agg(f1=("liquidacion", "first"),
                               f2=("liquidacion", "last"),
                               d1=("dias", "first"),
                               d2=("dias", "last"))
par["carry"] = np.log(par["f2"] / par["f1"]) / ((par["d2"] - par["d1"])
                                                 / 365)
anual = par.groupby(par.index.year)["carry"]
pd.DataFrame({"contango_pct_dias": 100 * anual.apply(lambda x:
                                                     (x > 0).mean()),
              "carry_medio_pct": 100 * anual.mean()}).round(1)
```
```output
       contango_pct_dias  carry_medio_pct
fecha
2019                62.7              0.2
2020                 0.0             -1.4
2021                 0.0             -1.4
2022                62.5              0.7
2023               100.0              3.5
2024               100.0              3.5
2025               100.0              2.7
```

Todo 2020 y 2021 en backwardation, con un carry medio del −1,4 % anual: los tipos estaban casi a cero y el dividendo
del índice pesaba más. Todo 2023, 2024 y 2025 en contango, con un carry de 2,7 a 3,5 puntos al año. 2019 y 2022 son
años de transición, con un 63 % de las sesiones en contango.

¿Qué cambia para un inversor? Quien mantiene una posición larga en futuros y la renueva cada trimestre vende el
contrato que vence (cerca del contado) y compra el siguiente (más caro en contango). Ese «coste del roll» no es una
pérdida extra: es el mismo coste de mantenimiento que la base va consumiendo, y lo compensa el interés del efectivo
que no se ha invertido. Comparar la rentabilidad de un futuro con la del índice sin sumar ese interés hace parecer que
el futuro rinde peor de lo que rinde.

## El roll: cuándo se mueve la liquidez

Unos días antes del vencimiento, la mayoría de las posiciones se trasladan al contrato siguiente: se cierra el cercano
y se abre el siguiente, a menudo con una sola orden de *spread* de calendario. El volumen y el interés abierto migran:

```python
roll = fut[fut["contrato"].isin(["FIXM25", "FIXU25"])
           & fut["fecha"].between("2025-06-05", "2025-06-23")]
tabla = roll.pivot(index="fecha", columns="contrato",
                   values="interes_abierto")
cruce = tabla[tabla["FIXU25"] > tabla["FIXM25"]].index[0]
print("El siguiente supera al cercano el", cruce.date())
tabla
```
```output
El siguiente supera al cercano el 2025-06-13
contrato      FIXM25    FIXU25
fecha
2025-06-05  778177.0   34906.0
2025-06-06  764556.0   49050.0
2025-06-09  734660.0   79671.0
2025-06-10  672936.0  141139.0
2025-06-11  563376.0  247645.0
2025-06-12  413715.0  393825.0
2025-06-13  263789.0  540829.0
2025-06-16  153647.0  648266.0
2025-06-17   90019.0  709669.0
2025-06-18   58420.0  741939.0
2025-06-20   44111.0  763316.0
2025-06-23       NaN  805582.0
```

*Fig. — El roll de junio de 2025: interés abierto (arriba) y volumen (abajo) del contrato que vence, FIXM25, y del siguiente, FIXU25.* Dos paneles diarios del 27 de mayo al 27 de junio de 2025. Arriba, el interés abierto del FIXM25 se mantiene cerca de 780 mil contratos hasta el 6 de junio y cae hasta 44 mil el día del vencimiento, el 20; el del FIXU25 sube desde 25 mil y lo supera el 13 de junio, destacado, con 541 mil. Abajo, el volumen del FIXM25 domina hasta el 11 de junio y el del FIXU25 se dispara desde el 12, con un máximo de 807 mil el día 13.

El 5 de junio, el FIXM25 tiene 778.177 contratos abiertos y el FIXU25, 34.906. Una semana después se cruzan: el 12 de
junio casi se igualan (413.715 frente a 393.825) y el viernes 13 el de septiembre ya tiene más interés abierto. Ese
mismo día el volumen del FIXU25 se dispara (807.106 contratos): es el día de más actividad del roll. El 20 de junio, el
día del vencimiento, al FIXM25 le quedan 44.111 contratos, un 6 % del máximo, que se liquidan en efectivo al cierre del
índice.

Para un sistema de trading, esto tiene dos consecuencias. Primera, quien opera el cercano durante la semana del roll
lo hace en un contrato que se vacía: las horquillas se abren y el coste sube. Segunda, para tener una serie larga hay
que encadenar contratos, y la regla para saltar de uno a otro (por fecha, por volumen, por interés abierto) y cómo se
corrige el salto de precio entre ellos son decisiones que cambian los resultados de un backtest. Esa construcción es la
lección 1.4.6.

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

Pegar sin más los precios del contrato cercano de cada día produce una serie con un salto en cada roll: la base del
contrato nuevo frente a la del viejo. En contango, la serie sube artificialmente en cada roll; en backwardation, baja.
Un indicador o un stop calculado sobre esa serie ve movimientos que nadie ha ganado ni perdido.

</aside>

## Lo que esto cambia en tus datos

- **El precio de un futuro es un precio de liquidación.** El dato diario estándar no es el último cruce, sino el
  precio que fija la cámara. Para comparar con el índice hay que saber a qué hora y cómo se calcula cada uno.
- **El tamaño se mide en nominal.** Un contrato de FIX son unos 300.000 USD; el margen es una garantía, no el riesgo.
- **El efectivo de reserva es parte de la estrategia.** Las llamadas de margen ocurren en los días malos y pueden
  sumar varias veces el margen inicial.
- **La base no es rentabilidad.** Futuro e índice difieren en el coste de mantenimiento; la rentabilidad de un futuro
  se compara con la del índice menos el tipo de interés, no con la del índice a secas.
- **Las series continuas se construyen.** No existe «el precio del futuro» de diez años: existe una regla de roll y
  un ajuste (lección 1.4.6).

## Ejercicios

1. Repite la simulación de la cuenta de margen para un **corto** en el FIXH25 desde el 16 de diciembre de 2024. ¿Cuántas
   llamadas de margen recibe y cuánto efectivo acumula la cuenta al vencimiento?

**Solución.**

```python
corto = cuenta_margen(h25.loc["2024-12-16":], lado=-1)
print("Llamadas de margen:", (corto["aporte"] > 0).sum())
print(f"Aportado: {corto['aporte'].sum():,.2f} USD")
print(f"Resultado: {corto['pyg'].sum():,.2f} USD")
print(f"Saldo final: {corto['saldo'].iloc[-1]:,.2f} USD")
```
```output
Llamadas de margen: 5
Aportado: 9,987.50 USD
Resultado: 65,332.50 USD
Saldo final: 91,820.00 USD
```

El corto gana exactamente lo que pierde el largo, 65.332,50 USD, y termina con 91.820 USD en la cuenta. Pero el camino
no es cómodo: recibe 5 llamadas de margen, por 9.987,50 USD: cuatro en la segunda quincena de diciembre de 2024 y una el
19 de febrero de 2025, días en que el índice sube. Un futuro es un juego de suma cero entre comprador y vendedor antes
de costes; la cámara solo traslada el efectivo de uno a otro cada día.

2. Para cada vencimiento de 2024, encuentra el primer día en que el interés abierto del contrato siguiente supera al
   del que vence. ¿Cuántas sesiones antes del vencimiento ocurre?

**Solución.**

```python
oi = fut.pivot(index="fecha", columns="contrato",
               values="interes_abierto")
sesiones = indice.index
pares = [("FIXH24", "FIXM24"), ("FIXM24", "FIXU24"),
         ("FIXU24", "FIXZ24"), ("FIXZ24", "FIXH25")]
for viejo, nuevo in pares:
    v = fut.loc[fut["contrato"] == viejo, "vencimiento"].iloc[0]
    x = oi[[viejo, nuevo]].dropna()
    x = x[x.index > v - pd.Timedelta(days=30)]  # el último mes
    dia_cruce = x[x[nuevo] > x[viejo]].index[0]
    antes = ((sesiones > dia_cruce) & (sesiones <= v)).sum()
    print(viejo, "->", nuevo, dia_cruce.date(), f"({antes} sesiones)")
```
```output
FIXH24 -> FIXM24 2024-03-11 (4 sesiones)
FIXM24 -> FIXU24 2024-06-14 (4 sesiones)
FIXU24 -> FIXZ24 2024-09-16 (4 sesiones)
FIXZ24 -> FIXH25 2024-12-16 (4 sesiones)
```

En los cuatro rolls de 2024 el cruce ocurre a cuatro sesiones del vencimiento (contando el propio día del
vencimiento), en la semana anterior. Una regla de roll «por interés abierto» cambiaría de contrato esos días; una regla
«por fecha fija», por ejemplo ocho sesiones antes, lo haría antes, cuando el contrato nuevo aún tiene menos liquidez.
El filtro del último mes hace falta: cuando el contrato nuevo empieza a cotizar, nueve meses antes, los dos son
lejanos y su interés abierto, pequeño, puede cruzarse por casualidad.

3. Un compañero dice que los ETF sobre futuros de índices «pierden dinero en cada roll por el contango». Explica qué
   parte de la frase es correcta y qué falta.

**Solución.**

Es cierto que en contango el contrato nuevo cuesta más que el que vence, y que el precio de un futuro largo «baja»
hacia el contado a medida que se acerca el vencimiento. Lo que falta es que ese contango es, en un futuro financiero,
el coste de mantenimiento: el tipo de interés menos el dividendo. Quien compra el futuro en lugar del índice no
desembolsa el nominal y cobra intereses por ese efectivo, que compensan la base. Si se suma el interés del efectivo
(como hace un ETF bien gestionado), la rentabilidad se parece a la del índice de rentabilidad total, menos costes. En
materias primas, donde la estructura temporal refleja almacenamiento y expectativas, el roll sí puede costar mucho más
que el interés.

## Autoevaluación

1. El futuro FIX cotiza a 6.400 puntos con un multiplicador de 50 USD y un tick de 0,25. ¿Cuánto gana o pierde un contrato por cada tick y cuál es su nominal?

   - A. 0,25 USD por tick; nominal de 6.400 USD
   - B. 12,50 USD por tick; nominal de 320.000 USD
   - C. 50 USD por tick; nominal de 320.000 USD
   - D. 12,50 USD por tick; nominal de 16.500 USD

   *Respuesta B: 12,50 USD por tick; nominal de 320.000 USD.* Valor del tick = 0,25 × 50 = 12,50 USD; nominal = 6.400 × 50 = 320.000 USD. Los 16.500 USD son el margen inicial: lo que se deposita, no lo que se controla.

2. Una cuenta tiene un margen inicial de 16.500 USD y uno de mantenimiento de 15.000. Tras una pérdida diaria, el saldo queda en 14.200 USD. ¿Qué ocurre?

   - A. Nada: todavía hay saldo positivo
   - B. Llamada de margen: hay que aportar 800 USD para volver al mantenimiento
   - C. Llamada de margen: hay que aportar 2.300 USD para volver al margen inicial
   - D. La posición se cierra automáticamente

   *Respuesta C: Llamada de margen: hay que aportar 2.300 USD para volver al margen inicial.* Al caer por debajo del mantenimiento, la cuenta tiene que volver al margen inicial: 16.500 − 14.200 = 2.300 USD. Si no se aporta a tiempo, el bróker puede cerrar la posición.

3. Con un tipo de interés del 4,35 % y un rendimiento por dividendo del índice del 1,35 %, ¿qué estructura temporal se espera en los futuros sobre ese índice?

   - A. Backwardation: los vencimientos lejanos más baratos
   - B. Contango: los vencimientos lejanos más caros, en torno a un 3 % anual por encima del contado
   - C. Plana: todos los vencimientos al mismo precio
   - D. No se puede saber sin conocer la opinión del mercado

   *Respuesta B: Contango: los vencimientos lejanos más caros, en torno a un 3 % anual por encima del contado.* Por no arbitraje, F = S·e^((r−q)τ). Con r − q = 3 %, cada vencimiento cotiza aproximadamente un 3 % anual por encima del contado. En un futuro financiero la curva la fija el coste de mantenimiento, no una previsión.

4. ¿Qué pasa con la base (futuro − contado) el día del vencimiento?

   - A. Es igual al dividendo pendiente
   - B. Vale cero: el precio de liquidación final se fija con el propio índice
   - C. Es igual al margen inicial
   - D. Depende del volumen de ese día

   *Respuesta B: Vale cero: el precio de liquidación final se fija con el propio índice.* En FIX, la liquidación final es el cierre del índice ese día, así que la base se anula. En los contratos reales cambia la referencia (la cotización especial de apertura en el E-mini S&P 500, una media del IBEX 35 entre las 16:15 y las 16:45 en MEFF), pero la idea es la misma.

5. En la semana del roll de junio de 2025, el interés abierto del FIXU25 supera al del FIXM25 el 13 de junio. ¿Por qué importa para un sistema de trading?

   - A. No importa: los dos contratos son el mismo activo
   - B. Porque a partir de ahí la liquidez está en el siguiente vencimiento: seguir en el cercano encarece la ejecución, y una serie continua tiene que decidir cuándo cambiar
   - C. Porque el contrato cercano deja de cotizar ese día
   - D. Porque el margen se duplica

   *Respuesta B: Porque a partir de ahí la liquidez está en el siguiente vencimiento: seguir en el cercano encarece la ejecución, y una serie continua tiene que decidir cuándo cambiar.* El cercano sigue cotizando hasta el vencimiento (20 de junio), pero con cada vez menos interés abierto. El momento y la forma de pasar de un contrato a otro es la decisión central de una serie continua (lección 1.4.6).

## Ideas clave

- El contrato fija todo salvo el precio: subyacente, multiplicador, tick, meses, último día y forma de liquidación. En FIX, 50 USD por punto y 12,50 USD por tick: un nominal de más de 300.000 USD con 16.500 de margen.
- La liquidación diaria convierte cada movimiento en efectivo. Un largo en el FIXH25 desde mediados de diciembre de 2024 perdió 65.332 USD hasta el vencimiento y recibió 12 llamadas de margen: el margen inicial no es la pérdida máxima.
- En un futuro financiero, F = S·e^((r−q)τ): la base es el coste de mantenimiento y se anula al vencimiento.
- Contango (lejanos más caros) cuando el tipo supera al dividendo; backwardation cuando no. En FIX, backwardation todo 2020 y 2021, con tipos casi a cero; contango desde 2023.
- En las ~8 sesiones antes del vencimiento, el volumen y el interés abierto pasan al contrato siguiente. Quién hace el roll y cuándo condiciona cualquier serie continua.

## Recursos

### Research

- [Estacionalidad en Python. Buscando Patrones Intradia](https://pythonparatrading.com/estacionalidad-intradia-preprocesado/) · Research-0024 · 9 min

### Documentación

- [CME Rulebook, capítulo 358: E-mini S&P 500 (unidad de 50 USD por punto, tick de 0,25 = 12,50 USD, liquidación final)](https://www.cmegroup.com/rulebook/CME/IV/350/358/358.pdf) · cmegroup.com
- [MEFF: especificaciones del futuro sobre Mini IBEX 35](https://www.meff.es/esp/Derivados-Financieros/Futuros-sobre-Mini-IBEX35) · meff.es
- [MEFF: especificaciones del futuro sobre IBEX 35](https://www.meff.es/esp/Derivados-Financieros/Futuros-sobre-IBEX35) · meff.es

### Datos

- [Datos del nivel 1: liquidaciones de todos los contratos FIX (Parquet)](https://pythonparatrading.com/curso/datos/nivel-1/fix_contratos.parquet) · Descarga · fix_contratos.parquet
- [Datos del nivel 1: especificaciones del contrato FIX (CSV)](https://pythonparatrading.com/curso/datos/nivel-1/fix_especificaciones.csv) · Descarga · fix_especificaciones.csv

Lección anterior: [1.2.2 · ETFs: réplica, tracking error, apalancados y UCITS](https://pythonparatrading.com/curso-python-trading/nivel-1/etfs-replica-tracking-error-y-ucits/)

Lección siguiente: [1.2.4 · Forex: pares, pips, lotes, rollover y CFD](https://pythonparatrading.com/curso-python-trading/nivel-1/forex-pares-pips-lotes-y-rollover/)
