Vì sao phần lớn backtest nói dối
Mục tiêu bài học
- Gọi tên bốn cách kinh điển khiến backtest "tô hồng" một chiến lược — overfitting, look-ahead bias, survivorship bias và data snooping — và nhận ra từng lỗi trong một báo cáo backtest thật.
- Giải thích vì sao ngưỡng t-statistic bằng 2 là quá thấp khi đã thử nhiều ý tưởng, dựa trên lập luận t > 3 của Harvey, Liu & Zhu (2016).
- Tính xác suất có ít nhất một "phát hiện" giả khi kiểm định N ý tưởng độc lập ở mức ý nghĩa 5%.
- Dùng ý tưởng độ dài backtest tối thiểu của Bailey và cộng sự (2014) để đánh giá backtest của bạn có đủ dài so với số biến thể đã thử hay không.
Multiple-Testing Haircut: Reported Sharpe vs Deflated Sharpe Across N = 1 → 1000 Trials
Bạn chỉnh một mẫu vào lệnh dựa trên imbalance của footprint trên 5 năm dữ liệu NQ. Phiên bản 1 lỗ. Phiên bản 7 hòa vốn. Phiên bản 23 — tỷ lệ imbalance 3.5, hai mức xếp chồng, chỉ vào lệnh sau 9:45 giờ New York, stop 14 tick — cho ra đường equity mượt mà và Sharpe năm hóa 1.4. Bạn có cảm giác vừa tìm ra “kho báu”. Sự thật khó nghe là: có thể bạn chẳng tìm ra gì cả, ngoài chuỗi tung đồng xu may mắn nhất trong 23 chuỗi.
Backtest (kiểm thử lịch sử) là việc mô phỏng xem một bộ quy tắc lẽ ra đã giao dịch thế nào trên dữ liệu quá khứ. Nó không phải bằng chứng rằng bộ quy tắc đó sẽ kiếm được tiền. Nó chỉ trở thành bằng chứng khi bài kiểm tra được thiết kế để may mắn, nhìn trước kết quả và chọn lọc không thể tạo ra cùng một kết quả. Module M10 nói về chính cách thiết kế đó. Bài đầu tiên này là danh mục những chỗ backtest hay “nói dối”.
Nhìn biểu đồ trước: bốn cách backtest nói dối
BACKTEST CHO THẤY GÌ
|
+-------------+-------------+---------------+----------------+
| | | |
OVERFITTING LOOK-AHEAD SURVIVORSHIP DATA SNOOPING
quy tắc bị quy tắc "biết" điều mẫu chỉ giữ lại thử nhiều ý tưởng,
uốn theo lúc đó chưa thể biết những gì sống chỉ báo cáo
nhiễu sót người thắng
| | | |
chết khi ra khớp lệnh "không tưởng", edge biến mất "có ý nghĩa"
ngoài mẫu điểm vào đẹp bất thường trên toàn bộ mẫu do ngẫu nhiên
1. Overfitting (quá khớp). Mỗi tham số bạn thêm vào là thêm một núm vặn để bộ tối ưu hóa uốn quy tắc theo quá khứ. Năm năm nến 1 phút của NQ chứa rất nhiều nhiễu, và nhiễu cũng có “hình dạng”. Cho quy tắc đủ núm vặn, nó sẽ học thuộc lòng hình dạng đó. Ra ngoài mẫu, nhiễu đã khác, nên quy tắc học thuộc sẽ gãy. Dấu hiệu cảnh báo: quá nhiều tham số; bề mặt tối ưu “lởm chởm”, tức hiệu suất sụp đổ khi chỉ dịch một tham số một nấc; điều kiện cụ thể đến mức đáng ngờ (“chỉ vào thứ Ba khi biên độ phiên đêm từ 38 đến 41 điểm”).
2. Look-ahead bias (thiên lệch nhìn trước). Quy tắc dùng thông tin mà tại thời điểm ra quyết định chưa hề có. Các phiên bản kinh điển trong order flow:
- dùng POC hoặc value area của cả phiên để lọc lệnh vào lúc 10:00, trong khi POC cuối cùng chỉ biết khi phiên đóng cửa;
- dùng giá đóng cửa của một nến để kích hoạt lệnh “tại giá mở cửa của chính nến đó”;
- bộ lọc ngày tính từ high/low của cả ngày;
- dữ liệu resample mà nến 5 phút được gắn nhãn thời gian bắt đầu nhưng lại chứa năm phút tiếp theo.
Look-ahead thường lộ ra qua một backtest quá đẹp. Một quy tắc đơn giản có tỷ lệ thắng 80%+ nên khiến bạn nghi ngờ trước khi khiến bạn phấn khích.
3. Survivorship và selection bias (thiên lệch sống sót và chọn mẫu). Mẫu chỉ chứa những gì còn sống sót. Với cổ phiếu, đó là backtest trên danh sách thành phần chỉ số hiện tại, bỏ qua các công ty đã phá sản. Với futures, bản thân hợp đồng vẫn tồn tại, nhưng thiên lệch này xuất hiện dưới dạng khác: chỉ test trên những ngày “đẹp” mà bạn đã lưu ảnh chụp; bỏ đi những phiên bị lỗi dữ liệu (thường lại là phiên biến động mạnh nhất); hoặc dựng chuỗi hợp đồng liên tục đã điều chỉnh (back-adjusted) mà quên rằng ngày roll hành xử khác thường.
4. Data snooping (đào bới dữ liệu). Thử rất nhiều ý tưởng trên cùng một dữ liệu và chỉ báo cáo ý tưởng tốt nhất. Từng phép thử riêng lẻ có thể trung thực, nhưng quá trình tìm kiếm mới là thứ nói dối. Bài “Reality Check” của Halbert White (Econometrica, 2000) được xây dựng đúng cho vấn đề này: kiểm tra xem mô hình tốt nhất từ một cuộc tìm kiếm có thật sự vượt benchmark, hay chỉ là người trúng xổ số giữa nhiều ứng viên.
Số học của việc thử nhiều thứ
Giả sử không ý tưởng nào của bạn có edge. Kiểm định từng ý tưởng ở mức ý nghĩa 5% quen thuộc. Xác suất một phép thử trông có ý nghĩa một cách sai lầm là 5%. Xác suất ít nhất một trong N phép thử độc lập như vậy là 1 − 0.95ᴺ:
| Số ý tưởng đã thử (N) | P(ít nhất một phát hiện giả) |
|---|---|
| 1 | 5% |
| 5 | 23% |
| 20 | 64% |
| 100 | 99.4% |
Hai mươi biến thể của một mẫu vào lệnh chỉ là một buổi chiều mày mò bình thường. Đến mức đó thì khả năng có một cái gì đó trông “có ý nghĩa” thuần túy do ngẫu nhiên đã cao hơn 50%.
Đây là cốt lõi của Harvey, Liu & Zhu (2016), “…and the Cross-Section of Expected Returns” (Review of Financial Studies 29(1), 5–68). Các tác giả đếm hàng trăm “nhân tố” lợi nhuận đã được công bố và lập luận rằng, vì cả giới nghiên cứu cùng đào bới một bộ dữ liệu, một nhân tố mới phải vượt t-statistic trên 3.0 chứ không phải ngưỡng truyền thống 2.0. Ngưỡng t = 2 hợp lý cho một phép thử đã lên kế hoạch trước, nhưng quá thấp cho kết quả tốt nhất trong hàng trăm phép thử.
Bailey, Borwein, López de Prado & Zhu (2014), “Pseudo-Mathematics and Financial Charlatanism” (Notices of the AMS 61(5), 458–471), nói cùng điều đó bằng ngôn ngữ backtest. Nếu một chiến lược có Sharpe thực bằng không, thì biến thể tốt nhất trong N biến thể vẫn có Sharpe in-sample kỳ vọng tăng dần theo N. Dùng công thức trong bài báo cho giá trị kỳ vọng của cực đại N phép thử độc lập, biến thể tốt nhất trong khoảng 45 biến thể được kỳ vọng cho Sharpe năm hóa khoảng 1.0 trên 5 năm dữ liệu, trong khi Sharpe thực bằng 0. Các tác giả gọi độ dài dữ liệu cần để loại trừ khả năng này là độ dài backtest tối thiểu (minimum backtest length). Năm năm dữ liệu chỉ đủ để bảo vệ khoảng 45 lần thử độc lập ở Sharpe 1. Phần lớn công cụ tối ưu của trader cá nhân chạy hàng nghìn tổ hợp.
Ví dụ minh họa: kiểm toán backtest “phiên bản 23”
Quay lại ví dụ mở đầu. Hãy ghi lại những gì đã thực sự làm:
| Câu hỏi | Trả lời | Có vấn đề? |
|---|---|---|
| Đã thử bao nhiêu biến thể? | 23 phiên bản có tên, cộng một lượt quét tối ưu khoảng 400 tổ hợp tham số | Data snooping: N ≈ 400, không phải 1 |
| Số tham số của quy tắc cuối | 5 (tỷ lệ, số mức xếp chồng, bộ lọc giờ, stop, target) | Rủi ro overfitting cao |
| Bộ lọc “sau 9:45” có đến từ việc nhìn kết quả không? | Có, vì các lệnh 9:30–9:45 tệ nhất | Chọn lọc dựa trên kết quả |
| Lệnh vào dùng POC phiên trước? | Dùng POC đang hình thành của hôm nay, nhưng code lại đọc giá trị cuối phiên | Look-ahead |
| Ngày thiếu dữ liệu | Bỏ 11 phiên do lỗi feed, trong đó có hai ngày FOMC | Survivorship/selection |
| Chi phí | 0 phí, khớp đúng giá tín hiệu | Xem M10.02 |
Mỗi dòng là một lý do khiến con số Sharpe 1.4 bị thổi phồng. Không dòng nào chứng minh ý tưởng không có edge. Nhưng gộp lại, chúng cho thấy backtest này chưa phải là bằng chứng. Cách sửa không phải là bỏ cuộc. Cách sửa là: (a) sửa lỗi look-ahead, (b) đưa các ngày bị thiếu trở lại, (c) thêm chi phí thực tế (M10.02), (d) ghi N trung thực rồi “khử lạm phát” kết quả (M10.04), và (e) đánh giá trên dữ liệu mà quá trình tìm kiếm chưa từng chạm vào (M10.03, M10.06).
Sai lầm thường gặp: Nghĩ rằng “mình chỉ test một chiến lược” vì bạn chỉ giữ lại một. Những phép thử bạn đã chạy rồi vứt đi vẫn được tính. Con số quan trọng là bạn đã nhìn qua bao nhiêu cấu hình, kể cả những cấu hình bạn chỉ liếc qua biểu đồ rồi loại mà không chạy chính thức. Nếu không ghi lại, bạn sẽ luôn đánh giá thấp N.
Tóm tắt:
- Backtest là mô phỏng, không phải bằng chứng. Nó chỉ thành bằng chứng khi thiết kế loại trừ được overfitting, look-ahead, survivorship và data snooping.
- Với N lần thử độc lập ở mức 5%, xác suất có ít nhất một phát hiện giả là 1 − 0.95ᴺ, tức 64% khi N = 20.
- Harvey, Liu & Zhu đề xuất ngưỡng t > 3 khi đã chạy nhiều phép thử. Bailey và cộng sự chỉ ra rằng biến thể tốt nhất trong khoảng 45 biến thể không có edge vẫn được kỳ vọng cho Sharpe khoảng 1 trên 5 năm dữ liệu.
- Luôn ghi lại số biến thể đã thử. Con số đó là đầu vào cho mọi phép hiệu chỉnh trong module này.
Câu hỏi: Bạn test 10 biến thể độc lập của một mẫu vào lệnh delta divergence trên ES, mỗi biến thể ở mức 5%, và một biến thể “có ý nghĩa” với t = 2.3. Một người bạn nói: “t trên 2 nghĩa là thật.” Lập luận này sai ở đâu? Đáp án: Với 10 lần thử và không có edge thật, xác suất có ít nhất một kết quả “có ý nghĩa” giả là 1 − 0.95¹⁰ ≈ 40%. Vì vậy, một kết quả t = 2.3 trong mười lần thử là bằng chứng yếu. Nó thấp hơn ngưỡng t > 3 mà Harvey, Liu & Zhu đề xuất cho kết quả tìm kiếm, và cần được kiểm tra trên dữ liệu mới trước khi tin. Giải thích: ngưỡng ý nghĩa phải tăng theo số phép thử. t = 2 dành cho một phép thử đã lên kế hoạch trước, không phải cho người thắng của một cuộc tìm kiếm.
Đọc thêm:
- Harvey, Liu & Zhu (2016), “…and the Cross-Section of Expected Returns”, Review of Financial Studies 29(1). Bản working paper miễn phí trên SSRN (cũng là NBER w20592).
- Bailey, Borwein, López de Prado & Zhu (2014), “Pseudo-Mathematics and Financial Charlatanism”, Notices of the AMS 61(5). Lập luận về độ dài backtest tối thiểu.
- White (2000), “A Reality Check for Data Snooping”, Econometrica 68(5). Phép kiểm định thống kê kinh điển cho bài toán “tốt nhất trong nhiều”.
Kiến thức nền: M7.10 (kiểm chứng phương pháp trước khi tin dùng) · Bài tiếp theo: M10.02 Chi phí & trượt giá tính bằng tick · Liên quan: M10.04 (Deflated Sharpe Ratio), M10.06 (kỷ luật lockbox)
Nội dung mang tính giáo dục — không phải lời khuyên tài chính. Giao dịch hợp đồng tương lai có rủi ro thua lỗ đáng kể.
Lưu trên trình duyệt này (đồng bộ tài khoản sẽ có khi ra mắt).