Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

grid trading bots eerlijk bekeken

Een grid trading bot koopt elke tree omlaag en verkoopt elke tree omhoog binnen een vaste range. Zie de marktvorm die het mechanisme betaalt en de vorm die het breekt.

Een grid trading bot plaatst een ladder van orders op vaste prijsintervallen: een kooporder op elke tree onder de huidige koers, een verkooporder op elke tree erboven. Elke keer dat de markt een tree daalt, koopt de bot. Elke keer dat hij een tree stijgt, verkoopt de bot wat hij lager heeft gekocht. Het mechanisme oogst oscillatie en bouwt een open positie op wanneer de markt in één richting van de ladder wegloopt en blijft doorlopen.

Deze pagina ontleedt het mechanisme en meet vervolgens de twee marktvormen die de uitkomst bepalen. Elk paneel hieronder is een opgeslagen query over reële Amerikaanse aandelenkoersen, vastgezet op vaste data zodat de cijfers reproduceerbaar blijven.

Hoe een grid trading bot werkt

Drie instellingen definiëren een grid: de boven- en ondergrens van de range, het aantal lijnen daarbinnen en de ordergrootte op elke lijn. De afstand tussen de lijnen volgt uit de eerste twee.

Hier is de rekenkunde, met ronde getallen gekozen voor de duidelijkheid en niet uit een echte koers. Stel dat een aandeel rond $100 handelt en een operator stelt een grid in van $95 tot $105 met elf lijnen van één dollar uit elkaar en 100 aandelen per lijn. De koers zakt naar $99 en de rustende kooporder wordt gevuld. De koers keert terug naar $100 en de bijpassende verkooporder wordt gevuld, waarmee het paar wordt gesloten voor een brutowinst van $100. Beide orders worden opnieuw geplaatst. Er is in dat uur niets veranderd aan het bedrijf. De positie heeft simpelweg een rondgang tussen twee aangrenzende treden voltooid.

Twee varianten komen voor in de open-source projecten die publiekelijk circuleren. Een rekenkundig grid plaatst lijnen op een vaste dollaraftand. Een geometrisch grid plaatst ze op een vast percentage, wat de procentuele winst per rondgang stabiel houdt over een breed bereik. Documentatie maakt ook onderscheid tussen een neutraal grid, dat vlak begint en beide kanten op werkt, en een long grid, dat begint met het aanhouden van voorraad en verkoopt bij kracht.

De uitbetalingsvorm verdient één heldere zin. De winst op een voltooide rondgang is gemaximeerd op één grid-stap minus kosten. De open positie die ontstaat wanneer de koers de range verlaat, heeft geen bijpassende cap.

De marktvorm die een grid nodig heeft

Een grid wordt betaald voor reizen, niet voor richting. Twee aandelen kunnen een periode op dezelfde koers afsluiten nadat ze totaal verschillende afstanden hebben afgelegd. Het optellen van de absolute grootte van elke dagelijkse beweging geeft de totale afgelegde afstand. Het delen van de netto beweging door die afstand geeft een efficiëntieratio, een standaardmaat voor hoe directioneel een pad was. Een lage ratio beschrijft een pad dat dwaalde. Een hoge ratio beschrijft een rechte mars.

QueryAfgelegde afstand vs. netto beweging: twaalf bekende aandelen, jan. 2024 t/m jun. 2026
De exacte SQL achter elk getal
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

Lees de eerste en laatste rij samen. PG besloeg 527% van de cumulatieve dagelijkse beweging en eindigde 0.9% van waar het begon, een efficiëntie van 0.2%. SPY zit aan het andere uiteinde op 14.3%, en zet 415% reis om in een 59.2% netto beweging. Een grid-ladder geplaatst op het eerste pad ontmoet zijn eigen treden steeds opnieuw. Dezelfde ladder geplaatst op het tweede pad wordt achtergelaten.

Rustig en rangegebonden zijn verwante maar verschillende eigenschappen. Een aandeel kan in zeer kleine dagelijkse stappen omhoog drijven en toch een grid gestrand achterlaten, wat een van de redenen is dat de namen die bestudeerd worden in de literatuur over de low-volatility anomaly niet automatisch grid-materiaal zijn.

Het tellen van de rondgangen

Efficiëntie is één lens. Grid-inkomsten hangen af van iets concreeters: hoe vaak de koers daadwerkelijk een niveau opnieuw bezoekt. Door te verankeren op de eerste slotkoers van elk kalenderjaar en de sessies te tellen waarvan de slotkoers aan de andere kant van dat anker eindigt, krijg je het aantal kruisingen dat een enkele grid-lijn zou hebben opgevangen. Coca-Cola (KO) is hier het onderwerp, een grote, liquide consumentennaam van het soort dat grid-documentatie vaak laat zien.

QueryKO: overschrijdingen van het openingsniveau van het jaar, per kalenderjaar, 2019 tot 2025
De exacte SQL achter elk getal
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

In 2019 kruiste de slotkoers zijn eigen openingsniveau 8 keer in 252 sessies, en eindigde het jaar 17.9% van dat niveau. In 2025 was de telling 6 over 250 sessies, met een netto verandering van 13%. Eén lijn, één aandeel, en de grondstof voor een grid varieert meerdere malen van jaar tot jaar, zonder dat het aantal van het komende jaar vooraf bekend is.

Die variabiliteit is het stille probleem. Het geadverteerde rendement van een grid wordt meestal gequoteerd per voltooide rondgang, en het aantal rondgangen wordt bepaald door de markt, niet door de instellingen.

Waar een grid breekt

De faalmodus heeft een specifieke vorm. Zet een grid vast op een range en laat de markt deze vervolgens verlaten. Hieronder zijn het plafond en de vloer de hoogste en laagste slotkoersen van de eerste twintig sessies van 2024, constant gehouden over de volgende dertig maanden, met de maandelijkse slotkoers van de S&P 500 tracker ertegen uitgezet.

QueryEen raster vastgezet op begin 2024, en waar de S&P 500-tracker daarna naartoe ging
De exacte SQL achter elk getal
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

De band loopt van $467.27 tot $491.26. De eerste maand in de reeks sloot op $482.92, erbinnen. De laatste van de 30 maanden sloot op $746.32, ver boven het plafond, en de grafiek laat de lijn de band verlaten en nooit meer terugkomen.

Loop door wat de ladder doet langs dat pad. Stijgend door de range verkoopt de bot tree voor tree voorraad, waarbij hij elke keer één stap winst boekt. Boven het plafond houdt hij cash aan en kijkt toe. Elke verdere stijging is een winst waaraan de operator niet langer deelneemt, wat de milde versie van de mislukking is.

De ernstige versie is het spiegelbeeld. De koers daalt door de vloer en de bot heeft op elke tree onderweg gekocht, waardoor hij nu de volledige ladder van voorraad aanhoudt tegen een gemiddelde kostprijs boven de markt, waarbij elke extra stap het ongerealiseerde verlies vergroot. Een range die ooit gestage, kleine, zichtbaar succesvolle transacties opleverde, verandert in één enkele geconcentreerde positie. Grid-marketing beschrijft dit als de bot die "vastzit"; op een brokerage-afschrift is het een open drawdown zonder ingebouwde exit.

Kosten schalen mee met het aantal transacties

Een grid voltooit veel kleine transacties, en elke betaalt de volledige kosten van een rondgang: de spread, plus commissies of beurskosten waar van toepassing. De bid-ask spread is het onderdeel dat het vaakst wordt weggelaten uit grid-berekeningen, omdat het nooit als een regel op een afschrift verschijnt.

De illustratieve rekenkunde is snel. Bij een aandeel van $100 met een spread van één cent, geeft een rondgang die de spread aan beide kanten kruist ruwweg twee cent op, of 0,02% van de nominale waarde. Tegenover een grid-stap van één dollar is dat ongeveer 2% van de brutowinst per rit. Verbreed de spread naar vijf cent, een gangbaar cijfer voor een dunner verhandeld aandeel, en dezelfde rit geeft tien cent op tegenover een dollar bruto, oftewel 10%. Het versmallen van het grid naar stappen van tien cent om meer oscillatie op te vangen, verlaagt de brutowinst per rit naar tien cent terwijl de kosten ongewijzigd blijven, en de spread van vijf cent verbruikt nu de gehele transactie.

Die relatie stelt een bodem onder de bruikbare grid-afstand: stappen moeten groot blijven ten opzichte van de kosten per rondgang, en hoe smaller het grid, hoe meer van de inkomsten naar de beurs gaan in plaats van naar de operator.

Waarom backtests grid bots mooier maken

Grid-strategieën leveren buitengewoon aantrekkelijke backtests op, en vier structurele redenen verklaren het grootste deel daarvan.

  1. Range-selectie met terugblik. Grenzen die zijn gekozen na het zien van de data, zullen de data bevatten. Een grid dat is aangepast aan een periode die rangeerde, zal een hoog slagingspercentage laten zien voor die periode.
  2. De niet-gesloten ladder. Een test die stopt op een gekozen einddatum telt vaak gerealiseerde rondgangen terwijl de resterende voorraad royaal wordt behandeld. De eerlijke boekhouding waardeert de open positie tegen de markt op de laatste dag en neemt dat verlies op in het resultaat.
  3. Vul-aannames. Gesimuleerde rustende orders worden gevuld zodra de koers ze raakt. Echte wachtrijen worden niet altijd gevuld bij de aanraking, en de ritten die niet worden gevuld, zijn onevenredig vaak de winstgevende in snelle markten.
  4. Parameterdichtheid. Grenzen, aantal lijnen, afstand en ordergrootte geven vier knoppen over één koersreeks, wat genoeg is om bijna elk historisch venster te fitten.

De kruisingstellingen hierboven zijn het tegenwicht voor alle vier. Ze komen uit de koersgeschiedenis alleen, zonder instellingen, en ze variëren van jaar tot jaar op een manier die geen enkele parameterkeuze controleert. Iedereen die een grid-claim evalueert, kan er één vraag over stellen: van hoeveel voltooide rondgangen is dit afhankelijk, en waar komt die telling vandaan? Een oefenperiode op een simulator, met de open ladder aan het einde gewaardeerd tegen de markt, beantwoordt die vraag eerlijker dan een grafiek van gerealiseerde ritten.

FAQ

Verdienen grid trading bots daadwerkelijk geld?

Een grid verdient een gemaximeerde winst op elke voltooide rondgang en draagt een ongecapiteerde open positie wanneer de koers zijn range verlaat. Of de gerealiseerde ritten opwegen tegen de open positie over een bepaalde periode hangt af van hoeveel de markt binnen die range oscilleerde, wat een eigenschap is van de markt en niet van de software.

Welke marktomstandigheden zijn geschikt voor een grid bot?

Het mechanisme is gebouwd voor een koers die herhaaldelijk dezelfde niveaus bezoekt: een hoge totale afgelegde afstand ten opzichte van de netto beweging. In het twaalf-namen paneel hierboven liepen de efficiëntieratio's van 0.2% aan het dwalende uiteinde tot 14.3% aan het directionele uiteinde, en het ladder-mechanisme ontmoet zijn eigen treden alleen aan het eerste uiteinde.

Wat gebeurt er wanneer de koers uitbreekt uit de grid-range?

Boven de range heeft de bot zijn voorraad verkocht en zit hij in cash terwijl de markt zonder hem doorgaat. Onder de range houdt hij elke tree aan die hij onderweg heeft gekocht, tegen een gemiddelde kostprijs boven de huidige koers, en elke verdere daling vergroot dat ongerealiseerde verlies.

Hoe verschilt grid trading van dollar-cost averaging?

Beide kopen meer naarmate de koers daalt, en daar houdt de gelijkenis op. Dollar-cost averaging voegt een vast bedrag toe op een vast schema zonder exit-regel en zonder bovengrens. Een grid koopt en verkoopt op koers-triggers binnen een vooraf gekozen range, en zijn gedrag verandert volledig zodra de koers die range verlaat.

Levert een smallere grid-afstand meer inkomen op?

Smallere afstand verhoogt het aantal rondgangen en verlaagt de brutowinst op elke, terwijl de kosten per rondgang gelijk blijven. Voorbij een punt dat door de spread wordt bepaald, trekken extra ritten af van het totaal in plaats van het te verhogen.


Elk cijfer hierboven komt van een opgeslagen, geversioneerde query over reële aandelenkoersen; open de SQL onder elk paneel om het te controleren, of meet de reis tegen de netto beweging op uw eigen lijst van namen op de Strasmore terminal.

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