Điểm chính
- Backtest chỉ trả lời các quy tắc sẽ làm gì theo những giả định bạn đã chọn.
- Overfitting tăng theo mỗi thiết lập điều chỉnh được; hãy ưu tiên quy tắc đơn giản và các vùng bằng phẳng ổn định.
- Lỗi sống sót và look-ahead thổi phồng kết quả mà không có cảnh báo nào dễ thấy.
- Hãy đưa chi phí thực tế vào, dùng dữ liệu out-of-sample và forward-test trước khi bỏ vốn thật.
Backtest là việc chạy lại một quy tắc giao dịch trên dữ liệu lịch sử để xem nó đã hoạt động ra sao. Đó là một bộ lọc hữu ích, nhưng cũng rất dễ bị đánh lừa. Nhiều đường cong vốn ấn tượng đến từ cách thiết lập bài kiểm tra chứ không phải từ ý tưởng. Biết các cạm bẫy phổ biến giúp bạn phân biệt kết quả triển vọng với kết quả chỉ để làm đẹp mắt.
Backtest nói được gì và không nói được gì
Backtest trả lời một câu hỏi hẹp: với các quy tắc này, dữ liệu này và những giả định này về chi phí và khớp lệnh, điều gì đã xảy ra? Nó không thể nói điều gì sẽ xảy ra. Tốt nhất, nó có thể loại bỏ các ý tưởng yếu với chi phí thấp và cho một bức tranh sơ bộ về mức độ thường xuyên phương pháp thua lỗ, mức sụt giảm vốn (drawdown) sâu đến đâu và nhạy cảm thế nào với các thiết lập.
Vì bạn chọn dữ liệu, quy tắc và giả định, mỗi lựa chọn đều là cơ hội để thiên kiến len vào. Năm cạm bẫy dưới đây giải thích phần lớn khoảng cách giữa kết quả backtest và kết quả thực.
| Cạm bẫy | Điều gì sai | Kiểm tra nhanh |
|---|---|---|
| Overfitting | Quy tắc được tinh chỉnh cho đến khi khớp với nhiễu trong quá khứ | Một thay đổi nhỏ trong thiết lập có phá hỏng kết quả không? |
| Thiên kiến người sống sót | Dữ liệu chỉ gồm các tài sản còn tồn tại | Bộ dữ liệu có gồm các công cụ đã bị hủy niêm yết hoặc sáp nhập không? |
| Thiên kiến look-ahead | Bài kiểm tra dùng thông tin chưa có sẵn | Giá trị này có thể đã được biết vào thời điểm vào lệnh không? |
| Chi phí bị bỏ qua | Spread, hoa hồng, trượt giá (slippage) và swap bị bỏ sót | Kết quả có còn dương khi chi phí thực tế được nhân đôi không? |
| Data snooping | Thử nhiều ý tưởng và chỉ giữ ý tưởng tốt nhất | Đã thử bao nhiêu biến thể trước khi có biến thể này? |
Overfitting: tinh chỉnh theo nhiễu
Overfitting, còn gọi là curve fitting, nghĩa là uốn nắn chiến lược quá sát dữ liệu quá khứ đến mức nó nắm bắt những đặc điểm ngẫu nhiên thay vì hành vi lặp lại được. Quy tắc càng có nhiều thiết lập điều chỉnh được thì càng dễ mắc lỗi này.
Đây là một ví dụ về quy mô. Giả sử bạn thử độ dài đường trung bình động từ 5 đến 100 với bước 5 (20 giá trị), kích thước cắt lỗ theo 20 bước và 10 mục tiêu chốt lời khác nhau. Đó là 20 × 20 × 10 = 4.000 tổ hợp. Ngay cả khi mỗi tổ hợp chỉ là tung đồng xu không có lợi thế thực sự, vẫn có một số ít trông xuất sắc chỉ nhờ may mắn. Chọn người thắng cuộc trong 4.000 lần thử ngẫu nhiên chỉ cho bạn biết tổ hợp nào may mắn nhất, không phải tổ hợp nào tốt nhất.
Thiên kiến người sống sót: những kẻ thua bị bỏ sót
Thiên kiến người sống sót xuất hiện khi bộ dữ liệu chỉ chứa các tài sản còn tồn tại đến hôm nay. Những công ty phá sản, bị hủy niêm yết hoặc bị thâu tóm trong thua lỗ lặng lẽ vắng mặt, và các khoản lỗ của chúng cũng vậy. Kiểm tra một quy tắc chọn cổ phiếu trên danh sách các thành viên chỉ số hiện nay là một ví dụ kinh điển.
Các con số minh họa cho thấy tác động. Giả sử có 100 cổ phiếu vào đầu giai đoạn mười năm. Tám mươi cổ phiếu sống sót và mang lại trung bình 10% mỗi năm. Hai mươi cổ phiếu bị hủy niêm yết và lỗ trung bình 15% mỗi năm. Cả nhóm trung bình (80 × 10 + 20 × −15) ÷ 100 = 5% mỗi năm. Một bài kiểm tra chỉ dùng các cổ phiếu sống sót báo cáo 10%, gấp đôi sự thật. Vấn đề tương tự có thể ảnh hưởng đến các quỹ, các hệ thống giao dịch có hồ sơ công bố và thậm chí các cặp tiền tệ đã bị gỡ khỏi nền tảng.
Thiên kiến look-ahead: vô tình biết trước tương lai
Thiên kiến look-ahead nghĩa là bài kiểm tra dùng dữ liệu không thể có tại thời điểm ra quyết định. Lỗi này thường rất tinh vi. Ví dụ gồm mua ở giá đóng cửa của một thanh nến sau khi tín hiệu được tính từ chính giá đóng cửa đó, dùng giá cao nhất hoặc thấp nhất trong ngày để đặt lệnh sớm hơn trong ngày, hoặc làm việc với số liệu kinh tế ở dạng đã điều chỉnh sau này thay vì phiên bản được công bố vào thời điểm đó.
- Vào lệnh ở giá mở cửa của thanh nến kế tiếp, không phải trên thanh tạo ra tín hiệu, trừ khi bạn thực sự có thể hành động ở giá đóng cửa.
- Kiểm tra rằng mọi chỉ báo chỉ dùng giá trị quá khứ, đặc biệt là các chỉ báo tự tạo hoặc chỉ báo repainting, vốn thay đổi đồ thị lịch sử của chúng sau sự việc.
- Dùng dữ liệu point-in-time cho các yếu tố cơ bản và cho thành viên chỉ số.
- Hãy hoài nghi với bất kỳ kết quả nào trông quá mượt. Giao dịch thực hiếm khi tạo ra đường cong hoàn toàn đều đặn.
Chi phí, khớp lệnh và cỡ mẫu
Một quy tắc có lợi thế nhỏ mỗi lệnh có thể biến mất khi cộng thêm chi phí. Các phương pháp trong ngày với nhiều lệnh chịu ảnh hưởng nhiều nhất, vì mỗi lệnh lại trả spread một lần nữa. Hãy mô hình hóa chi phí một cách thận trọng, dùng spread thực tế theo thời điểm trong ngày, và cộng thêm trượt giá cho các lệnh dừng, vốn thường khớp ở mức giá tệ hơn mức đặt trong lúc thị trường biến động nhanh.
Cỡ mẫu cũng quan trọng không kém. Một backtest với 25 lệnh chỉ là giai thoại. Nhiều người trong nghề tìm ít nhất vài trăm lệnh, trải đều qua các điều kiện thị trường khác nhau, trước khi tin vào các thống kê. Điều kiện cũng quan trọng: bài kiểm tra chỉ chạy qua một xu hướng tăng đều kéo dài nói rất ít về thị trường đi ngang hoặc giảm.
Quy trình kiểm chứng trung thực hơn
- Viết quy tắc trước khi kiểm tra. Ghi giả thuyết và các quy tắc ra giấy, kể cả số thiết lập bạn sẽ thay đổi. Điều này hạn chế mức độ bạn có thể điều chỉnh sau khi thấy kết quả.
- Chia dữ liệu. Điều chỉnh quy tắc trên giai đoạn trước, gọi là in-sample, và giữ nguyên giai đoạn sau, gọi là out-of-sample. Cách chia phổ biến là khoảng 70% để xây dựng và 30% để kiểm tra.Mẹo: Chỉ nhìn dữ liệu được giữ lại một lần. Nhìn lặp lại sẽ biến nó thành dữ liệu in-sample.
- Thử áp lực các thiết lập. Nhích từng tham số lên và xuống. Nếu kết quả thay đổi mạnh, quy tắc đó mong manh.
- Thêm chi phí thực tế. Đưa vào spread, hoa hồng, swap và trượt giá, rồi nhân đôi chi phí và xem còn lại gì không.
- Walk-forward. Điều chỉnh lại trên một cửa sổ trượt và kiểm tra trên đoạn chưa thấy kế tiếp, lặp lại xuyên suốt dữ liệu. Cách này mô phỏng việc bạn thực sự phải điều chỉnh quy tắc như thế nào.
- Forward-test với quy mô nhỏ. Chạy các quy tắc trên tài khoản demo hoặc với khối lượng tối thiểu trong một số lượng lệnh đáng kể và so sánh hành vi thực tế với backtest.
Câu hỏi thường gặp
Tôi cần bao nhiêu lệnh trong một backtest?
Không có ngưỡng cố định, nhưng vài chục lệnh là quá ít. Nhiều lệnh hơn làm giảm nhiễu trong thống kê, và việc bao quát các điều kiện thị trường khác nhau cũng quan trọng không kém con số thô.
Kiểm tra out-of-sample có đủ để chứng minh chiến lược hiệu quả không?
Không. Nó giảm rủi ro overfitting nhưng không loại bỏ được, nhất là khi bạn thử nhiều ý tưởng và giữ lại ý tưởng vượt qua. Nó cũng không thể nắm bắt những thay đổi trong tương lai của thị trường.
Backtest khác forward test ở điểm nào?
Backtest dùng dữ liệu quá khứ, còn forward test chạy các quy tắc trên dữ liệu mới khi nó xuất hiện, trên tài khoản demo hoặc với khối lượng thực nhỏ. Forward test làm lộ các vấn đề về thực thi và chi phí mà lịch sử che giấu.
Tôi có thể tin backtest do nhà cung cấp công bố không?
Hãy coi đó là quảng cáo cho đến khi bạn biết nguồn dữ liệu, chi phí, số biến thể đã thử và kết quả là thực hay mô phỏng. Một hồ sơ giao dịch thực được kiểm toán độc lập có giá trị hơn mọi mô phỏng.