Les stocks affaissés sont-ils prometteurs? Analysons avec python

Analysons la dynamique des stocks d’outsiders et de leaders


Récemment, j'ai lu un article selon lequel les actions extérieures (celles qui ont baissé le plus possible dans le prix par mois) de l'indice Mosbirzhi ont de meilleures perspectives de croissance que l'indice moyen.

Dans cette étude, je considérerai


  1. dynamique des actions des étrangers et des leaders de la croissance (période de 30 jours)
  2. Est-il judicieux d'acheter des tirages et de jouer à bas après une croissance significative

Important! Je considérerai absolument tous les jours sur tous les titres, en conséquence, de nombreux baisses seront des écarts de dividendes (l'idée est de prendre en compte tous les écarts).

Je considérerai les actions de l'indice Mosbirzha (uniquement les actions avec une part dans l'indice> 0,5%), à savoir:

  • Gazprom
  • Lukoil
  • Sberbank
  • MMC Norilsk Nickel
  • NOVATEK
  • Aimant
  • Rosneft
  • Tatneft
  • MTS
  • VTB
  • Surgutneftegas
  • ALROSA
  • Surgutneftegas p
  • Bourse de Moscou
  • NLMK
  • Severstal
  • Yandex
  • Polymétal international
  • Sberbank de Russie P
  • INTER RAO
  • RUSAL
  • Pôle
  • Transneft p
  • RusHydro
  • PhosAgro
  • MMK
  • Aeroflot
  • Mégaphone
  • Tatneft p
  • Rostelecom

La période est 2018-2019.

Obtenir des cotations boursières


Vous devez d'abord obtenir des cotations boursières pour les deux dernières années. Je les ai téléchargés sur le site Web de Finam et j'ai simplement importé du csv.

Commençons à collecter des devis dans notre fichier


Importer des pandas:

import pandas as pd

Supprimons les restrictions sur l'affichage dans la fenêtre (je dois le faire dans 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)

Vous devez importer chaque stock de la même manière:


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. Afficher le nom du stock
  2. Nous le lisons à partir du fichier
  3. Trier par date
  4. Ajoutez une colonne avec une croissance quotidienne de 30% du stock.
  5. Ajoutez une colonne de variation en pourcentage au cours des 30 prochains jours.
  6. Ajoutez une colonne avec un ticket. Cela vous permettra de combiner les datagrammes des colonnes avec la date.

Afficher les statistiques sur les stocks individuels


Voyons maintenant les stocks individuels. Il est important de considérer les actions séparément, car la volatilité peut se comporter différemment dans différents cas (par exemple, les prélèvements dans Detsky Mir et Norilsk Nickel sont remboursés rapidement, et l'industrie pétrolière dans les moments difficiles peut être complètement ignorée)

Regardez les colonnes 30_days_growth pour les captures d'écran (variation en pourcentage par rapport au passé 30 jours) et after_30_days_growth (combien coûtera la part après 30 jours)

En utilisant Gazprom comme exemple, voyons ce qui arrive aux parts après une baisse de 30 jours de plus de 10%.

Obtenez Gazprom trié par changement de 30 jours


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



Dans ce cas, nous voyons que les actions augmenteront au cours du mois (dans la colonne avec une croissance sur 30 jours, principalement des valeurs positives).

Mais de l'autre côté, tout n'est pas si évident, puisque la nouvelle politique de dividende a tout «cassé».



Nous repousserons 2019 pour tirer des conclusions. Pour ce faire, je ne sortirai que les 255 premières lignes:


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



Il s'avère qu'avec une augmentation de plus de 10%, il est logique de vendre.

Regardons Lukoil.

Tout n'est pas si évident ici: nous allons





regarder le secteur financier de

Sberbank.

De forts tirages sont généralement remboursés. Mais ici, la volatilité de l'ogh Le





plus intéressant était de voir comment les prélèvements sont achetés à Norilsk Nickel.



Presque tout prélèvement de Norilsk Nickel au cours des deux dernières années est un bon investissement :)

Calcul du rendement moyen sur 30 jours


Voyons quel rendement moyen nous obtenons par mois si nous entrons dans un drawdown inférieur à -5%.

Créez une variable avec ces lignes:


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



On dérive la moyenne:


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

Nous obtiendrons le retour pendant 30 jours 6.935553432942371%

Nous verrons également comment le coût augmente en 14 jours


Ajoutez une colonne:


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

Voyons le gain moyen sur 14 jours:


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

C'est 4,125%

Calcul du rendement de toutes les actions avec un tirage supérieur à 15%


Maintenant, nous calculons le rendement moyen pendant 30 jours pour tous les stocks où le rabattement est supérieur à 15%.

Nous devons tout combiner en une seule trame de données.

Pour ce faire, créez une feuille avec tous les partages:


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]

Combiner:


all_stocks = pd.concat(all_tickets)

Créez un bloc de données dans lequel il n'y aura que des lignes avec des rabattements supérieurs à 15%:


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

Calculez le rendement moyen:


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

Nous obtenons 7.78570670526497%

Assez bon compte tenu de ce niveau de diversification.

De même, calculez le rendement des prélèvements de 10%



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

Nous obtenons 3,1%

Vaut-il la peine de jouer sur des actions baissières qui ont augmenté de 15% + en 30 jours?



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

Nous obtenons une croissance de 2%. Il s'avère que de cette façon, nous ne pourrons pas profiter, mais ici, il est clair que le potentiel dans ce cas est moindre. Mais ce n'est pas surprenant.

Les chiffres, bien sûr, sont intéressants, mais il convient de considérer qu'il s'agit davantage d'une référence, car nous obtiendrons cette rentabilité dans le cas de l'achat de tous les prélèvements quotidiens, alors qu'ils se situent dans la fourchette requise.

Il est nécessaire de supprimer les lignes avec des dates de fermeture afin qu'il n'y ait pas de duplication du même tirage, mais c'est une autre histoire.

Les raisons de tous les écarts doivent également être prises en compte. Évidemment, si Gazprom introduit une nouvelle politique divisionnaire, cela ne vaut pas la peine d'attendre la chute dans un avenir proche.

All Articles