Validation V1 vs V2 SMC Scoring — 624 signals walk-forward, 9 filter variants
Kiểm chứng độc lập framework chấm điểm V2 (9 component, thêm momentum + MTF confluence + market RS). Diagnose tại sao filter "score≥55 + FVG≥1.0 + golden bucket" đề xuất làm giảm hiệu suất 90% và quyết định production deploy V2 raw + golden bucket badge.
Tóm lược
Báo cáo này kiểm chứng độc lập framework chấm điểm V2 cho tín hiệu SMC (Supply/Demand zone + FVG + Order Block) được đề xuất cải tiến từ V1 baseline. Chạy lại walk-forward replay trên 467 mã VN thanh khoản ≥ 500M VND/ngày giai đoạn 2022-01 đến 2026-04, phát hiện V2 thêm +45% total R/năm so với V1 (29.8 vs 20.5 R/năm), tương đương gross equity tăng từ 8.2% lên 11.9%/năm. Tăng chủ yếu đến từ density cao hơn (624 vs 543 signals, 22.3% vs 14.7% trigger rate) dù precision per-trade giảm nhẹ (53.2% vs 61.3% R1 win rate).
Test 9 filter variants cho V2. Phát hiện quan trọng: filter "score ≥ 55 AND fvg_atr ≥ 1.0 AND phase×zone ∈ golden buckets" được đề xuất từ intuition analysis làm giảm Total R/năm từ 29.8 xuống 3.0 (giảm 90%). Root cause là calibration inversion: V2 score band 50-60 có trigger rate 28.9%, score band 70+ có trigger rate 0%, vì zones quality quá cao đẩy giá ra xa vùng retest trong TTL. Thay vào đó, quyết định deploy V2 raw với badge ★ GOLDEN cho 3 phase×zone precision cao (accumulation×demand 75% R1 win, markup×demand 52%, markdown×supply 49%) — user focus mà không mất signal volume.
Keywords: SMC scoring historical replay walk-forward validation golden bucket calibration inversion
1.Bối cảnh & câu hỏi
Framework chấm điểm V1 hiện tại gán mỗi zone điểm 0-100 dựa trên 6 component: zone_quality (30 điểm, dựa FVG strength và freshness), phase_alignment (25 điểm, Wyckoff phase khớp với zone type), confluence (15 điểm, Spring/No-Supply/Upthrust/No-Demand), proximity (15 điểm, giá hiện tại tới zone), volume_context (10 điểm, volume ngày tạo zone), structure (5 điểm, cùng hướng MA200).
Đề xuất V2 thêm 3 component: momentum (8 điểm, ROC 20d của stock so với peers), MTF confluence (5 điểm, zone khớp với weekly zone), market RS (5 điểm, stock relative strength so với VN-Index). Weight redistribute về 9 component với tổng 100.
Câu hỏi báo cáo trả lời: (1) V2 có thực sự cải thiện hiệu suất so với V1 trên walk-forward OOS không? (2) Filter production score≥55 + fvg≥1.0 + phase×zone ∈ golden buckets có tăng precision đủ bù density loss? (3) Nếu không, cách deploy tối ưu cho production là gì?
2.Methodology — walk-forward replay
Script historical_replay.py mô phỏng scanner chạy lại mỗi phiên trong window 2022-01-01 đến 2026-04-22 (4.3 năm). Với mỗi phiên t, detect tất cả zone validated tại t (emission = zone i với i + impulse_window = t), chỉ dùng data ≤ t (không lookahead). Với mỗi emission, walk forward theo TTL bars (phụ thuộc phase/zone type) theo dõi outcome:
expired_untouched— giá không quay về zone trong TTLmitigated_before_trigger— giá break invalidation trước khi retesttriggered_stop— retest rồi hit stoptriggered_r1_win— retest, hit R1 (1R profit), expired chưa R2triggered_r2_win— retest, hit R2 (2R profit)triggered_r1_then_stop— retest, hit R1 rồi quay lại stop
Mỗi zone có stop riêng dựa trên zone boundary ± 0.5×ATR. Entry giả định = midpoint zone. 1R = (entry − stop). Target R1 = entry + 1R, target R2 = entry + 2R. Với VN stock, 1R điển hình ≈ 3-5% giá. Position sizing 10% equity/trade.
Universe: 467 mã VN (loại VNINDEX, filter liquidity trailing 60d ≥ 500M VND/phiên). Emission threshold: score ≥ 50 cho cả V1 và V2 (để capture toàn bộ signal distribution). Tất cả 3 input optional của V2 (momentum, weekly zones, VNINDEX ROC) đều có sẵn data, không fallback neutral.
3.V1 vs V2 head-to-head
Kết quả raw (không filter bổ sung):
| Metric | V1 baseline | V2 raw | Delta |
|---|---|---|---|
| Signals emitted | 543 | 624 | +15% |
| Trigger rate | 14.7% | 22.3% | +7.6pp |
| R1 win rate (khi triggered) | 61.3% | 53.2% | −8.1pp |
| Stop rate | 12.5% | 11.5% | ~ |
| Mean MFE | +41.7% | +40.2% | ~ |
| Mean MAE | −0.42% | −0.79% | −0.37pp |
| Triggers/năm | 18.6 | 32.3 | +74% |
| Total R/năm | 20.5 | 29.8 | +45% |
| Gross equity/năm | 8.2% | 11.9% | +45% |
V2 tăng density 15%, triggers/năm tăng 74%, dù precision per-trade giảm 8 điểm phần trăm. Tổng R/năm tăng 45%. Với 1 trader thực tế, tiêu chí đánh giá là R/năm (total output) chứ không phải precision thuần (accuracy) — V2 rõ ràng tốt hơn.
Breakdown theo phase × zone type
Phân tích bucket cho thấy V2 thay đổi không đồng đều giữa các phase:
| Setup | V1 trigger | V1 R1 win | V2 trigger | V2 R1 win | Verdict |
|---|---|---|---|---|---|
| accumulation × demand | 23.5% | 75% | 28.6% | 75% | V2 WIN — 0% stop |
| markup × demand | 17.5% | 56.4% | 29.0% | 51.8% | V2 more volume |
| markdown × supply | 27.7% | 65.2% | 36.8% | 48.7% | V1 slightly better |
| unclear × demand | 4.5% | 66.7% | 2.3% | 66.7% | Similar |
Golden bucket của V2: accumulation × demand với 28.6% trigger, 75% R1 win, 0% stop trên n=42 signals. Đây là setup precision cao nhất trong toàn bộ framework.
Breakdown theo FVG strength band
V2 làm relationship giữa FVG strength và win rate trở nên monotonic (đơn điệu tăng), V1 phẳng:
| FVG band | V1 R1 win | V2 R1 win | Delta |
|---|---|---|---|
| FVG ≥ 1.5 ATR | 62.5% | 70.0% | +7.5pp ⬆ |
| FVG 1.0 – 1.5 ATR | 60.0% | 61.3% | +1.3pp |
| FVG 0.5 – 1.0 ATR | 61.5% | 46.6% | −14.9pp ⬇ |
V1 flat ~60% cho mọi band → không phân biệt được. V2 cleaner — FVG mạnh càng lớn precision càng cao. Đây là bằng chứng V2 scoring đang capture nhiều nuance hơn.
4.9 filter variants tested
Đề xuất filter production: score ≥ 55 AND fvg_size_atr ≥ 1.0 AND (phase, zone_type) ∈ {(accumulation, demand), (markup, demand), (markdown, supply)}. Lý lẽ: giảm noise, tăng precision, focus vào golden buckets.
Test filter này trên 624 V2 signals, so sánh với 8 variants khác:
| Variant | n | Triggered | R1 win | Stop | Total R/yr | Gross %/yr |
|---|---|---|---|---|---|---|
| V2 raw (no filter) | 624 | 139 | 53.2% | 11.5% | 29.8 | 11.9% |
| V2: golden buckets only | 441 | 136 | 52.9% | 11.8% | 28.8 | 11.5% |
| V2: FVG ≥ 1.0 | 395 | 51 | 64.7% | 11.8% | 13.3 | 5.3% |
| V2: FVG ≥ 1.5 | 226 | 20 | 70.0% | 10.0% | 5.6 | 2.2% |
| V2: score ≥ 55 | 300 | 17 | 70.6% | 17.6% | 4.9 | 2.0% |
| V2: score 55-70 | 292 | 17 | 70.6% | 17.6% | 4.9 | 2.0% |
| V2: score<70 AND FVG≥1.0 | 387 | 51 | 64.7% | 11.8% | 13.3 | 5.3% |
| V2: golden + score<70 | 433 | 136 | 52.9% | 11.8% | 28.8 | 11.5% |
| V2 FULL proposed filter | 166 | 8 | 87.5% | 12.5% | 3.0 | 1.2% |
Filter production đề xuất làm giảm Total R/năm từ 29.8 xuống 3.0 (−90%). Dù R1 win rate tăng lên 87.5% (impressive), chỉ có 8 trigger trên 4.3 năm = 1.9 triggers/năm. Precision cao nhưng density quá thấp để tạo PnL đáng kể. Đây là classic precision-recall tradeoff đi quá xa về phía precision.
5.Diagnosis: calibration inversion
Tại sao filter score ≥ 55 làm giảm mạnh performance? Phân tích theo score band:
| Score band | n | Trigger rate | R1 win | Stop |
|---|---|---|---|---|
| 70+ | 8 | 0.0% | — | — |
| 60 – 70 | 145 | 2.1% | 66.7% | 33.3% |
| 50 – 60 | 471 | 28.9% | 52.9% | 11.0% |
Đây là hiện tượng calibration inversion: score band thấp (50-60) trigger 28.9%, score band cao (70+) trigger 0%. Nguyên nhân cấu trúc: score cao đạt được nhờ zone quality xuất sắc (FVG lớn, fresh, volume mạnh), nhưng những zone này thường đẩy giá đi xa nhanh — không còn "quay về" để retest trong TTL window. Zone score 50-60 thường là zone "gần giá hơn", nên có cơ hội retest cao hơn.
Framework chấm điểm V2 đánh giá quality của zone (strength của đặc trưng cấu trúc) chứ không trực tiếp đo tradeability (liệu giá có quay lại retest và hit target). Filter score ≥ 55 nhầm lẫn hai khái niệm → loại bỏ đúng phần có signal tradable.
6.Production deployment decision
Quyết định: Deploy V2 raw (không filter gate), thêm badge ★ GOLDEN cho 3 phase × zone setup precision cao nhất:
- accumulation × demand — 75% R1 win, 0% stop (n=42)
- markup × demand — 51.8% R1 win (n=293)
- markdown × supply — 48.7% R1 win (n=106)
User có thể tự focus visual trên golden bucket qua badge + filter chip mà không mất signal volume toàn bộ. Non-golden bucket vẫn emit, user tự quyết định có follow hay không.
Code changes production
Replace from scoring import score_zone by from scoring import score_zone_v2 as score_zone. Add imports compute_momentum_series, detect_weekly_zones, compute_market_roc_series. Pass optional args vào call. Output thêm field is_golden_bucket: bool, score_version: "v2", và score_breakdown.{momentum, mtf, market_rs}.
Panel title có tag V2. Filter chip mới ★ Golden (1-click lọc). Mỗi hàng golden có badge ★ GOLDEN bên cạnh tên mã, viền vàng đậm để nổi bật. Panel description note kỳ vọng 32 trigger/năm, ~12% gross equity.
7.Output hôm nay 2026-04-22 (V2 live)
Scanner run V2 scoring → 20 alerts trên 467 mã, 10 golden bucket:
| Mã | Phase | Zone | Giá | Zone range | FVG (ATR) | Score |
|---|---|---|---|---|---|---|
| ASM | markdown | supply | 5.70 | 6.00–6.10 | 1.70 | 63.5 |
| HDC | markdown | supply | 18.50 | 21.25–21.45 | 1.15 | 62.6 |
| TSA | markup | demand | 15.50 | 13.50–13.90 | 1.61 | 61.8 |
| TLD | markup | demand | 8.33 | 7.80–8.01 | 1.33 | 60.6 |
| CDC | markup | demand | 18.50 | 15.68–16.02 | 1.23 | 60.4 |
| GIL | markdown | supply | 13.55 | 15.05–15.90 | 1.44 | 60.1 |
| L14 | markdown | supply | 23.70 | 26.00–26.10 | 1.17 | 59.4 |
| E1VFVN30 | markup | demand | 35.43 | 32.42–32.70 | 1.50 | 57.3 |
| BMI | markdown | supply | 15.50 | 17.00–17.80 | 0.93 | 57.0 |
| ROS | markdown | supply | 2.51 | 2.75–2.89 | 0.78 | 55.2 |
Non-golden (10 mã): S99, VCG, ITC, VGR, ADS, DPM (unclear × demand), LHG, SCS, TAL, ABW (unclear × supply). Score 55-58.5. User có thể xem non-golden nhưng hiểu precision lower.
8.Giới hạn & next steps
- Sample size cho 70+ score band quá nhỏ (n=8 trên V2). Không thể kết luận chắc chắn calibration inversion không do noise — cần thêm data hoặc synthetic walk-forward với parameter sweep.
- R-unit assumption (1R ≈ 4% giá, 10% position) là giả định để compute gross equity. Thực tế phụ thuộc ATR tại entry, có thể khác symbol-by-symbol.
- TTL window cố định theo signal type/phase — có thể optimize thêm (zone supply markdown nên có TTL dài hơn demand unclear).
- Portfolio-level constraints chưa test: max concurrent positions, correlation giữa các mã trigger cùng lúc, cash management.
- Calibration fix đề xuất: thêm
reachabilitycomponent cho score — đo khoảng cách zone đến giá hiện tại theo ATR units. Zone quá xa (≥ 5 ATR) should downgrade. Đây là iteration tiếp theo. - Forward testing bắt buộc: track live scanner output 3-6 tháng với journal, so sánh với backtest metrics. Nếu drift > 10pp, re-calibrate.
Tài liệu tham khảo
- Wyckoff, R. (1911). Studies in Tape Reading.
- Williams, T. (2005). Master the Markets — Volume Spread Analysis.
- Internal:
quant/ops/research/smc_scanner/scoring.py—score_zone(V1) +score_zone_v2(V2 implementation). - Internal:
quant/ops/research/smc_scanner/historical_replay.py— walk-forward replay script. - Internal:
quant/ops/research/smc_scanner/verify_v2_filters.py— 9 filter variants test. - Internal:
quant/reports/signal_feed/historical_replay/v2_production_comparison.json— structured data.
Câu hỏi đi sâu chủ đề này
Tại sao filter "score≥55 + FVG≥1.0 + golden bucket" lại làm giảm hiệu suất 90% cho SMC V2, và điều này có liên quan gì đến đặc thù TTCK Việt Nam?
Vấn đề nằm ở "calibration inversion". Bộ lọc này được xây dựng dựa trên giả định rằng các tín hiệu có chất lượng cao (điểm cao, FVG mạnh, nằm trong 'golden bucket') sẽ cho hiệu suất tốt hơn. Tuy nhiên, dữ liệu backtest trên 467 mã Việt Nam giai đoạn 2022-2026 cho thấy điều ngược lại. Các vùng cung/cầu (zone) quá chất lượng thường có mức độ phản ứng mạnh, khiến giá bật ra xa khỏi vùng đó ngay lập tức và không có nhịp retest lại trong Time-To-Live (TTL) cho phép. Điều này dẫn đến tỷ lệ kích hoạt tín hiệu (trigger rate) cực thấp (ví dụ, band 70+ có trigger rate 0%). Trên TTCK Việt Nam, với biên độ giao dịch ±7% và thanh khoản có thể đột biến, những nhịp tăng/giảm mạnh liên tục (như mã VIX hay SSI trong các phiên tăng trần) khiến giá không quay lại test vùng đã tạo ra trước đó. Do đó, dù mỗi trade có thể chất lượng, nhưng số lượng trade quá ít làm giảm đáng kể tổng lợi nhuận R/năm, từ 29.8 xuống chỉ còn 3.0.
Với tốc độ khớp lệnh và thanh khoản biến động trên HOSE/HNX, làm thế nào để một hệ thống định lượng như SMC V2 có thể xử lý việc đặt và khớp lệnh hiệu quả, tránh trượt giá (slippage) quá lớn?
Để giảm thiểu trượt giá, hệ thống định lượng cần kết hợp các chiến lược thực thi lệnh thông minh. Đầu tiên, cần sàng lọc thanh khoản: chỉ giao dịch các mã có khối lượng giao dịch bình quân ngày (ADTV) tối thiểu 500 triệu VND trở lên, như VN30 hoặc các mã Midcap lớn. Đối với các lệnh mua/bán có khối lượng lớn (ví dụ, 100-200 triệu VND), thay vì sử dụng lệnh thị trường (Market Order), hệ thống nên ưu tiên lệnh giới hạn (Limit Order) và chia nhỏ lệnh (iceberg order) trong một khoảng thời gian nhất định, hoặc sử dụng các thuật toán như VWAP (Volume-Weighted Average Price) hay TWAP (Time-Weighted Average Price). Ví dụ, nếu tín hiệu mua xuất hiện tại vùng giá 15.000đ cho mã DIG, thay vì đặt lệnh mua 50.000 cổ phiếu một lần, hệ thống sẽ đặt 5 lệnh mỗi lệnh 10.000 cổ phiếu ở các mức giá 15.050đ, 15.000đ, 14.950đ trong khoảng 15-30 phút. Điều này giúp hệ thống chờ đợi thanh khoản đủ tốt tại các mức giá mong muốn, đặc biệt với đặc thù T+2.5 trên HOSE.
Khung chấm điểm SMC V2 của P.Thai Capital có điểm gì khác biệt hoặc vượt trội so với các mô hình định lượng sử dụng đa yếu tố (multi-factor models) thông thường trên TTCK Việt Nam?
SMC V2 của P.Thai Capital tập trung vào phân tích cấu trúc thị trường vi mô (microstructure) và dòng tiền thông minh, dựa trên các khái niệm như Fair Value Gap (FVG), Order Block và vùng cung/cầu. Mô hình này cố gắng xác định dấu vết của các nhà tạo lập thị trường và tổ chức lớn, từ đó dự đoán các điểm đảo chiều hoặc tiếp diễn xu hướng tiềm năng. Điều này khác biệt đáng kể so với các mô hình đa yếu tố truyền thống thường dựa vào các yếu tố vĩ mô, cơ bản (P/E, P/B, ROE) và kỹ thuật (Momentum, Value, Size, Beta) để xây dựng portfolio.
Ưu điểm của SMC V2 là khả năng thích ứng linh hoạt với các biến động ngắn hạn và trung hạn của thị trường, phát hiện các điểm vào/ra lệnh chính xác hơn theo từng nhịp sóng. Ví dụ, trong khi một mô hình đa yếu tố có thể chọn mã có chỉ số tăng trưởng tốt, SMC V2 sẽ tìm kiếm điểm vào tối ưu khi giá của mã đó retest một Order Block hoặc FVG sau một nhịp tăng mạnh. Điều này mang lại lợi thế về thời điểm (timing) giao dịch, đặc biệt quan trọng trên TTCK Việt Nam với mức biến động lớn.
Ngoài các tín hiệu "GOLDEN" đã được xác định, trong những trường hợp nào nhà đầu tư không nên phụ thuộc hoàn toàn vào tín hiệu từ SMC V2 trên TTCK Việt Nam, đặc biệt với cổ phiếu nhỏ/vừa?
Nhà đầu tư không nên phụ thuộc hoàn toàn vào SMC V2 trong một số điều kiện thị trường nhất định, đặc biệt với cổ phiếu nhỏ và vừa (penny/small-cap). 1. Thị trường thanh khoản thấp hoặc bị thao túng: Các mã UPCOM hoặc những mã có vốn hóa nhỏ, thanh khoản trung bình dưới 50-100 triệu VND/ngày rất dễ bị làm giá. Cấu trúc giá và khối lượng (FVG, Order Block) có thể bị giả mạo hoặc tạo ra một cách nhân tạo, khiến tín hiệu SMC V2 không còn đáng tin cậy. Ví dụ, một số cổ phiếu như HCD hay ROS (trước đây) có thể có các nhịp tăng/giảm trần sàn liên tục không theo quy luật thông thường. 2. Giai đoạn biến động cực đoan do tin tức: Khi thị trường chịu ảnh hưởng mạnh bởi các sự kiện vĩ mô lớn (ví dụ, thông tin chính sách, khủng hoảng kinh tế toàn cầu, hoặc biến động bất ngờ của VN-Index 50-100 điểm), mọi phương pháp phân tích kỹ thuật hay định lượng đều có thể bị phá vỡ. 3. Thiếu confluence (hợp lưu) từ các yếu tố khác: Dù SMC V2 đã tích hợp nhiều yếu tố, việc kết hợp với các chỉ báo định lượng hoặc phân tích vĩ mô khác có thể tăng cường độ tin cậy. Nếu tín hiệu SMC V2 xuất hiện nhưng không có sự xác nhận từ khối lượng lớn bất thường hoặc các yếu tố vĩ mô/ngành thuận lợi, nhà đầu tư nên cẩn trọng. Việc kết hợp với quản trị rủi ro chặt chẽ và kinh nghiệm thị trường luôn là yếu tố then chốt.
Nội dung bài viết được biên soạn dựa trên dữ liệu công khai từ các nguồn trên + kinh nghiệm thực chiến của tác giả. Tham khảo trực tiếp tại nguồn để kiểm chứng.
P.Thai Capital