خط ناعم رأى المستقبل
يحوّل المرشح سلسلة مدخلات xₜ إلى مخرجات yₜ كمجموع موزون لمدخلات ومخرجات حديثة. والمتوسط المتحرك الأسي أبسطها: yₜ=αxₜ+(1-α)yₜ₋₁. في scipy.signal المرشح زوج من قوائم المعاملات b للمدخلات وa للمخرجات وهنا yₜ=b₀xₜ-a₁yₜ₋₁ مع b = [alpha] وa = [1, -(1 - alpha)]. تشغّله signal.lfilter(b, a, x) إلى الأمام في الزمن تمامًا كنظام حي فلا يعتمد yₜ إلا على xₛ مع s≤t. وهو يبدأ افتراضيًا من السكون (حالة صفرية) مما يفسد القيم الأولى لسعر قرب 100؛ مرّر zi = signal.lfilter_zi(b, a) * x[0] للبدء من القيمة الأولى. وتتفق النتيجة مع pd.Series(x).ewm(alpha=alpha, adjust=False).mean() حتى دقة الآلة.
تشغّل signal.filtfilt(b, a, x) المرشح نفسه إلى الأمام ثم إلى الخلف. يُلغى التأخر فيجلس الخط الناعم على البيانات تمامًا وهذا يبدو مثاليًا في الرسم لكن كل مخرج صار يعتمد على مدخلات تلحقه. وإذا استُعمل لبناء إشارة تداول فهو تسرب. خذ إشارة اتجاه هي لوغاريتم السعر ناقص متوسطه وارتبط بها بعائد اليوم التالي: لـ SPY على 2,501 يوم وα=0.1 ارتباط الإشارة السببية -0.055 (عودة ضعيفة إلى المتوسط) وللصفرية الطور -0.33؛ ولـ α=0.3 الرقمان -0.076 و-0.54. لا يستطيع أي متداول أن يكسب هذه الأرقام صفرية الطور لأن القيمة المرشَّحة تحوي سعر الغد أصلًا. واختبار الإشارة بسيط: اقطع البيانات عند تاريخ وتأكد أن القيم السابقة له لا تتغير.
lfilterمباشر وfiltfiltاسترجاع للماضي: الأول وحده يعمل في غرفة التداول.- اضبط الحالة الابتدائية:
lfilter_zi(b, a) * x[0]تزيل العابر الابتدائي. - اختبار القطع: اقطع البيانات عند تاريخ؛ الإشارة الصالحة لا تتغير قبله.
المختبر: ما الذي يُقيَّم
- معاملات المرشح10 نقطة
- المتوسط السببي20 نقطة
- نسخة pandas10 نقطة
- المتوسط صفري الطور15 نقطة
- الإشارات وعائد الغد25 نقطة
- دراسة SPY20 نقطة