Một swing có hai mốc thời gian: lúc đỉnh/đáy hình thành và lúc nó được xác nhận. Khoảng cách là 5 phút ở khung 1 phút, 15 phút ở khung 5 phút, 30 phút ở khung 15 phút. Backtest chỉ được dùng swing từ mốc xác nhận trở đi.
Định nghĩa đầy đủ
Độ trễ xác nhận swing là khoảng thời gian từ nến tạo đỉnh hoặc đáy đến lúc đủ số nến bên phải để xác nhận nó. Trong khoảng đó swing chưa tồn tại với người quan sát thời gian thực. Dùng swing trước mốc xác nhận trong backtest là một dạng look-ahead bias.
Lưu ý rủi ro: Nội dung mang tính giáo dục về phương pháp kiểm định, không phải tư vấn đầu tư và không trình bày kết quả của chiến lược nào. Hợp đồng tương lai dùng đòn bẩy nên lãi và lỗ đều bị khuếch đại; kết quả backtest không đảm bảo kết quả giao dịch thật.
Những điều cần nhớ
- Độ trễ tối thiểu = số nến bên phải × độ dài khung: 5, 15, 30 phút cho khung 1, 5, 15 phút
- Mỗi swing trong dữ liệu Stockup có
pivot_timevàconfirmed_atriêng - Đáy 1.888,5 lúc 14:15 ngày 01/10/2026 chỉ được xác nhận lúc 09:05 ngày 02/10
- Truy vấn từng ngày 01/10 và 02/10 cho 8 + 6 swing; truy vấn gộp hai ngày cho 15
- Swing chưa xác nhận không được trả ở tầng dữ liệu công khai
Dữ liệu tính đến phiên 02/10/2026, phiên bản tính toán ms-v2, đã đối soát cuối ngày.
Hai mốc thời gian của một swing
Theo định nghĩa swing high, swing low, một nến chỉ trở thành đỉnh khi các nến sau nó không vượt qua. Vì vậy mỗi swing mang hai mốc thời gian:
- Thời điểm hình thành (
pivot_time): nến chứa giá cao nhất hoặc thấp nhất. Đây là nơi chấm tròn được vẽ trên biểu đồ. - Thời điểm xác nhận (
confirmed_at): lúc nến bên phải cuối cùng đóng cửa. Đây là lúc sớm nhất một người quan sát thời gian thực biết swing tồn tại.
Khoảng cách tối thiểu giữa hai mốc phụ thuộc cửa sổ nến của từng khung — xem bài tham số xác định swing theo khung thời gian. Khung 5 phút dùng 3 nến bên phải nên trễ ít nhất 15 phút; khung 1 giờ dùng 2 nến nên trễ ít nhất 2 giờ giao dịch.
Chữ "tối thiểu" quan trọng. Độ trễ thực tế dài hơn khi giữa hai mốc có giờ nghỉ trưa hoặc qua đêm, vì nến bên phải phải là nến có giao dịch.
Ví dụ trên VN30F1M phiên 01/10/2026
Biểu đồ dưới gộp hai phiên 01/10 và 02/10/2026 của VN30F1M khung 5 phút, hợp đồng 41I1GA000. Bảng bên dưới biểu đồ có cả hai cột thời gian.
VN30F1M khung 5 phút, 01–02/10/2026 — thời điểm hình thành và thời điểm xác nhận
| Đỉnh/đáy | Giá | Nhãn | Xác nhận lúc |
|---|---|---|---|
| 09:00 01/10 | 1.905,4 | LL — Đáy thấp hơn | 09:20 01/10 |
| 09:30 01/10 | 1.911,5 | LH — Đỉnh thấp hơn | 09:50 01/10 |
| 09:40 01/10 | 1.901,6 | LL — Đáy thấp hơn | 10:00 01/10 |
| 10:20 01/10 | 1.915 | HH — Đỉnh cao hơn | 10:40 01/10 |
| 10:35 01/10 | 1.909,1 | HL — Đáy cao hơn | 10:55 01/10 |
| 10:50 01/10 | 1.914,3 | LH — Đỉnh thấp hơn | 11:10 01/10 |
| 11:20 01/10 | 1.906,6 | LL — Đáy thấp hơn | 13:10 01/10 |
| 13:00 01/10 | 1.913,4 | LH — Đỉnh thấp hơn | 13:20 01/10 |
| 14:15 01/10 | 1.888,5 | LL — Đáy thấp hơn | 09:05 02/10 |
| 09:10 02/10 | 1.899,4 | LH — Đỉnh thấp hơn | 09:30 02/10 |
| 10:05 02/10 | 1.881,3 | LL — Đáy thấp hơn | 10:25 02/10 |
| 10:10 02/10 | 1.888,7 | LH — Đỉnh thấp hơn | 10:30 02/10 |
| 11:00 02/10 | 1.880,1 | LL — Đáy thấp hơn | 11:20 02/10 |
| 13:20 02/10 | 1.896,6 | HH — Đỉnh cao hơn | 13:40 02/10 |
| 14:05 02/10 | 1.874,8 | LL — Đáy thấp hơn | 14:25 02/10 |
Đỉnh/đáy chỉ được xác nhận sau 3 nến 5 phút — swing gần nhất luôn hiện trễ so với giá.
Dữ liệu: VN30F1M · 5m · phiên 01/10–02/10/2026 · ms-v2 · final
Ba dòng đáng đọc kỹ trong bảng:
- Đáy 1.901,6 lúc 09:40 ngày 01/10, xác nhận lúc 10:00. Đây là trường hợp chuẩn: trễ 20 phút, gồm nến chứa đáy và ba nến bên phải.
- Đáy 1.906,6 lúc 11:20 ngày 01/10, xác nhận lúc 13:10. Ba nến bên phải là 11:25, 13:00 và 13:05; giờ nghỉ trưa nằm giữa nên độ trễ theo đồng hồ gần hai tiếng.
- Đáy 1.888,5 lúc 14:15 ngày 01/10, xác nhận lúc 09:05 ngày 02/10. Sau nến 14:15 phiên chỉ còn hai nến, chưa đủ ba. Swing chỉ được xác nhận khi nến đầu tiên của phiên hôm sau đóng cửa.
Trong cả ba trường hợp, giá tại thời điểm xác nhận đã khác xa giá tại đáy. Người quan sát thời gian thực không có cách nào biết 1.888,5 là đáy vào chiều ngày 01/10.
Swing cuối phiên được xác nhận vào hôm sau
Trường hợp thứ ba ở trên tạo ra một hệ quả dễ gây nhầm khi lấy dữ liệu theo từng ngày:
- Truy vấn riêng phiên 01/10/2026 trả 8 swing.
- Truy vấn riêng phiên 02/10/2026 trả 6 swing.
- Truy vấn gộp hai phiên trả 15 swing.
8 cộng 6 bằng 14, không phải 15. Swing bị "rơi" chính là đáy 1.888,5: tại giờ đóng cửa ngày 01/10 nó chưa được xác nhận nên không có trong kết quả của ngày 01/10; sang ngày 02/10 nó đã được xác nhận nhưng nến tạo đáy lại nằm ngoài ngày 02/10.
Đây không phải lỗi mà là hệ quả trực tiếp của nguyên tắc "chỉ trả điều đã biết tại thời điểm hỏi". Với người làm dữ liệu, bài học là: muốn có đủ swing của nhiều ngày, hãy lấy một cửa sổ liền, đừng ghép từng ngày.
Chỉ số VN30: cùng hiện tượng ở khung 15 phút
Chỉ số VN30 khung 15 phút, 01–02/10/2026 — thời điểm hình thành và thời điểm xác nhận
| Đỉnh/đáy | Giá | Nhãn | Xác nhận lúc |
|---|---|---|---|
| 09:45 01/10 | 1.897,8 | LL — Đáy thấp hơn | 10:30 01/10 |
| 10:15 01/10 | 1.909,8 | LH — Đỉnh thấp hơn | 11:00 01/10 |
| 14:15 01/10 | 1.885,8 | LL — Đáy thấp hơn | 10:00 02/10 |
| 09:15 02/10 | 1.896 | LH — Đỉnh thấp hơn | 10:00 02/10 |
| 10:00 02/10 | 1.876,2 | LL — Đáy thấp hơn | 10:45 02/10 |
| 11:00 02/10 | 1.872,8 | LL — Đáy thấp hơn | 13:15 02/10 |
| 13:15 02/10 | 1.890,8 | LH — Đỉnh thấp hơn | 14:00 02/10 |
Đỉnh/đáy chỉ được xác nhận sau 2 nến 15 phút — swing gần nhất luôn hiện trễ so với giá.
Dữ liệu: VN30 · 15m · phiên 01/10–02/10/2026 · ms-v2 · final
Chỉ số VN30 cho thấy cùng hiện tượng với độ trễ dài hơn. Đáy 1.885,81 hình thành ở nến 14:15 ngày 01/10 và được xác nhận lúc 10:00 ngày 02/10. Đáy 1.872,83 hình thành lúc 11:00 ngày 02/10, xác nhận lúc 13:15 sau giờ nghỉ trưa. Khung càng lớn, khoảng trống giữa "đã xảy ra" và "đã biết" càng rộng.
Quy tắc dùng swing trong backtest
Mọi đại lượng suy ra từ swing đều thừa hưởng độ trễ của swing: nhãn đỉnh đáy, trạng thái cấu trúc thị trường, vùng giá hình thành từ đỉnh đáy. Bốn quy tắc sau giữ cho kiểm định không nhìn trước:
- Tín hiệu chỉ được phát sinh từ
confirmed_at. Một điều kiện kiểu "khi có đáy mới" chỉ đúng từ mốc xác nhận, không phải từ nến tạo đáy. - Giá khớp giả lập lấy sau mốc xác nhận. Không dùng giá của swing làm giá khớp; tại lúc xác nhận, giá thị trường đã ở chỗ khác.
- Không dùng công cụ vẽ lại. Các chỉ báo kiểu zigzag điều chỉnh điểm cuối khi giá đi tiếp; chuỗi lịch sử của chúng không phản ánh điều đã biết tại từng thời điểm.
- Lấy dữ liệu theo cửa sổ liền để không mất swing xác nhận qua đêm.
Ví dụ minh họa: đáy hình thành lúc 10:00 trên khung 5 phút và xác nhận lúc 10:20, sau khi nến 10:15 đóng. Quy tắc "hành động khi có đáy mới" chỉ có thể kích hoạt từ 10:20, tại giá của 10:20. Nếu backtest ghi nhận giao dịch ở giá đáy lúc 10:00, mỗi giao dịch được cộng thêm một khoản lợi thế không tồn tại.
Nguyên lý chung của loại sai lệch này được trình bày trong bài thuật ngữ look-ahead bias trong tín hiệu giao dịch và bài nghiên cứu look-ahead bias trong tín hiệu giao dịch khi backtest.
Dấu hiệu backtest đang nhìn trước
- Giao dịch giả lập mở đúng tại giá của đỉnh hoặc đáy.
- Kết quả tốt lên rõ rệt khi tăng cửa sổ xác nhận — cửa sổ rộng hơn cho swing "đẹp" hơn nhưng lẽ ra phải đến muộn hơn.
- Kết quả thay đổi khi chạy lại trên cùng dữ liệu sau khi có thêm nến mới.
- Đường vốn trên dữ liệu lịch sử mượt hơn hẳn giai đoạn chạy thử trên dữ liệu mới.
Các giới hạn chung của kiểm định đơn giản được tóm tắt trong bài backtest đơn giản.
Câu hỏi thường gặp
Độ trễ xác nhận swing là gì?
Là khoảng thời gian từ lúc một đỉnh hoặc đáy hình thành đến lúc đủ số nến bên phải để xác nhận nó. Ở khung 5 phút với cửa sổ 3 nến, độ trễ tối thiểu là 15 phút. Trong khoảng đó, không ai quan sát thời gian thực có thể biết điểm vừa rồi là một swing.
Vì sao dùng swing tại thời điểm pivot là look-ahead?
Vì tại thời điểm pivot, thông tin "đây là đỉnh" chưa tồn tại; nó chỉ có sau khi các nến kế tiếp đóng cửa. Backtest dùng swing ngay tại nến tạo đỉnh đáy tức là dùng dữ liệu của tương lai để ra quyết định trong quá khứ. Kết quả thu được không thể lặp lại khi giao dịch thật.
Độ trễ ở từng khung là bao lâu?
Độ trễ tối thiểu bằng số nến bên phải nhân độ dài khung: 5 phút ở khung 1 phút, 15 phút ở khung 5 phút, 30 phút ở khung 15 phút, 60 phút ở khung 30 phút và 2 giờ giao dịch ở khung 1 giờ. Độ trễ thực tế dài hơn khi có giờ nghỉ trưa hoặc qua đêm xen giữa.
Swing cuối phiên được xử lý thế nào?
Nếu sau nến tạo đỉnh đáy không còn đủ nến trong phiên, swing chờ sang phiên kế tiếp của cùng hợp đồng để được xác nhận. Đáy 1.888,5 của VN30F1M lúc 14:15 ngày 01/10/2026 được xác nhận lúc 09:05 ngày 02/10. Lấy dữ liệu từng ngày riêng lẻ sẽ bỏ sót những swing như vậy.
Làm sao kiểm tra backtest có nhìn trước swing không?
Lấy vài giao dịch giả lập, đối chiếu thời điểm phát sinh tín hiệu với mốc xác nhận của swing liên quan. Tín hiệu sớm hơn mốc xác nhận là dấu hiệu nhìn trước. Một phép thử khác là cắt bỏ dữ liệu sau một thời điểm rồi chạy lại: tín hiệu trước thời điểm đó không được thay đổi.
Nguồn tham khảo
- HNX – Hợp đồng tương lai chỉ số VN30: đặc tả hợp đồng và thời gian giao dịch – hnx.vn – truy cập 04/10/2026
- HOSE – Quy tắc xây dựng và quản lý chỉ số HOSE-Index (chỉ số VN30) – hsx.vn – truy cập 04/10/2026
- Dữ liệu thị trường: Stockup Market Structure, phiên bản
ms-v2, dữ liệu đã đối soát cuối ngày
Số nến xác nhận của từng khung là tham số của phiên bản ms-v2, được rà soát định kỳ 6 tháng.
Lưu ý rủi ro: Bài viết trình bày phương pháp kiểm định và mô tả dữ liệu đã xảy ra, không ngụ ý chiến lược nào có lãi. Chứng khoán phái sinh dùng đòn bẩy — lãi và lỗ đều được khuếch đại.
Khoảng trễ vài nến là nơi backtest hay tự lừa mình — đăng ký bản tin Stockup để nhận các bài kiểm định có dữ liệu point-in-time.
