Mục lục
Trả lời ngắn: Forward Test là việc áp một protocol đã khóa tại thời điểm T0 lên dữ liệu chỉ xuất hiện sau T0, rồi ghi kết quả ngay khi mỗi observation đến. Nó giảm việc chọn mẫu bằng hindsight, nhưng vẫn chỉ là phép quan sát hoặc mô phỏng, không phải live trading hay bằng chứng chắc chắn về tương lai.
Đọc xong, bạn sẽ hiểu:
- Cách khóa T0, quota, cutoff và rule version trước khi dữ liệu mới tới.
- Cách ghi bốn candidate F01–F04 mà không backfill khi offline.
- Cách đóng batch v1 và mở v2 nếu cần đổi rule.
Lưu ý giáo dục: Toàn bộ timestamp, giá và candidate trong bài là dữ liệu hư cấu. Bài chỉ dùng observation log, không có broker, paper order hoặc tiền thật.
1. Forward Test dùng dữ liệu đến sau T0
Hãy tưởng tượng bạn niêm phong đề bài, đóng dấu thời gian rồi mới nhận từng lá thư trả lời. Mọi câu hỏi được viết trước dấu niêm phong. Khi thư đến, bạn chỉ được ghi câu trả lời; không được mở đề, sửa câu hỏi rồi chấm lại thư cũ.
T0, hay freeze timestamp, là ranh giới đó. Trước T0, ta được thiết kế setup, chọn nguồn và viết stop rule. Sau T0, batch chuyển sang prospective, nghĩa là ghi nhận khi dữ liệu mới đến thay vì dựng lại về sau.
TradingView định nghĩa forward testing là tái tạo hoạt động strategy theo realtime trong lúc chart cập nhật dữ liệu. Bài này mượn phần “data arrives after freeze” nhưng không dùng Pine Script hoặc order. TradingView — Strategies, backtesting and forward testing
Forward Test khác ba việc:
- Backtest: áp rule lên historical data đã tồn tại.
- Walk-forward historical: chia dữ liệu quá khứ thành các cửa sổ tuần tự để fit/test; hữu ích nhưng vẫn là phương pháp lịch sử.
- Live trading: có capital, execution và financial risk thật; bài không làm việc này.
CFA Institute gọi rolling-window/walk-forward là một proxy cho actual investing và lưu ý lịch sử không thể chứa hết bất định tương lai. CFA Institute — Backtesting & Simulation
Câu chắc chắn sai là: “Chưa dùng đoạn dữ liệu này bao giờ nên mở nó hôm nay vẫn là forward test.” Nếu dữ liệu đã xảy ra trước lúc protocol khóa, nó vẫn là historical data. Câu có điều kiện đúng hơn: “Mọi candidate trong batch có timestamp sau T0 và được ghi khi đến theo version đã khóa.”
Suy luận cũng sai nếu người làm sửa rule sau candidate F01 nhưng giữ cùng version. Dữ liệu mới không tự chữa một protocol đang drift.
2. Forward Test Freeze Gate bảy ô
Hình 1 — T0 khóa phần thiết kế; phía sau cổng chỉ còn new data, record-on-arrival và stop rule.
Freeze Gate gồm bảy ô.
a. Freeze timestamp
Ghi T0 có date, time và timezone. Candidate timestamp phải lớn hơn T0, không chỉ khác ngày trên màn hình.
b. Setup version
Ghi ID/version của candidate selector, invalid, valid, expiry và event order. Demo dùng INV-DEMO-M15-v1.
c. Data contract
Khóa source, symbol, standard completed M15 closes và UTC. Nếu source delayed, ghi trạng thái delay vào arrival snapshot; không giả định realtime.
Arrival snapshot là bản dữ liệu được lưu khi nó đến. Historical vendor data có thể thay đổi sau reload hoặc correction; TradingView cũng lưu ý historical và realtime-collected data có thể khác. TradingView — I believe strategy results are wrong
d. Candidate selector
Viết điều kiện phát hiện candidate trước T0. Demo cung cấp selector hư cấu và chỉ tập trung state transition; nó không chứng minh chất lượng selector.
e. Observation rules
Khóa owner bar, observation window và thứ tự data → invalid → valid → expiry. Open M15 bar không được thay completed close.
f. Quota và cutoff
Quota là số candidate tối đa. Cutoff là thời điểm kết thúc. Batch dừng khi điều kiện nào tới trước, tránh kéo dài tới lúc tally đẹp.
g. Missing/offline rule
Viết rõ mất kết nối, bar thiếu hoặc source mismatch sẽ trả UNAVAILABLE. No backfill nghĩa là không mở historical chart sau này để giả vờ mình đã quan sát bar lúc nó đến.
Mở một prospective log bên ngoài platform trước T0. Mỗi completed bar phải được ghi trước bar kế, gồm arrival time, event time, close, state và exception.
3. Demo FT-DEMO-M15-v1
Freeze Gate:
- T0
2026-03-01 00:00 UTC; - window từ
2026-03-02tới2026-03-11 23:59 UTC; - stop tại first
4eligible candidates hoặc cutoff, điều kiện nào đến trước; - completed M15 close
<100→ invalid; - completed M15 close
>102→ valid; - bar 4 không có event trước → expired;
- missing/offline → unavailable.
a. F01 và F02
F01 mở 2026-03-02 09:00 UTC. Close 101,4 tạo waiting; close 102,2 >102 tạo VALID ở bar 2.
F02 mở 2026-03-04 13:00 UTC. Chuỗi 101,4 → 100,8 → 99,7 tạo INVALID tại bar 3.
b. F03 và F04
F03 mở 2026-03-06 08:00 UTC. Bốn close 101,4 → 101,8 → 101,1 → 101,6 không chạm hai event; bar 4 đóng EXPIRED.
F04 mở 2026-03-08 14:00 UTC. Bar đầu close 101,0; bar kế bị missing vì offline. Record là UNAVAILABLE. Khi dữ liệu lịch sử về sau xuất hiện, không được backfill record prospective này.
Hình 2 — Candidate count đạt bốn tại F04 trước cutoff, nên batch dừng dù F04 unavailable.
Raw ledger:
| Candidate | Open timestamp | Arriving closes | Output |
|---|---|---|---|
| F01 | Mar 2 · 09:00 |
101,4 → 102,2 |
VALID |
| F02 | Mar 4 · 13:00 |
101,4 → 100,8 → 99,7 |
INVALID |
| F03 | Mar 6 · 08:00 |
101,4 → 101,8 → 101,1 → 101,6 |
EXPIRED |
| F04 | Mar 8 · 14:00 |
101,0 → [offline] |
UNAVAILABLE |
Reconciliation:
candidates 4 = records 4 = valid 1 + invalid 1 + expired 1 + unavailable 1
Quota bốn đến trước cutoff nên batch closure có reason QUOTA_REACHED_AT_F04. Đây là raw state ledger, không phải winrate, expectancy, edge hoặc profitability.
4. Sai lầm, giới hạn và rủi ro
a. Gọi một đoạn lịch sử mới là forward
Historical March data mở vào July vẫn thuộc quá khứ, dù người làm chưa nhìn. True prospective timing yêu cầu T0 đứng trước từng candidate.
b. Sửa rule giữa batch
Thêm bar thứ năm sau khi F03 expired là protocol deviation, tức lượt chạy không còn theo contract. Không sửa row cũ hoặc tiếp tục cùng v1.
c. Backfill lúc offline
F04 phải giữ UNAVAILABLE. Reconstruct nó vào ngày sau có thể hữu ích cho nghiên cứu khác, nhưng không thay thế evidence “đã ghi khi đến”.
d. Đọc open bar như completed close
Giá trong M15 bar còn thay đổi. Nếu owner là completed close, state chỉ được đánh sau khi bar hoàn tất. Intrabar alert không được thay contract.
e. Nhầm delayed data với realtime
Nguồn và subscription khác nhau có thể tạo delay. Ghi source status cùng arrival time; không kể delayed feed là event time chính xác.
f. Bỏ candidate do downtime
Xóa unavailable làm sample count biến mất. Quota đếm eligible candidate đã xuất hiện, không chỉ những candidate có output thuận tiện.
g. Batch quá ngắn
Bốn candidate demo chỉ đủ học procedure. Một short calendar window có thể nằm trong một regime duy nhất. Forward timing giảm hindsight nhưng không xóa selection, data, operator hoặc structural-break risk.
h. Đồng nhất observation với actual trading
CFTC cautions rằng simulated/hypothetical performance không phải actual trading và không phản ánh đầy đủ market factors hoặc financial risk. CFTC Letter 01-60 Bài còn hẹp hơn: chỉ log setup states, không mô phỏng execution.
5. Checklist chạy và đóng batch
Trước T0
- Batch ID, version và T0 có timezone?
- Source/symbol/timeframe và candidate selector đã freeze?
- Invalid/valid/expiry/event order đầy đủ?
- Quota/cutoff và missing rule đã ghi?
- Prospective log đã mở, quyền sửa protocol đã khóa?
Khi candidate đến
- Candidate timestamp có
>T0? - Source contract có khớp?
- Completed bar đã lưu arrival snapshot?
- State được ghi trước bar kế?
- Terminal event đã đóng sample?
- Missing/offline có giữ row và reason?
Khi có deviation
Candidate ≤T0 trả PRE_FREEZE_DATA. Contract mismatch dừng sample. Rule-change request đóng v1 với STOPPED_RULE_CHANGE.
Hình 3 — Version fork giữ nguyên evidence cũ thay vì áp rule mới ngược về quá khứ.
Version fork là tạo protocol v2, T0 mới và future-only candidates. Không copy F01–F04 sang v2 như thể chúng chưa từng được thấy.
Khi quota hoặc cutoff tới
Đóng batch, ghi close reason và reconciliation. Candidate tới sau stop nằm ngoài batch. Lưu raw log, deviations và source metadata trước khi viết nhận xét.
6. Bài tập 15 phút
Dùng giấy, Google Sheets hoặc LibreOffice Calc. Không cần live chart; bài tập mô phỏng arrival bằng cách che các hàng.
- Viết Freeze Gate và T0.
- Tạo cột candidate, open time, arrival close, state, exception.
- Che F01–F04.
- Mỗi phút mở một candidate, rồi từng close của nó.
- Ghi trước khi mở dòng kế.
- Dừng khi quota bốn được chạm.
Mẫu đối chiếu đã điền
| Check | Expected |
|---|---|
| Freeze T0 | 2026-03-01 00:00 UTC |
| Stop rule | 4 candidates or Mar 11 cutoff |
| F01 / F02 / F03 / F04 | VALID / INVALID / EXPIRED / UNAVAILABLE |
| Candidates / records | 4 / 4 |
| Historical backfill | 0 |
| Batch close reason | quota reached at F04 |
Kết quả đạt là bốn record giữ đúng thứ tự, F04 vẫn unavailable và batch đóng tại quota. Không tính performance metric từ exercise này.
7. Tổng kết: sau T0 chỉ quan sát và ghi
a. Năm ý chính
- Forward Test dùng dữ liệu đến sau freeze timestamp T0.
- Quota, cutoff, selector và state rules phải khóa trước T0.
- Prospective log ghi mỗi completed observation trước observation kế.
- Missing/offline giữ
UNAVAILABLE; no backfill. - Rule change đóng v1 và tạo version fork với T0 mới.
b. Câu hỏi tự kiểm tra
- Vì sao historical data chưa từng xem vẫn chưa chắc là forward?
- Batch demo đóng vì quota hay cutoff?
- F04 có được backfill vào ngày sau không?
- Muốn đổi expiry sang năm bar thì làm gì?
c. Gợi ý đáp án
Xem gợi ý câu 1
Candidate phải phát sinh sau T0 và được ghi khi đến; “chưa xem” không đổi timestamp của dữ liệu. → Xem mục 1.
Xem gợi ý câu 2
Quota bốn candidate được chạm tại F04 trước cutoff Mar 11. → Xem mục 3.
Xem gợi ý câu 3
Không. Giữ `UNAVAILABLE`; historical reconstruction là nghiên cứu khác. → Xem mục 2 và 4.
Xem gợi ý câu 4
Đóng v1, tạo v2 với T0 mới và chỉ dùng candidate tương lai. → Xem mục 5.
d. Thuật ngữ cần nhớ
| Thuật ngữ | Giải thích ngắn |
|---|---|
| Forward Test | Áp rule khóa lên data tới sau T0. |
| T0 | Thời điểm đóng thiết kế và bắt đầu observation. |
| Prospective log | Log viết khi dữ liệu mới đến. |
| Quota | Số candidate tối đa đã khóa. |
| Cutoff | Thời điểm kết thúc đã khóa. |
| Arrival snapshot | Dữ liệu lưu tại lúc nhận. |
| Protocol deviation | Sự kiện làm run lệch contract. |
| No backfill | Không dựng lại evidence bị bỏ lỡ. |
| Version fork | Version mới với T0 và future candidates mới. |
| Batch closure | Trạng thái đóng cùng reason/reconciliation. |
e. Nguồn tham khảo
- TradingView — Strategies, backtesting and forward testing
- TradingView — I believe strategy results are wrong
- CFA Institute — Backtesting & Simulation
- CFTC Letter 01-60
f. Bài trước và bài tiếp theo
Quay lại Backtest bằng TradingView #12 để ôn Replay Control Card. Tiếp tục với Trading Journal cho Setup #14 để thiết kế record có thể nối backtest và forward batch.
Nhắc lại: Bài chỉ phục vụ giáo dục. Forward observation không phải actual trading, không phản ánh đầy đủ financial risk và không bảo đảm tương lai.
Bài tiếp theo