¿Las acciones caídas son prometedoras? Analicemos con python

Analicemos la dinámica de las acciones de extraños y líderes.


Recientemente leí un artículo que dice que las acciones externas (aquellas que cayeron lo más posible en el precio por mes) del índice Mosbirzhi tienen mayores perspectivas de crecimiento que el índice promedio.

En este estudio consideraré


  1. Dinámica de las existencias de personas externas y líderes de crecimiento (período de 30 días)
  2. ¿Tiene sentido comprar en retiros y jugar bajo después de un crecimiento significativo

¡Importante! Consideraré absolutamente todos los días en todas las acciones, por lo tanto, muchas reducciones serán brechas de dividendos (la idea es considerar todas las desviaciones).

Consideraré las acciones del índice Mosbirzha (solo acciones con una participación en el índice> 0.5%), a saber:

  • Gazprom
  • Lukoil
  • Sberbank
  • MMC Norilsk Nickel
  • NOVATEK
  • Imán
  • Rosneft
  • Tatneft
  • MTS
  • VTB
  • Surgutneftegas
  • ALROSA
  • Surgutneftegas p
  • Intercambio de Moscú
  • NLMK
  • Severstal
  • Yandex
  • Polymetal internacional
  • Sberbank de Rusia P
  • INTER RAO
  • RUSAL
  • Polo
  • Transneft p
  • RusHydro
  • PhosAgro
  • MMK
  • Aeroflot
  • Megáfono
  • Tatneft p
  • Rostelecom

El período es 2018-2019.

Obtener cotizaciones de acciones


Primero necesita obtener cotizaciones de acciones de los últimos dos años. Los descargué del sitio web de Finam y simplemente importé csv.

Comencemos a recopilar citas dentro de nuestro archivo


Pandas de importación:

import pandas as pd

Eliminemos las restricciones en la pantalla en la ventana (necesito hacer esto en 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)

Necesita importar cada stock de manera similar:


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. Mostrar el nombre de la acción
  2. Lo leemos del archivo
  3. Ordenar por fecha
  4. Agregue una columna con un crecimiento diario del stock del 30 por ciento.
  5. Agregue una columna de cambio porcentual en los próximos 30 días.
  6. Agregue una columna con un boleto. Esto le permitirá combinar datagramas de columna con fecha.

Ver estadísticas sobre acciones individuales


Ahora echemos un vistazo a las acciones individuales. Es importante tener en cuenta las reservas por separado, ya volatilidad puede comportarse de forma diferente en los distintos casos (por ejemplo, detracciones en Detsky Mir y Norilsk Nickel, se amortizan rápidamente, y la industria del petróleo en los momentos difíciles puede ser ignorado por completo)

Mira las columnas 30_days_growth de imágenes (cambio porcentual en el último 30 días) y después de 30 días de crecimiento (cuánto costará la acción después de 30 días)

Usando Gazprom como ejemplo, veamos qué sucede con las acciones después de una disminución de más de 10% en 30 días.

Obtenga Gazprom ordenado por cambio de 30 días


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



En este caso, vemos que las existencias crecerán durante el mes (en la columna con un crecimiento de 30 días, principalmente valores positivos).

Pero desde el otro extremo, todo no es tan obvio, ya que la nueva política de dividendos ha "roto" todo.



Volveremos a 2019 para sacar conclusiones. Para hacer esto, solo generaré las primeras 255 líneas:


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



Resulta que con un aumento de más del 10% tiene sentido vender.

Veamos a Lukoil.

Aquí no todo es tan obvio: veremos





el sector financiero de

Sberbank.

Por lo general, se amortizan fuertes reducciones. Pero aquí la volatilidad de lo





más interesante fue ver cómo se compran las reducciones de Norilsk Nickel.



Casi cualquier reducción de Norilsk Nickel en los últimos dos años es una buena inversión :)

Cálculo del rendimiento promedio de 30 días.


Veamos qué rendimiento promedio obtenemos por mes si ingresamos una reducción por debajo de -5%.

Cree una variable con estas líneas:


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



Derivamos el promedio:


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

Recibiremos la devolución por 30 días 6.935553432942371%

También veremos cómo aumenta el costo en 14 días.


Añadir una columna:


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

Veamos la ganancia promedio durante 14 días:


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

Esto es 4.125%

Cálculo del rendimiento de todas las acciones con una reducción de más del 15%


Ahora calculamos el rendimiento promedio durante 30 días para todas las acciones donde la reducción es superior al 15%.

Necesitamos combinar todo en un marco de datos.

Para hacer esto, cree una hoja con todos los recursos compartidos:


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]

Combinar:


all_stocks = pd.concat(all_tickets)

Cree un marco de datos en el que solo habrá líneas con reducciones superiores al 15%:


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

Calcule el rendimiento promedio:


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

Obtenemos 7.78570670526497%

Bastante bueno teniendo en cuenta este nivel de diversificación.

Del mismo modo, calcule el rendimiento del 10% de reducción



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

Obtenemos 3.1%

¿Vale la pena jugar para reducir las acciones que han crecido un 15% + en 30 días?



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

Tenemos un crecimiento del 2%. Resulta que de esta manera no podremos obtener ganancias, pero aquí está claro que el potencial en este caso es menor. Pero esto no es sorprendente.

Los números, por supuesto, son interesantes, pero vale la pena considerar que esto es en mayor medida un punto de referencia, ya que obtendremos esta rentabilidad en el caso de comprar todos los retiros todos los días, mientras estén en el rango requerido.

Se requiere eliminar líneas con fechas de cierre para que no haya duplicación de la misma reducción, pero esta es otra historia.

También se deben considerar los motivos de todas las desviaciones. Obviamente, si Gazprom presenta una nueva política divisional, no vale la pena esperar la caída en el futuro cercano.

All Articles