Tôi còn nhớ cách đây 8 tháng, tôi mở sàn Binance, đặt một lệnh Long BTC bằng cảm tính, và mất gần 30% tài khoản chỉ trong 2 tuần. Đêm đó tôi ngồi gõ "cách test chiến lược crypto trước khi đánh thật" và lần đầu tiên biết đến ba từ khoá: Backtrader, VectorBTTardis API. Lúc đầu tôi tưởng đó là ba thư viện của cùng một dự án, nhưng thực ra chúng là ba mảnh ghép: một cái để lấy dữ liệu, một cái để chạy thử nhanh, một cái để kiểm tra kỹ lưỡng. Bài viết này tôi viết lại toàn bộ hành trình từ con số 0 — không cần biết lập trình trước đó, không cần hiểu thuật ngữ, chỉ cần một chiếc laptop và 30 phút rảnh.

Backtest crypto là gì? Giải thích trong 3 phút

Backtest nghĩa là cho chiến lược giao dịch chạy lại trên dữ liệu quá khứ để xem nếu hồi đó mình đánh theo nó thì lời bao nhiêu. Giống như xem lại bản đồ đường đi để biết con đường nào hay bị kẹt xe — bạn không cần thực sự lái xe để rút kinh nghiệm.

Với crypto, dữ liệu quá khứ thường gặp hai vấn đề:

Đó là lúc Tardis API xuất hiện — một "kho dữ liệu lịch sử" của toàn bộ sàn lớn (Binance, Bybit, OKX…), có thể trả về tick, nến, funding rate, order book… theo yêu cầu.

Tại sao lại kết hợp cả ba: Backtrader + VectorBT + Tardis?

Mỗi công cụ giỏi một việc:

Quy trình tôi hay dùng: Tardis → VectorBT lọc nhanh → Backtrader kiểm chứng → HolySheep AI phân tích kết quả.

Bảng so sánh nhanh 3 công cụ

Tiêu chíTardis APIVectorBTBacktrader
Vai trò chínhCung cấp dữ liệuBacktest vector nhanhBacktest sự kiện chi tiết
Tốc độPhụ thuộc gói dữ liệuRất nhanh (giây)Chậm hơn (phút)
Loại dữ liệu hỗ trợTick, nến, order book, fundingNến OHLCVNến OHLCV, tick, custom
Độ khó cho người mớiTrung bìnhTrung bìnhKhó hơn
Phù hợp thử nhiều tham sốCó (rất mạnh)Không
Mô phỏng commission/slippageCơ bảnRất chi tiết
Chi phíCó gói miễn phíMiễn phí (open-source)Miễn phí (open-source)

Phù hợp / không phù hợp với ai?

Phù hợp với:

Không phù hợp với:

Chuẩn bị môi trường — chỉ mất 10 phút

  1. Cài Python 3.10 trở lên: tải từ python.org, tick "Add to PATH".
  2. Mở Terminal (cmd trên Windows), gõ: pip install vectorbt backtrader pandas requests numpy
  3. Tạo thư mục dự án, ví dụ: mkdir crypto-backtest && cd crypto-backtest
  4. Tạo file strategy.py bằng VS Code hoặc Notepad.

[Ảnh chụp: cửa sổ Terminal sau khi pip install thành công]

Bước 1: Đăng ký Tardis API để lấy dữ liệu lịch sử

Truy cập tardis.dev, bấm Sign Up, điền email, xác nhận mail. Sau khi vào Dashboard, bấm API Keys → Create New Key, copy key lại cất cẩn thận. Gói miễn phí cho phép truy xuất dữ liệu nến 1 phút của hầu hết sàn — đủ cho người mới học.

[Ảnh chụp: giao diện Dashboard của Tardis, mục API Keys]

Bước 2: Tải dữ liệu BTC 1 phút từ Tardis bằng Python

Dán đoạn sau vào file fetch_data.py và chạy python fetch_data.py:

import requests
import csv
from datetime import datetime

Thay bằng key bạn vừa tạo trên tardis.dev

TARDIS_API_KEY = "YOUR_TARDIS_API_KEY" symbol = "btcusdt" exchange = "binance" from_date = "2024-01-01" to_date = "2024-01-02" url = f"https://api.tardis.dev/v1/data-feeds/{exchange}/trades" params = { "symbols": symbol, "from": from_date, "to": to_date, "limit": 1000 } headers = {"Authorization": f"Bearer {TARDIS_API_KEY}"} print("Đang tải dữ liệu từ Tardis...") resp = requests.get(url, headers=headers, params=params) print(f"HTTP {resp.status_code} - {len(resp.text)} bytes") with open("btc_trades.csv", "w", newline="") as f: f.write(resp.text) print("Đã lưu vào btc_trades.csv")

[Ảnh chụp: Terminal in ra "Đã lưu vào btc_trades.csv" cùng file CSV mở trong Excel]

Bước 3: Backtest nhanh với VectorBT (SMA Crossover)

Tạo file backtest_vectorbt.py với nội dung sau. Chiến lược rất đơn giản: mua khi đường trung bình 10 phút cắt lên đường 50 phút, bán khi cắt xuống.

import vectorbt as vbt
import pandas as pd

Đọc dữ liệu đã tải ở Bước 2

df = pd.read_csv("btc_trades.csv", header=None, names=["timestamp", "price", "qty", "side"])

Resample tick về nến 1 phút

df["timestamp"] = pd.to_datetime(df["timestamp"]) df = df.set_index("timestamp") ohlc = df["price"].resample("1min").ohlc() ohlc = ohlc.dropna() print(f"Tổng số nến 1 phút: {len(ohlc)}") print(ohlc.head()) close = ohlc["close"]

Hai đường trung bình

fast = vbt.MA.run(close, window=10, short_name="fast") slow = vbt.MA.run(close, window=50, short_name="slow")

Tín hiệu mua/bán

entries = fast.ma_crossed_above(slow) exits = fast.ma_crossed_below(slow)

Chạy backtest, giả sử vốn 10.000 USDT, fee 0.1%

pf = vbt.Portfolio.from_signals( close, entries, exits, init_cash=10000, fees=0.001 ) print("===== Kết quả backtest VectorBT =====") print(f"Tổng lợi nhuận : {pf.total_return():.2%}") print(f"Sharpe ratio : {pf.sharpe_ratio():.2f}") print(f"Số lệnh : {pf.trades.count()}") print(f"Thắng/thua : {pf.trades.win_rate():.2%}") print(f"Max drawdown : {pf.max_drawdown():.2%}")

[Ảnh chụp: Terminal in ra các chỉ số Sharpe, tổng lợi nhuận, win rate]

Bước 4: Backtest chi tiết với Backtrader

VectorBT cho ta biết chiến lược có lời không. Để biết nó có ổn định không khi tính slippage, commission thực tế, ta dùng Backtrader.

import backtrader as bt
import pandas as pd

class SmaCross(bt.Strategy):
    params = dict(fast=10, slow=50)
    def __init__(self):
        self.fast_ma = bt.indicators.SMA(period=self.p.fast)
        self.slow_ma = bt.indicators.SMA(period=self.p.slow)
        self.crossover = bt.indicators.CrossOver(self.fast_ma, self.slow_ma)
    def next(self):
        if not self.position and self.crossover > 0:
            self.buy(size=None)  # dùng 95% vốn
        elif self.position and self.crossover < 0:
            self.close()

Tạo nguồn cấp dữ liệu từ DataFrame đã resample

df = pd.read_csv("btc_1min.csv", parse_dates=["timestamp"]) df.set_index("timestamp", inplace=True) data = bt.feeds.PandasData(dataname=df) cerebro = bt.Cerebro() cerebro.addstrategy(SmaCross) cerebro.adddata(data) cerebro.broker.setcash(10000) cerebro.broker.setcommission(commission=0.001) # 0.1% mỗi lệnh cerebro.broker.set_slippage_perc(0.0005) # trượt giá 0.05% print(f"Vốn ban đầu: {cerebro.broker.getvalue():.2f} USDT") cerebro.run() print(f"Vốn sau backtest: {cerebro.broker.getvalue():.2f} USDT") print(f"Lợi nhuận: {(cerebro.broker.getvalue()/10000 - 1):.2%}") cerebro.plot(style="candlestick", volume=True)

[Ảnh chụp: biểu đồ Backtrader hiển thị nến BTC, các điểm mua bán và equity curve]

Bước 5: Dùng HolySheep AI để "đọc" kết quả backtest cho bạn

Sau khi có các con số như Sharpe 1.85, win rate 56%, drawdown -12%, bạn thường tự hỏi: "Vậy con số này tốt hay xấu? Có nên đánh thật không?". Đây là lúc AI hữu ích. HolySheep AI — nền tảng cung cấp API các mô hình AI lớn (GPT-4.1, Claude Sonnet 4.5, Gemini 2.5 Flash, DeepSeek V3.2…) với chi phí rẻ hơn 85% nhờ tỷ giá ¥1 = $1. Đăng ký tài khoản tại đây để nhận tín dụng miễn phí dùng thử.

import openai

Lấy API key từ dashboard HolySheep sau khi đăng ký

client = openai.OpenAI( api_key="YOUR_HOLYSHEEP_API_KEY", base_url="https://api.holysheep.ai/v1" ) stats = """ - Tổng lợi nhuận: 47.3% - Sharpe ratio: 1.85 - Max drawdown: -12.4% - Số lệnh thắng: 23/41 (56%) - Trượt giá trung bình: 0.05% - Loại chiến lược: SMA Crossover 10/50 trên nến 1 phút BTC/USDT """ resp = client.chat.completions.create( model="deepseek-v3.2", # rẻ và nhanh, phù hợp phân tích số liệu messages=[ {"role": "system", "content": "Bạn là chuyên gia quant crypto, trả lời bằng tiếng Việt, ngắn gọn."}, {"role": "user", "content": f"Phân tích kết quả backtest sau và đề xuất 3 việc cần làm:\n{stats}"} ], temperature=0.3 ) print(resp.choices[0].message.content)

HolySheep hỗ trợ thanh toán bằng WeChat, Alipay, độ trễ trung bình dưới 50ms — rất quan trọng khi bạn muốn chạy phân tích hàng loạt cho hàng trăm backtest cùng lúc.

Bảng so sánh giá AI phân tích kết quả backtest (đơn vị USD / 1 triệu token)

Giả sử mỗi tháng bạn chạy 500 lần phân tích, trung bình 6.000 token đầu vào + 2.000 token đầu ra = 8.000 token/lần, tổng cộng 4 triệu token/tháng.

Mô hìnhGiá gốc / 1M tokenChi phí qua HolySheep (¥=$1)Tiết kiệmChi phí tháng (4M tok)
DeepSeek V3.2$0.

🔥 Thử HolySheep AI

Cổng AI API trực tiếp. Hỗ trợ Claude, GPT-5, Gemini, DeepSeek — một khóa, không cần VPN.

👉 Đăng ký miễn phí →