Расчет показателя Херста (Hurst Exponent) для BTC/USDT на Python

Расчет показателя Херста (Hurst Exponent) для BTC/USDT на Python Анализ данных и Бэктесты
Пошаговое руководство по расчету показателя Херста (Hurst Exponent) для временного ряда BTC/USDT на Python. Научитесь определять трендовость и флэт.
Суть: Показатель Херста (Hurst Exponent, H) позволяет математически определить характер временного ряда BTC/USDT: H < 0.5 указывает на склонность к возврату к среднему (mean-reverting), H > 0.5 — на наличие тренда (персистентность), а H = 0.5 — на случайное блуждание. В статье представлен готовый Python-скрипт для загрузки данных с Binance API и расчета этого коэффициента.

Исходный код

Ниже представлен оптимизированный скрипт на Python, который загружает исторические часовые свечи BTC/USDT напрямую через публичный API Binance и рассчитывает показатель Херста методом анализа дисперсии приращений (Variance of Differences).

Если вы работаете с большими объемами тиковых данных BTC/USDT, рекомендуем изучить руководство по конвертации HDF5 в Parquet с партиционированием по датам в Pandas для оптимизации хранения и скорости чтения.

import numpy as np
import pandas as pd
import requests

def fetch_binance_klines(symbol='BTCUSDT', interval='1h', limit=1000):
    url = 'https://api.binance.com/api/v3/klines'
    params = {
        'symbol': symbol,
        'interval': interval,
        'limit': limit
    }
    response = requests.get(url, params=params)
    response.raise_for_status()
    data = response.json()
    
    df = pd.DataFrame(data, columns=[
        'open_time', 'open', 'high', 'low', 'close', 'volume',
        'close_time', 'quote_asset_volume', 'number_of_trades',
        'taker_buy_base_asset_volume', 'taker_buy_quote_asset_volume', 'ignore'
    ])
    df['close'] = df['close'].astype(float)
    df['close_time'] = pd.to_datetime(df['close_time'], unit='ms')
    return df.set_index('close_time')[['close']]

def calculate_hurst_exponent(price_series, max_lag=100):
    '''
    Рассчитывает показатель Херста на основе дисперсии разностей (lags).
    '''
    # Преобразуем цены в логарифмический масштаб
    log_prices = np.log(price_series)
    lags = range(2, max_lag)
    
    # Вычисляем стандартное отклонение разностей для каждого лага
    tau = []
    for lag in lags:
        diffs = log_prices[lag:] - log_prices[:-lag]
        tau.append(np.std(diffs))
    
    # Линейная регрессия в логарифмических координатах
    poly = np.polyfit(np.log(lags), np.log(tau), 1)
    
    # Угловой коэффициент (slope) и есть показатель Херста
    return poly[0]

if __name__ == '__main__':
    print('Загрузка данных BTC/USDT с Binance...')
    df = fetch_binance_klines(symbol='BTCUSDT', interval='1h', limit=1000)
    
    prices = df['close'].values
    hurst_val = calculate_hurst_exponent(prices, max_lag=100)
    
    print(f'Показатель Херста (H): {hurst_val:.4f}')
    if hurst_val < 0.45:
        print('Рынок флэтовый (Mean-Reverting). Рекомендуются стратегии возврата к среднему.')
    elif hurst_val > 0.55:
        print('Рынок трендовый (Persistent). Рекомендуются трендовые стратегии.')
    else:
        print('Рынок близок к случайному блужданию (Random Walk).')

Разбор параметров

  • price_series: Одномерный массив цен закрытия (желательно в формате numpy.ndarray). Внутри функции значения переводятся в логарифмический масштаб для стабилизации дисперсии.
  • max_lag: Максимальный временной лаг для расчета разностей. Оптимальное значение лежит в диапазоне от 50 до 200. Слишком маленький лаг даст неустойчивую оценку, слишком большой — приведет к нехватке данных.
  • polyfit: Функция из библиотеки numpy, выполняющая аппроксимацию методом наименьших квадратов. Наклон полученной прямой соответствует показателю Херста.

Как запустить

Для запуска скрипта вам понадобятся библиотеки pandas, numpy и requests. Установите их через терминал:

pip install pandas numpy requests

После этого сохраните код в файл hurst_calc.py и запустите его. Скрипт автоматически выгрузит последние 1000 часовых свечей BTC/USDT и выведет текущее значение показателя Херста с интерпретацией рыночной фазы.

Для построения полноценной торговой системы на основе персистентности вам также понадобится Расчет Information Ratio, Alpha и Beta к Bitcoin на Python для оценки эффективности стратегии.

При тестировании стратегий возврата к среднему (mean-reversion) или следования за трендом критически важна настройка комиссий и проскальзывания в Zipline-Reloaded для крипты, так как частые сделки могут быстро уничтожить ваше математическое ожидание прибыли.

Оцените статью
FinFluct