برمجة بايثونعلوم البيانات

كيفية حساب المتوسطات المتحركة في بايثون

دليل أكاديمي شامل يشرح كيفية حساب المتوسطات المتحركة في لغة بايثون باستخدام مكتبات NumPy وPandas مع التطبيقات الرياضية والبيانية لمعالجة السلاسل الزمنية.

تاريخ النشر

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

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

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

1. مقدمة نظرية حول مفهوم المتوسطات المتحركة وأهميتها في تحليل السلاسل الزمنية

1.1 التعريف الرياضي والإحصائي للمتوسط المتحرك

في نظرية تحليل السلاسل الزمنية، تُعرف السلسلة الزمنية على أنها دالة عشوائية متقطعة تُرسم فيها القيم المتتالية على محور زمني محدد. رياضياً، تتكون أي سلسلة زمنية كلاسيكية من أربعة مكونات بنيوية رئيسية: الاتجاه العام طويل المدى (Secular Trend)، والتغيرات الدورية أو الموسمية (Seasonal/Cyclical Variations)، والتقلبات غير المنتظمة أو الضوضاء العشوائية (Irregular or Stochastic Noise). تسعى عملية التمهيد أو الترشيح الإحصائي (Smoothing) إلى عزل مركب الضوضاء عالي التردد لإبراز الاتجاه منخفض التردد، وتُعتبر خوارزمية المتوسط المتحرك مرشحاً خطياً لتمرير الترددات المنخفضة (Low-pass Filter) يهدف إلى حساب معدل موضعي ديناميكي يتغير بتغير النقطة الزمنية المستهدفة.

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

1.2 الأهمية التطبيقية للمتوسطات المتحركة في تحليل البيانات

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

علاوة على ذلك، تلعب المتوسطات المتحركة دوراً جوهرياً كمدخلات أساسية في مرحلة هندسة الميزات (Feature Engineering) والمعالجة المسبقة للبيانات قبل تغذية نماذج التعلم الآلي والتعلم العميق. إن تزويد خوارزميات التنبؤ بميزات ممهدة زمنياً ذات فترات استرجاع مختلفة يتيح للنماذج التقاط ديناميكيات السلسلة عبر مقاييس زمنية متعددة (Multi-scale Temporal Representations)، مما يحسن من استقرار الأوزان الرياضية داخل الشبكات العصبية ويزيد من دقة التنبؤ، فضلاً عن دورها في النمذجة الإحصائية الذاتية مثل نماذج الانحدار الذاتي والمتوسطات المتحركة (ARIMA) ونماذج الفضاء الحالاتي (State-Space Models).

1.3 مفهوم حجم النافذة الزمنية (Window Size) وتأثيره الحسابي

يُمثل حجم النافذة الزمنية، والذي يُرمز له عادة بالرمز الرياضي $k$ أو $n$، المعامل الفوقي الأكثر حساسية في تشكيل سلوك المتوسط المتحرك وخصائصه الإحصائية. يُعرف حجم النافذة بأنه عدد الملاحظات التاريخية المتتالية التي يشملها الحساب عند كل خطوة زمنية. ينطوي تحديد هذا الحجم على مقايضة رياضية معقدة بين الاستجابة السريعة للتغيرات (Responsiveness) ومستوى التنعيم المطلوب (Smoothing Degree). كلما زاد حجم النافذة، اتسعت قاعدة البيانات الداخلة في التقدير الإحصائي، مما يؤدي إلى منحنى فائق النعومة يخمد الضوضاء بشكل شبه تام ولكنه يتسبب في نشوء تأخير زمني ملموس (Time Lag)، حيث تتأخر إشارة المتوسط المتحرك في مواكبة التحولات الحقيقية المفاجئة في السلسلة الأصلية.

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

2. الأنواع الرياضية الأساسية للمتوسطات المتحركة

2.1 المتوسط المتحرك البسيط (Simple Moving Average – SMA)

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

$$SMA_t = \frac{1}{k} \sum_{i=0}^{k-1} x_{t-i}$$

يقوم المبدأ الأساسي لهذا النموذج على التوزيع المتساوي تماماً للأوزان الاحتمالية، حيث تمتلك كل نقطة داخل النافذة الزمنية وزناً ثابتاً يعادل $w_i = \frac{1}{k}$، بينما تُعطى البيانات الواقعة خارج حدود النافذة وزناً صفرياً مطلقاً. يمنح هذا الاشتقاق نموذج SMA بساطة حسابية فائقة وسهولة في التفسير المباشر في التطبيقات الهندسية والإحصائية.

على الرغم من هذه الميزات البديهية، يعاني المتوسط المتحرك البسيط من محدوديات إحصائية هيكلية. تتلخص العلة الرئيسية في ما يُعرف بـ “تأثير الصدمة المزدوجة” (Drop-off Effect)، حيث يتأثر المتوسط مرتين بالنقطة الواحدة الشاذة: المرة الأولى عند دخولها إلى نطاق النافذة، والمرة الثانية عند خروجها منها بعد انقضاء $k$ من الفترات، مما يولد تغيرات مفاجئة في قيمة المتوسط لا تعكس تحولاً حقيقياً في السلسلة اللحظية. بالإضافة إلى ذلك، فإن فرضية الأوزان المتساوية تتعارض مع الطبيعة الديناميكية للعديد من الظواهر الواقعية التي تفترض أن الملاحظات الأحدث زمنياً تحمل معلومات أكثر موثوقية حول المستقبل القريب مقارنة بالبيانات القديمة.

2.2 المتوسط المتحرك التراكمي (Cumulative Moving Average – CMA)

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

$$CMA_t = \frac{1}{t} \sum_{i=1}^{t} x_i$$

لتجنب إعادة جمع السلسلة بالكامل عند كل نقطة زمنية جديدة ولتوفير الكفاءة الحسابية، يمكن إعادة كتابة هذه المعادلة وفق صياغة عودية (Recursive Formulation) أنيقة تعتمد على القيمة السابقة للمتوسط والملاحظة الحالية:

$$CMA_t = CMA_{t-1} + \frac{x_t – CMA_{t-1}}{t}$$

تُظهر الصياغة العودية أن تأثير الملاحظة الجديدة $x_t$ يضمحل تدريجياً مع تقدم الزمن وازدياد قيمة $t$. يجد المتوسط التراكمي تطبيقاته المثالية في مراقبة استقرار العمليات الصناعية (Statistical Process Control)، وتقدير المعلمات الثابتة للأنظمة العشوائية المستقرة (Stationary Ergodic Processes)، حيث يلتقارب$CMA$ مع القيمة المتوقعة الحقيقية للتوزيع الرياضي وفقاً لـ قانون الأعداد الكبيرة، في حين يفقد فائدته كمرشح تتبعي في البيئات الديناميكية غير المستقرة التي تتغير معالمها التوزيعية عبر الزمن.

2.3 المتوسط المتحرك الأسي (Exponential Moving Average – EMA)

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

$$EMA_t = \alpha \cdot x_t + (1 – \alpha) \cdot EMA_{t-1}$$

حيث يمثل $\alpha$ معامل الترجيح أو معامل التخامد (Smoothing Factor)، وهو قيمة تنحصر حصرياً في النطاق $(0, 1]$. ترتبط قيمة المعامل $\alpha$ ارتباطاً وثيقاً بحجم النافذة المكافئة $N$ عبر العلاقة الرياضية القياسية:

$$\alpha = \frac{2}{N + 1}$$

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

2.4 المتوسط المتحرك المرجح (Weighted Moving Average – WMA)

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

$$WMA_t = \frac{\sum_{i=0}^{k-1} (k – i) \cdot x_{t-i}}{\sum_{j=1}^{k} j}$$

يخضع مقام الكسر للمطابقة الرياضية لمجموع الأعداد الطبيعية الأولى، والتي تُختصر إلى الصيغة التحليلية المغلقة:

$$\sum_{j=1}^{k} j = \frac{k(k + 1)}{2}$$

يضمن هذا التطبيع الإحصائي أن يكون مجموع الأوزان مساوياً تماماً للواحد الصحيح، مما يحافظ على مقياس الوحدات الأصلية للبيانات. يكمن الفارق الدقيق بين الترجيح الخطي في WMA والترجيح الأسي في EMA في أن الأول يقطع التأثير التاريخي تماماً بعد $k$ من الخطوات الزمنية مع انخفاض خطي ثابت في الأوزان، بينما يمد الثاني ذيلاً تراجعياً لانهائياً من الأوزان المتناقصة هندسياً، مما يوفر للمحلل أداة وسيطة متوازنة تجمع بين الاستجابة السريعة للملاحظات الحديثة والحد الصارم للذاكرة التاريخية للنموذج.

3. إعداد بيئة العمل وتثبيت المكتبات البرمجية اللازمة في بايثون

3.1 تجهيز بيئة التطوير الافتراضية وحزم العمل

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

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

3.2 استعراض المكتبات الأساسية: NumPy و Pandas

تشكل مكتبتا NumPy و Pandas الأساس الحسابي والبنيوي لكافة عمليات معالجة البيانات وتحليل السلاسل الزمنية في بيئة بايثون. توفر مكتبة NumPy هياكل مصفوفات عالية الأداء تُعرف بـ ndarray، والتي تتيح تنفيذ العمليات الرياضية على المتجهات والمصفوفات متعددة الأبعاد بسرعات تقارب لغات البرمجة منخفضة المستوى مثل C و Fortran بفضل تخزين البيانات في كتل ذاكرية متجاورة (Contiguous Memory Blocks) واستخدام تعليمات SIMD الحاسوبية المتطورة لتسريع المعالجة المتوازية.

في المقابل، تبني مكتبة Pandas طبقة تجريد هندسية متقدمة فوق NumPy من خلال هياكل البيانات Series و DataFrame، والتي تدمج الكفاءة الحسابية للمصفوفات مع إمكانات الفهرسة الزمنية الغنية (DatetimeIndex)، وإدارة المحاذاة التلقائية للمشاهدات، والتعامل الذكي مع البيانات المفقودة. تتفوق هذه البنى المتجهية بآلاف المرات على القوائم والحلقات التكرارية القياسية في بايثون، ليس فقط في سرعة التنفيذ، بل أيضاً في استهلاك الذاكرة وحماية البنية المنطقية للبيانات من أخطاء الإزاحة الزمنية غير المقصودة.

3.3 مكتبات التصوير البياني: Matplotlib و Seaborn

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

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

4. حساب المتوسط المتحرك البسيط (SMA) باستخدام مكتبة NumPy

4.1 خوارزمية المجموع التراكمي باستخدام دالة np.cumsum()

تعتمد إحدى أكثر الطرق كفاءة لحساب المتوسط المتحرك البسيط على مصفوفات NumPy أحادية البعد على خوارزمية المجموع التراكمي المسبق (Prefix Sums)، والتي يتم تنفيذها برمجياً عبر دالة np.cumsum(). تقوم الفلسفة الرياضية لهذه الخوارزمية على حقيقة أن مجموع العناصر داخل أي نافذة منزلقة بطول $k$ يمكن استخراجه بخطوة حسابية وحيدة عبر طرح قيمتين تراكميتين: المجموع التراكمي حتى نهاية النافذة مطروحاً منه المجموع التراكمي حتى النقطة التي تسبق بداية النافذة مباشرة.

لتطبيق هذه الخوارزمية برمجياً دون فقدان التناسق البعدي، يتم إدراج قيمة صفرية في بداية مصفوفة المجموع التراكمي لمحاذاة الفروق الحسابية بدقة. تتيح عمليات التقطيع المتجهي (Vectorized Slicing) طرح الشريحة المتقدمة من الشريحة المتأخرة للمصفوفة التراكمية، ثم قسمة الناتج مباشرة على حجم النافذة $k$. يتميز هذا النهج بتعقيد زمني خطي فائق الكفاءة$O(N)$ وتعقيد مكاني منخفض، حيث لا تتغير سرعة الحساب بزيادة حجم النافذة $k$، مما يجعله متفوقاً بشكل قاطع على أي محاولة لحساب المجاميع المنفصلة عبر الحلقات التكرارية المستقلة.

4.2 تطبيق دالة الالتفاف الرياضي np.convolve()

في معالجة الإشارات الخطية، تُعد عملية الالتفاف المتقطع (Discrete Linear Convolution) العملية الرياضية الأساسية التي تصف استجابة أي مرشح خطي ثابت زمنياً (LTI Filter). لحساب المتوسط المتحرك البسيط باستخدام الالتفاف في NumPy، يتم الاستعانة بالدالة np.convolve()، حيث يتم تمثيل السلسلة الزمنية كإشارة دخل أولى، ويتم بناء نواة ترشيح منتظمة (Uniform Kernel) أحادية البعد ذات طول يعادل حجم النافذة $k$، وتكون كافة عناصرها متساوية وتساوي بالضرورة$frac{1}{k}$.

توفر دالة np.convolve() ثلاثة أوضاع تشغيلية أساسية تتحكم في أبعاد المصفوفة الناتجة: الوضع 'full' الذي يحسب الالتفاف عند كافة نقاط التراكب الممكنة وينتج مصفوفة بطول $N + k – 1$، والوضع 'same' الذي يعيد مصفوفة بنفس طول السلسلة الأصلية $N$ عبر توسيط النافذة، والوضع 'valid' الذي يقتصر حسابه فقط على النقاط التي تتطابق فيها نواة الترشيح كلياً مع السلسلة الزمنية دون الحاجة إلى افتراض قيم صفرية خارج الحدود، لينتج مصفوفة ممهدة دقيقة بطول $N – k + 1$. تتطابق مخرجات وضع 'valid' رياضياً وبدقة متناهية مع نتائج خوارزمية المجموع التراكمي، مع توفير تجريد رياضي يربط الكود بمفاهيم التحليل الطيفي والترشيح الرقمي.

4.3 بناء دالة مخصصة ومعالجة الأطراف المفقودة

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

يمكن للدالة المخصصة أن تدمج مصفوفة من القيم غير المعرفة (np.nan) بطول $k-1$ في مقدمة النتائج المخرجة من الالتفاف الصالح ('valid')، مما يضمن الحفاظ على تطابق الطول الإجمالي للمصفوفة الناتجة مع السلسلة الأصلية وتسهيل عمليات التراكب والمقارنة المباشرة. كما يمكن توسيع الدالة لتدعم احتساب متوسطات جزئية توسعية للأطراف الأولى، بحيث يتم تقسيم مجموع العناصر المتاحة في البداية على عددها الفعلي المتزايد تدريجياً حتى تكتمل النافذة، وهو ما يوفر استمرارية حسابية سلسة وخالية من الانقطاعات العددية مع الحفاظ على الأداء الحسابي المتجهي الصارم.

5. تطبيق المتوسطات المتحركة باستخدام مكتبة Pandas

5.1 استخدام الدالة الأساسية .rolling() مع المتوسط .mean()

تقدم مكتبة Pandas التجريد البرمجي الأكثر شمولاً وأناقة لمعالجة النوافذ المتحركة عبر كائن Rolling الذي يتم إنشاؤه عبر الدالة .rolling() المدمجة في كائنات Series و DataFrame. يتميز هذا الكائن بالقدرة على تقسيم السلسلة الزمنية إلى شرائح متتابعة دون نسخ البيانات في الذاكرة، ثم تطبيق العمليات التجميعية الرياضية، وفي مقدمتها دالة .mean()، لاحتساب المتوسط المتحرك البسيط بخطوة برمجية واحدة تتسم بالوضوح الرياضي والكفاءة البرمجية العالية.

تعتمد دالة .rolling(window=k) بشكل افتراضي سلوك المحاذاة الخلفية (Right-aligned or Trailing Window)، مما يعني أن القيمة المحسوبة عند النقطة الزمنية $t$ تعبر حصرياً عن متوسط المشاهدات من اللحظة $t-k+1$ وحتى اللحظة $t$. يحمي هذا السلوك الافتراضي النماذج من الانزلاق في أخطاء التنبؤ بالاعتماد على المستقبل، وينتج عنه وضع قيم غير معرّفة NaN في المواضع الأولى التي يقل عدد عناصرها عن $k$. يتيح تكامل كائن Rolling مع البنية الفهرسية لـ Pandas تطبيق المتوسطات الحسابية بسلاسة على آلاف الأعمدة المتوازية داخل إطار البيانات، مع المحافظة على التوافق الزمني التام بين مختلف السلاسل.

5.2 التحكم في معامل الحد الأدنى للملاحظات min_periods

يُمثل المعامل min_periods أحد أهم أدوات الضبط الإحصائي المتاحة ضمن دالة .rolling() في Pandas. يحدد هذا المعامل العددي الحد الأدنى من المشاهدات الصالحة (غير المفقودة) الواجب توفرها داخل النافذة الزمنية لاحتساب المتوسط الحسابي، بدلاً من إعادة قيمة NaN. في الوضع الافتراضي، يتطابق min_periods مع حجم النافذة window، وهو السبب المباشر لظهور القيم المفقودة في صدارة السلسلة الناتجة.

من خلال تعيين min_periods=1، يتم توجيه Pandas للبدء الفوري في احتساب المتوسط الحسابي منذ أول نقطة تظهر في السلسلة، حيث يتم احتساب متوسط الملاحظة الأولى منفردة، ثم متوسط أول ملاحظتين، وهكذا دواليك حتى تكتمل النافذة بالحجم المطلوب. يُلغي هذا الإجراء الفجوات الزمنية البادئة في المخططات والتحليلات، ولكنه يفرض في الوقت نفسه ضرورة إدراك المحلل الإحصائي بأن التقديرات الأولى للمتوسط تعاني من تباين إحصائي أعلى (Higher Variance) نظراً لاعتمادها على عينات صغيرة الحجم مقارنة بالتقديرات المستقرة التي تعقب اكتمال النافذة.

5.3 محاذاة النوافذ الزمنية وضبط المركزية عبر المعامل center

تتيح دالة .rolling() تعديل نمط محاذاة النافذة الزمنية عبر تفعيل المعامل المنطقي center=True. عند تفعيل هذه الخاصية، يتم توزيع النافذة الزمنية بشكل متناظر حول النقطة المركزية المستهدفة، بحيث تشمل النافذة المشاهدات التاريخية السابقة والمشاهدات المستقبلية اللاحقة بالتساوي تقريباً حول اللحظة $t$. يُصاغ المتوسط المركزي رياضياً لنافذة ذات حجم فردي$k=2m+1$ كالتالي:

$$SMA_{t, \text{centered}} = \frac{1}{2m+1} \sum_{j=-m}^{m} x_{t+j}$$

يمثل التوسيط المتناظر الخيار الأمثل لتحليل السلاسل الزمنية التاريخية وعزل الأنماط الموسمية والدورية في الدراسات الاقتصادية والفيزيائية الرجعية، نظراً لأنه يقضي تماماً على ظاهرة التأخير الزمني (Zero Phase Distortion)، مما يجعل قمم وقيعان المتوسط المتحرك تتطابق بدقة هندسية مطلقة مع مواقعها الأصلية في السلسلة دون أي إزاحة طورية. غير أن هذا النمط ينطوي على خطورة بالغة ومحظورة كلياً في النمذجة التنبؤية وأنظمة التداول، حيث يؤدي تفعيل التوسيط إلى حدوث ما يُعرف بـ “التسريب الزمني” أو “انحياز استشراف المستقبل” (Look-ahead Bias)، إذ تصبح تنبؤات الحاضر معتمدة بشكل مباشر على قيم لم تكن قد وقعت بعد في الخط الزمني الحقيقي للبيانات.

6. حساب المتوسط المتحرك الأسي (EMA) في بايثون

6.1 استخدام دالة .ewm() في Pandas

توفر مكتبة Pandas واجهة متخصصة فائقة التطور لاحتساب المتوسطات والعمليات الإحصائية الموزونة أسياً عبر التابع .ewm() (Exponentially Weighted Moving). يتيح هذا الكائن تعريف مصفوفات التخامد بدقة وتطبيق العمليات التجميعية مثل .mean() و .std() و .var() عبر توجيه رياضي مباشر يستند إلى معادلات التناقص الأسي دون الحاجة إلى بناء هياكل برمجية معقدة من الصفر.

تتميز الدالة .ewm() بمرونة استثنائية في استقبال معاملات التوصيف الرياضي، حيث تتيح للمستخدم تحديد معدل التخامد عبر أربعة بدائل رياضية متكافئة: المعامل المباشر alpha ($0 < alpha le 1$)، أو نطاق الامتداد المكافئ للنافذة span ($N ge 1$) حيث $\alpha = \frac{2}{N + 1}$، أو مركز الكتلة com (Center of Mass) حيث $\alpha = \frac{1}{1 + c}$، أو نصف العمر الزمني halflife وهو الزمن اللازم لانخفاض الوزن النسبي إلى النصف. يُلزم هذا التصميم الهندسي المبرمج باختيار معامل وحيد فقط من هذه المعاملات الأربعة، لتتولى Pandas حساب المشتقات الرياضية المقابلة وتطبيقها على كامل السلسلة بكفاءة خوارزمية عالية مكتوبة بلغة C.

6.2 الضبط الإحصائي للمعامل adjust

يتحكم المعامل المنطقي adjust في دالة .ewm() في البنية الرياضية العميقة لمعادلة الترجيح، وهو ما ينعكس بشكل جوهري على قيم المتوسط المتحرك الأسي في الفترات الزمنية المبكرة للسلسلة. عند استخدام الوضع الافتراضي adjust=True، يتم احتساب المتوسط كحاصل قسمة مجموع القيم المرجحة بالأوزان المتناقصة على مجموع تلك الأوزان الفعلية، وفق الصيغة التحليلية التالية:

$$y_t = \frac{\sum_{i=0}^t (1-\alpha)^i x_{t-i}}{\sum_{i=0}^t (1-\alpha)^i}$$

يضمن هذا الضبط تطبيع مجموع الأوزان في الفترات الأولى ليكون مساوياً تماماً للواحد الصحيح، مما يلغي الانحياز التقديري الذي قد ينشأ عن عدم اكتمال التاريخ الزمني الافتراضي اللانهائي للأوزان الأسية. في المقابل، يؤدي ضبط المعامل إلى adjust=False إلى إجبار الدالة على اعتماد المعادلة التكرارية التقليدية البسيطة ($y_t = \alpha x_t + (1-\alpha)y_{t-1}$) مع اعتبار القيمة الأولى $y_0 = x_0$ كقيمة استهلالية مطلقة. يُفضل استخدام adjust=False في التطبيقات الهندسية التكرارية ومعالجة الإشارات اللحظية، بينما يمثل adjust=True المعيار الإحصائي الأدق في تحليل السلاسل الزمنية التاريخية ومعالجة البيانات المتقطعة.

6.3 بناء خوارزمية EMA نقية من الصفر باستخدام بايثون

إن بناء خوارزمية المتوسط المتحرك الأسي بصيغة نقية (Pure Python) دون الاستعانة بالدوال الجاهزة في Pandas يمثل خطوة أساسية لفهم الميكانيكا الحسابية الدقيقة وتطوير دوال مخصصة للأنظمة المدمجة ومحركات التحليل اللحظي (Real-time Streaming Engines). تعتمد الخوارزمية النقية على حلقة تكرارية تبدأ بتهيئة القيمة الاستهلالية، والتي يمكن أن تكون المشاهدة الأولى ذاتها أو المتوسط الحسابي البسيط لأول $n$ من المشاهدات لتحسين استقرار التقدير الأولي.

تتدرج الخوارزمية عبر المشاهدات الزمنية المتتالية، حيث يتم تحديث قيمة المتوسط في كل خطوة بضرب القيمة الجديدة في المعامل $\alpha$ وجمعها مع حاصل ضرب المتوسط السابق في المعامل $(1-\alpha)$. عند مقارنة نتائج هذه الخوارزمية التكرارية الصريحة مع مخرجات pandas.Series.ewm(adjust=False).mean()، نجد تطابقاً رقمياً مطلقاً في كافة المنازل العشرية، وهو ما يثبت دقة النموذج الرياضي التكراري ويوفر للمطورين كوداً تأسيسياً قابلاً للتحويل بسهولة إلى لغات منخفضة المستوى مثل C++ أو Rust أو دمجه داخل خطوط أنابيب معالجة التدفقات البيانية (Data Streams).

7. حساب المتوسط المتحرك المرجح (WMA) والمتوسط المتحرك التراكمي (CMA)

7.1 تطبيق دالة .expanding() لحساب المتوسط التراكمي (CMA)

تقدم مكتبة Pandas التابع الإحصائي .expanding() كأداة هندسية متخصصة في حساب النوافذ التوسعية التي تبدأ من النقطة الصفرية وتتمدد تلقائياً مع كل سطر جديد في السلسلة الزمنية. عند ربط هذا التابع بالدالة التجميعية .mean()، يتم توليد المتوسط المتحرك التراكمي (CMA) لسلسلة المشاهدات بشكل فوري ومحمي من أخطاء الذاكرة المؤقتة، مع إمكانية تحديد الحد الأدنى للملاحظات عبر المعامل min_periods كما في النوافذ المنزلقة.

يتميز كائن expanding().mean() بقدرته على توفير نظرة لحظية لتطور المعلمات الإحصائية عبر الزمن؛ فمع تزايد عدد المشاهدات، يتقارب المنحنى التوسعي بشكل مطرد نحو المتوسط الحسابي العام للسلسلة، مما يجعله أداة استثنائية لمراقبة تقارب النماذج العشوائية، واكتشاف الانزياحات التدريجية في خط الأساس (Baseline Drift)، واختبار استقرار التوزيع الاحتمالي للبيانات دون الحاجة إلى إعادة ضبط حدود النوافذ الحسابية يدوياً.

7.2 تطوير دالة حساب المتوسط المتحرك المرجح (WMA) برمجياً

نظراً لعدم توفر دالة مدمجة مباشرة تحت مسمى wma داخل مكتبة Pandas، يتطلب حساب المتوسط المتحرك المرجح تطوير دالة برمجية مخصصة تجمع بين كائن .rolling() والعمليات المتجهية في NumPy. يتمثل الإجراء الرياضي الأسرع في تعريف مصفوفة أوزان خطية متدرجة تبدأ من 1 وحتى $k$، ثم تطبيع هذه المصفوفة بقسمة عناصرها على مجموعها الإجمالي لضمان أن يكون مجموع الأوزان مساوياً لـ 1.

يمكن تمرير مصفوفة الأوزان إلى السلسلة المقتطعة عبر استخدام الدالة .apply() مع تحديد raw=True لتمرير شرائح NumPy مباشرة وتفادي العبء البرمجي لكائنات Pandas، حيث يتم حساب الضرب النقطي (Dot Product) بين متجه الأوزان ومتجه النافذة الزمنية: np.dot(window, weights). يحقق هذا النهج كفاءة تنفيذية عالية تفوق الطرق التقليدية، كما يمنح الباحث حرية كاملة في تخصيص أشكال هندسية متباينة لمصفوفات الأوزان، سواء كانت خطية، أو مثلثية، أو جيبية، بما يخدم الأغراض التحليلية الدقيقة للمشروع.

7.3 المقارنة الرياضية والعملية بين WMA و SMA و CMA

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

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

نوع المتوسط المتحرك توزيع الأوزان النسبية زمن التأخير (Lag) التعقيد الحسابي أبرز مجالات الاستخدام المثالية
البسيط (SMA) متساوٍ وثابت ($1/k$) مرتفع ($k/2$) $O(1)$ مع المجموع التراكمي عزل الضوضاء الدورية، خطوط الأساس العامة
المرجح (WMA) خطي متناقص ($w_i propto i$) متوسط $O(k)$ لكل خطوة زمنية تتبع الاتجاهات قصيرة المدى، الميكانيكا الحركية
الأسي (EMA) أسي متناقص ($(1-\alpha)^i$) منخفض جداً $O(1)$ بالصيغة التكرارية التحكم الآلي، المؤشرات الفنية، معالجة الإشارات
التراكمي (CMA) متناقص توافقياً ($1/t$) تراكمي لانهائي $O(1)$ بالصيغة العودية مراقبة الجودة، تقييم استقرار التوزيع الإحصائي
جدول 1: مقارنة إحصائية وهندسية شاملة بين الأنواع الرياضية الأساسية للمتوسطات المتحركة.

8. معالجة القيم المفقودة (NaNs) وإدارة النوافذ الزمنية المعقدة

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

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

في الحالات التي يتطلب فيها التطبيق الحفاظ على الطول التام للسلسلة وتفادي إزاحة الطوابع الزمنية، يمكن اللجوء إلى استراتيجيات التعويض التكيفي باستخدام دالة .fillna()، مثل التعويض بالأمام bfill أو التعويض بالخلف ffill، أو تطبيق الاستيفاء الخطي المتقدم (Linear Interpolation) عبر الدالة .interpolate(method='time'). يجب التعامل مع هذه الدوال بحذر شديد، حيث إن تعويض القيم المفقودة بطرق غير مدروسة قد يؤدي إلى تضخيم غير واقعي لنقاط الاستقرار أو تكرار بيانات سابقة، مما يقلل من تباين السلسلة ويخلق إشارات زائفة.

8.2 المتوسطات المتحركة المعتمدة على الفترات الزمنية المتقطعة (Time-based Windows)

في العديد من السلاسل الزمنية الواقعية، مثل سجلات خوادم الويب وتدفقات بيانات إنترنت الأشياء والبيانات المالية غير المنتظمة، لا يتم تسجيل المشاهدات على فواصل زمنية متساوية، مما يجعل استخدام النوافذ المعتمدة على عدد الملاحظات الثابت (Fixed-count Windows) مضللاً إحصائياً؛ إذ قد تمثل النافذة ذات العشر ملاحظات فترة عشر ثوانٍ في أوقات الذروة، بينما تمثل عشر ساعات في أوقات الركود. لحل هذه المعضلة البنيوية، تتيح مكتبة Pandas استخدام النوافذ المعتمدة على الفواصل الزمنية الحقيقية (Time-based Windows).

يشترط لتفعيل هذه الخاصية أن يكون فهرس السلسلة الزمنية من نوع DatetimeIndex ومرتباً تصاعدياً بشكل صارم. عندئذ، يمكن تمرير سلاسل توصيف التردد الزمني إلى معامل window، مثل '7D' لسبعة أيام، أو '12h' لاثنتي عشرة ساعة، أو '30min' لنصف ساعة. تقوم خوارزمية Pandas في هذه الحالة بحساب المتوسط لكافة الملاحظات التي تقع فعلياً داخل النطاق الزمني المحدد بالعودة إلى الوراء من طابع المشاهدة الحالية، متكيفة تلقائياً مع تباين الكثافة العددية للبيانات وتغير معدلات أخذ العينات دون أدنى خلل رياضي.

8.3 التحقق من صحة البيانات وجودتها قبل التنعيم الحسابي

تُعد عملية تنقية وتدقيق جودة البيانات (Data Validation and Quality Assurance) خطوة إلزامية تسبق تمرير أي سلسلة زمنية عبر خوارزميات المتوسطات المتحركة. نظراً لأن المتوسط الحسابي يتأثر بشكل كبير بالقيم الشاذة المتطرفة (Outliers)، فإن وجود قيمة شاذة وحيدة ناتجة عن عطل في أجهزة الاستشعار أو خطأ في التسجيل كفيل برفع أو خفض مسار المتوسط المتحرك بالكامل، مما يخلق موجة تشويه مصطنعة تستمر طوال فترة بقاء هذه القيمة الشاذة داخل حدود النافذة الزمنية.

يتضمن التدقيق المنهجي فحص انتظام التردد الزمني، والتحقق من رتابة الفهارس، وتطبيق مرشحات إحصائية أولية لكشف الشذوذ مثل طريقة النطاق الربيعي (IQR) أو درجات Z-score المعدلة. في البيئات شديدة الضوضاء، يُنصح باستبدال المتوسط الحسابي الأولي بـ الوسيط المتحرك (Rolling Median) عبر الدالة .rolling().median() كخطوة تنقية أولية، حيث يمتلك الوسيط كفاءة مناعية فائقة ضد القيم الشاذة، مما يضمن بقاء مسار التمهيد معبراً عن السلوك الحقيقي للظاهرة وتجنب تضليل المحللين بنتوءات إحصائية زائفة.

9. تصوير ورسم المتوسطات المتحركة بيانياً باستخدام Matplotlib و Seaborn

9.1 إنشاء مخططات السلاسل الزمنية المتعددة ومقارنة المنحنيات

يمثل الرسم البياني المتراكب الأداة التحليلية الأولى لتقييم كفاءة المرشحات الزمنية وفهم التفاعل الديناميكي بين السلسلة الخام ومسارات التمهيد المتباينة. باستخدام مكتبتي Matplotlib و Seaborn، يتم رسم السلسلة الزمنية الأصلية كخط أساسي بلون خافت أو شفافية منخفضة (alpha=0.4) لإظهار التذبذبات الطبيعية للبيانات، ثم تراكب خطوط المتوسطات المتحركة ذات النوافذ الزمنية المتدرجة (مثل SMA-7 و SMA-30 و SMA-90) بألوان مميزة وتباين بصري واضح وسماكات خطية مدروسة.

يتطلب الإخراج الأكاديمي الاحترافي للمخططات تضمين عناصر إيضاحية متكاملة تشمل عناوين المحاور المحددة بوحدات القياس الفيزيائية أو المالية، وشبكة إحداثيات ثانوية ورئيسية خافتة (grid(True, which='both', linestyle='--', alpha=0.5)) لتسهيل القراءة اللحظية، وتنسيق الطوابع الزمنية على المحور السيني باستخدام مصنفات التاريخ التلقائية matplotlib.dates، فضلاً عن وسيلة إيضاح (Legend) واضحة المعالم توضح بدقة النوافذ الزمنية المستخدمة ومعاملات التخامد المصاحبة لكل منحنى معروض.

9.2 رسم نطاقات التقلب والمؤشرات المشتقة (Bollinger Bands)

تُعد نطاقات بولينجر (Bollinger Bands) أحد أهم النماذج الإحصائية المشتقة مباشرة من المتوسطات المتحركة، حيث تجمع بين قياس الاتجاه المركزي وقياس التشتت الديناميكي للبيانات عبر الزمن. يتكون هذا المؤشر الإحصائي من ثلاثة خطوط رئيسية: الخط الأوسط وهو عبارة عن متوسط متحرك بسيط (عادة بحجم نافذة $k=20$)، والحد العلوي والحد السفلي اللذان يتم حسابهما بإضافة وطرح مضاعف عددي (عادة $2sigma$) من الانحراف المعياري المتحرك (Rolling Standard Deviation) المحسوب عبر .rolling(20).std().

يتم تجسيد هذه النطاقات بيانياً في بايثون عبر الاستعانة بالدالة المتطورة plt.fill_between()، والتي تتيح تظليل المساحة المحصورة بين الحدين العلوي والسفلي بلون شفاف وأنيق. يوفر هذا التظليل الإحصائي قراءة بصرية مباشرة لمستويات التقلب (Volatility) في السلسلة؛ فعندما تتقارب النطاقات يضيق التظليل مشيراً إلى مرحلة سكون واستقرار، وعندما تتباعد النطاقات يتسع التظليل كاشفاً عن تصاعد حاد في حدة التذبذبات العشوائية، مما يحول المتوسط المتحرك من مجرد مرشح أحادي إلى قناة ديناميكية متكاملة لتقييم المخاطر والمستويات الحرجة للبيانات.

9.3 إنشاء لوحات عرض متعددة (Subplots) لتحليل الإشارات

في التحليلات المتقدمة للأنظمة الديناميكية، لا يكفي الاكتفاء بمخطط فردي واحد، بل تبرز الحاجة إلى بناء لوحات عرض متعددة متزامنة زمنياً (Synchronized Multi-panel Subplots) باستخدام دالة plt.subplots(nrows, ncols, sharex=True). يضمن تمرير المعامل sharex=True ربط المحاور الزمنية لكافة المخططات الفرعية بشكل محكم، بحيث يؤدي التكبير أو التحريك في أي مخطط إلى تحديث فوري ومتزامن لكافة المخططات الأخرى في اللوحة.

يتيح هذا التكوين المعماري تقسيم التحليل إلى مستويات رأسية متسقة؛ حيث يُخصص المخطط العلوي لعرض الإشارة الأصلية وتراكب المتوسطات المتحركة السريعة والبطيئة ونطاقات التقلب، بينما يُخصص المخطط السفلي لعرض متسلسلة الفروق المتبقية (Residuals Series) الناتجة عن طرح المتوسط المتحرك من السلسلة الأصلية ($e_t = x_t – SMA_t$)، أو لرسم مؤشرات التباعد والتقارب اللحظي (مثل مؤشر MACD المشتق من فروق EMA). يُختتم هذا الإجراء بحفظ الرسومات البيانية بدقة عالية (dpi=300) بصيغ موجهة مثل PNG أو PDF أو SVG لضمان جاهزيتها الكاملة للتضمين في التقارير الفنية والأوراق البحثية المحكمة.

10. تطبيقات عملية متقدمة ودراسات حالة واقعية في بايثون

10.1 دراسة حالة 1: تتبع وتقييم مؤشرات المبيعات والطلب التجاري

تمثل بيانات المبيعات اليومية في المنشآت التجارية نموذجاً كلاسيكياً للسلاسل الزمنية التي تعاني من تشوهات موسمية أسبوعية حادة، حيث تتضاعف وتيرة الطلب خلال عطلات نهاية الأسبوع وتتراجع في منتصفه، مما يعيق قدرة صناع القرار على استقراء الاتجاه الفعلي لنمو الأعمال. من خلال استيراد السلسلة الزمنية للمبيعات وفهرستها زمنياً في Pandas، يتم تطبيق استراتيجية تمهيد مزدوجة تعتمد على نافذة أسبوعية قصيرة (7 أيام) لعزل الأثر اليومي المنتظم، ونافذة شهرية متوسطة (30 يوماً) لاستخلاص الاتجاه العام للطلب التجاري.

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

10.2 دراسة حالة 2: تحليل البيانات السلوكية ومقاييس الأداء الرقمي

في مجال هندسة البرمجيات ومراقبة البنى التحتية السحابية، تولد الخوادم وتطبيقات الويب تدفقات هائلة من مقاييس الأداء اللحظية، مثل زمن استجابة الخادم (Latency)، ومعدلات استهلاك وحدة المعالجة المركزية (CPU Utilization)، ومعدل التفاعل اللحظي للمستخدمين. تتسم هذه المقاييس بوجود نبضات مفاجئة ونقر عشوائي (Spikes) يؤدي الاعتماد المباشر عليه إلى إطلاق إنذارات خاطئة متكررة (Alert Fatigue) تُربك فرق التشغيل والمراقبة.

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

10.3 دراسة حالة 3: استراتيجيات التقاطع المزدوج (Double Crossover Strategy)

تُعد استراتيجية التقاطع المزدوج للمتوسطات المتحركة إحدى أقدم وأوسع خوارزميات التداول المنهجي واستخراج الإشارات استخداماً في الهندسة المالية وتحليل السلاسل الزمنية الكمية. تعتمد الخوارزمية رياضياً على بناء مؤشرين متحركين بآفاق زمنية متباينة: متوسط سريع (Fast MA) ذي نافذة قصيرة يستجيب بحساسية للحركات الأخيرة، ومتوسط بطيء (Slow MA) ذي نافذة أطول يمثل الاتجاه الهيكلي العام للسلسلة.

تتم صياغة المنطق البرمجي لاكتشاف نقاط التقاطع داخل Pandas عبر المقارنة المنطقية بين المتجهين واستخراج الفروق الإشارية عبر الدالة np.sign() وتتبع تغيراتها عبر .diff(). يولد النظام إشارة صعودية (تقاطع ذهبي – Golden Cross) عندما يقطع المتوسط السريع نظيره البطيء متجهاً للأعلى، بينما يولد إشارة هبوطية (تقاطع الموت – Death Cross) عند اختراقه نحو الأسفل. على الرغم من النجاح المنهجي لهذه الاستراتيجية في تتبع الاتجاهات الواضحة والأسواق الصاعدة القوية، إلا أن تحليل الأداء يظهر بوضوح معاناتها من ظاهرة التأخير الزمني في الأسواق العرضية المتقلبة، مما يتسبب في توليد إشارات متأخرة وخسائر ناتجة عن التذبذب العشوائي (Whipsaw Effect)، وهو ما يستدعي دمجها الدائم مع مرشحات الزخم ونطاقات التقلب الإحصائية.

11. مقارنة الأداء الحسابي وتحسين كفاءة الشيفرة البرمجية

11.1 قياس الزمن الحسابي باستخدام أداة %timeit والمكتبات القياسية

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

تكشف الاختبارات المعيارية للأداء عن تفاوت هائل في السرعة الحسابية بين الأساليب المختلفة؛ إذ تحتل الحلقات التكرارية الصريحة في بايثون (Pure Python for loops) أدنى مراتب الأداء بزمن تنفيذ بطيء جداً ناتج عن الطبيعة الديناميكية لتفسير الكود في بايثون (Dynamic Typing Overhead). في المقابل، تظهر دالة الالتفاف np.convolve() وطريقة المجموع التراكمي np.cumsum() تفوقاً ساحقاً في السرعة، تليهما مباشرة دالة .rolling().mean() في Pandas، والتي صُممت بلغة C لتوفير توازن مثالي بين سرعة المعالجة المتجهية وإدارة الفهارس المعقدة دون استهلاك غير مبرر للذاكرة المؤقتة.

11.2 تسريع العمليات باستخدام مكتبة Numba والترجمة الآنية (JIT)

تمثل مكتبة Numba الحل التكنولوجي الأمثل للجمع بين بساطة كتابة الشيفرة بلغة بايثون والأداء فائق السرعة للغات البرمجة المترجمة منخفضة المستوى مثل C++. تعتمد Numba على تقنية الترجمة الآنية (Just-In-Time Compilation – JIT) المدعومة بمحرك LLVM، حيث تقوم بترجمة الدوال البرمجية المكتوبة بلغة بايثون مباشرة إلى تعليمات الآلة الأصلية (Machine Code) في زمن التشغيل الأول للدالة.

من خلال تزيين الدوال المخصصة للمتوسطات المتحركة بالمزيّن @jit(nopython=True, fastmath=True)، يتم تحويل الحلقات التكرارية الصريحة إلى شيفرة مجمعة فائقة الأداء تتفادى تماماً قفل المفسر العام (GIL) وتسمح بالتنفيذ المتوازي عبر الأنوية الحسابية المتعددة للمعالج. يتفوق هذا الأسلوب بشكل خاص عند تنفيذ خوارزميات معقدة مخصصة مثل المتوسطات المرجحة غير الخطية أو المرشحات التكيفية التي تتطلب تكرارات معتمدة على الحالات السابقة ولا يمكن صياغتها بسهولة عبر العمليات المتجهية القياسية، حيث يحقق أداءً يتطابق كلياً مع كود C الأصلي ويتجاوز في بعض الحالات دوال Pandas المدمجة.

11.3 أفضل الممارسات البرمجية للتعامل مع البيانات الضخمة (Big Data)

تتطلب معالجة السلاسل الزمنية العملاقة التي تتجاوز سعة الذاكرة العشوائية المتاحة (RAM) تطبيق استراتيجيات هندسية متقدمة في إدارة البيانات وتدفقاتها. تتمثل الممارسة الأولى في تحسين أنماط البيانات العددية (Downcasting)؛ حيث يتم تحويل الأعمدة العددية من النمط الافتراضي مزدوج الدقة float64 إلى النمط أحادي الدقة float32 عبر df.astype('float32')، وهو إجراء يخفض استهلاك الذاكرة إلى النصف فوراً دون أي تأثير ملموس على دقة التقديرات الإحصائية للمتوسطات.

علاوة على ذلك، ينبغي الاعتماد الصارم على مفهوم “المشاهدات” (Views) وتجنب إنشاء نسخ غير ضرورية من المصفوفات في الذاكرة (Memory Copies)، واستخدام آلية معالجة البيانات على دفعات متتابعة (Chunking) عبر تحديد المعامل chunksize عند قراءة الملفات الضخمة من الأقراص الصلبة. كما يُنصح بالتكامل مع مكتبات الحوسبة الموزعة مثل Dask أو Polars التي تعتمد على محركات تنفيذ موازية مكتوبة بلغة Rust وتوفر دعماً أصلياً لتقييم العمليات الكسول (Lazy Evaluation) والنوافذ المنزلقة الموزعة عبر العناقيد الحاسوبية، مما يتيح حساب المتوسطات المتحركة لمليارات السجلات الزمنية بسلاسة مطلقة وبأعلى كفاءة تشغيلية ممكنة.

12. الأخطاء الشائعة، أفضل الممارسات، والتطويرات المستقبلية

12.1 الأخطاء البرمجية والإحصائية الشائعة وكيفية تجنبها

يقع العديد من المطورين والمحللين في أخطاء منهجية جسيمة أثناء حساب المتوسطات المتحركة قد تؤدي إلى إفساد التحليل الإحصائي أو فشل النماذج التنبؤية بالكامل. يأتي في مقدمة هذه الأخطاء ظاهرة “التسريب الزمني” (Lookahead Leakage) الناتجة عن الاستخدام غير المقصود للنوافذ المركزية (center=True) في النمذجة الاستشرافية، أو محاذاة البيانات باستخدام طوابع زمنية مستقبلية، مما يجعل النموذج يظهر أداءً خارقاً وغير حقيقي أثناء التدريب، ثم ينهار كلياً عند اختباره في بيئة الإنتاج الحقيقية.

يتمثل الخطأ الثاني في إساءة تقدير الأثر المدمر للقيم المتطرفة والشاذة على المتوسط الحسابي البسيط، والاعتماد عليه كمرشح وحيد دون فحص تشتت البيانات، مما يولد إشارات مضللة وموجات انحياز طويلة الأمد. يضاف إلى ذلك خطأ التعويض العشوائي للقيم المفقودة في صدارة السلسلة باستخدام دوال مثل fillna(0) أو التعويض بالمتوسط العام، وهو ما يؤدي إلى حقن إشارات اصطناعية هابطة تشوه البنية التوزيعية للمتوسطات الأولى. يُعالج هذا القصور بالالتزام الصارم بالإسقاط الآمن عبر dropna() أو الضبط الحذر للمعامل min_periods.

12.2 أفضل الممارسات في كتابة وتوثيق كود معالجة البيانات

يتطلب التطوير البرمجي الاحترافي لمنظومات معالجة السلاسل الزمنية تبني أعلى معايير هندسة البرمجيات وتوثيق الشيفرة وفق المعايير القياسية العالمية PEP 8. يتضمن ذلك بناء دوال برمجية معيارية ومستقلة، مدعومة بتعليقات توضيحية شاملة (Docstrings) بصيغة NumPy أو Google Style، تشرح بالتفصيل المعايير الرياضية للدالة، والمدخلات والمخرجات المتوقعة، والافتراضات الإحصائية المفروضة على السلسلة الزمنية.

علاوة على ذلك، يجب تطبيق التحقق الصارم من الأنواع عبر تلميحات الأنواع (Type Hints) واستخدام أدوات التدقيق الساكن مثل mypy، مع كتابة اختبارات وحدة متكاملة (Unit Tests) باستخدام إطار العمل pytest للتحقق المستمر من دقة الحسابات الرياضية ومطابقتها للمخرجات المرجعية النظرية، والتعامل الصحيح مع الحالات الحدية (Edge Cases) مثل السلاسل الزمنية الفارغة، أو المصفوفات التي تحتوي بالكامل على قيم مفقودة، أو النوافذ التي يتجاوز حجمها طول السلسلة ذاتها، مما يضمن استقرار الكود البرمجي وجاهزيته للعمل ضمن بيئات الإنتاج المعقدة.

12.3 المتوسطات التكيفية والترشيحات المتقدمة في بايثون

مع تطور نظرية معالجة الإشارات، ظهرت أجيال متقدمة من المرشحات التكيفية التي تتجاوز محدوديات المتوسطات المتحركة التقليدية ذات الأوزان الثابتة. يبرز في هذا السياق “المتوسط المتحرك التكيفي لـ كوفمان” (Kaufman’s Adaptive Moving Average – KAMA)، والذي يقوم بتعديل معامل التخامد $\alpha$ ديناميكياً في كل خطوة زمنية بناءً على “نسبة الكفاءة” (Efficiency Ratio) التي تقيس مدى هدوء أو اضطراب حركة السلسلة؛ حيث يبطئ المرشح استجابته تلقائياً في الفترات العرضية المضطربة لتفادي الإشارات الكاذبة، ويسرع استجابته فور اكتشاف اتجاه حركي قوي وواضح.

يمتد التطوير المستقبلي ليشمل استخدام مرشحات كالمان (Kalman Filters) ونماذج الفضاء الحالاتي التي توفر تقديراً بيانياً احتمالياً للحالة الحقيقية للنظام عبر دمج الملاحظات المشوشة مع النماذج الديناميكية للتنبؤ بالخطأ اللحظي وتحديثه تكرارياً. تمثل هذه المرشحات المتقدمة، المتوفرة في بايثون عبر مكتبات مثل filterpy و pykalman، الامتداد الطبيعي والمتطور لتقنيات التمهيد الإحصائي، حيث تشكل حلقة الوصل بين المعالجة الإشارية الكلاسيكية والنماذج التنبؤية الحديثة في الذكاء الاصطناعي وهندسة التحكم الذاتي.

خاتمة شاملة

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

إن إتقان التعامل مع هذه الأدوات يتطلب التوفيق المستمر بين الفهم الرياضي الدقيق للنماذج والبراعة البرمجية في استغلال هياكل البيانات المتجهية في NumPy و Pandas، والقدرة على تحسين الأداء عبر Numba والتصوير البصري الدقيق عبر Matplotlib. تظل المتوسطات المتحركة، برغم بساطتها المفاهيمية، حجر الزاوية الأساسي في صرح تحليل السلاسل الزمنية، ومنصة الانطلاق الإلزامية نحو بناء نماذج تنبؤية متقدمة وحلول تحليلية رصينة قادرة على استخلاص الحقيقة الإحصائية من خضم البيانات المضطربة.

References

اقتباس هذا المقال

looti, M. (2026, أغسطس 26). كيفية حساب المتوسطات المتحركة في بايثون. عرب سايكلوجي. https://arabpsychology.com/statistics/how-to-calculate-moving-averages-in-python/
looti, Mohammed. “كيفية حساب المتوسطات المتحركة في بايثون.” عرب سايكلوجي, 26 أغسطس 2026, https://arabpsychology.com/statistics/how-to-calculate-moving-averages-in-python/.
looti, Mohammed. “كيفية حساب المتوسطات المتحركة في بايثون.” عرب سايكلوجي. أغسطس 26, 2026. https://arabpsychology.com/statistics/how-to-calculate-moving-averages-in-python/.