تخطٍّ إلى المحتوى
الجمعة، 9 أكتوبر 2026 · لندنENع
ريان الأزهري.الاستدامة · الطاقة · الكربون · البيئة المبنيةومنعطفات عابرة إلى الفلسفة أو الدين أو البرمجة، حيثما قاد الفضول
التداول الكمي الإنتاجي

الختم عند الفتح أم عند الإغلاق: طابع زمني واحد يُسرّب شمعة كاملة من التحيز التطلعي

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

ريان الأزهريأخصائي بيئي معتمد · 9 دقيقة قراءة
بطاقة عنوان لمقال الختم عند الفتح أم عند الإغلاق، تُظهر شمعة موسومة بالساعة 09:00 مع سهم آمن مختوم عند الإغلاق إلى اليسار وسهم تطلعي مختوم عند الفتح إلى اليمين.

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

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

تسمية واحدة، معنيان، وفارق جلسة تداول كاملة

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

Figure

Where the one-bar leak enters

A bar carries one timestamp, but that stamp is ambiguous, and the ambiguity is a full bar of look-ahead.

  1. 1

    A bar is labelled 09:00

    but is that the open or the close of the interval?

  2. 2

    Open-stamped: the interval runs 09:00 to 10:00

    its close price is only knowable at 10:00

  3. 3

    Act on that close 'at 09:00' and you reach a full bar into the future

    a clean one-bar look-ahead, invisible on a chart

A close-stamped bar carries a completed OHLC, so acting at the stamp is legitimate. An open-stamped bar does not.

Source: Building a Production Quant Trading System (Titan)

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

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

لماذا ينجو من المراجعة، ولماذا يبدو المنحنى سليماً

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

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

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

قصة حرب: الطابع الزمني الذي قرأ المستقبل

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

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

Figure

The ingest rule that closes the leak

Fix the convention once, at the boundary, before any strategy sees the data.

Establish

per feed

Read each vendor's convention from the docs and confirm it empirically, then record it in the data contract. Vendors disagree; one feed's 09:00 is another's 10:00.

Normalise at ingest

one house convention

Convert every feed to a single convention (close-stamped, one timezone) at load, so everything downstream speaks one clock.

Act only after close

complete bars only

A strategy may use a bar only once it is complete, keeping the decision window and the return window disjoint.

The leak is closed at the boundary, not policed in every strategy.

Source: Building a Production Quant Trading System (Titan)

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

القاعدة القابلة للنقل: اصطلاح واحد يُثبَّت عند الإدخال، وتصرّف بعد الإغلاق فقط

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

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

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

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

Figure

The ingest rule that closes the leak

Fix the convention once, at the boundary, before any strategy sees the data.

Establish

per feed

Read each vendor's convention from the docs and confirm it empirically, then record it in the data contract. Vendors disagree; one feed's 09:00 is another's 10:00.

Normalise at ingest

one house convention

Convert every feed to a single convention (close-stamped, one timezone) at load, so everything downstream speaks one clock.

Act only after close

complete bars only

A strategy may use a bar only once it is complete, keeping the decision window and the return window disjoint.

The leak is closed at the boundary, not policed in every strategy.

Source: Building a Production Quant Trading System (Titan)

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

أين يقع هذا كله، وأين تكمن الآلية الكاملة

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

وأحتفظ بالمعالجة الكاملة، طبقة التقويمات، وترسية الجلسات (Session Anchoring) الواعية بالتوقيت الصيفي، ومخطط عقد البيانات (Data Contract)، والتطبيع عند الإدخال الذي يفرض كل ذلك، في النصف المدفوع من الكتاب، لأن القيمة تكمن في التطبيق والعتبات، لا في الشعار. هذا المقال يمنحك قصة الحرب، وسبب كون التسرب غير مرئي، والقاعدة الواحدة التي تُغلقه. وإن أردت الآلية الكاملة، فـBuilding a Production Quant Trading System هو حيث يعيش فصل الوقت والجلسات، كنسخة رقمية حية على Leanpub ونسخة ورقية مطبوعة على Amazon، بينما يُظهر الإطار البرمجي المرافق، المُنقّح والمرخّص بموجب Apache-2.0، الشكل الذي تأخذه حدود الإدخال في الشيفرة الفعلية.

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

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

Figure

Where the one-bar leak enters

A bar carries one timestamp, but that stamp is ambiguous, and the ambiguity is a full bar of look-ahead.

  1. 1

    A bar is labelled 09:00

    but is that the open or the close of the interval?

  2. 2

    Open-stamped: the interval runs 09:00 to 10:00

    its close price is only knowable at 10:00

  3. 3

    Act on that close 'at 09:00' and you reach a full bar into the future

    a clean one-bar look-ahead, invisible on a chart

A close-stamped bar carries a completed OHLC, so acting at the stamp is legitimate. An open-stamped bar does not.

Source: Building a Production Quant Trading System (Titan)

Figure

The ingest rule that closes the leak

Fix the convention once, at the boundary, before any strategy sees the data.

Establish

per feed

Read each vendor's convention from the docs and confirm it empirically, then record it in the data contract. Vendors disagree; one feed's 09:00 is another's 10:00.

Normalise at ingest

one house convention

Convert every feed to a single convention (close-stamped, one timezone) at load, so everything downstream speaks one clock.

Act only after close

complete bars only

A strategy may use a bar only once it is complete, keeping the decision window and the return window disjoint.

The leak is closed at the boundary, not policed in every strategy.

Source: Building a Production Quant Trading System (Titan)

قراءات إضافية

طاقة المكاتب، الجزء 13 من 25

مقالات ذات صلة

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

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

· 9 min

تحيز النجاة في اختبار المحاكاة: اختبار الرائحة القائم على نسبة الأسهم المشطوبة

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

· 9 min

السعة والازدحام: لماذا تتآكل الفرصة الحقيقية كلما كبر حجمها

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

· 9 min

مقالات إلى بريدك

كتابات جديدة عن سوريا والاستدامة والتمويل، بضع مرات في الشهر.

يمكنك إلغاء الاشتراك في أي وقت. يقرأها أكثر من ٤٢٠٠ متخصّص.