торговий бот із сіткою чесний огляд
Торговий бот із сіткою купує на кожному кроці вниз і продає на кожному кроці вгору у фіксованому діапазоні. Подивіться, яка форма ринку окупає механізм, а яка ламає його.
Торговий бот із сіткою розміщує лінійку ордерів із фіксованими ціновими інтервалами: ордер на купівлю на кожному щаблі нижче поточної ціни, ордер на продаж на кожному щаблі вище неї. Щоразу, коли ринок опускається на крок, бот купує. Щоразу, коли він повертається на крок вгору, бот продає те, що купив дешевше. Механізм збирає коливання, і він накопичує відкриту позицію, коли ринок віддаляється від сітки в одному напрямку та продовжує рух.
Ця сторінка розбирає механізм на частини, а потім вимірює дві ринкові форми, які визначають його результат. Кожна панель нижче — це збережений запит до реальних цін на акції США, прив'язаний до фіксованих дат, щоб цифри залишалися відтворюваними.
Як працює торговий бот із сіткою
Три параметри визначають сітку: верхня та нижня межі діапазону, кількість ліній всередині нього та розмір ордера на кожній лінії. Відстань між лініями випливає з перших двох.
Ось арифметика, з використанням круглих чисел, обраних для ясності, а не з будь-якої реальної котирування. Припустимо, акція торгується близько $100, і оператор встановлює сітку від $95 до $105 з одинадцятьма лініями на відстані одного долара та 100 акціями на лінію. Ціна падає до $99, і лімітний ордер на купівлю виконується. Ціна повертається до $100, і відповідний ордер на продаж виконується, закриваючи пару з валовим прибутком $100. Обидва ордери переозброюються. За цю годину в компанії нічого не змінилося. Позиція просто здійснила повний цикл між двома сусідніми щаблями.
У проєктах з відкритим кодом, які циркулюють публічно, зустрічаються два варіанти. Арифметична сітка розташовує лінії на фіксовану грошову суму. Геометрична сітка розташовує їх на фіксований відсоток, що підтримує стабільний відсотковий прибуток за повний цикл у широкому діапазоні. Документація також розділяє нейтральну сітку, яка починається з нульовою позицією та працює в обох напрямках, і довгу сітку, яка починає з утриманням запасу та продає на зростанні.
Форма винагороди заслуговує на одне просте речення. Прибуток за завершений повний цикл обмежений одним кроком сітки за вирахуванням витрат. Відкрита позиція, яка накопичується, коли ціна залишає діапазон, не має відповідного обмеження.
Ринкова форма, яка потрібна сітці
Сітка отримує плату за рух, а не за напрямок. Дві акції можуть закінчити період за однаковою ціною, подолавши при цьому дуже різні відстані. Додавання абсолютної величини кожного денного руху дає загальну пройдену відстань. Ділення чистого руху на цю відстань дає коефіцієнт ефективності, стандартний показник того, наскільки спрямованим був шлях. Низький коефіцієнт описує шлях, який блукав. Високий коефіцієнт описує прямий марш.
Точний 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Прочитайте перший і останній рядки разом. PG покрив 527% сукупного денного руху та закінчився на відстані 0.9% від точки старту, що дає ефективність 0.2%. SPY знаходиться на протилежному кінці з 14.3%, перетворюючи 415% руху на чистий зсув у 59.2%. Сітка, розміщена на першому шляху, знову і знову зустрічає власні щаблі. Та сама сітка, розміщена на другому шляху, залишається позаду.
Спокійний та обмежений діапазоном — це пов'язані, але різні властивості. Акція може повільно зростати дуже малими щоденними кроками і все одно залишити сітку без руху, що є однією з причин, чому назви, досліджені в літературі про аномалію низької волатильності, не є автоматично матеріалом для сітки.
Підрахунок повних циклів
Ефективність — це один об'єктив. Дохід сітки залежить від більш конкретної речі: скільки разів ціна фактично повертається на певний рівень. Прив'язуючись до першого закриття кожного календарного року та підраховуючи сесії, чиє закриття опиняється на протилежному боці цього якоря, ми отримуємо кількість перетинів, які б спіймала одна лінія сітки. Тут об'єктом є Coca-Cola (KO), великий, ліквідний споживчий бренд того типу, який зазвичай фігурує в документації щодо сіток.
Точний 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У 2019 ціна закриття перетнула власний рівень відкриття 8 разів протягом 252 сесій, закінчивши рік на відстані 17.9% від цього рівня. У 2025 кількість становила 6 за 250 сесій, з чистою зміною 13%. Одна лінія, одна акція, і сировина для сітки змінюється в кілька разів від року до року без можливості заздалегідь знати кількість наступного року.
Ця мінливість є тихою проблемою. Заявлена дохідність сітки зазвичай наводиться на один завершений повний цикл, а кількість повних циклів визначається ринком, а не налаштуваннями.
Де сітка ламається
Режим відмови має специфічну форму. Зафіксуйте сітку в діапазоні, а потім дозвольте ринку вийти з нього. Нижче стеля та підлога — це найвище та найнижче закриття перших двадцяти сесій 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Діапазон простягається від $467.27 до $491.26. Перший місяць у серії закрився на рівні $482.92, всередині нього. Останній із 30 місяців закрився на рівні $746.32, значно вище стелі, і графік показує, як лінія залишає діапазон і ніколи не повертається.
Пройдіться по тому, що робить сітка вздовж цього шляху. Піднімаючись через діапазон, бот продає запас щабель за щаблем, фіксуючи один крок прибутку щоразу. Вище стелі він тримає готівку та спостерігає. Кожен наступний пункт зростання — це прибуток, в якому оператор більше не бере участі, що є м'якою версією відмови.
Серйозна версія — це дзеркальне відображення. Ціна падає нижче підлоги, і бот купив на кожному щаблі на шляху вниз, тому тепер він тримає повну лінійку запасу за середньою ціною вище ринкової, причому кожен додатковий крок збільшує нереалізований збиток. Діапазон, який колись приносив стабільні, невеликі, візуально успішні угоди, перетворюється на єдину концентровану позицію. Маркетинг сіток описує це як бот, що «застряг»; у виписці брокера це відкрита просадка без вбудованого виходу.
Витрати зростають з кількістю угод
Сітка виконує багато дрібних угод, і кожна з них оплачує повну вартість повного циклу: спред, плюс комісії або біржові збори, де вони застосовуються. Спред між ціною покупки та продажу — це частина, яку найчастіше опускають у математиці сітки, оскільки вона ніколи не з'являється у виписці окремим рядком.
Ілюстративна арифметика швидка. Для акції за $100 зі спредом в один цент, повний цикл, який перетинає спред з обох боків, віддає приблизно два центи, або 0,02% від номіналу. Проти кроку сітки в один долар це близько 2% валового прибутку за цикл. Розширте спред до п'яти центів, звичайна цифра для менш ліквідної акції, і той самий цикл віддає десять центів проти долара валового прибутку, або 10%. Звуження сітки до кроків у десять центів, щоб вловити більше коливань, знижує валовий прибуток за цикл до десяти центів, залишаючи витрати незмінними, і спред у п'ять центів тепер поглинає всю угоду.
Це співвідношення встановлює нижню межу для корисного кроку сітки: кроки повинні залишатися великими відносно витрат на повний цикл, і чим щільніша сітка, тим більша частка її доходу належить майданчику, а не оператору.
Чому бектести прикрашають ботів із сіткою
Стратегії з сіткою дають надзвичайно привабливі результати бектестів, і чотири структурні причини пояснюють більшу частину цього.
- Вибір діапазону з оглядкою на минуле. Межі, обрані після перегляду даних, будуть містити ці дані. Сітка, підігнана до періоду, який коливався в діапазоні, покаже високий відсоток успішних угод у цьому періоді.
- Незакрита сітка. Тест, який зупиняється на вибраній кінцевій даті, часто враховує реалізовані повні цикли, щедро оцінюючи залишковий запас. Чесний облік оцінює відкриту позицію за ринковою вартістю на останній день і включає цей збиток у результат.
- Припущення щодо виконання. Змодельовані лімітні ордери виконуються щоразу, коли ціна їх торкається. Реальні черги не завжди виконуються при дотику, і цикли, які не виконуються, непропорційно часто є прибутковими на швидких ринках.
- Щільність параметрів. Межі, кількість ліній, крок і розмір ордера дають чотири регулятори для одного цінового ряду, чого достатньо, щоб підігнати майже будь-яке історичне вікно.
Наведені вище підрахунки перетинів є противагою всім чотирьом. Вони походять виключно з історії цін, без жодних налаштувань, і змінюються від року до року таким чином, який не контролюється жодним вибором параметрів. Кожен, хто оцінює заяву про сітку, може поставити їй одне запитання: скільки завершених повних циклів передбачає ця заява, і звідки взялася ця кількість? Період практики на симуляторі, з відкритою сіткою, оціненою за ринковою вартістю в кінці, відповідає на нього чесніше, ніж графік реалізованих циклів.
FAQ
Чи справді торгові боти з сіткою заробляють гроші?
Сітка отримує обмежений прибуток за кожен завершений повний цикл і несе необмежену відкриту позицію, коли ціна залишає її діапазон. Чи переважать реалізовані цикли відкриту позицію за будь-який період, залежить від того, наскільки ринок коливався всередині цього діапазону, що є властивістю ринку, а не програмного забезпечення.
Які ринкові умови підходять для бота з сіткою?
Механізм створений для ціни, яка неодноразово повертається до одних і тих же рівнів: велика загальна пройдена відстань відносно чистого руху. У панелі з дванадцяти назв вище коефіцієнти ефективності коливалися від 0.2% на блукаючому кінці до 14.3% на спрямованому кінці, і механізм сітки зустрічає власні щаблі лише на першому кінці.
Що відбувається, коли ціна виривається з діапазону сітки?
Вище діапазону бот продав свій запас і сидить у готівці, поки ринок продовжує рух без нього. Нижче діапазону він тримає кожен щабель, який купив на шляху вниз, за середньою ціною вище поточної, і кожне подальше падіння збільшує цей нереалізований збиток.
Чим сіткова торгівля відрізняється від усереднення доларової вартості?
Обидві купують більше, коли ціна падає, і на цьому схожість закінчується. Усереднення доларової вартості додає фіксовану суму за фіксованим графіком без правила виходу та без верхньої межі. Сітка купує та продає за ціновими тригерами всередині заздалегідь обраного діапазону, і її поведінка повністю змінюється, коли ціна залишає цей діапазон.
Чи приносить щільніший крок сітки більший дохід?
Щільніший крок збільшує кількість повних циклів і знижує валовий прибуток на кожному з них, тоді як вартість повного циклу залишається незмінною. Після певної точки, встановленої спредом, додані цикли починають віднімати від загальної суми, а не додавати до неї.
Кожна цифра вище походить із збереженого версійного запиту до реальних цін на акції; відкрийте SQL під будь-якою панеллю, щоб перевірити його, або виміряйте рух проти чистого руху за власним списком назв на терміналі Strasmore.