Aleks
Aleks личный блог
05 апреля 2020, 12:51

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

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

Сначала немного теории:

О линейной регрессии

Линейная регрессия используется в качестве прогнозирующей модели, когда предполагается линейная зависимость между зависимой переменной (переменная, которую мы пытаемся предсказать) и независимой переменной (переменная и/или переменные, используемые для предсказания).

В самом простой случае при рассмотрении используется одна переменная на основании которой мы пытаемся предсказать другую. Формула в этом случае имеет следующий вид:

Y = C + M*X

  • Y = зависимая переменная (результат / прогноз / оценка)
  • C = Константа (Y-Intercept)
  • M = Наклон линии регрессии (угловой коэффициент или градиент оценённой линии; она представляет собой величину, на которую Y увеличивается в среднем, если мы увеличиваем X на одну единицу)
  • X = независимая переменная (предиктор, используемый в прогнозе Y)

В действительности так же может существовать связь между зависимой переменной и несколькими независимыми переменными. Для этих типов моделей (при условии линейности) мы можем использовать множественную линейную регрессию следующего вида:

Y = C + M1X1 + M2X2 + …

Бета — коэффициент

Про данный коэффициент написано уже много, для примера на этой странице

Коротко, если не вдаваться в подробности, то можно его охарактеризовать следующим образом:

Акции c бета-коэффициентом:

  • ноль указывает на отсутствие корреляции между акцией и индексом
  • единица указывает на то, что акция имеет ту же волатильность, что и индекс
  • больше одного — указывает на большую доходность (а следовательно и риски) акции, чем индекс
  • менее единицы — менее волатильная акция, чем индекс

Другими словами, если акция увеличится на 14%, в то время как рынок вырос всего на 10%, то бета-коэффициент акции составит 1,4. Как правило на рынках с более высоким бета-коэффициентом можно предположить лучшие условия для вознаграждения (а следовательно и для риска).

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

Практика

Следующий код Python включает в себя пример линейной регрессии, где входной переменной является доходность по Индексу МосБиржи, а оцениваемая переменная — доходность по акциям Аэрофлот.

Для того, чтобы отсутствовала необходимость вспоминать как загружать данные и приводить данные к форме, необходимой для расчета — код приводиться с момента загрузки данных и до получения результатов. Вот полный синтаксис для выполнения линейной регрессии в Python с использованием statsmodels:

#Загружаем библиотеки
import pandas as pd
import yfinance as yf
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm

#Загружаю данные
ticker = ['AFLT.ME','IMOEX.ME']
stock = yf.download(ticker)

# Выделение скорректированой цены закрытия
all_adj_close = stock[['Adj Close']]

# Вычисление доходности 
all_returns = np.log(all_adj_close / all_adj_close.shift(1))

# Выделение доходности по акциям  
aflt_returns = all_returns['Adj Close'][['AFLT.ME']].fillna(0)

# Выделение доходности по индексу МосБиржи 
moex_returns = all_returns['Adj Close'][['IMOEX.ME']].fillna(0)


# Создание нового DataFrame

return_data = pd.concat([aflt_returns, moex_returns], axis=1)[1:]
return_data.columns = ['AFLT.ME', 'IMOEX.ME']


# Добавляем столбец единиц и определяем X и y
X = sm.add_constant(return_data['IMOEX.ME'])
y = return_data['AFLT.ME']


# Создание модели
model_moex = sm.OLS(y,X).fit()

# Вывод результатов
print(model_moex.summary())
Общий финансовый анализ на Python (Часть 3)

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

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

Тот же анализ для акции FB и индекса SP500. Здесь вычисление проводится через месячную доходность для примера как в оригинале.

sp_500 = yf.download('^GSPC')
fb = yf.download('FB')

# Пересчет в месячную доходность
fb = fb.resample('BM').apply(lambda x: x[-1])
sp_500 = sp_500.resample('BM').apply(lambda x: x[-1])

monthly_prices = pd.concat([fb['Close'], sp_500['Close']], axis=1)
monthly_prices.columns = ['FB', '^GSPC']

monthly_returns = monthly_prices.pct_change(1)
clean_monthly_returns = monthly_returns.dropna(axis=0)  

X = clean_monthly_returns['^GSPC']
y = clean_monthly_returns['FB']

X1 = sm.add_constant(X)

model_fb_sp_500 = sm.OLS(y, X1)

results_fb_sp_500 = model_fb_sp_500.fit()
print(results_fb_sp_500.summary())
Общий финансовый анализ на Python (Часть 3)
Общий финансовый анализ на Python (Часть 3)

В этом случае все совпало и подтвердило возможность использование statsmodels для определения коэффициента бета.

Ну и в качестве бонуса — если Вы хотите получить только бета — коэффициент и остальную статистику вы хотите оставить в стороне, то предлагается еще один код для его расчета:

from scipy import stats
slope, intercept, r_value, p_value, std_err = stats.linregress(X, y)

print(slope)

1.0568997978702754

Правда это не означает, что всю остальные получаемые значения надо игнорировать, но для их понимания понадобятся знания статистики. Приведу небольшую выдержку из получаемых значений:

  • R-squared, который является коэффициентом детерминации и принимает значения от 0 до 1. Чем ближе значение коэффициента к 1, тем сильнее зависимость;
  • Adj. R-squared — скорректированный R-squared на основании числа наблюдений и числа степеней свободы;
  • std err — стандартная ошибка оценки коэффициента;
  • P>|t| — р-значение Величина менее 0,05 считается статистически значимой;
  • 0.025 и 0.975 — нижнее и верхнее значения доверительного интервала.
  • и т.д.

На этом пока что все. Конечно, представляет интерес поискать зависимость между различными величинами для того, чтобы через одну предсказать другую и получить профит. В одном из иностранных источников встретилось предсказание индекса через процентную ставку и уровень безработицы. Но если изменение процентной ставки в России можно взять с сайта Центробанка, то другие пока продолжаю искать. К сожалению, на сайте Росстата не удалось найти актуальные. Это заключительная публикация в рамках статей общего финансового анализа.

17 Комментариев
  • Kapeks
    05 апреля 2020, 13:19
    Стат анализ лучше проводить в спец.пакетах, а не на общем языке программирования.
      • Kapeks
        05 апреля 2020, 16:09
        Zmey56, связи нет. исследования отдельно, мл отдельно. но мне в общем пофиг. твоё время и тебе решать как его просирать. как и всем нам.

    • Евгений
      05 апреля 2020, 15:42
      Kapeks, Питон хоть и является универсальным языком, но его развитие и многообразие фреймворков делает его таким же инструментом анализа, как и специализированные пакеты, которые тоже нужно осваивать.
  • Vanger
    05 апреля 2020, 15:48
    Почему связь именно линейная рассматривается? Может быть, там на самом деле тангенс?
      • Vanger
        05 апреля 2020, 17:55
        Zmey56, ну в его определении, конечно, не так, ибо что сделаешь с определением. Вопрос более глобальный, что почему вот именно линейные модели рассматриваются? Чем тангенсная модель хуле линейной? Да и бету в принципе можно переопределить через тот же тангенс.
      • badpidgin
        05 апреля 2020, 19:37
        Zmey56, как-то так :)
  • Goreloff
    05 апреля 2020, 16:00
    Ничего не понял. Почему бы готового робота зарабатывающего не выложить?
      • Емельянов Иван
        01 мая 2020, 23:04
        Zmey56, а на чем вы роботов писали? Тоже на pythton? И если да, то как осуществляли сделки, через DDE? Очень интересна данная тематика:)
  • Jkrsss
    05 апреля 2020, 18:02
    Все это линеаризация. :) Да, много алгоритмов эффективных было написано для хедж фонда. Нужная вещь для заказчика — роботов много можно наклепать с меньшей корреляцией к аналогичным.
  • Vladimir Diaditchev
    05 апреля 2020, 18:19
    Вычислить Бету и провести статистический анализ легко на языке R. Данные по рынку РФ получаются из Quik. Данные по российскому и американскому рынку можно получить с сайта Финам, и не только. Например, Бета за последние 90 дней:
    LKOH  1.5567436
    
     
    SBER  1.0817576
    
       Совсем недавно у Сбербанка бета была выше, чем у Лукойла.

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

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