← Volver a los artículos
July 14, 2026
5 min de lectura

Almgren-Chriss sin rodeos: ejecución óptima que puedes implementar en una tarde

Almgren-Chriss sin rodeos: ejecución óptima que puedes implementar en una tarde
#ejecución
#almgren-chriss
#impacto de mercado
#ejecución óptima
#twap
#quant
#python
#cripto

Almgren y Chriss (2001), "Optimal execution of portfolio transactions" (Journal of Risk 3(2), 5–39), es probablemente el paper más citado en investigación de ejecución y uno de los peor implementados correctamente. La mayoría del código "Almgren-Chriss" que circula por ahí es en realidad un programador de TWAP con un bloque de comentarios. La mayoría de los artículos de blog sobre el tema se saltan la derivación, mencionan de pasada una función sinh y nunca tocan la parte que realmente importa en producción: de dónde salen los parámetros.

Este artículo lo hace completo. Los supuestos del modelo, expuestos con honestidad. La trayectoria de forma cerrada, derivada, no simplemente afirmada. La frontera eficiente y cómo elegir el parámetro de aversión al riesgo. Y la calibración de los tres insumos —impacto temporal η\eta, impacto permanente γ\gamma, volatilidad σ\sigma— a partir de datos del libro de órdenes y de operaciones de Binance, con código Python funcional y una discusión honesta de por qué el ajuste es ruidoso. Esta es la columna vertebral intelectual de todo lo demás en ejecución: TWAP, VWAP y POV son casos especiales o primos heurísticos (ver TWAP, VWAP, POV: los algoritmos de ejecución que todos usan), y los enfoques modernos de ML —programadores de aprendizaje por refuerzo y modelos neuronales de impacto— son intentos de relajar exactamente los supuestos que estamos a punto de escribir.

El planteamiento: qué asume realmente el modelo

Tienes XX unidades de un activo (digamos, 100 BTC) y debes liquidarlas por completo antes del tiempo TT. Divide [0,T][0, T] en NN intervalos de longitud τ=T/N\tau = T/N. Tu variable de decisión es la trayectoria de tenencias x0=X,x1,,xN=0x_0 = X, x_1, \dots, x_N = 0, con operaciones nk=xk1xkn_k = x_{k-1} - x_k ejecutadas en el intervalo kk.

Tres supuestos sostienen todo el modelo:

1. Caminata aleatoria aritmética. El precio no perturbado sigue

Sk=Sk1+στξkτg ⁣(nkτ),S_k = S_{k-1} + \sigma \sqrt{\tau}\, \xi_k - \tau\, g\!\left(\frac{n_k}{\tau}\right),

donde ξk\xi_k son normales estándar i.i.d. y σ\sigma es volatilidad absoluta (dólares por unidad de tiempo1/2^{1/2}, no porcentaje). Aritmética, no geométrica: a lo largo de unas pocas horas la diferencia es despreciable y la caminata aritmética mantiene el álgebra lineal-cuadrática. Sin deriva: Almgren y Chriss discuten el término de deriva, pero para una liquidación intradía tu estimación de alfa a lo largo de 4 horas es casi siempre ruido, y fijarla en cero es la postura honesta por defecto.

2. Impacto permanente lineal. g(v)=γvg(v) = \gamma v: operar a una tasa vv desplaza el precio de forma permanente, proporcional, y el desplazamiento nunca decae. Cada unidad que vendes empuja el mid hacia abajo en γ\gamma para siempre. Esto parece tosco, pero hay una razón profunda para mantenerlo lineal: Huberman y Stanzl (2004) demostraron que un impacto permanente no lineal en el tamaño de la operación admite estrategias de ida y vuelta con beneficio esperado positivo —manipulación de precios—. El impacto permanente lineal no es una simplificación por conveniencia; es la única elección libre de arbitraje dentro de esta clase de modelos.

3. Impacto temporal lineal. El precio que realmente recibes en el intervalo kk es

S~k=Sk1h ⁣(nkτ),h(v)=ϵsgn(v)+ηv.\tilde{S}_k = S_{k-1} - h\!\left(\frac{n_k}{\tau}\right), \qquad h(v) = \epsilon\, \mathrm{sgn}(v) + \eta v.

ϵ\epsilon captura la mitad del spread bid-ask más las comisiones; η\eta es la pendiente del costo marginal de demandar liquidez a la tasa vv. El impacto temporal afecta solo a tu propia ejecución y se desvanece instantáneamente: el libro se repone por completo antes de tu siguiente orden hija. Cada una de las tres palabras "lineal", "instantáneamente", "por completo" es incorrecta en mercados reales, y la última sección trata sobre cuán incorrecta. Pero primero, la recompensa por aceptarlas.

Costo y varianza de una trayectoria

Suma las ejecuciones, resta del mark inicial XS0X S_0, y obtienes el implementation shortfall. Su esperanza y varianza sobre el ruido ξk\xi_k son:

E[C]=12γX2permanente+ϵXspread+η~τk=1Nnk2temporal,V[C]=σ2τk=1Nxk2,E[C] = \underbrace{\tfrac{1}{2}\gamma X^2}_{\text{permanente}} + \underbrace{\epsilon X}_{\text{spread}} + \underbrace{\frac{\tilde{\eta}}{\tau} \sum_{k=1}^{N} n_k^2}_{\text{temporal}}, \qquad V[C] = \sigma^2 \tau \sum_{k=1}^{N} x_k^2,

con η~=η12γτ\tilde{\eta} = \eta - \tfrac{1}{2}\gamma\tau (una corrección de discretización que se desvanece cuando τ0\tau \to 0).

Dos observaciones que la mayoría de las implementaciones pasan por alto:

  • El costo permanente 12γX2\tfrac{1}{2}\gamma X^2 no depende de la trayectoria. Con impacto permanente lineal y sin decaimiento, pagas el mismo peaje permanente sin importar cómo programes la ejecución. La optimización es enteramente una pugna entre el término de costo temporal (que quiere una negociación lenta y uniforme; se minimiza con nk=X/Nn_k = X/N, es decir, TWAP) y el término de varianza (que quiere que tu inventario desaparezca ayer; se minimiza con liquidación inmediata).
  • El término de varianza está ponderado por inventario, no por operación. El riesgo se acumula sobre lo que aún tienes, xkx_k, no sobre lo que negocias. Por eso la urgencia carga el programa hacia el inicio.

La forma cerrada: sinh, cosh y el parámetro de urgencia

Almgren-Chriss minimizan el objetivo de media-varianza

U(x)=E[C]+λV[C],U(x) = E[C] + \lambda V[C],

donde λ0\lambda \geq 0 es la aversión al riesgo en unidades de 1/dólares. Fija U/xj=0\partial U / \partial x_j = 0 para los puntos interiores. El término temporal aporta diferencias segundas de xx, el término de varianza aporta el propio xjx_j, y obtienes una ecuación en diferencias lineal de segundo orden:

xj12xj+xj+1τ2=κ~2xj,κ~2=λσ2η~.\frac{x_{j-1} - 2x_j + x_{j+1}}{\tau^2} = \tilde{\kappa}^2 x_j, \qquad \tilde{\kappa}^2 = \frac{\lambda \sigma^2}{\tilde{\eta}}.

Este es el análogo discreto de x=κ2xx'' = \kappa^2 x, y con las condiciones de frontera x0=Xx_0 = X, xN=0x_N = 0 la solución es hiperbólica:

  xj=Xsinh ⁣(κ(Ttj))sinh(κT)  nj=2sinh(κτ/2)sinh(κT)cosh ⁣(κ(Ttj1/2))X,\boxed{\;x_j = X\, \frac{\sinh\!\big(\kappa\,(T - t_j)\big)}{\sinh(\kappa T)}\;} \qquad n_j = \frac{2\sinh(\kappa\tau/2)}{\sinh(\kappa T)}\, \cosh\!\big(\kappa (T - t_{j-1/2})\big)\, X,

donde κ\kappa resuelve 2τ2(cosh(κτ)1)=κ~2\tfrac{2}{\tau^2}\left(\cosh(\kappa\tau) - 1\right) = \tilde{\kappa}^2, que para τ\tau pequeño es simplemente κκ~=λσ2/η\kappa \approx \tilde{\kappa} = \sqrt{\lambda\sigma^2/\eta}.

Trayectorias óptimas de tenencias para distintos valores de kappa, desde la línea recta de TWAP hasta curvas agresivas cargadas al inicio

Todo lo relativo a la estrategia se comprime en un solo número:

κ=λσ2η[unidades: 1/tiempo].\kappa = \sqrt{\frac{\lambda \sigma^2}{\eta}} \qquad [\text{unidades: } 1/\text{tiempo}].

κ\kappa es la urgencia. Su recíproco θ=1/κ\theta = 1/\kappa es el tiempo característico de la operación: la escala temporal durante la cual vale la pena sostener el riesgo de inventario para ahorrar costo de impacto. Nótese lo que κ\kappa no depende: del tamaño de la orden XX ni del plazo TT. Que la escala temporal intrínseca de tu operación sea de 20 minutos o de 6 horas lo determinan únicamente la aversión al riesgo, la volatilidad y la liquidez. Si θT\theta \ll T, tu plazo es irrelevante: el modelo liquida según su propio calendario y la cola del horizonte queda sin usar. Si θT\theta \gg T, el plazo es vinculante y en la práctica estás haciendo TWAP.

El límite neutral al riesgo es TWAP — por eso existe TWAP

Toma λ0\lambda \to 0, de modo que κ0\kappa \to 0. Entonces sinh(z)z\sinh(z) \to z y

x(t)=Xsinh(κ(Tt))sinh(κT)    XTtT.x(t) = X\,\frac{\sinh(\kappa(T-t))}{\sinh(\kappa T)} \;\longrightarrow\; X\,\frac{T-t}{T}.

La trayectoria óptima degenera en la línea recta: cantidades iguales en intervalos de tiempo iguales. TWAP no es una heurística que resulta funcionar; es el óptimo exacto del modelo de Almgren-Chriss para un operador neutral al riesgo con impacto lineal. Cada vez que alguien ejecuta TWAP, está afirmando implícitamente λ=0\lambda = 0: "no me importa la varianza de mi shortfall, solo su media". Esa es una postura defendible para órdenes pequeñas y horizontes cortos. Es una postura extraña para liquidar el 5% del volumen diario en 8 horas en un activo con 4% de volatilidad diaria, que es exactamente donde la gente lo ejecuta de todos modos. El límite opuesto λ\lambda \to \infty da xj0x_j \to 0 para todo j>0j > 0: liquidar todo en el primer intervalo, pagar lo que cueste. Entre estos extremos, κT\kappa T interpola: κT0.5\kappa T \lesssim 0.5 es apenas distinguible de TWAP, κT3\kappa T \gtrsim 3 está agresivamente cargado al inicio.

La frontera eficiente de la ejecución

Para cada λ\lambda obtienes una trayectoria, un costo esperado E(λ)E(\lambda) y una varianza V(λ)V(\lambda). Recorrer λ[0,)\lambda \in [0, \infty) traza una curva en el plano (V,E)(V, E) —la frontera eficiente de la ejecución, en analogía directa con Markowitz—. Es convexa y decreciente: menos varianza siempre cuesta más shortfall esperado, con rendimientos marginales rápidamente decrecientes. En el punto de la frontera seleccionado por un λ\lambda dado, la aversión al riesgo es la pendiente (negativa) de la tangente: λ=E/V\lambda = -\partial E / \partial V.

Frontera eficiente de costo de ejecución frente a varianza con línea tangente que muestra lambda como la pendiente

La frontera reformula la pregunta "¿qué es λ\lambda?" —que nadie puede responder introspectivamente— en "¿qué compromiso entre costo y riesgo quiero?", que una mesa de trading sí puede responder. Tres formas prácticas de elegir el punto:

  1. Razonamiento de costo marginal. Recorre la frontera y pregunta: "moviéndome de este punto al siguiente, pago ΔE\Delta E dólares de costo esperado para eliminar Δstd\Delta\text{std} dólares de desviación estándar del shortfall; ¿acepto ese intercambio?" El codo de la frontera suele ser evidente dentro de un factor de 2, y la trayectoria es poco sensible a λ\lambda a esa resolución.
  2. Presupuesto de riesgo. Fija una desviación estándar de shortfall máxima aceptable (por ejemplo, "el 1-sigma a un día de la posición residual debe mantenerse por debajo de 15 pb del nocional") y toma la trayectoria más barata que la satisfaga. Es un problema restringido cuyo multiplicador de Lagrange es λ\lambda.
  3. Fijación del tiempo característico. Elige θ=1/κ\theta = 1/\kappa directamente ("esta orden debería tener una vida media de 90 minutos") y despeja λ=η/(σ2θ2)\lambda = \eta/(\sigma^2\theta^2). Esto es lo que la mayoría de los profesionales hacen implícitamente cuando fijan un control deslizante de "urgencia".

Un ejemplo resuelto con números que justificaremos en la sección de calibración. Vender X=100X = 100 BTC a S_0 = \100{,}000,horizonte, horizonte T = 4h,h,\sigma = $600porBTCporpor BTC por\sqrt{\text{h}}(alrededorde3(alrededor de 3% de volatilidad diaria),\eta = 1.0\ $\cdot\text{h}/\text{BTC},, \lambda = 10^{-6}\ $^{-1}$. Entonces

κ=106×3.6×1051.0=0.6 h1,κT=2.4,θ1.7 h.\kappa = \sqrt{\frac{10^{-6} \times 3.6\times 10^{5}}{1.0}} = 0.6\ \text{h}^{-1}, \qquad \kappa T = 2.4, \qquad \theta \approx 1.7\ \text{h}.

El programa óptimo vende 46.2 BTC en la primera hora (TWAP: 25). Costo temporal: \eta \int_0^T v(t)^2 dt \approx \3{,}290frenteafrente a$2{,}500paraTWAP.Desviacioˊnestaˊndardelshortfall:para TWAP. Desviación estándar del shortfall:$53{,}000frenteafrente a$69{,}300undefined10M, reduces el riesgo de shortfall en un 23%. Ese es todo el contenido del modelo en una frase: pone precio al seguro y te deja decidir si comprarlo.

La trayectoria en sí son diez líneas de Python:

import numpy as np

def almgren_chriss(X, T, N, sigma, eta, gamma, lam):
    """Optimal liquidation trajectory (discrete AC 2001)."""
    tau = T / N
    eta_t = eta - 0.5 * gamma * tau          # tilde-eta
    kappa_t2 = lam * sigma**2 / eta_t        # tilde-kappa^2
    kappa = np.arccosh(0.5 * kappa_t2 * tau**2 + 1) / tau
    t = np.arange(N + 1) * tau
    x = X * np.sinh(kappa * (T - t)) / np.sinh(kappa * T)
    n = x[:-1] - x[1:]                       # child order sizes
    E = 0.5 * gamma * X**2 + (eta_t / tau) * np.sum(n**2)
    V = sigma**2 * tau * np.sum(x[1:]**2)
    return x, n, E, V

x, n, E, V = almgren_chriss(X=100, T=4, N=48, sigma=600,
                            eta=1.0, gamma=0.3, lam=1e-6)
print(f"first-hour qty: {n[:12].sum():.1f} BTC, "
      f"E=${E:,.0f}, std=${np.sqrt(V):,.0f}")

Recorre lam sobre np.logspace(-8, -4, 50) y grafica EE frente a V\sqrt{V}: esa es tu frontera, y toda la superficie de decisión cabe en un gráfico que puedes entregar a un comité de riesgo.

Calibración: η\eta, γ\gamma, σ\sigma a partir de datos de Binance

Aquí es donde el 90% de las implementaciones mueren en silencio. La fórmula de la trayectoria es trivial; los parámetros no lo son. Tres magnitudes, tres problemas de estimación distintos.

Gráficos de dispersión de calibración de slippage frente a tasa de participación y cambio de precio frente a flujo neto de órdenes a partir de datos de Binance

σ\sigma: la fácil

Volatilidad absoluta por raíz de hora, a partir de retornos del precio mid. Usa velas de 1 minuto y escala; a muestreos más finos, el ruido de microestructura (bid-ask bounce) sesga al alza la varianza realizada. Esta estimación es sólida: la volatilidad es el único parámetro que acertarás.

η\eta: impacto temporal a partir del libro y de las operaciones

Dos rutas complementarias. Ruta A — recorrer el libro L2. A partir de capturas de profundidad, calcula el costo de un barrido hipotético marketable de tamaño qq: el VWAP de los niveles consumidos menos el mid. Ajustar cost(q)ϵ+ηinstq\text{cost}(q) \approx \epsilon + \eta_{\text{inst}}\, q da el impacto instantáneo por BTC. Para convertirlo en el η\eta basado en tasa del modelo debes asumir un tiempo de reposición del libro Δtr\Delta t_r (del orden de 10–60 s para BTCUSDT): operar a la tasa vv consume vΔtrv \Delta t_r por ciclo de refresco, así que ηηinstΔtr\eta \approx \eta_{\text{inst}} \Delta t_r. Ese supuesto —reposición instantánea y total en un reloj fijo— es exactamente la grieta por donde entra Obizhaeva-Wang; más sobre esto abajo. Ruta B — regresar el slippage realizado sobre la participación. Agrupa el flujo agresivo (taker) en bins de 1 minuto; para cada bin, regresa el VWAP del lado taker menos el mid de apertura contra la tasa de volumen taker. La Ruta B mide lo que el mercado realmente cobró a los agresores; la Ruta A mide lo que el libro en reposo cobraría en este momento. Cuando difieren por un factor de 3, confía en B para el nivel y en A para la forma intradía.

γ\gamma: impacto permanente vía regresión al estilo Kyle

Regresa los cambios del precio mid sobre el flujo neto taker con signo en ventanas de 5 minutos:

ΔS5m=γQnet+noise,Qnet=taker buystaker sells.\Delta S_{5m} = \gamma\, Q_{\text{net}} + \text{noise}, \qquad Q_{\text{net}} = \text{taker buys} - \text{taker sells}.

Luego verifica que el impacto no haya revertido una ventana después: el componente que no revierte es "permanente" en tu escala temporal de negociación. Esta es, con diferencia, la más ruidosa de las tres.

Código funcional, usando solo los endpoints REST públicos de Binance:

import requests, numpy as np, pandas as pd

B = "https://api.binance.com/api/v3"
sym = "BTCUSDT"

kl = requests.get(f"{B}/klines", params=dict(
    symbol=sym, interval="1m", limit=1000)).json()
close = np.array([float(k[4]) for k in kl])
sigma = np.diff(close).std() * np.sqrt(60)       # $/sqrt(h)

d = requests.get(f"{B}/depth",
                 params=dict(symbol=sym, limit=5000)).json()
bids = np.array(d["bids"], dtype=float)          # [price, qty]
mid = (bids[0, 0] + float(d["asks"][0][0])) / 2
cq = np.cumsum(bids[:, 1])                       # cum qty
cn = np.cumsum(bids[:, 0] * bids[:, 1])          # cum notional
sizes = np.linspace(0.5, 50, 40)                 # BTC probes
cost = [mid - np.interp(q, cq, cn) / q for q in sizes]
eps, eta_inst = np.polyfit(sizes, cost, 1)[::-1] # cost ~ eps + k*q
eta = eta_inst * (30 / 3600)                     # 30s refresh -> $*h/BTC

tr = requests.get(f"{B}/aggTrades",
                  params=dict(symbol=sym, limit=1000)).json()
df = pd.DataFrame(dict(
    t=[t["T"] for t in tr],
    p=[float(t["p"]) for t in tr],
    q=[float(t["q"]) * (-1 if t["m"] else 1) for t in tr]))
df["bin"] = df.t // 300_000                      # 5-min bins
g = df.groupby("bin").agg(dp=("p", lambda s: s.iloc[-1] - s.iloc[0]),
                          qn=("q", "sum"))
gamma = np.polyfit(g.qn, g.dp, 1)[0]             # $/BTC
print(f"sigma={sigma:.0f} $/sqrt(h)  eta={eta:.2f} $*h/BTC  "
      f"gamma={gamma:.3f} $/BTC")

Para producción, reemplaza la única página de aggTrades por varios días de los volcados históricos y ejecuta la regresión de γ\gamma sobre miles de bins, no un puñado.

Por qué la calibración en cripto es ruidosa, y qué hacer al respecto

Ejecuta la regresión de γ\gamma sobre datos reales y obtendrás un R2R^2 de unos pocos puntos porcentuales y un coeficiente que se mueve por un factor de 2–5 entre días. Esto no es un error en tu código. Las razones son estructurales:

  • Endogeneidad. El flujo responde al precio tanto como el precio responde al flujo. Los operadores de momentum compran porque el precio subió; una regresión OLS ingenua de retornos sobre flujo capta su reacción y se la atribuye al impacto. La solución limpia es usar tus propias ejecuciones (exógenas por construcción), que solo tienes después de haber operado un tiempo.
  • Concavidad. El impacto real es cóncavo en el tamaño —empíricamente cercano a raíz cuadrada (Almgren, Thum, Hauptmann y Li, 2005, "Direct estimation of equity market impact", encontraron un exponente cercano a 0.6; la misma concavidad es robusta en cripto). Ajustar una recta a una función cóncava hace que tu η\eta y γ\gamma dependan del rango de tamaños en la muestra. Calibra en las tasas de participación a las que realmente vas a operar.
  • Fragmentación y liderazgo de derivados. BTCUSDT spot en Binance es una plaza entre muchas, y el descubrimiento de precio ocurre con frecuencia en los perpetuos. Flujo que nunca ves mueve el precio sobre el que regresas, inflando el término de ruido.
  • Dependencia del régimen. El η\eta medido en la sesión asiática no describe la apertura de EE. UU.; el impacto aproximadamente se duplica cuando la volatilidad se duplica. Calibra por sesión y reajusta al menos semanalmente.

La gracia salvadora: la trayectoria es indulgente. κ1/η\kappa \propto \sqrt{1/\eta}, así que un error de factor 2 en η\eta mueve κ\kappa solo por 2\sqrt{2}, y la función de costo es plana cerca del óptimo. Acertar η\eta dentro de un factor de 2 y λ\lambda dentro de un orden de magnitud ya captura la mayor parte de la mejora disponible sobre TWAP. La precisión importa para las estimaciones de costo pre-trade; la robustez basta para la programación.

Dónde se rompe el modelo, y los papers que lo arreglan

Almgren-Chriss es un andamiaje, y saber exactamente qué viga es estructural te dice a qué extensión recurrir.

Impacto no lineal — Almgren (2003). "Optimal execution with nonlinear impact functions and trading-enhanced risk" (Applied Mathematical Finance 10, 1–18) rehace el programa con impacto temporal en ley de potencias h(v)=ηvαh(v) = \eta v^\alpha. Para el α1/2\alpha \approx 1/2 empíricamente favorecido —la ley de raíz cuadrada—, las trayectorias óptimas cambian de carácter: el impacto cóncavo penaliza menos las ráfagas que el impacto lineal, así que los programas óptimos se vuelven más cargados al inicio para el mismo λ\lambda. La estructura cualitativa (parámetro de urgencia, frontera eficiente) sobrevive; la fórmula sinh no.

Resiliencia y el LOB — Obizhaeva y Wang (2013). "Optimal trading strategy and supply/demand dynamics" (Journal of Financial Markets 16(1), 1–32; el working paper circuló desde 2005) reemplaza la dicotomía temporal/permanente por un libro de órdenes límite con profundidad finita e impacto que decae exponencialmente: tu operación consume el libro, y el libro se repone a una tasa de resiliencia ρ\rho. El supuesto de AC de que "el impacto temporal se desvanece instantáneamente" es el límite ρ\rho \to \infty. La estrategia óptima cambia de forma drásticamente: un bloque al inicio, un bloque al final, y una tasa de negociación constante entre medias; los bloques explotan la recuperación del libro. Si el intervalo de tu orden hija es comparable al tiempo de reposición de la plaza (en cripto, de segundos a un minuto —a menudo lo es—), estás en territorio de Obizhaeva-Wang, no de Almgren-Chriss, y el ajuste de Δtr\Delta t_r en la calibración de arriba es tu señal de advertencia.

No-arbitraje dinámico — Gatheral (2010). "No-dynamic-arbitrage and market impact" (Quantitative Finance 10(7), 749–759) pregunta qué combinaciones de función de impacto instantáneo f(v)f(v) y kernel de decaimiento G(t)G(t) son internamente consistentes, es decir, no admiten una estrategia de ida y vuelta con costo esperado negativo. Los resultados son tajantes: el decaimiento exponencial es compatible solo con impacto lineal —combinar decaimiento exponencial con impacto de raíz cuadrada permite que el modelo sea explotado mediante una secuencia de operaciones oscilante—; el impacto no lineal requiere decaimiento en ley de potencias, con una desigualdad que vincula ambos exponentes (para impacto vδ\sim v^\delta y decaimiento tγd\sim t^{-\gamma_d}, aproximadamente γd+δ1\gamma_d + \delta \geq 1). Este es el paper que hay que leer antes de acoplar un kernel de decaimiento sofisticado a tu modelo de impacto: la mayoría de las combinaciones ad hoc son secretamente arbitrables, lo que en la práctica significa que tu optimizador descubrirá el arbitraje y producirá programas oscilantes absurdos. Si tu trayectoria "óptima" alterna compras y ventas durante una liquidación pura, has violado a Gatheral, no descubierto alfa.

Las secuelas de ML. Dos hilos de esta serie se construyen directamente sobre este andamiaje. Primero, la ejecución con aprendizaje por refuerzo: una vez que admites que el impacto es no lineal, dependiente del estado y parcialmente observable, la forma cerrada desaparece, y el RL (desde el paper de Q-learning de Nevmyvaka, Feng y Kearns de 2006 en adelante) es una forma natural de explorar el espacio de trayectorias, pero todo agente de ejecución con RL serio se compara contra la solución de AC, y a menudo se inicializa a partir de ella. Segundo, los modelos neuronales de impacto de precio: reemplazar h(v)=ηvh(v) = \eta v por un funcional aprendido del estado del libro de órdenes, manteniendo por encima la lógica de programación de media-varianza. Ninguna de las dos secuelas tiene sentido sin conocer exactamente cuál es la línea base lineal-gaussiana y por qué tiene la forma que tiene.

Qué llevarse

El modelo son tres supuestos, una ecuación en diferencias y un número. Impacto permanente lineal (forzado por la ausencia de manipulación), impacto temporal lineal (una aproximación en torno a la cual calibras), ruido browniano aritmético. El óptimo pone en la balanza la varianza de inventario contra el costo de impacto, toda la estrategia colapsa en la urgencia κ=λσ2/η\kappa = \sqrt{\lambda\sigma^2/\eta}, y TWAP surge como el caso degenerado λ=0\lambda = 0, que es el hecho individual más útil del modelo, porque convierte "¿deberíamos hacer TWAP con esto?" de una cuestión de hábito en una afirmación verificable sobre aversión al riesgo. La calibración es el trabajo real: σ\sigma es fácil, η\eta es un juego de factor 2, γ\gamma es un proyecto de investigación, y la trayectoria perdona los tres. Impleméntalo en una tarde; dedica el resto del mes a los diagnósticos de la regresión.

Referencias

  • Almgren, R., Chriss, N. (2001). "Optimal execution of portfolio transactions." Journal of Risk, 3(2), 5–39.
  • Almgren, R. (2003). "Optimal execution with nonlinear impact functions and trading-enhanced risk." Applied Mathematical Finance, 10(1), 1–18.
  • Almgren, R., Thum, C., Hauptmann, E., Li, H. (2005). "Direct estimation of equity market impact." Risk, 18(7), 58–62.
  • Huberman, G., Stanzl, W. (2004). "Price manipulation and quasi-arbitrage." Econometrica, 72(4), 1247–1275.
  • Obizhaeva, A., Wang, J. (2013). "Optimal trading strategy and supply/demand dynamics." Journal of Financial Markets, 16(1), 1–32.
  • Gatheral, J. (2010). "No-dynamic-arbitrage and market impact." Quantitative Finance, 10(7), 749–759.
  • Nevmyvaka, Y., Feng, Y., Kearns, M. (2006). "Reinforcement learning for optimized trade execution." ICML 2006.
blog.disclaimer

Authors

Eugen Soloviov
Eugen Soloviov

Trading-systems engineer

Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.

Newsletter

Mantente a la vanguardia

Suscríbete a nuestro boletín para recibir información exclusiva sobre trading con IA, análisis de mercado y actualizaciones de la plataforma.

Respetamos tu privacidad. Puedes darte de baja en cualquier momento.