Lección 3.7.1 · 70 min

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.

Fig. — Funding de cada periodo de 8 horas frente a la prima media del perpetuo en alfa (XBQ, 2020-2025), en puntos básicos
Lecciones del nivel 3
  1. 3.1 · Futuros en profundidad

    1. 3.1.1 Contratos de futuros principales
    2. 3.1.2 Curva de futuros: base, cost of carry, contango y roll yield
    3. 3.1.3 Gestión del roll, márgenes, SPAN y apalancamiento implícito
    4. 3.1.4 Sistemas de futuros diversificados: el enfoque de Carver
  2. 3.2 · Spreads de futuros

    1. 3.2.1 Spreads de calendario, butterflies y condors
    2. 3.2.2 Spreads intercommodity: crack, spark y crush
    3. 3.2.3 Spreads de tipos y de índices: 2s10s, NOB, NQ/ES y Europa frente a EE. UU.
    4. 3.2.4 Ratios de cobertura: por nominal, por DV01 y por volatilidad
    5. 3.2.5 Datos y backtesting de spreads: cotizados, sintéticos y por patas
    6. 3.2.6 Estacionalidad de spreads: análisis multi-año, patrones y trampas
  3. 3.3 · Forex avanzado

    1. 3.3.1 Microestructura FX: OTC, ECN, last look y sesiones
    2. 3.3.2 Carry y riesgo de crash, momentum y value en divisas; cestas
    3. 3.3.3 Riesgo de divisa en carteras multi-moneda; ejecución vía OANDA, IBKR o MT5
  4. 3.4 · Teoría y valoración de opciones

    1. 3.4.1 Payoffs, paridad put-call y límites de arbitraje
    2. 3.4.2 Árboles binomiales, Black-Scholes-Merton, Black-76 y Monte Carlo
    3. 3.4.3 Griegas: delta, gamma, vega, theta, rho, vanna, volga y charm
    4. 3.4.4 Volatilidad implícita: Newton-Raphson, Brent, py_vollib y QuantLib
    5. 3.4.5 Sonrisa, skew y estructura temporal; superficie de volatilidad con SVI
    6. 3.4.6 Volatilidad realizada frente a implícita; prima de riesgo de volatilidad; VIX y VSTOXX
    7. 3.4.7 Modelos avanzados: Heston, SABR y volatilidad local
  5. 3.5 · Estructuras de opciones en Python

    1. 3.5.1 Estructuras direccionales y verticales: call, put, covered call, collar y spreads
    2. 3.5.2 Estructuras de volatilidad y rango: straddles, strangles, cóndores y mariposas
    3. 3.5.3 Calendarios, diagonales, ratios, backspreads, risk reversals y jade lizard
    4. 3.5.4 Herramienta propia: payoff, griegas agregadas y escenarios
    5. 3.5.5 Gestión: ajustes, roll, cierre anticipado, asignación temprana y pin risk
  6. 3.6 · Estrategias sistemáticas de volatilidad y opciones

    1. 3.6.1 Venta sistemática de prima: put-write, strangles y su riesgo de cola
    2. 3.6.2 Delta hedging, gamma scalping y dispersión
    3. 3.6.3 Estrategias con VIX y VSTOXX: futuros y ETP de volatilidad
    4. 3.6.4 Backtesting de opciones: datos, fills y ajustes por eventos
  7. 3.7 · Cripto derivados y estrategias específicas

    1. 3.7.1 Perpetuos: mecánica del funding, mark price y liquidaciones
    2. 3.7.2 Arbitraje de funding, basis con futuros y arbitraje entre exchanges
    3. 3.7.3 Opciones cripto, datos on-chain y DeFi
    4. 3.7.4 ccxt para operar en varios exchanges
    5. 3.7.5 MiCA: el marco de la UE para criptoactivos y sus proveedores (CASP)

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.
Contado alfaÍndiceContado borealContado cenitLibro del perpÚltimo precioPrimaFunding 8 hMarkLiquidaciónPnL no realizado
Fuente 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]
IN [01]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))
OUT [01]Cuatro exchanges, dos activos
['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 cero1Nota 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).. El cierre diario permite comprobar por qué importa:

IN [02]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)
OUT [02]El índice: mediana de los contados que cuentan
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+clamp⁡(I−P, −0,05 %, 0,05 %)F = P + \operatorname{clamp}(I - P,\ -0{,}05\,\%,\ 0{,}05\,\%)

con I=0,01 %I = 0{,}01\,\% por periodo de 8 horas (un 0,03 % diario) y PP la prima media del periodo. Si F>0F > 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 PP. 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áximo2Nota 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.. La prima de cada instante es

Pt=max⁡(0, impact bid−indice)−max⁡(0, indice−impact ask)indiceP_t = \frac{\max(0,\ \text{impact bid} - \text{indice}) - \max(0,\ \text{indice} - \text{impact ask})}{\text{indice}}
IN [03]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")
OUT [03]La prima de un perpetuo con precios de impacto
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.

IN [04]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")
OUT [04]Media simple frente a media con pesos crecientes
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:

IN [05]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)
OUT [05]El funding publicado, reconstruido en los cuatro exchanges
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)P + (I - P) es exactamente II; 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.

IN [06]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}")
OUT [06]Lo que paga un largo del perpetuo cada año
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 II. 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).

Mark price: el precio que decide

Binance define el mark de sus perpetuos lineales como la mediana de tres precios3Nota 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.: 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:

IN [07]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} %")
OUT [07]El mark de Binance ante una mecha y ante una dislocación
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:

IN [08]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))
OUT [08]Mark, índice y último precio en los datos
         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 mantenimiento4Nota 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.. Para una posición lineal aislada de cantidad qq abierta a EE, con margen qE/Lq E / L y tasa de mantenimiento mm, el mark de liquidación de un largo sale de igualar colateral y mantenimiento:

qEL+q (M−E)=m q M⇒Mliq=E 1−1/L1−m\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)E\,(1 + 1/L)/(1 + m). El precio de quiebra es aquel en el que el colateral llega a cero: E (1−1/L)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.

IN [09]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)
OUT [09]Precio de liquidación y de quiebra de un largo aislado
      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)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:

sínonoMark en P_liqCancela órdenesOrden IOC¿Se ejecuta?Tasa liquidaciónFondo de seguro¿Alcanza?ADL
Fuente 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:

IN [10]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)
OUT [10]Las horas de las mechas
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

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.

IN [11]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])
OUT [11]Liquidado según con qué precio se mire
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.

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

IN [12]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))
OUT [12]Liquidaciones agregadas: los días de las cascadas
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×carga)\min(0{,}25;\ 1{,}5\,(c - 0{,}6\,\%)^{1{,}5} \times \text{carga}), con cc 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?

IN [13]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)")
OUT [13]La regla del motor, recuperada desde fuera
             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

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:

IN [14]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)
OUT [14]El interés abierto tras una oleada
                           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
IN [15]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")
OUT [15]Cortos liquidados por mark y por último
      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.

  1. 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
IN [16]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} %")
OUT [16]Funding de un largo 3x de XEQ en 2021
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.

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

Footnotes

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

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

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

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

Respuesta plegada en cada pregunta

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
    • D0: la prima es menor que el recorte
    Ver respuesta

    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 %?

    • APorque el mark usa el precio de cierre del día
    • BPorque 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
    • CPorque el exchange anula las operaciones de la mecha
    • DPorque el mark se calcula cada 8 horas
    Ver respuesta

    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?

    • ASe liquida a −10 % y quiebra a −20 %
    • BSe 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
    • CSe liquida a −0,5 % y quiebra a −10 %
    • DAmbos a −10 %
    Ver respuesta

    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?

    • ASon días sin datos
    • BSon 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
    • CSon fines de semana
    • DSon días de funding negativo
    Ver respuesta

    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?

    • ALas mismas que con datos horarios
    • BMás, porque el cierre es más volátil
    • CMenos: 9 de las 13 que liquida el mark hora a hora; en las otras cuatro el precio se recupera antes del cierre
    • DNinguna, porque el mercado cripto no cierra
    Ver respuesta

    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