Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Здравствуйте, сегодня хотел бы рассказать про мой опыт анализа акций сбербанка. Порой они показывают немного разную динамику — мне стало интересно проанализировать движение их котировок.
В данном примере мы будем скачивать котировки с сайта Финама. Ссылка для скачивания обычного Сбербанка.
Для операций со столбцами буду использовать pandas, для визуализации matplotlib.
Импортируем:
Чтобы таблицы не сокращались, необходимо убрать ограничения:
(указываем разделитель, где находятся название столбцов, какой столбец будет индексом, включаем парсинг дат).
Также укажем сортировку:
Отобразим наши данные:
![](https://habrastorage.org/webt/0z/fc/0g/0zfc0gzzl1bmhso1ha5spqdln-g.png)
Добавляем столбец с изменением цены
Так можно выводить именно процент:
![](https://habrastorage.org/webt/8e/3i/jy/8e3ijy3856wtlg-v9ednlboff5e.png)
Делаем это точно таким же образом
![](https://habrastorage.org/webt/_n/ff/vl/_nffvlxgeufjuqitvumwwtpzidg.png)
Теперь отобразим котировки с их средними (MA 50):
![](https://habrastorage.org/webt/0v/7k/g1/0v7kg1mxdgub1dt2yfqmfp63i9e.png)
Можно отобразить и другие средние
![](https://habrastorage.org/webt/3q/ob/yj/3qobyjiwr1t73hjhr0xnencedrg.png)
Теперь выведем оборот по акциям:
Добавим также название оси У
и размер холста
![](https://habrastorage.org/webt/xg/ur/pv/xgurpv1dzsrwyq6panc8hoyeek4.png)
Теперь подробнее посмотрим на корреляцию. в этом нам поможет матричный график
Создадим новую таблицу с колонками по обеим акциям и зададим им названия
![](https://habrastorage.org/webt/cw/76/6v/cw766vok9fx_4zkgmsei9klufso.png)
Теперь импортируем нужный график
И выведем его:
Следует уточнить, что нам нужно добавить прозрачность (alpha=0,2), чтобы видеть наложение точек
![](https://habrastorage.org/webt/2z/ba/w4/2zbaw4rjvc56o59sbjzhvb2dro8.png)
Если точки “идут” по диагонали, наблюдается корреляция.
![](https://habrastorage.org/webt/rf/y8/pv/rfy8pveesdm9g-sn_3zvvrltzkk.png)
Для лучшего понимания Отобразим волатильность на другом графике — гистограмме
![](https://habrastorage.org/webt/gt/x-/ip/gtx-ipk30_xy9hodl1b_n08i2cu.png)
Чтобы сделать вывод быстрее, можно упростить график (сделаем график менее подробным и менее прозрачным):
![](https://habrastorage.org/webt/wp/o3/cs/wpo3csts8qtxewhgjejrmwhj2ua.png)
Теперь выведем изменение стоимости акций в процентах.
Для этого введем столбец с накопленным доходом.
![](https://habrastorage.org/webt/lt/6d/fl/lt6dflsphr-f-hljf2emhaqxa7i.png)
На графиках мы можем увидеть временные промежутки, когда одна из акций недооценена или переоценена относительно другой. В текущих обстоятельствах (при прочих равных, прошу заметить) нам это поможет выбрать акцию для усреднения при падении капитализации Сбербанка.
В данном примере мы будем скачивать котировки с сайта Финама. Ссылка для скачивания обычного Сбербанка.
Для операций со столбцами буду использовать pandas, для визуализации matplotlib.
Импортируем:
import pandas as pd
import matplotlib.pyplot as plt
Чтобы таблицы не сокращались, необходимо убрать ограничения:
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)
Читаем данные по акции
df = pd.read_csv("SBER_190101_200105.csv",sep=';', header=0, index_col='<DATE>', parse_dates=True)
(указываем разделитель, где находятся название столбцов, какой столбец будет индексом, включаем парсинг дат).
Также укажем сортировку:
df = df.sort_values(by='<DATE>')
Отобразим наши данные:
print(df)
![](https://habrastorage.org/webt/0z/fc/0g/0zfc0gzzl1bmhso1ha5spqdln-g.png)
Добавляем столбец с изменением цены
df['returns']=(df['<CLOSE>']/df['<CLOSE>'].shift(1))-1
Так можно выводить именно процент:
df['returns_pers']=((df['<CLOSE>']/df['<CLOSE>'].shift(1))-1)*100
![](https://habrastorage.org/webt/8e/3i/jy/8e3ijy3856wtlg-v9ednlboff5e.png)
Добавляем вторую акцию
Делаем это точно таким же образом
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)
Визуализируем котировки наших акций
df['<CLOSE>'].plot(label='sber')
df2['<CLOSE>'].plot(label='sberp')
plt.legend()
plt.show()
![](https://habrastorage.org/webt/_n/ff/vl/_nffvlxgeufjuqitvumwwtpzidg.png)
Теперь отобразим котировки с их средними (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()
![](https://habrastorage.org/webt/0v/7k/g1/0v7kg1mxdgub1dt2yfqmfp63i9e.png)
Можно отобразить и другие средние
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()
![](https://habrastorage.org/webt/3q/ob/yj/3qobyjiwr1t73hjhr0xnencedrg.png)
Теперь выведем оборот по акциям:
Добавим также название оси У
и размер холста
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()
![](https://habrastorage.org/webt/xg/ur/pv/xgurpv1dzsrwyq6panc8hoyeek4.png)
Анализ корреляций
Теперь подробнее посмотрим на корреляцию. в этом нам поможет матричный график
Создадим новую таблицу с колонками по обеим акциям и зададим им названия
all_sber = pd.concat([df['<OPEN>'],df2['<OPEN>']],axis=1)
all_sber.columns = ['sber_open','sberp_open']
print(all_sber)
![](https://habrastorage.org/webt/cw/76/6v/cw766vok9fx_4zkgmsei9klufso.png)
Теперь импортируем нужный график
from pandas.plotting import scatter_matrix
И выведем его:
scatter_matrix(all_sber,figsize=(8,8),alpha=0.2,hist_kwds={'bins':100});
plt.show()
Следует уточнить, что нам нужно добавить прозрачность (alpha=0,2), чтобы видеть наложение точек
![](https://habrastorage.org/webt/2z/ba/w4/2zbaw4rjvc56o59sbjzhvb2dro8.png)
Если точки “идут” по диагонали, наблюдается корреляция.
Оценка волатильности бумаг
df['returns_pers'].plot(label='sber')
df2['returns_pers'].plot(label='sberp')
plt.legend()
plt.show()
![](https://habrastorage.org/webt/rf/y8/pv/rfy8pveesdm9g-sn_3zvvrltzkk.png)
Для лучшего понимания Отобразим волатильность на другом графике — гистограмме
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()
![](https://habrastorage.org/webt/gt/x-/ip/gtx-ipk30_xy9hodl1b_n08i2cu.png)
Чтобы сделать вывод быстрее, можно упростить график (сделаем график менее подробным и менее прозрачным):
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()
![](https://habrastorage.org/webt/wp/o3/cs/wpo3csts8qtxewhgjejrmwhj2ua.png)
Анализ накопленного дохода
Теперь выведем изменение стоимости акций в процентах.
Для этого введем столбец с накопленным доходом.
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()
![](https://habrastorage.org/webt/lt/6d/fl/lt6dflsphr-f-hljf2emhaqxa7i.png)
На графиках мы можем увидеть временные промежутки, когда одна из акций недооценена или переоценена относительно другой. В текущих обстоятельствах (при прочих равных, прошу заметить) нам это поможет выбрать акцию для усреднения при падении капитализации Сбербанка.