Vietnamese Stock Market Toolkit — daily reports auto-generated from open-source library
TL;DR — Mình chạy backtest deterministic trên ~47,000 data points của 30 mã VN30 + HNX30 từ 2010 đến 2026. Đây là 5 finding ngược với hầu hết khuyên đang lan truyền trên các group đầu tư Việt Nam. Tất cả code + data + reproducible setup đều open source tại lotusmarket.
make backtest trong repoKhông cherry-pick. Không “chỉ năm tốt”. Bao gồm 2011 (-10%), 2018 (-15%), 2022 (VTP/BĐS, -28%), 2025 mini-crash (-31%). 10/16 năm xanh, 6/16 đỏ.
| Strategy | CAGR 16y | MaxDD | Sharpe |
|---|---|---|---|
| Buy-hold equal-weight VN30 | +15.37% | -36% | 0.81 |
| trend_200ma | +21.6% (10y) | -51% | 0.59 |
| momentum_12_1 | +21.7% (10y) | -44% | 0.62 |
| low_vol top-5 | +26.2% (10y) | -42% | 0.74 |
| dual_momentum | +15.7% (10y) | -55% | 0.52 |
Active strategy trông đẹp trên window 10y (2017-2026) — nhưng đó là window cherry-picked. Mở rộng ra 16 năm, buy-hold đơn giản (mua đều 12 mã VN30 cũ, không rebalance) đánh bại tất cả.
Lý do: phí + slippage + mistimed entries ăn hết alpha mà active strategy tạo ra. Trên 16 năm, mỗi lần rebalance là một lần lose ~0.35% bị phí ăn — và momentum/low_vol rebalance ~12 lần/năm.
Hệ quả thực tế: nếu bạn không phải full-time quant, chiến lược đơn giản nhất thắng. Mua đều VN30 mỗi tháng. Không rebalance. Không trade. Năm 16 sau, bạn đánh bại 95% retail trader.
Đây là điều ngược lại nhất với những gì textbook + group VN đang dạy.
Cohort analysis trên ~45,000 row clean:
| RSI bucket | Mean fwd return 60d | Win rate | N |
|---|---|---|---|
| RSI < 30 (oversold) | +6.32% | 60% | 1,755 |
| RSI 30-50 | +3.67% | 52% | 18,933 |
| RSI 50-70 | +4.82% | 53% | 20,681 |
| RSI > 70 (overbought) | +9.23% | 60% | 4,015 |
Baseline VN30 2017-2026 60d = +4.75%. Tức là RSI > 70 cho edge +4.48% so với baseline. Đây là momentum effect, không phải mean-reversion.
Càng kết hợp với MA trend càng rõ:
| Joint cohort | Mean 60d | Edge | N |
|---|---|---|---|
| Uptrend × RSI > 70 | +9.80% | +5.05% | 2,814 |
| Downtrend × RSI > 70 | -1.40% | -6.15% | 139 |
Cùng một RSI 75, nhưng:
Bài học: đừng dùng RSI làm signal độc lập. Phải nhìn cả MA trend trước.
Phân loại regime deterministic (no AI):
| Regime | Mean fwd return 60d | Win rate | N |
|---|---|---|---|
| STABLE | +3.20% | 48% | 23,868 |
| EUPHORIA | +6.12% | 59% | 10,279 |
| VOLATILE | +6.34% | 56% | 7,482 |
| CRISIS | +8.53% | 67% | 2,582 |
Đúng vậy: regime CRISIS có forward return cao nhất. Vì lúc đó giá đã rớt, định giá lại, panic seller đã bán hết.
Cảnh báo: CRISIS có 2 sub-type:
Vạn Thịnh Phát 10/2022 là fundamental. 2020 COVID là panic. Phản ứng đúng cho 2 cái khác nhau hoàn toàn.
Monte Carlo bootstrap 1000 paths, horizon 10 năm, withdrawal đều mỗi tháng:
| Vốn ban đầu | 12tr/tháng | 24tr/tháng | 36tr/tháng |
|---|---|---|---|
| 500 triệu | 90% cháy | 99% cháy | 99% cháy |
| 1 tỷ | 28% cháy | 91% cháy | 98% cháy |
| 1.5 tỷ | 9% cháy | 57% cháy | 90% cháy |
| 2 tỷ | 5% cháy ✅ | 29% cháy | 67% cháy |
| 3 tỷ | 4% cháy ✅ | 7% cháy ✅ | 26% cháy |
| 5 tỷ | 2% cháy ✅ | 4% cháy ✅ | 6% cháy ✅ |
Vốn tối thiểu (P_cháy ≤ 5%, real-terms với lạm phát 4%):
Đây là safe withdrawal rate ~5-7% cho VN — cao hơn Mỹ (4%) vì CAGR VN cao hơn nhưng cũng volatile hơn. Quy luật: vốn ≈ chi phí năm × 17-20.
Người có 500tr nói “nghỉ việc đi trade chứng khoán nuôi cả nhà” chỉ có 1 outcome: 18-24 tháng sau quay lại đi làm với tài khoản nhỏ hơn ban đầu.
Cùng 2 tỷ + rút 12tr/tháng, kết quả khác nhau theo năm bắt đầu:
| Năm bắt đầu | Sau 10 năm |
|---|---|
| 2010 (sau khủng hoảng 2008) | OK, còn ~10 tỷ |
| 2014 (giữa cycle) | OK, còn ~8.6 tỷ |
| 2017 (cherry-picked tốt) | OK, còn ~6.2 tỷ |
| 2022 (khủng hoảng đầu) | OK nhưng còn ~2.2 tỷ — giảm 70% vốn dù không cháy |
Đây không phải skill issue. Đây là timing luck. Bạn chọn đúng năm bắt đầu là 50% kết quả. Đó là lý do emergency fund 24 tháng không phải lựa chọn — là requirement.
Sau khi chạy hết các con số này, mình rút ra 4 nguyên tắc:
Tất cả số liệu trong bài này có thể chạy lại trên máy bạn:
git clone https://github.com/ducnhd/lotusmarket
cd lotusmarket/go && go build -o lmcli ./cmd/lmcli
# Daily report
./lmcli report
# Star ratings
./lmcli rate ACB
# Cohort analysis: use the historical package directly
Hoặc dùng Python:
pip install lotusmarket==0.5.0
Tất cả MIT license. Không API key (trừ FRED nếu muốn macro US data — free).
Mình build cái này vì 7 triệu retail VN deserve công cụ tốt hơn “hot pick từ thầy”. Nếu bạn thấy hữu ích, GitHub star và share là cách support tốt nhất.
Author: Dat Duc Nguyen Huu — backend dev, VN retail investor. Discuss: GitHub Issues / Telegram channel (daily auto-posts).
Tất cả con số trong bài là kết quả backtest deterministic — không phải lời khuyên đầu tư. Past performance does not guarantee future results.