Comparación de la dinámica de cotizaciones de dos acciones en Python usando el ejemplo de acciones preferidas y ordinarias de Sberbank

Hola, hoy me gustaría hablar sobre mi experiencia en el análisis de acciones de Sberbank. A veces muestran dinámicas ligeramente diferentes: me resultó interesante analizar el movimiento de sus citas.

En este ejemplo, descargaremos citas del sitio web de Finam. Enlace para descargar Sberbank regular .

Para las operaciones de columna, usaré pandas, para la visualización de matplotlib.

Importamos:

import pandas as pd
import matplotlib.pyplot as plt

Para evitar que las tablas se reduzcan, debe eliminar las restricciones:

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', 6000)

Leer datos de stock


df = pd.read_csv("SBER_190101_200105.csv",sep=';', header=0, index_col='<DATE>', parse_dates=True)

(especifique el separador, dónde se encuentran los nombres de las columnas, qué columna será el índice, habilite el análisis de fechas).

Indique también el tipo:

df = df.sort_values(by='<DATE>')

Mostramos nuestros datos:

print(df)



Agregar una columna con un cambio en el precio

df['returns']=(df['<CLOSE>']/df['<CLOSE>'].shift(1))-1

Por lo tanto, es posible obtener exactamente el porcentaje:

df['returns_pers']=((df['<CLOSE>']/df['<CLOSE>'].shift(1))-1)*100



Agregar un segundo recurso compartido


Hazlo exactamente de la misma manera.

df2 = pd.read_csv("SBERP_190101_200105.csv",sep=';', header=0, index_col='<DATE>', parse_dates=True)

df = df.sort_values(by='<DATE>')

df2['returns_pers']=((df2['<CLOSE>']/df2['<CLOSE>'].shift(1))-1)*100
df2['returns']=(df2['<CLOSE>']/df2['<CLOSE>'].shift(1))-1
print(df2)


Visualizamos nuestras cotizaciones de bolsa


df['<CLOSE>'].plot(label='sber')
df2['<CLOSE>'].plot(label='sberp')
plt.legend()
plt.show()



Ahora muestre las cotizaciones con su promedio (MA 50):

df['<CLOSE>'].plot(label='sber')
df2['<CLOSE>'].plot(label='sberp')
df['ma50'] = df['<OPEN>'].rolling(50).mean().plot(label='ma50')
df2['ma50'] = df2['<OPEN>'].rolling(50).mean().plot(label='ma50')
plt.legend()
plt.show()



También se pueden mostrar otros promedios.

df['<CLOSE>'].plot(label='sber')
df2['<CLOSE>'].plot(label='sberp')
df['ma100'] = df['<OPEN>'].rolling(100).mean().plot(label='ma100')
df2['ma100'] = df2['<OPEN>'].rolling(100).mean().plot(label='ma100')
plt.legend()
plt.show()



Ahora mostraremos la rotación de las acciones:
agregue también el nombre del eje Y
y el tamaño del lienzo

df['total_trade'] = df['<OPEN>']*df['<VOL>']
df2['total_trade'] = df2['<OPEN>']*df2['<VOL>']
df['total_trade'].plot(label='sber',figsize=(16,8))
df2['total_trade'].plot(label='sberp',figsize=(16,8))
plt.legend()
plt.ylabel('Total Traded')
plt.show()



Análisis de correlación


Ahora echemos un vistazo más de cerca a la correlación. un gráfico matricial

nos ayudará en esto. Cree una nueva tabla con columnas para ambas acciones y asígneles nombres.

all_sber = pd.concat([df['<OPEN>'],df2['<OPEN>']],axis=1)
all_sber.columns = ['sber_open','sberp_open']
print(all_sber)



Ahora importamos el horario necesario

from pandas.plotting import scatter_matrix

Y sacarlo:

scatter_matrix(all_sber,figsize=(8,8),alpha=0.2,hist_kwds={'bins':100});
plt.show()

Debería aclararse que necesitamos agregar transparencia (alfa = 0.2) para ver la superposición de puntos.



Si los puntos "van" a lo largo de la diagonal, se observa una correlación.

Evaluación de volatilidad de valores


df['returns_pers'].plot(label='sber')
df2['returns_pers'].plot(label='sberp')
plt.legend()
plt.show()



Para una mejor comprensión, mostraremos la volatilidad en otro gráfico: un histograma

df['returns_pers'].hist(bins=100,label='sber',alpha=0.5)
df2['returns_pers'].hist(bins=100,label='sberp',alpha=0.5)
plt.legend()
plt.show()



Para llegar a una conclusión más rápida, puede simplificar el cronograma (haremos que la tabla sea menos detallada y menos transparente):

df['returns_pers'].hist(bins=10,label='sber',alpha=0.9)
df2['returns_pers'].hist(bins=10,label='sberp',alpha=0.9)
plt.legend()
plt.show()



Análisis de ingresos acumulados


Ahora derivamos el cambio porcentual en el valor de las acciones.

Para hacer esto, ingrese la columna con el ingreso acumulado.

df['Cumulative Return'] = (1+ df['returns']).cumprod()
df2['Cumulative Return'] = (1+ df2['returns']).cumprod()
print(df)
print(df2)

df['Cumulative Return'].plot(label='sber')
df2['Cumulative Return'].plot(label='sberp')
plt.legend()
plt.show()




En los gráficos, podemos ver los intervalos de tiempo cuando una de las acciones se subestima o se revalúa en relación con la otra. En las circunstancias actuales (ceteris paribus, tenga en cuenta) esto nos ayudará a elegir una acción para promediar cuando caiga la capitalización de Sberbank.

All Articles