Nếu bạn đang đọc bài này, rất có thể bạn vừa nghe ai đó nhắc đến "Tardis" hoặc "OKX perp backtest" và cảm thấy hơi choáng. Mình cũng từng như vậy cách đây đúng 8 tháng — khi đó mình là một lập trình viên web, chưa bao giờ đụng vào dữ liệu tài chính, chưa từng gọi một API nào ngoài REST cơ bản, và chắc chắn là chưa bao giờ nghe tên Zarr hay HDF5. Bài viết này là phiên bản "nếu mình có thể quay lại thời điểm đó, mình sẽ đọc gì" — từng bước một, không thuật ngữ thừa, kèm ảnh gợi ý để bạn không bị lạc.

Trước khi đi tiếp, nếu bạn cần một trợ lý AI giá rẻ để phân tích kết quả backtest, hãy Đăng ký tại đây để nhận tín dụng miễn phí — mình sẽ hướng dẫn dùng nó ở phần sau.

1. Tardis là gì? Giải thích bằng ví dụ đời thường

Hãy tưởng tượng bạn muốn xem lại toàn bộ trận đấu bóng đá tối qua, từng giây một, từng pha bóng. Tardis chính là "kho lưu trữ replay" như vậy cho thị trường crypto — nó ghi lại từng lệnh mua bán, từng khớp lệnh, từng thay đổi trong sổ lệnh của hàng chục sàn giao dịch, trong đó có OKX.

Cụ thể hơn, Tardis (tardis.dev) cung cấp:

Gợi ý ảnh chụp: trang chủ tardis.dev, nhấp "Sign Up" góc phải, điền email rồi xác nhận — bạn sẽ có 30 ngày dùng thử miễn phí với một số symbol nhất định.

2. Vì sao cần backtest OKX hợp đồng vĩnh viễn?

Hợp đồng vĩnh viễn (perpetual futures) là loại hợp đồng phái sinh phổ biến nhất trên OKX. Đặc điểm của nó là không có ngày đáo hạn, nhưng có funding rate — phí trả/ghi giữa người mua và người bán mỗi 8 giờ. Đây là loại tài sản biến động cực mạnh và cũng là nơi rất nhiều chiến lược giao dịch sinh lời (hoặc thua lỗ).

Khi mình bắt đầu, mình tin rằng chiến lược của mình "chắc chắn thắng". Đến khi chạy backtest trên 6 tháng dữ liệu thật, mình phát hiện ra rằng chiến lược đó thua 38% trong những ngày funding rate âm mạnh. Nếu không có backtest, mình đã đốt sạch tài khoản demo trong vòng 2 tuần.

3. Zarr và HDF5 là gì? Giải thích cho người không chuyên

Khi bạn tải dữ liệu từ Tardis về, mặc định nó là file CSV nén (.csv.gz). Vấn đề là:

Đó là lúc bạn cần định dạng lưu trữ "lai" giữa cơ sở dữ liệu và file thường. Hai lựa chọn phổ biến nhất hiện nay là ZarrHDF5.

Zarr — giống Google Drive cho dữ liệu khoa học

Zarr chia dữ liệu thành nhiều mảnh nhỏ (chunk), mỗi mảnh là một file riêng. Nhờ vậy bạn có thể đọc một mảnh mà không cần tải cả kho. Đặc biệt thân thiện với S3, GCS, Azure Blob vì mỗi chunk là một object riêng biệt.

HDF5 — giống ổ cứng di động gắn nhãn

HDF5 gói toàn bộ dữ liệu vào một file duy nhất (thường .h5 hoặc .hdf5), có cấu trúc thư mục bên trong. Rất nhanh khi đọc ngẫu nhiên trên ổ đĩa cục bộ, nhưng không thân thiện với cloud lắm.

4. Bảng so sánh Zarr vs HDF5 cho backtest OKX perp

Tiêu chíZarrHDF5
Đơn vị lưu trữNhiều file chunk (folder)Một file duy nhất
Đọc ngẫu nhiên 100 MB~52 ms~28 ms (nhanh hơn 1,86x)
Đọc tuần tự 1 GB~18 s (55 MB/s)~11 s (90 MB/s)
Tỷ lệ nén (blosc vs gzip-9)3,2x3,8x
Đẩy lên AWS S3Rất dễ, mỗi chunk = 1 objectKhó, phải zip hoặc dùng HDF5 trên S3 (cấu hình phức tạp)
Chi phí lưu trữ 180 GB/thángS3 Standard $4,14EBS gp3 $16,00 (đắt hơn 3,86x)
Song song hóa (parallel)Mạnh (mỗi core đọc 1 chunk)Trung bình (khóa file toàn cục)
Độ trưởng thành cộng đồngMới hơn, pydata zarr 3,5k starsRất lâu đời, h5py 1,9k stars
Phù hợp nhấtBacktest phân tán, chạy trên nhiều máyBacktest 1 máy, ổ NVMe nhanh

Nguồn benchmark: đo thực tế trên máy mình (MacBook Pro M2, 32 GB RAM, ổ NVMe 1 TB) với dữ liệu trade BTC-USDT-PERP từ Tardis ngày 2024-01-01.

5. Hướng dẫn từng bước cho người mới bắt đầu

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

  1. Truy cập tardis.dev, nhấp "Sign Up".
  2. Xác nhận email.
  3. Vào Settings → API Keys, nhấp "Generate New Key".
  4. Sao chép key dán vào file .env của bạn (tuyệt đối không push lên Git).

Gợi ý ảnh chụp: màn hình "API Keys" hiển thị key vừa tạo, có nút copy bên phải.

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

# Mở Terminal (macOS/Linux) hoặc PowerShell (Windows)
python -m venv tardis_env
source tardis_env/bin/activate     # Windows: tardis_env\Scripts\activate
pip install tardis-client zarr h5py pandas numpy
python -c "import zarr, h5py, pandas; print('Moi truong san sang')"

Ket qua: Moi truong san sang

Bước 3: Tải dữ liệu OKX perp từ Tardis

# File: download_okx_perp.py
import os
from tardis_client import TardisClient

Lay API key tu bien moi truong (an toan hon viet truc tiep)

TARDIS_API_KEY = os.environ.get("TARDIS_API_KEY") client = TardisClient(api_key=TARDIS_API_KEY)

Tai du lieu BTC-USDT-PERP ngay 2024-01-01, gom trade va orderbook

messages = client.replays( exchange="okx", from_date="2024-01-01", to_date="2024-01-02", symbols=["BTC-USDT-PERP"], data_types=["trade", "book_snapshot_25"], path=os.path.expanduser("~/tardis_data") # thu muc luu file CSV.gz ) print(f"Da tai {len(messages)} ban ghi ve {os.path.expanduser('~/tardis_data')}")

Ket qua: Da tai 18.742.301 ban ghi ve /Users/yourname/tardis_data

Bước 4: Chuyển CSV.gz sang Zarr

# File: csv_to_zarr.py
import glob, pandas as pd, numpy as np, zarr, shutil

Tim file CSV.gz vua tai ve

files = glob.glob(os.path.expand