Vào 10:07 một ngày thứ Ba, tác tử nghiên cứu của chúng tôi phát hiện một thiết lập tăng giá ngắn hạn ở một ETF chỉ số. Tín hiệu cơ sở khá bình thường: giá đã vượt trở lại đường trung bình 20 nến, biến động thực tế đang dịu xuống, và phiên tiếp theo có lịch công bố dữ liệu kinh tế vĩ mô. Giao dịch được đề xuất là một call spread với thời hạn đến đáo hạn khoảng hai tuần.
Backtest đánh giá cao giao dịch này. Chiến lược chạy thử thì không đặt lệnh. Khi đối chiếu các lệnh, chúng tôi thấy dấu thời gian tín hiệu trùng khớp và giá tài sản cơ sở chỉ chênh nhau vài xu. Nhưng hợp đồng lại khác: backtest mua hợp đồng đáo hạn vào thứ Sáu trông có vẻ tốt nhất trong chuỗi dữ liệu lịch sử; quy trình chạy thử chọn kỳ đáo hạn được niêm yết tiếp theo, muộn hơn một tuần.
Sai lệch đó bắt nguồn từ một phép nối lịch. Chúng tôi coi “số ngày đến đáo hạn” là thuộc tính của một ngày, rồi chọn hợp đồng có ngày đáo hạn gần nhất với mục tiêu. Trong dữ liệu lịch sử, lịch đáo hạn có một kỳ hạn tuần được bổ sung sau ngày đang kiểm tra. Backtest đã dùng một hợp đồng từ tương lai theo cách thoạt nhìn như một tiện ích vô hại.
Ban đầu, chúng tôi nghi có lỗi múi giờ. Ngày đáo hạn quyền chọn rất dễ gây ra lỗi kiểu này: phiên giao dịch kết thúc ở New York, dấu thời gian từ sàn có thể được lưu theo UTC, và ngày nửa đêm có thể bị lệch khi một quy trình xử lý chuyển đổi kiểu dữ liệu thiếu cẩn trọng. Chúng tôi đã kiểm tra. Dấu thời gian chính xác. Hợp đồng đơn giản là chưa tồn tại trong tập hợp lịch sử vào ngày thứ Ba đó.
Bài học đầu tiên là: chuỗi quyền chọn lịch sử cần có tập hợp hợp đồng được niêm yết tại đúng thời điểm. Ngày đáo hạn của hợp đồng cho bạn biết khi nào hợp đồng kết thúc. Nó không cho biết hợp đồng được niêm yết khi nào, bắt đầu giao dịch được khi nào, hay hệ thống của bạn có thể chọn hợp đồng đó vào thời điểm ấy hay không.
Chúng tôi xây dựng lại bước lựa chọn dựa trên thông tin sẵn có tại dấu thời gian ra quyết định. Với mỗi hợp đồng tiềm năng, chúng tôi yêu cầu thời điểm niêm yết không muộn hơn thời điểm ra quyết định, báo giá hợp lệ không cũ hơn ngưỡng độ mới, và phiên giao dịch cho phép chiến lược gửi lệnh. Chúng tôi cũng ghi lại tập hợp ứng viên trước khi xếp hạng. Chi tiết sau cùng này rất quan trọng vì backtest cũ chỉ lưu lại hợp đồng thắng cuộc; chúng tôi không thể biết nó đã so sánh năm hợp đồng đủ điều kiện hay âm thầm chọn từ một lịch chưa tồn tại vào thời điểm đó.
Tiếp theo, chúng tôi xem xét báo giá dùng để định giá spread. Backtest lấy báo giá mới nhất của từng chân một cách độc lập. Giá ask của call có dấu thời gian 10:06:58; giá bid của call bán ra có dấu thời gian 10:04:11. Theo chính sách dữ liệu chung, cả hai đều còn mới, nhưng thị trường đã biến động trong khoảng thời gian giữa chúng. Giá giữa của một spread được tính từ các chân có dấu thời gian không đồng bộ có thể mô tả một thị trường chưa từng tồn tại.
Chúng tôi sửa quy tắc báo giá, yêu cầu dấu thời gian của cả hai chân cách nhau không quá 2 giây và loại bỏ thị trường có giá bị chéo hoặc khối lượng bằng 0. Số quan sát lịch sử có thể dùng được giảm xuống. Đổi lại, các mức giá còn lại đáng tin hơn. Khi không có báo giá đồng bộ, chúng tôi đánh dấu ứng viên là không khả dụng thay vì lấp khoảng trống bằng một mức giá cũ.
Sau đó là quy tắc xếp hạng. Tác tử đã chọn kỳ đáo hạn có chi phí spread được báo giá thấp nhất. Nghe có vẻ hợp lý, cho đến khi spread chỉ có một hợp đồng và báo giá đã cũ. Chúng tôi xác định rõ mục tiêu: tối đa hóa lợi nhuận kỳ vọng trên mỗi đơn vị rủi ro đã xác định, trong số các hợp đồng đạt yêu cầu tối thiểu về khối lượng báo giá, độ mới và niêm yết. Trong ví dụ này, kỳ đáo hạn gần nhất đủ điều kiện có độ rộng báo giá $0.42 giữa hai chân, còn kỳ đáo hạn xa hơn có độ rộng $0.31. Lựa chọn trông có vẻ rẻ hơn cũng chỉ có một hợp đồng hiển thị ở chân bán ra.
| Ứng viên | Kỳ đáo hạn đã khả dụng khi đó? | Độ cũ của báo giá | Khối lượng hiển thị ở chân bán ra | Quyết định |
|---|---|---|---|---|
| Kỳ hạn tuần thứ Sáu | Không | Không áp dụng | Không áp dụng | Loại |
| Thứ Sáu tuần kế tiếp | Có | 1.4 giây | 18 hợp đồng | Đủ điều kiện |
| Thứ Sáu tuần thứ ba | Có | 9.8 giây | 1 hợp đồng | Loại vì cũ và khối lượng mỏng |
Chúng tôi chạy lại sự việc theo các quy tắc đó. Giờ đây, backtest chọn cùng kỳ đáo hạn với quy trình chạy thử và ghi lại lý do các hợp đồng khác bị loại. Giá vào spread mới kém hơn $0.11 so với mức khớp lịch sử ban đầu. Điều đó không có nghĩa chiến lược không có giá trị; nó cho thấy con số hiệu suất cũ đã tính cả một lựa chọn giao dịch mà quy trình thực tế không thể tái lập.
Một phiền toái nhỏ: định dạng mã của sàn khiến lỗi ngày đáo hạn trông giống lỗi chất lượng dữ liệu. Chúng tôi phát hiện mã tuần của một nhà cung cấp khác mã tháng chỉ một ký tự. Tôi vẫn lưu mã thô cạnh khóa hợp đồng đã chuẩn hóa trong nhật ký kiểm toán. Cách đó không thanh nhã, nhưng giúp chúng tôi tránh tin vào một phép nối gọn gàng quá sớm.
Nếu bạn đang xây dựng backtest quyền chọn, hãy lưu toàn bộ tập hợp ứng viên tại mỗi quyết định, cùng trạng thái niêm yết, dấu thời gian báo giá, khối lượng và lý do bị loại của từng hợp đồng. Sau đó, biến việc chọn hợp đồng thành một hàm xác định dựa trên ảnh chụp dữ liệu đó. Lựa chọn ngày đáo hạn là một phần của chiến lược. Nếu backtest nhìn thấy một hợp đồng mà quy trình chạy thử không thể có, việc so sánh tín hiệu đã bắt đầu sau khi kết quả bị thay đổi.
← Tất cả bài viết


