Bài viết gần đây
-
Live Q&A 30 phút — hỏi GV về khóa Master AI-Agent trước khai giảng
Tháng 6 20, 2026 -
Countdown khai giảng — 3 bước đăng ký khóa Cowork 12 buổi
Tháng 6 20, 2026
| Backtest Chiến Lược Trading Bằng Python: Sharpe, Drawdown Và Cách Đọc Kết Quả Đúng
Được viết bởi thanhdt vào ngày 20/06/2026 lúc 22:05 | 32 lượt xem
“Chiến lược backtest lãi 300%” — bạn đã nghe câu này chưa? Vấn đề: hầu hết đều nói dối, không phải vì cố tình, mà vì đọc sai metric.
Backtest đúng cách là xương sống của Auto Trading chuyên nghiệp. Bài viết này (map Buổi 10 khóa Vibe Code Python Bot) dạy bạn:
- Backtest là gì — và không phải gì
- 4 metric bắt buộc: Return, Max Drawdown, Profit Factor, Sharpe
- Code Python tối giản với Pandas
- 3 lỗi overfit trader Việt hay mắc
1. Backtest Là Gì?
Backtest = chạy chiến lược của bạn trên dữ liệu lịch sử (OHLCV), giả lập vào/ra lệnh theo quy tắc đã định, tính lãi/lỗ tích lũy.
Nó không dự đoán tương lai. Nó trả lời câu hỏi:
“Nếu 3 năm qua tôi tuân thủ đúng quy tắc này — kết quả ra sao, và tôi đã từng sụt bao nhiêu % tài khoản?”
2. Vì Sao Win Rate Là Metric Dễ Lừa Nhất
| Chiến lược | Win Rate | Max Drawdown | Kết quả thực tế |
|---|---|---|---|
| A | 80% | -45% | Lãi nhỏ nhiều lần, 1 lần lỗ lớn phá tài khoản |
| B | 45% | -12% | Lãi ít lần nhưng R:R tốt, sống lâu |
Trader thích chiến lược A vì “thắng 8/10 lệnh” cảm giác dễ chịu. Nhà đầu tư định lượng chọn B vì sống sót quan trọng hơn cảm giác thắng.
Quy tắc vàng: Luôn xem Max Drawdown trước Total Return.
3. Bốn Metric Bắt Buộc
3.1 Total Return (Lợi nhuận tích lũy)
$$text{Return} = frac{text{Vốn cuối} – text{Vốn đầu}}{text{Vốn đầu}} times 100%$$
Đơn giản — nhưng không đủ.
3.2 Max Drawdown (Sụt giảm tài sản lớn nhất)
Đo đỉnh → đáy lớn nhất trong suốt backtest. Ví dụ: tài khoản từ 100M lên 130M rồi tụt về 95M → Drawdown từ đỉnh 130M là (130-95)/130 ≈ 27%.
Câu hỏi tự vấn: Bạn có chịu nổi nhìn tài khoản mất 27% mà không tắt bot không? Nếu không — chiến lược đó không phù hợp tâm lý bạn, dù backtest lãi.
3.3 Profit Factor
$$text{PF} = frac{sum text{Lãi}}{sum |text{Lỗ}|}$$
- PF > 1.5: khả quan (cần xem thêm số lệnh)
- PF < 1: thua lỗ dài hạn
3.4 Sharpe Ratio (đơn giản hóa)
Đo lợi nhuận có xứng đáng với biến động không. Sharpe cao = đường equity mượt hơn.
Khóa Vibe Code dạy công thức chuẩn + code Python tính tự động — không cần Excel thủ công.
4. Code Backtest Tối Giản Với Pandas
Ví dụ chiến lược MA Crossover trên dữ liệu OHLCV (đã có cột close):
import pandas as pd
def backtest_ma_cross(df: pd.DataFrame, fast: int = 10, slow: int = 20) -> dict:
df = df.copy()
df["ma_fast"] = df["close"].rolling(fast).mean()
df["ma_slow"] = df["close"].rolling(slow).mean()
df["signal"] = (df["ma_fast"] > df["ma_slow"]).astype(int)
df["returns"] = df["close"].pct_change()
df["strategy_returns"] = df["signal"].shift(1) * df["returns"]
equity = (1 + df["strategy_returns"].fillna(0)).cumprod()
peak = equity.cummax()
drawdown = (equity - peak) / peak
total_return = equity.iloc[-1] - 1
max_dd = drawdown.min()
wins = df["strategy_returns"][df["strategy_returns"] > 0].sum()
losses = abs(df["strategy_returns"][df["strategy_returns"] < 0].sum())
profit_factor = wins / losses if losses > 0 else float("inf")
return {
"total_return_pct": round(total_return * 100, 2),
"max_drawdown_pct": round(max_dd * 100, 2),
"profit_factor": round(profit_factor, 2),
"num_bars": len(df),
}
Lưu ý: Code trên chưa tính phí, slippage, spread — Buổi 10 khóa Vibe Code bổ sung đầy đủ để kết quả sát thực tế hơn.
5. Ba Lỗi Overfit — “Backtest Đẹp, Live Chết”
Lỗi 1: Tối ưu tham số quá kỹ trên cùng dataset
Quét MA(5,50) tìm bộ “lãi nhất” trên 2020–2024 → gần như chắc chắn overfit.
Cách sửa: Chia train/test hoặc walk-forward validation (Buổi 10–11).
Lỗi 2: Không trừ phí giao dịch
CK VN + Crypto đều có phí. Backtest không trừ phí = ảo tưởng.
Lỗi 3: Bỏ qua paper trading sau backtest
Backtest = quá khứ. Paper = hiện tại với latency thật. Bỏ qua bước này = nhảy cóc nguy hiểm.
6. Từ Backtest Đến Bot Live — Quy Trình 4 Bước
① Backtest (dữ liệu lịch sử)
↓ metric OK? (DD chấp nhận được)
② Paper trade (giá live, lệnh giả)
↓ ổn định 2–4 tuần?
③ Live nhỏ (1–5% vốn dự định)
↓ bot chạy đúng logic?
④ Scale dần + monitoring Telegram/VPS
Khóa Vibe Code đi đúng 4 bước này — không nhảy thẳng từ slide sang “bỏ tiền thật”.
7. Backtest Xong — Việc Tiếp Theo Là Gì?
- Ghi lại bộ tham số đã test — ngày mai bạn sẽ quên.
- So sánh với buy-and-hold — chiến lược có beat không mua giữ không?
- Đưa vào module
backtest/tách khỏiexecution/— kiến trúc modular (Buổi 9). - Đăng ký phụ đạo 1:1 nếu metric “đẹp quá” — mentor giúp bạn sanity check.
Kết Luận
Backtest không phải để khoe screenshot lãi — mà để từ chối chiến lược tệ trước khi mất tiền thật. Người đọc được Sharpe và Drawdown đúng cách đã vượt 90% trader chỉ nhìn chart.
Muốn học full pipeline: data → strategy → backtest → paper → VPS?
👉 Vibe Code Python Bot Auto Trading — khai giảng 07/2026
📊 Demo OHLCV → RSI — bước đầu trước backtest
💬 Comment BACKTEST — nhận template Python tính Sharpe + Drawdown.