15 tháng Mười Một, 2026 · nghiên cứu

Làm sao backtest volume crypto khi wash trade thổi phồng tape?

Làm sao backtest volume crypto khi wash trade thổi phồng tape?

Thứ Hai chúng tôi làm điều đúng trách nhiệm. Agent có một chiến lược momentum trên hợp đồng USDT-M perpetual mid-cap, clip 25,000 USDT mỗi lệnh, và backtest đầu tiên không có bộ lọc volume đã khớp mọi tín hiệu như thể sổ lệnh là BTC. Nên chúng tôi thêm cổng lọc đúng sách giáo khoa: 20 nến 1-phút volume dollar phải vượt 20 lần clip trước khi một lệnh được phép ra. 20 phút, 500,000 dollar tape. Đồng coin in khoảng $40 million vào ngày sôi động. Bộ lọc giữ hầu hết tín hiệu. Đường equity bớt răng cưa. Chúng tôi đưa lên paper.

11 giờ sau, một lệnh mua 25,000 USDT ăn 8,400 bid rồi dừng. Volume 20 nến của phút đó là $1.14 million. Bộ lọc đã bảo có.

34%của tape công bố chưa từng đẩy một nấc sổ lệnh
11 giờcủa paper trước clip kẹt đầu tiên
20×quy tắc clip-to-volume vẫn bảo có

Thứ Hai: bộ lọc khiến chúng tôi thấy mình trung thực

Ghi chú của agent trên pull request là "đã thêm kiểm tra sức chứa, 20× notional." Tôi duyệt. Tôi đã duyệt câu đó trước đây. Đó là kiểu quy tắc bạn viết sau khi ai đó cho xem một backtest đã giao dịch một đồng $4,000-OI bằng clip $50,000, cả phòng nhăn mặt, và bạn thêm một bội số volume để chuyện đó không tái diễn.

Thứ Hai, quy tắc làm đúng việc nó vẫn làm trong backtest. Nó cắt những giờ chết. Nó giữ những giờ mà chính con số volume của sàn trông ồn ào. Turnover giảm khoảng một phần ba. Kích thước lệnh trung bình vẫn 25,000 vì mô hình fill là một kẻ hèn nhát: nó lấy trọn clip ở last cộng vài bps bất cứ lúc nào cổng mở. Không ai hỏi sổ lệnh liệu 25,000 có thực sự đang nằm đó.

Tôi vẫn giật mình khi volume 24h của một đồng là số tròn cạnh open interest mỏng. Đó là dư âm từ 2021, khi bot "market making" trên Discord là 2 subaccount giao dịch với nhau rồi dán screenshot volume vào #brag. Tape trông như một bữa tiệc. Sổ lệnh là bìa carton. Tôi tự bảo một bộ lọc 20× trên nến 1-phút là cách để trưởng thành khỏi chuyện đó. Không phải. Đó là cách bạn lấy trung bình carton thành một con số mượt hơn.

Thứ Ba: paper, rồi một phần dư

Paper bắt đầu hiền. 5 clip đầu khớp sau 2–4 bước xuống ask. Xấu, nhưng xong. Rồi 14:07 UTC, tín hiệu long, 25,000 USDT, đỉnh sổ 1,100, nấc tiếp 2,400, rồi trống không. Chúng tôi khớp 8,400 với tư cách taker và 16,600 nằm chờ. 40 giây sau phần còn lại bị hủy theo time-in-force của chính chúng tôi. Chiến lược nghĩ mình long một clip đủ. Tài khoản long một phần ba clip.

Nhưng bộ lọc đã bảo có. Tôi kéo nến ra. Volume dollar trong 20 phút đến 14:07 là $1.14 million, thoải mái trên $500k. Khoảng $380k trong $1.14 million đó là các cặp print: cùng giá, cùng size, cờ aggressor ngược nhau, cách nhau 2–8 mili giây, và size bid/ask tại giá đó không nhúc nhích. Những lệnh đó trả phí cho nhau. Chúng không mở cho chúng tôi một lỗ hổng 25,000 USDT.

Thứ Tư: khớp tape với sổ lệnh

Thứ Tư là ngày chậm, ngày mà lần sau tôi sẽ dành gấp 2 thời gian. Chúng tôi lấy 5 ngày weekday lệnh khớp và snapshot L2 trên cùng perp, ảnh sổ 100ms, và phân loại mọi print đối chiếu sổ một snapshot trước và một snapshot sau.

  1. Nếu size tại giá khớp giảm khoảng bằng size lệnh, nó đã chạm sổ. Đếm.
  2. Nếu một lệnh mua và một lệnh bán cùng size khớp tại một giá mà sổ không đổi, gọi là wash và loại khỏi mọi con số sức chứa.
  3. Nếu một lệnh đi xuyên nhiều nấc và những nấc đó biến mất, đó là taker thật. Đếm, và đừng giả vờ bạn cũng lấy được thanh khoản đó; đã có người lấy rồi.
  4. Nếu lệnh được gắn nhãn liquidation, đó là size thật, và đó là size cuối cùng bạn muốn dùng làm bằng chứng rằng bạn có thể clip 25,000. Lệnh cưỡng chế đang đua với bạn.

Snapshot nói dối một chút. Bất cứ thứ gì khớp rồi bổ sung lại trong 100ms trông như bóng ma, và một số market-maker thật cancel-replace nhanh đến vậy. Chúng tôi lấy mẫu vài phút sổ 10ms sau đó và tỷ lệ wash dịch vài điểm, không phải gấp 2. Tôi sống được với vài điểm. Tôi không sống được với việc coi ticker volume sàn như một cuộc tổng điều tra thanh khoản.

AggTrades đã gộp một taker đập nhiều maker tại một giá. Chúng không gộp 2 subaccount đang wash. Nếu feed "sạch" của bạn là aggregated trades, bạn vẫn gặp vấn đề này. Bạn chỉ gặp nó với ít hàng hơn.

Và volume 24h trên ticker API là cùng một tổng bẩn, bị trễ, đó là lý do research agent yêu nó. Một trường. Luôn có mặt. Trông như một feature. Đó là thống kê marketing tình cờ nằm trong protobuf market-data.

Nếu một con số volume không đối soát được với một thay đổi trên sổ, nó không thuộc về kiểm tra sức chứa, mô hình impact, hay bộ lọc universe. Ticker 24h là bản sao tồi nhất của con số đó, vì nó đã được cộng, làm tròn, và tước hết thời gian.

Thứ Năm: cả tuần trong một bảng

5 phiên, cùng clip, cùng quy tắc 20×, cùng mô hình fill trong backtest. Tỷ lệ khớp paper là notional đã khớp trên notional dự định cho các lệnh chúng tôi thực sự gửi phiên đó. Paper Thứ Hai để trống vì chúng tôi vẫn đang ở backtest.

PhiênTape sànĐẩy sổKiểu washPrint liq.Bộ lọc cho điKhớp paper
T2$38.4m$22.6m$13.5m$2.3m41 / 48 tín hiệun/a
T3$41.1m$24.2m$15.2m$1.7m36 / 400.61
T4$29.6m$20.1m$8.1m$1.4m22 / 310.77
T5$44.8m$25.6m$17.4m$1.8m39 / 440.54
T6$33.2m$22.3m$9.4m$1.5m28 / 350.71

Print kiểu wash chiếm 34% tape cả tuần. Chúng không trải đều. Thứ Năm, phiên mà bộ lọc gốc thích nhất, là phiên bẩn nhất. Đó là failure mode tôi quan tâm. Cổng không chỉ phóng đại thanh khoản trung bình. Nó mở rộng hơn vào những ngày bot wash đang chạy, vì đó là những ngày con số thô trông khỏe nhất.

Chúng tôi chạy lại backtest chỉ với volume đẩy sổ, cùng bội số 20×. Tín hiệu giảm từ 198 trong tuần xuống 121. Nhiều tín hiệu bị loại nằm trong những giờ kiểu Thứ Năm, lúc tape ồn và đỉnh sổ là 1,100 USDT. Sharpe gốc dùng 198 lần khớp đủ. Tôi sẽ không trích cái mới như thể đó là phát hiện về chiến lược. Đó là phát hiện về mô hình fill: một khi bạn ngừng cấp 25,000 USDT tại một giá mà sổ không có, một phần "edge" chỉ là những lệnh hoàn tất vốn sẽ thành phần dư.

Thứ Sáu: thứ chúng tôi thực sự ship, và thứ tôi sẽ bỏ

Cổng chúng tôi giữ thì nhàm chán. Notional đẩy sổ lăn, chỉ đếm từ những print lấy size khỏi một nấc, phải vượt 20× clip, và chúng tôi đo trên các nến trước nến quyết định để wash của phút hiện tại không được bỏ phiếu. Print liquidation có trần riêng: nếu hơn một phần tư volume đẩy sổ gần đây là liquidation, chiến lược đứng ngoài. Dòng cưỡng chế là size thật đang đua với bạn.

Impact ăn cùng chế độ. Mô hình cũ suy ra Kyle lambda từ volume sàn và clip của chúng tôi. Nhồi wash vào thì lambda giảm, vì thị trường trông sâu. Nhồi volume đẩy sổ thì cùng clip chiếm phần lớn hơn nhiều so với những gì thực sự đổi sổ. Slippage paper vài phiên sau nằm gần con số xấu hơn đó. Gần hơn, không phải giống hệt. Chúng tôi vẫn không thấy queue, và ảnh 100ms vẫn bỏ sót một ít size thật.

Thứ tôi sẽ bỏ lần sau là cả buổi Thứ Hai đầu tiên. Đừng bắt đầu từ ticker, đừng bắt đầu từ volume 24h, đừng để agent nhét volume dollar thô vào feature store và vào cổng như thể đó là 2 ý. Chúng là một chuỗi bẩn, dùng 2 lần. Xây tape khớp sổ trước, dù điều đó nghĩa là bạn nghiên cứu 2 ngày trên một mid-cap trước khi có universe. Một universe lọc theo wash là danh sách những đồng giỏi giả vờ bận rộn.

Thứ bỏ khác: mọi mô hình fill coi việc vượt kiểm tra volume là một fill. Phần dư Thứ Ba chính là chiến lược. Bộ lọc chỉ trả lời "đã có ai đang giao dịch." Nó không trả lời "25,000 của bạn sẽ nằm chờ hay biến mất." Câu hỏi thứ hai cần sổ lệnh, phần dư, và time-in-force, đó là nhật ký khác, và là nhật ký chúng tôi lẽ ra phải viết trước nhật ký này.

wash tradingvolumecryptobacktestingvi cấu trúc thị trường
← Tất cả bài viết