Вступление
Сразу переходя к делу, показатель Херста - это быстрый способ выяснить, является ли рассматриваемый временной ряд случайным блужданием, возвратом к среднему или трендом. В мире финансов многие трейдеры вырабатывают стратегии, основанные на импульсах и стратегиях возврата к среднему. Я кратко расскажу о них ниже:
Основные типы стратегий
Стратегии, основанные на импульсах - это стратегии, в которых инвесторы пытаются использовать непрерывные тенденции рынка. Например, в последнем квартале у конкретной компании или криптовалюты дела шли хорошо, и цена выросла. В этой ситуации инвестор может либо предсказать, что цена будет продолжать расти и, следовательно, войти в длинную позицию, либо предсказать, что цена снизится, и, следовательно, войти в короткую позицию. Что ж, решения не случайны, и их можно принимать осторожно, основываясь на ряде показателей.
Возврат к среднему - это стратегия, в которой предполагается, что различные свойства, такие как доходность акций и волатильность, будут со временем увеличивать их долгосрочную прибыль. Такой временной ряд также известен как процесс Орнштейна-Уленбека. В таких случаях вы можете зарабатывать деньги, исходя из предположения, что после некоторого экстремального события, которое может быть как положительным, так и отрицательным, цена акций будет следовать долгосрочной модели.
Мы можем очень легко идентифицировать эти два типа паттернов на конкретном графике, который отображает движение цены во времени. Так что, если бы кто-то построил график для всех акций или криптовалют, а затем вручную просматривал бы их и решал, какой график выглядит хорошо, это практически очень сложно. Вот почему мы будем использовать определенный параметр, чтобы определить, можем ли мы найти паттерн в данных, а затем дать результат в виде значения, которое намного проще проанализировать с помощью кода, чем график.
Решение, предлагаемое в этой статье, заключается в использовании показателя Херста, если данный временной ряд, который может относиться к акциям, криптовалюте или любому временному ряду в целом, может быть возвратом к среднему значению, трендом или просто случайным блужданием во времени.
Показатель Херста
Показатель Херста, также обозначаемый буквой «H», является мерой долговременной памяти временного ряда, где мы измеряем величину, на которую данный временной ряд отклоняется от случайного блуждания. Скалярное значение показывает относительную тенденцию временного ряда к кластеризации в определенном направлении (тенденция как в положительном, так и в отрицательном направлении) или сильную регрессию к среднему (модель возврата к среднему).
Различные значения показателя Херста всегда находятся в диапазоне от 0 до 1, и на основе значения H мы можем классифицировать данный временной ряд следующим образом:
H < 0,5 - ряд с возвратом к среднему (анти-персистентный). Более близкое значение к 0 означает, что существует сильная модель процесса возврата к среднему. В практических ситуациях это означает, что за большим значением будет следовать более низкое значение, и наоборот.
H = 0,5 - геометрическое случайное блуждание. Это означает, что он может идти в любом направлении, и нет возможности сделать четкий вывод из данных параметров.
H > 0,5 - трендовый (постоянный) ряд. Значение, более близкое к 1, означает, что тренд сильный и тренд продолжится. Как правило, это означает, что за более высоким значением будет более высокое значение.
В этой статье мы покажем одну из реализаций, основанных на оценке диффузионного поведения на основе дисперсии логарифмических цен.
Для начала определим x как логарифм цен акций "S".
Дисперсия произвольного запаздывания может быть обозначена как «τ» и может быть выражена как:
Если данный временной ряд следует за геометрическим броуновским движением (GBM, случайное блуждание), тогда дисперсия будет линейно следовать за запаздыванием «τ».
Это может быть не всегда так. Когда существует автокорреляция, есть отклонения от случайного блуждания, и запаздывание дисперсии не пропорционально самому запаздыванию, но здесь играет роль аномальный показатель степени. Новая формула выглядит так:
Где "H" обозначает показатель Херста.
Примечание. Другой метод нахождения экспоненты Херста использует анализ измененного диапазона (R/S). Было доказано, что использование этого метода может иногда приводить к лучшим результатам, но одним из недостатков этого метода является то, что он очень чувствителен к различным краткосрочным зависимостям.
Кодирование на Python
Для начала мы сначала импортируем некоторые библиотеки в python, и вместо того, чтобы полностью полагаться на предопределенную библиотеку, мы создадим функцию, которая вычисляет показатель Херста.
Сначала вам нужно будет загрузить необходимые библиотеки, которые мы собираемся использовать, если у вас их еще нет в вашей среде, и мы будем использовать реальные данные об акциях Google за последние 10 лет, и мы загрузим их с yfinance.
import yfinance as yf import numpy as np import pandas as pd
spy_df = yf.download("GOOGL", start="2010-01-01", end="2020-12-31", progress=False) spy_df["Adj Close"].plot(title="Google");
Вывод:
Мы также сгенерируем некоторые искусственные данные, чтобы показать вам примеры всех трех случаев и показать, насколько точно мы можем определить показатель Херста. Это будет показано в следующем фрагменте кода.
sample_size = 1000 scalar = 100 np.random.seed(123) df = pd.DataFrame(data={"mean_rev": np.log(np.random.randn(sample_size) + scalar), "gbm": np.log(np.cumsum(np.random.randn(sample_size)) + scalar), "trending": np.log(np.cumsum(np.random.randn(sample_size) + 1) + scalar)}) df.plot(title="Generated time series")
Вывод:
Здесь вы можете ясно увидеть закономерности, которые мы ожидали увидеть, а затем мы перейдем к кодированию функции, которая будет вычислять показатель Херста в нашем коде. Чтобы вычислить показатель Херста, нам сначала нужно вычислить стандартное отклонение разностей между рядом и его версиями с запаздыванием. Для возможного диапазона запаздывания мы будем оценивать показатель Херста как наклон логарифмического графика числа запаздываний по сравнению с упомянутыми стандартными отклонениями.
def get_hurst_exponent(time_series, max_lag=20): """Returns the Hurst Exponent of the time series""" lags = range(2, max_lag) # variances of the lagged differences tau = [np.std(np.subtract(time_series[lag:], time_series[:-lag])) for lag in lags] # calculate the slope of the log plot -> the Hurst Exponent reg = np.polyfit(np.log(lags), np.log(tau), 1) return reg[0]
Общее количество необходимых лагов довольно произвольно, но значение по умолчанию 20 - хорошее начало. Было обнаружено, что для изменения значения запаздывания результат может быть более или менее точным. Мы начнем с анализа данных Google и обнаружим, что график имеет тренд с некоторыми исключениями. Общий тренд положительный. Мы рассчитаем значение Hurst с разными значениями лага и посмотрим, где все они окажутся.
for lag in [5, 10, 20, 100, 300, 500, 1000, 2000, 2700]: hurst_exp = get_hurst_exponent(spy_df["Adj Close"].values, lag) print(f"Hurst exponent with {lag} lags: {hurst_exp:.4f}")
Вывод:
Hurst exponent with 5 lags: 0.4790 Hurst exponent with 10 lags: 0.4723 Hurst exponent with 20 lags: 0.4767 Hurst exponent with 100 lags: 0.3821 Hurst exponent with 300 lags: 0.2861 Hurst exponent with 500 lags: 0.2642 Hurst exponent with 1000 lags: 0.2399 Hurst exponent with 2000 lags: 0.2402 Hurst exponent with 2700 lags: 0.2211
Как мы видим, с увеличением значения запаздывания возврат к среднему становится сильнее, поскольку значение уменьшается до 0.
Следует помнить, что эти значения рассчитываются за 10-летний период времени, и сужение его до определенного периода может дать разные результаты в зависимости от того, насколько короткие выбранные временные рамки. Об этом нужно помнить при использовании показателя Херста. Теперь, когда мы повторим это для искусственно созданного ряда, мы увидим, как будут работать данные функции.
for lag in [5, 10, 20, 100, 300, 500]: print(f"Hurst exponents with {lag} lags ----") for column in df.columns: print(f"{column}: {get_hurst_exponent(df[column].values, lag):.4f}")
Вывод:
Hurst exponents with 5 lags ---- mean_rev: -0.0189 gbm: 0.4450 trending: 0.7725 Hurst exponents with 10 lags ---- mean_rev: 0.0085 gbm: 0.4333 trending: 0.8368 Hurst exponents with 20 lags ---- mean_rev: 0.0064 gbm: 0.4539 trending: 0.8715 Hurst exponents with 100 lags ---- mean_rev: -0.0021 gbm: 0.5401 trending: 0.8442 Hurst exponents with 300 lags ---- mean_rev: 0.0002 gbm: 0.5691 trending: 0.7463 Hurst exponents with 500 lags ---- mean_rev: 0.0015 gbm: 0.4854 trending: 0.6662
Вывод, который мы можем сделать для ряда с возвратом к среднему, заключается в том, что он является наиболее последовательным по всем значениям запаздывания. Отрицательные значения могут быть связаны с некоторыми приближениями, но в идеале они не должны уходить намного ниже нуля. Для случайного блуждания мы можем ясно видеть, что значение колеблется около желаемого значения 0,5. Что касается последнего, но не менее важного, мы можем видеть, что трендовый ряд может быть правильно идентифицирован показателем Херста для большинства выбранных лагов, но по мере его увеличения значение показателя уменьшается до 0,5, и это будет указывать на случайное блуждание.
Наши результаты показали, что Google следует этой тенденции, что также видно из диаграммы, что цена колеблется вокруг своего среднего значения, и, следовательно, наш окончательный вывод из этого может заключаться в том, что результаты очень близки к нашим ожиданиям, но максимальное количество учитываемых нами лагов может изменить наш вывод. Данный анализ показывает, что ряд не может быть только трендовым или возвратом к среднему. Другой фактор здесь - смотрим ли мы на это в долгосрочной или краткосрочной перспективе (мы делаем это, глядя на различный диапазон лагов). Для больших таймфреймов мы получаем более точный результат, «возврат к среднему».
Основные выводы из результатов
Мы можем сделать следующие заключения из приведенных выше результатов:
Показатель Херста - это мера памяти в любом временном ряду, которая используется для классификации временных рядов как тренда, возврата к среднему или случайного блуждания.
Изменяя параметр запаздывания, мы можем получить разные результаты в зависимости от того, хотим ли мы посмотреть временной ряд на краткосрочной или долгосрочной основе. Результаты будут соответственно отличаться.
Комментариев нет:
Отправить комментарий