هل الأسهم المتدلية واعدة؟ دعونا نحلل مع الثعبان

دعونا نحلل ديناميات مخزون الغرباء والقادة


قرأت مؤخرًا مقالًا مفاده أن الأسهم الخارجية (تلك التي انخفضت قدر الإمكان في السعر الشهري) لمؤشر Mosbirzhi لها آفاق نمو أكبر من متوسط ​​المؤشر.

في هذه الدراسة سأفكر


  1. ديناميات مخزون الغرباء وقادة النمو (فترة 30 يومًا)
  2. هل من المنطقي أن تشتري على عمليات السحب واللعب منخفضة بعد نمو كبير

مهم! سأفكر في كل يوم على الإطلاق في جميع الأسهم ، وبالتالي ، فإن العديد من عمليات السحب ستكون فجوات أرباح (الفكرة هي النظر في جميع الانحرافات).

سأنظر في أسهم مؤشر Mosbirzha (فقط سهم بحصة في المؤشر> 0.5٪) ، وهي:

  • غازبروم
  • لوك أويل
  • سبيربنك
  • MMC نوريلسك نيكل
  • نوفاتيك
  • مغناطيس
  • روسنفت
  • تاتنفت
  • MTS
  • VTB
  • سورجوتنيفتجاس
  • ALROSA
  • سورجوتنيفتجاس ص
  • بورصة موسكو
  • NLMK
  • سيفيرستال
  • ياندكس
  • Polymetal الدولية
  • سبيربانك من روسيا ص
  • انتر راو
  • روسال
  • عمود
  • ص
  • RusHydro
  • فوساجرو
  • MMK
  • ايروفلوت
  • مكبر الصوت
  • تاتنفت ص
  • Rostelecom

الفترة هي 2018-2019.

الحصول على أسعار الأسهم


تحتاج أولاً إلى الحصول على أسعار الأسهم للسنتين الماضيتين. قمت بتنزيلها من موقع Finam وقمت باستيراد ملف csv.

لنبدأ في جمع الاقتباسات داخل ملفنا


استيراد الباندا:

import pandas as pd

دعنا نزيل القيود على الشاشة في النافذة (أحتاج إلى القيام بذلك في PyCharm):


pd.set_option('display.max_columns', None)
pd.set_option('display.expand_frame_repr', False)
pd.set_option('max_colwidth', 80)
pd.set_option('max_rows', 60000)

تحتاج إلى استيراد كل سهم بطريقة مماثلة:


print('GAZP')
GAZP = pd.read_csv("GAZP_180101_191231.csv",sep=';', header=0, index_col='<DATE>', parse_dates=True)
GAZP = GAZP.sort_values(by='<DATE>')
#      
GAZP['30_days_growth']=((GAZP['<CLOSE>']/GAZP['<CLOSE>'].shift(30))-1)*100
GAZP['after_30_days_growth']=((GAZP['<CLOSE>'].shift(-30)/GAZP['<CLOSE>'])-1)*100
GAZP['ticket']='GAZP'
print(GAZP)

  1. عرض اسم السهم
  2. قرأناه من الملف
  3. رتب حسب التاريخ
  4. أضف عمودًا مع نمو المخزون اليومي بنسبة 30 بالمائة.
  5. أضف عمود تغيير النسبة المئوية خلال الثلاثين يومًا القادمة.
  6. أضف عمودًا مع تذكرة. سيسمح لك ذلك بدمج مخططات بيانات الأعمدة مع التاريخ.

عرض إحصائيات الأسهم الفردية


الآن دعونا نلقي نظرة على الأسهم الفردية. من المهم إلقاء نظرة على الأسهم بشكل منفصل لأن التقلبات يمكن أن تتصرف بشكل مختلف في حالات مختلفة (على سبيل المثال ، يتم استرداد عمليات السحب في Detsky Mir و Norilsk Nickel بسرعة ، ويمكن تجاهل صناعة النفط في الأوقات الصعبة تمامًا)

انظر إلى الأعمدة 30_days_growth من أجل لقطات الشاشة (تغير النسبة المئوية على مدى الماضي 30 يومًا) و after_30_days_growth (مقدار تكلفة المشاركة بعد 30 يومًا)

باستخدام Gazprom كمثال ، دعنا نرى ما سيحدث للأسهم بعد انخفاض لمدة 30 يومًا بنسبة تزيد عن 10٪.

احصل على تصنيف شركة Gazprom حسب التغيير لمدة 30 يومًا


print(GAZP.sort_values(by='30_days_growth'))



في هذه الحالة ، نرى أن المخزونات ستنمو خلال الشهر (في العمود مع نمو لمدة 30 يومًا ، ومعظمها قيم إيجابية).

ولكن من الناحية الأخرى ، كل شيء ليس واضحًا جدًا ، نظرًا لأن سياسة توزيع الأرباح الجديدة قد "كسرت" كل شيء.



سنعيد 2019 إلى الوراء لاستخلاص النتائج. للقيام بذلك ، سأخرج أول 255 سطرًا فقط:


print(GAZP[:254].sort_values(by='30_days_growth'))



اتضح أنه مع زيادة بأكثر من 10٪ ، من المنطقي البيع.

فلنلق نظرة على لوك أويل.

كل شيء ليس واضحًا هنا: سنلقي





نظرة على القطاع المالي في

سبيربنك.

عادة ما يتم استرداد عمليات السحب القوية. ولكن هنا تقلبات ogh





الأكثر إثارة للاهتمام هو أن نرى كيف يتم شراء السحب من Norilsk Nickel. يعتبر



تقريبًا أي تخفيض لـ Norilsk Nickel في العامين الماضيين استثمارًا جيدًا :)

حساب متوسط ​​العائد لمدة 30 يومًا


دعنا نرى متوسط ​​العائد الذي نحصل عليه شهريًا إذا أدخلنا سحبًا أقل من -5٪.

قم بإنشاء متغير باستخدام هذه الأسطر:


GMKN5 = GMKN[GMKN['30_days_growth']<-5]
print(GMKN5)



نستمد المتوسط:


print( GMKN5['after_30_days_growth'].mean())

سوف نحصل على إرجاع لمدة 30 يومًا 6.935553432942371٪

سنرى أيضًا كيف تزداد التكلفة خلال 14 يومًا


أضف عمودًا:


GMKN['after_14_days_growth']=((GMKN['<CLOSE>'].shift(-14)/GMKN['<CLOSE>'])-1)*100

دعونا نرى متوسط ​​الربح لمدة 14 يومًا:


print(GMKN5['after_14_days_growth'].mean())

هذا 4.125٪

احتساب العائد على جميع الأسهم مع سحب أكثر من 15٪


الآن نقوم بحساب متوسط ​​العائد لمدة 30 يومًا لجميع الأسهم حيث يكون السحب أكثر من 15٪.

نحتاج إلى دمج كل شيء في إطار بيانات واحد.

للقيام بذلك ، قم بإنشاء ورقة بكل المشاركات:


all_tickets = [GAZP,LKOH,SBER,SBERP,NVTK,MOEX,MGNT,MFON,MTSS,MAGN,GMKN,AFLT,POLY,ROSN,HYDR,RTKM,RUAL,YNDX,ALRS,VTBR,TATN,TATNP,SNGS,SNGSP,PLZL,NLMK,CHMF,IRAO,TRNFP,PHOR]

دمج:


all_stocks = pd.concat(all_tickets)

إنشاء إطار بيانات لن يكون هناك سوى خطوط ذات سحب أكبر من 15٪:


tickets15 = all_stocks[all_stocks['30_days_growth']<-15]
print(tickets15)

احسب متوسط ​​العائد:


print(tickets15['after_30_days_growth'].mean())

نحصل على 7.78570670526497٪

جيد جدًا بالنظر إلى هذا المستوى من التنويع.

وبالمثل ، قم بحساب عائد السحب بنسبة 10٪



tickets10 = all_stocks[all_stocks['30_days_growth']<-10]
print(tickets10)
print(tickets10['after_30_days_growth'].mean())

نحصل على 3.1٪

هل يستحق الأمر اللعب على تخفيض الأسهم التي نمت بنسبة 15٪ + في 30 يومًا؟



tickets15plus = all_stocks[all_stocks['30_days_growth']>15]
print(tickets15plus)
print(tickets15plus['after_30_days_growth'].mean())

نحصل على نمو بنسبة 2٪. اتضح أننا بهذه الطريقة لن نتمكن من الربح ، ولكن من الواضح هنا أن الإمكانات في هذه الحالة أقل. لكن هذا ليس مفاجئا.

الأرقام ، بالطبع ، مثيرة للاهتمام ، ولكن من الجدير بالذكر أن هذا هو أكثر من معيار ، لأننا سنحصل على هذه الربحية في حالة شراء جميع عمليات السحب كل يوم ، بينما هم في النطاق المطلوب.

يجب إزالة الخطوط ذات تواريخ الإغلاق حتى لا يكون هناك ازدواجية في نفس السحب ، ولكن هذه قصة أخرى.

كما ينبغي النظر في أسباب جميع الانحرافات. من الواضح أنه إذا أدخلت غازبروم سياسة توزيع أرباح جديدة ، فلا يستحق انتظار السقوط في المستقبل القريب.

All Articles