Một backtest có thể tái lập hoàn hảo đôi khi kém đáng tin hơn một backtest có kết quả dao động đôi chút. Tính lặp lại chứng minh rằng bạn có thể nhận được cùng một đáp án hai lần; nó chẳng nói lên điều gì về việc đáp án đó có phụ thuộc vào một bản chụp dữ liệu tùy ý, một lỗi kỳ lạ của thư viện hay một giá trị mặc định ẩn hay không.
Nghe có vẻ như đang phản đối khả năng tái lập, nhưng không phải vậy. Hãy cố định lần chạy để có thể giải thích nó. Sau đó, chủ động thay đổi những giả định vốn không nên quyết định kết quả. Bước đầu giúp kết quả có thể kiểm tra; bước sau cho biết kết quả có ý nghĩa gì không.
Một backtest có thể tái lập thực sự xác lập được điều gì?
Nếu cùng một đoạn mã, dữ liệu, cấu hình và seed ngẫu nhiên tạo ra cùng các giao dịch và chỉ số, bạn đã kiểm soát được một nguồn gây nhiễu quan trọng. Bạn có thể so sánh “cải thiện” của một agent với lần chạy trước đó. Có thể tách riêng việc sửa lỗi khỏi việc thay đổi biểu phí. Đồng nghiệp có thể kiểm tra cùng sổ giao dịch và tìm thấy cùng các lệnh khớp.
Nhưng kết quả phụ thuộc vào tất cả những gì bạn đã cố định. Hãy xét một chiến lược crypto có tệp lịch sử chứa các nến 1 phút. Bạn lưu hash của tệp, ghim phiên bản mã và lần chạy nào cũng cho Sharpe 1.4. Nếu sau này nhà cung cấp dữ liệu hiệu chỉnh một số nến, tính tái lập hoàn hảo đó vẫn chỉ mô tả tệp cũ. Nó không cho biết tín hiệu có còn đứng vững với lịch sử đã hiệu chỉnh hay không, hoặc liệu các nến ấy có sẵn ở dạng đó vào thời điểm tương ứng hay không.
Hash rất hữu ích: nó làm lộ rõ sự phụ thuộc. Nhưng nó không chứng minh rằng sự phụ thuộc ấy vô hại.
Cố định lần chạy; kiểm nghiệm phát hiện
Tôi thường tách riêng hai câu hỏi. Ta có thể tái dựng chính xác lần chạy này không? Và kết luận nghiên cứu có đứng vững trước những thay đổi hợp lý không? Câu hỏi thứ nhất cần một hồ sơ bất biến; câu hỏi thứ hai cần các phép thử thay đổi có kiểm soát, mỗi lần một yếu tố.
| Cần ghi lại | Thay đổi sau đó | Có thể phát hiện điều gì |
|---|---|---|
| Phiên bản dữ liệu thô và checksum | Bản sửa đổi của nhà cung cấp hoặc một nguồn thứ hai | Sự phụ thuộc vào giá trị đã hiệu chỉnh hoặc đặc thù của nhà cung cấp |
| Commit mã và phiên bản gói thư viện | Cách triển khai tương đương về mặt số học | Độ nhạy với thứ tự tính toán, làm tròn hoặc thư viện |
| Phí, funding và giả định khớp lệnh | Khoảng chi phí có cơ sở hợp lý | Liệu lợi thế mỏng có cần điều kiện khớp lệnh thuận lợi bất thường hay không |
| Tập tài sản và thành phần tại từng thời điểm | Các quy tắc thay thế để xác định thị trường đủ điều kiện | Sự phụ thuộc vào quyết định đưa vào hoặc loại ra |
Ví dụ, giả sử một chiến lược hợp đồng tương lai cho thấy lợi nhuận vượt trội đã thường niên hóa là 8% trong lần mô phỏng cơ sở. Hãy chạy lại với chi phí taker cao hơn 25%, chuyển funding sang kỳ quyết toán tiếp theo được quan sát, rồi lần lượt loại bỏ hai yếu tố đóng góp lớn nhất. Đây không phải là ba cách cải thiện mô hình. Đó là các phép thăm dò: mỗi phép thử đặt câu hỏi liệu một chi tiết hợp lý có đang gánh lấy kết quả nổi bật hay không.
Hãy giữ riêng từng phép thử. Nếu bạn đồng thời đổi dữ liệu, biểu phí và thời điểm khớp lệnh, kết quả kém đi sẽ khó giúp bạn chẩn đoán nguyên nhân. Còn nếu một phép thử phi thực tế, hãy ghi rõ đó là kịch bản căng thẳng thay vì trình bày nó như kết quả có khả năng xảy ra nhất.
Đừng nhầm sự giống hệt từng byte với độ chính xác về số học
Một số phép tính nhạy với thứ tự thực hiện. Phép cộng số dấu phẩy động không có tính kết hợp, vì vậy cộng nhiều giá trị P&L nhỏ theo thứ tự khác có thể làm thay đổi vài chữ số cuối. Phép rút gọn song song, phần cứng và phiên bản thư viện đều có thể ảnh hưởng đến đầu ra chính xác. Thường thì điều này vô hại; đôi khi một thay đổi số học rất nhỏ làm đảo ngưỡng, đổi vị thế và khiến phần còn lại của mô phỏng đi theo một hướng khác.
Vì vậy, tôi sẽ lưu cả hiện vật chính xác lẫn ngưỡng sai số dùng để so sánh. Hãy ghi sổ giao dịch, chứ đừng chỉ lưu Sharpe cuối cùng. Trước tiên hãy so sánh quyết định và dòng tiền, sau đó mới so sánh các chỉ số trong phạm vi sai số đã nêu. Nếu chênh lệch 1 xu làm thay đổi việc gửi lệnh, hãy kiểm tra riêng ranh giới đó.
Hồ sơ lần chạy hữu ích cần có danh tính dữ liệu và mã, cấu hình, seed ngẫu nhiên, môi trường thực thi cùng đủ đầu ra trung gian để truy ngược chỉ số về các lệnh khớp và dòng tiền. Chỉ có điểm số cuối cùng thì chưa phải hiện vật nghiên cứu có thể tái lập.
Khi nào biến động chỉ là nhiễu, khi nào là phát hiện
Không phải con số nào thay đổi cũng là khủng hoảng. Một chỉ số dao động nhẹ do thứ tự rút gọn khác có thể không làm thay đổi giao dịch. Một giao dịch thay đổi sát ngưỡng có thể đáng để xem xét. Nếu chiến lược mất phần lớn kết quả khi một nhà cung cấp hiệu chỉnh một đoạn nhỏ trong dữ liệu lịch sử, ta đã biết thêm điều gì đó về độ mong manh của chính chiến lược, dù lần chạy ban đầu vẫn có thể tái lập hoàn hảo.
Những người chỉ trích các phép kiểm tra độ vững đúng ở một điểm: ta rất dễ liên tục thay đổi giả định cho đến khi chiến lược mình ưa thích trông có vẻ vững vàng, hoặc bác bỏ một kết quả đáng tin chỉ vì một kịch bản cố tình quá cực đoan làm nó thất bại. Hãy xác định trước các biến thể hợp lý, báo cáo toàn bộ kết quả và phân biệt các phương án thông thường với kịch bản căng thẳng. Sau đó, giữ nguyên kết quả cơ sở để nhà nghiên cứu khác có thể tái lập chính xác những gì bạn đã quan sát.
Khả năng tái lập cho bạn một điểm xuất phát đáng tin cậy. Câu hỏi hữu ích tiếp theo là: những phần nào của đáp án vẫn giữ nguyên khi thế giới quanh lần chạy ấy thay đổi theo những cách bạn có thể dự liệu hợp lý?
← Tất cả bài viết


