الوثائق1.0 (latest)
الصفحاتالاختبارات الرجعية · 16 / 29

الاختبارات الرجعية

استخدم زر Test (تشغيل الشيفرة) في بيئة تطوير QuantCraft لفتح Run backtest. هناك تضبط الرموز وبيانات الأسعار والبيانات الأساسية الاختيارية ونافذة المحاكاة والرصيد الابتدائي وتكاليف التنفيذ، و(إن كان نصّك يستخدمها) معاملات الإدخال لتشغيل منفرد. يستدعي المحرك دوال دورة حياة استراتيجيتك. تظهر النتائج في نتائج الاختبار؛ ويشرح OHLCV أشكال الأعمدة.

في أعلى متن النافذة يمكنك استخدام Load أو Save لإعادة استخدام إعداد تشغيل مسبق (.qcs). ويُجمَّع كل ما عدا ذلك في ثلاث علامات تبويب على الأكثر لتتمكن من إتمام النموذج قبل بدء الاختبار الرجعي.

علامات تبويب نافذة Run backtest

علامة التبويبما تضبطه
Scriptتظهر فقط عندما يصرّح النص عن مدخلات params.NAME. قيم المعاملات، إضافةً إلى Optimize (شبكة قوة غاشمة أو بحث جيني). راجع معاملات الإدخال والتحسين.
Symbol & dataPrice 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 classUS 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 sourceScreener 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.


مرجع سريع

الموضوعأين يُضبط
مصدر الوسيط مقابل أسعار B2Symbol & 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 باعتدال — فمن السهل اختصار تشغيل أكثر مما قصدت دون انتباه.
13 دقائق للقراءةاقترح تعديلًا ↗
الاختبارات الرجعية — الوثائق (1.0 (latest)) | QuantCraft