22 أكتوبر 2026 · البيانات

أعدنا بناء اختبار تاريخي بعد أن غيّر مزوّد البيانات سجلاته السابقة

أعدنا بناء اختبار تاريخي بعد أن غيّر مزوّد البيانات سجلاته السابقة

بعد ستة أسابيع من تشغيلنا اختبارًا تاريخيًا، أعدنا تشغيله بالشيفرة والإعدادات والنطاق الزمني نفسها. اختلف رصيد رأس المال في النهاية. لم يكن الاختلاف هائلًا، لكنه كان كافيًا لخفض نسبة Sharpe من 1.31 إلى 1.08 وتغيير مجموعة المعلمات التي بدت الأفضل.

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

الاثنين: اختلفت نتيجة إعادة التشغيل

كان أول دليل فجوة صغيرة في زوج فوري عالي السيولة. أظهرت الشمعة الأصلية قمة عند 62,418، بينما أظهرت نتيجة إعادة التشغيل 62,431. بدا الفرق غير مؤثر إلى أن تتبعنا دخول الاستراتيجية: فقد وقع حدّها بين هذين السعرين. أدت تغييرات في بضع شموع إلى إشارات مختلفة، ثم إلى مراكز مختلفة بعد عدة أيام.

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

هذا سلوك عادي للبيانات. فالبورصات تصلح السجلات، والمزوّدون يملؤون الفجوات ويصححون الأسعار الشاذة ويعدّلون منطق التجميع. وقد يُرجع الاستعلام عن «بيانات يناير» نتيجة مختلفة في مارس.

الثلاثاء: اكتشفنا الإيصال المفقود

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

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

ما سجّلناهما أتاح لنا معرفتهما كان ينقصنا
المزوّد، والرمز، والنطاق الزمنيأي طلب أرسله التشغيلمحتوى الرد
إصدار خط المعالجةأي شيفرة أنشأت الشموعصفوف الإدخال المحددة
الطابع الزمني للتشغيلمتى شغّلنا المهمةأي تنقيح من بيانات المزوّد كان متاحًا حينها

عاملنا «الاستعلام نفسه» على أنه يعني «البيانات نفسها». وجعل هذا الافتراض التجربة تبدو أسهل في إعادة الإنتاج مما كانت عليه في الواقع.

الأربعاء: غيّر التصحيح رواية النتائج

أعدنا تشغيل التواريخ المتأثرة باستخدام كلا الإصدارين المتاحين من البيانات. أزالت الشموع المنقحة عمليتي دخول، وقدّمت إحدى عمليات الخروج شمعة واحدة. وكانت هذه التداولات الثلاثة مسؤولة عن معظم التغير في Sharpe. تأثرت الاستراتيجية ببضعة رصدات قرب مستوى التفعيل، رغم أن سلسلة الأسعار الإجمالية بدت شبه متطابقة على الرسم البياني.

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

الخميس: غيّرنا سجل البحث

أضفنا لقطات إدخال غير قابلة للتغيير إلى عمليات البحث الجديدة. يحصل كل قسم على بصمة محتوى، ويسجل بيان التشغيل المصدر ووقت الاسترجاع وإصدار المخطط وسياسة التعديل وإصدار شيفرة التحويل. وبالنسبة إلى مجموعات البيانات الكبيرة، نحتفظ بالملفات الفعلية في تخزين معنون بالمحتوى، بحيث يمكن مشاركة الأقسام المتطابقة من دون الكتابة فوق الإصدارات السابقة.

عندما تمنعنا قواعد التخزين أو الترخيص من الاحتفاظ بالبيانات الخام، نحفظ أقوى إيصال تسمح به الشروط: البصمات، ومعلمات الطلب، ومعرّفات إصدار المصدر، وعينة صغيرة من الصفوف المحللة لتشخيص المشكلات. لا تستطيع البصمة استعادة البيانات، لكنها تخبرنا إن كان تشغيلان قد استهلكا بايتات متطابقة.

يحتاج الاختبار التاريخي القابل لإعادة الإنتاج إلى معرّف للمدخلات، لا إلى URL للبيانات فحسب. سجّل ما وصل، ومتى وصل، وكيف تحوّل إلى الصفوف التي استهلكتها استراتيجيتك.

الجمعة: ما سنتجاوزه في المرة المقبلة

سنتجاوز مقارنة المقاييس الرئيسية وحدها. يخبرك تغير Sharpe بأن شيئًا ما قد تغير، لكنه لا يحدد السبب. ابدأ بأعداد الصفوف وبصمات الأقسام، ثم اعثر على أول تاريخ يختلف فيه الإدخال. ومن هناك، قارن الصفوف بعد تحويلها، ثم الإشارات، ثم الأوامر، ثم عمليات التنفيذ، بهذا الترتيب.

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

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

بيانات السوق، الاختبار التاريخي، هندسة البيانات، قابلية إعادة الإنتاج
→ جميع المقالات