P.Thai Capital P.Thai Capital Journal

Donchian Breakout & Turtle Trading: Khung định lượng cho TTCK VN

QUANT STRATEGY · TREND / BREAKOUT Đột phá kênh Donchian Donchian Channel Breakout (Turtle Trading) Họ chiến lược Trend / Breakout Khung phân tích Định lượng / Backtest Áp dụng cho VN30 / VN30F1M

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 đó:

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:

5. Năm cạm bẫy phổ biến khi áp dụng

  1. 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.

  2. 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.

  3. 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ỳ.

  4. 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.

  5. 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

❌ Không nên dùng khi

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


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.

Miễn trừ trách nhiệm: Nội dung là phân tích định lượng dựa trên dữ liệu lịch sử, mang tính tham khảo. KHÔNG phải khuyến nghị mua/bán. Giao dịch có rủi ro, kết quả backtest không đảm bảo hiệu suất tương lai. Nhà đầu tư tự chịu trách nhiệm cho quyết định của mình.
FAQ · Câu hỏi thường gặp

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ẽ.