31 tháng Tám, 2026 · thị trường dự đoán

Điều gì hỏng khi backtest thị trường dự đoán: nhật ký 8 ngày

Điều gì hỏng khi backtest thị trường dự đoán: nhật ký 8 ngày

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 đồngBiê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.336.7%
10¢0.63¢0.636.3%
25¢1.31¢1.315.3%
50¢1.75¢1.753.5%
75¢1.31¢1.311.8%
90¢0.63¢0.630.7%
95¢0.33¢0.330.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.

3.5%phí một chiều ở mức 50¢, tính theo phần tiền cược
1.75ppbiên chênh lệch xác suất để hòa vốn tại mức giá đó
1số lần phân định kết quả cho mỗi công cụ, trong toàn bộ vòng đời

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¢310310 @ giá TB 42.0¢
43¢85395 @ giá TB 42.2¢
45¢140535 @ giá TB 42.9¢
49¢6001,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:

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

  1. 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.
  2. 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.
  3. 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.
  4. 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 ý.
  5. 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.

thị trường dự đoánbacktestphícấu trúc vi mô thị trườngkỹ thuật dữ liệu
← Tất cả bài viết