thiên lệch nhìn về tương lai backtest
Thiên lệch nhìn về tương lai là rò rỉ dữ liệu tương lai vào backtest. Tìm hiểu cách quyết định cùng khung, thiên lệch sống sót và số liệu sửa đổi thổi phồng kết quả, cùng cách kiểm tra.
Thiên lệch nhìn về tương lai (look-ahead bias) là việc sử dụng thông tin trong một backtest mà không ai có thể có được tại thời điểm giao dịch mô phỏng được đặt. Đường cong vốn tăng lên, các chỉ số thống kê trông rất xuất sắc, và tất cả đều sụp đổ khi tiếp xúc với lệnh thực. Trang này định nghĩa thiên lệch này, trình bày ba cơ chế tạo ra nó, và đo lường từng cơ chế trên dữ liệu thị trường thực.
Thiên lệch nhìn về tương lai là gì
Một backtest là một tuyên bố về một quyết định: tại mốc thời gian này, với thông tin này, quy tắc sẽ thực hiện điều này. Tuyên bố chỉ đúng khi mọi đầu vào mà quy tắc đọc đã tồn tại, ở dạng cuối cùng của nó, trước mốc thời gian đó. Thiên lệch nhìn về tương lai là bất kỳ vi phạm nào của điều kiện đó, và nó diễn ra âm thầm. Không có gì trong bảng tính hay tập lệnh phàn nàn khi một hàng trả về một giá trị được đóng dấu muộn hơn quyết định mà nó phục vụ.
Ba vi phạm bao phủ hầu hết những gì xuất hiện trong thực tế. Một quyết định đọc một thanh giá mà nó cũng giao dịch bên trong. Một vũ trụ được tập hợp từ những cái tên vẫn còn niêm yết hôm nay. Một trường dữ liệu đã được sửa đổi sau ngày nó mang.
Cơ chế một: quyết định trên một thanh mà bạn cũng giao dịch
Bắt đầu với một quy tắc nghe có vẻ vô hại. Mua khi mạnh, nghĩa là trong các phiên mà quỹ đóng cửa cao hơn mức mở cửa. Được lập trình bất cẩn, bài kiểm tra vào lệnh tại mức mở cửa của phiên đó và thoát tại mức đóng cửa của phiên đó, trong khi điều kiện nó sàng lọc là giá đóng cửa của cùng một thanh. Không ai biết giá đóng cửa vào lúc chuông mở cửa.
Bảng bên dưới chạy cả hai phiên bản trên SPY, quỹ theo dõi S&P 500, trong mười năm dương lịch. Cột đầu tiên là phiên bản bất khả thi. Cột thứ hai trễ cùng một điều kiện một phiên, đây là thời điểm sớm nhất mà một tài khoản có vốn có thể hành động dựa trên nó.
Câu lệnh SQL chính xác đằng sau mỗi con số
WITH bars AS (
SELECT date,
toFloat64(open) AS o,
toFloat64(close) AS c,
toFloat64(close) > toFloat64(open) AS up_day
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= toDate('2015-12-01')
AND date <= toDate('2025-12-31')
),
lagged AS (
SELECT date, o, c, up_day,
any(up_day) OVER (ORDER BY date ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prior_up
FROM bars
)
SELECT toYear(date) AS year,
countIf(up_day) AS signal_days,
round(100 * avgIf(c / o - 1, up_day), 3) AS same_bar_avg_pct,
round(100 * avgIf(c / o - 1, prior_up), 3) AS lagged_avg_pct,
round(100 * (avgIf(c / o - 1, up_day) - avgIf(c / o - 1, prior_up)), 3) AS gap_pp
FROM lagged
WHERE date >= toDate('2016-01-01')
GROUP BY year
ORDER BY yearSự khác biệt không hề tinh tế. Trong 2016, phiên bản cùng thanh trung bình đạt 0.447% mỗi phiên đủ điều kiện trong khi phiên bản trễ trung bình đạt -0.008%, một chênh lệch 0.455 điểm phần trăm mỗi ngày. Trong 2025, hai phiên bản đọc được 0.636% và -0.03%. Với khoảng 140 phiên đủ điều kiện trong một năm, chênh lệch nửa điểm phần trăm mỗi phiên cộng dồn thành một đường cong vốn mà không tài khoản thực nào từng in ra.
Toàn bộ lợi thế là mang tính định nghĩa. Chọn các phiên đóng cửa cao hơn mức mở cửa, sau đó đo lường từ mở đến đóng trên chính các phiên đó, đo lường một đại lượng được đảm bảo là dương. Quy tắc đã khám phá ra bộ lọc của chính nó.
Các biến thể của điều này ẩn náu trong dữ liệu hàng ngày mọi lúc: một đường trung bình động bao gồm giá đóng cửa hôm nay và được sử dụng để giao dịch hôm nay, một tín hiệu được tính trên giá đã được điều chỉnh cho một đợt chia tách chưa xảy ra, một điểm dừng trong ngày được đặt tại mức đỉnh phiên chưa được in. Hình dạng chung là một mốc thời gian quyết định nằm sớm hơn một trong các đầu vào của chính nó.
Cơ chế hai: một vũ trụ được vẽ từ những người sống sót hôm nay
Cơ chế thứ hai không bao giờ chạm vào quy tắc. Nó nằm trong danh sách các tên mà quy tắc được phép nhìn thấy.
Lấy một danh sách mã từ một nhà cung cấp dữ liệu hiện tại, chạy nó trong mười năm trước, và mẫu âm thầm loại trừ mọi công ty đã phá sản, bị mua lại, hoặc bị hủy niêm yết trên đường đi. Quy tắc chưa bao giờ được cung cấp những kẻ thua cuộc. Bảng đo lường kích thước của sự thiếu sót đó: mọi tên niêm yết tại Mỹ đã giao dịch ít nhất 200 phiên trên 1 đô la trong một năm dương lịch nhất định, tỷ lệ của nhóm đó vẫn còn in giá vào tháng 7 năm 2026, và lợi nhuận trung bình năm dương lịch của toàn bộ nhóm bên cạnh mức trung bình của riêng những người sống sót.
Câu lệnh SQL chính xác đằng sau mỗi con số
WITH recent AS (
SELECT DISTINCT ticker
FROM global_markets.stocks_daily_aggs
WHERE date >= toDate('2026-06-15')
AND date <= toDate('2026-07-28')
),
per_name AS (
SELECT toYear(date) AS year,
ticker,
argMin(toFloat64(close), date) AS first_close,
argMax(toFloat64(close), date) AS last_close,
count() AS sessions
FROM global_markets.stocks_daily_aggs
WHERE date >= toDate('2015-01-01')
AND date <= toDate('2024-12-31')
AND close > 1
GROUP BY year, ticker
HAVING sessions >= 200
)
SELECT year,
uniqExact(ticker) AS names_trading,
round(100 * uniqExactIf(ticker, ticker IN (SELECT ticker FROM recent)) / uniqExact(ticker), 1) AS still_listed_pct,
round(100 * quantileDeterministic(0.5)(last_close / first_close - 1, cityHash64(ticker)), 2) AS median_return_all_pct,
round(100 * quantileDeterministicIf(0.5)(last_close / first_close - 1, cityHash64(ticker), ticker IN (SELECT ticker FROM recent)), 2) AS median_return_survivors_pct,
round(100 * (quantileDeterministicIf(0.5)(last_close / first_close - 1, cityHash64(ticker), ticker IN (SELECT ticker FROM recent))
- quantileDeterministic(0.5)(last_close / first_close - 1, cityHash64(ticker))), 2) AS survivor_gap_pp
FROM per_name
GROUP BY year
ORDER BY yearTrong số 7063 tên vượt qua ngưỡng trong 2015, 52.5% vẫn đang giao dịch vào tháng 7 năm 2026. Đối với nhóm 2024, con số là 87.5%, chủ yếu là vấn đề thời gian trôi qua: một tên năm 2024 có hai năm để biến mất và một tên năm 2015 có mười một năm.
Các cột lợi nhuận mang chính thiên lệch. Trong 2017, tên trung bình mang lại 7.51% trong khi người sống sót trung bình mang lại 11.32%, một khoảng cách 3.81 điểm phần trăm được trao miễn phí. Khoảng cách là dương trong mỗi 10 năm được biểu đồ. Một chiến lược được kiểm tra trên những người sống sót thừa hưởng nó trước khi đưa ra một quyết định duy nhất, và các quy tắc sàng lọc điểm yếu thừa hưởng nhiều hơn mức trung bình, vì những tên đã biến mất nằm không cân xứng trong nhóm đó.
Sự điều chỉnh là một vũ trụ điểm-tại-thời-điểm (point-in-time): danh sách các tên như nó tồn tại vào mỗi ngày tái cân bằng, bao gồm cả các tên bị hủy niêm yết, với một vị thế bị hủy niêm yết được đóng ở mức in cuối cùng thay vì bị xóa khỏi hồ sơ.
Cơ chế ba: dữ liệu đã được sửa đổi sau dấu ngày của nó
Giá được đóng dấu một lần. Dữ liệu cơ bản thì không. Một con số hàng quý mang ngày kết thúc quý, được sửa đổi bởi một báo cáo sau đó, và một cơ sở dữ liệu chỉ lưu trữ phiên bản hiện tại sẽ sẵn sàng phục vụ con số đã sửa đổi với ngày gốc. Một quy tắc sàng lọc trên con số đó đang đọc một sự điều chỉnh mất nhiều tháng để đến.
Cùng một mô hình chạy qua danh sách thành phần chỉ số được xây dựng lại theo các thành phần hiện tại, lịch sử ước tính của nhà phân tích bị ghi đè bằng sự đồng thuận cuối cùng, và các điều chỉnh hành động doanh nghiệp được áp dụng ngược qua toàn bộ chuỗi giá. Trong mỗi trường hợp, hồ sơ được lưu trữ là một ảnh chụp nhanh ở thì hiện tại mang một ngày ở thì quá khứ.
Hai thực hành chứa đựng nó. Sử dụng một nguồn giữ các phiên bản (vintages), nghĩa là giá trị như nó được biết vào mỗi ngày thay vì giá trị như nó được biết bây giờ. Khi không có phiên bản, hãy áp dụng độ trễ báo cáo đủ lớn để bao phủ độ trễ thực, và coi độ dài của độ trễ đó là một tham số đáng kiểm tra thay vì một chi tiết đáng đoán.
Đường cong trông như thế nào khi tương lai rò rỉ vào
Thiên lệch nhìn về tương lai có một dấu hiệu nhận biết: hiệu suất nằm cao hơn nhiều so với những gì thị trường cơ bản mang lại. Một điểm tham chiếu hữu ích là trần nhìn lại (hindsight ceiling), mức tăng trưởng mà một dự báo hoàn hảo trước một ngày sẽ tạo ra trên một công cụ duy nhất.
Câu lệnh SQL chính xác đằng sau mỗi con số
WITH bars AS (
SELECT date,
toFloat64(close) AS c,
any(toFloat64(close)) OVER (ORDER BY date ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_c
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= toDate('2015-12-01')
AND date <= toDate('2025-12-31')
),
rets AS (
SELECT toYear(date) AS year,
c / prev_c - 1 AS r
FROM bars
WHERE date >= toDate('2016-01-01')
AND prev_c > 0
)
SELECT year,
count() AS sessions,
round(100 * (exp(sum(log(1 + r))) - 1), 1) AS buy_and_hold_pct,
round(100 * (exp(sumIf(log(1 + r), r < 0.02)) - 1), 1) AS without_big_up_days_pct,
round(exp(sum(log(1 + abs(r)))), 1) AS hindsight_ceiling_multiple
FROM rets
GROUP BY year
ORDER BY yearTrần là rất lớn. Trong 2020, tầm nhìn trước một ngày hoàn hảo trên SPY đã nhân vốn lên 27.7 lần trong 253 phiên, so với 16.2% khi chỉ đơn giản nắm giữ quỹ. Trong năm yên tĩnh nhất trong mười năm, 2017, cùng một dự báo hoàn hảo mang lại 2.2 lần vốn.
Cột giữa cho thấy trần đó tập trung như thế nào. Loại bỏ các phiên tăng hơn 2%, và 2020 chuyển từ 16.2% thành -44.9%. Một rò rỉ chỉ đáng giá một số ít các phiên đó mỗi năm sẽ đẩy một backtest đi rất xa. Một đường cong với các đợt giảm nông, tỷ lệ trúng cao, và các ngày tốt nhất của nó tập trung vào các phiên biến động mạnh nhất của thị trường đã đáng được kiểm toán.
Hiệu chuẩn quan trọng hơn bất kỳ ngưỡng đơn lẻ nào. Một quy tắc tuyên bố mức 40% một năm mượt mà trong một thập kỷ đang tuyên bố một phần lớn của trần nhìn lại, và câu hỏi trung thực là đầu vào nào đã nói cho nó biết điều gì sắp xảy ra.
Cách kiểm tra một backtest về thiên lệch nhìn về tương lai
- Trễ mọi thứ một thanh. Dịch chuyển mọi tín hiệu muộn hơn một kỳ đầy đủ và chạy lại. Lợi thế thực sự suy giảm một chút. Rò rỉ sụp đổ, thường là về không.
- Gây nhiễu tương lai. Lấy dữ liệu sau mỗi mốc thời gian quyết định, thay thế nó bằng nhiễu hoặc một sự xáo trộn, và chạy lại logic quyết định. Mọi quyết định sẽ ra giống hệt nhau. Bất kỳ quyết định nào thay đổi đã đọc một thứ nó không thể biết.
- Coi dấu thời gian là dữ liệu. Đối với mỗi đầu vào, lưu trữ thời điểm một giá trị trở nên khả dụng bên cạnh thời điểm nó mô tả. Một phép nối không bao giờ so sánh hai cột đó không thể thực thi quy tắc.
- Xây dựng lại vũ trụ theo ngày. Bao gồm các tên bị hủy niêm yết và bị mua lại, đóng chúng ở mức in cuối cùng, và chạy cùng một quy tắc trên cả hai vũ trụ để định lượng đóng góp của thiên lệch sống sót.
- Đo lường so với trần. Đặt lợi nhuận của chiến lược bên cạnh con số mua và nắm giữ và con số tầm nhìn hoàn hảo cho cùng một cửa sổ. Khoảng cách từ trần là bối cảnh mà một mình tỷ lệ Sharpe không cung cấp.
Định cỡ vị thế nằm ở hạ nguồn của tất cả những điều này. Một tỷ lệ thắng được thổi phồng nuôi dưỡng một kích thước cược được thổi phồng, đó là nơi định cỡ vị thế theo tiêu chí Kelly biến một lỗi kế toán thành một đợt giảm. Cùng một kỷ luật áp dụng trước khi vốn thực sự di chuyển: giao dịch giấy trước khi dùng tiền thật kiểm tra cơ chế lệnh, và các ngăn xếp tự động mang cùng một nguy cơ ở tốc độ máy, được đề cập trong hệ thống giao dịch AI đa tác nhân. Các hiệu ứng tồn tại sau khi kiểm tra điểm-tại-thời-điểm cẩn thận, chẳng hạn như sự bất thường biến động thấp, là thú vị chính xác vì lý do đó.
FAQ
Thiên lệch nhìn về tương lai trong backtesting là gì?
Đó là việc sử dụng dữ liệu trong một giao dịch mô phỏng mà không có sẵn khi giao dịch lẽ ra đã được đặt. Các dạng phổ biến là quyết định trên một thanh giá mà giao dịch cũng thực hiện bên trong, sàng lọc một vũ trụ các công ty vẫn còn niêm yết hôm nay, và đọc một con số tài chính đã được sửa đổi sau ngày gắn liền với nó.
Làm thế nào để phát hiện thiên lệch nhìn về tương lai?
Trễ mọi tín hiệu một kỳ đầy đủ và chạy lại: một rò rỉ thường sụp đổ trong khi lợi thế thực sự suy giảm nhẹ nhàng. Một bài kiểm tra mạnh hơn thay thế tất cả dữ liệu sau mỗi mốc thời gian quyết định bằng nhiễu và xác nhận rằng mọi quyết định ra không thay đổi.
Thiên lệch sống sót có giống thiên lệch nhìn về tương lai không?
Chúng khác biệt nhưng đi cùng nhau. Thiên lệch sống sót là một mẫu được xây dựng từ những cái tên đã tồn tại, và biết cái tên nào tồn tại tự nó là thông tin từ tương lai, vì vậy một vũ trụ chỉ gồm người sống sót là một rò rỉ nhìn về tương lai nằm trong dữ liệu chứ không phải trong quy tắc.
Tại sao các backtest có thiên lệch nhìn về tương lai trông rất tốt?
Rò rỉ chọn lọc kết quả thay vì dự đoán chúng. Trong bảng trên, sàng lọc các phiên dựa trên giá đóng cửa của chính chúng tạo ra mức lợi nhuận phiên trung bình cao hơn khoảng 0.455 điểm phần trăm so với phiên bản trễ trong 2016, một lợi thế mang tính định nghĩa chứ không phải kiếm được.
Dữ liệu điểm-tại-thời-điểm là gì?
Dữ liệu điểm-tại-thời-điểm lưu trữ mỗi giá trị như nó được biết vào mỗi ngày lịch sử, bao gồm con số gốc và mọi sửa đổi sau đó, cùng với vũ trụ chứng khoán như nó tồn tại vào ngày đó. Đó là tài liệu tham khảo mà một backtest cần để chứng minh rằng các đầu vào của nó tồn tại trước các quyết định của nó.
Mọi con số trên đây là một truy vấn được lưu trữ, có phiên bản trên các thanh ngày thực. Mở rộng SQL của bất kỳ bảng nào, hoặc chạy bài kiểm tra trễ trên quy tắc của riêng bạn trên terminal Strasmore.