Donchian Breakout & Turtle Trading: Khung định lượng cho TTCK VN
Donchian channel breakout — chiến lược của Turtle Traders áp dụng cho TTCK Việt Nam. Quy tắc S1/S2 gốc, position sizing theo N (ATR), và hạn chế trên VN30.
Donchian Channel Breakout là chiến lược nền tảng của Turtle Traders — nhóm trader được Richard Dennis và William Eckhardt huấn luyện năm 1983 với giả thuyết “trader có thể được dạy” (kết quả: nhóm Turtle kiếm trung bình ~80%/năm trong 4 năm). Toàn bộ ruleset của họ đã được Curtis Faber công bố miễn phí trong “The Original Turtle Rules” (2003).
Hai biến thể chính: System 1 (S1) — entry khi giá phá đỉnh 20 ngày, exit khi phá đáy 10 ngày; System 2 (S2) — entry phá đỉnh 55 ngày, exit phá đáy 20 ngày. S2 chậm hơn nhưng bắt được trend dài. Cả hai đều dùng cùng cơ chế position sizing dựa trên N (chính là ATR 20 ngày).
1. Định nghĩa & cơ sở lý thuyết
Donchian Channel với window $n$: $$ \begin{aligned} DC_{upper,t} &= \max(P_{t-n}, P_{t-n+1}, \dots, P_{t-1}) \ DC_{lower,t} &= \min(P_{t-n}, P_{t-n+1}, \dots, P_{t-1}) \end{aligned} $$
Position size theo Turtle: 1 đơn vị (Unit) = $\frac{1\% \cdot \text{Equity}}{N \cdot \text{DollarVolatility}}$, với $N$ = ATR(20). Mục tiêu: mỗi vị thế chịu rủi ro 1% equity nếu giá đi ngược 1N.
Trong đó:
- $P_t$ là giá đóng cửa tại thời điểm $t$
- $MA_n$ là trung bình trượt window $n$
- $\sigma_n$ là độ lệch chuẩn rolling
- Các tham số khác diễn giải trong bảng tham số bên dưới
2. Pseudocode triển khai
def donchian_signal(prices, entry_n=20, exit_n=10):
"""
System 1 Turtle: entry breakout 20 ngày, exit breakout ngược 10 ngày.
Trả về tín hiệu position {0, +1, -1}
"""
dc_up_entry = prices.rolling(entry_n).max().shift(1)
dc_lo_entry = prices.rolling(entry_n).min().shift(1)
dc_up_exit = prices.rolling(exit_n).max().shift(1)
dc_lo_exit = prices.rolling(exit_n).min().shift(1)
pos = 0
out = []
for t in range(len(prices)):
p = prices.iloc[t]
if pos == 0:
if p > dc_up_entry.iloc[t]: pos = +1
elif p < dc_lo_entry.iloc[t]: pos = -1
elif pos > 0 and p < dc_lo_exit.iloc[t]:
pos = 0
elif pos < 0 and p > dc_up_exit.iloc[t]:
pos = 0
out.append(pos)
return pd.Series(out, index=prices.index)
def turtle_position_size(equity, atr, dollar_vol, risk_pct=0.01):
"""Position size theo Turtle (1 Unit = 1% rủi ro/N)."""
unit = (risk_pct * equity) / (atr * dollar_vol)
return unit
Code mẫu trên là khung tham khảo — triển khai production cần thêm: validate input, handle NaN, log signal, hook vào execution engine (REST API qua TCBS/SSI/Vndirect), và unit test cho từng nhánh logic.
3. Tham số & khoảng walk-forward
| Tham số | S1 (mặc định) | S2 (chậm) | Ghi chú |
|---|---|---|---|
| Entry window | 20 ngày | 55 ngày | Phá đỉnh / đáy n ngày |
| Exit window | 10 ngày | 20 ngày | Phá ngược n ngày → thoát |
| Risk per Unit | 1% equity | 1% equity | Cố định theo rule Turtle |
| Max units / market | 4 | 4 | Pyramid khi giá đi đúng |
| Stop loss | 2N từ entry | 2N từ entry | N = ATR(20) |
Lưu ý về walk-forward optimization: không nên fix tham số “tốt nhất” trên toàn bộ lịch sử. Quy trình chuẩn là rolling window — fit tham số trên 252 phiên gần nhất, áp dụng 63 phiên tiếp theo (tỷ lệ ~80/20), sau đó shift cửa sổ. Báo cáo distribution của Sharpe, max DD, Calmar trên các fold thay vì 1 con số tổng.
4. Đặc thù thị trường Việt Nam
Donchian breakout trên VN:
- Biên độ ±7% HOSE = phá đỉnh 20 ngày đôi khi xảy ra ngay trong 1 phiên trần — entry tại giá trần khó khớp, dễ bị bán cuối phiên.
- T+2.5 settlement: cấm short cơ sở. Muốn áp dụng S1 đầy đủ phải dùng VN30F1M.
- Liquidity: chiến lược cần ADV ≥ 30 tỷ/ngày để slippage không ăn breakout.
- Whipsaw VN-Index 2022-2023: nhiều giả breakout do tin Fed / margin call. S1 với entry 20 ngày bị whipsaw ~6 lần trong giai đoạn này; S2 (55 ngày) chỉ bị 2 lần.
5. Năm cạm bẫy phổ biến khi áp dụng
-
Pyramid khi entry sai: Turtle gốc cho phép pyramid +1 Unit mỗi 0.5N giá đi đúng — nếu áp dụng máy móc trên VN với T+2.5, có thể quá tải vị thế trước khi cover được rủi ro.
-
False breakout do margin call: VN có giai đoạn margin force-sell theo cluster. Breakout xuống dưới mạnh (S1 short) có thể là fake, đảo chiều ngay T+1.
-
Non-stationary N: ATR(20) thay đổi nhanh sau biến cố — vị thế cũ tính theo N cũ vẫn còn outstanding. Cần re-size định kỳ.
-
Survivorship bias: backtest trên VN30 hiện tại bỏ qua mã từng breakout rồi bị huỷ niêm yết / cảnh báo.
-
Tâm lý: Turtle có hit rate ~35-40% nhưng winners > losers (R-multiple ~3:1). Trader retail thường bỏ chiến lược sau 4-5 lệnh thua liên tiếp — đó là lý do số trader theo Turtle thực thụ rất ít.
6. Khi nào nên dùng — khi nào không
✅ Nên dùng khi
- Danh mục đa cổ phiếu / đa tài sản (cổ phiếu + phái sinh + tiền mặt)
- Có khả năng chịu drawdown 20-30% (Turtle gốc chịu DD ~40% trong 1985)
- Vốn ≥ 1 tỷ VND (cần đủ size để chia 4 Units / mã)
❌ Không nên dùng khi
- Sideway thị trường (S1 sẽ whipsaw nhiều)
- Vốn nhỏ (không đủ để diversify universe)
- Trader tâm lý yếu, không chịu được losing streak 5-10 trade
7. Vị trí trong hệ thống chiến lược định lượng
Chiến lược “Đột phá kênh Donchian” không hoạt động độc lập — trong portfolio định lượng đa chiến lược, nó được kết hợp với các chiến lược khác để tận dụng correlation thấp giữa các họ tín hiệu (mean reversion ↔ trend following thường có correlation âm trong giai đoạn sideway).
Các chiến lược liên quan đã trình bày trong chuỗi bài này:
8. Tham khảo học thuật
-
Faber, C. (2003). The Original Turtle Trading Rules (free PDF).
-
Covel, M. (2007). The Complete TurtleTrader: How 23 novice investors became overnight millionaires. HarperBusiness.
-
Wilder, J. W. (1978). New Concepts in Technical Trading Systems. Trend Research.
Ghi chú phương pháp: Bài viết tổng hợp khung định lượng trên cơ sở lý thuyết và quy ước cộng đồng quant. Các giả định về phí giao dịch, slippage, regime filter là giả định mô hình — kết quả backtest thực tế phụ thuộc dataset, universe, và cách xử lý survivorship bias. Người đọc tự kiểm chứng bằng dữ liệu của mình trước khi triển khai vốn thật.
Miễn trừ trách nhiệm: Nội dung mang tính phân tích định lượng, không phải khuyến nghị đầu tư. Nhà đầu tư tự chịu trách nhiệm với quyết định của mình.
Áp dụng vào tài khoản thật?
Mở tài khoản chứng khoán qua mã giới thiệu — nhận tư vấn 1-1, DIAMOND signal VN30 miễn phí 6 tháng, ưu đãi phí giao dịch.
CTCK VPS Securities
- Mã IB: 9836 (mở online 15 phút)
- Phí 0.15% · margin 13%/năm
- + DIAMOND signal VN30 — 6 tháng
- + Tư vấn cơ cấu danh mục 1-1
Gói VIP / DIAMOND
- Tín hiệu VN30 + Midcap hằng phiên
- Backtest 5-15 năm minh bạch
- Báo cáo NAV hằng tháng
- Workshop định lượng hằng tháng
⚠️ Giao dịch chứng khoán có rủi ro mất vốn. Chỉ đầu tư số tiền bạn có thể chịu mất. P.Thai Capital không khuyến nghị mua/bán cụ thể và không bảo lãnh lợi nhuận.
Lý thuyết bài này có thể test trên dữ liệu của bạn:
Câu hỏi đi sâu chủ đề này
Khi nào thì chiến lược Donchian Breakout kém hiệu quả nhất trên TTCK Việt Nam?
Chiến lược Donchian Breakout thường kém hiệu quả nhất khi thị trường đi ngang (sideway) hoặc không có xu hướng rõ ràng. Với biên độ giao dịch ±7% trên HOSE, các phiên giá chạm đỉnh/đáy kênh Donchian nhưng sau đó nhanh chóng đảo chiều là rất phổ biến. Ví dụ: VN-Index trong quý 2/2023 đã có giai đoạn dao động quanh 1050-1080 điểm trong nhiều tuần. Trong kịch bản này, hệ thống S1/S2 sẽ liên tục tạo tín hiệu mua/bán giả, dẫn đến hàng loạt lệnh cắt lỗ nhỏ, bào mòn NAV của bạn. Để hạn chế, tôi thường khuyến nghị kết hợp bộ lọc xu hướng, ví dụ, chỉ giao dịch breakout khi chỉ báo ADX (Average Directional Index) lớn hơn 25, cho thấy thị trường đang có xu hướng đủ mạnh.
Việc tính toán "N" (ATR) để xác định kích thước vị thế theo phương pháp Turtle có điểm gì cần lưu ý đặc biệt với các cổ phiếu VN30?
Với các cổ phiếu VN30, "N" (ATR 20 ngày) cần được theo dõi sát sao vì các yếu tố đặc thù. Mặc dù bluechip thường ổn định hơn, nhưng N có thể bị nhiễu bởi các phiên giao dịch biến động mạnh bất thường, ví dụ do tin tức lớn (M&A, kết quả kinh doanh đột biến) hoặc các sự kiện như chia cổ tức, phát hành thêm. Ví dụ: một cổ phiếu như FPT có thể có N (ATR 20) dao động từ 1.500đ đến 3.000đ tùy giai đoạn. Điều này ảnh hưởng trực tiếp đến Dollar Volatility (N * Giá cổ phiếu) và kích thước đơn vị (Unit size). Nếu N tăng đột biến, unit size sẽ giảm để duy trì mức rủi ro 1% equity. Tôi thường dùng ATR bình quân 50 ngày để làm "smoothing" cho N, giúp giảm thiểu tác động của các outlier ngắn hạn, tăng tính ổn định cho position sizing.
Phương pháp Donchian Breakout có thể bị ảnh hưởng như thế nào bởi các đặc thù về khớp lệnh và thanh toán như T+2.5, biên độ sàn, hay lệnh ATO/ATC trên HOSE?
Các đặc thù này tạo ra những cạm bẫy lớn cho chiến lược. * T+2.5: Mua breakout hôm nay, nếu ngày T+1, T+2 giá giảm mạnh qua điểm stop loss, bạn không thể bán được vì hàng chưa về. Điều này có thể khiến mức lỗ vượt xa mức rủi ro 1N theo tính toán ban đầu. * Biên độ ±7% HOSE: Một phiên tăng/giảm kịch trần/sàn có thể khiến tín hiệu breakout trở nên kém hấp dẫn (mua quá cao) hoặc không thể khớp lệnh cắt lỗ đúng điểm (do không có bên mua/bán đối ứng). * Lệnh ATO/ATC: Giá mở/đóng cửa có thể nhảy vọt, tạo gap. Nếu điểm exit của S1/S2 rơi vào vùng gap, lệnh cắt lỗ có thể bị trượt giá (slippage) nghiêm trọng. Ví dụ: BID hôm trước đóng cửa 45k, điểm exit S1 là 44k, nhưng ATO hôm sau mở cửa 43k thì bạn đã lỗ thêm 1k/cp ngay từ đầu phiên mà không thể làm gì được.
Ngoài Donchian Channel, liệu có chỉ báo trend/breakout nào khác phù hợp hơn với đặc điểm biến động của TTCK Việt Nam mà P.Thai Capital đã nghiên cứu?
Donchian Channel là nền tảng, nhưng trên TTCK Việt Nam, tôi cũng nghiên cứu các biến thể khác. Keltner Channels là một lựa chọn đáng cân nhắc. Thay vì dùng giá cao nhất/thấp nhất trong N ngày, Keltner Channel dùng ATR để xác định độ rộng kênh quanh đường trung bình động (thường là EMA 20). Điều này giúp kênh ít bị "giật" bởi các đỉnh/đáy đơn lẻ, từ đó giảm tín hiệu breakout giả trong giai đoạn thị trường biến động giằng co. Khi giá phá vỡ Keltner Channel, tín hiệu breakout có thể đáng tin cậy hơn. Ngoài ra, việc kết hợp với Momentum (RSI/MACD) cũng giúp xác nhận lực của xu hướng. Ví dụ, chỉ mua breakout Donchian khi RSI(14) đang trên 60 và đường MACD Histogram dương, cho thấy đà tăng mạnh mẽ.
P.Thai Capital