Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

그리드 트레이딩 봇 분석

그리드 트레이딩 봇은 고정 범위 내에서 매수/매도하며 변동성을 활용합니다. 시장 형태에 따라 수익이 결정되는 메커니즘을 분석합니다. 실제 미국 주식 가격 데이터를 기반으로 작동 방식을 설명합니다.

그리드 거래 봇은 고정된 가격 간격으로 주문 계단을 배치합니다. 현재 가격보다 낮은 각 단계에서는 매수하고, 현재 가격보다 높은 각 단계에서는 매도합니다. 시장이 하락할 때마다 봇은 매수합니다. 시장이 다시 상승할 때마다 봇은 더 낮은 가격에 매수한 것을 매도합니다. 이 메커니즘은 변동성을 활용하며, 시장이 한 방향으로 계단에서 벗어나 계속 움직일 때 개설 포지션을 축적합니다.

이 페이지에서는 해당 메커니즘을 분석하고 그 결과를 결정하는 두 가지 시장 형태를 측정합니다. 아래의 모든 패널은 실제 미국 주식 가격에 대한 저장된 쿼리이며, 수치를 재현 가능하게 유지하기 위해 고정된 날짜에 고정됩니다.

그리드 트레이딩 봇 작동 방식

그리드는 세 가지 설정으로 정의됩니다: 범위의 상한선과 하한선, 그 안의 그리드 라인 수, 그리고 각 라인의 주문 크기입니다. 라인 간의 간격은 처음 두 가지에서 파생됩니다.

명확성을 위해 실제 호가에서 나온 것이 아닌, 단순한 숫자를 사용한 산술 계산은 다음과 같습니다. 주가가 100달러 근처에서 거래되고 운영자가 95달러에서 105달러까지의 그리드를 설정하고, 1달러 간격으로 11개의 라인과 각 라인당 100주를 설정했다고 가정해 봅시다. 가격이 99달러로 하락하면 대기 중이던 매수 주문이 체결됩니다. 가격이 100달러로 돌아오면 해당 매도 주문이 체결되어 한 쌍이 완료되며, 총 100달러의 수익이 발생합니다. 두 주문 모두 다시 설정됩니다. 그 시간 동안 회사에 대한 아무것도 변하지 않았습니다. 포지션은 단순히 두 인접한 그리드 라인 사이의 왕복 거래를 완료한 것입니다.

공개적으로 유통되는 오픈 소스 프로젝트에는 두 가지 변형이 있습니다. 산술 그리드는 고정된 달러 금액으로 라인을 간격을 둡니다. 기하 그리드는 고정된 비율로 라인을 간격을 두어, 넓은 범위에 걸쳐 왕복 거래당 수익률을 일정하게 유지합니다. 또한, 중립 그리드는 평평하게 시작하여 양방향으로 작동하는 반면, 롱 그리드는 재고를 보유한 상태로 시작하여 가격 상승 시 매도하는 것으로 구분됩니다.

수익 곡선은 한 문장으로 설명할 가치가 있습니다. 완료된 왕복 거래의 수익은 비용을 제외한 그리드 한 단계로 제한됩니다. 가격이 범위를 벗어날 때 발생하는 미결제 포지션은 해당되는 상한선이 없습니다.

시장이 필요로 하는 그리드의 형태

그리드는 방향이 아닌 이동 거리에 의해 결정됩니다. 두 주식이 동일한 가격으로 기간을 마칠 수 있지만, 그 과정에서 매우 다른 거리를 이동했을 수 있습니다. 매일의 모든 절대적인 움직임을 합산하면 총 이동 거리가 됩니다. 순 이동 거리를 총 이동 거리로 나누면 효율성 비율이 나오는데, 이는 경로의 방향성을 측정하는 표준 지표입니다. 낮은 비율은 헤매는 경로를 나타냅니다. 높은 비율은 직선적인 행진을 나타냅니다.

조회이동 거리 대 순 이동: 12개 주요 주식, 2024년 1월 ~ 2026년 6월
모든 수치 뒤에 숨겨진 정확한 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%의 효율성을 보였습니다. SPY14.3%로 반대편에 위치하며, 415%의 이동 거리를 59.2%의 순 이동으로 전환했습니다. 첫 번째 경로에 배치된 그리드 사다리는 반복적으로 자신의 칸을 만납니다. 두 번째 경로에 배치된 동일한 사다리는 뒤처집니다.

안정성과 범위 제한은 관련이 있지만 구별되는 속성입니다. 주식이 매우 작은 일일 증분으로 상승할 수 있지만 그리드를 뒤처지게 만들 수 있습니다. 이것이 낮은 변동성 이상 현상 문헌에서 연구된 종목들이 자동으로 그리드 재료가 되지 않는 이유 중 하나입니다.

라운드 트립 횟수 계산

효율성은 하나의 관점입니다. 그리드 수익은 더 구체적인 것에 달려 있습니다. 즉, 가격이 실제로 특정 수준을 몇 번 재방문하는가 하는 것입니다. 각 달력 연도의 첫 번째 종가를 기준으로 삼고, 해당 기준점의 반대편에 종가가 위치하는 세션 수를 세면 단일 그리드 라인이 포착했을 교차 횟수를 알 수 있습니다. 코카콜라(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년 첫 20거래일의 최고 및 최저 종가이며, 이후 30개월 동안 평평하게 유지됩니다. 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달러 주식에 1센트 스프레드가 있는 경우, 양방향으로 스프레드를 넘어서는 왕복 거래는 명목 가치의 약 2센트, 즉 0.02%를 포기하게 됩니다. 1달러 그리드 단계에 대해 이는 거래당 총이익의 약 2%입니다. 스프레드를 5센트로 넓히면, 거래량이 적은 종목에서 일반적인 수치이며, 동일한 거래는 1달러의 총이익 대비 10센트를 포기하게 되며, 이는 10%에 해당합니다. 변동성을 더 많이 포착하기 위해 그리드를 10센트 단계로 좁히면 거래당 총이익은 10센트로 줄어들지만 비용은 변하지 않으며, 5센트 스프레드는 이제 전체 거래를 소모하게 됩니다.

이러한 관계는 유용한 그리드 간격의 하한선을 설정합니다. 단계는 왕복 비용에 비해 커야 하며, 그리드가 좁을수록 수익의 더 많은 부분이 운영자가 아닌 거래소에 귀속됩니다.

백테스트에서 그리드 봇이 과대평가되는 이유

그리드 전략은 비정상적으로 매력적인 백테스트 결과를 생성하며, 네 가지 구조적 이유가 대부분을 설명합니다.

  1. 사후 검토를 통한 범위 선정. 데이터를 본 후에 선택된 범위는 해당 데이터를 포함하게 됩니다. 특정 기간 동안 가격이 움직인 경우, 해당 기간에 맞춰 설정된 그리드는 높은 적중률을 보일 것입니다.
  2. 미청산 주문. 특정 종료일에 중단되는 테스트는 종종 실현된 왕복 거래를 계산하면서 남은 재고를 관대하게 처리합니다. 정직한 회계는 마지막 날에 미청산 포지션을 시장 가격으로 평가하고 해당 손실을 결과에 포함시킵니다.
  3. 체결 가정. 시뮬레이션된 대기 주문은 가격이 닿으면 체결됩니다. 실제 주문 대기열은 항상 가격이 닿는다고 해서 체결되는 것은 아니며, 체결되지 못한 거래는 변동성이 큰 시장에서 수익성이 높은 거래일수록 불균형적으로 많습니다.
  4. 매개변수 밀도. 범위, 라인 수, 간격, 주문 크기는 하나의 가격 시리즈에 대해 네 가지 설정을 제공하며, 이는 거의 모든 과거 데이터를 맞추기에 충분합니다.

위의 교차 횟수는 이 네 가지에 대한 반박 근거가 됩니다. 이는 설정 없이 가격 이력만으로 산출되며, 매개변수 선택으로는 제어할 수 없는 방식으로 연도별로 달라집니다. 그리드 주장을 평가하는 사람은 단 한 가지 질문을 할 수 있습니다. 이 주장은 몇 건의 완료된 왕복 거래에 의존하며, 그 횟수는 어디에서 나온 것인가? 시뮬레이터에서의 연습 기간 동안, 종료 시 미청산 주문을 시장 가격으로 평가하는 것이 실현된 거래 차트보다 더 정직하게 답을 줄 것입니다.

FAQ

그리드 트레이딩 봇으로 실제로 돈을 벌 수 있습니까?

그리드는 각 완료된 왕복 거래에서 제한된 이익을 얻으며, 가격이 범위를 벗어날 경우 무제한의 미결제 포지션을 유지합니다. 특정 기간 동안 실현된 왕복 거래가 미결제 포지션을 초과하는지는 해당 범위 내에서 시장이 얼마나 많이 변동했는지에 따라 달라지며, 이는 소프트웨어의 속성이 아니라 시장의 속성입니다.

어떤 시장 상황에 그리드 봇이 적합합니까?

이 메커니즘은 동일한 수준을 반복적으로 다시 방문하는 가격에 맞춰져 있습니다. 즉, 순 이동 거리에 비해 총 이동 거리가 높습니다. 위에서 제시된 12개 종목 패널에서 효율성 비율은 방황하는 끝의 0.2%부터 방향성 끝의 14.3%까지였으며, 그리드 메커니즘은 첫 번째 끝에서만 자체 발판을 만납니다.

그리드 범위를 벗어나면 어떻게 됩니까?

범위 위에서는 봇이 재고를 모두 판매하고 현금 상태로 유지되며 시장은 계속 진행됩니다. 범위 아래에서는 하락하는 동안 매수한 모든 발판을 현재 가격보다 높은 평균 매수 단가로 보유하게 되며, 추가 하락할 때마다 미실현 손실이 확대됩니다.

그리드 트레이딩은 달러 코스트 애버리징과 어떻게 다릅니까?

두 방식 모두 가격 하락 시 더 많이 매수하지만, 그 외에는 유사점이 없습니다. 달러 코스트 애버징은 고정된 일정에 따라 고정된 금액을 추가하며, 종료 규칙이나 상한선이 없습니다. 그리드는 사전에 선택된 범위 내에서 가격 트리거에 따라 매수 및 매도를 수행하며, 가격이 해당 범위를 벗어나면 동작이 완전히 변경됩니다.

그리드 간격을 좁히면 더 많은 수익을 얻을 수 있습니까?

간격을 좁히면 왕복 거래 횟수가 늘어나고 각 거래의 총이익은 줄어드는 반면, 왕복 거래 비용은 동일하게 유지됩니다. 스프레드로 설정된 지점을 넘어서면 추가 거래는 총수익을 늘리는 대신 줄입니다.


위의 모든 수치는 실제 주가에 대한 저장되고 버전이 관리되는 쿼리에서 가져온 것입니다. SQL을 열어 확인하거나 Strasmore 터미널에서 자체 종목 목록에 대한 이동 거리를 순 이동 거리에 대해 측정할 수 있습니다.

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