Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

bot de grille trading analyse honnête

Un bot de grille achète à chaque baisse et vend à chaque hausse dans une fourchette fixe. Voyez la forme de marché qui paie le mécanisme et celle qui le casse.

Un bot de grille place un échelon d'ordres à intervalles de prix fixes : un ordre d'achat à chaque échelon sous le cours actuel, un ordre de vente à chaque échelon au-dessus. À chaque fois que le marché baisse d'un cran, le bot achète. À chaque fois qu'il remonte d'un cran, le bot vend ce qu'il a acheté plus bas. Le mécanisme récolte l'oscillation et accumule une position ouverte dès que le marché s'éloigne de la grille dans une direction et continue.

Cette page démonte le mécanisme, puis mesure les deux formes de marché qui décident de son résultat. Chaque panneau ci-dessous est une requête stockée sur des prix réels d'actions américaines, figée à des dates fixes pour que les chiffres restent reproductibles.

Comment fonctionne un bot de grille

Trois paramètres définissent une grille : les bornes haute et basse de la fourchette, le nombre de lignes à l'intérieur, et la taille d'ordre sur chaque ligne. L'espacement entre les lignes découle des deux premiers.

Voici le calcul, avec des chiffres ronds choisis pour la clarté plutôt que sur une cotation réelle. Supposons qu'une action se négocie près de 100 $ et qu'un opérateur place une grille de 95 $ à 105 $ avec onze lignes espacées d'un dollar et 100 actions par ligne. Le cours glisse à 99 $ et l'ordre d'achat en attente s'exécute. Le cours revient à 100 $ et l'ordre de vente correspondant s'exécute, clôturant la paire pour un bénéfice brut de 100 $. Les deux ordres se réarment. Rien n'a changé dans l'entreprise pendant cette heure. La position a simplement effectué un aller-retour entre deux échelons adjacents.

Deux variantes apparaissent dans les projets open source qui circulent publiquement. Une grille arithmétique espace les lignes d'un montant fixe en dollars. Une grille géométrique les espace d'un pourcentage fixe, ce qui maintient le pourcentage de profit par aller-retour constant sur une large plage. La documentation distingue également une grille neutre, qui démarre à plat et travaille dans les deux directions, d'une grille longue, qui commence avec un inventaire et vend dans les hausses.

La forme du gain mérite une phrase simple. Le profit sur un aller-retour complet est plafonné à un pas de grille moins les coûts. La position ouverte qui s'accumule lorsque le cours quitte la fourchette ne comporte aucun plafond correspondant.

La forme de marché dont une grille a besoin

Une grille est payée par le trajet, pas par la direction. Deux actions peuvent terminer une période au même prix après avoir parcouru des distances très différentes. L'addition de la taille absolue de chaque mouvement quotidien donne la distance totale parcourue. La division du mouvement net par cette distance donne un ratio d'efficacité, une mesure standard du caractère directionnel d'un chemin. Un ratio faible décrit un chemin qui a erré. Un ratio élevé décrit une marche rectiligne.

RequêteDistance parcourue vs variation nette : douze actions familières, janv. 2024 à juin 2026
Le SQL exact derrière chaque chiffre
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

Lisez la première et la dernière ligne ensemble. PG a couvert 527% du mouvement quotidien cumulé et a fini 0.9% de son point de départ, soit une efficacité de 0.2%. SPY se trouve à l'opposé avec 14.3%, transformant 415% de trajet en un mouvement net de 59.2%. Une grille placée sur le premier chemin rencontre ses propres échelons encore et encore. La même grille placée sur le second chemin se fait distancer.

Calme et range-bound sont des propriétés liées mais distinctes. Une action peut dériver à la hausse par très petits incréments quotidiens et laisser une grille échouée, ce qui est l'une des raisons pour lesquelles les noms étudiés dans la littérature sur l'anomalie de faible volatilité ne sont pas automatiquement du matériel pour grille.

Compter les allers-retours

L'efficacité est une lentille. Le revenu d'une grille dépend de quelque chose de plus concret : combien de fois le cours revisite réellement un niveau. En s'ancrant sur la première clôture de chaque année civile et en comptant les séances dont la clôture se trouve du côté opposé de cet ancrage, on obtient le nombre de traversées qu'une seule ligne de grille aurait capturées. Coca-Cola (KO) est le sujet ici, un nom de grande consommation, liquide et de grande capitalisation, du genre que la documentation sur les grilles a tendance à mettre en avant.

RequêteKO : franchissements du niveau d'ouverture de l'année, par année civile, 2019 à 2025
Le SQL exact derrière chaque chiffre
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, la clôture a traversé son propre niveau d'ouverture 8 fois sur 252 séances, terminant l'année 17.9% de ce niveau. En 2025, le nombre était de 6 sur 250 séances, avec un changement net de 13%. Une ligne, une action, et la matière première pour une grille varie de plusieurs fois d'une année à l'autre, sans aucun moyen de connaître à l'avance le nombre de l'année à venir.

Cette variabilité est le problème silencieux. Le rendement annoncé d'une grille est généralement cité par aller-retour complet, et le nombre d'allers-retours est fixé par le marché plutôt que par les paramètres.

Là où une grille se brise

Le mode de défaillance a une forme spécifique. Fixez une grille sur une fourchette, puis laissez le marché la quitter. Ci-dessous, le plafond et le plancher sont les clôtures les plus haute et la plus basse des vingt premières séances de 2024, maintenues constantes sur les trente mois suivants, avec la clôture mensuelle du tracker du S&P 500 tracée par rapport à elles.

RequêteGrille fixée sur début 2024, et où le tracker du S&P 500 s'est ensuite déplacé
Le SQL exact derrière chaque chiffre
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 bande va de 467.27 $ à 491.26 $. Le premier mois de la série a clôturé à 482.92 $, à l'intérieur. Le dernier des 30 mois a clôturé à 746.32 $, bien au-dessus du plafond, et le graphique montre la ligne quittant la bande pour ne jamais revenir.

Parcourons ce que fait la grille le long de ce chemin. En montant dans la fourchette, le bot vend son inventaire échelon par échelon, empochant un pas de profit à chaque fois. Au-dessus du plafond, il détient du cash et regarde. Chaque point supplémentaire de la hausse est un gain auquel l'opérateur ne participe plus, ce qui est la version bénigne de la défaillance.

La version sévère est l'image miroir. Le cours chute sous le plancher et le bot a acheté à chaque échelon sur la descente, il détient donc maintenant l'échelon complet d'inventaire à un coût moyen supérieur au marché, chaque pas supplémentaire élargissant la perte latente. Une fourchette qui produisait autrefois des transactions régulières, petites et visiblement réussies se transforme en une seule position concentrée. Le marketing des grilles décrit cela comme le bot étant "coincé" ; sur un relevé de courtage, c'est un drawdown ouvert sans sortie intégrée.

Les coûts augmentent avec le nombre de transactions

Une grille effectue de nombreuses petites transactions, et chacune paie le coût total d'un aller-retour : le spread, plus les commissions ou frais d'échange le cas échéant. Le spread bid-ask est l'élément le plus souvent omis des calculs de grille, car il n'apparaît jamais sur un relevé en tant que ligne distincte.

Le calcul illustratif est rapide. Sur une action à 100 $ avec un spread d'un cent, un aller-retour qui traverse le spread des deux côtés cède environ deux cents, soit 0,02 % du notionnel. Par rapport à un pas de grille d'un dollar, cela représente environ 2 % du bénéfice brut par trajet. Élargissez le spread à cinq cents, un chiffre courant sur un titre plus étroit, et le même trajet cède dix cents contre un dollar de brut, soit 10 %. En resserrant la grille à des pas de dix cents pour capter plus d'oscillation, le brut par trajet tombe à dix cents tandis que le coût reste inchangé, et le spread de cinq cents consomme désormais la totalité de la transaction.

Cette relation fixe un plancher sous l'espacement utile de la grille : les pas doivent rester grands par rapport aux coûts d'aller-retour, et plus la grille est serrée, plus ses revenus appartiennent à la place de marché plutôt qu'à l'opérateur.

Pourquoi les backtests flattent les bots de grille

Les stratégies de grille produisent des backtests inhabituellement attrayants, et quatre raisons structurelles expliquent l'essentiel.

  1. Sélection de fourchette avec le recul. Les bornes choisies après avoir vu les données contiendront les données. Une grille ajustée à une période qui a été range-bound montrera un taux de réussite élevé sur cette période.
  2. L'échelon non clôturé. Un test qui s'arrête à une date de fin choisie compte souvent les allers-retours réalisés tout en traitant généreusement l'inventaire restant. La comptabilité honnête marque la position ouverte à la valeur de marché le dernier jour et inclut cette perte dans le résultat.
  3. Hypothèses d'exécution. Les ordres en attente simulés s'exécutent dès que le cours les touche. Les files d'attente réelles ne s'exécutent pas toujours au contact, et les trajets qui ne s'exécutent pas sont de manière disproportionnée les plus rentables dans les marchés rapides.
  4. Densité des paramètres. Bornes, nombre de lignes, espacement et taille d'ordre offrent quatre boutons sur une seule série de prix, ce qui est suffisant pour s'ajuster à presque n'importe quelle fenêtre historique.

Les nombres de traversées ci-dessus sont le contrepoids à ces quatre points. Ils proviennent de l'historique des prix uniquement, sans paramètres attachés, et ils varient d'une année à l'autre d'une manière qu'aucun choix de paramètre ne contrôle. Quiconque évalue une affirmation de grille peut poser une seule question : de combien d'allers-retours complets cela dépend-il, et d'où vient ce nombre ? Une période de pratique sur un simulateur, avec l'échelon ouvert marqué à la valeur de marché à la fin, y répond plus honnêtement qu'un graphique de trajets réalisés.

FAQ

Les bots de grille font-ils réellement gagner de l'argent ?

Une grille gagne un profit plafonné sur chaque aller-retour complet et porte une position ouverte non plafonnée lorsque le cours quitte sa fourchette. La question de savoir si les trajets réalisés l'emportent sur la position ouverte sur une période donnée dépend de la mesure dans laquelle le marché a oscillé à l'intérieur de cette fourchette, ce qui est une propriété du marché plutôt que du logiciel.

Quelles conditions de marché conviennent à un bot de grille ?

Le mécanisme est conçu pour un prix qui revisite à plusieurs reprises les mêmes niveaux : une distance totale parcourue élevée par rapport au mouvement net. Dans le panneau de douze noms ci-dessus, les ratios d'efficacité allaient de 0.2% à l'extrémité errante à 14.3% à l'extrémité directionnelle, et le mécanisme d'échelon ne rencontre ses propres barreaux qu'à la première extrémité.

Que se passe-t-il lorsque le cours sort de la fourchette de la grille ?

Au-dessus de la fourchette, le bot a vendu son inventaire et se trouve en cash tandis que le marché continue sans lui. En dessous de la fourchette, il détient tous les échelons achetés sur la descente, à un coût moyen supérieur au cours actuel, et chaque baisse supplémentaire élargit cette perte latente.

En quoi le grid trading est-il différent du dollar-cost averaging ?

Les deux achètent plus lorsque le cours baisse, et là s'arrête la similitude. Le dollar-cost averaging ajoute un montant fixe selon un calendrier fixe, sans règle de sortie et sans borne supérieure. Une grille achète et vend sur des déclencheurs de prix à l'intérieur d'une fourchette choisie à l'avance, et son comportement change complètement une fois que le cours quitte cette fourchette.

Un espacement de grille plus serré produit-il plus de revenus ?

Un espacement plus serré augmente le nombre d'allers-retours et diminue le bénéfice brut sur chacun, tandis que le coût de l'aller-retour reste le même. Au-delà d'un point fixé par le spread, les trajets supplémentaires soustraient du total plutôt que d'y ajouter.


Chaque chiffre ci-dessus provient d'une requête stockée et versionnée sur des prix réels d'actions ; ouvrez le SQL sous n'importe quel panneau pour le vérifier, ou mesurez le trajet par rapport au mouvement net sur votre propre liste de noms sur le terminal Strasmore.

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