boty gridowe analiza szczera
Bot gridowy kupuje na każdym szczeblu poniżej ceny bieżącej i sprzedaje na każdym powyżej w ustalonym zakresie. Sprawdź, jaki kształt rynku wynagradza ten mechanizm, a jaki go psuje.
Bot gridowy umieszcza kaskadę zleceń w stałych odstępach cenowych: zlecenie kupna na każdym szczeblu poniżej bieżącej ceny, zlecenie sprzedaży na każdym szczeblu powyżej. Gdy rynek spada, bot kupuje. Gdy rynek wraca w górę, bot sprzedaje to, co kupił niżej. Mechanizm ten zbiera zyski z wahań, ale akumuluje otwartą pozycję, gdy rynek oddala się od drabiny w jednym kierunku i kontynuuje marsz.
Niniejsza strona rozkłada ten mechanizm na części pierwsze, a następnie mierzy dwa kształty rynku, które decydują o jego wyniku. Każdy panel poniżej to zapytanie przechowywane na rzeczywistych cenach akcji amerykańskich, przypięte do ustalonych dat, aby liczby pozostały odtwarzalne.
Jak działa bot gridowy
Trzy ustawienia definiują siatkę: górna i dolna granica zakresu, liczba linii wewnątrz niego oraz wielkość zlecenia na każdej linii. Odstęp między liniami wynika z dwóch pierwszych parametrów.
Oto arytmetyka, używająca okrągłych liczb wybranych dla przejrzystości, a nie z żadnego rzeczywistego kwotowania. Załóżmy, że akcje kosztują około 100 USD, a operator ustawia siatkę od 95 do 105 USD z jedenastoma liniami oddalonymi o jednego dolara i 100 akcjami na linię. Cena spada do 99 USD i realizuje się oczekujące zlecenie kupna. Cena wraca do 100 USD i realizuje się pasujące zlecenie sprzedaży, zamykając parę z zyskiem brutto 100 USD. Oba zlecenia są ponownie uzbrajane. W ciągu tej godziny nic się nie zmieniło w spółce. Pozycja po prostu wykonała rundę między dwoma sąsiednimi szczeblami.
W projektach open-source, które krążą publicznie, pojawiają się dwa warianty. Siatka arytmetyczna rozmieszcza linie o stałą kwotę w dolarach. Siatka geometryczna rozmieszcza je o stały procent, co utrzymuje stały procentowy zysk na rundę w szerokim zakresie. Dokumentacja rozróżnia również siatkę neutralną, która zaczyna się od zera i działa w obu kierunkach, od siatki długiej, która zaczyna od posiadania zapasów i sprzedaje przy wzrostach.
Kształt wypłaty zasługuje na jedno proste zdanie. Zysk na zakończonej rundzie jest ograniczony do jednego kroku siatki minus koszty. Otwarta pozycja, która narasta, gdy cena opuszcza zakres, nie ma odpowiadającego jej ograniczenia.
Kształt rynku, którego potrzebuje siatka
Siatka jest opłacana za podróż, a nie za kierunek. Dwie akcje mogą zakończyć okres po tej samej cenie, pokonując radykalnie różne odległości. Zsumowanie bezwzględnej wielkości każdego dziennego ruchu daje całkowitą przebytą odległość. Podzielenie ruchu netto przez tę odległość daje wskaźnik efektywności, standardową miarę tego, jak kierunkowa była ścieżka. Niski wskaźnik opisuje ścieżkę, która błądziła. Wysoki wskaźnik opisuje prosty marsz.
Dokładny kod SQL dla każdej liczby
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_pctPrzeczytaj pierwszy i ostatni wiersz razem. PG pokrył 527% skumulowanego dziennego ruchu i zakończył 0.9% od punktu startu, co daje efektywność 0.2%. SPY znajduje się na przeciwnym końcu z 14.3%, zamieniając 415% podróży w ruch netto 59.2%. Drabina siatki umieszczona na pierwszej ścieżce spotyka swoje własne szczeble wielokrotnie. Ta sama drabina umieszczona na drugiej ścieżce zostaje w tyle.
Spokój i ruch boczny to pokrewne, ale odrębne właściwości. Akcje mogą dryfować w górę bardzo małymi dziennymi przyrostami i nadal pozostawiać siatkę osieroconą, co jest jednym z powodów, dla których nazwy badane w literaturze dotyczącej anomalii niskiej zmienności nie są automatycznie materiałem na siatkę.
Liczenie rund
Efektywność to jedna perspektywa. Dochód siatki zależy od czegoś bardziej konkretnego: ile razy cena faktycznie powraca do danego poziomu. Opierając się na pierwszym zamknięciu każdego roku kalendarzowego i zliczając sesje, których zamknięcie ląduje po przeciwnej stronie tego punktu odniesienia, otrzymujemy liczbę przecięć, które złapałaby pojedyncza linia siatki. Przedmiotem jest tutaj Coca-Cola (KO), duża, płynna nazwa konsumencka, którą dokumentacja siatki zwykle przedstawia.
Dokładny kod SQL dla każdej liczby
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 yearW 2019 zamknięcie przekroczyło własny poziom otwarcia 8 razy w ciągu 252 sesji, kończąc rok 17.9% od tego poziomu. W 2025 liczba ta wyniosła 6 w ciągu 250 sesji, ze zmianą netto 13%. Jedna linia, jedna spółka, a surowiec dla siatki zmienia się kilkukrotnie z roku na rok, bez możliwości poznania z góry liczby na nadchodzący rok.
Ta zmienność jest cichym problemem. Reklamowany zwrot z siatki jest zwykle podawany na ukończoną rundę, a liczba rund jest ustalana przez rynek, a nie przez ustawienia.
Gdzie siatka się załamuje
Tryb awarii ma specyficzny kształt. Ustal siatkę w pewnym zakresie, a następnie pozwól rynkowi go opuścić. Poniżej sufit i podłoga to najwyższe i najniższe zamknięcia pierwszych dwudziestu sesji 2024 roku, utrzymywane na stałym poziomie przez kolejne trzydzieści miesięcy, z miesięcznym zamknięciem trackera S&P 500 naniesionym na nie.
Dokładny kod SQL dla każdej liczby
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_startPasmo biegnie od 467.27 USD do 491.26 USD. Pierwszy miesiąc w serii zamknął się na 482.92 USD, wewnątrz niego. Ostatni z 30 miesięcy zamknął się na 746.32 USD, daleko powyżej sufitu, a wykres pokazuje linię opuszczającą pasmo i nigdy nie wracającą.
Przejdź przez to, co robi drabina na tej ścieżce. Rosnąc w zakresie, bot sprzedaje zapasy szczebel po szczeblu, bankując jeden krok zysku za każdym razem. Powyżej sufitu trzyma gotówkę i patrzy. Każdy dalszy punkt wzrostu to zysk, w którym operator już nie uczestniczy, co jest łagodną wersją awarii.
Poważna wersja jest lustrzanym odbiciem. Cena spada poniżej podłogi, a bot kupił na każdym szczeblu w dół, więc teraz trzyma pełną drabinę zapasów po średnim koszcie powyżej rynku, a każdy dodatkowy krok poszerza niezrealizowaną stratę. Zakres, który kiedyś produkował stałe, małe, widocznie udane transakcje, zamienia się w jedną skoncentrowaną pozycję. Marketing gridowy opisuje to jako bot „utknął”; na wyciągu brokerskim jest to otwarty drawdown bez wbudowanego wyjścia.
Koszty skalują się z liczbą transakcji
Siatka realizuje wiele małych transakcji, a każda z nich ponosi pełny koszt rundy: spread, plus prowizje lub opłaty giełdowe, jeśli mają zastosowanie. Spread bid-ask to element najczęściej pomijany w matematyce siatki, ponieważ nigdy nie pojawia się na wyciągu jako osobna pozycja.
Ilustracyjna arytmetyka jest szybka. W przypadku akcji o wartości 100 USD z spreadem jednego centa, runda, która przekracza spread po obu stronach, oddaje około dwóch centów, czyli 0,02% wartości nominalnej. W porównaniu z krokiem siatki o wartości jednego dolara, stanowi to około 2% zysku brutto na podróż. Poszerz spread do pięciu centów, rutynowej wartości dla cieńszej spółki, a ta sama podróż oddaje dziesięć centów wobec dolara brutto, czyli 10%. Zacieśnienie siatki do kroków dziesięciocentowych, aby złapać więcej wahań, obniża zysk brutto na podróż do dziesięciu centów, pozostawiając koszt bez zmian, a spread pięciu centów pochłania teraz całą transakcję.
Ta zależność wyznacza dolną granicę użytecznego odstępu siatki: kroki muszą pozostać duże w stosunku do kosztów rundy, a im ciaśniejsza siatka, tym większa część jej dochodu należy do miejsca transakcji, a nie do operatora.
Dlaczego backtesty faworyzują boty gridowe
Strategie gridowe dają niezwykle atrakcyjne backtesty, a cztery strukturalne przyczyny wyjaśniają to w większości.
- Wybór zakresu z perspektywy czasu. Granice wybrane po zobaczeniu danych będą zawierać te dane. Siatka dopasowana do okresu, który poruszał się bocznie, pokaże wysoki wskaźnik trafień w tym okresie.
- Niezamknięta drabina. Test, który zatrzymuje się w wybranym dniu końcowym, często liczy zrealizowane rundy, traktując pozostałe zapasy hojnie. Uczciwa księgowość wycenia otwartą pozycję według rynku w ostatnim dniu i uwzględnia tę stratę w wyniku.
- Założenia dotyczące realizacji. Symulowane oczekujące zlecenia realizują się, gdy tylko cena ich dotknie. Rzeczywiste kolejki nie zawsze realizują się przy dotknięciu, a podróże, które nie zostają zrealizowane, są nieproporcjonalnie tymi dochodowymi na szybkich rynkach.
- Gęstość parametrów. Granice, liczba linii, odstępy i wielkość zlecenia dają cztery pokrętła dla jednego szeregu cenowego, co wystarcza, aby dopasować prawie każde historyczne okno.
Powyższe liczby przecięć są przeciwwagą dla wszystkich czterech. Pochodzą wyłącznie z historii cen, bez żadnych ustawień, i zmieniają się z roku na rok w sposób, którego nie kontroluje żaden wybór parametrów. Każdy, kto ocenia twierdzenie dotyczące siatki, może zadać mu jedno pytanie: od ilu ukończonych rund to zależy i skąd pochodzi ta liczba? Okres praktyki na symulatorze, z otwartą drabiną wycenioną według rynku na koniec, odpowiada na to uczciwiej niż wykres zrealizowanych podróży.
FAQ
Czy boty gridowe rzeczywiście zarabiają pieniądze?
Siatka zarabia ograniczony zysk na każdej ukończonej rundzie i utrzymuje nieograniczoną otwartą pozycję, gdy cena opuszcza jej zakres. To, czy zrealizowane podróże przewyższą otwartą pozycję w danym okresie, zależy od tego, jak bardzo rynek wahał się w tym zakresie, co jest właściwością rynku, a nie oprogramowania.
Jakie warunki rynkowe sprzyjają botowi gridowemu?
Mechanizm jest zbudowany dla ceny, która wielokrotnie powraca do tych samych poziomów: duża całkowita przebyta odległość w stosunku do ruchu netto. W powyższym panelu dwunastu spółek wskaźniki efektywności wahały się od 0.2% na końcu błądzącym do 14.3% na końcu kierunkowym, a mechanizm drabiny spotyka swoje własne szczeble tylko na pierwszym końcu.
Co się dzieje, gdy cena wybija się z zakresu siatki?
Powyżej zakresu bot sprzedał swoje zapasy i siedzi w gotówce, podczas gdy rynek kontynuuje bez niego. Poniżej zakresu trzyma każdy szczebel, który kupił w drodze w dół, po średnim koszcie powyżej bieżącej ceny, a każdy dalszy spadek poszerza tę niezrealizowaną stratę.
Czym handel gridowy różni się od uśredniania kosztu dolara?
Oba kupują więcej, gdy cena spada, i na tym podobieństwo się kończy. Uśrednianie kosztu dolara dodaje stałą kwotę według stałego harmonogramu, bez reguły wyjścia i bez górnej granicy. Siatka kupuje i sprzedaje na podstawie wyzwalaczy cenowych w zakresie wybranym z góry, a jej zachowanie zmienia się całkowicie, gdy cena opuści ten zakres.
Czy ciaśniejszy odstęp siatki generuje wyższy dochód?
Ciaśniejszy odstęp zwiększa liczbę rund i obniża zysk brutto na każdej z nich, podczas gdy koszt rundy pozostaje taki sam. Po przekroczeniu punktu wyznaczonego przez spread, dodatkowe podróże odejmują od sumy, zamiast do niej dodawać.
Każda powyższa liczba pochodzi z przechowywanego, wersjonowanego zapytania na rzeczywistych cenach akcji; otwórz SQL pod dowolnym panelem, aby to sprawdzić, lub zmierz podróż w stosunku do ruchu netto na własnej liście spółek na terminalu Strasmore.