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 preciodf['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 Yy el tamaño del lienzodf['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 matricialnos 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 necesariofrom 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 histogramadf['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.