Cách kiểm định ngoài mẫu hoạt động: vì sao ở đây không có «giữ 30% làm tập kiểm định»

Công cụ duy nhất là rolling walk-forward, và thứ nó kiểm không phải là một bộ tham số.

Cập nhật lần cuối 2026-09
Điểm chính
  • Trên workspace không có thiết lập «tỷ lệ huấn luyện / kiểm định». Công cụ ngoài mẫu duy nhất là rolling walk-forward ở tab thứ năm, hai ô nhập điền vào là số ngày, và chỉ có rolling chứ không cung cấp anchored.
  • Cách làm: mỗi vòng chọn lại tham số trong cửa sổ huấn luyện rồi áp vào cửa sổ kiểm định ngay sau đó; các cửa sổ kiểm định không chồng lấn nhau và nối thành một chuỗi ngoài mẫu liền mạch.
  • Tiêu chí là WFE (hiệu suất ngoài mẫu) = Sharpe ngoài mẫu ÷ Sharpe trung bình trong mẫu. Đạt ở 0.5 và tốt ở 0.7 là thông lệ ngành, không phải bằng chứng — câu này là nguyên văn phần diễn giải của chính sản phẩm.
  • Ví dụ thật: trong lần chạy 2026-09-17 của chiến lược mẫu hướng dẫn btc_sma_cross, Sharpe trung bình trong mẫu là 1.3471, ngoài mẫu −0.45, WFE −0.334; mà MCPT của cùng chiến lược đó trong cùng ngày thì lại đạt. Hai công cụ không hỏi cùng một chuyện.
  • Nó sẽ không đưa cho bạn một bộ tham số dùng được. Lần chạy đó qua 20 vòng chọn ra 4 bộ tham số khác nhau, và thành tích không thuộc về bộ nào cả.

Bạn đã đọc đúng câu này trong sách giáo khoa, thậm chí trong chính bài Cách đọc kết quả backtest của chúng tôi: đừng tối ưu trên toàn bộ dữ liệu, hãy giữ lại ít nhất 20–30% để kiểm định ngoài mẫu. Rồi bạn mở workspace, bấm qua từng tab một, và không tìm thấy cái thiết lập tỷ lệ đó đâu cả.

Không tìm thấy là bình thường, sản phẩm không có chức năng đó. Chuyện ngoài mẫu trên Blave chỉ có một cách hiện thực: rolling walk-forward ở tab thứ năm, mà thứ điền vào đó là số ngày, và thứ nó kiểm cũng hơi khác với việc chia đôi đơn giản. Bài này nói rõ khác ở đâu, và từng con số trên tab đó đọc thế nào.

Ngoài mẫu trên lý thuyết khác gì ngoài mẫu ở đây

Trong Cách tránh overfitting chiến lược có một bảng xếp hạng ba cách làm: tối ưu trên toàn bộ dữ liệu (vô dụng), 70% đầu huấn luyện 30% cuối kiểm định (hữu ích nhưng có hạn), và chọn lại theo cửa sổ trượt (sát thực tế nhất). Bảng đó là phán đoán ở tầng khái niệm; sự thật ở tầng sản phẩm là — chỉ cách thứ ba mới có nút bấm.

Cách làm Trên lý thuyết Trên Blave
Tối ưu trên toàn bộ lịch sử, báo cáo trên toàn bộ lịch sửTrong mẫu, tất yếu lạc quanTab Backtest vốn dĩ tính thành tích trên cả đoạn lịch sử, nên mới cần kiểm thêm
Cắt một nhát: đoạn đầu huấn luyện, đoạn sau kiểm địnhHữu ích nhưng chỉ dùng được một lầnKhông có chức năng này, không tìm thấy thiết lập tỷ lệ
Rolling walk-forward: mỗi vòng chọn lại, kiểm đoạn kế tiếpCách sát với giao dịch thật nhấtTab thứ năm của workspace, «Kiểm định ngoài mẫu»

Khác biệt không chỉ ở giao diện. Chia đôi đơn giản kiểm chuyện «bộ tham số này có tốt trên đoạn dữ liệu sau không»; rolling walk-forward kiểm chuyện bản thân cách làm «lấy lịch sử chọn tham số» có còn đứng vững trên chiến lược này hay không — nó lặp lại hành động «lấy một đoạn lịch sử để chọn tham số» n lần, mỗi lần đều chấm điểm bằng đoạn kế tiếp chưa từng thấy.

Nó chạy thực sự ra sao

Một câu: trong mỗi cửa sổ huấn luyện thì chọn lại tham số, áp vào cửa sổ kiểm định ngay sau đó, rồi nối tất cả các cửa sổ kiểm định thành một đường.

Chuỗi ngoài mẫu = đường được nối lại từ 20 đoạn cửa sổ kiểm định.
Vòng Cửa sổ huấn luyện Cửa sổ kiểm định
12022-01-05 → 2024-12-302024-12-31 → 2025-01-29
22022-02-04 → 2025-01-292025-01-30 → 2025-02-28
32022-03-06 → 2025-02-282025-03-01 → 2025-03-30
(các vòng ở giữa cũng nhích lên một cửa sổ kiểm định mỗi lần, tổng cộng 20 vòng)
202023-07-29 → 2026-07-232026-07-24 → 2026-08-22

Các cửa sổ kiểm định nối đầu nối đuôi tới từng ngày: vòng 1 dừng ở 2025-01-29, vòng 2 nối tiếp từ 2025-01-30, ở giữa không có khe hở cũng không chồng lấn — 20 đoạn nối lại chính là chuỗi ngoài mẫu đó.

Còn các cửa sổ huấn luyện thì chồng lấn rất nhiều: cửa sổ ba năm mỗi vòng chỉ nhích lên 30 ngày, nên giai đoạn huấn luyện của hai vòng bất kỳ gần như là cùng một đoạn dữ liệu. Thứ chồng lấn nhau thì không ghép thành một đường liền được — đó là lý do trên biểu đồ chỉ có mỗi đường ngoài mẫu.

Về hiện thực thì nó chạy hai lượt: lượt đầu tính tín hiệu của từng bộ tham số ứng viên trên toàn bộ lịch sử đúng một lần, rồi cắt ra định giá cho lát huấn luyện của từng vòng; lượt sau chỉ tính lại bộ thắng cuộc của mỗi vòng, xâu các lát kiểm định thành một chuỗi và định giá cả đoạn trong một lần. Nên nó nhanh hơn hẳn so với «chạy n lượt quét đầy đủ» — ví dụ 20 vòng, khung giờ 4.7 năm bên dưới chạy xong trong 3.5 giây ở lần chạy 2026-09-17 (hộp thoại xác nhận của giao diện đưa ra trường hợp chung: «Thường chạy xong trong khoảng hai phút; kết quả sẽ hiện ở thẻ này.»).

Chỉ có rolling, không có anchored

Rolling là cửa sổ huấn luyện mỗi vòng trượt nguyên khối về phía trước; anchored là cố định điểm bắt đầu và cửa sổ huấn luyện càng lăn càng dài. Sản phẩm chỉ cung cấp rolling, anchored là cố ý không cung cấp. Bạn đòi agent làm anchored, nó sẽ đáp lại một câu cố định rồi vẫn chạy rolling:

Ở đây chỉ cung cấp rolling (cửa sổ huấn luyện trượt theo về phía trước); anchored thì không có.

Cũng đừng nghĩ tới chuyện đi đường vòng: cái lib chạy walk-forward là chỉ đọc, tiến trình thường trú sẽ từ chối thẳng việc chỉnh sửa; hơn nữa trong tệp kết quả không có trường nào để đánh dấu «đây là chạy anchored», nên có sửa thật thì màn hình vẫn hiển thị theo kiểu rolling.

Điền cửa sổ huấn luyện và cửa sổ kiểm định thế nào

Trên tab chỉ có hai ô nhập: cửa sổ huấn luyệncửa sổ kiểm định, đơn vị đều là ngày, bên cạnh hiện ngay số vòng sẽ cắt ra được. Để trống cả hai thì chạy theo bảng mặc định này:

Độ dài dữ liệu (ngày) Cửa sổ huấn luyện (ngày) Cửa sổ kiểm định (bao lâu chọn lại một lần, ngày)
≥ 11851095(ba năm)30
455–1184365(một năm)30
< 4554 lần cửa sổ kiểm địnhtổng số ngày ÷ 12, tối thiểu 30

Bậc ba năm có lý do của nó: nó gần với cách làm thật của người dùng, tức là chọn một bộ tham số cố định từ cả đoạn backtest. Lịch sử dài vừa phải mà áp thẳng công thức tỷ lệ thì cửa sổ huấn luyện sẽ ngắn hơn một năm, nên ở giữa mới bù thêm bậc 365 / 30.

Hai giới hạn cứng sẽ chặn ngay, không trao cho bạn kết quả nửa vời: dưới 3 vòng thì không chạy, cũng không ghi tệp kết quả («Dữ liệu chỉ đủ cho {n} vòng — cần tối thiểu 3 vòng mới đọc được kết quả ngoài mẫu»); trên 1000 vòng cũng chặn y như vậy («hãy tăng cửa sổ kiểm định»). Dữ liệu ở đuôi không đủ một vòng thì không bị ghép cố, phía dưới biểu đồ sẽ chú thích «{d} ngày cuối không đủ một vòng nên không được tính».

Đọc hiệu suất ngoài mẫu (WFE) thế nào

Thẻ kết luận chỉ nhìn một con số:

WFE = Sharpe ngoài mẫu ÷ Sharpe trung bình trong mẫu

Tử số là Sharpe của cả đoạn sau khi nối lại của chuỗi ngoài mẫu; mẫu số là trung bình Sharpe của chính ô được chọn trong cửa sổ huấn luyện của từng vòng. Bốn nhãn chia theo các mốc này (đều là «nhỏ hơn», nên 0.5 rơi vào «vừa vượt ngưỡng» và 0.7 rơi vào «trên ngưỡng»):

WFEThẻ kết luận hiển thị
Không tính ra đượcHiệu suất ngoài mẫu: không thể đánh giá
< 0.2Hiệu suất ngoài mẫu: thấp hơn ngưỡng rất nhiều
< 0.5Hiệu suất ngoài mẫu: dưới ngưỡng
< 0.7Hiệu suất ngoài mẫu: vừa vượt ngưỡng
≥ 0.7Hiệu suất ngoài mẫu: trên ngưỡng

Còn phần diễn giải bên cạnh con số đó, xin hãy đọc đúng theo nghĩa đen:

Walk-Forward Efficiency (WFE): Sharpe ngoài mẫu ÷ Sharpe trong mẫu (đúng hai dòng ở bảng trên). Ngưỡng thông dụng là 0,5 để đạt và 0,7 trở lên là tốt; nếu Sharpe trong mẫu dưới 0,25 thì không thực hiện phép chia này. Đây là thông lệ, không phải bằng chứng.

Mẫu số có hai lớp phòng vệ, và thứ tự của chúng có ý nghĩa

Một mẫu số rất nhỏ hoặc âm sẽ lật ngược cả chẩn đoán: một chiến lược vốn chưa bao giờ mạnh trong mẫu lại được «hiệu suất» rất cao chỉ vì nó «chẳng có gì để nhả ra». Vì thế có hai lớp phòng vệ:

  1. Vòng nào có Sharpe cửa sổ huấn luyện ≤ 0 thì tính là thất bại và không được cộng vào trung bình trong mẫu. Vòng đó vẫn nằm trong bảng vòng, trong biểu đồ trôi dạt tham số, trong tỷ lệ cửa sổ có lãi — chỉ là không vào mẫu số. Phần chi tiết từng vòng sẽ chú thích «Vòng {k} có Sharpe huấn luyện ≤ 0 nên không được tính vào trung bình trong mẫu.»
  2. Nếu trung bình trong mẫu sau khi trừ đi vẫn dưới 0.25 thì không thực hiện phép chia này, mà hiện thẳng «không thể đánh giá».

Một lượt walk-forward thật: lần chạy 2026-09-17

Chiến lược mẫu hướng dẫn btc_sma_cross (BTCUSDT 1h, từ 2022-01-01, tổng cộng 1,720 ngày, SMA 45 / 100, không sửa một chữ tham số nào). Dữ liệu rơi vào bậc đầu tiên nên áp cửa sổ mặc định 1095 / 30, cắt ra 20 vòng (cửa sổ kiểm định cộng lại 600 ngày); 25 ngày cuối không đủ một vòng nên không được tính.

Mục Ngoài mẫu (các cửa sổ kiểm định nối lại, 600 ngày) Trong mẫu (20 cửa sổ huấn luyện tính riêng rồi lấy trung bình)
Sharpe−0.451.3471
Lợi nhuận hằng năm−16.55%+50.16%
Sụt giảm tối đa−46.57%
Số giao dịch183
Hiệu suất ngoài mẫu WFE = −0.45 ÷ 1.3471 = −0.334   →  thấp hơn ngưỡng rất nhiều

Có ba điều đáng chỉ ra. Thứ nhất, không có vòng nào bị loại — Sharpe cửa sổ huấn luyện của cả 20 vòng đều lớn hơn 0, nên mẫu số là trung bình đầy đủ của 20 vòng, chứ không phải phần còn lại sau khi sàng.

Thứ hai, mẫu số 1.3471 cao hơn 0.25 rất nhiều nên lớp phòng vệ thứ hai không kích hoạt, phép chia có hiệu lực: «WFE âm» và «WFE không thể đánh giá» là hai chuyện khác nhau, cái trước là kết quả tính ra được, cái sau là từ chối trả lời.

Thứ ba, hai cột đó vốn dĩ phủ những giai đoạn khác nhau — trong mẫu là trung bình của 20 cửa sổ huấn luyện chồng lấn nhau, ngoài mẫu là 600 ngày sau đó, nên đây không phải một đối chiếu cùng kỳ sạch sẽ; và chính khoảng chênh ấy mới là thứ WFE muốn đo.

Mẹo: Đây là backtest END = None, chạy tới đúng ngày thực thi, nên bản thân nó cũng là một ảnh chụp. Trích con số backtest hay kiểm định nào cũng phải ghi kèm ngày chạy.

Cùng một chiến lược, MCPT thì đạt

Cùng ngày, cùng một bản mã, giá trị p MCPT của chiến lược này là 0.0160 (n = 2000), stdout tự in ra significant edge at 95% — chiếu theo tiêu chuẩn của cổng lên sàn thì là đạt.

Kiểm định Câu hỏi nó đặt ra Kết quả
MCPTTrên chuỗi vị thế cố định này, kết quả đó có phân biệt được thực lực với may mắn không?p = 0.0160 → Đạt
Walk-forwardBản thân việc chọn tham số theo lịch sử còn dùng được ở đoạn tiếp theo không?WFE = −0.334 → thấp hơn ngưỡng rất nhiều

Cả hai đều không tính sai, bởi chúng không trả lời cùng một câu hỏi. Đây cũng là lý do giá trị p đẹp tới đâu cũng không thể coi là đã qua kiểm định ngoài mẫu (xem Cách đọc giá trị p của MCPT). Tiện thể nói rõ: đây không phải là nói chiến lược này hỏng — nó là mẫu hướng dẫn đi kèm workspace, và thứ được minh họa ở đây là khác biệt về ý nghĩa giữa hai kiểm định.

Chọn tham số bằng trung bình lân cận, nhưng báo cáo lại là Sharpe của chính ô đó

Mỗi vòng chọn tham số bằng trung bình lân cận 3×3 (cùng một quy tắc với quét tham số, tức là cách chọn cao nguyên chứ không chọn đỉnh nhọn nói trong Cách tránh overfitting chiến lược), nhưng Sharpe huấn luyện được báo cáo trên bảng vòng lại là con số của chính ô được chọn. Đây là cố ý:

Mẫu số dùng gìHậu quả
Sharpe của chính ô đó (hiện hành)Mẫu số thiên cao, WFE thiên về thận trọng
Trung bình lân cận 3×3Trung bình lân cận về mặt cấu trúc tất yếu thấp hơn chính ô mà nó bao quanh → mẫu số bị ép nhỏ lại → WFE bị thổi phồng, cả tab đọc lên thành lạc quan quá mức

Chẩn đoán với mẫu số bị thổi phồng thì thà đừng làm còn hơn.

Chỗ nối khi đổi tham số không đóng vị thế trước

Ở chỗ giáp ranh hai vòng, chuỗi mang theo vị thế của chính vòng mới — nó bị cắt ra, chứ không bị đưa về không. Ép đóng vị thế ở mọi chỗ nối thì chẳng khác nào bịa ra n−1 lệnh thoát mà chưa ai từng giao dịch.

Chi phí đổi tham số cũng không bị bỏ sót: ở chỗ nối tỷ trọng thay đổi, và khi định giá vẫn thu phí giao dịch đầy đủ. Cũng vì con số của mỗi vòng đều được cắt ra từ cùng một chuỗi đã nối sẵn chứ không định giá lại, nên cộng bảng vòng lại đúng bằng tổng của cả đoạn.

Chỉ cửa sổ huấn luyện mới trừ giai đoạn khởi động, cửa sổ kiểm định thì không

Tín hiệu được tính trên toàn bộ lịch sử (chỉ báo rolling có thế mới chuẩn), nhưng mỗi lát huấn luyện đều tự bỏ qua số nến khởi động ở đầu của chính nó — không phải chỉ mỗi vòng đầu tiên. Không có bước này thì vòng 1 sẽ huấn luyện trên những cây nến mà chỉ báo chưa kịp nóng và nhặt phải nhiễu, độ dài hữu hiệu của các vòng cũng khác nhau và không so được. Chính bảng vòng ở trên là bằng chứng: START của chiến lược ghi là 2022-01-01, nhưng cửa sổ huấn luyện của vòng 1 mãi tới 2022-01-05 mới bắt đầu — mấy ngày chênh đó chính là WARMUP = 100 cây nến giờ (khoảng 4.2 ngày) bị trừ đi.

Cửa sổ kiểm định thì không bị cắt xén, vì nó đã nóng sẵn rồi, và vì nó buộc phải liên tục mới nối được. Tiện thể trả lời một câu hỏi mà bạn đọc nâng cao hay hỏi: ở đây không cần giai đoạn cách ly embargo — cửa sổ kiểm định nằm sát ngay sau cửa sổ huấn luyện đã chọn tham số cho nó, còn dữ liệu sau nó thì hoàn toàn không được dùng tới.

Mẹo: Vì sao trên biểu đồ chỉ có một đường? Giao diện tự viết rất rõ: «Không có đường cong trong mẫu: các cửa sổ huấn luyện chồng lấn nhau nên không nối thành một đường liền được».

Nó sẽ không đưa tham số cho bạn, đây là khế ước cứng

Chạy xong không có nút «áp dụng tham số đề xuất» nào, và agent cũng không được phép sửa mã chiến lược của bạn vì kết quả này. Trạng thái rỗng đã nói thẳng ngay từ đầu:

Nó không tạo ra tham số để áp dụng — thứ được kiểm định là chính cách làm «chọn tham số từ lịch sử».

Vì sao không chép được? Hãy nhìn độ trôi dạt tham số của lần chạy đó. Qua 20 vòng chỉ chọn ra 4 bộ tham số khác nhau:

(45,100) ×14 → (55,80) → (45,100) → (45,80) ×3 → (35,80)

14 vòng đầu đều đứng yên ở cùng một ô. Cho dù «phần lớn thời gian đều chọn 45 / 100» trông có vẻ là một kết luận, thì đường cong ngoài mẫu −0.45 kia cũng không phải thành tích của 45 / 100 — nó là cả một đoạn do 4 bộ tham số chạy tiếp sức, không thuộc về bộ nào, nên không có bộ nào để mà «áp dụng». Khi bạn đòi áp dụng, agent sẽ đáp lại một câu cố định:

Kiểm định ngoài mẫu không tạo ra tham số để áp dụng — thành tích của nó đến từ việc chọn lại mỗi vòng, không thuộc về bộ nào; muốn đổi tham số thì hãy dùng điểm ổn định của quét tham số.

Lưới trôi dạt tham số sẽ vẽ ra mỗi vòng chọn ô nào và ô đó được chọn bao nhiêu vòng, khung nét đứt đánh dấu tham số hiện tại của bạn, chú giải cũng ghi rõ «tham số của vòng cuối chỉ để tham khảo, không phải giá trị khuyến nghị» — vòng cuối của lần chạy đó chọn 35 / 80, điều đó chỉ có nghĩa «cửa sổ huấn luyện của đúng vòng cuối ấy tình cờ rơi vào ô này». Ngoài ra, tab này không hiển thị giá trị p và cũng không bao giờ chạy MCPT; chạy một lượt walk-forward được tính là một vòng lặp trong quy tắc làm việc của agent.

Mở tab này ra thì xem năm điều này trước

1

Số vòng có đủ không? Dưới 3 vòng thì nó không chạy chút nào. Khi số vòng quá ít, WFE chỉ là vận may của một hai cửa sổ kiểm định.

2

Có vòng nào bị loại không? Phần chi tiết từng vòng sẽ chú thích những vòng nào có Sharpe cửa sổ huấn luyện ≤ 0. Lần chạy ở trên không có vòng nào bị loại; càng nhiều vòng bị loại thì càng có nghĩa chiến lược này ngay trong chính cửa sổ huấn luyện của nó cũng thường chẳng chọn được gì.

3

WFE là «không thể đánh giá» hay là một số âm? Khác nhau. «Không thể đánh giá» nghĩa là trung bình trong mẫu dưới 0.25 và tỷ số này vô nghĩa; số âm nghĩa là phép chia đã làm, và đoạn ngoài mẫu thì lỗ.

4

Tham số trôi dạt dữ tới đâu? Hãy xem dòng «{n} vòng chọn ra {u} bộ tham số khác nhau». Lần chạy ở trên là 20 vòng ra 4 bộ; nếu mỗi vòng đều nhảy sang một ô hoàn toàn khác thì mỗi lần chọn lại là một lần đuổi theo một thứ khác nhau.

5

Bạn có đang đi tìm tham số đề xuất không? Không có đâu. Muốn đổi tham số thì dùng điểm ổn định của quét tham số, chứ không phải chép vòng cuối.

Nhắc thật lòng: Có hai điều cần nói thẳng. Thứ nhất, đây không phải cổng lên sàn. Ba tiêu chí chất lượng của Thư viện chiến lược là phí của một backtest trung thực, ý nghĩa thống kê (MCPT) và độ bền của tham số; walk-forward không nằm trong đó — nó là công cụ tự phục vụ của bạn. Thứ hai, 0.5 và 0.7 là thông lệ, không phải bằng chứng. Chính phần diễn giải của sản phẩm viết đúng như vậy, và bài này sẽ không nói võ đoán hơn giao diện: WFE cao chỉ có nghĩa «chuyện lấy lịch sử chọn tham số, trên đoạn dữ liệu này, chưa nhả lại rõ rệt», chứ không có nghĩa tương lai sẽ lặp lại cùng kết quả; ngược lại, một lần WFE âm cũng chỉ là một kết quả dưới đúng bộ cửa sổ đó và đúng đoạn dữ liệu đó.

Tiếp theo

Chạy thử một lần rồi mà WFE rơi thảm hại thì vấn đề thường không nằm ở bước ngoài mẫu này, mà ở bước chọn tham số — đó là phạm vi của Cách tránh overfitting chiến lược. Nếu bạn còn chưa có chiến lược nào đáng đem đi kiểm, thì mỗi chiến lược chính thức trong Thư viện chiến lược đều kèm backtest thật và kết quả các tiêu chí chất lượng, xem số trước rồi hãy quyết: Thư viện chiến lược.