الصفحاتالاختبارات الرجعية · 16 / 29
الاختبارات الرجعية
استخدم زر Test (تشغيل الشيفرة) في بيئة تطوير QuantCraft لفتح Run backtest. هناك تضبط الرموز وبيانات الأسعار والبيانات الأساسية الاختيارية ونافذة المحاكاة والرصيد الابتدائي وتكاليف التنفيذ، و(إن كان نصّك يستخدمها) معاملات الإدخال لتشغيل منفرد. يستدعي المحرك دوال دورة حياة استراتيجيتك. تظهر النتائج في نتائج الاختبار؛ ويشرح OHLCV أشكال الأعمدة.
في أعلى متن النافذة يمكنك استخدام Load أو Save لإعادة استخدام إعداد تشغيل مسبق (.qcs). ويُجمَّع كل ما عدا ذلك في ثلاث علامات تبويب على الأكثر لتتمكن من إتمام النموذج قبل بدء الاختبار الرجعي.
علامات تبويب نافذة Run backtest
| علامة التبويب | ما تضبطه |
|---|---|
| Script | تظهر فقط عندما يصرّح النص عن مدخلات params.NAME. قيم المعاملات، إضافةً إلى Optimize (شبكة قوة غاشمة أو بحث جيني). راجع معاملات الإدخال والتحسين. |
| Symbol & data | Price feed (مصدر الوسيط المتصل أو QuantCraft B2) وSymbol source وAsset class وBar timeframe (مصدر الوسيط) / Timeframe (B2) وAdditional timeframes (optional) لـ rt.get_bar وMin bars (optional) (مصدر الوسيط) وUses fundamentals (select if your strategy requires fundamental data) وInclude Fama-French factors (global) وInclude calendar data (dividends, splits, earnings dates) (Premium / استثناء البيانات المجانية؛ مفعّل افتراضيًا). |
| Simulation | تاريخ البدء / الانتهاء (الافتراضي: الشهر الأخير) وwarmup bars (الافتراضي 45) وstarting balance (الافتراضي 100,000) ونماذج العمولة والانزلاق. راجع نموذج الحساب. |
الساعة / الرمز الأساسي: لا يوجد عنصر تحكم للرمز الأساسي في النافذة. مع Selected symbols، تستخدم ساعة الأعمدة ثابت SYMBOL في نصّك (إن كان ذلك الرمز ضمن القائمة المحمَّلة)، وإلا فأول رمز محمَّل. ومع Screener لا يوجد رمز ساعة إطلاقًا — إذ تتغير مجموعة الرموز أثناء التشغيل، لذا اقرأ سجل كل رمز من إزاحات bar.close[i] الخاصة به. راجع دورة حياة الاستراتيجية.
المؤقّت / on_timer: لا تضبط نافذة Run backtest فاصل مؤقّت. وon_timer مخصّص لعمليات forward / bulk / chart-forward التي تعرض عنصر تحكم بالمؤقّت — وليس لاختبارات بيئة التطوير الرجعية.
مصدر الأسعار (مصدر الوسيط مقابل B2)
في علامة تبويب Symbol & data، اختر مصدر الأسعار:
- مصدر الوسيط المتصل — تتوفر الأطر الزمنية خلال اليوم واليومية (يتطلب حساب وسيط متصلًا بحيث تكون بيانات الاعتماد مضبوطة في التطبيق).
- QuantCraft B2 — في الخطة المجانية تتوفر فقط أطر OHLCV اليومي (
d) والأسبوعي (w) والشهري (m)؛ ويفتح Premium الأطر خلال اليوم وأطر B2 الموسّعة. يجب أن تكون مسجّلًا للدخول في QuantCraft حتى يمكن إرسال رمز الجلسة لبيانات OHLCV من B2 (وللبيانات الأساسية عند تفعيلها).
يُحفظ الاختيار في إعدادات التشغيل المسبقة (.qcs) باسم ohlcvSource ("alpaca" أو "b2").
الإطار الزمني للأعمدة وفئة الأصل (مصدر الوسيط فقط)
عندما يكون مصدر الأسعار هو مصدر الوسيط المتصل، يمكنك ضبط:
| الحقل | الغرض |
|---|---|
| Bar timeframe | دقة الشموع للتشغيل — مثل 1 يوم و1 ساعة و4 ساعات وأسبوع وعدة أعمدة بالدقائق (1 / 5 / 15 / 30 د). |
| Asset class | US equity أو Crypto — تحدد قائمة الرموز التي تبحث فيها وكيف يجلب الوسيط البيانات. |
| Min bars (optional) | إذا ضُبط، فبعد تطبيق نطاق التواريخ يحتفظ المحرك بأحدث N عمودًا فقط. اتركه فارغًا لاستخدام النطاق الكامل الذي يفرضه تاريخا البدء والانتهاء. |
وعندما يكون مصدر الأسعار B2، تختار Timeframe فقط: Daily أو Weekly أو Monthly في الخطة المجانية؛ ويضيف Premium الإطار خلال اليوم وأطر B2 الموسّعة (راجع رموز B2 في بيانات OHLCV والأعمدة).
أطر زمنية إضافية (اختياري)
استخدم Additional timeframes في Symbol & data لتحميل أحجام أعمدة إضافية إلى جانب إطارك الزمني الأساسي. وفي شيفرة الاستراتيجية، اقرأها بـ rt.get_bar(Timeframe.X, shift) — راجع بيانات OHLCV والأعمدة ودورة حياة الاستراتيجية.
- حدّد بالاختيار المتعدد أي أطر زمنية إضافية تحتاجها استراتيجيتك (مثل اليومي عندما يكون عمودك الأساسي 5 دقائق).
- الإطار الأساسي متاح أيضًا عبر
rt.get_barدون سرده ضمن Additional timeframes. - يُرجع
Noneإن لم يكن لذلك الإطار مخزن مؤقت للتشغيل، أو في مصدر Screener، أو عندما تكون البيانات غير متاحة. - في الاختبار الرجعي لا يرى
get_barإلا الأعمدة حتى الخطوة الحالية، ويقرأ دائمًا أعمدة رمز الساعة — ولسجل رمز آخر استخدم إزاحاتbar.close[i]الخاصة به. - يمكن حفظ الإعدادات في إعدادات التشغيل المسبقة (.qcs) ضمن
secondaryTimeframes.
الرموز
مصدر الرموز
يحدد Symbol source في علامة تبويب Symbol & data الرموز التي يتداولها الاختبار الرجعي:
| المصدر | ما يفعله |
|---|---|
| Selected symbols | يتداول القائمة الثابتة التي تختارها، إضافةً إلى ما تضيفه بـ Paste tickers. |
| Screener | يعيد تشغيل مرشّح أثناء تقدّم الاختبار الرجعي ويتداول ما كان مطابقًا عند تلك النقطة من المحاكاة. |
عند اختيار Screener تضبط المرشّح نفسه:
| الإعداد | ما يفعله |
|---|---|
| Screener source | Screener preset أو Python script. |
| Sort column / Direction | كيف تُرتَّب مطابقات الإعداد المسبق قبل تطبيق الحد. |
| Rank direction | للنصوص — أي طرف من درجة rank() لديك يؤخذ أولًا. |
| Limit | عدد الرموز المتداولة في كل إعادة توازن. و0 يأخذ كل المطابقات. |
| Refresh interval (days) | كم مرة يُعاد تشغيل المرشّح، بالأيام التقويمية المحاكاة. تتطلب النصوص 7 أيام أو أكثر. |
| Keep tickers with an open position | يُبقي الرمز قابلًا للتداول بعد توقفه عن المطابقة، ليظل بالإمكان إدارة مركز مفتوح. |
حدود اختبار رجعي يقوده الماسح: يحتاج إلى تاريخي بدء وانتهاء صريحين؛ ولا تُدعم الأطر الزمنية الإضافية؛ ويحتاج مرشّح نص Python إلى Refresh interval بمقدار 7 أيام أو أكثر؛ ولا يدعم Debug Test مصدر Screener (إذ يتوقف برسالة تطلب منك التبديل إلى Selected symbols). ومع تفعيل البيانات الأساسية يحصل كل رمز مُفرَّز على بياناته الأساسية تلقائيًا. وتتضمن النتائج علامة تبويب Screener Output بجانب Logs، تعرض كل إعادة توازن كتاريخ قابل للطيّ مع الرموز المتداولة في تلك النافذة. راجع الماسح (Screener) لبناء المرشّحات وللتفاصيل حول اللحظة الزمنية وانحياز البقاء.
Selected symbols
في Symbol & data اختر رمزًا واحدًا أو أكثر للتشغيل:
- مع مصدر الوسيط المتصل، تأتي القائمة من عالم أصول وسيطك (أسهم أو عملات مشفرة بحسب Asset class). ويمكنك البحث والاختيار المتعدد.
- مع B2، تأتي القائمة من الفهرس نفسه الذي تستخدمه مسارات البيانات الأساسية على الخادم.
القواعد:
- يلزم رمز واحد على الأقل.
- تُوحَّد الرموز إلى الأحرف الكبيرة للتشغيل.
- الأحرف الصالحة: الحروف والأرقام و**
.** و**-** (المعتادة في لواحق البورصات مثلBRK.BأوRHM.XETRA).
أول رمز بحسب ترتيب اختيارك هو رمز الساعة الافتراضي ما لم تضبط استراتيجيتك SYMBOL = "..." على المستوى الأعلى يطابق رمزًا محمَّلًا. وليس في النافذة عنصر تحكم منفصل للرمز الأساسي.
البيانات الأساسية (اختياري)
في Symbol & data، حدّد Uses fundamentals (select if your strategy requires fundamental data) عندما تقرأ استراتيجيتك الوسيط fundamentals في on_bar / on_tick (الاختبار الرجعي)، أو في on_timer ضمن تشغيل أمامي، أو تستخدم منطقًا يراعي البيانات الأساسية.
تظهر الخانة عند تفعيل ميزات البيانات الأساسية لإصدارك، لكنها معطّلة (مع تلميح Premium) ما لم يكن لديك Premium أو يكون الوصول إلى البيانات المجانية مفعّلًا. وعند تفعيل البيانات الأساسية:
- يجب أن تكون مسجّلًا للدخول (يُرسل رمز QuantCraft لتحميل ملفات البيانات الأساسية من B2).
- اختر حزمة بيانات أساسية واحدة أو أكثر من الاختيار المتعدد (مسارات مثل
fundamentals/AAPL.json.gz). وتعرض النافذة المسار الموحَّد تحت كل اختيار.
مهم: رموز OHLCV ورموز البيانات الأساسية مستقلة. يمكنك إجراء اختبار رجعي لـ RNMBY عبر مصدر الوسيط مع تحميل البيانات الأساسية لـ RHM.XETRA — وتذكّرك الواجهة أنه في هذه الحالة يجب أن تمرّر الرمز الصحيح إلى fundamentals.current(..., symbol="RHM.XETRA") (أو ما يعادله) في الشيفرة.
وعند اختيار عدة حزم بيانات أساسية، يبني المحرك خريطة لكل مسار. وتكون حزمة البيانات الأساسية الأساسية المستخدمة للقطات المحاذية للأعمدة افتراضيًا هي الرمز المتداول (أو أول حزمة أبجديًا)؛ وفي عمليات التشغيل متعددة الرموز وScreener مرّر دائمًا symbol= إلى fundamentals.current / get_data_with_offset، إذ قد لا تكون الحزمة الأساسية هي الرمز الذي أنت عنده.
عوامل فاما-فرينش (اختياري)
في Symbol & data، حدّد Include Fama-French factors (global) عندما تقرأ استراتيجيتك عوائد العوامل الشهرية العالمية عبر fama_french.qc. راجع عوامل فاما-فرينش للاطلاع على الواجهة الكاملة.
عند تفعيل العوامل:
- تحتاج إلى Premium (أو الوصول إلى البيانات المجانية عند تفعيله) ويجب أن تكون مسجّلًا للدخول.
- الخانة مفعّلة افتراضيًا عندما تسمح بوابة البيانات بذلك. ألغِ التحديد لتخطّي بيانات العوامل في ذلك التشغيل.
- رموز OHLCV وحزم البيانات الأساسية وعوامل فاما-فرينش مستقلة — فعّل أي تركيبة تحتاج إليها.
- لا يوجد وسيط استدعاء
factors=— استوردquantcraft.fama_frenchواقرأfama_french.qcداخل دوال الاستدعاء (on_initوon_barوon_tick…).
بيانات التقويم والإجراءات المؤسسية (اختياري)
في Symbol & data، يضيف Include calendar data إلى اختبارك الرجعي سجل توزيعات الأرباح وسجل التجزئات ومواعيد الأرباح وإيداعات SEC. وهو مفعّل افتراضيًا، ويُحفظ اختيارك للتشغيل التالي.
لماذا يهم
أعمدة أسعار الاختبار الرجعي غير معدّلة. فبدون بيانات التقويم تظهر تجزئة 4 إلى 1 كأنها انهيار بنسبة 75% في السعر بين ليلة وضحاها وينهار مركزك المحاكى معها. كما لا تصل توزيعات الأرباح أبدًا، مما يقلّل بهدوء من العائد الإجمالي لأي مركز يُحتفظ به طويلًا.
الخيارات الفرعية
يتحكم خياران فرعيان في كيفية تطبيق الإجراءات على المراكز المفتوحة أثناء المحاكاة:
| الخيار الفرعي | ما يفعله |
|---|---|
| Adjust positions for stock splits | في تاريخ سريان التجزئة، يُضرب عدد الأسهم في النسبة وتُقسم تكلفة الأساس عليها. وتُعاد أيضًا مقايسة أسعار الإيقاف والهدف. ولأن qty × entry_price لا يتغير، يبقى منحنى حقوق الملكية متصلًا عبر التجزئة. |
| Credit dividends to cash | في تاريخ الاستحقاق، يُضاف qty × amount إلى النقد للمراكز الشرائية ويُخصم من القصيرة (فالبائعون على المكشوف مدينون بالتوزيع للمُقرِض). ويتدفق ذلك إلى حقوق الملكية وكل مقاييس العائد، لكن ليس إلى realized_pnl. |
كلا الخيارين الفرعيين مفعّل افتراضيًا عند تفعيل بيانات التقويم.
ملاحظة حول تقدير تاريخ الاستحقاق: لا تنشر EDGAR تواريخ الاستحقاق (ex-dividend). وما لم تتوفر بيانات من البورصة، يُقدَّر تاريخ الاستحقاق انطلاقًا من تاريخ الإعلان (بدقة تقارب ±7 أيام) ويُوسَم بـ
est.في نتائج الاختبار. وتُقيَّد التوزيعات التقديرية افتراضيًا؛ ولتخطّيها اضبطdividendDatePolicyعلىexact_only(أوoff) في إعداد .qcs مسبق — فلا يوجد عنصر تحكم لذلك في النافذة. صفِّ بحسبd.estimatedفي الشيفرة إن كانت استراتيجيتك حساسة للتاريخ الدقيق.
عوالم الماسح
تعمل بيانات التقويم مع مصدر رموز Screener. تُحمَّل التقاويم بعد أن يحدّد المرشّح قائمة الرموز الكاملة؛ والرموز المطابقة التي لا أعمدة أسعار لها لا تكلّف أي طلب تقويم. وقد يتضمن المرشّح الواسع رموزًا بلا تقويم على الخادم — ويبلّغ سجل التشغيل بالعدد بدل أن يفشل.
أين تراه
- لوحة المخرجات — سطر
[calendar]واحد لكل إجراء مؤسسي طُبّق أثناء التشغيل، مع سطر ملخّص في النهاية. - Test Results — تظهر صفوف Split وDividend ضمن جدول الصفقات المغلقة (الذي يحمل حينئذٍ عنوان Closed trades & events)، وتعرض النسبة أو المبلغ للسهم والأثر النقدي.
راجع بيانات التقويم للاطلاع على واجهة BacktestCalendar الكاملة ووسيط الاستدعاء calendar.
المحاكاة — التواريخ والرصيد وتكاليف التنفيذ
كل ما يلي موجود في علامة تبويب Simulation:
| الحقل | الغرض |
|---|---|
| Start date | مطلوب (الافتراضي قبل نحو شهر). أول يوم تقويمي UTC مضمَّن في نافذة التنفيذ (YYYY-MM-DD). |
| End date | مطلوب. آخر يوم تقويمي UTC مضمَّن. يجب أن يكون في تاريخ البدء أو بعده. |
| Warmup bars (indicators) | أعمدة إضافية تُحمَّل قبل تاريخ البدء (بالإطار الزمني نفسه لأعمدتك) ليكون للمتوسطات المتحركة والمؤشرات المشابهة سجل. وتظل دوال الاستدعاء تعمل فقط بين تاريخي البدء والانتهاء. الافتراضي 45؛ أدخل 0 لتعطيل التهيئة الإضافية. |
| Starting balance | مطلوب. النقد الابتدائي لـ PaperAccount المحاكى (الافتراضي 100,000). |
| Commission / slippage | كيف تُعدَّل عمليات التنفيذ بتكاليف التداول — انظر أدناه ونموذج الحساب. |
لا تضبط نافذة Run backtest فاصل مؤقّت. و**
on_timer** متاح فقط في عمليات التشغيل الأمامي (chart forward test وbulk forward / QuantCloud) عند ضبطtimerIntervalMs. راجع دورة حياة الاستراتيجية.
لا يزال بإمكان إيقاف الخسارة / جني الأرباح / تحديد حجم المخاطر الافتراضية الاختيارية أن تظهر في إعدادات .qcs المسبقة عند وجودها، لكن نافذة Run backtest لا تعرض حاليًا مدخلات SL/TP / المخاطر. اضبطها في الشيفرة أو عبر الإعدادات المسبقة إن كانت دوالك المساعدة تدعمها — راجع نموذج الحساب وإعدادات التشغيل المسبقة (.qcs).
العمولة والانزلاق
| الإعداد | الغرض |
|---|---|
| Commission model | لكل سهم (الافتراضي) أو لكل صفقة أو صفر |
| Commission cost | التكلفة لكل سهم أو رسم ثابت لكل أمر ($) — الافتراضي 0.001 $ لكل سهم |
| Minimum trade cost | حدّ أدنى لكل أمر عند استخدام عمولة لكل سهم ($) — الافتراضي 0 $ |
| Slippage model | حصة الحجم (الافتراضي) أو فارق ثابت أو صفر |
| Volume limit / Price impact | معاملات الانزلاق بحصة الحجم (وvolume_limit يقلّص أيضًا الكمية عند الفتح) |
| Spread | إجمالي الفارق لكل سهم للانزلاق بفارق ثابت ($) |
يمكن حفظ إعدادات المحاكاة في إعدادات التشغيل المسبقة (.qcs).
معاملات النص (تشغيل منفرد)
إذا كانت استراتيجيتك تستورد from quantcraft.inputs import params (ولا تزال المسارات الأقدم quantcraft.inputs_module / ide.inputs_module تُطابَق للنصوص الحالية) وتشير إلى params.NAME، فتعرض النافذة علامة تبويب Script بصف واحد لكل اسم مكتشَف: Parameter وType (int / float / str / bool) وValue.
املأ كل صف قبل البدء — فالقيمة مطلوبة لكل معامل مُصرَّح عنه. وتُرسل كسلاسل نصية ويحوّلها المحرك قبل تحميل ملفك، فيكون params.PERIOD (مثلًا) بنوع Python الصحيح عند تنفيذ وحدتك.
وفي علامة التبويب نفسها يمكنك تفعيل Optimize للبحث الشبكي أو الجيني — راجع التحسين. اترك Optimize غير محدد لاختبار رجعي منفرد عادي.
ما يحدث عند بدء التشغيل
يتحقق التطبيق من النموذج (التواريخ والرموز والرصيد والبيانات الأساسية إن كانت مفعّلة وأنواع معاملات النص). وعند النجاح يبدأ اختبارًا رجعيًا واحدًا بالإعدادات المجمّعة؛ ويظهر التقدّم والسجلات في لوحة Output، وتُفتح النتائج المنظّمة في Test Results.
مرجع سريع
| الموضوع | أين يُضبط |
|---|---|
| مصدر الوسيط مقابل أسعار B2 | Symbol & data ← مصدر الأسعار (ohlcvSource في .qcs). |
| الإطار الزمني | Bar timeframe (مصدر الوسيط) أو Timeframe (B2: d / w / m في الخطة المجانية؛ وأكثر مع Premium). |
| الأطر الزمنية الإضافية | الاختيار المتعدد Additional timeframes — لـ rt.get_bar(Timeframe.X, shift). |
| فئة الأصل | US equity / Crypto (مصدر الوسيط فقط). |
| الاقتصار على آخر N عمودًا | Min bars (مصدر الوسيط فقط، اختياري). |
| ما يُتداوَل | Symbol source: Selected symbols (اختيار متعدد) أو Screener (مرشّح قائم على البيانات الأساسية — راجع الماسح (Screener)). |
| رمز الساعة | SYMBOL في النص إن كان محمَّلًا؛ وإلا فأول رمز (دون عنصر تحكم في النافذة)؛ ولا شيء في مصدر Screener. |
| القوائم المالية | Uses fundamentals + الاختيار المتعدد للبيانات الأساسية (تلقائي في مصدر Screener)؛ ويتطلب تسجيل الدخول. |
| عوائد العوامل العالمية | Include Fama-French factors (global) — راجع عوامل فاما-فرينش. |
| توزيعات الأرباح والتجزئات ومواعيد الأرباح | Include calendar data — مفعّل افتراضيًا؛ راجع بيانات التقويم. |
| نافذة التقويم | Start date / End date في Simulation (مطلوبان). |
| سجل المؤشرات قبل البدء | Warmup bars في Simulation. |
| النقد الابتدائي | Starting balance في Simulation. |
| العمولة / الانزلاق | علامة تبويب Simulation — راجع نموذج الحساب. |
on_timer | ليس في Run backtest — عمليات التشغيل الأمامي مع timerIntervalMs (دورة حياة الاستراتيجية). |
on_tick | الاختبار الرجعي: أربع تيكات OHLC اصطناعية لكل عمود (بلا سجل تيكات حقيقي). التشغيل الأمامي: كل تحديث سعر من الوسيط — راجع دورة حياة الاستراتيجية. |
| القيم القابلة للضبط في الشيفرة | علامة تبويب Script (params.*)، قيم مفردة لكل تشغيل (أو Optimize). |
نصائح
- إذا لم تُحمَّل رموز مصدر الوسيط أبدًا، فافتح Trade مرة واحدة أو تأكد من اتصالك بالوسيط؛ وفي B2 تأكد من أنك مسجّل الدخول وأن فهرس الرموز قد حُمِّل.
- لا يمدّ التهيئة (Warmup) إلا السجل المحمَّل — ولا يضيف أيام تداول خارج نطاق تواريخك.
- لا تتوقع
on_timerفي الاختبار الرجعي ببيئة التطوير — فلا يوجد عنصر تحكم بالمؤقّت في تلك النافذة. استخدمon_bar/on_tickبدلًا منه. وتنطبق المؤقّتات على عمليات التشغيل الأمامي عند ضبطtimerIntervalMs. - يستخدم
on_tickفي الاختبار الرجعي قيم OHLC اصطناعية من كل عمود (أربعة استدعاءات لكل عمود) — وليس بيانات تيك حقيقية. اختبر منطق التيك المباشر في عمليات التشغيل الأمامي (دورة حياة الاستراتيجية). - طابِق حزم البيانات الأساسية مع الرموز التي تقرؤها فعليًا في الشيفرة عندما تختلف رموز OHLCV ورموز البيانات الأساسية.
- استخدم Min bars باعتدال — فمن السهل اختصار تشغيل أكثر مما قصدت دون انتباه.

