
Kiểm thử walk-forward cho bot tiền mã hóa: Một ví dụ thực tế
Chọn thiết lập trên dữ liệu trước đó, cố định chúng cho giai đoạn sau và giữ nguyên đường đi vốn chủ sở hữu. Thực hiện qua việc chia tách ngày, quy tắc lựa chọn, lãi kép và quyết định về hàng tồn kho (inventory) mở.
Bạn kiểm thử hai mươi cấu hình bot trên cùng một biểu đồ và chọn cấu hình có lợi nhuận cao nhất. Các thiết lập của nó giờ đây đã phản ánh thông tin từ toàn bộ giai đoạn đó. Việc chạy lại nó trên cùng các ngày sẽ không mang lại bất kỳ bằng chứng mới nào.
Kiểm thử walk-forward liên tục lựa chọn các thiết lập trên một giai đoạn huấn luyện trước đó, cố định chúng cho một giai đoạn kiểm thử sau đó và kết hợp kết quả từ các giai đoạn kiểm thử này. Phương pháp này giúp bạn đánh giá một quy trình lựa chọn qua nhiều điều kiện thay đổi mà vẫn đảm bảo không sử dụng giá tương lai trong từng quyết định lựa chọn.
Đối với các chiến lược GRID và DCA, còn có một vấn đề kế toán bổ sung: coin và vị thế mở có thể tồn tại qua ranh giới giữa các giai đoạn. Một bài kiểm thử hữu ích cần có quy tắc xử lý cho những tài sản nắm giữ này trước khi kết quả đầu tiên xuất hiện.
Huấn luyện, kiểm thử và demo forward là những khái niệm khác nhau
| Thuật ngữ | Bạn làm gì | Nó có thể cho thấy điều gì |
|---|---|---|
| Huấn luyện trong mẫu | So sánh các thiết lập được phép trên một giai đoạn lịch sử trước đó | Ứng viên mà quy tắc lựa chọn của bạn sẽ chọn |
| Kiểm thử ngoài mẫu trên dữ liệu lịch sử | Chạy các thiết lập đã chọn trên giai đoạn tiếp theo mà không điều chỉnh lại | Cách lựa chọn đó hoạt động trên dữ liệu lịch sử sau này |
| Chuỗi walk-forward | Lặp lại huấn luyện và kiểm thử khi thời gian tiến lên | Hành vi tổng hợp của quy trình lựa chọn |
| Demo forward | Đóng băng một cấu hình và quan sát dữ liệu thị trường mới với vốn ảo | Liệu quy trình làm việc và hành vi có khớp với kế hoạch của bạn trong một giai đoạn mới hay không |
Hướng dẫn backtest tổng quan đề cập đến những hạn chế rộng hơn của mô phỏng dữ liệu lịch sử. Walk-forward bổ sung việc chia nhỏ thời gian lặp lại; nó không loại bỏ các giả định về thực thi, lỗi dữ liệu hoặc sự cám dỗ điều chỉnh quy tắc sau khi đã xem kết quả.
Tài liệu walk-forward của QuantConnect mô tả cách lựa chọn tham số trên các cửa sổ trượt và sự đánh đổi về tần suất tối ưu hóa. Việc tái tối ưu hóa thường xuyên hơn sẽ tạo ra nhiều quyết định hơn và nhiều cơ hội hơn để phù hợp với nhiễu gần đây.

Viết ra giao thức kiểm thử trước khi so sánh kết quả
Chọn thị trường, khung dữ liệu, múi giờ và chính xác các thiết lập ứng viên. Giữ danh sách ứng viên đủ nhỏ để có thể kiểm tra từng trường hợp. Việc kiểm thử ba cấu hình đã được xác định rõ ràng sẽ dễ giải thích hơn nhiều so với việc tìm kiếm qua hàng nghìn tổ hợp không được ghi chép lại.
Cũng cần chỉ rõ:
- Độ dài giai đoạn huấn luyện và giai đoạn kiểm thử, bao gồm cả các mốc thời gian ranh giới chính xác.
- Chỉ số lựa chọn, yêu cầu bằng chứng tối thiểu và quy tắc phân xử hòa.
- Phí, trượt giá, kích thước tối thiểu, làm tròn và mô hình khớp lệnh.
- Cách xử lý tài sản nắm giữ và lệnh mở tại mỗi ranh giới.
- Tài sản khởi đầu của chỉ số tham chiếu và các quy tắc cân bằng lại.
Ví dụ, một giao thức kiểm thử giả định có thể chọn ứng viên có lợi nhuận ròng khi huấn luyện cao nhất trong số ba ứng viên mà mức sụt giảm vốn khi huấn luyện không vượt quá giới hạn đã đặt ra. Nếu không có ứng viên nào đáp ứng, chiến lược sẽ giữ tiền mặt trong tháng kiểm thử tiếp theo. Hãy xác định giới hạn mức sụt giảm vốn và phương án dự phòng trước khi xem xét các tháng kiểm thử.
Giới hạn này là một ràng buộc trong quy tắc lựa chọn, không phải là cam kết về mức sụt giảm vốn trong tương lai. Một chiến lược vượt qua giới hạn này ở giai đoạn huấn luyện vẫn có thể vượt quá nó ở giai đoạn kiểm thử.
Tách các mốc thời gian mà không tính trùng tháng kiểm thử
Sử dụng ba tháng cho giai đoạn huấn luyện và một tháng cho giai đoạn kiểm thử trong lịch rolling minh họa này. Mọi mốc thời gian dưới đây đều theo UTC, và mỗi khoảng thời gian bao gồm ngày bắt đầu nhưng không bao gồm ngày kết thúc.
| Vòng | Giai đoạn huấn luyện | Giai đoạn kiểm thử chưa bị động đến |
|---|---|---|
| 1 | 1 Thg 1 đến 1 Thg 4 | 1 Thg 4 đến 1 Thg 5 |
| 2 | 1 Thg 2 đến 1 Thg 5 | 1 Thg 5 đến 1 Thg 6 |
| 3 | 1 Thg 3 đến 1 Thg 6 | 1 Thg 6 đến 1 Thg 7 |
| 4 | 1 Thg 4 đến 1 Thg 7 | 1 Thg 7 đến 1 Thg 8 |
Các giai đoạn huấn luyện bị chồng lặp. Bốn giai đoạn kiểm thử thì không. Tháng 4 có thể trở thành dữ liệu huấn luyện lịch sử cho vòng tiếp theo sau khi đã kết thúc; bạn không thể sử dụng đường đi giá của tháng 4 để chọn các thiết lập được kiểm thử ngay trên chính tháng 4 đó.
Lưu lại lựa chọn được thực hiện tại mỗi mốc ranh giới. Một bản ghi đầy đủ bao gồm cả các ứng viên bị loại và các chỉ số huấn luyện của họ, để một người kiểm tra khác có thể tái hiện lý do vì sao ứng viên chiến thắng được chọn.
Một vòng đầu tiên hoàn chỉnh
Bảng sau đây chứa giá trị minh họa phục vụ giảng dạy. Đây không phải là kết quả backtest thực tế hay quan sát thị trường. Giả sử quy tắc lựa chọn được viết ra yêu cầu mức sụt giảm vốn khi huấn luyện không vượt quá 10%, sau đó chọn lợi nhuận ròng khi huấn luyện cao nhất. Tất cả các lợi nhuận đều đã trừ chi phí theo mô hình.
| Ứng viên | Lợi nhuận khi huấn luyện | Mức sụt giảm vốn tối đa khi huấn luyện | Đủ điều kiện? |
|---|---|---|---|
| A | +5,0% | 8,0% | Có |
| B | +8,0% | 15,0% | Không |
| C | +4,0% | 6,0% | Có |
Giao thức kiểm thử chọn A. Lợi nhuận cao hơn của ứng viên B không vượt qua được ràng buộc mức sụt giảm vốn đã đặt ra. Ứng viên C vẫn được ghi nhận dù thua trong so sánh.
Đóng băng A cho tháng Tư. Giả sử ví dụ minh họa gán cho nó lợi nhuận ròng tháng Tư là −2%. Giá trị đó sẽ được ghi vào hồ sơ ngoài mẫu. Chuyển sang C chỉ vì nó sẽ xử lý tháng Tư tốt hơn đồng nghĩa với việc tái sử dụng tháng kiểm thử trong quyết định.
Tại mốc tháng Năm, giao thức kiểm thử ban đầu sẽ so sánh lại tất cả các ứng viên bằng dữ liệu từ tháng Hai đến tháng Tư. Giao thức có thể chọn C cho tháng Năm nếu C thắng trong lần so sánh huấn luyện mới này. Đây là một cập nhật đã được lên kế hoạch, sử dụng thông tin có sẵn tại thời điểm đó.
Kết hợp các giai đoạn kiểm thử sau thành một đường đi vốn chủ sở hữu
Giả sử các lựa chọn tiếp theo và lợi nhuận ròng khi kiểm thử như sau. Những giá trị này tiếp tục ví dụ kế toán giả định trước đó và không xuất phát từ một mô phỏng chiến lược thực tế.
| Tháng kiểm thử | Cấu hình được chọn | Lợi nhuận ròng khi kiểm thử | Vốn chủ sở hữu ban đầu | Vốn chủ sở hữu cuối kỳ |
|---|---|---|---|---|
| Tháng 4 | A | −2,0% | $1.000,00 | $980,00 |
| Tháng 5 | C | +1,0% | $980,00 | $989,80 |
| Tháng 6 | A | −3,0% | $989,80 | $960,11 |
| Tháng 7 | C | +2,0% | $960,11 | $979,31 |
Các giá trị cuối kỳ chưa làm tròn là 980, 989,8, 960,106 và 979,30812. Lợi nhuận tổng hợp là:
(1 − 0,02) × (1 + 0,01) × (1 − 0,03) × (1 + 0,02) − 1 = −2,069188%.
Cộng bốn tỷ lệ phần trăm lại được −2%, con số này khác với kết quả lãi kép. Hãy chuyển vốn chủ sở hữu cuối kỳ của giai đoạn trước sang giai đoạn tiếp theo và chỉ làm tròn số khi hiển thị.
Các quan sát vào cuối tháng cho thấy mức sụt giảm vốn sâu nhất khoảng 3,99% so với vốn chủ sở hữu ban đầu $1.000,00. Vốn chủ sở hữu trong tháng có thể đã giảm sâu hơn nữa, vì vậy các quan sát theo tháng không thể xác định được mức sụt giảm vốn tối đa thực sự.
Trong ví dụ kế toán này, giả sử mọi lần đặt lại ranh giới đều đã được tính vào các mức lợi nhuận ròng hàng tháng đã nêu. Một kiểm thử lại thực tế phải tự tính các lần đặt lại đó dựa trên tài sản nắm giữ và mô hình khớp lệnh của nó.
Quyết định cách xử lý hàng tồn kho (inventory) GRID hoặc DCA đang mở
Giả sử một bot kết thúc tháng 4 với 0,01 BTC và 400 USDT. Ở mức giá BTC giả định là $50.000, vốn chủ sở hữu của bot là 900 USDT. Khi sang tháng mới, bot sẽ không được khôi phục về mức vốn chủ sở hữu ban đầu là 1.000 USDT.
Chọn một chính sách ranh giới nhất quán:
Chuyển tiếp tài sản nắm giữ. Chuyển các đồng coin thực tế, tiền mặt và trạng thái vị thế sang giai đoạn kiểm thử tiếp theo. Xác định rõ việc thay đổi thiết lập sẽ ảnh hưởng như thế nào đến các lệnh mở và hàng tồn kho (inventory) hiện có. Trình mô phỏng phải hỗ trợ quá trình chuyển tiếp này; nếu chỉ bắt đầu một backtest mới với tài sản mặc định thì có thể không phản ánh đúng thực tế.
Đóng và thiết lập lại. Hủy các lệnh mở, bán hoặc đóng các vị thế còn lại bằng mô hình thực thi đã xác định, trừ chi phí và bắt đầu giai đoạn tiếp theo với vốn chủ sở hữu còn lại. Nếu cấu hình tiếp theo cần hàng tồn kho (inventory) đồng coin ban đầu, hãy mô phỏng cả việc mua vào và chi phí liên quan.
Cả hai chính sách đều có thể mô tả một quy trình vận hành thực tế. Việc trộn lẫn chúng sau khi đã xem kết quả có thể che giấu thua lỗ. Hãy giữ nguyên chính sách nhất quán trong chỉ số tham chiếu khi phù hợp và thể hiện tác động của một chính sách khác như một kiểm tra độ nhạy riêng biệt được gắn nhãn rõ ràng.
Kiểm tra mô hình khớp lệnh và chỉ số tham chiếu
Một cây nến chạm đến mức giá giới hạn không chứng minh rằng lệnh của bạn có thể đã được khớp đầy đủ. Dữ liệu nến cũng có thể che giấu việc mức mua hay mức bán được chạm tới trước. Các thiết lập GRID dày đặc có thể trông hấp dẫn trong một mô phỏng giả định thứ tự khớp lệnh trong thanh nến theo hướng có lợi.
Ghi lại cách mô hình xử lý các lệnh khớp một phần, thứ tự trong hàng đợi, chênh lệch giá và các khoảng trống giá. Lặp lại phân tích với chi phí hoặc mức độ khớp lệnh kém thuận lợi hơn nếu công cụ hỗ trợ. Một kết luận biến mất chỉ sau một thay đổi nhỏ về chi phí cần được xem xét kỹ lưỡng.
Sử dụng cùng ngày, vốn chủ sở hữu ban đầu và tài sản khởi đầu để so sánh. Một bot bắt đầu với một nửa bằng coin và một nửa bằng tiền mặt thì không thể so sánh trực tiếp với chỉ số tham chiếu bắt đầu đầu tư toàn bộ, trừ khi bạn giải thích sự khác biệt về phân bổ đó.
Danh sách kiểm tra kết quả backtest rất hữu ích để rà soát báo cáo kết quả. Hãy giữ lại đường đi theo tháng, hoạt động giao dịch, mức độ phơi nhiễm và chi phí cùng với tổng lợi nhuận.
Giữ phần đánh giá cuối cùng tách biệt với thiết kế giao thức kiểm thử
Các lần kiểm thử walk-forward lặp lại cũng có thể trở thành quá trình huấn luyện. Nếu bạn xem xét cả bốn tháng kiểm thử, thay đổi danh sách ứng viên và chạy lại cùng một giai đoạn, phương pháp đã cập nhật sẽ sử dụng thông tin từ những tháng đó.
Ghi lại bản chỉnh sửa đó và giữ nguyên lịch sử chưa bị tác động hoặc dữ liệu forward mới cho lần đánh giá tiếp theo. Việc gắn nhãn mới trên cùng các ngày không khiến chúng trở thành dữ liệu chưa từng thấy.
Bản ghi có thể tải về nên đơn giản: mỗi vòng là một dòng với ngày huấn luyện, phiên bản ứng viên, các chỉ số lựa chọn, cấu hình được chọn, ngày kiểm thử, mô hình chi phí, chính sách biên và kết quả ròng khi kiểm thử. Giữ lại các báo cáo gốc và tham chiếu dữ liệu bên cạnh. Ví dụ dưới đây bao gồm bảng minh họa dưới dạng tệp CSV có thể xuất để thực hành kế toán.
Tiếp theo các bước kiểm tra lịch sử bằng một lần chạy demo cố định
Thực hành kế toán theo ví dụ
Tải xuống bốn dòng dữ liệu kiểm thử giả định cho bốn tháng, bao gồm vốn chủ sở hữu ban đầu và cuối kỳ. Đây là các giá trị minh họa được tạo ra cho mục đích giảng dạy, không phải báo cáo backtest.
Quan sát cấu hình của bạn trong demo Bitsgap
Sau khi hoàn thành phân tích lịch sử bằng một công cụ hỗ trợ các giai đoạn và phương pháp kế toán cần thiết, hãy cố định một cấu hình bot được hỗ trợ trong demo Bitsgap. Ghi lại tài sản khởi đầu và các thiết lập của bot, sau đó quan sát hoạt động của nó với tiền ảo và giá thị trường hiện tại. Demo là một bài thực hành forward riêng biệt; quy trình này không giả định có sẵn bộ tối ưu hóa walk-forward tích hợp.
**Câu hỏi thường gặp**
Kiểm thử walk-forward có ngăn chặn được hiện tượng overfitting không?
Nó giảm bớt một nguồn thiên lệch trong mẫu bằng cách tách riêng từng cửa sổ lựa chọn khỏi giai đoạn kiểm thử sau đó. Việc thay đổi giao thức kiểm thử nhiều lần, rò rỉ dữ liệu, khớp lệnh phi thực tế và báo cáo có chọn lọc vẫn có thể dẫn đến kết quả sai lệch.
Các giai đoạn nên kéo dài bao lâu?
Không có độ dài cố định cho mọi trường hợp. Tần suất giao dịch, dữ liệu lịch sử sẵn có và phương pháp lựa chọn sẽ quyết định mỗi giai đoạn chứa bao nhiêu bằng chứng. Việc chia ba tháng và một tháng trong ví dụ này chỉ nhằm mục đích minh họa.
Tôi có thể cộng dồn lợi nhuận từ các giai đoạn kiểm thử riêng biệt không?
Hãy cộng dồn lợi nhuận tuần tự khi mỗi giai đoạn bắt đầu với vốn chủ sở hữu cuối kỳ của giai đoạn trước. Đồng thời, hãy giữ nguyên đường đi vốn chủ sở hữu, chi phí và mức độ tiếp xúc; chỉ nhìn vào phần trăm cuối cùng sẽ che giấu những khác biệt quan trọng.
Demo forward có giống với kiểm thử ngoài mẫu trên dữ liệu lịch sử không?
Một kiểm thử ngoài mẫu trên dữ liệu lịch sử sử dụng dữ liệu lịch sử về sau trong môi trường mô phỏng. Demo forward quan sát dữ liệu mới với vốn ảo. Cả hai đều có giới hạn, và không cái nào đảm bảo khớp lệnh thực tế hoặc lợi nhuận trong tương lai.