1 tháng Mười Một, 2026 · nghiên cứu

Làm sao warm up một backtest mà không tính lookback vào hiệu suất?

Làm sao warm up một backtest mà không tính lookback vào hiệu suất?

Một Donchian 20 ngày trông vô hại trong spec. Agent viết rolling max 20 bar, backtest bắt đầu từ hàng một của file parquet, và trong hai tuần đầu "đỉnh 20 ngày" chỉ là running max của những bar đang có. Vào ngày thứ tư thì đó là đỉnh bốn ngày. Chiến lược bạn tưởng mình đang kiểm thử không phải là chiến lược đã tạo ra tá lệnh khớp đầu tiên.

Tôi có một notebook trên nến ngày ETHUSDT với Sharpe toàn mẫu là 1.4. Cắt 20 phiên đầu thì nó rơi xuống 0.6. Giữ 20 phiên đó và bỏ phần còn lại của năm thứ nhất, nó in ra 3.1. Không ai làm rò rỉ ngày mai. Chiến lược đã dùng quá khứ, chỉ là chưa đủ quá khứ, và báo cáo coi những lệnh nửa vời đó là bằng chứng.

1.4Sharpe toàn mẫu, cửa sổ chưa hoàn tất vẫn được tính
0.6cùng mã sau 20 phiên đã hoàn tất
3.1Sharpe nếu chỉ giữ các lệnh burn-in

Cho cửa sổ giao dịch khi vẫn đang được lấp đầy

Đống hỏng thường gặp là min_periods=1. Pandas sẽ tính rolling mean trên một bar duy nhất nếu bạn để nó làm vậy. Agent làm thế liên tục, vì một NaN ở đầu frame trông như bug, và điền nó vào thì unit test chuyển xanh.

Một mục tiêu realized-vol 20 ngày với hai quan sát lợi nhuận là một vụ nổ size. Phương sai của hai số là một lần tung đồng xu, bạn nghịch đảo nó, và vị thế đầu tiên lớn gấp nhiều lần rủi ro dự kiến. Một z-score so với độ lệch chuẩn gần zero làm cùng trò đó kèm một dấu: chiến lược trông như có điểm vào sắc như dao cạo, rồi không bao giờ xuất hiện lại khi cửa sổ đã trung thực.

Breakout còn tệ hơn, vì chúng trông giống đúng quy tắc thật. Một kênh 20 bar trên bar thứ sáu là kênh sáu bar. Bạn nhận một cụm lệnh ngay lúc bắt đầu, thường trong một đoạn yên ắng mà chỉ báo đã hoàn tất sẽ không kích hoạt. Thị trường yên ắng trôi nhẹ. Kênh hẹp kích. Đường cong vốn được một xuất phát sớm mà không năm nào sau lặp lại.

Zero-fill và forward-fill bịa một lời dối khác. RSI bằng 0 đọc là oversold. Một ATR thiếu bằng 0 làm nổ kích thước đơn vị, và backtest cần mẫn mua cả một kho. Tôi thà để NaN giết lệnh còn hơn để 0 bịa ra một lệnh.

Tôi vẫn bắt gặp mình vẽ từ hàng 0 vì một tháng trống bên trái biểu đồ trông như chưa xong. Tháng trống mới là phần trung thực.

Cắt đường cong vốn, giữ vị thế

Cái này sống sót qua code review. Bạn tính các đặc trưng 20 ngày đúng cách, bỏ 20 hàng đầu khỏi đường cong đã vẽ, và công bố từ ngày 21 tháng 1. Vị thế ngày 21 tháng 1 được mở ngày 14 tháng 1. High-water của trailing stop, số lần pyramid, tiền mặt sau những lệnh burn đó: tất cả đều bước vào mẫu "sạch".

Đống hỏng là một chiến lược paper không thể khởi chạy vào ngày ghi trong bài viết. Khởi động lại từ flat tại mốc bắt đầu đã báo cáo thì lệnh tuần đầu không khớp. Đôi khi backtest đã nằm trong một lệnh mà hệ thống paper không có lý do để vào. Đôi khi hệ thống paper vào vì lookback còn lạnh, còn backtest ngồi ngoài vì tháng ẩn đã lấy breakout. Hai sổ mở, một ngày bắt đầu được công bố.

Các fold walk-forward làm điều này lặng lẽ. Mỗi cửa sổ test có một đuôi lookback bạn không vẽ. Bỏ không mô phỏng đuôi đó thì các lệnh test đầu lại là lệnh cửa sổ chưa hoàn tất. Mô phỏng nó và chỉ báo cáo các ngày test, thì vị thế ngày test phụ thuộc vào các lệnh khớp bạn không đang hiện. Phiên bản thứ hai có thể là một lựa chọn nghiên cứu chính đáng. Gọi buổi sáng đầu của fold là cold start, trong khi trailing stop đã sống từ đuôi, là cách hai nhà nghiên cứu ra hai Sharpe từ một config.

Nếu khởi động lại từ flat tại ngày bắt đầu đã công bố làm thay đổi P&L, warmup đang nằm trong track record. Dữ liệu lookback có thể có mặt. Các lệnh lookback thì không.

Warm up theo ngày dương lịch khi đặc trưng không phải là ngày

"Cho nó 30 ngày" để đặc trưng bị thiếu đặc tả. Ba mươi ngày dương lịch trên Donchian 5 phút là hàng nghìn bar vượt quá lookback 20 chu kỳ. Ba mươi ngày trên đặc trưng ngày cần 20 phiên thì hoặc thừa hoặc thiếu, tùy cuối tuần và lỗ hổng.

Một z-score funding-rate trên một sàn perp của chúng tôi được warmup 30 ngày vì spec nói 30 chu kỳ và ai đó dịch chu kỳ thành dương lịch. Funding ở đó in mỗi tám giờ. Ba mươi ngày là khoảng 90 lần settlement. Ba mươi chu kỳ là mười ngày. Hai tháng burn-in thừa tình cờ gồm một tuần depeg. Bỏ nó đi khiến cửa sổ live trông êm hơn lịch sử thật của chiến lược. Người ta đổ cho độ nhạy ngày bắt đầu. Warmup đã nuốt mất chế độ.

Và crypto so với cổ phiếu khiến cùng một con số đổi nghĩa mà không ai sửa tham số. Hai mươi "ngày" ETH gồm cả thứ Bảy. Hai mươi phiên cổ phiếu gần như một tháng dương lịch. Copy lookback 20 ngày từ notebook cổ phiếu sang nến perpetual theo giờ thì bạn có kênh 20 giờ với tên 20 ngày. Bar hợp lệ đầu tiên khi đó hoặc là sau 20 giờ, hoặc sau 20 ngày nếu một hàm nào đó sau đó resample, và tôi đã thấy cả hai trong cùng một diff của agent.

Ghim timestamp giao dịch được đầu tiên

Warmup là yêu cầu dữ liệu, không phải mẫu thưởng thêm. Mỗi đặc trưng nêu số quan sát đã hoàn tất nó cần, theo đơn vị nó được tính. Timestamp giao dịch được đầu tiên là bar đầu tiên mà tất cả những điều đó đúng và một tài khoản flat sẽ được phép gửi lệnh.

Đặc trưngSpec thường nói gìCái thực sự phải tồn tạiThứ thay thế thầm lặng
Donchian 20 ngày20 đỉnh ngày20 phiên đã hoàn tấtRunning max với min_periods=1
realized vol 30 ngàycửa sổ 30 ngày30 lợi nhuận close-to-closePhương sai hai ngày, đảo nghịch thành size
z-score funding 20 lần in20 ngày20 lần settlement funding20 ngày dương lịch (~90 lần in), hoặc 20 bar khung thời gian sai
RSI 14 chu kỳ trên 5m14 chu kỳ14 nến năm phút đã đóng14 ngày, hoặc 14 bar với khoảng trống được forward-fill

P&L trước timestamp đó ở ngoài track record. Trạng thái trước timestamp đó vẫn có thể cần được mô phỏng, để trailing stop hay cooldown là thật khi đồng hồ chạm bar giao dịch được đầu tiên, nhưng những lệnh khớp đó không vào Sharpe, số lệnh, hay toán capacity. Rồi chạy bài kiểm tra xấu xí: khởi động lại từ flat tại timestamp đó, với lookback chỉ có mặt như dữ liệu. Nếu lệnh thay đổi, bạn đã đưa các lệnh ẩn vào sản phẩm.

Paper trading bắt đầu trên cùng hợp đồng đó. Mỗi cửa sổ test walk-forward cũng vậy. Nếu biểu đồ trông như thiếu một tháng, cứ để nó thiếu.

backtestingkỹ thuật dữ liệuwalk-forwardtác nhân AIpaper trading
← Tất cả bài viết