Apakah saham melorot menjanjikan? Mari kita analisa dengan python

Mari kita menganalisis dinamika stok orang luar dan pemimpin


Baru-baru ini saya membaca sebuah artikel yang menunjukkan bahwa saham orang luar (yang turun sebanyak mungkin dalam harga per bulan) dari indeks Mosbirzhi memiliki prospek pertumbuhan yang lebih besar daripada indeks rata-rata.

Dalam studi ini saya akan mempertimbangkan


  1. dinamika stok orang luar dan pemimpin pertumbuhan (periode 30 hari)
  2. Apakah masuk akal untuk membeli pada drawdowns dan bermain rendah setelah pertumbuhan yang signifikan

Penting! Saya akan mempertimbangkan benar-benar setiap hari pada semua stok, karena itu, banyak penarikan akan menjadi kesenjangan dividen (idenya adalah untuk mempertimbangkan semua penyimpangan).

Saya akan mempertimbangkan saham indeks Mosbirzha (hanya saham dengan saham di indeks> 0,5%), yaitu:

  • Gazprom
  • Lukoil
  • Sberbank
  • MMC Norilsk Nikel
  • NOVATEK
  • Magnet
  • Rosneft
  • Tatneft
  • MTS
  • VTB
  • Surgutneftegas
  • ALROSA
  • Surgutneftegas p
  • Bursa Moskow
  • NLMK
  • Severstal
  • Yandex
  • Polymetal internasional
  • Sberbank of Russia P
  • INTER RAO
  • RUSAL
  • Tiang
  • Transneft p
  • RusHydro
  • PhosAgro
  • MMK
  • Aeroflot
  • Megafon
  • Tatneft p
  • Rostelecom

Periode tersebut adalah 2018-2019.

Dapatkan harga saham


Pertama, Anda perlu mendapatkan penawaran harga selama dua tahun terakhir. Saya mengunduhnya dari situs web Finam dan hanya mengimpor csv.

Mari mulai mengumpulkan kutipan di dalam file kita


Impor Panda:

import pandas as pd

Mari kita hapus batasan pada tampilan di jendela (saya perlu melakukan ini di 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)

Anda perlu mengimpor setiap saham dengan cara yang sama:


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. Tampilkan nama stok
  2. Kami membacanya dari file
  3. Urutkan berdasarkan tanggal
  4. Tambahkan kolom dengan pertumbuhan stok 30 persen setiap hari.
  5. Tambahkan kolom perubahan persentase selama 30 hari ke depan.
  6. Tambahkan kolom dengan tiket. Ini akan memungkinkan Anda untuk menggabungkan datagram kolom dengan tanggal.

Lihat statistik setiap saham


Sekarang mari kita lihat saham individu. Penting untuk melihat saham secara terpisah karena volatilitas dapat berperilaku berbeda dalam kasus yang berbeda (misalnya, penarikan di Detsky Mir dan Norilsk Nickel ditebus dengan cepat, dan industri minyak di masa-masa sulit dapat diabaikan sama sekali)

Lihat kolom 30_days_growth untuk tangkapan layar (persentase perubahan selama masa lalu) 30 hari) dan after_30_days_growth (berapa harga saham setelah 30 hari)

Menggunakan Gazprom sebagai contoh, mari kita lihat apa yang terjadi pada stok setelah penurunan 30 hari lebih dari 10%.

Dapatkan Gazprom diurutkan berdasarkan perubahan 30 hari


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



Dalam hal ini, kami melihat bahwa saham akan tumbuh selama bulan tersebut (Di kolom dengan pertumbuhan 30 hari, sebagian besar nilai positif).

Tetapi dari ujung yang lain, semuanya tidak begitu jelas, karena kebijakan dividen yang baru telah "menghancurkan" segalanya.



Kami akan melemparkan kembali 2019 untuk menarik kesimpulan. Untuk melakukan ini, saya hanya akan menampilkan 255 baris pertama:


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



Ternyata dengan kenaikan lebih dari 10% masuk akal untuk dijual,

mari kita lihat Lukoil,

semuanya tidak begitu jelas di sini: Kita akan





melihat sektor keuangan

Sberbank,

penarikan yang kuat biasanya ditebus. Tapi di sini volatilitas ogh.





Paling menarik adalah melihat bagaimana drawdown dibeli dari Norilsk Nickel.



Hampir semua drawdown Norilsk Nickel dalam dua tahun terakhir adalah investasi yang bagus :)

Perhitungan pengembalian rata-rata selama 30 hari


Mari kita lihat hasil rata-rata yang kita dapatkan per bulan jika kita memasukkan drawdown di bawah -5%.

Buat variabel dengan garis-garis ini:


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



Kami memperoleh rata-rata:


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

Kami akan mendapatkan pengembalian selama 30 hari 6.935553432942371%

Kami juga akan melihat bagaimana biaya meningkat dalam 14 hari


Tambahkan kolom:


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

Mari kita lihat keuntungan rata-rata selama 14 hari:


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

Ini 4,125%

Perhitungan pengembalian semua saham dengan penarikan lebih dari 15%


Sekarang kita menghitung hasil rata-rata selama 30 hari untuk semua saham, di mana penarikan lebih dari 15%.

Kita perlu menggabungkan semuanya menjadi satu kerangka data.

Untuk melakukan ini, buat lembar dengan semua bagian:


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]

Menggabungkan:


all_stocks = pd.concat(all_tickets)

Buat bingkai data di mana hanya akan ada garis dengan drawdown lebih besar dari 15%:


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

Hitung hasil rata-rata:


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

Kami mendapatkan 7,78570670526497%

Cukup bagus mengingat tingkat diversifikasi ini.

Demikian pula, hitung hasil drawdown 10%



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

Kami mendapat 3,1%

Apakah layak bermain dengan menurunkan saham yang telah tumbuh 15% + dalam 30 hari?



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

Kami mendapatkan pertumbuhan 2%. Ternyata dengan cara ini kita tidak akan dapat untung, tetapi di sini jelas bahwa potensi dalam hal ini kurang. Tapi ini tidak mengejutkan.

Jumlahnya tentu saja menarik, tetapi perlu dipertimbangkan bahwa ini adalah tolok ukur yang lebih besar, karena kita akan mendapatkan keuntungan ini jika membeli semua drawdown setiap hari, sementara mereka masih dalam kisaran yang diperlukan.

Diperlukan untuk menghapus garis dengan tanggal dekat sehingga tidak ada duplikasi drawdown yang sama, tetapi ini adalah cerita lain.

Alasan untuk semua penyimpangan juga harus dipertimbangkan. Jelas, jika Gazprom memperkenalkan kebijakan dividen baru, tidak ada gunanya menunggu kejatuhan dalam waktu dekat.

All Articles