تحيز النظر إلى المستقبل: قاتل الاختبارات الرجعية
تحيز النظر إلى المستقبل هو تسرب بيانات مستقبلية إلى اختبار رجعي. تعرّف على كيفية تضخيم قرارات الشريط نفسه والبقاء والأرقام المُنقّحة للنتائج، وكيفية اختبارها.
تحيز النظر إلى المستقبل هو استخدام معلومات داخل اختبار رجعي لم يكن بإمكان أي شخص امتلاكها في اللحظة التي تم فيها تنفيذ الصفقة المحاكاة. منحنى حقوق الملكية يرتفع، والإحصائيات تبدو ممتازة، ولا شيء منها يصمد عند التعامل مع أمر حي. تحدد هذه الصفحة التحيز، وتستعرض ثلاث آليات تنتجه، وتقيس كل منها على بيانات سوق حقيقية.
ما هو تحيز النظر إلى المستقبل
الاختبار الرجعي هو ادعاء حول قرار: في هذا الطابع الزمني، بهذه المعلومات، كانت القاعدة ستفعل كذا. الادعاء صحيح فقط عندما يكون كل مدخل تقرأه القاعدة موجودًا بالفعل، في شكله النهائي، قبل ذلك الطابع الزمني. تحيز النظر إلى المستقبل هو أي خرق لهذا الشرط، وهو صامت. لا شيء في جدول بيانات أو نص برمجي يشتكي عندما يعيد صف قيمة مختومة بزمن لاحق للقرار الذي تغذيه.
ثلاثة انتهاكات تغطي معظم ما يظهر عمليًا. قرار يقرأ شريط سعر يتداول داخله أيضًا. مجموعة مكونة من الأسماء المدرجة حتى اليوم. حقل بيانات تمت مراجعته بعد التاريخ الذي يحمله.
الآلية الأولى: اتخاذ قرار على شريط تتداول فيه أيضًا
ابدأ بقاعدة تبدو غير ضارة. اشترِ عند القوة، أي في الجلسات التي يغلق فيها الصندوق أعلى من افتتاحه. إذا تمت برمجتها بإهمال، يدخل الاختبار عند افتتاح تلك الجلسة ويخرج عند إغلاقها، بينما الشرط الذي يفحصه هو سعر إغلاق نفس الشريط. لا أحد يعرف سعر الإغلاق عند جرس الافتتاح.
اللوحة أدناه تشغل كلا النسختين على SPY، متتبع S&P 500، عبر عشر سنوات تقويمية. العمود الأول هو المستحيل. الثاني يؤخر الشرط المطابق بجلسة واحدة، وهو أقرب وقت يمكن لحساب ممول التصرف بناءً عليه.
استعلام SQL الدقيق وراء كل رقم
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 yearالفصل ليس دقيقًا. في 2016، متوسط النسخة التي تستخدم نفس الشريط 0.447% لكل جلسة مؤهلة بينما متوسط النسخة المؤجلة -0.008%، بفارق 0.455 نقطة مئوية في اليوم. في 2025، يقرأ الاثنان 0.636% و-0.03%. مع ما يقرب من 140 جلسة مؤهلة في السنة، فإن فارق نصف نقطة مئوية لكل جلسة يتراكم إلى منحنى حقوق ملكية لم يطبعه أي حساب حي على الإطلاق.
الميزة الكاملة تعريفية. اختيار الجلسات التي أغلقت فوق افتتاحها، ثم قياس الفتح إلى الإغلاق في تلك الجلسات نفسها، يقيس كمية مضمونة الإيجابية. القاعدة اكتشفت مرشحها الخاص.
تختبئ متغيرات من هذا في البيانات اليومية طوال الوقت: متوسط متحرك يتضمن إغلاق اليوم ويستخدم لتداول اليوم، إشارة محسوبة على أسعار تم تعديلها بالفعل لتقسيم لم يحدث بعد، أمر إيقاف خلال اليوم يوضع عند أعلى سعر جلسة لم يطبع بعد. الشكل المشترك هو طابع زمني للقرار يسبق أحد مدخلاته الخاصة.
الآلية الثانية: مجموعة مرسومة من الناجين اليوم
الآلية الثانية لا تلمس القاعدة أبدًا. إنها تقع في قائمة الأسماء التي يُسمح للقاعدة برؤيتها.
اسحب قائمة رموز من مزود بيانات حالي، وشغّلها للخلف عشر سنوات، وتستبعد العينة بصمت كل شركة أفلسَت، أو تم الاستحواذ عليها، أو شُطبت على طول الطريق. لم تُعرض القاعدة أبدًا على الخاسرين. تقيس اللوحة حجم هذا الإغفال: كل اسم مدرج في الولايات المتحدة تداول 200 جلسة على الأقل فوق دولار واحد في سنة تقويمية معينة، حصة تلك المجموعة التي لا تزال تطبع الأسعار في يوليو 2026، ومتوسط العائد السنوي للمجموعة بأكملها بجانب متوسط الناجين وحدهم.
استعلام SQL الدقيق وراء كل رقم
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 yearمن بين 7063 اسمًا تجاوزت العتبة في 2015، كان 52.5% لا يزال يتداول في يوليو 2026. بالنسبة لمجموعة 2024، الرقم هو 87.5%، وهو في الغالب مسألة وقت منقضي: اسم من 2024 كان لديه سنتان ليختفي واسم من 2015 كان لديه إحدى عشرة سنة.
أعمدة العائد تحمل التحيز نفسه. في 2017، عاد الاسم المتوسط 7.51% بينما عاد الناجي المتوسط 11.32%، بفجوة 3.81 نقطة مئوية تُمنح مجانًا. الفجوة إيجابية في كل سنة من السنوات 10 الموضحة. استراتيجية تم اختبارها على الناجين ترثها قبل اتخاذ أي قرار، والقواعد التي تفحص الضعف ترث أكثر من المتوسط، لأن الأسماء التي اختفت تقع بشكل غير متناسب في تلك المجموعة.
التصحيح هو مجموعة في نقطة زمنية: قائمة الأسماء كما كانت في كل تاريخ إعادة توازن، بما في ذلك الشطب، مع إغلاق مركز مشطوب عند آخر سعر له بدلاً من حذفه من السجل.
الآلية الثالثة: بيانات تمت مراجعتها بعد ختم تاريخها
الأسعار مختومة مرة واحدة. الأساسيات ليست كذلك. رقم ربع سنوي يحمل تاريخ نهاية الربع، ويتم تعديله بإيداع لاحق، وقاعدة بيانات تخزن فقط النسخة الحالية ستخدم بسعادة الرقم المعدل مقابل التاريخ الأصلي. قاعدة تفحص هذا الرقم تقرأ تصحيحًا استغرق شهورًا للوصول.
يمر نفس النمط عبر قوائم عضوية المؤشر المعاد بناؤها إلى المكونات الحالية، وتواريخ تقديرات المحللين المعاد كتابتها بالإجماع النهائي، وتعديلات إجراءات الشركات المطبقة بأثر رجعي عبر سلسلة أسعار كاملة. في كل حالة، السجل المخزن هو لقطة في زمن المضارع ترتدي تاريخًا في زمن الماضي.
ممارستان تحتويانه. استخدم مصدرًا يحتفظ بالنسخ القديمة، أي القيمة كما كانت معروفة في كل تاريخ بدلاً من القيمة كما هي معروفة الآن. عندما تكون النسخ القديمة غير متاحة، طبق تأخيرًا في الإبلاغ سخيًا بما يكفي لتغطية التأخير الحقيقي، وعامل طول ذلك التأخير كمعلمة تستحق الاختبار بدلاً من تفصيل يستحق التخمين.
كيف يبدو المنحنى عندما يتسرب المستقبل
تحيز النظر إلى المستقبل له بصمة: أداء يقع أعلى بكثير مما قدمه السوق الأساسي. نقطة مرجعية مفيدة هي سقف النظر إلى الوراء، النمو الذي كان سينتجه توقع مثالي ليوم واحد مقدمًا على أداة واحدة.
استعلام SQL الدقيق وراء كل رقم
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 yearالسقف هائل. في 2020، ضاعفت البصيرة المثالية ليوم واحد على SPY رأس المال 27.7 مرة على 253 جلسة، مقابل 16.2% لمجرد الاحتفاظ بالصندوق. في أكثر السنوات هدوءًا من العشر، 2017، أعاد نفس التوقع المثالي 2.2 ضعف رأس المال.
العمود الأوسط يوضح مدى تركيز هذا السقف. استبعد الجلسات التي ربحت أكثر من 2%، ويتحول 2020 من 16.2% إلى -44.9%. تسرب يستحق فقط حفنة من تلك الجلسات في السنة يحرك اختبارًا رجعيًا بعيدًا جدًا. المنحنى ذو السحوبات الضحلة، ومعدل الضربات العالي، وأفضل أيامه متجمعة في أكثر جلسات السوق عنفًا، يستحق تدقيقًا.
المعايرة أهم من أي عتبة واحدة. قاعدة تدّعي 40% سنويًا سلسًا على مدى عقد تدّعي جزءًا كبيرًا من سقف النظر إلى الوراء، والسؤال الصادق هو أي مدخل أخبرها بما كان سيحدث.
كيفية اختبار اختبار رجعي لتحيز النظر إلى المستقبل
- أخر كل شيء بشريط واحد. انقل كل إشارة فترة كاملة واحدة لاحقًا وأعد التشغيل. المزايا الحقيقية تتلاشى قليلاً. التسريبات تنهار، غالبًا إلى لا شيء.
- شوش المستقبل. خذ البيانات بعد كل طابع زمني للقرار، واستبدلها بضوضاء أو إعادة ترتيب، وأعد تشغيل منطق القرار. يجب أن يخرج كل قرار متطابقًا. أي قرار يتحرك قد قرأ شيئًا لم يكن بإمكانه معرفته.
- عامل الطوابع الزمنية كبيانات. لكل مدخل، خزن اللحظة التي أصبحت فيها القيمة متاحة بجانب اللحظة التي تصفها. الصلة التي لا تقارن هذين العمودين أبدًا لا يمكنها فرض القاعدة.
- أعد بناء المجموعة كما في التاريخ. قم بتضمين الأسماء المشطوبة والمستحوذ عليها، وأغلقها عند آخر سعر لها، وشغل نفس القاعدة على كلتا المجموعتين لقياس مساهمة البقاء.
- قس مقابل السقف. ضع عائد الاستراتيجية بجانب رقم الشراء والاحتفاظ ورقم البصيرة المثالية لنفس الفترة. المسافة من السقف هي سياق لا تعطيه نسبة شارب وحدها.
تحديد حجم المركز يأتي في اتجاه مجرى كل هذا. معدل الفوز المتضخم يغذي حجم رهان متضخم، وهو المكان الذي يحول فيه تحديد حجم مركز معيار كيلي خطأ محاسبيًا إلى سحوبة. نفس الانضباط ينطبق قبل تحريك رأس المال الحقيقي: التداول الورقي قبل المال الحقيقي يختبر آليات الأمر، والأنظمة الآلية تحمل نفس الخطر بسرعة الآلة، مغطى في أنظمة تداول الذكاء الاصطناعي متعددة الوكلاء. التأثيرات التي تنجو من الاختبار الدقيق في نقطة زمنية، مثل شذوذ التقلب المنخفض، مثيرة للاهتمام لهذا السبب بالضبط.
الأسئلة الشائعة
ما هو تحيز النظر إلى المستقبل في الاختبار الرجعي؟
هو استخدام بيانات في صفقة محاكاة لم تكن متاحة عند وضع الصفقة. الأشكال الشائعة هي اتخاذ قرار على شريط سعر تنفذ الصفقة داخله أيضًا، وفحص مجموعة من الشركات المدرجة حتى اليوم، وقراءة رقم مالي تمت مراجعته بعد التاريخ المرفق به.
كيف يمكنك اكتشاف تحيز النظر إلى المستقبل؟
أخر كل إشارة بفترة كاملة واحدة وأعد التشغيل: التسرب عادة ينهار بينما الميزة الحقيقية تتلاشى بلطف. اختبار أقوى يستبدل كل البيانات بعد كل طابع زمني للقرار بضوضاء ويؤكد أن كل قرار يخرج دون تغيير.
هل تحيز البقاء هو نفس تحيز النظر إلى المستقبل؟
إنهما متميزان لكنهما يسافران معًا. تحيز البقاء هو عينة مبنية من الأسماء التي استمرت، ومعرفة الأسماء التي استمرت هي بحد ذاتها معلومات من المستقبل، لذا فإن مجموعة الناجين فقط هي تسرب نظر إلى المستقبل يقع في البيانات بدلاً من القاعدة.
لماذا تبدو الاختبارات الرجعية مع تحيز النظر إلى المستقبل جيدة جدًا؟
التسرب يختار النتائج بدلاً من التنبؤ بها. في اللوحة أعلاه، فحص الجلسات على سعر إغلاقها الخاص أنتج متوسط ربح جلسة حوالي 0.455 نقطة مئوية فوق النسخة المؤجلة في 2016، وهي ميزة تعريفية وليست مكتسبة.
ما هي بيانات نقطة زمنية؟
بيانات نقطة زمنية تخزن كل قيمة كما كانت معروفة في كل تاريخ تاريخي، بما في ذلك الرقم الأصلي وكل مراجعة لاحقة، جنبًا إلى جنب مع مجموعة الأوراق المالية كما كانت في ذلك اليوم. إنها المرجع الذي يحتاجه الاختبار الرجعي لإظهار أن مدخلاته كانت موجودة قبل قراراته.
كل رقم أعلاه هو استعلام مخزن ومُرقم على أشرطة يومية حقيقية. وسّع SQL لأي لوحة، أو شغل اختبار التأخير على قاعدتك الخاصة على محطة ستراسمور.