الاختبار المستمر ليس خارج العينة تلقائياً: حين تجتاز الضوضاء الخالصة بوابة الإطلاق
يُباع التحقق بالاختبار المستمر على أنه الدليل القاطع على أن استراتيجية ما خارج العينة فعلاً، لكنه ليس كذلك بالضرورة. شغّلتُ مسار الاختبار المستمر نفسه على ضوضاء عشوائية خالصة فأنتج نسبة شارب مُجمَّعة موجبة وصحية، لأن كون النافذة خارج العينة خاصية من منشأ البيانات، لا من طريقة تقسيمها. هنا ضابط المسيرة العشوائية الذي يكشف إن كان مسارك، أم فرصتك الحقيقية، هو من أنتج ذلك الرقم.

شغّلتُ ذات مرة مسار الاختبار المستمر (Walk-forward) بأكمله على ضوضاء خالصة، فاجتاز الاختبار.
ولم يكن اجتيازاً هامشياً. غذّيت الآلية عينها التي أستخدمها لكي أمنح استراتيجية حقيقية تذكرة إطلاقها للتداول الفعلي بمسيرة عشوائية (Random Walk) اصطناعية، سلسلة أسعار بلا فرصة (Edge) قط ببنيتها: مسح شبكة من فترات الاسترجاع (Lookbacks)، والاحتفاظ بالفائزين، وتحريك النافذة، ودمج قِطع خارج العينة في منحنى رأس مال واحد، وإعادة المعاينة (Bootstrap) لحساب فترة ثقة. والرقم الذي نتج عن ذلك كله كان نسبة شارب (Sharpe Ratio) مُجمَّعة خارج العينة تتجاوز الواحد بارتياح، بحد أدنى يتجاوز الصفر بوضوح. على رمية عملة. ولو لم أكن أعرف أن المُدخَل كان ضوضاء، لكان ذلك المنحنى قد اجتاز بوابة الإطلاق عندي مباشرة، ولكنت قد حجّمت رأس مال حقيقي في مواجهة فرصة لم تكن موجودة أصلاً.
هذا هو المقال بأكمله في تجربة واحدة. يُباع التحسين بالاختبار المستمر، على نطاق شبه إجماعي، بوصفه ما يجعل اختبار المحاكاة صادقاً: تدرّب على الماضي، واختبر على مستقبل لم تكن تراه، وكرّر. وقد يكون كذلك فعلاً. لكن الطيّات (Folds) والمنحنى المُجمَّع وفترة الثقة الأنيقة ليست ما يجعل نافذة ما خارج العينة. كانت الثلاثة كلها بحوزتي، على الضوضاء. ما يجعل نافذة خارج العينة هو شيء لا تستطيع المخرجات أن تُظهره لك، وهو ما أريدك أن تخرج به من هذا المقال.
خارج العينة صفة منشأ لا صفة تقسيم
إليك الجملة التي كنت أتمنى لو وشمها لي أحدهم على باطن جفنيّ قبل أن أبني أياً من هذا: لا تكون النافذة المحجوزة خارج العينة إلا إذا كانت المعاملات التي تُختبَر عليها قد ثُبِّتت قبل أن ينظر إليها أحد.
تقسيم بياناتك إلى كتلة داخل العينة وأخرى خارج العينة تالية لها زمنياً يبدو وكأنه يؤدي المهمة. إنه لا يؤديها. فالتقسيم ضروري، لكنه أبعد ما يكون عن الكافي. و"التأخر زمنياً" ليس مرادفاً لـ"غير المرئي للبحث". فإن كان مسحي الشبكي قد نظر إلى تاريخ الأسعار كاملاً، واختار فترة الاسترجاع الأعلى تسجيلاً عبره جميعاً، ثم بعد ذلك فقط رسم حدود الطيّات حول ذلك الفائز المُختار سلفاً، فإن كل نافذة خارج العينة تُقيَّم بمعامل حُسِّن على بيانات تتضمن تلك النافذة نفسها. الشموع لاحقة. المعلومة ليست جديدة. البحث قد اختلس النظر بالفعل.
لهذا أميّز، بلا هوادة، بين شيئين ينتجان مخرجات متطابقة تماماً:
- اختبار مستمر حقيقي، اختير فيه معامل كل طيّة من نافذتها داخل العينة وحدها، أو سُجِّل مسبقاً (Pre-registered) قبل النظر إلى أي بيانات. تحمل قِطعه خارج العينة دليلاً تنبؤياً حقيقياً.
- مسح استقرار (Stability Scan)، تُفحَص فيه توليفة واحدة، اختيرت بمعرفة كاملة بالسلسلة بأسرها، عبر فترات فرعية متعددة. يجيب هذا عن سؤال حقيقي ومفيد ("هل تصمد هذه التوليفة عبر أنظمة سوق مختلفة؟")، لكنه لا يحمل أي دليل خارج العينة، لأن التوليفة رأت أصلاً كل فترة يجري "التحقق" منها عليها الآن.
ومسح الاستقرار ليس إهانة، بل أداة مشروعة تماماً. الخطأ الأفدح هو أن تُلبِس أحدهما ثوب الآخر، لأنك في اللحظة التي تسمّيه فيها خارج العينة، ترث كل بوابة لاحقة تملكها، أي فترة إعادة المعاينة، ونسبة شارب المُعدَّلة (Deflated Sharpe)، ومونت كارلو، رقماً كان ملوَّثاً منذ المصدر، وتُبيّضه إلى ما يبدو جديراً بالثقة.
الفارق لا يترك أثراً في الناتج
سبب صمود هذا الفخ أن التلوث لا يترك أثراً على أي شيء تفحصه عادة. فكلا الإجراءين يمنحك طيّات. وكلاهما يمنحك منحنى رأس مال مُجمَّعاً صاعداً من اليسار السفلي إلى اليمين العلوي. وكلاهما يمنحك فترة ثقة، وهنا يكمن الخطر الحقيقي: ففي سلسلة ملاءَمة ثم تقسيم إلى طيّات، تكون تلك الفترة ضيقة وموجبة، لأن العوائد التي يُعاد معاينتها وقعت فعلاً تحت معاملات لاءمت فعلاً. الحساب صادق. المنشأ مزيّف. ولا سبيل إلى إمساك الفارق بالعين المجردة، لأن الشيء الوحيد الذي يفصل اختباراً مستمراً حقيقياً عن مسح استقرار مُبيَّض هو ترتيب وقوع أمرين، اختيار المعامل والنظر إلى البيانات، وذلك الترتيب لا يظهر في أي رسم بياني.
Chart
Identical noise, two pipelines
Share of runs on a pure random walk (no edge by construction) whose stitched out-of-sample lower bound clears zero, a false pass. Only the provenance of the parameters differs. Illustrative and sanitised.
ولهذا بالضبط توقفت عن محاولة الإمساك به بالقراءة، وبنيت ضابطاً يُمسكه آلياً.
الخلاصة القابلة للنقل: شغّل مسار اختبارك على الضوضاء
إن لم تأخذ من هذا المقال سوى شيء واحد، فخذ هذا. إنه أرخص اختبارات التحقق التي أملكها وأشدها قسوة، ويسعه بعد ظهر واحد.
شغّل مسار اختبارك المستمر بأكمله، بلا أي تعديل، على مسيرة عشوائية خالصة. فإن "اجتاز" الاختبار رغم ذلك، فمسارك هو الفرصة، لا استراتيجيتك.
هذا هو الاختبار بأكمله. ولّد سلسلة أسعار اصطناعية بلا أي قابلية للتنبؤ، مسيرة عشوائية بلا انجراف (Drift)، وغذِّها عبر مسار الشيفرة عينه الذي تمر به استراتيجياتك الحقيقية: الشبكة نفسها، وهندسة الطيّات نفسها، والدمج نفسه، وبوابة إعادة المعاينة نفسها. لا تُبسِّطه. ولا تُشغِّل نسخة "تمثيلية". شغِّل الشيء الحقيقي، لأن الغاية كلها اتهام إجراءك أنت، وأي اختصار يُعفي الإجراء من المساءلة.
ثم اقرأ الحكم:
- فإن كان مسارك يختار المعاملات لكل طيّة، من بيانات داخل العينة وحدها، تنهار المسيرة العشوائية إلى نسبة شارب مُجمَّعة خارج العينة قريبة من الصفر، بحد أدنى يتراوح حول الصفر. رفض صحيح. لم يجد المسار شيئاً في لا شيء، وهذه هي الإجابة الصحيحة الوحيدة.
- وإن كان مسارك يمسح السلسلة بأكملها، ويحتفظ بأفضل خلية، ويرسم الطيّات حولها بعد ذلك، تمنحك الضوضاء نفسها نسبة شارب مُجمَّعة موجبة بثقة، بحد أدنى فوق الصفر. اجتياز كاذب، صنعته خطوة الاختيار وحدها بالكامل.
والفجوة بين هذين الحكمين، على الضوضاء عينها، هي بالضبط حجم الكذبة التي يقدر إجراؤك على روايتها. والأهم أنها خاصية في شيفرتك، لا في أي استراتيجية بعينها. وبمجرد أن تقيسها على الضوضاء، تعرف مقدار ما ينبغي أن تتشكك فيه من أي نتيجة حقيقية.
Figure
Two procedures, byte-identical artefacts
Both give folds, a rising stitched curve, and a tight confidence interval. Only one carries out-of-sample evidence.
True walk-forward
carries OOS evidence
Each fold's parameters use only that fold's in-sample window, or are pre-registered before any data is seen. The out-of-sample bars were never touched by the search.
Stability scan in disguise
carries zero OOS evidence
One config, chosen with sight of the whole series, checked across sub-periods. Useful, but the parameters already saw every window they are now validated on.
Out-of-sample is a property of provenance, not partitioning.
أحتفظ بنسخة من هذا الضابط موصولة بشكل دائم. فبين حين وآخر، يمر مُدخَل المسيرة العشوائية عبر المسار، والتأكيد بسيط: يجب ألا يتجاوز الحد الأدنى لنسبة شارب المُجمَّعة خارج العينة الصفر. واليوم الذي يتجاوزه فيه، يكون شيء ما في مسار الاختيار قد بدأ يختلس النظر، وأفضّل أن أكتشف ذلك في مواجهة ضوضاء اصطناعية على أن أكتشفه في مواجهة مدخراتي.
موضعا التسرب الفعليان
ضابط المسيرة العشوائية هو الكاشف. ويستحق الأمر أن تعرف الموضعين اللذين يدخل منهما التلوث عادة، لأن كليهما مبتذل تماماً، وكلاهما يسهل أن يصل إلى الإنتاج (Production) دون أن يُلحَظ.
أولهما الأوضح: الاختيار على السلسلة بأكملها. تمسح شبكة عبر تاريخك بأكمله لأن ذلك هو الأمر الطبيعي الذي تفعله في دفتر ملاحظات، وتُدوِّن أفضل فترة استرجاع، ثم تبني لاحقاً اختباراً مستمراً "للتحقق منها". ذلك التحقق باطل قبل أن يبدأ حتى: فالفائز اختير برؤية كل طيّة. والعلاج هو انضباط في الترتيب: إما أن تُعيد اختيار المعامل داخل كل طيّة من نافذتها داخل العينة وحدها، وتطبّقه دون تغيير على شموع خارج العينة، وتُعيد الاختيار من الصفر مع انزلاق النافذة، أو أن تُسجِّل مسبقاً الشبكة بعينها وقاعدة اختيار الفائز بعينها قبل تشغيل البيانات، بحيث يُحتسَب تمرير واحد خارج العينة لأن الاختيار أقدم إثباتاً من النظرة.
وثانيهما أهدأ، وقد أطلقته أنا شخصياً: التطبيع عبر الحد الفاصل. فحتى اختبار مستمر سليم البنية يتسرب إن طبّعت سمة (Feature) بدرجة معيارية (Z-score) محسوبة من إحصاءات كامل الطيّة، داخل العينة وخارجها معاً. عندئذ تصبح القيمة المُطبَّعة لكل شمعة داخل العينة عارفة سراً بمتوسط بيانات خارج العينة وانحرافها المعياري. تقسيم الطيّة سليم ظاهرياً؛ أما المستقبل فقد تسلل عبر مسار السمات. والقاعدة أن تُجمِّد إحصاءات التطبيع على النافذة داخل العينة، وتطبّقها، مُجمَّدة، على النافذة خارج العينة، وألا تعرض أي نسخة من الدالة تعمل على السلسلة كاملة يمكن أن تفعل ذلك عن غير قصد. الاختبار الذي أُفضّله بسيط بوحشية: أضِف شموعاً خارج العينة مسحوبة من توزيع مختلف اختلافاً جامحاً، ويجب أن تعود القيم المُطبَّعة لشريحة داخل العينة متطابقة تماماً. فإذا سمّمتَ المستقبل وتغيّر الماضي، فأنت أمام تسرب، وضابط المسيرة العشوائية عادةً ما يكون هو الذي يُمسك أثره اللاحق.
لماذا يخدع "التأخر الزمني" الجميع؟
السبب العميق وراء خداع هذا حتى الحريصين هو أننا نخلط بين معنيين لعبارة "لم يرَ النموذج هذه البيانات". فالجِدّة الزمنية (الشموع تأتي من تاريخ لاحق) تبدو وكأنها جِدّة معلوماتية (لم يستخدم أي قرار في البحث هذه الشموع). لكنهما ليسا الأمر نفسه، والثاني وحده هو ما يمنحك حق الادعاء بأنك خارج العينة. فنافذة من العام المقبل استشارها بحث المعاملات رغم ذلك، لأن البحث جرى على السلسلة كاملة، تكون طازجة زمنياً وبائتة معلوماتياً. ولا تخبرك بشيء لم تكن قد ضمّنته فيها أصلاً.
لذا فالسؤال الذي أطرحه الآن على كل نتيجة اختبار مستمر، نتائجي أنا أيضاً، ليس "هل نوافذ الاختبار لاحقة؟" بل السؤال الأصعب: هل لمس أي قرار في البحث بأكمله، من حدود الشبكة إلى قاعدة اختيار الفائز إلى تطبيع السمات، هذه الشموع في أي لحظة؟ فإن كانت الإجابة نعم في أي موضع، فالنافذة ليست خارج العينة، مهما تأخر موقعها على التقويم. المنشأ، لا التقسيم. وحين لا أثق تماماً بإجابتي أنا عن هذا السؤال، أدع المسيرة العشوائية تجيب عنه بدلاً مني، لأن الضوضاء لا فرصة فيها لتُكتَشف، فكل ما "يجده" مساري فيها هو المسار وهو يعترف.
الخلاصة
لا يكون الاختبار المستمر خارج العينة لمجرد أنك قسّمت البيانات وحرّكت نافذة، بل يكون كذلك فقط إذا ثُبِّتت المعاملات قبل أن تُفحَص النافذة التي تُقاس عليها، إما لكل طيّة على بيانات داخل العينة أو بتسجيل مسبق قبل التشغيل. وكل ما عدا ذلك مسح استقرار يرتدي ثوب الاختبار المستمر، وفترة ثقته طمأنينة ضيقة وموجبة ومزيفة بالكامل. ولا سبيل إلى إمساك الفارق بقراءة الرسم البياني، لأن التلوث لا يترك أثراً على المخرجات. فتوقف عن محاولة قراءته، وابنِ الضابط: ادفع ضوضاء خالصة عبر مسارك الحقيقي، فإن اجتاز الاختبار رغم ذلك، فقد قِستَ قدرة إجرائك أنت على الكذب. ذلك الرقم، لا المنحنى الجميل، هو ما يخبرك بمقدار ما ينبغي أن تُصدِّقه من نتيجتك التالية.
الطريقة الكاملة، الاختيار لكل طيّة مقابل التسجيل المسبق، وتجميد التطبيع عند الحد الفاصل، والبوابة عند الحد الأدنى لإعادة معاينة نسبة شارب المُجمَّعة خارج العينة، مشروحة في الفصل المجاني، الاختبار المستمر الذي يكون فعلاً خارج العينة، المتاح للقراءة مجاناً ضمن الجزء الثاني المفتوح من كتاب Building a Production Quant Trading System؛ والكتاب الكامل، نسخة رقمية حيّة على Leanpub ونسخة ورقية مطبوعة على Amazon، يمضي إلى النصف المدفوع في التحجيم وبناء المحفظة وتشغيل النظام فعلياً. وإذا كانت هذه الملاحظات الميدانية مفيدة، فالنشرة البريدية تحمل التالية منها في أسبوع نشرها.
هذا مقال هندسي، وليس نصيحة استثمارية، ولا يحتوي على أي استراتيجية قابلة للتداول. جميع الأرقام توضيحية ومُنقّحة، وكل قصة حرب هنا عن خطأ برمجي أمسكته، لا عن ربح جنيته.
Chart
Identical noise, two pipelines
Share of runs on a pure random walk (no edge by construction) whose stitched out-of-sample lower bound clears zero, a false pass. Only the provenance of the parameters differs. Illustrative and sanitised.
Figure
Two procedures, byte-identical artefacts
Both give folds, a rising stitched curve, and a tight confidence interval. Only one carries out-of-sample evidence.
True walk-forward
carries OOS evidence
Each fold's parameters use only that fold's in-sample window, or are pre-registered before any data is seen. The out-of-sample bars were never touched by the search.
Stability scan in disguise
carries zero OOS evidence
One config, chosen with sight of the whole series, checked across sub-periods. Useful, but the parameters already saw every window they are now validated on.
Out-of-sample is a property of provenance, not partitioning.
قراءات إضافية
- نسبة شارب المُعدَّلة: لماذا يكون فائز شبكة معاملاتك تشويشاً في الغالب
أفضل نسبة شارب مُتوقَّعة لمسح معاملات ترتفع كلما اتسعت الشبكة، حتى لو كانت كل استراتيجية فيها عديمة القيمة. يشرح هذا المقال نسبة شارب المُعدَّلة كما يراها ممارس فعلي، مع جدول مرجعي صغير يربط N بسقف التشويش يمكنك تطبيقه على شبكتك الليلة، والقاعدة الواحدة التي قتلت أفخر فائز حققته يوماً في مسح معاملات: N هو الحوض، لا المنصة.
- الشك قبل الاحتفال: قراءة في كتاب "بناء بيئة برمجية للتداول الكمي الإنتاجي"
مقدمة لكتابي "بناء بيئة برمجية للتداول الكمي الإنتاجي"، وهو دليل عملي لنسبة الـ 90% غير البراقة من التداول المنهجي: لماذا كتبته، وماذا تتوقع، وماذا لا تتوقع.
مقالات ذات صلة
التحيز التطلعي في اختبار المحاكاة يتنكّر في شيفرة عادية: اختبار إفساد المستقبل يفضحه
التحيز التطلعي هو الحالة الافتراضية لأي شيفرة اختبار محاكاة غير حذرة، لا حالة حدّية نادرة، وهو ينجو من المراجعة لأنه يبدو مجرد شيفرة pandas عادية. إليك اختبار السببية الذي صار الآن بوابة تمر منها كل استراتيجية: أفسِد كل سعر بعد تاريخ معين، ثم تحقق من أن لا شيء محسوب قبل ذلك التاريخ يتغير. فإذا تحرك الماضي حين تسمّم المستقبل، فالاستراتيجية تقرأ ما هو قادم.
سهم واحد يُرسم مرة واحدة: العمارة التي تُبقي البحث خارج الإنتاج
أخطر شيفرة في أي مستودع تداول هي دفتر الملاحظات الاستكشافي الذي لا يجب أن يقترب أبداً من رأس المال الفعلي. قاعدة بنيوية واحدة، هي أن تسري التبعيات في اتجاه واحد فقط، تُبقيه خارج الإنتاج وتحوّل الاقتران الخفي إلى رقم يمكنك أن تراه بأمر واحد من grep.
اشترِ المحرك، وابنِ فرصتك: الخاصية الوحيدة التي تحسم اختيار محرك التداول الكمي
اختيار محرك للتداول الكمي ليس مقارنة سمات بين NautilusTrader وbacktrader وحلقة أحداث تُكتب منزلياً. الأمر يُحسم بخاصية واحدة، ومعيار تقييم يمكن تطبيقه على أي محرك: هل يُشغّل اختبار المحاكاة لديك الشيفرة نفسها التي يعمل بها نظامك الفعلي؟