рекомендации

суббота, 20 ноября 2021 г.

Экспонента Херста в анализе фондового и криптовалютного рынка с помощью Python

Вступление

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



Основные типы стратегий

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

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

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

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

Показатель Херста

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

Основные выводы из результатов

Мы можем сделать следующие заключения из приведенных выше результатов:

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

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

Комментариев нет:

Отправить комментарий