As ações caídas são promissoras? Vamos analisar com python

Vamos analisar a dinâmica dos estoques de pessoas de fora e líderes


Recentemente, li um artigo em que ações de fora (aquelas que caíam o máximo possível no preço por mês) do índice Mosbirzhi têm maiores perspectivas de crescimento do que o índice médio.

Neste estudo vou considerar


  1. dinâmica de estoques de pessoas de fora e líderes de crescimento (período de 30 dias)
  2. Faz sentido comprar em drawdowns e jogar baixo após um crescimento significativo

Importante! Considerarei absolutamente todos os dias em todas as ações; portanto, muitos rebaixamentos serão diferenças de dividendos (a idéia é considerar todos os desvios).

Considerarei as ações do índice Mosbirzha (apenas ações com uma participação no índice> 0,5%), a saber:

  • Gazprom
  • Lukoil
  • Sberbank
  • MMC Norilsk Nickel
  • NOVATEK
  • Magnético
  • Rosneft
  • Tatneft
  • MTS
  • VTB
  • Surgutneftegas
  • ALROSA
  • Surgutneftegas p
  • Moscow Exchange
  • NLMK
  • Severstal
  • Yandex
  • Polymetal international
  • Sberbank da Rússia P
  • INTER RAO
  • RUSAL
  • Pólo
  • Transneft p
  • RusHydro
  • PhosAgro
  • MMK
  • Aeroflot
  • Megafone
  • Tatneft p
  • Rostelecom

O período é 2018-2019.

Obter cotações de ações


Primeiro, você precisa obter cotações de ações nos últimos dois anos. Eu os baixei do site da Finam e simplesmente importei o CSV.

Vamos começar a coletar citações dentro do nosso arquivo


Pandas de importação:

import pandas as pd

Vamos remover as restrições na exibição na janela (eu preciso fazer isso no 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)

Você precisa importar cada estoque de maneira semelhante:


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. Exibe o nome do estoque
  2. Lemos a partir do arquivo
  3. Classificar por data
  4. Adicione uma coluna com 30% de crescimento diário de estoque.
  5. Adicione uma coluna de alteração percentual nos próximos 30 dias.
  6. Adicione uma coluna com um ticket. Isso permitirá combinar datagramas de coluna com data.

Exibir estatísticas sobre ações individuais


Agora vamos olhar para ações individuais. É importante olhar para os estoques separadamente, pois a volatilidade pode se comportar de forma diferente em casos diferentes (por exemplo, levantamentos em Detsky Mir e Norilsk Nickel são resgatados rapidamente, ea indústria do petróleo em tempos difíceis pode ser ignorado por completo)

Olhe para as colunas 30_days_growth para screenshots (variação percentual ao longo da última 30 dias) e after_30_days_growth (quanto custará o compartilhamento após 30 dias)

Usando a Gazprom como exemplo, vamos ver o que acontece com as ações após um declínio de mais de 10% em 30 dias.

Get Gazprom classificado por alteração de 30 dias


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



Nesse caso, vemos que os estoques crescerão durante o mês (na coluna com crescimento de 30 dias, principalmente valores positivos).

Mas do outro lado, tudo não é tão óbvio, já que a nova política de dividendos "quebrou" tudo.



Retornaremos 2019 para tirar conclusões. Para fazer isso, exibirei apenas as primeiras 255 linhas:


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



Acontece que, com um aumento de mais de 10%, faz sentido

vender.Vamos olhar para a Lukoil.Tudo

não é tão óbvio aqui: veremos





o setor financeiro do

Sberbank.Vantagens

geralmente são resgatadas. Mas aqui a volatilidade do ogh O





mais interessante foi ver como os rebaixamentos são comprados da Norilsk Nickel.



Quase qualquer rebaixamento do Norilsk Nickel nos últimos dois anos é um bom investimento :)

Cálculo do retorno médio de 30 dias


Vamos ver qual o rendimento médio que obtemos por mês se inserir um rebaixamento abaixo de -5%.

Crie uma variável com estas linhas:


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



Derivamos a média:


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

Teremos o retorno por 30 dias 6.935553432942371%

Também veremos como o custo aumenta em 14 dias


Adicione uma coluna:


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

Vamos ver o ganho médio de 14 dias:


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

Isso é 4,125%

Cálculo do retorno de todas as ações com um levantamento de mais de 15%


Agora calculamos o rendimento médio de 30 dias para todas as ações em que o levantamento é superior a 15%.

Precisamos combinar tudo em um único quadro de dados.

Para fazer isso, crie uma planilha com todos os compartilhamentos:


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)

Crie um quadro de dados no qual haverá apenas linhas com rebaixamentos maiores que 15%:


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

Calcule o rendimento médio:


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

Temos 7,78570670526497%

Muito bom, considerando esse nível de diversificação.

Da mesma forma, calcule o rendimento de 10% de rebaixamentos



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

Temos 3,1%

Vale a pena apostar na redução de ações que cresceram mais de 15% em 30 dias?



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

Temos um crescimento de 2%. Acontece que dessa forma não seremos capazes de lucrar, mas aqui está claro que o potencial nesse caso é menor. Mas isso não é surpreendente.

Os números, é claro, são interessantes, mas vale a pena considerar que isso é mais uma referência, pois obteremos essa lucratividade se comprarmos todos os levantamentos todos os dias, enquanto estiverem no intervalo necessário.

É necessário remover linhas com datas próximas para que não haja duplicação do mesmo levantamento, mas essa é outra história.

As razões para todos os desvios também devem ser consideradas. Obviamente, se a Gazprom introduzir uma nova política de divisão, não vale a pena esperar pela queda no futuro próximo.

All Articles