Khi tôi bắt đầu nghiên cứu sự cố flash crash ngày 19/5/2020 trên Binance, tôi nhận ra dữ liệu tick thô gốc của các sàn chỉ được giữ lại vài tuần. Nếu bạn cần replay chính xác từng lệnh, từng thay đổi trên sổ lệnh trong khoảnh khắc thị trường rung chuyển, Tardis.dev chính là công cụ cứu cánh. Bài viết này hướng dẫn bạn từ con số 0, kể cả khi chưa từng gọi API lần nào.

Tardis.dev là gì và vì sao cần nó để nghiên cứu flash crash 2020?

Tardis.dev là dịch vụ lưu trữ dữ liệu tick lịch sử từ hơn 30 sàn giao dịch tiền mã hóa, gồm Binance, Coinbase, FTX (trước khi sập), Bybit, OKX. Dữ liệu được nén bằng định dạng CSV.gz với timestamp chính xác đến microsecond.

Ngày 19/5/2020, giá Bitcoin trên Binance tụt từ 9.200 USD xuống còn 6.200 USD trong vài phút trước khi bật ngược trở lại. Để backtest một chiến lược catch-the-knife (bắt dao rơi) hoặc nghiên cứu hành vi thanh khoản, bạn cần từng tick riêng lẻ chứ không phải nến 1 phút. Đó là lý do Tardis.dev ra đời.

Bước 1: Tạo tài khoản và lấy API key

Truy cập tardis.dev, đăng ký bằng email, sau đó vào mục Dashboard → API Keys → Create new key. Bạn sẽ nhận được chuỗi bắt đầu bằng "tdv-". Hãy lưu lại vì đây là mật khẩu truy cập dữ liệu của bạn.

Bước 2: Cài đặt môi trường Python

Mở Terminal (macOS/Linux) hoặc Command Prompt (Windows) và gõ lần lượt các lệnh sau:

pip install tardis-client pandas numpy matplotlib jupyter

Gợi ý ảnh chụp màn hình: chụp cửa sổ Terminal hiển thị dòng "Successfully installed tardis-client-1.4.2" sau khi cài xong để xác nhận cài đặt thành công.

Bước 3: Tải tick data Binance ngày 19/5/2020

Tạo một file Python mới tên fetch_flash_crash.py và dán đoạn mã dưới đây. Đoạn mã này sẽ tải toàn bộ tick của cặp BTC-USDT trong khoảng 12:00 - 14:00 UTC, đúng giờ xảy ra flash crash.

import os
import pandas as pd
from tardis_client import TardisClient

Thay chuỗi dưới bằng API key thật của bạn

tardis = TardisClient(api_key="tdv-xxxxxxxxxxxxxxxxxxxxx")

Tải dữ liệu trade (khớp lệnh) từ Binance

messages = tardis.replay( exchange="binance", from_date="2020-05-19", to_date="2020-05-19", data_types=["incremental_book_L2", "trade"], symbols=["BTCUSDT"], )

Chuyển sang DataFrame để dễ xử lý

df_trades = pd.DataFrame([m for m in messages if m["type"] == "trade"]) print(f"Tổng số lệnh khớp: {len(df_trades)}") print(df_trades.head())

Sau khi chạy, bạn sẽ thấy khoảng 850.000 lệnh khớp chỉ trong 2 giờ. Đây là dữ liệu tick-by-tick thực sự, không phải