---
title: "3.7.1 Perpetuos: funding, mark price y liquidaciones"
description: "Funding reconstruido con la fórmula de Binance, índice y mark frente al último precio y motor de liquidación, con las horas de mecha de cuatro exchanges."
url: "https://pythonparatrading.com/curso-python-trading/nivel-3/perpetuos-funding-mark-price-y-liquidaciones/"
lang: "es"
image: "https://pythonparatrading.com/og/curso-python-trading/nivel-3/perpetuos-funding-mark-price-y-liquidaciones.png"
---

# 3.7.1 · Perpetuos: mecánica del funding, mark price y liquidaciones

> Un perpetuo tiene tres precios: el índice de los contados, el mark que calcula el exchange y el último precio del libro. El funding sale del primero y del tercero; la liquidación, del segundo. Esta lección reconstruye las tres piezas en cuatro exchanges sintéticos y mide qué pasa en las horas en que el último precio se descuelga del mark.

- Curso: [Nivel 3: Derivados: futuros, spreads, forex y opciones](https://pythonparatrading.com/curso-python-trading/nivel-3/)
- Módulo: 3.7 · Cripto derivados y estrategias específicas
- Duración: 70 min
- Requisitos: [1.2.6 · Cripto: spot, perpetuos, funding y custodia](https://pythonparatrading.com/curso-python-trading/nivel-1/cripto-spot-perpetuos-y-funding/), [2.3.7 · Estrategias específicas de cripto: momentum, arbitraje de funding y basis](https://pythonparatrading.com/curso-python-trading/nivel-2/estrategias-cripto-momentum-funding-y-basis/), [2.4.7 · Modelado de costes: comisiones, horquilla, impacto, financiación y préstamo de títulos](https://pythonparatrading.com/curso-python-trading/nivel-2/modelado-de-costes/)

## Al terminar esta lección

- Reconstruir el funding publicado con la fórmula de Binance (prima media, interés de 0,01 % por periodo, recorte de ±0,05 % y tope de cada exchange) y explicar de dónde sale la prima.
- Distinguir índice, mark y último precio, y explicar por qué el índice es una mediana de contados y el mark no sigue a una mecha breve del libro.
- Calcular el precio de liquidación y el de quiebra de una posición aislada a partir de la condición de mantenimiento, y describir la cascada fondo de seguro y ADL.
- Medir en barras de 1 hora cuántas posiciones apalancadas liquida el mark, cuántas liquidaría el último precio y cuántas se ven solo con cierres diarios.
- Recuperar desde los datos agregados la regla con la que el motor liquida el interés abierto en una caída.

## Tres precios para un contrato que no vence

La lección 1.2.6 presentó el perpetuo: un futuro sin vencimiento que se ancla al contado con pagos de funding cada
8 horas. La 2.3.7 midió su funding y el cash-and-carry que lo cobra. Esta baja un nivel, a la mecánica que decide
cuánto se paga y cuándo se cierra una posición a la fuerza, y para eso hace falta separar tres precios que en una
pantalla de trading parecen uno:

- **Índice.** Una media ponderada (o mediana) de los precios de contado de varios exchanges. No se negocia: lo
  calcula el exchange del perpetuo con fuentes externas.
- **Último precio.** El de la última operación en el libro del perpetuo. Es el que se ve en el gráfico de velas.
- **Mark.** Un precio de referencia que calcula el exchange a partir del índice y de la prima del perpetuo. Con él se
  valora el PnL no realizado y se decide la liquidación.

```mermaid
flowchart TB
  S1[Contado alfa] --> IX[Índice]
  S2[Contado boreal] --> IX
  S3[Contado cenit] --> IX
  LB[Libro del perp] --> UL[Último precio]
  LB --> PR[Prima]
  IX --> PR
  PR --> FU[Funding 8 h]
  IX --> MK[Mark]
  PR --> MK
  MK --> LQ[Liquidación]
  MK --> PN[PnL no realizado]
```

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

Los datos son **sintéticos**: dos activos ficticios, XBQ (imita a BTC) y XEQ (imita a ETH), en cuatro exchanges
ficticios, de 2020 a 2025. `alfa` imita a Binance, `boreal` a Deribit, `cenit` a BitMEX y `dedalo` a FTX, que quiebra
en noviembre de 2022 (lección 3.7.2). El funding sigue la fórmula publicada por Binance, con topes propios de cada
exchange; las mechas de liquidación, las dislocaciones entre exchanges y la regla del motor de liquidación están
plantadas con parámetros conocidos. Las normas de los exchanges reales salen de su documentación (en los recursos);
las cifras, de los datos.

</aside>

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

fu = pd.read_parquet("cripto3_funding.parquet")
cd = pd.read_parquet("cripto3_diario.parquet")
ex = pd.read_csv("cripto3_exchanges.csv")
print(fu.columns.tolist())
print(fu.groupby("exchange")["ts"].agg(["min", "max", "size"]))
print(ex.loc[ex["evento"] != "ficha", ["ts_utc", "evento"]]
      .to_string(index=False))
```
```output
['ts', 'exchange', 'activo', 'precio_indice', 'precio_mark', 'ultimo', 'prima_media', 'tasa_funding', 'interes_abierto_usd']
                               min                       max   size
exchange
alfa     2020-01-01 08:00:00+00:00 2025-12-31 16:00:00+00:00  13150
boreal   2020-01-01 08:00:00+00:00 2025-12-31 16:00:00+00:00  13150
cenit    2020-01-01 08:00:00+00:00 2025-12-31 16:00:00+00:00  13150
dedalo   2020-01-01 08:00:00+00:00 2022-11-11 08:00:00+00:00   6272
          ts_utc                evento
2022-11-06 00:00               rumores
2022-11-08 12:00 retiradas_suspendidas
2022-11-11 14:00      cese_negociacion
2022-11-11 23:00               quiebra
```

`cripto3_funding.parquet` tiene una fila por exchange, activo y periodo de 8 horas (00:00, 08:00 y 16:00 UTC): el
índice, el mark y el último precio en ese instante, la prima media del periodo, la tasa de funding y el interés
abierto. Son 13.150 filas por exchange (dos activos durante seis años) y 6.272 en `dedalo`, que deja de cotizar el 11
de noviembre de 2022.

El índice de los datos es la **mediana** de los contados disponibles; `dedalo` sale de él al suspender las retiradas.
Binance documenta un índice algo distinto, una media ponderada de varios exchanges, pero con la misma idea de fondo:
si una fuente se aleja más de un 3 % de la mediana de todas, su precio se recorta a 1,03 o 0,97 veces la mediana, y
una fuente que no se actualiza en cinco minutos pesa cero[^1]. El cierre diario permite comprobar por qué importa:

[^1]: Binance, «What Are Mark Price and Price Index in USDS-Margined Futures?»: índice como media ponderada de
contados de varios exchanges, recorte de los valores atípicos al ±3 % de la mediana (±1 % en algunos símbolos) y peso
cero para las fuentes sin actualizar en cinco minutos (enlace en los recursos).

```python
x = cd[cd["activo"] == "XBQ"]
sp = x.pivot(index="fecha", columns="exchange",
             values="cierre_spot")
abiertas = x.pivot(index="fecha", columns="exchange",
                   values="retiradas_abiertas")
cuentan = sp.where(abiertas == True)       # dedalo sale al suspender
indice = cuentan.median(axis=1)
media_4 = sp.mean(axis=1)                   # media ingenua, con dedalo
dias = ["2020-03-12", "2022-11-08", "2022-11-09", "2022-11-10",
        "2025-10-10"]
tabla = 100 * np.log(sp.loc[dias].div(indice[dias], axis=0))
tabla["media_4"] = 100 * np.log(media_4[dias] / indice[dias])
tabla.round(2)
```
```output
exchange    alfa  boreal  cenit  dedalo  media_4
fecha
2020-03-12 -0.03    0.03  -5.45    0.07    -1.32
2022-11-08  0.03   -0.01   0.00   -1.74    -0.42
2022-11-09 -0.00    0.01   0.00  -10.44    -2.51
2022-11-10  0.00   -0.03   0.04  -16.95    -3.97
2025-10-10 -3.96    0.00   0.08     NaN    -1.28
```

La tabla da, en %, la distancia de cada contado al índice al cierre (23:00 UTC) de cinco días. El 12 de marzo de 2020
el contado de `cenit` cotiza un 5,45 % por debajo de los demás (una dislocación plantada de cuatro horas); el 10 de
octubre de 2025, el de `alfa`, un 3,96 %. Del 8 al 10 de noviembre de 2022, `dedalo` se hunde hasta un 16,95 % de
descuento con las retiradas suspendidas: sus saldos ya no se pueden sacar y su precio deja de ser un precio de
mercado. La mediana no se entera de ninguno de los tres episodios. Una media simple de los contados se habría movido
un 1,32 %, un 3,97 % y un 1,28 %: con un índice así, una dislocación en un solo exchange movería el mark, el PnL y las
liquidaciones de todos los demás.

## El funding como lo calculan los datos

La fórmula del funding de los datos es la que publica Binance para sus perpetuos lineales, que la lección 1.2.6
reconstruyó para una sola moneda:

$$
F = P + \operatorname{clamp}(I - P,\ -0{,}05\,\%,\ 0{,}05\,\%)
$$

con $I = 0{,}01\,\%$ por periodo de 8 horas (un 0,03 % diario) y $P$ la prima media del periodo. Si $F > 0$ los
largos pagan a los cortos; si es negativo, al revés. Lo que la 1.2.6 no vio es de dónde sale $P$. Binance no mide la
prima con el último precio, que se puede mover con una sola operación pequeña, sino con **precios de impacto**: el
precio medio al que se ejecutaría un nocional fijo contra el libro, el *impact margin notional*, que es 200 USDT
divididos por el margen inicial al apalancamiento máximo[^2]. La prima de cada instante es

$$
P_t = \frac{\max(0,\ \text{impact bid} - \text{indice}) - \max(0,\ \text{indice} - \text{impact ask})}{\text{indice}}
$$

[^2]: Binance, «Introduction to Binance Futures Funding Rates»: prima con los precios de impacto, una muestra cada 5
segundos, media del periodo ponderada en el tiempo con pesos crecientes (1, 2, 3… n) sobre las 5.760 muestras de 8
horas, intervalo por defecto de 8 horas (00:00, 08:00 y 16:00 UTC), importe = nocional (mark × tamaño) × tasa, y
topes de ±0,75 veces la tasa de mantenimiento en los símbolos principales (±2 % en el resto). Los topes de los datos
son propios de cada exchange ficticio.

```python
# libro de ejemplo del perpetuo: (precio, cantidad en XBQ)
bids = [(64990, 0.15), (64985, 0.10), (64975, 0.20), (64960, 0.40)]
asks = [(65010, 0.12), (65020, 0.10), (65035, 0.25), (65050, 0.50)]
indice_ej = 64950.0
nocional_impacto = 200 / (1 / 125)   # 200 USDT / margen a 125x


def precio_impacto(niveles, nocional):
    """Precio medio de ejecutar `nocional` USDT contra el libro."""
    resto, coste, cant = nocional, 0.0, 0.0
    for p, q in niveles:
        tomo = min(q, resto / p)
        coste, cant = coste + tomo * p, cant + tomo
        resto -= tomo * p
        if resto <= 1e-9:
            return coste / cant
    raise ValueError("el libro no cubre el nocional de impacto")


ib = precio_impacto(bids, nocional_impacto)
ia = precio_impacto(asks, nocional_impacto)
prima = (max(0, ib - indice_ej) - max(0, indice_ej - ia)) / indice_ej
print(f"nocional de impacto: {nocional_impacto:,.0f} USDT")
print(f"impact bid {ib:,.2f}  impact ask {ia:,.2f}")
print(f"prima: {1e4 * prima:.2f} pb")
```
```output
nocional de impacto: 25,000 USDT
impact bid 64,983.45  impact ask 65,023.30
prima: 5.15 pb
```

Con un apalancamiento máximo de 125x (margen inicial del 0,8 %), el nocional de impacto es de 25.000 USDT. El
impact bid, lo que se cobraría por unidad vendiendo ese nocional, es 64.983,45, y queda por encima del índice: el
libro entero del perpetuo cotiza caro y la prima es de +5,15 puntos básicos. Si el índice estuviera entre el impact
bid y el impact ask, la prima sería cero, aunque el último precio se moviera: hace falta que el libro **entero** se
desplace, no una operación.

La media del periodo tampoco es simple: pesa más lo reciente, para que el funding reaccione antes a un cambio de la
prima al final del periodo.

```python
n = 5760                          # una muestra cada 5 s en 8 horas
p = np.full(n, 2e-4)              # 2 pb durante 7 horas…
p[-n // 8:] = 12e-4               # …y 12 pb en la última hora
w = np.arange(1, n + 1)
print(f"media simple: {1e4 * p.mean():.2f} pb")
print(f"media ponderada 1..n: {1e4 * (w * p).sum() / w.sum():.2f} pb")
```
```output
media simple: 3.25 pb
media ponderada 1..n: 4.34 pb
```

Una hora de prima a 12 puntos básicos tras siete a 2 da una media simple de 3,25 y una ponderada de 4,34. La
diferencia puede decidir si el periodo sale dentro o fuera de la banda en la que el funding es fijo. Los datos del
curso simplifican aquí: `prima_media` es la media simple de las ocho primas horarias del periodo. Con esa columna, la
regla se comprueba en los cuatro exchanges a la vez, cada uno con su tope:

```python
I, RECORTE = 0.0001, 0.0005
TOPE = {"alfa": 0.0075, "boreal": 0.005, "cenit": 0.00375,
        "dedalo": 0.005}
P = fu["prima_media"]
tope = fu["exchange"].map(TOPE)
calc = (P + (I - P).clip(-RECORTE, RECORTE)).clip(-tope, tope)
print("diferencia máxima:", (calc.round(6) - fu["tasa_funding"])
      .abs().max())
tasa = fu["tasa_funding"]
resumen = fu.assign(
    base=tasa == I, negativo=tasa < 0,
    en_tope=tasa.abs() >= tope - 1e-12,
).groupby(["exchange", "activo"]).agg(
    base_pct=("base", "mean"), neg_pct=("negativo", "mean"),
    minimo_pb=("tasa_funding", "min"),
    maximo_pb=("tasa_funding", "max"), en_tope=("en_tope", "sum"))
resumen[["base_pct", "neg_pct"]] *= 100
resumen[["minimo_pb", "maximo_pb"]] *= 1e4
resumen.round(1)
```
```output
diferencia máxima: 0.0
                 base_pct  neg_pct  minimo_pb  maximo_pb  en_tope
exchange activo
alfa     XBQ         77.6      5.6       -5.8       20.2        0
         XEQ         69.3      7.4       -6.5       29.2        0
boreal   XBQ         78.0      4.1       -5.2       22.2        0
         XEQ         70.7      5.7       -6.2       29.6        0
cenit    XBQ         75.8      8.2       -7.7       21.7        0
         XEQ         68.8      8.9       -7.5       28.5        0
dedalo   XBQ         70.3      3.9      -50.0       20.6        1
         XEQ         56.9      5.1      -50.0       29.8        2
```

Las 45.722 tasas coinciden con la fórmula sin error. La figura de la cabecera dibuja la regla con los periodos de
XBQ en `alfa`: mientras la prima media está entre −4 y +6 puntos básicos, el recorte no actúa y $P + (I - P)$ es
exactamente $I$; fuera de la banda, el funding es la prima menos 5 puntos básicos por arriba, o más 5 por abajo. El
77,6 % de los periodos de XBQ y el 69,3 % de los de XEQ pagan ese punto básico exacto. El 5,6 % y el 7,4 % son
negativos. `cenit` tiene más periodos negativos (8,2 % y 8,9 %) porque su perpetuo cotiza, de media, algo más barato.

Los topes solo actúan en `dedalo`: tres periodos tras la suspensión de retiradas, con la prima hundida, pagan el
mínimo de −0,50 %, −50 puntos básicos en ocho horas (lección 3.7.2). En los demás exchanges el funding no se acerca
a su tope; el máximo, entre 20 y 30 puntos básicos, llega en las semanas de euforia.

```python
alfa = fu[fu["exchange"] == "alfa"]
pagado = (100 * alfa.groupby(["activo", alfa["ts"].dt.year])
          ["tasa_funding"].sum()).unstack().round(1)
print("funding pagado por un largo, % del nominal:")
print(pagado.to_string())
xbq = alfa[alfa["activo"] == "XBQ"].set_index("ts")
print(f"asimetría del funding de XBQ: {xbq['tasa_funding'].skew():.1f}")
```
```output
funding pagado por un largo, % del nominal:
ts      2020  2021  2022  2023  2024  2025
activo
XBQ     25.6  24.4  10.4  11.8  11.2   9.7
XEQ     52.9  38.3  11.7  12.4  10.9   9.4
asimetría del funding de XBQ: 3.7
```

Un largo de XBQ en el perpetuo de `alfa` pagó un 25,6 % de su nominal en 2020 y un 24,4 % en 2021, y entre un 9,7 %
y un 11,8 % los años siguientes, cerca del suelo de casi un 11 % que fija el término $I$. En XEQ, un 52,9 % en 2020.
La distribución es muy asimétrica (3,7): casi siempre el punto básico de la banda, y de vez en cuando semanas de
funding muy alto. Ese 11 % del suelo no es un precio de mercado: es una convención de la fórmula, y es la razón de
que un largo apalancado en un perpetuo sea caro de mantener durante meses (lección 1.2.6) y de que el cash-and-carry
cobre algo incluso en calma (lección 3.7.2).

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

El funding se paga sobre el nocional al mark en el instante del pago, no sobre el nominal de entrada. Quien tiene la
posición abierta a las 00:00, 08:00 o 16:00 UTC paga o cobra el periodo entero, aunque la abriera un minuto antes;
quien la cierra un minuto antes, nada. En un backtest, el funding se aplica en esas horas exactas y con la posición
de ese instante.

</aside>

## Mark price: el precio que decide

Binance define el mark de sus perpetuos lineales como la mediana de tres precios[^3]: el índice ajustado por el
último funding en proporción al tiempo que falta para el siguiente pago (precio 1), el índice más la media móvil de
30 segundos de la diferencia entre el punto medio del libro y el índice (precio 2) y el último precio del contrato.
Una mediana de tres ignora el extremo, y la media de 30 segundos diluye lo que dura poco:

[^3]: Binance, «What Are Mark Price and Price Index in USDS-Margined Futures?»: mark = mediana(precio 1, precio 2,
precio del contrato); en condiciones extremas puede usar solo el precio 2. El mark se usa para las liquidaciones y el
PnL no realizado; el realizado, con los precios ejecutados.

```python
def mark_binance(indice, medio, ultimo, funding, horas_al_pago):
    """Mediana(P1, P2, último) con la media de 30 s de la base."""
    p1 = indice * (1 + funding * horas_al_pago / 8)
    base = pd.Series(medio - indice).rolling(30, min_periods=1).mean()
    p2 = indice + base.to_numpy()
    return np.median(np.vstack([p1, p2, ultimo]), axis=0)


ind = np.full(600, 100_000.0)                # 10 minutos, 1 por s
casos = [("mecha de 5 s", 5), ("dislocación de 5 min", 300)]
for nombre, dura in casos:
    medio = ind * 1.0002
    medio[120:120 + dura] *= 0.96            # el libro cae un 4 %
    ultimo = medio.copy()
    mk = mark_binance(ind, medio, ultimo, 0.0001, 4)
    print(f"{nombre}: último {100 * (ultimo.min() / 1e5 - 1):+.2f} %,"
          f" mark {100 * (mk.min() / 1e5 - 1):+.2f} %")
```
```output
mecha de 5 s: último -3.98 %, mark -0.65 %
dislocación de 5 min: último -3.98 %, mark -3.98 %
```

Con una caída del libro de cinco segundos, el último precio baja un 3,98 % y el mark, un 0,65 %: la media de 30
segundos solo recoge una sexta parte y la mediana descarta el extremo. Con una caída de cinco minutos, el mark baja
lo mismo que el último precio: la media ya la ha absorbido entera y dos de los tres precios coinciden. El mark
protege de las mechas, no de un libro que se desplaza de verdad. Contra eso solo protege el índice, que sale de
otros exchanges.

Los datos usan una versión más sencilla: mark = índice × (1 + prima suavizada), con la prima de cada hora promediada
con la de la hora anterior. Como parte del índice, una dislocación del contado y del perpetuo de un exchange mueve
su último precio y no su mark:

```python
fu["mark_indice_pb"] = 1e4 * np.log(fu["precio_mark"]
                                    / fu["precio_indice"])
fu["ultimo_mark_pb"] = 1e4 * np.log(fu["ultimo"] / fu["precio_mark"])
vivos = fu[fu["exchange"] != "dedalo"]
print(vivos.groupby("exchange")[["mark_indice_pb", "ultimo_mark_pb"]]
      .agg(["std", "min", "max"]).round(1))
peores = vivos.nsmallest(2, "ultimo_mark_pb")
print(peores[["ts", "exchange", "activo", "ultimo_mark_pb",
              "mark_indice_pb"]].round({"ultimo_mark_pb": 1,
                                        "mark_indice_pb": 1})
      .to_string(index=False))
```
```output
         mark_indice_pb             ultimo_mark_pb
                    std   min   max            std    min   max
exchange
alfa                5.8 -13.5  36.1            3.6  -19.2  16.9
boreal              5.8 -11.4  36.1            3.6  -16.7  17.4
cenit               5.8 -12.9  34.8            8.3 -660.8  16.5
                       ts exchange activo  ultimo_mark_pb  mark_indice_pb
2020-03-13 00:00:00+00:00    cenit    XEQ          -660.8            -4.5
2020-03-13 00:00:00+00:00    cenit    XBQ          -548.3            -5.3
```

En los tres exchanges que no quiebran, el mark se separa del índice con una desviación típica de 5,8 puntos básicos
y nunca más de 36: es la prima del perpetuo, la misma que paga el funding. El último precio se separa del mark algo
menos (3,6 puntos básicos de desviación en `alfa` y `boreal`), salvo en `cenit`, donde la desviación sube a 8,3 por un
solo instante: el 13 de marzo de 2020 a las 00:00, en plena dislocación, su último precio de XEQ está 660,8 puntos
básicos (un 6,6 %) por debajo del mark, y el mark, solo 4,5 por debajo del índice. Un largo de XEQ en `cenit` con 20x
habría visto en el gráfico una caída que liquida su posición; el motor, que mira el mark, no la liquida por eso.

## El motor de liquidación

Binance describe la condición de liquidación así: la posición se liquida cuando su colateral, el margen inicial más
el PnL realizado y el no realizado (al mark), cae por debajo del **margen de mantenimiento**[^4]. Para una posición
lineal aislada de cantidad $q$ abierta a $E$, con margen $q E / L$ y tasa de mantenimiento $m$, el mark de
liquidación de un largo sale de igualar colateral y mantenimiento:

$$
\frac{qE}{L} + q\,(M - E) = m\,q\,M \quad\Rightarrow\quad M_{liq} = E\,\frac{1 - 1/L}{1 - m}
$$

y el de un corto, $E\,(1 + 1/L)/(1 + m)$. El **precio de quiebra** es aquel en el que el colateral llega a cero:
$E\,(1 - 1/L)$ en el largo. Entre los dos queda el margen de mantenimiento, que es lo que tiene el motor para cerrar
la posición sin pérdidas para nadie.

[^4]: Binance, «Binance Futures Liquidation Protocols»: colateral = margen inicial + PnL realizado + PnL no realizado <
margen de mantenimiento; cancelación de órdenes abiertas; una orden IOC para reducir el déficit; tasa de liquidación
para Binance salvo que la posición quiebre; las posiciones quebradas pasan al fondo de seguro y, si no alcanza, al
desapalancamiento automático (ADL). La tasa de mantenimiento de cada exchange depende además del tamaño de la
posición, por tramos; la lección usa un 0,5 % fijo.

```python
def precio_liquidacion(entrada, apal, mmr=0.005, lado="largo"):
    """Margen aislado lineal: colateral = margen de mantenimiento.
    Sin comisiones ni funding; mmr = tasa de mantenimiento."""
    if lado == "largo":
        return entrada * (1 - 1 / apal) / (1 - mmr)
    return entrada * (1 + 1 / apal) / (1 + mmr)


filas = []
for L in (3, 5, 10, 20, 50, 100):
    filas.append({
        "apal": L,
        "liquidacion_pct": 100 * (precio_liquidacion(1, L) - 1),
        "aprox_1.2.6_pct": 100 * (-1 / L + 0.005),
        "quiebra_pct": -100 / L,
    })
pd.DataFrame(filas).set_index("apal").round(2)
```
```output
      liquidacion_pct  aprox_1.2.6_pct  quiebra_pct
apal
3              -33.00           -32.83       -33.33
5              -19.60           -19.50       -20.00
10              -9.55            -9.50       -10.00
20              -4.52            -4.50        -5.00
50              -1.51            -1.50        -2.00
100             -0.50            -0.50        -1.00
```

La aproximación de la lección 1.2.6, $E\,(1 - 1/L + m)$, es casi idéntica a la exacta: a 10x, −9,50 % frente a
−9,55 %. Lo que enseña la tabla es la estrechez del margen: a 10x la quiebra está a −10 % y la liquidación medio punto
antes; a 100x, la liquidación llega con una caída del 0,50 %, que XBQ hace muchas horas del año. La orden de
liquidación se ejecuta en un libro que, en ese momento, suele estar cayendo. Si sale mejor que el precio de quiebra,
el exchange cobra su tasa; si sale peor, la diferencia es una pérdida que alguien tiene que pagar:

```mermaid
flowchart TB
  A[Mark en P_liq] --> B[Cancela órdenes]
  B --> C[Orden IOC]
  C --> D{¿Se ejecuta?}
  D -- sí --> E[Tasa liquidación]
  D -- no --> F[Fondo de seguro]
  F --> G{¿Alcanza?}
  G -- no --> H[ADL]
```

El **fondo de seguro** absorbe las posiciones quebradas. Si no alcanza, el **ADL** cierra posiciones contrarias de
otros clientes, las que van ganando: en una caída violenta, quien estaba corto con beneficios puede ver su posición
cerrada sin haberlo pedido. Para una estrategia cubierta (lección 3.7.2), el ADL es un riesgo concreto: deja una pata
sin la otra. Con **margen cruzado**, en cambio, todo el saldo de la cuenta responde de todas las posiciones: aguanta
más, pero una posición mala puede llevarse el capital de las demás.

## Las horas de las mechas

El último precio y el mark se separan sobre todo en las caídas en cascada: las liquidaciones barren el libro, el
último precio marca un mínimo muy por debajo del resto del mercado durante segundos y vuelve. Las barras de 1 hora del
perpetuo de `alfa` traen los dos precios:

```python
h1 = pd.read_parquet("cripto3_1h.parquet")
b = h1[h1["activo"] == "XBQ"].set_index("ts")
ap_mark = b["mark_cierre"].shift(1)          # el mark de apertura
caida_ultimo = 100 * (b["minimo"] / b["apertura"] - 1)
caida_mark = 100 * (b["mark_minimo"] / ap_mark - 1)
mecha = 100 * np.log(b["mark_minimo"] / b["minimo"])
velas = pd.DataFrame({"caida_ultimo": caida_ultimo,
                      "caida_mark": caida_mark, "mecha": mecha})
print(f"horas con la mecha del último > 3 %: {(mecha > 3).sum()}"
      f" de {len(b)}")
velas[velas["mecha"] > 3].round(1)
```
```output
horas con la mecha del último > 3 %: 14 de 52608
                           caida_ultimo  caida_mark  mecha
ts
2020-03-12 10:00:00+00:00         -13.6        -9.5    4.6
2020-03-12 23:00:00+00:00         -18.7       -14.8    4.7
2020-03-13 02:00:00+00:00         -15.3       -11.3    4.6
2021-05-19 12:00:00+00:00         -17.0       -13.1    4.6
2021-05-19 13:00:00+00:00         -11.9        -7.7    4.6
2022-05-09 20:00:00+00:00         -11.0        -6.8    4.7
2022-06-13 03:00:00+00:00         -12.7        -8.6    4.6
2022-11-08 15:00:00+00:00         -11.9        -7.7    4.6
2022-11-09 19:00:00+00:00         -13.6        -9.5    4.6
2024-08-05 01:00:00+00:00         -12.7        -8.6    4.5
2025-10-10 21:00:00+00:00         -15.4       -11.4    4.6
2025-10-10 22:00:00+00:00          -0.2        -0.2    4.0
2025-10-10 23:00:00+00:00          -0.1        -0.1    4.0
2025-10-11 00:00:00+00:00          -0.1        -0.1    4.0
```

De 52.608 horas, solo 14 tienen el mínimo del último precio más de un 3 % por debajo del del mark. Once son las
velas plantadas: el mark cae entre un 6,8 % y un 14,8 % en la hora y el último precio, unos 4 puntos más. Las otras
tres, del 10 de octubre de 2025 a las 22:00 al día 11 a las 00:00, son otra cosa: la dislocación de `alfa`, con su
libro un 4 % por debajo del índice durante horas, sin apenas movimiento dentro de cada hora. Una mecha dura segundos;
una dislocación, horas. Es la misma diferencia que separaba los dos casos del mark de Binance.

*Fig. — Rango de cada hora del último precio y del mark del perpetuo XBQ de alfa el 8 de noviembre de 2022, y precio de liquidación de un largo 10x abierto a las 00:00.* Barras verticales hora a hora, una gruesa para el último precio y una fina para el mark. El precio sube hasta 22 400 por la mañana y cae a las 15:00 hasta un mark de 20 041. En esa hora, destacada, el último precio baja hasta 19 140, por debajo de la línea discontinua de liquidación del largo 10x (19 780); el mark no la toca, así que el largo no se liquida.

La figura sigue el 8 de noviembre de 2022 hora a hora. Un largo 10x abierto a las 00:00 a 21.868,1 tiene su
liquidación en 19.780 (la línea discontinua). A las 15:00 el mark cae hasta 20.041 y no la toca; el último precio
baja hasta 19.140 y la cruza. Con el último precio, el largo se habría liquidado; con el mark, sigue vivo. Para medir
cuánto cambia esto en general, un experimento: abrir cada día un largo a las 00:00 UTC y mantenerlo 24 horas, con
distintos apalancamientos, y contar cuántos días se liquida según el precio con el que se mire.

```python
b = b.assign(dia=b.index.floor("D"))
g = b.groupby("dia")
entrada = g["apertura"].first()
min_mark, min_ultimo = g["mark_minimo"].min(), g["minimo"].min()
cierre_dia = g["cierre"].last()
filas, solo_ultimo = [], {}
for L in (5, 10, 20, 50):
    pl = precio_liquidacion(entrada, L)
    por_mark, por_ultimo = min_mark <= pl, min_ultimo <= pl
    filas.append({"apal": L, "por_mark": por_mark.sum(),
                  "por_ultimo": por_ultimo.sum(),
                  "con_cierre_diario": (cierre_dia <= pl).sum()})
    solo_ultimo[L] = por_ultimo & ~por_mark
print(f"{len(entrada)} largos de un día, abiertos a las 00:00 UTC")
print(pd.DataFrame(filas).set_index("apal").to_string())
for L in (10, 20):
    print(f"{L}x, liquidado por el último y no por el mark:",
          [d.strftime("%Y-%m-%d") for d in
           solo_ultimo[L][solo_ultimo[L]].index])
```
```output
2192 largos de un día, abiertos a las 00:00 UTC
      por_mark  por_ultimo  con_cierre_diario
apal
5            2           2                  1
10          13          15                  9
20         195         210                103
50        1069        1117                571
10x, liquidado por el último y no por el mark: ['2022-11-08', '2024-08-05']
20x, liquidado por el último y no por el mark: ['2021-06-23', '2021-07-06', '2021-11-24', '2022-01-06', '2022-03-15', '2022-07-16', '2022-07-23', '2022-08-23', '2022-11-09', '2023-01-09', '2024-01-11', '2024-03-02', '2025-02-09', '2025-02-18', '2025-04-03', '2025-06-19']
```

Tres lecturas. Primera: el apalancamiento manda. A 5x, dos largos de un día de 2.192 se liquidan; a 10x, 13; a 20x,
195, uno de cada once días; a 50x, casi la mitad. Segunda: el último precio liquidaría algo más que el mark (15
frente a 13 a 10x), y a 10x los dos días de diferencia son exactamente dos de las velas plantadas, el 8 de noviembre
de 2022 y el 5 de agosto de 2024. A 20x la lista es más larga y de días corrientes: el mark de los datos es más suave
que el último precio en cualquier hora, no solo en las mechas. Tercera, la más importante para un backtest: **con
cierres diarios se ven 9 de las 13 liquidaciones a 10x y 103 de las 195 a 20x**. Los días que caen y se recuperan
antes del cierre liquidan igual, y en el cierre no dejan rastro.

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

Un backtest de una estrategia apalancada con perpetuos tiene que comprobar la liquidación con el mínimo (o el máximo)
**intradía del mark**, no con el cierre ni con el último precio de las velas, y aplicar la pérdida entera del margen
cuando ocurre. Si solo hay velas del último precio, su mínimo exagera algo las liquidaciones; si solo hay cierres,
las esconde. Lo primero es conservador; lo segundo, un error.

</aside>

## Liquidaciones agregadas: la cascada vista desde fuera

Los agregadores públicos publican las liquidaciones por hora, exchange y lado, sin el detalle de cada posición.
`cripto3_liquidaciones.parquet` imita ese formato (solo horas con al menos 250.000 USD):

```python
lq = pd.read_parquet("cripto3_liquidaciones.parquet")
dia = lq.set_index("ts")["importe_usd"].resample("D").sum() / 1e6
print(f"mediana diaria: {dia.median():,.0f} M USD")
print((dia.nlargest(5) / 1e3).round(2).to_string())
top = lq[lq["ts"].dt.floor("D") == dia.idxmax()]
print(top.groupby("lado")["importe_usd"].sum().div(1e9).round(2))
```
```output
mediana diaria: 63 M USD
ts
2025-10-10 00:00:00+00:00    3.08
2021-05-19 00:00:00+00:00    2.52
2025-02-13 00:00:00+00:00    1.57
2025-02-08 00:00:00+00:00    1.44
2022-05-09 00:00:00+00:00    1.28
lado
corto    0.13
largo    2.95
Name: importe_usd, dtype: float64
```

Un día normal liquida unos 63 millones de USD entre los cuatro exchanges; el peor, el 10 de octubre de 2025, 3.080
millones, el 96 % de largos (2,95 mil millones frente a 0,13 de cortos). Le siguen el 19 de mayo de 2021 y dos días
de febrero de 2025. Las cascadas son asimétricas porque el posicionamiento lo es: en los datos, la mayoría apalancada
suele estar larga, y la regla del motor liquida más cuando la prima del perpetuo es alta (euforia).

Esa regla está plantada: la fracción del interés abierto de largos que se liquida en una hora es
$\min(0{,}25;\ 1{,}5\,(c - 0{,}6\,\%)^{1{,}5} \times \text{carga})$, con $c$ la caída del mark en la hora y una carga
que sube con la prima. ¿Se puede recuperar con lo que vería alguien de fuera, las liquidaciones agregadas, el mark de
las velas y el interés abierto de cada 8 horas?

```python
lar = lq[(lq["exchange"] == "alfa") & (lq["activo"] == "XBQ")
         & (lq["lado"] == "largo")].set_index("ts")["importe_usd"]
oi = (fu[(fu["exchange"] == "alfa") & (fu["activo"] == "XBQ")]
      .set_index("ts")[["interes_abierto_usd", "prima_media"]]
      .reindex(b.index, method="ffill"))
caida = np.log(ap_mark / b["mark_minimo"])
d = pd.DataFrame({"caida": caida, "liq": lar.reindex(b.index),
                  "oi": oi["interes_abierto_usd"],
                  "prima": oi["prima_media"]}).dropna(
                      subset=["caida", "oi"])
d["liq"] = d["liq"].fillna(0)
d["tramo"] = pd.cut(100 * d["caida"], [0, 0.4, 0.6, 1, 2, 4, 30])
print(d.groupby("tramo", observed=True).agg(
    horas=("liq", "size"),
    con_liq_pct=("liq", lambda s: 100 * (s > 0).mean()),
    fraccion_pb=("liq", "sum")).assign(
        fraccion_pb=lambda t: 1e4 * t["fraccion_pb"]
        / d.groupby("tramo", observed=True)["oi"].sum()).round(2))
s = d[(d["liq"] > 0) & (d["caida"] > 0.008) & (d["prima"] < I)]
pend, cte = np.polyfit(np.log(s["caida"] - 0.006),
                       np.log(s["liq"] / s["oi"]), 1)
print(f"exponente {pend:.2f}, constante {np.exp(cte):.2f}"
      f" ({len(s)} horas)")
```
```output
             horas  con_liq_pct  fraccion_pb
tramo
(0.0, 0.4]   37590         0.00         0.00
(0.4, 0.6]    7695         0.00         0.00
(0.6, 1.0]    5191        62.72         1.12
(1.0, 2.0]    1836       100.00         9.90
(2.0, 4.0]     233       100.00        43.16
(4.0, 30.0]     33       100.00       210.21
exponente 1.47, constante 1.29 (2176 horas)
```

Por tramos de caída del mark, el umbral aparece solo: en las 45.285 horas con caídas de hasta el 0,6 % no hay
ninguna liquidación de largos en `alfa`. Entre el 0,6 % y el 1 %, el 62,7 % de las horas tiene liquidaciones (las
demás quedan por debajo del mínimo publicado de 250.000 USD) y se liquida 1,1 puntos básicos del interés abierto; con
caídas de más del 4 %, un 2,1 %. Una regresión en logaritmos sobre las horas con liquidaciones, caídas de más del
0,8 % y prima baja (carga cercana a 1) da un exponente de 1,47, frente al 1,5 plantado, y una constante de 1,29
frente a 1,5. La constante sale baja sobre todo por un detalle de los datos: el interés abierto publicado es el del
último fixing de 8 horas, anterior a la oleada y, por tanto, mayor que el de la hora; el cociente queda por debajo
del real.

*Fig. — Fracción del interés abierto de largos liquidada en cada hora frente a la caída del mark en esa hora (alfa, XBQ, 2020-2025), en escala logarítmica.* Nube de puntos en ejes logarítmicos. A la izquierda, una línea vertical destacada en una caída del 0,6 %: por debajo no hay liquidaciones. A partir de ahí la fracción liquidada sube con la caída, de milésimas de punto con caídas del 1 % a varios puntos con caídas de más del 5 %, alrededor de la regla plantada, dibujada en discontinua; los puntos quedan algo por debajo de ella.

La figura muestra la nube en escala logarítmica con la regla plantada en discontinua: nada a la izquierda del umbral
y una fracción que crece más deprisa que la caída. Esa convexidad es la cascada: cada liquidación vende en un libro
que ya cae, lo que hunde un poco más el mark y alcanza los precios de liquidación de los siguientes. El interés
abierto lo registra:

```python
a8 = (fu[(fu["exchange"] == "alfa") & (fu["activo"] == "XBQ")]
      .set_index("ts"))
tramo = a8.loc["2021-05-19 08:00":"2021-05-21 16:00"]
pd.DataFrame({
    "oi_millones_usd": tramo["interes_abierto_usd"] / 1e9 * 1e3,
    "indice": tramo["precio_indice"],
    "oi_miles_xbq": tramo["interes_abierto_usd"]
    / tramo["precio_indice"] / 1e3,
}).round(1)
```
```output
                           oi_millones_usd   indice  oi_miles_xbq
ts
2021-05-19 08:00:00+00:00           9555.1  53271.8         179.4
2021-05-19 16:00:00+00:00           7096.1  42586.7         166.6
2021-05-20 00:00:00+00:00           7011.7  43130.2         162.6
2021-05-20 08:00:00+00:00           7223.7  43444.3         166.3
2021-05-20 16:00:00+00:00           7159.9  43973.2         162.8
2021-05-21 00:00:00+00:00           7342.9  44368.9         165.5
2021-05-21 08:00:00+00:00           7324.8  44188.5         165.8
2021-05-21 16:00:00+00:00           7379.5  44977.8         164.1
```

Entre las 08:00 y las 16:00 del 19 de mayo de 2021, el interés abierto de XBQ en `alfa` cae de 9.555 a 7.096
millones de USD, un 25,7 %. Pero el índice cae un 20,1 % en el mismo intervalo, y el interés abierto en USD mezcla las
dos cosas: medido en monedas, pasa de 179,4 a 166,6 miles de XBQ, un 7,1 % menos. Es la parte de las posiciones que
se cerró, casi toda a la fuerza. Un indicador de «desapalancamiento» construido con el interés abierto en USD
confundiría una caída del precio con un cierre de posiciones.

## Lo que cambia en un backtest de perpetuos

- **Funding en sus horas.** Se paga a las 00:00, 08:00 y 16:00 UTC sobre el nocional al mark de ese instante, con la
  posición de ese instante. Otros exchanges usan otros horarios y otros topes, y Binance documenta que puede pasar
  algunos contratos a intervalos de 1 o 4 horas en momentos de volatilidad.
- **Prima con precios de impacto.** La prima que mueve el funding no es la del último precio: hace falta que el libro
  entero se desplace. Estimar el funding con la diferencia entre último precio e índice da una señal ruidosa.
- **Liquidación con el mark intradía.** Ni con el cierre, que esconde casi la mitad de las liquidaciones, ni con el
  último precio, que las exagera en las mechas. Y con la pérdida entera del margen, sin recuperación.
- **Índice de varios exchanges.** El mark y el PnL de un exchange dependen de los contados de otros; una dislocación
  local no se compensa con el mark, y una caída del índice liquida aunque el libro propio no se haya movido.
- **Interés abierto en monedas.** En USD mezcla precio y posiciones.
- **El exchange es contraparte.** Fondo de seguro, ADL y, en el extremo, la quiebra (lección 3.7.2).

## Ejercicios

1. Repite el experimento de los largos de un día con **cortos**: ¿cuántos liquida el mark y cuántos el último
   precio a 5x, 10x, 20x y 50x? ¿Por qué la diferencia entre los dos precios es menor que en los largos?

**Solución.**

```python
filas = []
for L in (5, 10, 20, 50):
    pl = precio_liquidacion(entrada, L, lado="corto")
    filas.append({"apal": L,
                  "por_mark": (g["mark_maximo"].max() >= pl).sum(),
                  "por_ultimo": (g["maximo"].max() >= pl).sum()})
pd.DataFrame(filas).set_index("apal")
```
```output
      por_mark  por_ultimo
apal
5            0           0
10          22          22
20         239         254
50        1191        1232
```

A 10x se liquidan 22 cortos con los dos precios; a 20x, 239 con el mark y 254 con el último, y a 50x, 1.191 y
1.232. Hay más cortos que largos liquidados a 10x y 20x porque en estos seis años XBQ sube mucho más de lo que cae.
La diferencia entre mark y último es menor en proporción porque las mechas plantadas son todas a la baja (cascadas de
liquidación de largos); hacia arriba, el último precio solo se separa del mark por la diferencia normal de rango de
cada hora.

2. Un largo de 1 XEQ en el perpetuo de `alfa`, abierto el primer periodo de 2021 con 3x de apalancamiento y
   mantenido todo el año. Calcula el funding pagado en USD como porcentaje del margen inicial y compáralo con la suma
   simple de las tasas. ¿Por qué no coinciden?

**Solución.**

```python
xeq = alfa[(alfa["activo"] == "XEQ")
           & (alfa["ts"].dt.year == 2021)].set_index("ts")
cantidad = 1.0                                  # 1 XEQ de nominal
pagos = cantidad * xeq["precio_mark"] * xeq["tasa_funding"]
nominal_ini = xeq["precio_mark"].iloc[0]
margen = nominal_ini / 3
print(f"pagos: {pagos.sum():,.1f} USD por XEQ; margen inicial "
      f"{margen:,.1f} USD ({100 * pagos.sum() / margen:.0f} %)")
print(f"suma simple de tasas: {100 * xeq['tasa_funding'].sum():.1f} %")
```
```output
pagos: 913.9 USD por XEQ; margen inicial 240.9 USD (379 %)
suma simple de tasas: 38.3 %
```

El largo paga 913,9 USD de funding en el año, un 379 % del margen inicial de 240,9 USD. La suma de tasas es del
38,3 %, que con 3x serían un 115 % del margen. La diferencia es el nocional: se paga sobre el mark de cada periodo, y
XEQ se multiplicó durante 2021, así que los pagos de la segunda mitad del año, con el precio varias veces más alto,
pesan mucho más que los de enero. Al mismo tiempo, la posición ganó por la subida del precio; el funding fue el coste
de mantenerla con apalancamiento en lugar de comprar el contado.

3. Tienes que cubrir una cartera de contado con un corto en el perpetuo y dudas entre margen aislado y cruzado en la
   pata corta. Explica qué ocurre en cada caso si XBQ sube un 50 % en una semana, y qué riesgo añade el ADL a la
   cobertura en una caída.

**Solución.**

Con margen aislado, la pata corta solo cuenta con su propio margen: con 3x, su liquidación está en torno a un +33 %
(la fórmula de la lección para cortos da +32,7 %), así que una subida del 50 % la cierra; la cartera de contado queda
sin cubrir justo después de la subida y la pérdida de la pata corta se cristaliza. Con margen cruzado, el saldo de la
cuenta respalda la posición y la liquidación llega más tarde, pero solo si ese saldo está en la misma cuenta y cuenta
como colateral (el contado no siempre cuenta, o cuenta con descuento); y una posición mala puede arrastrar a las
demás. En los dos casos la defensa es reponer margen a tiempo, por ejemplo vendiendo parte del contado para pasar
efectivo a la pata corta. El ADL actúa al revés: en una caída fuerte, con muchos largos quebrados y el fondo de
seguro agotado, el motor cierra posiciones ganadoras del otro lado, y un corto de cobertura es justo una de ellas. La
cartera de contado se queda sin cubrir en plena caída sin que nadie lo haya decidido.

## Autoevaluación

1. La prima media de un periodo de 8 horas es de +4 puntos básicos y el exchange usa la fórmula de Binance con un interés de 0,01 % por periodo. ¿Qué funding se paga?

   - A. +4 puntos básicos: el funding es la prima
   - B. +1 punto básico: la prima está dentro de la banda de −4 a +6 pb, y el recorte devuelve exactamente el interés
   - C. +5 puntos básicos: prima más interés
   - D. 0: la prima es menor que el recorte

   *Respuesta B: +1 punto básico: la prima está dentro de la banda de −4 a +6 pb, y el recorte devuelve exactamente el interés.* F = P + recorte(I − P, ±0,05 %). Con P = 0,04 % e I = 0,01 %, I − P = −0,03 %, que no supera el recorte; F = 0,04 % − 0,03 % = 0,01 %. En los datos, el 77,6 % de los periodos de XBQ en alfa pagan exactamente ese punto básico.

2. En el ejemplo de la lección, el libro del perpetuo cae un 4 % durante 5 segundos y vuelve. ¿Por qué el mark de Binance solo baja un 0,65 %?

   - A. Porque el mark usa el precio de cierre del día
   - B. Porque es la mediana del índice ajustado por funding, del índice más la media de 30 segundos de la base y del último precio: dos de los tres apenas se mueven en 5 segundos
   - C. Porque el exchange anula las operaciones de la mecha
   - D. Porque el mark se calcula cada 8 horas

   *Respuesta B: Porque es la mediana del índice ajustado por funding, del índice más la media de 30 segundos de la base y del último precio: dos de los tres apenas se mueven en 5 segundos.* La media de 30 segundos diluye 5 segundos de caída en una sexta parte, y la mediana de tres precios ignora el extremo. Si la caída del libro dura cinco minutos, la media de 30 segundos la recoge entera y el mark baja lo mismo que el último precio: solo el índice, hecho con contados de otros exchanges, protege de una dislocación sostenida.

3. Un largo 10x aislado con una tasa de mantenimiento del 0,5 %. ¿A qué distancia de la entrada se liquida y dónde está su precio de quiebra?

   - A. Se liquida a −10 % y quiebra a −20 %
   - B. Se liquida a −9,55 % y quiebra a −10 %: entre los dos queda el margen de mantenimiento con el que el motor cierra la posición
   - C. Se liquida a −0,5 % y quiebra a −10 %
   - D. Ambos a −10 %

   *Respuesta B: Se liquida a −9,55 % y quiebra a −10 %: entre los dos queda el margen de mantenimiento con el que el motor cierra la posición.* La liquidación llega cuando el colateral (margen más PnL al mark) iguala el margen de mantenimiento: M = E·(1 − 1/L)/(1 − mmr), un −9,55 %. El de quiebra, donde el colateral es cero, está a −1/L = −10 %. Si la orden de liquidación se ejecuta peor que el de quiebra, el hueco lo paga el fondo de seguro.

4. Con largos 10x de un día, el mark liquida 13 de 2.192 y el último precio liquidaría 15. ¿Qué tienen de particular los dos días de diferencia?

   - A. Son días sin datos
   - B. Son los de dos velas plantadas en las que el último precio marca un mínimo un 4,5 % por debajo del del mark: mechas de liquidaciones en cascada
   - C. Son fines de semana
   - D. Son días de funding negativo

   *Respuesta B: Son los de dos velas plantadas en las que el último precio marca un mínimo un 4,5 % por debajo del del mark: mechas de liquidaciones en cascada.* El 2022-11-08 y el 2024-08-05 tienen velas plantadas: el mark cae un 7,7 % y un 8,6 % en la hora y el último precio, un 11,9 % y un 12,7 %. A 10x, solo la mecha del último cruza el precio de liquidación. Por eso los exchanges liquidan con el mark.

5. Un backtest comprueba las liquidaciones de un largo 10x solo con el cierre de cada día. ¿Qué encuentra?

   - A. Las mismas que con datos horarios
   - B. Más, porque el cierre es más volátil
   - C. Menos: 9 de las 13 que liquida el mark hora a hora; en las otras cuatro el precio se recupera antes del cierre
   - D. Ninguna, porque el mercado cripto no cierra

   *Respuesta C: Menos: 9 de las 13 que liquida el mark hora a hora; en las otras cuatro el precio se recupera antes del cierre.* Una liquidación ocurre en el mínimo intradía del mark, no al cierre. Un día que cae un 12 % y cierra un 6 % abajo liquida el 10x y en el cierre no lo parece; con 20x la diferencia es de 195 frente a 103 días.

## Ideas clave

- El funding de los datos sigue la fórmula de Binance: F = P + recorte(0,01 % − P, ±0,05 %), con P la prima media de las 8 horas anteriores y el tope de cada exchange. Se reconstruye sin error en los cuatro exchanges.
- Mientras la prima está entre −4 y +6 puntos básicos, el funding vale exactamente 0,01 % (el 77,6 % de los periodos de XBQ en alfa): casi un 11 % anual que paga el largo en calma; en 2020 y 2021 pagó un 25,6 % y un 24,4 %.
- El índice es una mediana (o una media con topes) de los contados de varios exchanges: una dislocación del 5,45 % en cenit no lo mueve; una media ingenua de los cuatro contados se habría movido un 1,32 %.
- El mark decide la liquidación y el PnL no realizado. Un mark hecho con medias y medianas ignora una mecha de segundos, pero no una dislocación sostenida del propio libro: esa solo la absorbe el índice.
- Con margen aislado, la liquidación llega en E·(1 − 1/L)/(1 − mmr) y la quiebra en E·(1 − 1/L); el hueco entre ejecución y quiebra lo paga el fondo de seguro y, si no alcanza, el ADL.
- Las liquidaciones se miden con el mark intradía: los cierres diarios esconden casi la mitad. Desde fuera, las liquidaciones agregadas dejan ver la regla del motor: nada por debajo de un 0,6 % de caída y una fracción que crece con exponente ≈ 1,5.

## Recursos

### Research

- [Liquidez Order Book - Trading Liquidez Agregada](https://pythonparatrading.com/limit-order-book-y-liquidez-de-mercado/) · Research-0008 · 11 min

### Documentación

- [Binance: Introduction to Binance Futures Funding Rates (fórmula, prima de impacto, intervalos y topes)](https://www.binance.com/en/support/faq/introduction-to-binance-futures-funding-rates-360033525031) · binance.com
- [Binance: What Are Mark Price and Price Index in USDS-Margined Futures?](https://www.binance.com/en/support/faq/what-is-the-mark-price-and-price-index-360033525071) · binance.com
- [Binance Futures Liquidation Protocols (mantenimiento, fondo de seguro y ADL)](https://www.binance.com/en/support/faq/liquidation-protocols-360033525271) · binance.com
- [He, Manela, Ross y von Wachter: Fundamentals of Perpetual Futures (arXiv 2212.06888)](https://arxiv.org/abs/2212.06888) · arxiv.org

### Datos

- [Datos del nivel 3: funding, índice y mark cada 8 horas en cuatro exchanges (Parquet)](https://pythonparatrading.com/curso/datos/nivel-3/cripto3_funding.parquet) · Descarga · cripto3_funding.parquet
- [Datos del nivel 3: barras de 1 hora del perpetuo de alfa con último precio y mark (Parquet)](https://pythonparatrading.com/curso/datos/nivel-3/cripto3_1h.parquet) · Descarga · cripto3_1h.parquet
- [Datos del nivel 3: liquidaciones agregadas por hora, exchange y lado (Parquet)](https://pythonparatrading.com/curso/datos/nivel-3/cripto3_liquidaciones.parquet) · Descarga · cripto3_liquidaciones.parquet

Lección anterior: [3.6.4 · Backtesting de opciones: datos, fills y ajustes por eventos](https://pythonparatrading.com/curso-python-trading/nivel-3/backtesting-de-opciones/)

Lección siguiente: [3.7.2 · Arbitraje de funding, basis con futuros y arbitraje entre exchanges](https://pythonparatrading.com/curso-python-trading/nivel-3/arbitraje-de-funding-basis-y-entre-exchanges/)
