Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

bot giao dịch lưới đánh giá trung thực

Bot lưới mua mỗi bậc xuống và bán mỗi bậc lên trong phạm vi cố định. Xem dạng thị trường nào trả tiền cho cơ chế và dạng nào phá vỡ nó.

Bot lưới (grid trading bot) đặt một chuỗi lệnh ở các mức giá cách đều nhau: lệnh mua ở mỗi bậc thang bên dưới giá hiện tại, lệnh bán ở mỗi bậc thang bên trên. Mỗi khi thị trường đi xuống một bậc, bot sẽ mua. Mỗi khi nó đi lên lại một bậc, bot sẽ bán số hàng đã mua ở mức thấp hơn. Cơ chế này thu lợi từ sự dao động, và nó tích lũy một vị thế mở bất cứ khi nào thị trường đi xa khỏi cái thang theo một hướng và tiếp tục đi tiếp.

Trang này mổ xẻ cơ chế, sau đó đo lường hai dạng thị trường quyết định kết quả của nó. Mỗi bảng bên dưới là một truy vấn đã được lưu trên dữ liệu giá cổ phiếu Mỹ thực tế, gắn với các ngày cố định để các con số có thể tái tạo lại.

Cách bot giao dịch lưới hoạt động

Ba cài đặt xác định một lưới: giới hạn trên và dưới của phạm vi, số lượng đường kẻ bên trong, và khối lượng lệnh tại mỗi đường kẻ. Khoảng cách giữa các đường kẻ được suy ra từ hai yếu tố đầu tiên.

Đây là phép tính, sử dụng các số tròn được chọn để dễ hiểu chứ không phải từ bất kỳ báo giá thực tế nào. Giả sử một cổ phiếu giao dịch quanh mức $100 và một nhà điều hành đặt lưới từ $95 đến $105 với mười một đường kẻ cách nhau một đô la và 100 cổ phiếu mỗi đường kẻ. Giá giảm xuống $99 và lệnh mua chờ được khớp. Giá quay lại $100 và lệnh bán tương ứng được khớp, kết thúc cặp giao dịch với lợi nhuận gộp $100. Cả hai lệnh đều được tái kích hoạt. Không có gì thay đổi về công ty trong giờ đó. Vị thế chỉ đơn giản là hoàn thành một vòng quay giữa hai bậc thang liền kề.

Hai biến thể xuất hiện trong các dự án mã nguồn mở được lưu hành công khai. Lưới số học (arithmetic grid) đặt các đường kẻ cách nhau một khoảng tiền cố định. Lưới hình học (geometric grid) đặt chúng cách nhau một tỷ lệ phần trăm cố định, giữ cho tỷ lệ lợi nhuận trên mỗi vòng quay ổn định trên một phạm vi rộng. Tài liệu cũng phân biệt lưới trung tính (neutral grid), bắt đầu bằng không và hoạt động theo cả hai hướng, với lưới dài (long grid), bắt đầu bằng cách nắm giữ hàng tồn kho và bán khi giá tăng.

Hình thức thanh toán xứng đáng có một câu đơn giản. Lợi nhuận trên một vòng quay hoàn chỉnh bị giới hạn ở một bước lưới trừ đi chi phí. Vị thế mở tích lũy khi giá rời khỏi phạm vi không có giới hạn tương ứng.

Dạng thị trường mà lưới cần

Một lưới được trả công dựa trên sự di chuyển, không phải hướng đi. Hai cổ phiếu có thể kết thúc một kỳ ở cùng một mức giá sau khi đã di chuyển những quãng đường rất khác nhau. Cộng dồn giá trị tuyệt đối của mọi biến động hàng ngày cho tổng quãng đường đã đi. Chia biến động ròng cho quãng đường đó cho tỷ lệ hiệu quả (efficiency ratio), một thước đo tiêu chuẩn về mức độ định hướng của một đường giá. Tỷ lệ thấp mô tả một đường giá dao động. Tỷ lệ cao mô tả một cuộc hành quân thẳng tắp.

Truy vấnQuãng đường đi so với biến động ròng: mười hai cổ phiếu quen thuộc, tháng 1/2024 đến tháng 6/2026
Câu lệnh SQL chính xác đằng sau mỗi con số
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

Đọc hàng đầu tiên và hàng cuối cùng cùng nhau. PG đã di chuyển 527% tổng biến động hàng ngày và kết thúc 0.9% so với điểm bắt đầu, đạt hiệu quả 0.2%. SPY nằm ở đầu đối diện với 14.3%, biến 415% quãng đường di chuyển thành biến động ròng 59.2%. Một cái thang lưới đặt trên đường giá đầu tiên sẽ gặp các bậc thang của chính nó lặp đi lặp lại. Cùng một cái thang đặt trên đường giá thứ hai sẽ bị bỏ lại phía sau.

Bình lặng (calm) và đi ngang trong biên độ (range-bound) là những đặc tính có liên quan nhưng khác biệt. Một cổ phiếu có thể trôi dạt lên trên theo những bước tăng hàng ngày rất nhỏ và vẫn khiến một lưới bị mắc kẹt, đó là một lý do tại sao các cái tên được nghiên cứu trong tài liệu về sự bất thường của biến động thấp không tự động trở thành chất liệu cho lưới.

Đếm số vòng quay

Hiệu quả là một góc nhìn. Thu nhập từ lưới phụ thuộc vào một thứ cụ thể hơn: số lần giá thực sự quay lại một mức. Neo vào mức đóng cửa đầu tiên của mỗi năm dương lịch và đếm các phiên có mức đóng cửa nằm ở phía đối diện của điểm neo đó cho số lần vượt qua mà một đường lưới duy nhất sẽ bắt được. Coca-Cola (KO) là chủ đề ở đây, một cái tên tiêu dùng lớn, thanh khoản cao mà tài liệu về lưới thường đề cập đến.

Truy vấnKO: số lần vượt mức mở cửa năm, theo năm dương lịch, 2019 đến 2025
Câu lệnh SQL chính xác đằng sau mỗi con số
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

Trong 2019, mức đóng cửa đã vượt qua mức mở cửa của chính nó 8 lần trong 252 phiên, kết thúc năm 17.9% so với mức đó. Trong 2025, con số này là 6 trong 250 phiên, với thay đổi ròng là 13%. Một đường kẻ, một cổ phiếu, và nguyên liệu thô cho một lưới thay đổi vài lần từ năm này sang năm khác mà không có cách nào biết trước số lượng của năm tới.

Sự biến thiên đó là vấn đề thầm lặng. Lợi nhuận được quảng cáo của một lưới thường được trích dẫn trên mỗi vòng quay hoàn chỉnh, và số vòng quay được thiết lập bởi thị trường chứ không phải bởi các cài đặt.

Nơi lưới bị phá vỡ

Chế độ thất bại có một hình dạng cụ thể. Cố định một lưới trong một phạm vi, sau đó để thị trường rời khỏi nó. Bên dưới, trần và sàn là mức đóng cửa cao nhất và thấp nhất của hai mươi phiên đầu tiên của năm 2024, được giữ cố định trong ba mươi tháng tiếp theo, với mức đóng cửa hàng tháng của quỹ ETF theo dõi S&P 500 được vẽ so với chúng.

Truy vấnLưới cố định đầu năm 2024, và nơi ETF S&P 500 đi sau đó
Câu lệnh SQL chính xác đằng sau mỗi con số
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

Dải này chạy từ $467.27 đến $491.26. Tháng đầu tiên trong chuỗi đóng cửa ở $482.92, nằm trong dải. Tháng cuối cùng trong số 30 tháng đóng cửa ở $746.32, cao hơn nhiều so với trần, và biểu đồ cho thấy đường giá rời khỏi dải và không bao giờ quay lại.

Hãy xem xét cái thang làm gì dọc theo con đường đó. Khi tăng qua phạm vi, bot bán hàng tồn kho từng bậc một, thu về một bước lợi nhuận mỗi lần. Phía trên trần, nó nắm giữ tiền mặt và quan sát. Mọi điểm tăng giá tiếp theo là khoản lợi nhuận mà nhà điều hành không còn tham gia nữa, đó là phiên bản nhẹ của sự thất bại.

Phiên bản nghiêm trọng là hình ảnh phản chiếu. Giá giảm xuống dưới sàn và bot đã mua ở mọi bậc thang trên đường đi xuống, do đó nó hiện nắm giữ toàn bộ cái thang hàng tồn kho với chi phí trung bình cao hơn thị trường, và mỗi bước giảm thêm làm khoản lỗ chưa thực hiện rộng hơn. Một phạm vi từng tạo ra các giao dịch ổn định, nhỏ, thành công rõ rệt biến thành một vị thế tập trung duy nhất. Tiếp thị lưới mô tả điều này là bot bị "kẹt"; trên bảng sao kê môi giới, đó là một khoản lỗ thả nổi mở (open drawdown) không có lối thoát tích hợp sẵn.

Chi phí tăng theo số lượng giao dịch

Một lưới hoàn thành nhiều giao dịch nhỏ, và mỗi giao dịch trả toàn bộ chi phí của một vòng quay: chênh lệch giá (spread), cộng với hoa hồng hoặc phí sàn giao dịch nếu có. Chênh lệch giá mua-bán (bid-ask spread) là phần thường bị bỏ qua nhất trong các phép tính lưới, vì nó không bao giờ xuất hiện trên bảng sao kê như một khoản mục riêng.

Phép tính minh họa rất nhanh. Trên một cổ phiếu $100 với chênh lệch một xu, một vòng quay vượt qua chênh lệch ở cả hai phía sẽ mất khoảng hai xu, tức 0,02% giá trị danh nghĩa. So với một bước lưới một đô la, đó là khoảng 2% lợi nhuận gộp mỗi chuyến. Mở rộng chênh lệch lên năm xu, một con số thường thấy trên một cổ phiếu kém thanh khoản hơn, và cùng một chuyến đi đó mất mười xu so với một đô la lợi nhuận gộp, tức 10%. Thắt chặt lưới xuống các bước mười xu để bắt nhiều dao động hơn sẽ cắt giảm lợi nhuận gộp mỗi chuyến xuống còn mười xu trong khi chi phí không đổi, và chênh lệch năm xu lúc này tiêu tốn toàn bộ giao dịch.

Mối quan hệ đó đặt ra một mức sàn cho khoảng cách lưới hữu ích: các bước phải đủ lớn so với chi phí vòng quay, và lưới càng chặt thì càng nhiều thu nhập của nó thuộc về sàn giao dịch hơn là nhà điều hành.

Tại sao backtest tâng bốc bot lưới

Các chiến lược lưới tạo ra các backtest hấp dẫn bất thường, và bốn lý do cấu trúc giải thích hầu hết điều này.

  1. Chọn phạm vi với nhận thức muộn (hindsight). Các ranh giới được chọn sau khi nhìn thấy dữ liệu sẽ chứa dữ liệu đó. Một lưới được điều chỉnh cho một giai đoạn dao động trong biên độ sẽ cho thấy tỷ lệ thành công cao trong giai đoạn đó.
  2. Cái thang chưa đóng. Một bài kiểm tra dừng lại vào một ngày kết thúc được chọn thường đếm các vòng quay đã thực hiện trong khi đối xử hào phóng với hàng tồn kho còn lại. Kế toán trung thực sẽ đánh dấu vị thế mở theo giá thị trường vào ngày cuối cùng và bao gồm khoản lỗ đó trong kết quả.
  3. Giả định khớp lệnh. Các lệnh chờ mô phỏng được khớp bất cứ khi nào giá chạm vào chúng. Hàng đợi thực tế không phải lúc nào cũng khớp khi chạm giá, và các chuyến đi không được khớp là những chuyến có lợi nhuận không tương xứng trong các thị trường nhanh.
  4. Mật độ tham số. Ranh giới, số lượng đường kẻ, khoảng cách và khối lượng lệnh cung cấp bốn núm vặn trên một chuỗi giá duy nhất, đủ để phù hợp với hầu hết mọi cửa sổ lịch sử.

Các số liệu vượt qua ở trên là đối trọng cho cả bốn điều. Chúng đến từ lịch sử giá một mình, không có cài đặt kèm theo, và chúng thay đổi theo từng năm theo cách mà không có lựa chọn tham số nào kiểm soát được. Bất kỳ ai đánh giá một tuyên bố về lưới có thể đặt một câu hỏi duy nhất cho nó: điều này phụ thuộc vào bao nhiêu vòng quay hoàn chỉnh, và con số đó đến từ đâu? Một khoảng thời gian thực hành trên trình mô phỏng, với cái thang mở được đánh dấu theo giá thị trường vào cuối kỳ, trả lời nó một cách trung thực hơn một biểu đồ về các chuyến đi đã thực hiện.

Câu hỏi thường gặp

Bot giao dịch lưới có thực sự kiếm được tiền không?

Một lưới kiếm được lợi nhuận có giới hạn trên mỗi vòng quay hoàn chỉnh và mang một vị thế mở không giới hạn khi giá rời khỏi phạm vi của nó. Việc các chuyến đi đã thực hiện có lớn hơn vị thế mở trong bất kỳ khoảng thời gian nào hay không phụ thuộc vào mức độ dao động của thị trường trong phạm vi đó, đó là một đặc tính của thị trường chứ không phải của phần mềm.

Điều kiện thị trường nào phù hợp với bot lưới?

Cơ chế được xây dựng cho một mức giá liên tục quay lại cùng một mức: tổng quãng đường di chuyển cao so với biến động ròng. Trong bảng mười hai cái tên ở trên, tỷ lệ hiệu quả dao động từ 0.2% ở đầu dao động đến 14.3% ở đầu định hướng, và cơ chế cái thang chỉ gặp các bậc thang của chính nó ở đầu đầu tiên.

Điều gì xảy ra khi giá phá vỡ ra khỏi phạm vi lưới?

Phía trên phạm vi, bot đã bán hết hàng tồn kho và ngồi bằng tiền mặt trong khi thị trường tiếp tục mà không có nó. Phía dưới phạm vi, nó nắm giữ mọi bậc thang đã mua trên đường đi xuống, với chi phí trung bình cao hơn giá hiện tại, và mỗi lần giảm thêm làm khoản lỗ chưa thực hiện đó rộng hơn.

Giao dịch lưới khác với trung bình chi phí đô la (DCA) như thế nào?

Cả hai đều mua nhiều hơn khi giá giảm, và sự tương đồng kết thúc ở đó. Trung bình chi phí đô la thêm một số tiền cố định theo một lịch trình cố định mà không có quy tắc thoát lệnh và không có giới hạn trên. Một lưới mua và bán dựa trên các kích hoạt giá bên trong một phạm vi được chọn trước, và hành vi của nó thay đổi hoàn toàn khi giá rời khỏi phạm vi đó.

Khoảng cách lưới chặt hơn có tạo ra nhiều thu nhập hơn không?

Khoảng cách chặt hơn làm tăng số vòng quay và giảm lợi nhuận gộp trên mỗi vòng quay, trong khi chi phí vòng quay không đổi. Vượt quá một điểm được thiết lập bởi chênh lệch giá, các chuyến đi được thêm vào sẽ trừ vào tổng số thay vì cộng thêm vào đó.


Mọi con số trên đều đến từ một truy vấn đã được lưu trữ, có phiên bản trên dữ liệu giá cổ phiếu thực tế; hãy mở SQL bên dưới bất kỳ bảng nào để kiểm tra nó, hoặc đo lường quãng đường di chuyển so với biến động ròng trên danh sách các cái tên của riêng bạn trên terminal Strasmore.

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