Khi mới bắt đầu tự viết chiến lược giao dịch crypto, mình từng cắm đầu vào các sàn nhỏ lẻ chỉ để lấy dữ liệu nến (K-line) — tốn cả tuần mà file CSV lại thiếu gap, sai timestamp, rồi backtest ra kết quả "ảo". Sau khi được anh em trong group algo-trading chỉ cho Databento, mình mới thật sự hiểu: dữ liệu lịch sử chuẩn từ OKXBybit đã được chuẩn hoá tick-by-tick, mình chỉ cần gọi API một lần là có đủ bộ OHLCV, order book và order flow để chạy backtest đa khung thời gian. Bài này mình sẽ đi từng bước thật chậm, kèm ảnh chụp màn hình gợi ý, để bạn chưa từng đụng API cũng làm theo được.

Databento là gì và vì sao phù hợp với backtest crypto?

Databento là nhà cung cấp dữ liệu thị trường tài chính theo dạng tick — tức là mọi lệnh bid/ask, mọi lệnh khớp đều được lưu lại. Điểm hay cho dân crypto Việt Nam là Databento đã có sẵn dữ liệu từ OKX, Bybit, Binance, Kraken, Coinbase… và xuất trực tiếp ra DataFrame pandas để bạn cho vào backtest engine.

So với việc tự leo REST API của OKX/Bybit (bị giới hạn rate, lịch sử chỉ ~3 tháng gần nhất), Databento cho phép lấy dữ liệu từ năm 2022 chỉ trong vài giây.

Bước 1 — Chuẩn bị môi trường Python (cho người mới tuyệt đối)

Nếu bạn chưa từng cài Python, làm theo thứ tự sau:

  1. Tải Anaconda (bản Individual) từ anaconda.com — tick chọn "Add to PATH".
  2. Mở Anaconda Prompt (Windows) hoặc Terminal (macOS/Linux).
  3. Tạo môi trường riêng: conda create -n backtest python=3.11 -y rồi conda activate backtest.
  4. Cài các thư viện cần thiết:
conda install -y pandas numpy requests
pip install databento matplotlib

Gợi ý ảnh chụp: bạn nên chụp màn hình Anaconda Prompt để sau này dán link vào tutorial nội bộ nhóm. Mình cũng cài thêm jupyter để chạy notebook dễ nhìn.

Bước 2 — Đăng ký Databento và lấy API key

  1. Vào databento.com → Sign Up bằng email.
  2. Xác minh email → trang quản lý hiện ra dashboard.
  3. Trong menu Account → API Keys → Create Key, copy key dạng db-XXXXXXXXXX.
  4. Sang tab Symbols, gõ tên mã như BTC-USDT để Databento hiện sẵn các mã dataset tương ứng (ví dụ BINANCE.BTC-USDT, BYBIT.ETH-USDT).

Gợi ý ảnh chụp: chụp màn hình tab API Keys để bạn nhớ nơi copy key. Đừng chia sẻ key công khai.

Bước 3 — Tải dữ liệu K-line lịch sử từ OKX

Mình minh hoạ việc lấy 10 ngày nến 1 phút của BTC-USDT (Databento map OKX spot qua kênh Binance cũng có dữ liệu tương đương; bạn đổi sang dataset="OKX.BTC-USDT" nếu Databento đã hỗ trợ trực tiếp).

import databento as dbn
import pandas as pd

1) Khoi tao client voi key ban vua copy

client = dbn.Historical(key="YOUR_DATABENTO_KEY")

2) Goi API lay nen 1 phut (ohlcv-1m)

data = client.timeseries.get_range( dataset="BINANCE.BTC-USDT", schema="ohlcv-1m", start="2024-06-01T00:00:00", end="2024-06-10T23:59:59", stype_in="raw_symbol", )

3) Chuyen sang DataFrame pandas

df = data.to_df() print(df.head(10)) print("Tong so nen 1 phut:", len(df))

4) Luu ra CSV de backtest

df.to_csv("btc_kline_1m.csv") print("Da luu file btc_kline_1m.csv")

Gợi ý ảnh chụp: output in ra terminal có cột open, high, low, close, volume. Bạn có thể chụp lại 10 dòng đầu tiên để chứng minh schema đúng.

Bước 4 — Tải dữ liệu order flow từ Bybit

Order flow (luồng lệnh) chính là thứ phân biệt trader chuyên nghiệp với trader mới: mỗi lệnh khớp side=B (mua chủ động) hoặc side=A (bán chủ động) cho biết đâu là dòng tiền đang đẩy giá.

import databento as dbn

client = dbn.Historical(key="YOUR_DATABENTO_KEY")

Lay du lieu trades cua ETH-USDT tren Bybit trong 2 ngay

trades = client.timeseries.get_range( dataset="BYBIT.ETH-USDT", schema="trades", start="2024-06-01", end="2024-06-02", ) df_trades = trades.to_df() print(df_trades.head(20)) print("Tong so giao dich:", len(df_trades))

Phan loai theo side

buy_vol = df_trades[df_trades["side"] == "B"]["size"].sum() sell_vol = df_trades[df_trades["side"] == "A"]["size"].sum() net = buy_vol - sell_vol print(f"Tong khoi luong mua (taker buy) : {buy_vol:.4f} ETH") print(f"Tong khoi luong ban (taker sell): {sell_vol:.4f} ETH") print(f"Delta order flow : {net:.4f} ETH (duong = ben mua dang thang)") df_trades.to_csv("bybit_eth_orderflow.csv")

Gợi ý ảnh chụp: chụp màn hình terminal in 3 dòng tổng kết ở cuối, bạn sẽ thấy delta đổi dấu qua các ngày — đây là cơ sở cho chiến lược Order Flow Imbalance.

Bước 5 — Viết script backtest đơn giản bằng SMA crossover

Để chứng minh dữ liệu Databento chạy được backtest, mình viết nhanh chiến lược SMA20 vs SMA50 (chỉ dùng để demo, không phải khuyến nghị đầu tư).

import pandas as pd

df = pd.read_csv("btc_kline_1m.csv", parse_dates=["ts_event"])
df = df.sort_values("ts_event").reset_index(drop=True)

1) Tinh SMA20 va SMA50

df["sma_fast"] = df["close"].rolling(window=20).mean() df["sma_slow"] = df["close"].rolling(window=50).mean()

2) Tao tin hieu: +1 long, -1 short, 0 flat

df["signal"] = 0 df.loc[df["sma_fast"] > df["sma