Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

сеточный торговый бот честный обзор

Сеточный бот покупает на каждом шаге вниз и продает на каждом шаге вверх в фиксированном диапазоне. Узнайте, какая форма рынка окупает механизм, а какая его ломает.

Торговый бот с сеткой размещает лестницу ордеров на фиксированных ценовых интервалах: ордер на покупку на каждой ступеньке ниже текущей цены, ордер на продажу на каждой ступеньке выше. Каждый раз, когда рынок опускается на ступеньку, бот покупает. Каждый раз, когда рынок поднимается обратно, бот продает то, что купил ниже. Этот механизм собирает прибыль с колебаний и накапливает открытую позицию всякий раз, когда рынок уходит от лестницы в одном направлении и продолжает движение.

Эта страница разбирает механизм на части, а затем измеряет две рыночные формы, которые определяют его результат. Каждая панель ниже — это сохраненный запрос по реальным ценам акций США, привязанный к фиксированным датам, чтобы цифры оставались воспроизводимыми.

Как работает торговый бот с сеткой

Три параметра определяют сетку: верхняя и нижняя границы диапазона, количество линий внутри него и размер ордера на каждой линии. Расстояние между линиями выводится из первых двух.

Вот арифметика, использующая круглые числа, выбранные для ясности, а не из реальной котировки. Предположим, акция торгуется около $100, и оператор устанавливает сетку от $95 до $105 с одиннадцатью линиями с шагом в один доллар и 100 акциями на линию. Цена падает до $99, и лимитный ордер на покупку исполняется. Цена возвращается к $100, и соответствующий ордер на продажу исполняется, закрывая пару с валовой прибылью в $100. Оба ордера переустанавливаются. За этот час в компании ничего не изменилось. Позиция просто совершила круговой рейс между двумя соседними ступеньками.

В проектах с открытым исходным кодом, которые циркулируют публично, встречаются два варианта. Арифметическая сетка располагает линии на фиксированную сумму в долларах. Геометрическая сетка располагает их на фиксированный процент, что удерживает процентную прибыль за круговой рейс стабильной в широком диапазоне. В документации также разделяют нейтральную сетку, которая начинается с нулевой позиции и работает в обоих направлениях, и длинную сетку, которая начинает с запасами и продает на росте.

Форма выплат заслуживает одного простого предложения. Прибыль по завершенному круговому рейсу ограничена одним шагом сетки за вычетом издержек. Открытая позиция, которая накапливается, когда цена покидает диапазон, не имеет такого ограничения.

Рыночная форма, необходимая сетке

Сетка получает оплату за перемещение, а не за направление. Две акции могут закончить период по одной цене, пройдя при этом совершенно разные расстояния. Суммирование абсолютной величины каждого дневного движения дает общее пройденное расстояние. Деление чистого движения на это расстояние дает коэффициент эффективности — стандартный показатель того, насколько направленным был путь. Низкий коэффициент описывает блуждающий путь. Высокий коэффициент описывает прямолинейный марш.

ЗапросПройденный путь против чистого движения: двенадцать знакомых акций, январь 2024 – июнь 2026
Точный SQL-код для каждого числа
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

Прочитайте первую и последнюю строки вместе. PG покрыло 527% совокупного дневного движения и закончило 0.9% от точки старта, что дает эффективность 0.2%. SPY находится на противоположном конце с 14.3%, превращая 415% перемещения в чистое движение на 59.2%. Лестница сетки, размещенная на первом пути, снова и снова встречает свои собственные ступеньки. Та же лестница, размещенная на втором пути, остается позади.

Спокойствие и нахождение в диапазоне — это связанные, но разные свойства. Акция может дрейфовать вверх очень маленькими ежедневными шагами и все равно оставить сетку в затруднительном положении, что является одной из причин, по которой названия, изучаемые в литературе по аномалии низкой волатильности, автоматически не подходят для сетки.

Подсчет круговых рейсов

Эффективность — это один взгляд. Доход сетки зависит от чего-то более конкретного: сколько раз цена фактически возвращается к определенному уровню. Привязываясь к цене закрытия первого торгового дня каждого календарного года и подсчитывая сессии, закрытие которых оказывается на противоположной стороне от этой точки привязки, мы получаем количество пересечений, которые поймала бы одна линия сетки. Здесь объектом является Coca-Cola (KO) — крупный, ликвидный потребительский бренд, который часто фигурирует в документации по сеткам.

ЗапросKO: пересечения уровня открытия года по календарным годам, 2019–2025
Точный SQL-код для каждого числа
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

В 2019 цена закрытия пересекала свой собственный уровень открытия 8 раз за 252 сессий, закончив год на расстоянии 17.9% от этого уровня. В 2025 количество составило 6 за 250 сессий с чистым изменением в 13%. Одна линия, одна акция, и сырье для сетки варьируется в несколько раз от года к году, причем заранее узнать количество пересечений в предстоящем году невозможно.

Эта изменчивость и есть скрытая проблема. Заявленная доходность сетки обычно указывается за один завершенный круговой рейс, а количество круговых рейсов задается рынком, а не настройками.

Где сетка ломается

Режим отказа имеет определенную форму. Зафиксируйте сетку в диапазоне, а затем позвольте рынку покинуть его. Ниже потолок и пол — это самая высокая и самая низкая цены закрытия первых двадцати сессий 2024 года, оставленные неизменными на последующие тридцать месяцев, с нанесенной на них ценой закрытия за месяц трекера S&P 500.

ЗапросСетка, зафиксированная на начало 2024 года, и куда затем направился трекер S&P 500
Точный SQL-код для каждого числа
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

Диапазон простирается от $467.27 до $491.26. Первый месяц в серии закрылся на уровне $482.92, внутри диапазона. Последний из 30 месяцев закрылся на уровне $746.32, значительно выше потолка, и на графике видно, как линия покидает диапазон и никогда не возвращается.

Пройдемся по тому, что делает лестница на этом пути. Поднимаясь через диапазон, бот продает запасы ступенька за ступенькой, фиксируя прибыль в один шаг каждый раз. Выше потолка он держит кэш и наблюдает. Каждый последующий пункт роста — это прибыль, в которой оператор больше не участвует, что является мягкой версией отказа.

Суровая версия — это зеркальное отражение. Цена падает ниже пола, и бот купил на каждой ступеньке на пути вниз, поэтому теперь он держит полную лестницу запасов по средней цене выше рыночной, причем каждый дополнительный шаг вниз расширяет нереализованный убыток. Диапазон, который когда-то приносил стабильные, мелкие, визуально успешные сделки, превращается в одну концентрированную позицию. Маркетинг сеток описывает это как «застревание» бота; в брокерском отчете это открытая просадка без встроенного выхода.

Издержки растут с количеством сделок

Сетка совершает много мелких сделок, и каждая из них оплачивает полную стоимость кругового рейса: спред, плюс комиссии или биржевые сборы, где они применимы. Спред между ценой покупки и продажи — это та часть, которую чаще всего упускают из расчетов сетки, поскольку она никогда не отображается в отчете отдельной строкой.

Иллюстративная арифметика быстра. По акции за $100 со спредом в один цент круговой рейс, пересекающий спред с обеих сторон, отдает примерно два цента, или 0,02% от номинала. При шаге сетки в один доллар это составляет около 2% от валовой прибыли за рейс. Расширьте спред до пяти центов — обычная цифра для менее ликвидной бумаги — и тот же рейс отдает десять центов против доллара валовой прибыли, или 10%. Уменьшение шага сетки до десяти центов для улавливания большего числа колебаний сокращает валовую прибыль за рейс до десяти центов, оставляя издержки неизменными, и спред в пять центов теперь поглощает всю сделку.

Эта зависимость устанавливает нижний предел для полезного шага сетки: шаги должны оставаться большими по сравнению с издержками кругового рейса, и чем уже сетка, тем большая часть ее дохода принадлежит бирже, а не оператору.

Почему бэктесты льстят сеточным ботам

Сеточные стратегии дают необычайно привлекательные результаты бэктестов, и четыре структурные причины объясняют большую часть этого.

  1. Выбор диапазона с оглядкой на прошлое. Границы, выбранные после просмотра данных, будут содержать эти данные. Сетка, подогнанная под период, который находился в диапазоне, покажет высокий процент успешных сделок на этом периоде.
  2. Незакрытая лестница. Тест, который останавливается на выбранную конечную дату, часто учитывает реализованные круговые рейсы, щедро оценивая оставшиеся запасы. Честный учет оценивает открытую позицию по рыночной цене на последний день и включает этот убыток в результат.
  3. Допущения об исполнении. Смоделированные лимитные ордера исполняются всякий раз, когда цена их касается. Реальные очереди не всегда исполняются при касании, и рейсы, которые не исполняются, непропорционально часто оказываются прибыльными на быстрых рынках.
  4. Плотность параметров. Границы, количество линий, шаг и размер ордера дают четыре регулятора для одного ценового ряда, чего достаточно, чтобы подогнаться почти под любое историческое окно.

Приведенные выше количества пересечений являются противовесом всем четырем пунктам. Они получены исключительно из истории цен, без каких-либо настроек, и они варьируются от года к году таким образом, который не контролируется выбором параметров. Любой, кто оценивает утверждение о сетке, может задать ему один вопрос: от скольких завершенных круговых рейсов это зависит, и откуда взялось это количество? Период практики на симуляторе с оценкой открытой лестницы по рыночной цене в конце отвечает на него более честно, чем график реализованных рейсов.

Часто задаваемые вопросы

Действительно ли сеточные торговые боты приносят деньги?

Сетка зарабатывает ограниченную прибыль на каждом завершенном круговом рейсе и несет неограниченную открытую позицию, когда цена покидает ее диапазон. Перевесят ли реализованные рейсы открытую позицию за какой-либо период, зависит от того, насколько сильно рынок колебался внутри этого диапазона, что является свойством рынка, а не программного обеспечения.

Какие рыночные условия подходят для сеточного бота?

Механизм создан для цены, которая неоднократно возвращается к одним и тем же уровням: большое общее пройденное расстояние относительно чистого движения. В приведенной выше панели из двенадцати названий коэффициенты эффективности варьировались от 0.2% на блуждающем конце до 14.3% на направленном конце, и механизм лестницы встречает свои собственные ступеньки только на первом конце.

Что происходит, когда цена выходит за пределы диапазона сетки?

Выше диапазона бот продал свои запасы и сидит в кэше, в то время как рынок продолжает движение без него. Ниже диапазона он держит каждую ступеньку, купленную на пути вниз, по средней цене выше текущей, и каждое дальнейшее падение расширяет этот нереализованный убыток.

Чем сеточная торговля отличается от усреднения долларовой стоимости?

Оба покупают больше при падении цены, и на этом сходство заканчивается. Усреднение долларовой стоимости добавляет фиксированную сумму по фиксированному графику без правила выхода и без верхней границы. Сетка покупает и продает по ценовым триггерам внутри заранее выбранного диапазона, и ее поведение полностью меняется, как только цена покидает этот диапазон.

Приводит ли более плотный шаг сетки к большему доходу?

Более плотный шаг увеличивает количество круговых рейсов и снижает валовую прибыль по каждому из них, в то время как стоимость кругового рейса остается прежней. После определенной точки, заданной спредом, дополнительные рейсы вычитаются из общей суммы, а не прибавляются к ней.


Каждая цифра выше получена из сохраненного, версионированного запроса по реальным ценам акций; откройте SQL под любой панелью, чтобы проверить его, или измерьте перемещение относительно чистого движения по вашему собственному списку названий на терминале Strasmore.

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