Экспонента Херста для торговых стратегий

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

Импульс временных рядов

Импульс временных рядов — это аномалия ценообразования активов, которая может быть использована в торговых стратегиях для получения сильной доходности с поправкой на риск. Он использует автокорреляцию во временных рядах цен на активы. Когда возврат актива в момент t зависит от возврата в предыдущий момент t-1, доходность автоматически коррелирует. В Time Series Momentum доходность положительно коррелирует, поскольку собственная прошлая доходность актива предсказывает его будущую доходность.

Средняя реверсия во временных рядах

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

Однако из-за нестационарного характера финансовых данных определить среднюю реверсию сложно. Сказав это, средне-возвратные ценовые ряды могут быть синтезированы путем объединения различных акций для создания коинтегрированного портфеля, который отображает свойство стационарности. Эта стационарность может быть определена с помощью статистических тестов, таких как расширенный тест Дики-Фуллера, тест Йохансена и т. Д. Мы сосредоточимся на тестировании средней реверсии путем вычисления экспоненты Херста, которая связана с фрактальной экспонентой ценового временного ряда.

Фракталы

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

Фракталы в суккулентах (спиральная филлотаксия)

Фрактальная размерность, которая измеряет шероховатость поверхности, имеет следующее соотношение:

Большие экспоненты Херста связаны с малыми фрактальными размерностями (более гладкие кривые).

По мере увеличения H кривая становится более гладкой, а фрактальная размерность уменьшается.

Экспонента Херста

Экспонента Херста (H) измеряет величину, на которую финансовый временной ряд отклоняется от случайного блуждания. Он измеряет долговременную память временного ряда, характеризуя его как средне-возвратный, трендовый или случайное блуждание.

Кроме того, если экспонента Херста имеет значение около 0, то это очень средний реверсирующий ряд, в то время как для H около 1 ряд сильно трендовый.

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

Для расчета экспоненты Херста мы используем дисперсию логарифмических ценовых рядов для оценки скорости диффузионного поведения (распределения цены актива). Для произвольного временного лага дисперсия задается следующим образом:

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

Где параметр H называется экспонентой Херста.

Теперь рассчитаем экспоненту Херста для ценового ряда Microsoft с помощью кода Python. Во-первых, мы получаем набор данных Microsoft от yahoo finance (adj_close, высокий, низкий и т. Д.) С 2016 года по сегодняшний день.

from numpy import cumsum, log, polyfit, sqrt, std, subtract
from numpy.random import randn
import numpy as np
import pandas as pd
import pandas_datareader as pdr
from statsmodels.tsa.stattools import adfuller
pd.core.common.is_list_like = pd.api.types.is_list_like
import matplotlib.pyplot as plt
from datetime import datetime
import time
%matplotlib inline

start, end = datetime(2016, 1, 1), time.strftime("%x")
MSFT = pdr.DataReader(['MSFT'], 'yahoo', start, end)

MSFT.columns = [col[0].lower().replace(' ', '_')
for col in MSFT.columns]

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

def hurst(ts):
lags = range(2, 100)
tau = [sqrt(std(subtract(ts[lag:], ts[:-lag]))) for lag in lags]
poly = polyfit(log(lags), log(tau), 1)
return poly[0]*2.0
plot(log(lags), log(tau)); show()
#Creating a Gometric Brownian Motion, Mean-Reverting and Trending Series
gbm = log(cumsum(randn(100000))+1000)
mr = log(randn(100000)+1000)
tr = log(cumsum(randn(100000)+1)+1000)

print("Hurst(GBM): %s" % hurst(gbm))
print("Hurst(MR): %s" % hurst(mr))
print("Hurst(TR): %s" % hurst(tr))

print("Hurst(MICROSOFT): %s" % hurst(MSFT['adj_close'].values))

Hurst(GBM): 0.502166429795021
Hurst(MR): -3.50079950836198e-05
Hurst(TR): 0.9570889078078032071
Hurst(MICROSOFT): 0.42024623756880564

Мы можем сделать вывод, что геометрическое броуновское движение обладает экспонентой Херста, которая составляет почти 0,5. Средний реверсивный ряд имеет H почти равный нулю, в то время как трендовый ряд имеет H, близкий к 1.

Также Microsoft приближается к 0,5, что показывает, что она близка к геометрическому случайному блужданию (для этого периода выборки).

Торговля с использованием Hurst Exponent

Во-первых, мы получаем данные USD/CHF, BTC и SPY от yfinance с 2010 года по сегодняшний день. Мы возьмем только цены закрытия и запустим swaplevel(), чтобы мы могли индексировать фрейм данных тикером.

import pandas as pd
import yfinance as yf

tickers = ['CHF=X', 'BTC-USD', 'SPY']
start = '2010-01-01'
end = '2022-10-30'
sym = yf.Tickers(tickers)
df = sym.history(start=start, end=end)
df.drop(['Stock Splits', 'Dividends', 'Volume', 'Open', 'High', 'Low'], axis=1, inplace=True)
df.columns = df.columns.swaplevel()

Затем мы запускаем каждый временной ряд через функцию hurst(), которая является модулем Python для анализа случайных блужданий и оценки экспоненты Херста (H).

vals = {c[0]: hurst(df[c].dropna().values) for c in df.columns}
def plotHurst(m, x, y, series, name):
fig, ax = plt.subplots(1, 2, figsize=(15, 6))
ax[0].plot(np.log10(x), m[0] * np.log10(x) + m[1])
ax[0].scatter(np.log10(x), np.log10(y), c=colors[1])
ax[0].set_title(f"{name} (H = {m[0]:.3f})")
ax[0].set_xlabel(r"log($\tau$)")
ax[0].set_ylabel(r"log($\sigma_\tau$)")

ax[1].plot(series)
ax[1].set_title(f"{name}")
ax[1].set_ylabel("Price ($)")
ax[1].set_xlabel("Date")

return fig, ax

for k, v in vals.items():
fig, ax = plotHurst(*v, df[k], k)
plt.show()

Мы видим, что кросс-валютные пары USD/CHF являются средней реверсивной сделкой. Кроме того, более короткие таймфреймы немного отклоняются от более длинных таймфреймов. Терминальная структура реализованной волатильности (синие точки) находится ниже красной линии на кратчайших временных горизонтах.

Анализ SPY с помощью Херста

Здесь мы рассмотрим ценовую историю SPY ETF и влияние различного диапазона лагов.

from numpy import cumsum, log, polyfit, sqrt, std, subtract
import seaborn as sns
sns.set();

spy_close = spy[['adj_close']].copy()
lag1, lag2 = 2, 20
lags = range(lag1, lag2)
tau = [sqrt(std(subtract(spy_close[lag:], spy_close[:-lag]))) for lag in lags]
m = polyfit(log(lags), log(tau), 1)
hurst = m[0]*2
print( 'hurst = ',hurst[0])

hurst = 0.46693455079870505

Для значений лагов 5 и 50 мы получаем оценку Херста 0,467, что указывает на то, что наш ряд является средним возвратом. Однако, если мы изменим значения лага на 400 и 500, мы получим оценку Херста 0,559, что указывает на то, что наш ряд находится в тренде (импульс).

from numpy import cumsum, log, polyfit, sqrt, std, subtract
import seaborn as sns
sns.set();
spy_close = spy[['adj_close']].copy()
lag1, lag2 = 400, 500
lags = range(lag1, lag2)
tau = [sqrt(std(subtract(spy_close[lag:], spy_close[:-lag]))) for lag in lags]
m = polyfit(log(lags), log(tau), 1)
hurst = m[0]*2
print( 'hurst = ',hurst[0])

hurst = 0.5589673080261978

Таким образом, мы делаем вывод, что выбор лагов влияет на значение экспоненты Херста. Это означает, что показатель Херста зависит от того, измеряется ли он в краткосрочной или долгосрочной перспективе.

Кроме того, рассматривая все временные ряды, мы замечаем, что SPY возвращается к среднему значению для более коротких лагов. По мере увеличения используемых лагов H увеличивается. Если увеличить лаги до диапазона 400–500, H указывает на трендовый временной ряд. Также для умеренных значений задержки H имеет тенденцию приближаться к 0,5, подразумевая, что SPY также является случайным блужданием в некоторых временных масштабах.

Заключение

Из нашего анализа мы можем заключить, что значение экспоненты Херста точно указывает, если финансовый временной ряд имеет память о прошлых событиях. В зависимости от временной шкалы, эта память может быть как средней, так и трендовой одновременно. Тот факт, что ряд не всегда может быть случайным блужданием (значение Херста не равно 0,5), указывает на то, что гипотеза эффективного рынка (рынки совершенно непредсказуемы) обесценивается.

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

Экспонента Херста в количественных финансах

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

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

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

Экспонента Херста может быть рассчитана с использованием различных методов, включая метод анализа перемасштабированного диапазона, разработанный самим Херстом. После того, как экспонента Херста была рассчитана, ее можно использовать для прогнозирования будущего поведения временных рядов. Например, в случае цен на акции высокая экспонента Херста может быть использована, чтобы предположить, что акции, вероятно, будут продолжать расти (или уменьшаться) в будущем, в то время как низкий показатель Херста может быть использован, чтобы предположить, что акции, вероятно, будут колебаться случайным образом. Экспонента Херста обычно обозначается буквой H и может принимать значения от 0 до 1. Значение H больше 0,5 указывает на то, что временной ряд демонстрирует долгосрочные тенденции, в то время как значение H меньше или равно 0,5 указывает на то, что временной ряд колеблется случайным образом.

Одним из способов вычисления экспоненты Херста является метод анализа перемасштабированного диапазона. Этот метод включает в себя вычисление кумулятивной суммы временных рядов, обозначаемых S(t), и диапазона кумулятивной суммы, обозначаемой R(n). Затем экспонента Херста может быть вычислена следующим образом:

H = R(n) / S(n)

где n — длина временных рядов.

Давайте углубимся в практическое использование Python:

Импорт необходимых библиотек для скрипта

Библиотека используется для численных вычислений, библиотека используется для обработки данных, библиотека используется для извлечения биржевых данных из Yahoo Finance, а библиотека используется для построения графиков.numpypandasyfinancematplotlib

import numpy as np
import pandas as pd
import yfinance as yf
import matplotlib.pyplot as plt

Затем определяет функцию, которая принимает биржевой тикер в качестве входных данных и возвращает экспоненту Херста для этой акции. Сначала функция использует библиотеку для извлечения исторических данных для акций из Yahoo Finance.calculate_hurst_exponentyfinance

def calculate_hurst_exponent(stock_ticker):
# Get the stock data from Yahoo Finance
stock = yf.Ticker(stock_ticker)
data = stock.history(period="max")

Затем извлекает цены закрытия акций из данных.

    # Extract the closing prices
close_prices = data["Close"].values

Эта строка вычисляет логарифмические возвраты цен закрытия, используя формулу, указанную ранее.

    # Calculate the log returns of the closing prices
log_returns = np.log(close_prices[1:] / close_prices[:-1])

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

    # Initialize the range of scales to consider
scales = range(10, len(log_returns) + 1, 10)

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

    # Initialize an empty list to store the Hurst exponents
hurst_exponents = []

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

    # Calculate the Hurst exponent for each scale
for scale in scales:
# Calculate the cumulative sum of the log returns
cumulative_sum = np.cumsum(log_returns[:scale])

# Calculate the range of the cumulative sum
R = np.max(cumulative_sum) - np.min(cumulative_sum)

# Calculate the standard deviation of the log returns
std = np.std(log_returns[:scale])

# Calculate the Hurst exponent for this scale
H = R / (std * scale ** 0.5)

# Add the Hurst exponent to the list
hurst_exponents.append(H)

Этот код вычисляет среднюю экспоненту Херста по всем масштабам, принимая среднее из экспонент Херста в списке. Затем он возвращает среднюю экспоненту Херста.

    # Calculate the mean Hurst exponent over all scales
hurst_exponent = np.mean(hurst_exponents)

return hurst_exponent
# Calculate the Hurst exponents for two stocks
stock_1_hurst_exponent = calculate_hurst_exponent("AAPL")
stock_2_hurst_exponent = calculate_hurst_exponent("GOOG")

print("Stock 1 Hurst Exponent:", stock_1_hurst_exponent)
print("Stock 2 Hurst Exponent:", stock_2_hurst_exponent)

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

# Compare the Hurst exponents of the two stocks
if stock_1_hurst_exponent > stock_2_hurst_exponent:
print("Stock 1 is more likely to exhibit long-term trends than Stock 2.")
elif stock_1_hurst_exponent < stock_2_hurst_exponent:
print("Stock 2 is more likely to exhibit long-term trends than Stock 1.")
else:
print("Stock 1 and Stock 2 are equally likely to exhibit long-term trends.")

# Plot the trends of the two stocks side by side
fig, ax = plt.subplots(1, 2)

# Plot the trend for Stock 1
ax[0].plot(yf.Ticker("AAPL").history(period="max")["Close"].values)
ax[0].set_title("Trend in Stock 1")
ax[0].set_xlabel("Time")
ax[0].set_ylabel("Price")

# Plot the trend for Stock 2
ax[1].plot(yf.Ticker("GOOG").history(period="max")["Close"].values)
ax[1].set_title("Trend in Stock 2")
ax[1].set_xlabel("Time")
ax[1].set_ylabel("Price")

plt.show()

Сток 1 Херст Экспонент: 1.786794575255644

Сток 2 Экспонента Херста: 2.616319144316089

Акция 2 с большей вероятностью будет демонстрировать долгосрочные тенденции, чем Акция 1.

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

Источник

Источник