16 năm backtest cổ phiếu Việt Nam — 5 điều ngược lại với hầu hết khuyên cũ

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.

Setup ngắn gọn

Khô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 đỏ.


Finding #1 — Buy-hold thắng tất cả active strategies trên 16 năm

StrategyCAGR 16yMaxDDSharpe
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.


Finding #2 — RSI > 70 là tín hiệu MUA, không phải bán

Đâ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 bucketMean fwd return 60dWin rateN
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 cohortMean 60dEdgeN
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.


Finding #3 — CRISIS không phải rủi ro. Là cơ hội (NẾU đúng loại).

Phân loại regime deterministic (no AI):

RegimeMean fwd return 60dWin rateN
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.


Finding #4 — Với 500 triệu, bạn không thể full-time trader ở Việt Nam

Monte Carlo bootstrap 1000 paths, horizon 10 năm, withdrawal đều mỗi tháng:

Vốn ban đầu12tr/tháng24tr/tháng36tr/tháng
500 triệu90% cháy99% cháy99% cháy
1 tỷ28% cháy91% cháy98% cháy
1.5 tỷ9% cháy57% cháy90% cháy
2 tỷ5% cháy ✅29% cháy67% 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.


Finding #5 — Sequence-of-returns risk lớn hơn ta tưởng

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 đầuSau 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.


Hệ quả thực tế cho retail Việt Nam

Sau khi chạy hết các con số này, mình rút ra 4 nguyên tắc:

1. Không trade. Buy-hold VN30. Đầu tư đều mỗi tháng. Cách này thắng 95% retail.

2. Nếu phải trade, dùng MA trend làm filter trước, RSI làm timer thứ hai. Không bao giờ ngược lại.

3. CRISIS là cơ hội — nhưng phải biết là PANIC hay FUNDAMENTAL. Đọc tin trước khi quyết định.

4. Để full-time trader VN, cần ít nhất 2.5 tỷ. Dưới ngưỡng đó, giữ công việc chính, đầu tư song song.


Reproducible

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.


Thích bài này? ⭐ Star repo · 💬 Subscribe Telegram để nhận daily report · 📡 RSS feed