Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

grid trading bots honestamente explicados

Un bot de grid trading compra en cada bajada y vende en cada subida dentro de un rango fijo. Vea la forma de mercado que paga el mecanismo y la que lo rompe.

Un bot de grid trading coloca una escalera de órdenes a intervalos de precio fijos: una de compra en cada escalón por debajo del precio actual, una de venta en cada escalón por encima. Cada vez que el mercado baja un escalón, el bot compra. Cada vez que sube un escalón, vende lo que compró más abajo. El mecanismo cosecha la oscilación y acumula una posición abierta cuando el mercado se aleja de la escalera en una dirección y sigue.

Esta página desarma la maquinaria y luego mide las dos formas de mercado que deciden su resultado. Cada panel a continuación es una consulta almacenada sobre precios reales de acciones estadounidenses, fijada a fechas concretas para que las cifras sigan siendo reproducibles.

Cómo funciona un bot de grid trading

Tres parámetros definen una grilla: los límites superior e inferior del rango, la cantidad de líneas dentro de él y el tamaño de la orden en cada línea. El espaciado entre líneas se deduce de los dos primeros.

Aquí está la aritmética, usando números redondos elegidos por claridad y no de una cotización real. Supongamos que una acción cotiza cerca de $100 y un operador establece una grilla de $95 a $105 con once líneas separadas por un dólar y 100 acciones por línea. El precio baja a $99 y la orden de compra pendiente se ejecuta. El precio vuelve a $100 y la orden de venta correspondiente se ejecuta, cerrando el par por una ganancia bruta de $100. Ambas órdenes se reactivan. Nada sobre la empresa cambió en esa hora. La posición simplemente completó un viaje de ida y vuelta entre dos escalones adyacentes.

Dos variantes aparecen en los proyectos de código abierto que circulan públicamente. Una grilla aritmética espacia las líneas por un monto fijo en dólares. Una grilla geométrica las espacia por un porcentaje fijo, lo que mantiene estable el porcentaje de ganancia por viaje redondo en un rango amplio. La documentación también separa una grilla neutral, que comienza plana y opera en ambas direcciones, de una grilla larga, que comienza manteniendo inventario y vende en las subidas.

La forma de la recompensa merece una frase simple. La ganancia en un viaje redondo completado está limitada a un paso de grilla menos los costos. La posición abierta que se acumula cuando el precio sale del rango no tiene un límite correspondiente.

La forma de mercado que necesita una grilla

Una grilla cobra por el recorrido, no por la dirección. Dos acciones pueden terminar un período al mismo precio después de cubrir distancias muy diferentes. Sumar el tamaño absoluto de cada movimiento diario da la distancia total recorrida. Dividir el movimiento neto por esa distancia da un ratio de eficiencia, una medida estándar de cuán direccional fue un camino. Un ratio bajo describe un camino que deambuló. Un ratio alto describe una marcha recta.

ConsultaDistancia recorrida vs movimiento neto: doce acciones conocidas, enero 2024 a junio 2026
El SQL exacto detrás de cada cifra
WITH daily AS (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS dt,
           argMax(toFloat64(close), toTimeZone(window_start, 'America/New_York')) AS c
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY','KO','PG','JNJ','VZ','MO','XOM','JPM','WMT','NVDA','TSLA','NFLX')
      AND toDate(toTimeZone(window_start, 'America/New_York')) BETWEEN toDate('2024-01-02') AND toDate('2026-06-30')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY ticker, dt
),
steps AS (
    SELECT ticker, dt, c,
           c / lagInFrame(c) OVER (PARTITION BY ticker ORDER BY dt) - 1 AS ret
    FROM daily
)
SELECT ticker,
       round(sum(abs(ret)) * 100, 0) AS travel_pct,
       round(abs(argMax(c, dt) / argMin(c, dt) - 1) * 100, 1) AS net_move_pct,
       round(100 * abs(argMax(c, dt) / argMin(c, dt) - 1) / sum(abs(ret)), 1) AS efficiency_pct
FROM steps
WHERE ret > -0.5 AND ret < 0.5
GROUP BY ticker
ORDER BY efficiency_pct
Run this yourself

Lee la primera y la última fila juntas. PG cubrió 527% del movimiento diario acumulado y terminó 0.9% de donde empezó, una eficiencia de 0.2%. SPY está en el extremo opuesto con 14.3%, convirtiendo 415% de recorrido en un movimiento neto de 59.2%. Una escalera de grilla colocada en el primer camino encuentra sus propios escalones una y otra vez. La misma escalera colocada en el segundo camino se queda atrás.

Calma y rango acotado son propiedades relacionadas pero distintas. Una acción puede derivar al alza en incrementos diarios muy pequeños y aún así dejar varada a una grilla, que es una de las razones por las que los nombres estudiados en la literatura de la anomalía de baja volatilidad no son automáticamente material para grillas.

Contando los viajes redondos

La eficiencia es un lente. El ingreso de una grilla depende de algo más concreto: cuántas veces el precio realmente revisita un nivel. Anclando en el primer cierre de cada año calendario y contando las sesiones cuyo cierre cae en el lado opuesto de ese ancla, se obtiene el número de cruces que una sola línea de grilla habría capturado. Coca-Cola (KO) es el sujeto aquí, un nombre de consumo grande y líquido del tipo que la documentación de grillas tiende a destacar.

ConsultaKO: cruces del nivel de apertura del año, por año calendario, 2019 a 2025
El SQL exacto detrás de cada cifra
WITH daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS dt,
           argMax(toFloat64(close), toTimeZone(window_start, 'America/New_York')) AS c
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'KO'
      AND toDate(toTimeZone(window_start, 'America/New_York')) BETWEEN toDate('2019-01-01') AND toDate('2025-12-31')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY dt
),
anchored AS (
    SELECT toYear(dt) AS year, dt, c,
           first_value(c) OVER (PARTITION BY toYear(dt) ORDER BY dt) AS anchor
    FROM daily
),
sided AS (
    SELECT year, dt, c, anchor,
           if(c >= anchor, 1, 0) AS side,
           row_number() OVER (PARTITION BY year ORDER BY dt) AS rn,
           lagInFrame(if(c >= anchor, 1, 0)) OVER (PARTITION BY year ORDER BY dt) AS prev_side
    FROM anchored
)
SELECT year,
       countIf(rn > 1 AND side != prev_side) AS crossing_count,
       count() AS sessions,
       round((argMax(c, dt) / any(anchor) - 1) * 100, 1) AS net_change_pct
FROM sided
GROUP BY year
ORDER BY year
Run this yourself

En 2019 el cierre cruzó su propio nivel de apertura 8 veces a lo largo de 252 sesiones, terminando el año 17.9% de ese nivel. En 2025 el conteo fue 6 en 250 sesiones, con un cambio neto de 13%. Una línea, una acción, y la materia prima para una grilla varía varias veces de un año a otro sin forma de saber el conteo del año siguiente por adelantado.

Esa variabilidad es el problema silencioso. El rendimiento anunciado de una grilla generalmente se cotiza por viaje redondo completado, y el número de viajes redondos lo establece el mercado, no los parámetros.

Dónde se rompe una grilla

El modo de falla tiene una forma específica. Fija una grilla en un rango, luego deja que el mercado lo abandone. A continuación, el techo y el piso son los cierres más alto y más bajo de las primeras veinte sesiones de 2024, mantenidos fijos durante los siguientes treinta meses, con el cierre mensual del rastreador del S&P 500 dibujado contra ellos.

ConsultaUna cuadrícula fijada a inicios de 2024, y hacia dónde fue el ETF del S&P 500 después
El SQL exacto detrás de cada cifra
WITH daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS dt,
           argMax(toFloat64(close), toTimeZone(window_start, 'America/New_York')) AS c
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND toDate(toTimeZone(window_start, 'America/New_York')) BETWEEN toDate('2024-01-02') AND toDate('2026-06-30')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY dt
),
opening_20 AS (
    SELECT c FROM daily ORDER BY dt LIMIT 20
),
band AS (
    SELECT min(c) AS grid_low, max(c) AS grid_high FROM opening_20
),
monthly AS (
    SELECT toStartOfMonth(dt) AS month_start, argMax(c, dt) AS close_px
    FROM daily
    GROUP BY month_start
)
SELECT formatDateTime(monthly.month_start, '%Y-%m') AS month,
       round(monthly.close_px, 2) AS spy_close,
       round(band.grid_high, 2) AS grid_top,
       round(band.grid_low, 2) AS grid_bottom
FROM monthly, band
ORDER BY monthly.month_start
Run this yourself

La banda va de $467.27 a $491.26. El primer mes de la serie cerró en $482.92, dentro de ella. El último de los 30 meses cerró en $746.32, muy por encima del techo, y el gráfico muestra la línea saliendo de la banda y nunca regresando.

Recorre lo que hace la escalera a lo largo de ese camino. Subiendo a través del rango, el bot vende inventario escalón por escalón, embolsando un paso de ganancia cada vez. Por encima del techo, mantiene efectivo y observa. Cada punto adicional del avance es una ganancia en la que el operador ya no participa, que es la versión leve de la falla.

La versión severa es la imagen espejo. El precio cae por debajo del piso y el bot ha comprado en cada escalón en el camino hacia abajo, por lo que ahora mantiene toda la escalera de inventario a un costo promedio por encima del mercado, con cada paso adicional ampliando la pérdida no realizada. Un rango que una vez produjo operaciones constantes, pequeñas y visiblemente exitosas se convierte en una única posición concentrada. El marketing de grillas describe esto como el bot "atascado"; en un estado de cuenta de corretaje es una pérdida flotante abierta sin una salida incorporada.

Los costos escalan con el número de operaciones

Una grilla completa muchas operaciones pequeñas, y cada una paga el costo total de un viaje redondo: el diferencial, más comisiones o tarifas de intercambio donde apliquen. El diferencial entre oferta y demanda es la pieza que más a menudo se omite en los cálculos de grillas, ya que nunca aparece en un estado de cuenta como una partida individual.

La aritmética ilustrativa es rápida. En una acción de $100 con un diferencial de un centavo, un viaje redondo que cruza el diferencial en ambos lados cede aproximadamente dos centavos, o 0.02% del nocional. Contra un paso de grilla de un dólar, eso es aproximadamente el 2% de la ganancia bruta por viaje. Amplía el diferencial a cinco centavos, una cifra rutinaria en un nombre más delgado, y el mismo viaje cede diez centavos contra un dólar de ganancia bruta, o el 10%. Apretar la grilla a pasos de diez centavos para capturar más oscilación reduce la ganancia bruta por viaje a diez centavos mientras deja el costo sin cambios, y el diferencial de cinco centavos ahora consume toda la operación.

Esa relación establece un piso debajo del espaciado útil de la grilla: los pasos deben mantenerse grandes en relación con los costos de ida y vuelta, y cuanto más apretada sea la grilla, más de sus ingresos pertenecen a la plaza en lugar de al operador.

Por qué los backtests favorecen a los bots de grilla

Las estrategias de grilla producen backtests inusualmente atractivos, y cuatro razones estructurales explican la mayor parte.

  1. Selección de rango con retrospectiva. Los límites elegidos después de ver los datos contendrán los datos. Una grilla ajustada a un período que se mantuvo en un rango mostrará una alta tasa de aciertos en ese período.
  2. La escalera no cerrada. Una prueba que se detiene en una fecha final elegida a menudo cuenta los viajes redondos realizados mientras trata el inventario restante de manera generosa. La contabilidad honesta valora la posición abierta a precio de mercado en el día final e incluye esa pérdida en el resultado.
  3. Supuestos de ejecución. Las órdenes pendientes simuladas se ejecutan cada vez que el precio las toca. Las colas reales no siempre se ejecutan al toque, y los viajes que no logran ejecutarse son desproporcionadamente los rentables en mercados rápidos.
  4. Densidad de parámetros. Límites, número de líneas, espaciado y tamaño de orden dan cuatro perillas sobre una sola serie de precios, lo cual es suficiente para ajustarse a casi cualquier ventana histórica.

Los conteos de cruces anteriores son el contrapeso a los cuatro. Provienen únicamente del historial de precios, sin parámetros adjuntos, y varían de un año a otro de una manera que ninguna elección de parámetros controla. Cualquiera que evalúe una afirmación de grilla puede hacer una sola pregunta: ¿de cuántos viajes redondos completados depende esto, y de dónde vino ese conteo? Un período de práctica en un simulador, con la escalera abierta valorada a mercado al final, lo responde más honestamente que un gráfico de viajes realizados.

FAQ

¿Los bots de grid trading realmente ganan dinero?

Una grilla gana una ganancia limitada en cada viaje redondo completado y lleva una posición abierta sin límite cuando el precio sale de su rango. Si los viajes realizados superan la posición abierta en cualquier período depende de cuánto osciló el mercado dentro de ese rango, que es una propiedad del mercado, no del software.

¿Qué condiciones de mercado son adecuadas para un bot de grilla?

El mecanismo está diseñado para un precio que revisita repetidamente los mismos niveles: alta distancia total recorrida en relación con el movimiento neto. En el panel de doce nombres anterior, los ratios de eficiencia fueron desde 0.2% en el extremo errante hasta 14.3% en el extremo direccional, y el mecanismo de escalera encuentra sus propios escalones solo en el primer extremo.

¿Qué sucede cuando el precio sale del rango de la grilla?

Por encima del rango, el bot ha vendido su inventario y se sienta en efectivo mientras el mercado continúa sin él. Por debajo del rango, mantiene cada escalón que compró en el camino hacia abajo, a un costo promedio por encima del precio actual, y cada declive adicional amplía esa pérdida no realizada.

¿En qué se diferencia el grid trading del promediado del costo en dólares?

Ambos compran más a medida que el precio baja, y ahí terminan las similitudes. El promediado del costo en dólares agrega una cantidad fija en un cronograma fijo sin regla de salida ni límite superior. Una grilla compra y vende en disparadores de precio dentro de un rango elegido de antemano, y su comportamiento cambia completamente una vez que el precio sale de ese rango.

¿Un espaciado de grilla más ajustado produce más ingresos?

Un espaciado más ajustado aumenta el número de viajes redondos y reduce la ganancia bruta en cada uno, mientras que el costo del viaje redondo permanece igual. Más allá de un punto establecido por el diferencial, los viajes adicionales restan del total en lugar de sumar.


Cada cifra anterior proviene de una consulta almacenada y versionada sobre precios reales de acciones; abre el SQL debajo de cualquier panel para verificarlo, o mide el recorrido contra el movimiento neto en tu propia lista de nombres en el terminal de Strasmore.

#grid trading#trading bots#automation#mean reversion#market data