Thị trường dự đoán trông như thứ dễ backtest nhất trên đời. Giá nằm trong [0, 1]. Khoản chi trả là 1 đô la hoặc không gì cả. Không đòn bẩy, không funding, không basis, không chuyện kỳ quặc của hợp đồng hoán đổi vĩnh cửu lúc 00:00 UTC. Chúng tôi đã có một công cụ backtest xử lý được hợp đồng vĩnh cửu crypto, gồm phí, funding và tác động giá; kế hoạch là dành 2 ngày điều chỉnh nó rồi bắt đầu tạo chiến lược.
Mất 8 ngày. Đây là nhật ký, đại khái theo thứ tự, kể cả ngày đường cong vốn trông tuyệt đẹp và thực sự đã tuyệt đẹp.
Ngày 1: bộ chuyển đổi lẽ ra phải đơn giản
Ánh xạ ban đầu theo kiểu một-một và có vẻ gọn gàng. Một thị trường là một công cụ. Giá YES là giá. Mua YES là vị thế mua, mua NO là vị thế bán. Khi phân định kết quả, vị thế buộc phải đóng ở 1.00 hoặc 0.00. Đưa chuỗi giá theo giờ vào cùng vòng lặp sự kiện là xong.
Ánh xạ đó chỉ trụ được khoảng 90 phút khi tiếp xúc với dữ liệu thực. Thứ hỏng đầu tiên là chuỗi lợi suất. Toàn bộ lớp quản trị rủi ro — xác định quy mô vị thế, nhắm mục tiêu biến động, báo cáo Sharpe — đều giả định lợi suất log của một công cụ tiếp tục tồn tại. Một thị trường đi từ 0.04 xuống 0.00 có lợi suất log không xác định nhưng khoản lỗ toàn bộ thì xác định rõ. Và một thị trường ở mức 0.04 trước khi phân định kết quả 3 ngày là một đối tượng khác hẳn về bản chất so với khi ở mức 0.04 trước đó 4 phút, dù cả hai dòng đều ghi 0.04.
Cuối cùng, chúng tôi biểu diễn lại toàn bộ chuỗi theo thời gian còn lại đến lúc phân định kết quả thay vì thời gian thực, và coi PnL là giá trị cuối kỳ thay vì giá trị được đánh dấu theo thị trường. Đó là quyết định đúng, và nó làm vô hiệu mọi đoạn mã báo cáo phía sau.
Ngày 2: công thức phí chính là chiến lược
Trên Kalshi, phí giao dịch không phải khoản khấu trừ theo điểm cơ bản. Phí tăng theo bình phương giá: xấp xỉ 0.07 × contracts × P × (1−P), làm tròn lên đến xu ở cấp lệnh. Điều đó có nghĩa là phí cao nhất đúng tại nơi thị trường tung đồng xu thú vị nhất, và gần như miễn phí ở hai đuôi.
| Giá | Phí mỗi hợp đồng | Biên lợi thế cần có (điểm xác suất) | Phí tính theo % tiền cược |
|---|---|---|---|
| 5¢ | 0.33¢ | 0.33 | 6.7% |
| 10¢ | 0.63¢ | 0.63 | 6.3% |
| 25¢ | 1.31¢ | 1.31 | 5.3% |
| 50¢ | 1.75¢ | 1.75 | 3.5% |
| 75¢ | 1.31¢ | 1.31 | 1.8% |
| 90¢ | 0.63¢ | 0.63 | 0.7% |
| 95¢ | 0.33¢ | 0.33 | 0.35% |
Hãy chú ý cột thứ 3, đó mới là điều quan trọng: để hòa vốn khi mua ở mức 50¢ và giữ đến lúc phân định kết quả, ước tính xác suất của bạn phải cao hơn thị trường 1.75 điểm. Không phải cao hơn 1.75% theo tỷ lệ tương đối, mà là chênh lệch tuyệt đối. Nếu thoát vị thế trước khi phân định kết quả thay vì giữ đến cùng, bạn phải trả phí 2 lần, cộng thêm chênh lệch giá mua bán.
CLOB của Polymarket trong lịch sử có cấu trúc phí rất khác, gần như không có phí trực tiếp trên giao dịch, nên toàn bộ chi phí nằm ở chênh lệch giá và độ sâu sổ lệnh. Vì vậy, cùng một logic chiến lược nhưng hiệu quả kinh tế khác hẳn tùy sàn, và mọi phép so sánh giữa các sàn dùng chung một mô hình phí đều là hư cấu. Giờ đây chúng tôi dùng hàm tính phí riêng cho từng sàn, thay vì một giá trị cố định.
Nếu chỉ đọc 1 dòng trong báo cáo backtest thị trường dự đoán, hãy đọc dòng phí tính theo điểm xác suất. Một chiến lược tuyên bố có lợi thế dự báo 1.2 điểm trên các thị trường giá 50¢ sẽ thua lỗ trên Kalshi trước cả khi tính bất kỳ chi phí nào khác. Điều đó phải hiện rõ ngay trang đầu, không phải để người đọc tự suy ra.
Ngày 3: sổ lệnh là những bậc thang và rất ngắn
Mô hình tác động giá của chúng tôi là hàm căn bậc hai, hiệu chỉnh theo sổ lệnh hợp đồng vĩnh cửu BTC. Nó sai dạng. Với bước giá 1¢ trên công cụ trị giá $1, toàn bộ sổ lệnh chỉ có 99 mức giá khả dĩ, và một thị trường có thanh khoản trung bình có thể có vài trăm hợp đồng nằm ở mức đầu tiên rồi tiếp theo là một khoảng trống.
Đây là ảnh chụp sổ lệnh của một thị trường dữ liệu kinh tế mà chúng tôi lấy mẫu, phía YES, khoảng 30 giờ trước khi phân định kết quả:
| Mức giá | Khối lượng (hợp đồng) | Chi phí lũy kế khi mua |
|---|---|---|
| 42¢ | 310 | 310 @ giá TB 42.0¢ |
| 43¢ | 85 | 395 @ giá TB 42.2¢ |
| 45¢ | 140 | 535 @ giá TB 42.9¢ |
| 49¢ | 600 | 1,135 @ giá TB 46.1¢ |
Một lệnh 1,000 hợp đồng — rủi ro 500 đô la, chỉ là sai số làm tròn trong crypto — đẩy giá thực hiện lên 4 xu. 4 xu cao hơn 2 lần mức phí. Không có hàm trơn nào để khớp ở đây; bạn phải đi từng mức giá trong sổ lệnh, nếu không thì chỉ đang bịa ra. Chúng tôi xóa mô hình sqrt cho loại tài sản này và viết bộ duyệt sổ lệnh theo từng mức, chậm hơn nhưng chính xác.
Ở đâu đó trong quá trình này, tôi nhận ra mình đang bực vì những thị trường này "quá nhỏ để đáng quan tâm". Chúng nhỏ vì thứ được định giá là một câu hỏi duy nhất trong thế giới thực, có hạn chót, và chỉ có chừng ấy người có ý kiến về số đơn xin trợ cấp thất nghiệp lần đầu ở Mỹ vào một ngày thứ Tư. Quy mô chính là thị trường. Phàn nàn về điều đó cũng như phàn nàn rằng bàn poker chỉ có 9 chỗ.
Ngày 4: ngày đường cong vốn đẹp đến nao lòng
Sharpe 4.1 trên 1,400 thị trường. Đường cong mượt mà. Bất kỳ nhà nghiên cứu nào cũng nên thấy thắt ruột khi nhìn con số này — tôi cũng vậy, nhưng phải khoảng 40 phút sau khi đã chụp màn hình.
Lỗi nằm ở bước lấy mẫu lại. Lịch sử giá của các thị trường kém thanh khoản có dấu thời gian không đều, nên chúng tôi lập lại chỉ mục trên lưới theo giờ đồng nhất. Điểm cuối cùng của mỗi chuỗi đã lưu trữ là giá trị thanh toán, 1.00 hoặc 0.00. Phép lập lại chỉ mục dùng phương pháp điền giá trị lân cận gần nhất mà không giới hạn hướng, nên ở mọi thị trường có giao dịch cuối cách thời điểm phân định kết quả vài giờ, giá trị thanh toán bị lan truyền ngược về trước qua khoảng trống. Mô hình đọc được đáp án ngày mai ngay trong dữ liệu hôm nay, đúng ở những thị trường kém thanh khoản nơi nó có thể tăng quy mô vị thế mà không chạm giới hạn độ sâu.
Điền giá trị lân cận gần nhất ổn với một công cụ liên tục. Với công cụ mà quan sát cuối cùng là sự thật đã biết, nó biến thành cỗ máy nhìn trước tương lai. Giờ đây chúng tôi xác nhận mọi lần điền chỉ được tiến về phía trước, đồng thời gắn nhãn dòng thanh toán và loại dòng đó khỏi mọi phép tính đặc trưng. Lệnh xác nhận ấy dài 9 dòng và là đoạn mã giá trị nhất chúng tôi viết trong cả tuần.
Ngày 5–6: 1,412 thị trường, khoảng 180 cược
Cỡ mẫu trên thị trường dự đoán là cái bẫy mang vẻ ngoài thân thiện. Bạn phân định kết quả 1,412 thị trường, tưởng mình có 1,412 quan sát rồi tính t-stat tương ứng. Nhưng 14 trận NFL diễn ra cùng Chủ nhật có chung hệ thống thời tiết, thời điểm công bố báo cáo chấn thương và luồng đặt cược. 51 thị trường bầu cử cấp bang cùng chịu ảnh hưởng của một làn sóng thay đổi trên toàn quốc. "Liệu X có xảy ra trước ngày 31 tháng 3" và "liệu X có xảy ra trước ngày 30 tháng 6" là cùng một cược với ngày hết hạn khác nhau, và chúng phân định kết quả cùng lúc.
Chúng tôi gom cụm các thị trường theo nguồn sự kiện cơ sở và ngày phân định kết quả, rồi thu được số quan sát độc lập hiệu dụng vào khoảng 180. Không đủ để phân biệt lợi thế thật với nhiễu ở những mức hiệu ứng chúng tôi đang xem xét. Không cách bootstrap theo từng thị trường nào khắc phục được, vì bootstrap phải lấy mẫu lại các cụm chứ không phải từng dòng. Làm sai việc này sẽ âm thầm thổi phồng ý nghĩa thống kê lên 2 hoặc 3 lần.
Ngày 7: việc phân định kết quả cũng là một phân phối xác suất
Những điều chúng tôi hoàn toàn chưa mô hình hóa, và chỉ phát hiện ra sau khi vấp phải:
- Phân định kết quả sớm. Một thị trường dạng "trước ngày 31 tháng 12" có thể phân định kết quả vào ngày 4 tháng 8 khi sự kiện thực sự xảy ra. Vốn của bạn quay về sớm hơn, và thời gian nắm giữ chưa bao giờ giống như tên hợp đồng ngụ ý.
- Tranh chấp. Các thị trường được oracle phân định kết quả có khoảng thời gian khiếu nại. Vị thế có thể mắc kẹt nhiều ngày sau sự kiện, và trong một số ít trường hợp, kết quả đảo ngược so với cách hiểu hiển nhiên.
- Hủy kết quả. Dữ liệu nguồn mơ hồ khiến thị trường bị hủy và mọi người được hoàn tiền. Trong mẫu của chúng tôi, tỷ lệ này dưới 1% số thị trường, nhưng chúng lại tập trung đúng vào những câu hỏi mơ hồ mà mô hình đánh giá sai giá.
- Vốn bị khóa. Lợi thế 3 điểm hiện thực hóa trong 90 ngày và lợi thế 3 điểm hiện thực hóa trong 6 giờ không thể so sánh trực tiếp. Một backtest báo cáo tổng lợi thế mà không chia cho thời gian sử dụng vốn sẽ luôn ưu tiên trường hợp chậm hơn.
Chúng tôi thêm một thành phần chi phí nắm giữ và độ lệch ngẫu nhiên cho ngày phân định kết quả vào trình mô phỏng. Không yếu tố nào chính xác. Cả hai đều tốt hơn giả định ngầm rằng việc phân định kết quả chắc chắn xảy ra đúng vào ngày đã nêu.
Ngày 8: nên bỏ qua điều gì và nên làm gì trước tiên
- Bỏ hẳn bộ khung dựa trên lợi suất. Đừng chỉnh một lớp quản trị rủi ro nhắm mục tiêu biến động để dùng cho công cụ có khoản chi trả cuối kỳ. Hãy viết lớp xác định quy mô cược dựa trên xác suất và tiền cược. Chúng tôi mất 2 ngày cố làm cho lớp cũ phù hợp.
- Xây dựng hàm tính phí trước khi viết chiến lược. In đường cong biên lợi thế hòa vốn cho mọi sàn bạn định giao dịch rồi dán nó lên phía trên bàn làm việc. Cách này loại bỏ khoảng một nửa ý tưởng trước khi chúng ngốn mất một lượt chạy backtest.
- Duyệt sổ lệnh ngay từ ngày đầu. Mọi mô hình tác động giá tham số nhập từ thị trường liên tục đều sẽ sai theo cách khiến kết quả có lợi cho bạn.
- Gom cụm trước khi đếm. Hãy quyết định khóa gom cụm để tính cỡ mẫu hiệu dụng cùng lúc chọn tập thị trường, không phải sau khi đã có Sharpe ưng ý.
- Xác nhận hướng điền dữ liệu. Mỗi phép nối một dòng kiểm tra. Nếu chuỗi kết thúc bằng sự thật đã biết, hãy coi điền ngược là lỗi ngay từ thiết kế, thay vì chờ đến lúc rà soát mới nhận ra.
8 ngày đó rất đáng công, chủ yếu vì thị trường dự đoán gạt bỏ lớp mơ hồ khiến ta dễ tự đánh lừa mình khi backtest crypto. Không có funding rate để lấp liếm, không có quy ước giá đánh dấu để tranh luận. Chỉ có một câu hỏi, một hạn chót và một câu trả lời. Khi backtest sai ở đây, bạn có thể chỉ rõ nó sai ở đâu.
← Tất cả bài viết


