Aleks
Aleks личный блог
09 марта 2020, 16:43

Общий финансовый анализ на Python (Часть 1)

В прошлой статье рассмотрено как можно получить информацию по финансовым инструментам. Дальше будет опубликовано несколько статей о том, что первоначально можно делать с полученными данными, как проводить анализ и составлять стратегию. Материалы составлены на основании публикаций в иностранных источниках и курсах на одной из онлайн платформ.

В этой статье будет рассмотрено, как рассчитывать доходность, волатильность и построить один из основных индикаторов.

import pandas as pd
import yfinance as yf
import numpy as np
import matplotlib.pyplot as plt

sber = yf.download('SBER.ME','2016-01-01')

Доходность

Данная величина представляет собой процентное изменение стоимости акции за один торговый день. Оно не учитывает дивиденды и комиссии. Его легко рассчитать используя функцию pct_change () из пакета Pandas.

Как правило используют лог доходность, так как она позволяет лучше понять и исследовать изменения с течением времени.

# Скорректированая цена закрытия`
daily_close = sber[['Adj Close']]

# Дневная доходность
daily_pct_change = daily_close.pct_change()

# Заменить NA значения на 0
daily_pct_change.fillna(0, inplace=True)

print(daily_pct_change.head())

# Дневная лог доходность
daily_log_returns = np.log(daily_close.pct_change()+1)

print(daily_log_returns.head())
Общий финансовый анализ на Python (Часть 1)
Чтобы из полученных данных узнать недельную и/или месячную доходность, используют функцию resample().
# Взять у `sber` значения за последний рабочий день месяца
monthly = sber.resample('BM').apply(lambda x: x[-1])

# Месячная доходность
print(monthly.pct_change().tail())

# Пересчитать `sber` по кварталам и взять среднее значение за квартал
quarter = sber.resample("4M").mean()

# Квартальную доходность
print(quarter.pct_change().tail())
Общий финансовый анализ на Python (Часть 1)

Функция pct_change () удобна для использования, но в свою очередь скрывает то, как получается значение. Схожее вычисление, которое поможет понять механизм, можно выполнить при помощи shift() из пакета из пакета Pandas. Дневная цена закрытия делится на прошлую (сдвинутую на один) цену и из полученного значения вычитается единица. Но есть один незначительный минус – первое значение в результате получается NA.

Расчет доходности основан на формуле

Общий финансовый анализ на Python (Часть 1)
Где, p – цена, t – момент времени и r – доходность.

Дальше строится диаграмма распределения доходности и рассчитывается основная статистика:

# Дневная доходность
daily_pct_change = daily_close / daily_close.shift(1) - 1

print(daily_pct_change.head())
Общий финансовый анализ на Python (Часть 1)
# Диаграмма `daily_pct_c`
daily_pct_change.hist(bins=50)

plt.show()

# Общая статистика
print(daily_pct_change.describe())
Общий финансовый анализ на Python (Часть 1)

Распределение выглядит очень симметрично и нормально распределённым вокруг значения 0,00. Для получения других значений статистики используется функция description (). В результате видно, что среднее значение немного больше нуля, а стандартное отклонение составляет практически 0,02.

Кумулятивная доходность

Кумулятивная дневная прибыль полезна для определения стоимости инвестиций через определенные промежуток времени. Ее можно рассчитать, как приводиться в коде ниже.

# Кумулютивная дневная доходность
cum_daily_return = (1 + daily_pct_change).cumprod()

print(cum_daily_return.tail())
Общий финансовый анализ на Python (Часть 1)
# Построение куммулютивной дневной доходности
cum_daily_return.plot(figsize=(12,8))

plt.show()
Общий финансовый анализ на Python (Часть 1)

Можно пересчитать доходность в месячном периоде:

# Месячная куммулютивная доходность
cum_monthly_return = cum_daily_return.resample("M").mean()

print(cum_monthly_return.tail())
Общий финансовый анализ на Python (Часть 1)

Знание того, как рассчитать доходность, является ценным при анализе акции. Но еще большую ценность оно представляет при сравнении с другими акциями.

Возьмем некоторые акции (выбор их совершенно случайный) и построим их диаграмму.

ticker = ['AFLT.ME','DSKY.ME','IRAO.ME','PIKK.ME', 'PLZL.ME','SBER.ME','ENRU.ME']

stock = yf.download(ticker,'2018-01-01')

# Дневная доходность в `daily_close_px`
daily_pct_change = stock['Adj Close'].pct_change()

# Распределение
daily_pct_change.hist(bins=50, sharex=True, figsize=(20,8))

plt.show()
Общий финансовый анализ на Python (Часть 1)

Еще один полезный график —матрица рассеяния. Ее можно легко построить при помощи функции scatter_matrix (), входящей в библиотеку pandas. В качестве аргументов используется daily_pct_change и устанавливается параметр Ядерной оценки плотности — Kernel Density Estimation. Кроме того, можно установить прозрачность с помощью параметра alpha и размер графика с помощью параметра figsize.

from pandas.plotting import scatter_matrix

# Матрица рассеивания `daily_pct_change`  
scatter_matrix(daily_pct_change, diagonal='kde', alpha=0.1,figsize=(20,20))

plt.show()
Общий финансовый анализ на Python (Часть 1)
На этом пока все. В следующей статье будет рассмотрено вычисление волатильности, средней и использование метода наименьших квадратов.

 

9 Комментариев
  • Двоечник
    09 марта 2020, 17:02
    Не сказать что понятно, но интересно… только не задавайте вопрос-а что именно не понятно? самый не любимый у двоечников вопрос…
      • Двоечник
        09 марта 2020, 17:21
        Zmey56, Это как заф.кафедрой универа, пойдёт рассказывать дошкольникам пр0 сложение… не, как-то не камильфо… когда смогу спросить что-нибудь дельное то тогда… сразу попрошусь в гости))

  • broker25
    22 марта 2020, 21:08
    а что за курсы? курсера? udemy?
  • alewmt
    22 марта 2020, 22:49
    Как правило используют лог доходность, так как она позволяет лучше понять и исследовать изменения с течением времени.

    было бы хорошо подкрепить это утвеждение каким-нибудь примером или ссылкой
  • Вельвет
    19 апреля 2020, 14:48
    Большое спасибо автору за данный материал.Прочитал его последние топики связанные с  стат.данными в Python, мне как начинающему в программировании очень было все полезно и ясно.Кстати, заметил где 
     Чтобы из полученных данных узнать недельную и/или месячную доходность, используют функцию resample().


    указана еще не наступившая дата, наверное здесь квартал пересчитует все же..
     Пишите больше такое на Smart-lab!!!


Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн