Sind sinkende Aktien vielversprechend? Lassen Sie uns mit Python analysieren

Lassen Sie uns die Dynamik der Bestände von Außenstehenden und Führungskräften analysieren


Kürzlich habe ich einen Artikel gelesen, in dem Outsider-Aktien (diejenigen, deren Preis pro Monat so stark wie möglich gefallen ist) des Mosbirzhi-Index größere Wachstumsaussichten haben als der durchschnittliche Index.

In dieser Studie werde ich berücksichtigen


  1. Dynamik der Bestände von Außenstehenden und Wachstumsführern (Zeitraum von 30 Tagen)
  2. Ist es sinnvoll, bei Drawdowns zu kaufen und nach einem signifikanten Wachstum niedrig zu spielen?

Wichtig! Ich werde absolut jeden Tag bei allen Aktien berücksichtigen, dementsprechend werden viele Drawdowns Dividendenlücken sein (die Idee ist, alle Abweichungen zu berücksichtigen).

Ich werde die Aktien des Mosbirzha-Index betrachten (nur Aktien mit einem Indexanteil> 0,5%), nämlich:

  • Gazprom
  • Lukoil
  • Sberbank
  • MMC Norilsk Nickel
  • NOVATEK
  • Magnet
  • Rosneft
  • Tatneft
  • MTS
  • VTB
  • Surgutneftegas
  • ALROSA
  • Surgutneftegas p
  • Moskauer Börse
  • NLMK
  • Severstal
  • Yandex
  • Polymetal international
  • Sberbank von Russland P.
  • INTER RAO
  • RUSAL
  • Pole
  • Transneft p
  • RusHydro
  • PhosAgro
  • MMK
  • Aeroflot
  • Megaphon
  • Tatneft p
  • Rostelecom

Der Zeitraum ist 2018-2019.

Börsenkurse erhalten


Zuerst müssen Sie Börsenkurse für die letzten zwei Jahre erhalten. Ich habe sie von der Finam-Website heruntergeladen und einfach CSV importiert.

Beginnen wir mit dem Sammeln von Zitaten in unserer Datei


Pandas importieren:

import pandas as pd

Entfernen wir die Einschränkungen für die Anzeige im Fenster (ich muss dies in PyCharm tun):


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)

Sie müssen jeden Bestand auf ähnliche Weise importieren:


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. Zeigen Sie den Namen des Bestands an
  2. Wir lesen es aus der Akte
  3. Nach Datum sortieren
  4. Fügen Sie eine Spalte mit einem täglichen Aktienwachstum von 30 Prozent hinzu.
  5. Fügen Sie in den nächsten 30 Tagen eine prozentuale Änderungsspalte hinzu.
  6. Fügen Sie eine Spalte mit einem Ticket hinzu. Auf diese Weise können Sie Spaltendatagramme mit dem Datum kombinieren.

Statistiken zu einzelnen Beständen anzeigen


Betrachten wir nun einzelne Aktien. Es ist wichtig, die Aktien separat zu betrachten, da sich die Volatilität in verschiedenen Fällen unterschiedlich verhalten kann (z. B. werden Drawdowns bei Detsky Mir und Norilsk Nickel schnell zurückgezahlt, und die Ölindustrie kann in schwierigen Zeiten insgesamt ignoriert werden). In

den Spalten 30_days_growth finden Sie Screenshots (prozentuale Veränderung in der Vergangenheit) 30 Tage) und after_30_days_growth (wie viel die Aktie nach 30 Tagen kosten wird)

Lassen Sie uns am Beispiel von Gazprom sehen, was mit den Aktien nach einem 30-tägigen Rückgang von mehr als 10% passiert.

Lassen Sie Gazprom nach 30-tägigem Wechsel sortieren


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



In diesem Fall sehen wir, dass die Aktien im Laufe des Monats wachsen werden (in der Spalte mit 30-Tage-Wachstum meist positive Werte).

Aber vom anderen Ende ist nicht alles so offensichtlich, da die neue Dividendenpolitik alles „gebrochen“ hat.



Wir werden 2019 zurückwerfen, um Schlussfolgerungen zu ziehen. Dazu gebe ich nur die ersten 255 Zeilen aus:


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



Es stellt sich heraus, dass es mit einer Steigerung von mehr als 10% sinnvoll ist, zu verkaufen.

Schauen wir uns Lukoil an. Hier

ist nicht alles so offensichtlich: Wir werden





uns den Finanzsektor der

Sberbank ansehen .

Starke Drawdowns werden normalerweise zurückgezahlt. Aber hier war die Volatilität des OGH





am interessantesten zu sehen, wie Drawdowns von Norilsk Nickel gekauft werden.



Fast jeder Drawdown von Norilsk Nickel in den letzten zwei Jahren ist eine gute Investition :)

Berechnung der durchschnittlichen Rendite für 30 Tage


Mal sehen, welche durchschnittliche Rendite wir pro Monat erhalten, wenn wir einen Drawdown unter -5% eingeben.

Erstellen Sie eine Variable mit diesen Zeilen:


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



Wir leiten den Durchschnitt ab:


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

Wir erhalten die Rendite für 30 Tage 6.935553432942371%

Wir werden auch sehen, wie sich die Kosten in 14 Tagen erhöhen


Fügen Sie eine Spalte hinzu:


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

Sehen wir uns den durchschnittlichen Gewinn für 14 Tage an:


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

Dies sind 4,125%

Berechnung der Rendite aller Aktien mit einem Drawdown von mehr als 15%


Jetzt berechnen wir die durchschnittliche Rendite für 30 Tage für alle Aktien, bei denen der Drawdown mehr als 15% beträgt.

Wir müssen alles in einem Datenrahmen kombinieren.

Erstellen Sie dazu ein Blatt mit allen Freigaben:


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]

Kombinieren:


all_stocks = pd.concat(all_tickets)

Erstellen Sie einen Datenrahmen, in dem nur Linien mit Drawdowns von mehr als 15% vorhanden sind:


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

Berechnen Sie die durchschnittliche Ausbeute:


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

Wir erhalten 7.78570670526497%

Ziemlich gut angesichts dieses Diversifizierungsgrades.

Berechnen Sie in ähnlicher Weise die Rendite von 10% Drawdowns



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

Wir bekommen 3,1%

Lohnt es sich, Aktien zu senken, die in 30 Tagen um mehr als 15% gewachsen sind?



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

Wir bekommen ein Wachstum von 2%. Es stellt sich heraus, dass wir auf diese Weise nicht profitieren können, aber hier ist klar, dass das Potenzial in diesem Fall geringer ist. Das ist aber nicht überraschend.

Die Zahlen sind natürlich interessant, aber es lohnt sich zu bedenken, dass dies eher ein Maßstab ist, da wir diese Rentabilität erhalten, wenn wir jeden Tag alle Drawdowns kaufen, während sie im erforderlichen Bereich liegen.

Es ist erforderlich, Zeilen mit Abschlussdaten zu entfernen, damit derselbe Drawdown nicht dupliziert wird. Dies ist jedoch eine andere Geschichte.

Die Gründe für alle Abweichungen sollten ebenfalls berücksichtigt werden. Wenn Gazprom eine neue Teilungspolitik einführt, lohnt es sich natürlich nicht, auf den Fall in naher Zukunft zu warten.

All Articles