Python للاختبار الخلفي في الفوركس — المكدس ودورة البحث والتحفظات الصادقة

آخر مراجعة: · محتوى دائم الخضرة
تحذير المخاطر · YMYL هذا المقال لأغراض تعليمية فحسب وليس نصيحة استثمارية. ينطوي التداول في سوق الفوركس على مخاطر عالية لخسارة رأس المال — تشير بيانات ESMA إلى أن 74–89% من حسابات التجزئة تخسر أموالها.

محاكي الاستراتيجية في MT5 يؤدّي مهمته ما دامت الاستراتيجية تسير ضمن افتراضاته — أداة واحدة، قواعد دخول بسيطة، بلا تدخّل في معالجة البيانات. لكن حين تريد ربط بيانات خارج الوسيط (البروكر)، أو دمج عدة أزواج في إشارة واحدة، أو حساب نسبة Sharpe جنباً إلى جنب مع توزيع التراجع الأقصى (drawdown)، يصطدم الأداة بسقفها. لهذا السبب بالضبط يلجأ المتداولون المنهجيون منذ سنوات إلى Python — تحكم كامل في القواعد، مكتبات على مستوى البحث العلمي، أي مصدر بيانات في سكريبت واحد، ودورة عمل تُقلّص الوقت بين الفكرة والمنحنى البياني إلى دقائق.

لماذا يتجاوز المتداولون محاكي الاستراتيجية

محاكي الاستراتيجية يتألق في تحسين خبير واحد على زوج واحد وإطار زمني واحد — وهناك تنتهي إمكاناته. عند الجمع بين بيانات من خارج الوسيط، أو بناء إشارة من أزواج متعددة، أو حساب مقاييس مخاطر أكاديمية، ينتهي المرء بلصق ملفات CSV في Excel. Python يُحوّل هذا الجهد كله إلى سكريبت واحد: تتدفق أسعار الوسيط إلى `pandas`، وتنضم إليها بيانات الاقتصاد الكلي عبر نفس أمر `merge`، وتأتي مقاييس المخاطر من مكتبات أكاديمية متخصصة.

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

المكدس التطبيقي

المكدس قصير. معالجة البيانات تقع على عاتق `pandas` و`numpy` — الأولى تمتلك السلاسل الزمنية وإعادة الأخذ (resampling) من M1 إلى H1، والثانية تتولى العمليات الحسابية المتجهة (vectorised) التي تغذّي المؤشرات. محرّك الاختبار الخلفي عادةً `backtrader` لدانيال رودريغيز، بأسلوبه القائم على الأحداث (event-driven) مع كلاسَي Strategy وCerebro، أو `vectorbt` لأولغ بولاكوف حين تحتاج إلى مسح مئات من مجموعات المعاملات في ثوانٍ. الرسوم البيانية تصدر من `matplotlib` للتقارير الثابتة ومن `plotly` للمراجعة التفاعلية. تتدفق البيانات التاريخية عبر `yfinance` للإغلاقات اليومية، و`ccxt` للعملات المشفرة، والحزمة الرسمية `MetaTrader5` لأسعار الوسيط. المكدس بأكمله مجاني ومفتوح المصدر.

دورة البحث — من القاعدة إلى التحقق

يمرّ أي مشروع عبر أربع خطوات يستحسن الفصل بينها. أولاً: اكتب قواعد الدخول والخروج بلغة عادية — إن لم تستطع قول "أفتح مركز شراء حين يكون ميل EMA-50 إيجابياً وتُسجّل الشمعة إغلاقاً فوق أعلى قيمة لعشرين يوماً"، فليس ثمة معنى لفتح المحرر. ثانياً: حوّل تلك القواعد إلى تعبيرات متجهة في `pandas` — شرط واحد على عمود كامل، لا حلقة شمعة بشمعة، وهذا هو السر الذي يجعل عشر سنوات من بيانات H1 تُختبر في ثوانٍ. ثالثاً: شغّل المحرك على التاريخ كاملاً مع العمولة، والانزلاق السعري، ووقف الخسارة وجني الأرباح، ثم اقرأ منحنى الأسهم وقائمة الصفقات. رابعاً — وهو ما يتجاهله المبتدئون بصمت — تحقق من صلاحية النتيجة خارج العينة (out-of-sample): احجز آخر عامين، حسّن على النافذة الأقدم، واقرأ الحكم من بيانات لم يمسّها التحسين.

ما لن يفعله Python وحده

يقرأ المستخدم الجديد وثائق `backtrader` فيفترض أن المكتبة تتكفّل بكل شيء. لا تفعل. المحرك الافتراضي لا يعرف شيئاً عن الفارق السعري (سبريد) لوسيطك، ولا يدري أن الأسعار تنفرج خمس نقاط (بيب) عند إصدار بيانات اقتصادية، ولا يعلم أن حساب ECN يُحمّل سبعة دولارات لكل لوت من الجانبين. أنت من يُدخل ذلك يدوياً — `commission`، و`slippage_perc`، ونموذج فارق سعري مخصص يتغير بحسب الساعة. الفخ الصامت الثاني هو جودة البيانات: سلاسل `yfinance` المجانية تحمل فجوات نهاية الأسبوع، وبيانات Dukascopy التيكية قد تكون متقطعة على الأزواج الغريبة. الخطيئة الثالثة هي عشق المنحنيات الناعمة: اختبار خلفي داخل العينة (in-sample) بخمسة معاملات مُحسَّنة يعلن دائماً 200% سنوياً حتى تُزيل متغيراً واحداً وتنظر إلى المنحنى على بيانات لم يرها المُحسِّن. النتيجة الواقعية عادةً أقل بنسبة 30 إلى 50 بالمئة مما وعدت به النسخة الساذجة.

مثال توضيحي — مشروع افتراضي على EUR/USD

لنفترض استراتيجية على افتتاح لندن لزوج EUR/USD بشموع M15: مركز شراء (لونغ) حين يُسجّل السعر فوق أعلى خمسة أشرطة بعد التاسعة صباحاً بتوقيت وارسو، ومركز بيع (شورت) عند اختراق الأدنى؛ وقف الخسارة عند 1.5 ضعف ATR(20) لعشرين فترة، وجني الأرباح عند ضعف وقف الخسارة. تسحب البيانات من 2018 حتى 2024 بحزمة `MetaTrader5`، تُحمّلها في `pandas` وتُعيد أخذها إلى M15. الاختبار الخلفي، بعمولة ستة دولارات للوت، وفارق سعري ثابت يبلغ 0.8 نقطة خارج نوافذ الأخبار ونقطة واحدة من الانزلاق العشوائي عند الدخول، يُعطي نسبة فوز 51 بالمئة، ومعامل ربح (profit factor) 1.28، وتراجعاً أقصى (drawdown) 14 بالمئة، ونسبة Sharpe 0.9. تقسيم التاريخ إلى أربع سنوات داخل العينة وعامين خارجها يُخفّض المتوسط خارج العينة بنحو الثلث — يُبقي قرار النشر على أرضية معقولة، لا وعداً مضموناً. كل رقم أعلاه توضيحي؛ يُظهر شكل الإجابة لا وعداً باستثمار.

"أصبحت Python لغة برمجة وبيئة متكاملة ذات قدرة هائلة للصناعة المالية — من تحليل البيانات المالية إلى التداول الآلي وإدارة المخاطر." — Yves Hilpisch، Python for Finance: Mastering Data-Driven Finance، O'Reilly، 2018

تحفظات صادقة يجب أن تُرافق كل تقرير

حين يُغلق الاختبار الخلفي، ألحق به صندوق تحفظات قصير. أولاً: أيّ فارق سعري افترضت وهل وسّعته حول الإصدارات الاقتصادية الكبرى — الفجوة بين 0.8 نقطة ثابتة و2.5 نقطة واقعية خلال بيانات NFP كثيراً ما تكون هي الميزة بأسرها. ثانياً: هل البيانات خالية من التحيّز المستقبلي (look-ahead bias)، أي هل تحسب المؤشر من إغلاق الشمعة الحالية التي لن تعرفها في الوقت الفعلي؟ ثالثاً: كم من المعاملات حسّنتَ في آنٍ واحد — خمسة هي الحد الذي فوقه حتى الاختبار المتدحرج (walk-forward) يكف عن الحماية. رابعاً: هل صمدت النتيجة خارج العينة أم فقط على التاريخ كله؟ بدون هذه الجمل الأربع يصبح التقرير مادةً تسويقية لا تدقيقاً. للتعمّق في أساليب إدارة المخاطر والمقاييس الإحصائية، يتناول قسم إدارة المخاطر مواضيع Sharpe والتراجع الأقصى وحجم المركز بالتفصيل العملي.

ماذا تفعل الآن

  1. ثبّت Python 3.11 أو أحدث مع حزم `pandas` وَ`numpy` وَ`backtrader` وَ`matplotlib` والحزمة الرسمية `MetaTrader5` — أمر `pip install` واحد يجلب المكدس بأكمله — ثم نزّل عامين من بيانات H1 للزوج الذي تتداوله فعلاً واحفظها في CSV محلي، حتى تعمل التكرارات اللاحقة من مصدر بيانات ثابت ومحكوم لا يتغير بين جلسة وأخرى.
  2. اكتب قواعد الاستراتيجية بلغة عادية أولاً — جملة واحدة لكل من: نقطة الدخول، ونقطة الخروج، ووقف الخسارة، وجني الأرباح — ثم فقط حوّلها إلى تعبيرات متجهة في `pandas`؛ استهدف ضغط الاختبار كله في ثلاثين سطراً بلا حلقات شمعة بشمعة، وقاوم إغراء تحسين المعاملات في هذه المرحلة المبكرة.
  3. شغّل الاختبار الخلفي بعمولة حقيقية وفارق سعري ثابت ونقطة واحدة من الانزلاق العشوائي، ثم قارنه بنسخة بلا تكاليف؛ الفجوة بين النتيجتين تُخبرك بحجم الميزة المفترضة التي هي في الحقيقة أثر التنفيذ بالسعر الوسط — إن أكلت التكاليف أكثر من نصف الربح الإجمالي فالاستراتيجية رقيقة جداً للتداول الحقيقي.
  4. قسّم التاريخ إلى أربع سنوات داخل العينة وسنة واحدة خارجها، حسّن معاملَين لا أكثر على نافذة داخل العينة، جمّد مجموعة المعاملات الفائزة ثم شغّل اختبار خارج العينة مرة واحدة؛ إن هبطت نسبة الفوز بأكثر من الثلث، بسّط المنطق بدلاً من البحث عن تحسين أفضل — الاختبار الخلفي الأكثر إتقاناً لا يُصلح استراتيجية أساساً هشّاً.
  5. احتفظ بدفتر ملاحظات عادي — ملف Markdown في نفس المستودع — واكتب بعد كل اختبار خلفي أربع جمل: أيّ فارق سعري استخدمت، وهل المؤشرات تتجنب التحيّز المستقبلي، وكم معاملاً حسّنت، وهل منحنى الأسهم خارج العينة بقي فوق نصف قيمته داخل العينة؛ بدون هذه اليومية، في غضون ثلاثة أشهر لن تتذكر أيّ التقارير كان أميناً.
Jarosław Wasiński
نبذة عن المؤلف

Jarosław Wasiński

رئيس تحرير MyBank.pl · محلل مالي وأسواق

محلل مستقل وممارس متمرس يمتلك أكثر من 20 عاماً من الخبرة في القطاع المالي. مؤسس ورئيس تحرير بوابة MyBank.pl العاملة منذ عام 2004. يُجري التحليل الأساسي لأسواق العملات الأجنبية والأسواق الكلية منذ عام 2007.

المصادر والمراجع

  1. Backtrader Backtrader documentation — Introduction · oficjalna dokumentacja open-source'owej biblioteki Daniela Rodrigueza: model event-driven, klasy Strategy i Cerebro, integracja danych www.backtrader.com ↗
  2. vectorbt vectorbt usage documentation · oficjalny przewodnik po wektorowym backtestowaniu w numpy/pandas — przykłady i sweep parametrów vectorbt.dev ↗
  3. O'Reilly Media Yves Hilpisch — Python for Finance, 2nd Edition (2018) · kanoniczna pozycja o zastosowaniach Pythona w analityce finansowej, algorytmice i zarządzaniu ryzykiem www.oreilly.com ↗
  4. MQL5 MetaTrader 5 Python Integration — official reference · oficjalne API pakietu MetaTrader5: pobieranie historycznych OHLC i tików, dostęp do konta i składanie zleceń z Pythona www.mql5.com ↗
  5. pandas pandas — Time series / date functionality · referencja czasu w pandas: konwersje, resampling, indeksowanie i przesunięcia używane w każdym backteście pandas.pydata.org ↗

الأسئلة الشائعة

هل أحتاج إلى مستوى متقدم في Python للبدء؟

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

لماذا أختار backtrader بدلاً من vectorbt أو العكس؟

تتبع المكتبتان فلسفتين مختلفتين. backtrader قائم على الأحداث (event-driven): يمشي المحرك شمعةً بشمعة، يستدعي دالة next() على كلاس Strategy الخاص بك، ويُحاكي تدفق التداول الفعلي — لذا إضافة منطق إدارة المركز والوقف المتحرك والخروجات الجزئية سهل ومباشر. الثمن هو السرعة: عشر سنوات من بيانات M5 على زوج واحد قد تستغرق بضع دقائق. vectorbt يسلك الطريق المعاكس — تُعبّر عن الاستراتيجية كاملةً كعمليات متجهة على أعمدة pandas، يحسب المحرك كل شيء بالتوازي عبر numpy، ومسح مئة مجموعة معاملات ينتهي في ثوانٍ. الثمن هو النطاق التعبيري: منطق الدخول المعقد المرتبط بحالة المحفظة أصعب تمثيلاً. في التطبيق، يحتفظ المتداولون بالاثنتين — vectorbt للاستكشاف السريع ومسح المعاملات، وbacktrader للتحقق النهائي من أفضل مرشح بنموذج واقعي للعمولة والانزلاق السعري.

من أين أحصل على بيانات تاريخية موثوقة؟

ثلاثة مصادر، بحسب الأولوية المنطقية. أولاً: الحزمة الرسمية MetaTrader5 — تحصل على التاريخ مباشرةً من وسيطك الخاص، فيتطابق الفارق السعري والتبييت (swap) والعمولة في الاختبار مع ما ستراه لاحقاً على الحساب الحقيقي. هذا الخيار الأكثر أمانةً لأي استراتيجية تعتزم تفعيلها. ثانياً: Dukascopy تنشر بيانات التيكات وM1 للأزواج الرئيسية منذ 2003 — جودة مؤسسية، لكن الفوارق السعرية تعود لمنصة Dukascopy لا لوسيطك. ثالثاً: yfinance للإغلاقات اليومية وccxt لأسواق العملات المشفرة — كلاهما يصلح للنمذجة الأولية، لكن فجوات نهاية الأسبوع والدقائق المفقودة أحياناً تُخرجهما من دائرة التحقق من الاستراتيجيات اليومية. وثّق المصدر في رأس السكريبت في كل مرة، حتى يعرف بعد ستة أشهر على ماذا استند التقرير — تفصيل صغير ينقذ العمل عند كل مراجعة.

كيف أعرف أن الاختبار الخلفي جيد أكثر مما يُصدَّق؟

أربعة إشارات تكفي. الأولى: نسبة فوز تتجاوز 75 بالمئة على أكثر من مئتي صفقة — غير قابلة للتحقق خارج المضاربة السريعة في أسواق ضيقة جداً، لذا تُشير النتيجة إلى تحيّز مستقبلي أو خطأ في البيانات. الثانية: منحنى أسهم بلا تراجعات ملموسة — الاستراتيجيات الحقيقية تُسجّل تراجعات أقصى (drawdown) بأرقام مزدوجة، فالخط الصاعد النظيف تحذير من الملاءمة المفرطة للمنحنى. الثالثة: معامل ربح (profit factor) يتجاوز 3.5 — نادر جداً في الفوركس حيث يلتهم الفارق السعري لـ ECN وحده جزءاً ذا خانتين من الميزة. الرابعة: حساسية حادة للمعاملات — حين يُؤدي تغيير فترة المتوسط المتحرك من 14 إلى 12 إلى انهيار النتيجة، تكون الاستراتيجية قد تعلّمت الضجيج لا البنية. حين تُضيء اثنتان من الإشارات الأربع في آنٍ واحد، يكون التقرير مشبوهاً بصرف النظر عن المقاييس الرئيسية؛ بسّط المنطق، واحذف معاملاً أو اثنين، وأعد تشغيل الاختبار خارج العينة.

تعمق أكثر · الدليل الشامل