لمواصلة
المقالة حول مخاطر التنويع المفرط ، سنقوم بإنشاء أدوات مفيدة لاختيار الأسهم. بعد ذلك ، سنقوم بإعادة توازن بسيطة وإضافة الشروط الفريدة للمؤشرات الفنية ، والتي غالبًا ما تفتقر إلى الخدمات الشعبية. ثم قارن العوائد على الأصول الفردية والمحافظ المختلفة.
في كل هذا نستخدم Pandas وتقليل عدد الدورات. اجمع السلاسل الزمنية وارسم الرسوم البيانية. دعونا نتعرف على المؤشرات المتعددة وسلوكهم. وكل هذا في جوبيتر في بيثون 3.6.
إذا كنت تريد القيام بشيء جيد ، افعل ذلك بنفسك.
فرديناند بورش
ستسمح لك الأداة الموضحة بتحديد الأصول المثالية للمحفظة واستبعاد الأدوات التي يفرضها المستشارون. لكننا سنرى الصورة الكبيرة فقط - دون أخذ السيولة في الاعتبار ، ووقت تجنيد المناصب ، وعمولات السمسرة وتكلفة سهم واحد. بشكل عام ، مع إعادة التوازن الشهرية أو السنوية لكبار الوسطاء ، ستكون التكاليف غير ذات أهمية. ومع ذلك ، قبل التطبيق ، يجب الاستمرار في فحص الاستراتيجية المختارة في الاختبار الخلفي الذي يحركه الحدث ، على سبيل المثال ، Quantopian (QP) ، من أجل القضاء على الأخطاء المحتملة.
لماذا لا على الفور في QP؟ الوقت. هناك ، يستمر أبسط اختبار حوالي 5 دقائق. وسيتيح لك الحل الحالي التحقق من مئات الاستراتيجيات المختلفة بشروط فريدة في دقيقة واحدة.
تحميل البيانات الخام
لتحميل البيانات ، اتبع الطريقة الموضحة في هذه
المقالة . أستخدم PostgreSQL لتخزين الأسعار اليومية ، ولكنها الآن مليئة بالمصادر المجانية التي يمكنك من خلالها إنشاء DataFrame الضروري.
كود تحميل سجل الأسعار من قاعدة البيانات متاح في المستودع. سيكون الرابط في نهاية المقال.
هيكل DataFrame
عند العمل مع سجل الأسعار ، لتجميع مريح والوصول إلى جميع البيانات ، فإن أفضل حل هو استخدام مؤشر متعدد (MultiIndex) مع التاريخ والمؤشرات.
df = df.set_index(['dt', 'symbol'], drop=False).sort_index() df.tail(len(df.index.levels[1]) * 2)

باستخدام مؤشر متعدد ، يمكننا الوصول بسهولة إلى سجل الأسعار بالكامل لجميع الأصول ويمكننا تجميع الصفيف بشكل منفصل حسب التاريخ والأصل. يمكننا أيضًا الحصول على سجل أسعار أحد الأصول.
في ما يلي مثال لكيفية تجميع السجل بسهولة حسب الأسبوع والشهر والسنة. ولإظهار كل هذا على الرسوم البيانية لقوى الباندا:

لعرض المنطقة بشكل صحيح مع وسيلة إيضاح التخطيط ، ننقل مستوى الفهرس باستخدام مؤشرات إلى المستوى الثاني أعلى الأعمدة باستخدام الأمر Series (). Unstack (1) الأمر. باستخدام DataFrame () ، لن يعمل هذا الرقم ، ولكن الحل أدناه.
عند التجميع حسب الفترات القياسية ، يستخدم Pandas أحدث تاريخ تقويم للمجموعة في الفهرس ، والذي يختلف غالبًا عن التواريخ الفعلية. لإصلاح ذلك ، قم بتحديث الفهرس.
monthly = df.groupby([pd.Grouper(freq='M', level=0), level_values(1)]).agg(agg_rules) \ .set_index(['dt', 'symbol'], drop=False)
مثال للحصول على سجل الأسعار لأصل معين (نأخذ جميع التواريخ ، ومؤشر QQQ وجميع الأعمدة):
monthly.loc[(slice(None), ['QQQ']), :]
تقلبات الأصول الشهرية
يمكننا الآن إلقاء نظرة على بعض الخطوط على الرسم البياني للتغير في سعر كل أصل خلال الفترة التي تهمنا. للقيام بذلك ، نحصل على النسبة المئوية لتغيرات الأسعار من خلال تجميع إطار البيانات حسب مستوى متعدد المؤشرات مع مؤشر الأصول.
monthly = df.groupby([pd.Grouper(freq='M', level=0), level_values(1)]).agg( agg_rules).set_index(['dt', 'symbol'], drop=False)

قارن عوائد الأصول
الآن سنستخدم طريقة نافذة السلسلة (). Rolling () ونعرض العائد على الأصول لفترة معينة:
كود بايثون rolling_prod = lambda x: x.rolling(len(x), min_periods=1).apply(np.prod)

طرق إعادة توازن المحفظة
لذلك وصلنا إلى أكثر اللذيذ. في الأمثلة ، سنلقي نظرة على نتائج المحفظة في تخصيص رأس المال للأسهم المحددة مسبقًا بين العديد من الأصول. ونضيف أيضًا ظروفًا فريدة نتخلى بموجبها عن بعض الأصول في وقت توزيع رأس المال. إذا لم تكن هناك أصول مناسبة ، فإننا نفترض أن لدى الوسيط رأس المال في ذاكرة التخزين المؤقت.
من أجل استخدام طرق Pandas لإعادة التوازن ، نحتاج إلى تخزين مشاركات التوزيع وشروط إعادة التوازن في DataFrame مع البيانات المجمعة. الآن خذ بعين الاعتبار وظائف إعادة التوازن التي سنمررها إلى DataFrame (). الطريقة () التطبيق:
من أجل:
- rebalance_simple هي أبسط وظيفة توزع ربحية كل أصل في الأسهم.
- rebalance_sma هي وظيفة توزع رأس المال بين الأصول التي يزيد متوسطها المتحرك 50 يومًا عن 200 يومًا في وقت إعادة التوازن.
- rebalance_rsi - دالة توزع رأس المال بين الأصول التي تزيد قيمة مؤشر القوة النسبية فيها عن 100 يوم عن 50.
- rebalance_custom هي أبطأ وظيفة وأكثرها شمولية ، حيث سنحسب قيم المؤشر من سجل أسعار الأصول اليومية في وقت إعادة التوازن. هنا يمكنك استخدام أي شروط وبيانات. حتى تنزيل كل مرة من مصادر خارجية. ولكن لا يمكنك الاستغناء عن دورة.
- السحب - وظيفة مساعدة ، تظهر أقصى سحب في المحفظة.
في وظائف إعادة التوازن ، نحتاج إلى مجموعة من جميع البيانات للتاريخ موزعة حسب الأصول. DataFrame (). ستطبق الطريقة () ، التي سنحسب بواسطتها نتائج المحافظ ، مصفوفة إلى وظيفتنا ، حيث ستصبح الأعمدة فهرس الصف. وإذا قمنا بعمل مؤشر متعدد ، حيث سيكون مؤشر الأسعار هو المستوى صفر ، فسيأتي إلينا مؤشر متعدد. يمكننا توسيع هذا الفهرس المتعدد في مصفوفة ثنائية الأبعاد والحصول على بيانات الأصل المقابل في كل سطر.

إعادة موازنة المحفظة
يكفي الآن تهيئة الظروف اللازمة وإجراء حساب لكل محفظة في الدورة. بادئ ذي بدء ، نحسب المؤشرات في تاريخ الأسعار اليومي:
الآن سنقوم بتجميع القصة لفترة إعادة التوازن المطلوبة باستخدام الطرق الموضحة أعلاه. في الوقت نفسه ، سنأخذ قيم المؤشرات في بداية الفترة من أجل استبعاد النظر إلى المستقبل.
نحن نصف هيكل المحافظ ونشير إلى إعادة التوازن المطلوبة. سنقوم بحساب المحافظ في دورة ، حيث نحتاج إلى تحديد أسهم وشروط فريدة:
هذه المرة نحتاج إلى القيام بخدعة بمؤشرات الأعمدة والصفوف للحصول على الفهرس المتعدد المطلوب في وظيفة إعادة التوازن. سنحقق ذلك من خلال استدعاء أساليب DataFrame (). Stack (). Unstack ([1، 2]) بالتسلسل. سينقل هذا الرمز الأعمدة إلى فهرس متعدد أحرف صغيرة ، ثم يعيد الفهرس المتعدد باستخدام مؤشرات وأعمدة بالترتيب المطلوب.
حقائب جاهزة للرسوم البيانية
الآن يبقى رسم كل شيء. للقيام بذلك ، قم بتشغيل دورة المحفظة مرة أخرى ، والتي تعرض البيانات على الرسوم البيانية. في النهاية سنرسم SPY كمعيار للمقارنة.
كود بايثون fig = plt.figure(figsize=(15, 4), facecolor='white') ax_perf = fig.add_subplot(121) ax_dd = fig.add_subplot(122) for p in portfolios: p['performance'].rename(p['name']).plot(ax=ax_perf, legend=True, title='Performance') p['drawdown'].rename(p['name']).plot(ax=ax_dd, legend=True, title='Max drawdown')

الخلاصة
يسمح لك الرمز المدروس بتحديد العديد من هياكل المحفظة وظروف إعادة التوازن. بمساعدتها ، يمكنك التحقق بسرعة مما إذا كان ، على سبيل المثال ، يستحق الاحتفاظ بالذهب (GLD) أو الأسواق الناشئة (EEM) في محفظة. جربها بنفسك ، أضف شروطك الخاصة للمؤشرات أو حدد المعلمات الموصوفة بالفعل. (ولكن تذكر خطأ الناجي وأن ملائمة البيانات السابقة قد لا ترقى إلى مستوى التوقعات في المستقبل). ثم قرر من تثق في محفظتك - Python أو المستشارين الماليين؟
المستودع:
rebalance.portfolio