Mục lục
Nội dung này phục vụ mục đích giáo dục, không phải lời khuyên đầu tư, khuyến nghị EA hoặc cam kết hiệu quả tương lai.
Trả lời ngắn: Backtest là cho EA chạy lại trên dữ liệu giá quá khứ với một bộ tham số và giả định chi phí đã chọn. Nó giúp kiểm logic trong dữ liệu đó, nhưng không tái tạo hoàn hảo thị trường thật và có thể cho kết quả đẹp vì tham số đã bị chọn quá sát quá khứ.
Đọc xong, bạn sẽ hiểu:
- Backtest trả lời được và không trả lời được gì.
- Test passport cần metadata nào.
- Development data khác holdout ra sao.
- Cách tạo một run có thể tái tạo.
1. Backtest trả lời một câu hỏi hẹp
a. Replay có assumptions
MetaTrader 5 Strategy Tester chạy EA với initial parameters trên history; optimization chạy nhiều lần với các bộ parameter khác nhau. MetaTrader 5 Help — Strategy Testing
Backtest giống phát lại một trận đấu bằng dữ liệu đã có, nhưng luật phát lại do tester và setup quyết định. Kết quả chỉ có nghĩa khi ta biết:
EA version + Inputs + Data + Tick model + Costs + Initial state
Thiếu một thành phần, người khác khó tái tạo run.
b. Ba câu hỏi hợp lý
Backtest phù hợp để hỏi:
- EA có tuân logic dự kiến trên các case lịch sử không?
- Bug/edge case nào xuất hiện trong log?
- Metrics thay đổi ra sao khi assumptions thay đổi?
Nó không tự trả lời “EA có lời trong tương lai không?”. History chỉ là một sample, còn execution live có latency, spread, slippage, session và server state thay đổi.
Hình 1 — Một report chỉ đọc được khi test passport ghi đủ assumptions tạo ra nó.
c. Verification khác validation
Verification hỏi code có làm đúng rule đã viết. Validation hỏi rule có phù hợp mục tiêu và bối cảnh sử dụng. EA có thể thực thi đúng một strategy yếu. Hoặc strategy hợp lý nhưng code sai.
Run đầu nên ưu tiên verification: event, state, signal, risk block, request/result và log. Đừng nhảy thẳng vào net profit.
d. Một test question phải falsifiable
Câu “EA có tốt không?” quá rộng. Câu tốt phải có điều kiện và expected outcome, chẳng hạn: “Khi spread giả vượt 15, mọi candidate có bị block và log đúng reason không?”. Ta có thể chỉ ra pass/fail.
Viết trước ba phần:
- Given: setup và state đầu.
- When: event hoặc dữ liệu xảy ra.
- Then: decision/log/result mong đợi.
Ví dụ: Given state IDLE, When cùng bar đến hai tick, Then tick thứ hai phải SKIP_DUPLICATE. Nếu result khác, ta có bug hoặc assumption sai. Cách viết này giữ run tập trung, thay vì nhìn curve rồi kể câu chuyện sau.
2. Test passport: hộ chiếu của mỗi run
a. Metadata bắt buộc
Test passport là metadata đủ để nhận diện và tái tạo run:
- EA file/version/commit hoặc hash;
- preset/input values;
- symbol, timeframe, account mode;
- from/to date và timezone;
- tick model/data source;
- spread/commission/swap/cost assumptions;
- deposit/currency/leverage giả;
- tester build và pass ID;
- output report/log checksum.
Tên ảnh “best run” không phải passport.
b. Tick model ảnh hưởng đường đi
Tick model là cách tester cung cấp chuyển động giá trong bar. Mô hình “Every tick based on real ticks”, generated ticks hoặc open prices có độ chi tiết khác. EA phụ thuộc intrabar, pending order hoặc trailing có thể nhạy với đường tick.
MetaTrader 5 giải thích real/generated ticks và lưu ý trade operation dùng Bid/Ask dù chart có thể dựa trên Last. MetaTrader 5 Help — Real and Generated Ticks
Không so hai report khác tick model như cùng thí nghiệm.
c. Costs và initial state
Một strategy gross positive có thể net yếu sau spread/commission/swap/slippage assumption. Costs phải ghi rõ, không để mặc định bí mật.
Initial deposit/leverage không chỉ đổi con số đầu. Nó có thể tác động margin, volume rule và stop-out behavior. Tất cả số trong bài là demo; không có mức deposit/leverage khuyến nghị.
3. Workflow fixed run rồi holdout
a. Khóa baseline
Chọn EA v1, preset v1 và window 2022 giả. Lưu passport trước run. Không đổi input giữa chừng.
Run A mục tiêu logic:
- ba case signal false phải
WAIT; - spread vượt rule phải
BLOCK; - rejected request không tạo position state;
- restart simulation phải
SAFE.
Đối chiếu log trước report. Nếu logic sai, profit metric không cứu được run.
b. Development và holdout
In-sample/development data là phần được dùng để phát triển hoặc chọn rule. Holdout là phần giữ ngoài quá trình chọn, chỉ mở khi design đã khóa.
Hình 2 — Holdout chỉ còn ý nghĩa khi nó không bị dùng lặp để chọn rule.
Ví dụ 2022 development, 2023 holdout. Nếu xem 2023, chỉnh input rồi chạy lại tới khi đẹp, 2023 đã trở thành development. Cần holdout mới hoặc thừa nhận evidence yếu hơn.
c. Reproducibility
Reproducibility là khả năng chạy lại cùng passport và thu bằng chứng tương đương. Hash report có thể khác vì timestamp, nhưng trades/metrics/log decision phải giải thích được.
Nếu cùng setup cho result khác:
- data/build có drift?
- random seed?
- external dependency?
- hidden state/cache?
Không gộp các run khác nhau rồi lấy trung bình trước khi tìm nguyên nhân.
d. Stress test thay một assumption
Sau baseline và holdout, thay một assumption có chủ đích: costs cao hơn, spread regime khác hoặc delay giả. Giữ input strategy cố định. Mục tiêu không phải tìm stress setting đẹp nhất mà xem behavior có gãy đột ngột không.
Ví dụ net result đổi dấu chỉ vì commission tăng nhẹ. Kết luận đúng là strategy nhạy với cost assumption; không phải quay lại giảm commission trong tester. Nếu thay đồng thời tick model, cost và inputs, ta mất khả năng quy nguyên nhân.
4. Sai lầm, giới hạn và rủi ro
a. Look-ahead và data leakage
Look-ahead bias xảy ra khi decision dùng thông tin chưa tồn tại tại thời điểm mô phỏng. Ví dụ dùng giá đóng của bar hiện tại trước khi bar đóng.
Data leakage rộng hơn: thông tin holdout/future lọt vào feature, normalization, parameter selection hoặc rule.
Test có thể chạy không lỗi và curve rất đẹp dù leakage tồn tại.
b. Survivorship và data quality
Survivorship bias là chỉ giữ những symbol/tài sản còn tồn tại, bỏ các trường hợp biến mất. Với một symbol CFD, vấn đề khác gồm lịch sử thiếu, session/contract thay đổi, rollover và symbol specification drift.
Data sạch không phải mặc định. Ghi missing intervals, timezone, DST và property assumptions.
c. Optimization và overfitting
Chạy hàng nghìn parameter rồi chọn best làm tăng xác suất chọn nhiễu. Overfitting là khớp quá mức development data.
Câu chắc chắn: optimization tìm bộ tốt theo criterion và sample đã chọn.
Câu có điều kiện: nếu có holdout, robustness, cost stress và giới hạn search, ta có thể tăng độ tin cậy — vẫn không có guarantee live.
Nếu trước đây bạn nghĩ “nhiều pass = khoa học hơn”, cần sửa: search rộng không thay validation.
d. Report không kể toàn bộ câu chuyện
Testing report có graph, trades/deals và statistics. MetaTrader 5 Help — Testing Report
Nhưng report aggregate có thể che:
- một giai đoạn tạo phần lớn profit;
- drawdown kéo dài;
- vài trade outlier;
- lỗi request trong journal;
- cost sensitivity.
Phải đọc report + trades + journal/log.
e. Metrics cần context và uncertainty
Total profit không cho biết đường đi. Win rate không cho biết payoff. Profit factor không cho biết số trade hay concentration. Drawdown phần trăm cần đi cùng cách tính, duration và recovery.
Với 12 trade, một outlier có thể chi phối report. Với 1.200 trade, data quality/cost accumulation lại quan trọng. Không có metric đơn nào đại diện “chất lượng EA”. Bài #11 sẽ tách return, risk, stability, execution và robustness thành scorecard.
Một cách thực tế là ghi phạm vi thay vì chữ “ổn”: 48/50 expected logic cases pass, 2 case fail vì DATA_STALE. Dữ kiện này actionable hơn một rating chung.
5. Checklist và paper lab 15 phút
a. Checklist trước run
- Viết test question.
- Khóa EA/preset version.
- Chọn window và vai trò development/holdout.
- Ghi symbol/timeframe/tick model.
- Ghi costs/initial state.
- Đặt expected logic cases.
- Chạy fixed input.
- Review log/trades rồi metrics.
- Lưu report/passport/hash.
- Không tune trên holdout.
Nếu thiếu data source, cost hoặc version: dừng, không so report.
b. Bài tập 10–15 phút
Dùng Sheets/giấy; không terminal/account/tiền thật.
Mẫu đối chiếu đã điền
| Run | Window | Inputs | Costs | Purpose | Decision |
|---|---|---|---|---|---|
| A | 2022 | Baseline v1 | fixed demo | logic check | compare logs |
| B | 2023 | Baseline v1 | fixed demo | holdout | untouched |
| C | 2023 | tuned on 2023 | fixed demo | invalid holdout | reject |
Hình 3 — Mỗi bậc trả lời một câu hỏi khác; không nhảy từ compile sang live.
Khoanh Run C. Nó không phải holdout vì input đã tuned trên 2023. Viết lại C là “development extension”. Kết quả mong đợi là phân loại evidence đúng, không phải tìm run đẹp.
c. Điểm dừng
Dừng nếu report không tái tạo, holdout đã bị dùng để tune, log không có decision ID hoặc costs chưa rõ. Backtest chưa đủ không được bù bằng demo nhỏ tùy tiện.
6. Tổng kết
a. Năm ý chính
- Backtest là replay lịch sử có assumptions.
- Test passport làm run có thể tái tạo.
- Tick model/cost/data window đổi ý nghĩa report.
- Holdout mất giá trị khi dùng để chọn.
- Review logic/log trước profit metrics.
b. Câu hỏi tự kiểm tra
- Backtest khác lời hứa live thế nào?
- Test passport cần ba nhóm metadata nào?
- Vì sao Run C không còn là holdout?
- Report cần đọc cùng tài liệu gì?
c. Gợi ý đáp án
Xem gợi ý câu 1
Backtest chỉ mô phỏng sample/assumptions lịch sử, không guarantee tương lai. Xem lại mục 1.
Xem gợi ý câu 2
Version/inputs, data/tick model và costs/initial state là ba nhóm cốt lõi. Xem lại mục 2.
Xem gợi ý câu 3
Vì input được tuned trên chính 2023, thông tin đã lọt vào selection. Xem lại mục 3 và mục 5.
Xem gợi ý câu 4
Trades/deals và journal/log để thấy sequence/error. Xem lại mục 4.
d. Thuật ngữ cần nhớ
| Thuật ngữ | Giải thích ngắn |
|---|---|
| Backtest | Chạy EA trên lịch sử với assumptions. |
| Test passport | Metadata đủ để tái tạo run. |
| Tick model | Cách tester cung cấp chuyển động giá. |
| Development data | Dữ liệu dùng phát triển/chọn rule. |
| Holdout | Dữ liệu giữ ngoài quá trình chọn. |
| Data leakage | Thông tin tương lai lọt vào decision. |
| Overfitting | Khớp quá mức development data. |
| Reproducibility | Khả năng tái tạo bằng cùng passport. |
| Look-ahead bias | Dùng dữ liệu chưa có tại thời điểm quyết định. |
e. Nguồn tham khảo
- MetaTrader 5 Help — Strategy Testing
- MetaTrader 5 Help — Real and Generated Ticks
- MetaTrader 5 Help — Testing Report
Bài trước: EA Inputs là gì? #9. Bài tiếp theo: Cách đánh giá một EA #11.
Nội dung này phục vụ mục đích giáo dục; không phải lời khuyên đầu tư, khuyến nghị EA hoặc cam kết backtest sẽ lặp lại trên thị trường thật.
Bài tiếp theo