SEPA Masterclass Việt Nam — Phần VI: Công Cụ Và Hệ Thống Hóa

CHƯƠNG 40

Nhận Diện Mẫu Hình Tự Động — VCP, Cup, Flat Base, Failed Breakout


40.1 Từ Quy Tắc Định Tính Sang Thuật Toán Định Lượng

Chương 24–28 đã trình bày các mẫu hình bằng ngôn ngữ định tính kèm ngưỡng tham khảo. Chương này chuyển hóa các quy tắc đó thành thuật toán có thể lập trình được, dựa trên nguyên tắc chung đã giới thiệu ở Chương 24, Mục 24.20: phân đoạn giá thành các "đợt sóng" (swing) dựa trên đỉnh và đáy cục bộ, sau đó áp dụng các bộ quy tắc kiểm tra trên chuỗi đợt sóng đó.


40.2 Bước 1 — Phân Đoạn Đợt Sóng (Swing Segmentation)

Thuật toán nền tảng cho toàn bộ hệ thống nhận diện mẫu hình: xác định các đỉnh và đáy cục bộ (local maxima/minima) trên chuỗi giá đã làm mượt nhẹ (để loại bỏ nhiễu nhỏ không có ý nghĩa cấu trúc).

// Logic phân đoạn đợt sóng (minh họa khái niệm, giả mã)
function detectSwings(priceSeries, minSwingPct):
    swings = []
    for each local peak/trough in priceSeries:
        if abs(peak_price - previous_trough_price) / previous_trough_price >= minSwingPct:
            swings.append(peak or trough)
    return swings

Tham số minSwingPct — ngưỡng biên độ tối thiểu để một điểm được xem là "đợt sóng có ý nghĩa" thay vì nhiễu ngẫu nhiên — cần được chuẩn hóa theo biên độ giá của sàn niêm yết, nhất quán với nguyên tắc đã trình bày ở Chương 24, Mục 24.4.


40.3 Thuật Toán Nhận Diện VCP

BướcKiểm traTham chiếu
1Trích xuất chuỗi đợt sóng giảm (từ đỉnh xuống đáy) liên tiếp sau một đợt tăng giá trước đó24.1
2Kiểm tra tính đơn điệu giảm dần của biên độ % giữa các đợt sóng giảm liên tiếp24.7
3Kiểm tra khối lượng bình quân của mỗi đợt sóng giảm giảm dần tương ứng24.5
4Xác nhận khối lượng khô cạn ở đợt sóng cuối (dưới ngưỡng phần trăm so với trung bình 50 phiên)24.6
5Nếu tất cả điều kiện thỏa mãn, gắn cờ điểm pivot = đỉnh của đợt sóng giảm cuối cùng24.10

40.4 Thuật Toán Nhận Diện Cup With Handle

Phức tạp hơn VCP vì cần nhận diện hình dạng cong tổng thể. Cách tiếp cận thực hành hai giai đoạn đã đề xuất ở Chương 25, Mục 25.12:

  1. Giai đoạn A: khớp đường giá đã làm mượt trên đoạn nghi ngờ là "cốc" với một hàm bậc hai (parabol); đánh giá độ khớp (goodness of fit) để xác nhận hình dạng bo tròn thay vì nhọn chữ V.
  2. Giai đoạn B: áp dụng thuật toán nhận diện VCP (Mục 40.3) cho đoạn cuối cùng của chuỗi giá, nghi ngờ là "tay cầm" — xác nhận vị trí tay cầm nằm ở nửa trên của biên độ toàn bộ cốc (Chương 25, Mục 25.2).

40.5 Thuật Toán Nhận Diện Flat Base

Đơn giản nhất trong ba loại, như đã lưu ý ở Chương 26, Mục 26.14: tính độ lệch chuẩn hoặc biên độ đỉnh-đáy chuẩn hóa của giá đóng cửa trong một cửa sổ thời gian trượt, so sánh với ngưỡng đã chuẩn hóa theo nhóm vốn hóa (Chương 26, Mục 26.7).

// Logic nhận diện Flat Base (giả mã)
function detectFlatBase(priceSeries, windowSize, capGroup):
    window = priceSeries.last(windowSize)
    range_pct = (max(window) - min(window)) / min(window)
    threshold = getThresholdForCapGroup(capGroup)   // Chương 26, Mục 26.7
    isFlat = range_pct <= threshold and windowSize >= MIN_WEEKS
    return isFlat

40.6 Thuật Toán Cảnh Báo Failed Breakout

Dựa trên danh sách dấu hiệu cảnh báo tổng hợp ở Chương 28, Mục 28.7, xây dựng một điểm số rủi ro thất bại tổng hợp (composite failure risk score) thay vì một quy tắc nhị phân đơn giản:

Đặc trưng đầu vàoTrọng số minh họa
Tỷ lệ khối lượng breakout / trung bình 50 phiênCao — dưới ngưỡng xác nhận thì tăng điểm rủi ro mạnh
Stage của chỉ số thị trường chung tại thời điểm breakoutCao — Stage 3/4 tăng điểm rủi ro đáng kể
Vị trí trong chu kỳ tích lũy-breakout (Cốc Muộn/Late Flat Base)Trung bình đến cao
Sức mạnh tương đối nội ngànhTrung bình
Biến động bất thường quanh ATC trên thanh khoản mỏngTrung bình

Đây chính là mô hình hồi quy logistic hoặc học máy đã đề xuất ở Chương 28, Mục 28.13 — huấn luyện trên dữ liệu lịch sử các breakout đã biết kết quả để hiệu chỉnh trọng số một cách khách quan thay vì gán thủ công.


40.7 Kiến Trúc Máy Trạng Thái Cho Khung Năm Giai Đoạn

Như đã đề xuất ở Chương 33, Mục 33.13, toàn bộ hành trình một chiến dịch tích lũy tổ chức (Giai đoạn 1–5) có thể hình thức hóa thành máy trạng thái hữu hạn, với các quy tắc chuyển đổi dựa trên kết quả của các thuật toán ở Mục 40.2–40.6 kết hợp với dữ liệu khối lượng (Chương 29) và Stage Analysis (Chương 21):

// Sơ đồ chuyển đổi trạng thái (giả mã khái niệm)
STATE_1_OPPORTUNITY  -> STATE_2_ACCUMULATION   [khi có dấu hiệu absorption/dry-up ban đầu]
STATE_2_ACCUMULATION -> STATE_3_FIRST_BASE     [khi VCP/FlatBase được xác nhận]
STATE_3_FIRST_BASE   -> STATE_4_CONFIRMED      [khi breakout thành công + Trend Template]
STATE_4_CONFIRMED    -> STATE_5_DISTRIBUTION   [khi Cốc Muộn/Late Flat Base + Stage 3 xác nhận]

40.8 Tóm Tắt Chương

40.9 Bài Tập

  1. Viết lại thuật toán phân đoạn đợt sóng ở Mục 40.2 bằng ngôn ngữ lập trình bạn quen thuộc (Python, Pine Script, hoặc giả mã chi tiết hơn).
  2. Áp dụng thuật toán nhận diện Flat Base ở Mục 40.5 cho một cổ phiếu bạn đang theo dõi.
  3. Liệt kê thêm hai đặc trưng đầu vào khác có thể bổ sung vào mô hình điểm số rủi ro thất bại ở Mục 40.6.

40.10 Câu Hỏi Ôn Tập

40.11 Checklist Chuyên Nghiệp

40.12 Lỗi Thường Gặp

40.13 Ghi Chú Nâng Cao

Đối với nhà phát triển: các thuật toán ở chương này nên được kiểm định (backtest) trên dữ liệu lịch sử trước khi triển khai thời gian thực — Chương 42 sẽ trình bày khung backtest phù hợp, bao gồm cả cách xử lý các ràng buộc đặc thù Việt Nam (biên độ giá, thanh toán T+2,5) đã cảnh báo ở Chương 3, Mục 3.13.