اختبار رجعي متّجه: الإشارات والمراكز والإزاحة لتجنّب الاستباق وتكاليف المعاملات ومنحنى رأس المال
ابنِ اختبارًا رجعيًا متّجهًا كاملًا لقاعدة متوسط متحرك في pandas، يشمل إزاحة المركز والتكاليف لكل صفقة ومنحنى رأس المال والمقارنة بمؤشر مرجعي.
ما الذي ستتعلمه
- البنية ذات الأعمدة الخمسة للاختبار الرجعي المتّجه: الإشارة والمركز وعائد الأصل والتكلفة وعائد الاستراتيجية.
- لماذا يكون
shift(1)على عمود المركز هو السطر الوحيد الذي يفصل بين اختبار نزيه ووهمٍ قائم على الاستباق. - كيف تحتسب تكاليف معاملات نسبية على تغيّرات المركز، وتبني منحنى رأس المال باليورو.
- ما الذي يستطيع الاختبار المتّجه نمذجته وما لا يستطيعه، ومتى تحتاج إلى المحرّك القائم على الأحداث في الدرس 8.
الشرح
يحسب الاختبار الرجعي المتّجه التاريخ كله دفعة واحدة بعمليات على الأعمدة بدلًا من المرور بحلقة شمعة تلو الأخرى. كان للاختبار الرجعي في جدول البيانات من دورة «التداول المنهجي والاختبار الرجعي» هذه البنية نفسها؛ وتشغّله pandas على عقود من البيانات في أجزاء من الثانية. وهو يناسب قواعد الشراء أو البقاء خارج السوق، أو القواعد الدائمة الحضور في السوق، التي تعمل على سعر الإغلاق؛ أما أوامر الوقف داخل الشمعة وأسعار التنفيذ المحدّدة فهي من مهام الدرس 8.
الخطوة 1، الإشارة. يعطي signal = (close > sma(close, 50)).astype(int) القيمة 1 عندما يكون الإغلاق فوق متوسطه لخمسين يومًا، و0 فيما عدا ذلك. وهو يصف ما تعرفه عند إغلاق الشمعة t.
الخطوة 2، المركز. لا يمكنك التداول على إغلاق لم تره بعد؛ وأبكر وقت يمكنك فيه الاحتفاظ بإشارة الشمعة t هو الشمعة t + 1، لذا position = signal.shift(1).fillna(0). صار الصف t من عمود المركز يعني الآن «الانكشاف المحتفظ به خلال الشمعة t»، المقرَّر في نهاية الشمعة t − 1. وإغفال الإزاحة يتيح للاستراتيجية كسب عائد الشمعة t باستخدام إغلاق الشمعة t، وهذا هو انحياز الاستباق: استخدام معلومات لم تكن متاحة وقت اتخاذ القرار.
الخطوة 3، عائد الأصل. ret = close.pct_change().fillna(0) (الدرس 5). ولأن المركز خلال الشمعة t ثُبِّت عند إغلاق الشمعة t − 1، فإن position * ret هو العائد الإجمالي للاستراتيجية في الشمعة t. والافتراض الضمني هو التنفيذ عند إغلاق الشمعة t − 1؛ أما التنفيذ عند الافتتاح التالي فيتناوله الدرس 8.
الخطوة 4، التكاليف. تُنمذَج العمولة والفارق السعري والانزلاق السعري بوصفها معدلًا نسبيًا لكل وحدة تغيّر في المركز: يساوي turnover = position.diff().abs().fillna(0) القيمة 1 عند الانتقال من خارج السوق إلى الشراء أو العكس، و2 عند الانعكاس. cost = turnover * c، حيث c التكلفة في اتجاه واحد في صورة كسر (0.001 لـ 0.1%). وتدخل التكلفة عمود العائد في الشمعة التي يتغيّر فيها المركز.
الخطوة 5، عائد الاستراتيجية ورأس المال. strat = position * ret - cost، وequity = capital * (1 + strat).cumprod(). والمؤشر المرجعي للشراء والاحتفاظ هو capital * (1 + ret).cumprod(). قارن الاثنين دائمًا بالمقاييس نفسها (الدرس 9)؛ فمجرد تخفيف الشراء والاحتفاظ بالنقد يخفض التراجع والعائد معًا، وهذا ليس مهارة.
اذكر الافتراضات: الانكشاف نسبة من رأس المال يُعاد استثمارها يوميًا، والتنفيذ عند الإغلاق، والتكاليف نسبية، ولا فائدة على النقد، والتوزيعات عبر البيانات المعدّلة فقط، والضرائب مُهمَلة. وعندئذ يجيب الاختبار عن سؤال واحد محدّد: هل أضافت قاعدة التوقيت شيئًا مقارنةً بالاحتفاظ بالأصل، بعد التكاليف؟
فحوص قبل الثقة بالمخرجات. (1) اجعل التكلفة صفرًا والإشارة ثابتة عند 1؛ ويجب أن يساوي رأس المال الشراء والاحتفاظ تمامًا. (2) عُدّ الصفقات الكاملة (ذهابًا وإيابًا) باستخدام turnover.sum() / 2 وتحقّق من معقوليتها. (3) تأكّد من أن صفوف NaN في فترة إحماء المؤشر تعطي مركزًا صفريًا، لا صفقة زائفة.
مثال محلول
مثال افتراضي: ثمانية أسعار إغلاق باليورو، 100، 101، 103، 102، 104، 103، 101، 100؛ شراء عندما يكون الإغلاق أعلى تمامًا من متوسط SMA لثلاثة أيام، وإلا فالبقاء خارج السوق؛ التكلفة في اتجاه واحد 0.1%؛ رأس المال €10,000؛ دون فائدة أو توزيعات أو ضرائب.
| الشمعة | الإغلاق | SMA3 | الإشارة | المركز | العائد | الدوران | الاستراتيجية | رأس المال € |
|---|---|---|---|---|---|---|---|---|
| 0 | 100 | – | 0 | 0 | 0 | 0 | 0 | 10,000.00 |
| 1 | 101 | – | 0 | 0 | +1.000% | 0 | 0 | 10,000.00 |
| 2 | 103 | 101.33 | 1 | 0 | +1.980% | 0 | 0 | 10,000.00 |
| 3 | 102 | 102.00 | 0 | 1 | −0.971% | 1 | −1.071% | 9,892.91 |
| 4 | 104 | 103.00 | 1 | 0 | +1.961% | 1 | −0.100% | 9,883.02 |
| 5 | 103 | 103.00 | 0 | 1 | −0.962% | 1 | −1.062% | 9,778.11 |
| 6 | 101 | 102.67 | 0 | 0 | −1.942% | 1 | −0.100% | 9,768.33 |
| 7 | 100 | 101.33 | 0 | 0 | −0.990% | 0 | 0 | 9,768.33 |
الشمعة 3: كانت الإشارة في الشمعة 2 تساوي 1 (103 > 101.33)، لذا يكون المركز خلال الشمعة 3 مساويًا لـ 1. انخفض الأصل من 103 إلى 102 (−0.971%)، ودوران قدره 1 يكلّف 0.1%، فيكون عائد الاستراتيجية −1.071%، ورأس المال 10,000 × (1 − 0.01071) = €9,892.91. في الشمعة 3 يساوي الإغلاق متوسط SMA، لذا تعطي القاعدة الصارمة 0 ويُغلَق المركز خلال الشمعة 4 (تكلفة 0.1%، ودون انكشاف). رأس المال النهائي €9,768.33 (−2.32%) مقابل €10,000 بالضبط للشراء والاحتفاظ. واستهلكت التكاليف €39.36 على أربع صفقات في اتجاه واحد.
والآن نسخة الاستباق، باستخدام signal بدلًا من position المُزاح: «تحتفظ» الاستراتيجية بالمركز خلال الشمعتين 2 و4، وهما اليومان الصاعدان اللذان لم يكن بالإمكان تحديدهما إلا بعد إغلاقهما، وتنتهي عند €10,356.65 (+3.57%). سطر shift(1) واحد مفقود حوّل −2.32% إلى +3.57%.
خطأ شائع
position = signal.shift(1)؛ والعوائد هي pct_change() العادية.نشاط تطبيقي
على الورق، بأسعار الإغلاق الثمانية نفسها والقاعدة نفسها: (أ) أعد حساب رأس المال النهائي بتكلفة في اتجاه واحد قدرها 0.2%؛ (ب) اذكر عدد الصفقات الكاملة؛ (ج) يقترح زميل ملء أول قيم NaN في متوسط SMA بسعر الإغلاق كي «يبدأ التداول من اليوم الأول»؛ اشرح باختصار لماذا يُعدّ هذا مشكلة.
عرض الحل
(أ) لا تتغير إلا شموع الدوران الأربع. الشمعة 3: −1.171% ← €9,882.91؛ الشمعة 4: −0.2% ← €9,863.15؛ الشمعة 5: −1.162% ← €9,748.58؛ الشمعة 6: −0.2% ← €9,729.09. الخسارة النهائية 2.71% مقابل 2.32% عند 0.1%؛ فقد أضافت مضاعفة معدل التكلفة عبئًا قدره €39.24.
(ب) مجموع الدوران 4 تغيّرات في اتجاه واحد، أي صفقتان كاملتان (دخول خلال الشمعة 3 وخروج في الشمعة 4؛ ودخول في الشمعة 5 وخروج في الشمعة 6).
(ج) ملء متوسط SMA بسعر الإغلاق يولّد صفقات من مؤشر لم يوجد بعد، فيختلف منطقها عن القاعدة قيد الاختبار؛ احتفظ بمركز صفري خلال فترة الإحماء وسجّل عدد الشموع المستبعدة.
القيود: ثماني شموع تُثبت الآلية لا القاعدة؛ والتكاليف النسبية والتنفيذ عند الإغلاق يقلّلان من تقدير الانزلاق السعري في الأدوات منخفضة السيولة.
أهم النقاط
- الاختبار الرجعي المتّجه خمسة أعمدة: الإشارة، والمركز (مُزاحًا)، وعائد الأصل، والتكلفة على الدوران، وعائد الاستراتيجية؛ ورأس المال هو حاصل الضرب التراكمي.
position = signal.shift(1)أمر غير قابل للتفاوض؛ اختبره بحذفه ومراقبة تضخّم النتيجة.- احتسب التكاليف على
position.diff().abs()وقارن دائمًا بالشراء والاحتفاظ بافتراضات مطابقة. - تناسب الاختبارات المتّجهة القواعد من إغلاق إلى إغلاق؛ أما أوامر الوقف وتحديد الحجم والتنفيذ الواقعي فتحتاج إلى المحرّك القائم على الأحداث في الدرس 8.
الخطوة التالية
يبني الدرس 8 اختبارًا رجعيًا قائمًا على الأحداث: حلقة تمرّ شمعةً شمعة مع أوامر وقف مبنية على ATR وتحديد لحجم المركز وقائمة صفقات مقيسة بمضاعفات R.
تقييم ذاتي
أجب عن الأسئلة، ثم تحقّق من إجاباتك. يمكنك إعادة المحاولة بقدر ما تشاء.
تقييم ذاتي تلقائي لمراجعتك الشخصية. تُفحَص إجاباتك في متصفحك ولا نطّلع عليها ولا نقيّمها. هذا ليس امتحانًا ولا مؤهّلًا.
تقدّمك
«مكتمل» يعني فقط أنك علّمت الدرس كمنتهٍ. وهو ليس اختبارًا لفهمك. يُحفظ التقدّم والملاحظات فقط في هذا المتصفح على هذا الجهاز — وليس في حساب.