Бык и медведь: модель для любого настроения

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

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

Скрыто, что теперь?

Цепочка событий

Прежде чем погрузиться в HMM, мы должны сначала объяснить, что такое цепь Маркова. Не погружаясь в стохастическую матричную теорию и не принимая полный курс вероятности, цепь Маркова — это процесс, в котором некоторая система находится в состоянии (n) и имеет определенную вероятность либо остаться в этом состоянии, либо перейти в другое состояние (m). Это происходит до бесконечности, в марковском процессе может быть столько состояний, сколько вы можете себе представить. Вот граф узлов, который может помочь вам визуализировать вещи:

На этом графике у нас есть три состояния: A, B и C. Допустим, мы начинаем с А, есть 18% вероятности, что мы останемся в этом состоянии, затем есть 9% вероятности, что мы перейдем в состояние С, и 73% вероятности, что мы перейдем в состояние Б. Вы можете думать о каждом из этих состояний как о своем настроении в течение дня, или об определенной погоде, или, в нашем случае, о бычьих рынках, медвежьих рынках и обо всем, что между ними. Для более глубокого понимания вы можете посмотреть это видео:

Скрытый у всех на виду

До сих пор мы говорили о состояниях в марковском процессе, в которых мы четко знаем вероятности перехода. Но что, если я дам вам диаграмму, подобную показанной выше, с одной загвоздкой: вы не можете видеть все состояния, есть состояние, которое скрыто от вашего взгляда — хуже того — есть набор состояний, о которых вы ничего не знаете, все, что вы можете наблюдать, это свойства системы, вы не знаете, в каком состоянии она находится. Тогда у вас есть система, на которую влияет набор скрытых состояний, и все, что вы можете наблюдать, это набор видимых состояний. Именно это и есть скрытая марковская модель, модель системы, основанная на предположении, что она структурирована как марковская цепь со скрытыми состояниями. И снова мы получаем помощь в виде диаграммы:

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

Давайте начнём

Во-первых, давайте импортируем наши данные. Мы выбрали исторические данные о ценах на акции 6 за последние 11 лет:

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

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

  1. высокая и низкая волатильность
  2. значимая и пренебрежимо малая корреляция

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

Смена режима — это то, с чем мы все сталкивались, на самом деле, причина, по которой рынок демонстрирует такое поведение, почти полностью связана с человеческими поведенческими моделями, хотя и в более длительном временном масштабе. Просыпаешься утром, умываешься, чистишь зубы, все еще хочется снова лечь спать, потом пьешь кофе и БАМ! Вы внезапно превращаетесь в какого-то менее беспорядочного, но мотивированного человека, вы идете делать все, что должны делать, а затем вспоминаете, что вы зависимый от кофеина, БАМ!

Это именно то, что такое переключение режимов, режим состоит из правил, которые диктуют, как ведет себя определенная система, в случае с людьми вы просыпаетесь утром, вы чувствуете себя одним человеком, после кофе вы другой человек. Большинство людей предпочли бы поговорить с вашей версией после кофе, и на то есть веские причины. Как и вы в течение дня, рынки продолжают менять режимы, ведя себя как счастливое стадо овец в одни дни, как сумасшедшие с горящими волосами на других. Предсказать эти изменения режима очень сложно даже для лучших умов, которые когда-либо предлагало человечество. Однако это не невозможно, поскольку такие люди, как Майкл Берри, успешно предсказывали и использовали экстремальные события, такие как крах рынка жилья в 2007/2008 годах.

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

Обратите внимание, что доходность НЕ распределяется нормально, однако, как только мы допускаем возможность переключения режимов, мы можем сказать, что доходность может быть (не обязательно) условно нормально распределена. Проще говоря, возвраты не могут исходить из нормального распределения, но они могут исходить из набора нормальных распределений.

Удобно, что мы будем использовать библиотеку python hmmlearn, которая позволяет нам подогнать и смоделировать такой процесс:

import numpy as np
from hmmlearn import hmm
data = log_returns(m['ETEL'])
n_samples = 14 # Number of samples

model = hmm.GaussianHMM(n_components=2, covariance_type="diag")

model.fit(data.values.reshape(-1,1))
# Generate samples from the HMM
n_sims = 10
# Generate samples from the HMM
X, _ = model.sample(n_samples * n_sims)

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

Здесь мы видим, что каждый из режимов имеет два режима волатильности, режим высокой волатильности примерно в 3 раза более изменчив, чем режим низкой волатильности. Давайте также рассмотрим соответствующие средства для каждого режима:

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

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

В настоящее время мы проводим 10⁵ симуляций акций ETEL в течение следующих 25 дней (обратите внимание, что это гораздо более вычислительно интенсивно, чем моделирование с использованием i.i.d-модели, из-за причинно-следственной структуры модели). Чтобы получить более глубокое понимание того, как работает HMM, давайте посмотрим на скрытые состояния одной из симуляций:

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

Здесь мы видим мощь HMM, они моделируют поведение временных рядов в множестве рыночных режимов, каждая симуляция 10⁵ представляет собой сценарий переключения поведения рынка, где поведение переключения продиктовано матрицами переходов в пространстве скрытых состояний, что означает, что переключение не является полностью случайным, а несколько предсказуемым с определенной условной вероятностью. Теперь мы посмотрим на наблюдаемые состояния, создаваемые моделированием:

Опять же, мы встречаем самые вычислительно интенсивные спагетти, однако нас больше интересует окончательное распределение плотности цен:

Из этого распределения мы можем вывести ожидаемое значение цены, VaR и CVaR, всегда помните, что это всего лишь стохастическая модель, которая моделирует некоторые эффекты, на самом деле, мы можем сравнить вероятность этой модели с моделью i.i.d Стьюдента-t, которую мы разработали ранее, используя быстрое сравнение отношения правдоподобия:

Ранее предложенная модель i.i.d на самом деле лучше подходит, чем HMM с 10 режимами. Это всего лишь беглое сравнение, другая модель HMM, возможно, с другими определениями режимов и другим количеством режимов, может превзойти модель i.i.d., однако суть проблемы здесь не в этом. Давайте перейдем к моделированию серии акций, а пока перейдем к 10 режимам:

all_portfolio_data = log_returns(m)

stocks_model = hmm.GaussianHMM(n_components=10, covariance_type="full")
stocks_model.fit(all_portfolio_data)

Еще раз, мы можем сделать быстрое сравнение между моделью i.i.d из другой предыдущей статьи и этой:

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

Мы также можем кратко взглянуть на корреляционные матрицы для каждого режима:

states_covars = stocks_model.covars_
i = 0
for states in states_covars:
D = np.diag(states)**0.5
outer_v = np.outer(D, D)
corr = states/outer_v
plt.figure()
sns.heatmap(corr, xticklabels = all_portfolio_data.columns, yticklabels = all_portfolio_data.columns)
plt.title(f"Regime {i+1}")
i+= 1

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

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

Теперь мы переходим к одной из самых ресурсоемких операций, с которыми когда-либо сталкивался мой бедный ноутбук, моделированию методом Монте-Карло, мы моделируем наш портфель равного распределения в течение одного года, рассматривая сценарии 10⁵, а затем смотрим на окончательное распределение стоимости:

n_steps = 252
n_sims = 10000

time = pd.date_range(start = data.index[-1],
end = data.index[-1] + timedelta(days = n_steps - 1))

Z, _ = stocks_model.sample(n_steps*n_sims)

Z = Z.reshape(n_steps, n_sims, len(all_portfolio_data.columns))

weights = np.ones(len(all_portfolio_data.columns))/len(all_portfolio_data.columns)
initial_investment = 2800
portfolio_returns = np.dot(Z, weights)
portfolio_returns = pd.DataFrame(portfolio_returns, index = time)
portfolio_value = portfolio_returns.cumsum().apply(np.exp)
portfolio_value = portfolio_value.divide(portfolio_value.iloc[0]/initial_investment)

final_value = portfolio_value.iloc[-1]

Здесь мы можем увидеть функцию плотности вероятности стоимости нашего портфеля через 252 дня, учитывая, что акции портфеля ведут себя так, как диктует HMM. Теперь мы можем вычислить VaR и CVaR, а также сделать все виды статистических выводов по своему усмотрению:

alpha = 5
def VaR(value, alpha = 5):
return np.percentile(value, alpha)
ValueatRisk = VaR(final_value,alpha)

def CVaR(value, alpha = 5):
VaR = np.percentile(value, alpha)
return np.mean(value[value < VaR])

ConditionalValueatRisk = CVaR(final_value,alpha)
print(f'VaR: {ValueatRisk:.2f}, CVaR: {ConditionalValueatRisk:.2f}')

Что еще мы можем сделать?

В этой статье мы использовали HMM в качестве инструмента стохастического моделирования, чтобы смоделировать наш портфель во множестве различных сценариев, стремясь сделать наше моделирование максимально приближенным к реальности. Тем не менее, HMM также могут использоваться в качестве прогностических моделей, фактически они были одной из первых моделей статистического вывода, используемых при прогнозировании цен на акции единственной и неповторимой компанией Renaissance Technologies. Технически любая модель может быть использована для вывода здесь, даже i.i.d модели, однако их врожденная природа делает их почти такими же хорошими, как ничто, когда дело доходит до прогнозирования, они полезны только в симуляциях, где цель состоит в том, чтобы исследовать возможные сценарии будущего (Мы можем однажды проснуться и обнаружить, что все доходы, идущие вперед, внезапно решили быть независимыми, еще хуже, неидентично распределенные, что нам теперь делать?)

Где быки и медведи?

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

  1. Медвежий рынок — это период, превышающий месяц, в котором средняя доходность составляет менее -5%
  2. Бычий рынок — это период, превышающий месяц, в котором средняя доходность составляет более -5%

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

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

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

stationary_distribution = stocks_model.get_stationary_distribution()

number_of_days = len(m)

expected_duration_days = stationary_distribution*number_of_days

Теперь мы можем построить график средней доходности каждого режима в зависимости от его ожидаемой продолжительности:

Здесь мы видим, что есть только два режима со значительно положительной/отрицательной доходностью, оба из которых имеют ожидаемую продолжительность почти нулевую, поэтому на этот портфель, похоже, не влияют режимы Быка и Медведя (если такая вещь есть, как мы сейчас узнаем)

Теперь мы можем применить тот же анализ к EGX30:

Выбор 10 режимов, как мы делали ранее, а затем построение графика средней рыночной доходности по сравнению с ожидаемой продолжительностью:

Я думаю, что график говорит сам за себя: есть два режима выше отметки 5% и справа от месячной отметки, таким образом, есть два режима, которые удовлетворяют нашему определению бычьего рынка. Точно так же можно наблюдать и противоположную сторону, что приводит нас к выводу, что бычий и медвежий рынки действительно существуют, а не являются просто симптомами настойчивости нашего ума в существовании паттернов.

Однако здесь мы видим еще одну скрытую жемчужину HMM, скрытую у всех на виду. То есть бычий и медвежий рынки имеют ожидаемую продолжительность! Нам не нужно быть совершенно невежественными относительно того, когда продлятся эти размытые режимы, у нас есть шанс отличить регулярные периодические бычьи и медвежьи рынки от аномально длинных или коротких. К счастью, эти режимы находятся на меньшем конце оси ожидаемой продолжительности, поэтому рынок проводит больше времени ни в одном из режимов, а не конкретно на бычьем или медвежьем рынке.

Источник