Блог им. Zmey56

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

    • 05 апреля 2020, 12:51
    • |
    • Aleks
  • Еще

После всех вычислений, приведенных в этой и этой публикациях, можно углубиться в статистический анализ и рассмотреть метод наименьших квадратов. Для этой цели используется библиотека 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 — нижнее и верхнее значения доверительного интервала.
  • и т.д.

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

7.4К | ★33
17 комментариев
Стат анализ лучше проводить в спец.пакетах, а не на общем языке программирования.
avatar
Kapeks, дальше стоит вопрос ML, по этому вряд ли...  
avatar
Zmey56, связи нет. исследования отдельно, мл отдельно. но мне в общем пофиг. твоё время и тебе решать как его просирать. как и всем нам.

avatar
Kapeks, Питон хоть и является универсальным языком, но его развитие и многообразие фреймворков делает его таким же инструментом анализа, как и специализированные пакеты, которые тоже нужно осваивать.
avatar
Почему связь именно линейная рассматривается? Может быть, там на самом деле тангенс?
avatar
Vanger, а как по другому вычислить бета коэффициент?
avatar
Zmey56, ну в его определении, конечно, не так, ибо что сделаешь с определением. Вопрос более глобальный, что почему вот именно линейные модели рассматриваются? Чем тангенсная модель хуле линейной? Да и бету в принципе можно переопределить через тот же тангенс.
avatar
Vanger, понял вопрос. То, о чем говорите Вы — это сложнее и возможно дальше я напишу про это посты. То, что написано в этом посте — это только начало и как мне кажется наиболее простое для понимания всех. Конечно надо рассматривать несколько моделей, выбирать из них те, которые дают наименьшую ошибку и потом использовать ее для предсказания, если объяснить простым языком.
avatar
Zmey56, как-то так :)
avatar
badpidgin, хитро ;-)
avatar
Ничего не понял. Почему бы готового робота зарабатывающего не выложить?
avatar
Goreloff, я наверное многих сейчас расстрою и многие перестанут читать мои посты — я не пишу роботов уже давно, хотя знаю как это делать. Я бы себя отнес к инвесторам и python я использую для анализа. Просто мне нравиться писать самому, а не использовать черные ящики.
avatar
Zmey56, а на чем вы роботов писали? Тоже на pythton? И если да, то как осуществляли сделки, через DDE? Очень интересна данная тематика:)
Емельянов Иван, нет, MQL, lua. Но коннекторы часто встречал для python и java. Но если Вас интересуют сделки и тем более высокочастотные, то язык python вряд ли будет удобен из-за скорости.
avatar
Zmey56, Спасибо за ответ) 
Все это линеаризация. :) Да, много алгоритмов эффективных было написано для хедж фонда. Нужная вещь для заказчика — роботов много можно наклепать с меньшей корреляцией к аналогичным.
avatar
Вычислить Бету и провести статистический анализ легко на языке R. Данные по рынку РФ получаются из Quik. Данные по российскому и американскому рынку можно получить с сайта Финам, и не только. Например, Бета за последние 90 дней:
LKOH  1.5567436
 
SBER  1.0817576
   Совсем недавно у Сбербанка бета была выше, чем у Лукойла.
avatar

Читайте на SMART-LAB:
Фото
✔️ Рыночное положение: всё с̶л̶о̶ж̶н̶о̶ надежно
Вчера мы получили статус официального администратора финансовых индикаторов. После внесения в соответствующий реестр Московская биржа стала первой...
Фото
Портфель облигаций с ежемесячной выплатой. Январь 2026
С увеличением капитала должна расти не только цифра на счёте, но и качество жизни. Решить эту задачу поможет портфель, который ежемесячно...
Фото
Станет ли 2026 год успешным для металлургов?
Российские металлурги завершают год относительно неплохо на фоне прочих отраслей. Несмотря на санкционное давление и усложнение логистики...
Фото
Какая доходность среди облигаций с наивысшим рейтингом надежности и сроком погашения от 3 лет?

теги блога Aleks

....все тэги



UPDONW
Новый дизайн