Trả lời ngắn: Walk-Forward Analysis cho EA là quy trình lặp theo thời gian: tối ưu và chọn bộ tham số trên cửa sổ cũ, khóa bộ đó, kiểm tra đúng một lần trên cửa sổ kế tiếp chưa dùng, ghi kết quả rồi dịch lịch. Nó đo độ ổn định qua nhiều giai đoạn, không chứng minh lợi nhuận live.

Đọc xong, bạn sẽ hiểu: IS/OOS khác nhau ra sao; rolling khác expanding thế nào; vì sao candidate phải được freeze trước OOS; cách ghi ledger W20; và lúc một hard failure buộc toàn study dừng.

Lưu ý giáo dục: W20 là protocol giả để học thiết kế kiểm định, không phải ngưỡng hiệu suất, bộ tham số hay lời khuyên triển khai EA bằng tiền thật.

1. Walk-forward là optimize → freeze → unseen test → advance

a. Hai cửa sổ, hai quyền khác nhau

Walk-Forward Analysis (WFA) là chuỗi kiểm định theo thứ tự thời gian. Mỗi vòng, hay cycle, gồm:

OPTIMIZE IS → SELECT BY RULE → FREEZE → TEST OOS ONCE → RECORD → ADVANCE

In-sample (IS) là cửa sổ cũ được phép dùng để thử nhiều bộ tham số và chọn candidate. Out-of-sample (OOS) là cửa sổ kế tiếp bị niêm phong trong lúc chọn; nó chỉ được mở để đánh giá bộ đã khóa.

Hình dung một tiệm bánh phát triển công thức trong bếp A. Trước khi đem sang cửa hàng B thử, công thức được ký tên, niêm phong. Nếu khách B chê ngọt, nhóm có thể tạo thí nghiệm mới cho tháng sau, nhưng không được sửa tờ công thức rồi giả vờ đó vẫn là lần thử cũ.

b. Freeze là ranh giới bằng chứng

Candidate là bộ tham số được selection rule chọn từ IS. Freeze là lưu bất biến candidate, EA build, rule, data contract và hash trước khi mở OOS. Nếu các mục đó đổi, cycle cũ mất tính so sánh.

OOS không phải sân tập thứ hai. Xem OOS rồi chỉnh tham số, chạy lại và vẫn gọi đó là OOS tạo data leakage: thông tin của bài kiểm tra đã lọt vào bước chọn.

Một forward split chỉ có một IS và một OOS. WFA đầy đủ lặp việc này qua nhiều giai đoạn liên tiếp để thấy hệ thống ứng xử khi regime thay đổi.

Hình 1 — Mỗi cycle chỉ hợp lệ khi candidate được khóa trước khi mở OOS.

2. Window design và demo W20

a. Rolling và expanding

Rolling window giữ độ dài IS/OOS cố định rồi trượt cả hai về trước. Expanding window giữ điểm bắt đầu IS, còn điểm kết thúc lớn dần. Hai thiết kế trả lời câu hỏi khác nhau:

  • Rolling nhấn mạnh dữ liệu gần đây trong một khung cố định.
  • Expanding giữ toàn bộ lịch sử cũ và làm tập IS ngày càng lớn.

Không có loại nào luôn tốt hơn. Điều quan trọng là ghi trước lựa chọn và không đổi giữa study chỉ vì kết quả xấu.

W20 dùng contract W20:ROLLING:V1:

  • IS: 3 months;
  • OOS: 1 month;
  • step: 1 month;
  • cùng EA build, data contract, parameter ranges, optimization criterion, selection rule và cost/risk model.

b. Ba cycle của W20

Cycle IS OOS Candidate
C1 Jan–Mar Apr W20:C1:P1
C2 Feb–Apr May W20:C2:P1
C3 Mar–May Jun W20:C3:P1

Ở C1, chỉ Jan–Mar được dùng để tối ưu. W20:C1:P1 được export và hash trước khi April mở. Sang C2, stencil lịch trượt một tháng: February–April thành IS, May thành OOS. C3 làm tương tự với March–May và June.

Hình 2 — Rolling window giữ độ dài cố định và tiến đúng một tháng mỗi cycle.

Cửa sổ chồng lấn không phải lỗi tự động; đó là thiết kế của rolling W20. Nhưng các cycle không còn độc lập hoàn toàn, nên ledger phải giữ đúng dates và không đếm chúng như ba thí nghiệm tách biệt tuyệt đối.

3. Selection, freeze và aggregate decision

a. Chọn trước khi biết đáp án

Selection rule phải được khai báo trước C1: điều kiện eligible, metric xếp hạng, tie-break, minimum evidence và hard-risk gate. Chọn “đỉnh lợi nhuận đẹp nhất” sau khi nhìn heatmap dễ bắt đúng một điểm nhiễu.

MetaTrader 5 Strategy Tester cho phép tối ưu nhiều input combinations và chọn optimization criterion. Built-in forward testing chia khoảng thời gian thành phần backtest cũ và forward mới; forward có thể là 1/2, 1/3, 1/4 hoặc custom. Các best runs từ phần tối ưu được chạy lại trên forward segment. MetaTrader 5 — Strategy Optimization

Đó là công cụ cho một split. Muốn WFA rolling ba cycle như W20, operator vẫn phải quản lý dates, freeze artifacts, selection rule và aggregate ledger qua từng lần chạy.

Optimization criterion chỉ là metric tester dùng để đánh giá/rank parameter sets; built-in choices gồm balance, Profit Factor, Expected Payoff, drawdown, Recovery Factor, Sharpe hoặc custom. Chọn criterion không biến nó thành bằng chứng duy nhất về độ bền. MetaTrader 5 — Optimization Types

b. W20 không được bỏ C3

W20 dùng ba check giả đã khai báo:

Cycle Minimum sample Risk cap Degradation cap Result
C1 PASS PASS PASS PASS
C2 PASS PASS PASS PASS
C3 PASS FAIL FAIL FAIL

Aggregate contract yêu cầu mọi cycle qua hard-risk gate. Vì C3 fail risk cap, kết luận là REJECT/HALT. Không được nói “hai trên ba khá ổn” rồi lấy trung bình che failure.

TesterStatistics() có thể lấy các testing statistics trong OnTester() hoặc OnDeinit(); gọi ở context khác cho kết quả undefined. Thống kê nào được dùng vẫn phải ghi trong contract. MQL5 — TesterStatistics

Hình 3 — Hard-risk failure không được che bằng trung bình của hai cycle trước.

4. Mười lỗi và giới hạn

  1. Tối ưu toàn lịch sử rồi gọi cùng data là OOS. Không còn unseen window.
  2. Chỉnh sau khi xem OOS. Cycle đó trở thành development, cần version mới.
  3. Bỏ cycle xấu. Calendar phải tiến đều; skipped cycle là cherry-picking.
  4. Đổi window giữa study. Kết quả không còn cùng protocol.
  5. Đổi data/build/cost model. Candidate khác contract không thể so thẳng.
  6. Chọn một peak đơn lẻ. Điểm cao có thể nhạy với một bước parameter nhỏ.
  7. Đổi criterion giữa IS và OOS. Hai bên đang trả lời hai câu hỏi.
  8. Dùng average che hard failure. Risk cap không phải điểm mềm để bù.
  9. Gọi một forward split là full WFA. Thiếu repeated cycles và aggregate evidence.
  10. Nói WFA chứng minh live profit. Nó chỉ kiểm tra một protocol trên history.

WFA vẫn có giới hạn. Ít trades khiến OOS metric nhiễu; regime shift có thể nằm ngoài lịch sử; spread, slippage và execution simulation có thể lệch live. Search space càng rộng, nguy cơ multiple testing càng lớn. Data leakage nhỏ qua lựa chọn thủ công cũng có thể làm kết quả lạc quan.

Cache cũng cần được ghi. AlgoBook lưu ý tester có thể dùng optimization cache phù hợp cho lần chạy sau; criterion không nhất thiết là yếu tố phân biệt cache. Thí nghiệm cần chính sách cache/version rõ thay vì xóa tùy hứng đến khi ra kết quả mong muốn. MQL5 AlgoBook — OnTester and cache

5. WFA Contract và runbook

a. Contract tối thiểu

Trước khi chạy C1, ghi:

  • experiment ID/version và mục tiêu;
  • EA build/hash, data contract, symbol/timezone;
  • IS/OOS length, step, rolling hay expanding;
  • parameter ranges, optimization type và criterion;
  • eligibility, ranking và tie-break;
  • candidate artifact/hash/time;
  • OOS metrics, hard gates và aggregate rule;
  • cost/execution assumptions, cache policy;
  • cách xử lý run lỗi, skipped cycle và ledger path.

Testing statistics có nhiều IDs cho deposit, trades, drawdown và các metric khác; tên metric cần được khóa chứ không chỉ ghi “kết quả tốt”. MQL5 — Testing Statistics

b. Runbook fail-closed

  1. Lock contract và calendar.
  2. Optimize chỉ trên IS.
  3. Export eligible candidates.
  4. Select theo rule đã ghi.
  5. Freeze candidate/build/data hash.
  6. Mở OOS và chạy đúng một lần.
  7. Record raw report, state và reason.
  8. Advance đúng step.
  9. Aggregate sau cycle cuối.

Thiếu freeze hash, build/input đổi, OOS bị rerun sau tuning, cycle bị bỏ hoặc cost model unknown đều trả RECHECK/HALT. Không “sửa nhanh rồi tiếp tục” trong cùng experiment ID.

6. Worksheet W20 trong 15 phút

Dùng giấy hoặc Google Sheets; chưa cần MT5 và không dùng tiền thật. Chép bảng, điền candidate IDs và khoanh hard gate.

Mẫu đối chiếu

Cycle IS window OOS window Frozen candidate Sample Risk cap Degradation Cycle
C1 Jan–Mar Apr W20:C1:P1 PASS PASS PASS PASS
C2 Feb–Apr May W20:C2:P1 PASS PASS PASS PASS
C3 Mar–May Jun W20:C3:P1 PASS FAIL FAIL FAIL
Aggregate 3 cycles no rerun hashes recorded hard gate failed REJECT/HALT

Tự hỏi:

  • Candidate nào được freeze trước April, May và June?
  • C3 có được bỏ vì “khác regime” không?
  • Nếu sửa risk rule sau C3, experiment ID còn là V1 không?
  • Hai cycle PASS có quyền bù một hard-risk FAIL không?

Đáp án mong đợi: giữ C3, kết thúc V1 ở REJECT/HALT; mọi sửa đổi thuộc V2.

7. Tổng kết: khóa protocol trước khi nhìn OOS

a. Năm ý chính

  • WFA lặp IS select → freeze → OOS once → advance.
  • IS được phép tối ưu; OOS chỉ dùng để đánh giá candidate đã khóa.
  • Window type, step, criterion và selection rule phải giữ nhất quán.
  • Full WFA cần nhiều cycle; built-in forward test cung cấp một split.
  • Hard failure phải hiện trong aggregate, không được average hoặc cherry-pick.

Bài trước là Tick Data Quality trong Backtest EA. Bài tiếp theo là Monte Carlo Test cho EA #21.

b. Câu hỏi tự kiểm tra

  • Vì sao sửa parameter sau khi xem OOS làm cycle mất tính OOS?
  • Rolling khác expanding ở điểm bắt đầu và độ dài IS thế nào?
  • Built-in forward testing có tự tạo full W20 không?
  • Vì sao C3 khiến aggregate REJECT/HALT?

c. Gợi ý đáp án

Xem gợi ý câu 1

Thông tin OOS đã lọt vào selection, nên đó là development cho version mới. → xem mục 1.

Xem gợi ý câu 2

Rolling trượt cửa sổ cố định; expanding giữ đầu IS và kéo dài phần cuối. → xem mục 2.

Xem gợi ý câu 3

Không; tester hỗ trợ một split, còn W20 cần quản lý ba cycle và aggregate ledger. → xem mục 3.

Xem gợi ý câu 4

Contract yêu cầu mọi cycle qua hard-risk gate; C3 đã fail. → xem mục 3 và 6.

d. Thuật ngữ cần nhớ

Thuật ngữ Giải thích ngắn
IS Cửa sổ cũ được phép tối ưu.
OOS Cửa sổ kế tiếp dùng một lần để đánh giá.
Candidate Bộ tham số được chọn từ IS.
Freeze Khóa candidate và contract trước OOS.
Rolling Cửa sổ cố định trượt theo step.
Expanding IS giữ điểm đầu và dài dần.
Selection rule Quy tắc eligible/ranking khai báo trước.
Data leakage OOS/future information lọt vào selection.
Hard gate Điều kiện không được average để bù.
Cycle ledger Sổ bằng chứng của từng IS→OOS vòng.

e. Nguồn tham khảo

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ư hoặc tín hiệu giao dịch. Walk-Forward Analysis tăng kỷ luật bằng chứng nhưng không loại bỏ overfitting, regime shift, execution risk hoặc nguy cơ mất vốn.