Я реализовал на Python алгоритм масштабирования диапазона для вычисления показателя Херста следующим образом:
Код: Выделить всё
import numpy as np
def hurst(data):
n = len(data)
mu = np.mean(data)
y = data - mu
z = np.array([y[:i].sum() for i in range(1, n)])
r = np.array([z[:i].max() - z[:i].min() for i in range(2, n)])
s = np.array([np.sqrt(np.mean( (data[: i] - mu) ** 2) ) for i in range(2,n)])
log_rs = np.log(r/s)
log_time = np.log(range(2,n))
H, C = np.polyfit(log_time, log_rs, 1)
return H, C, log_time, log_rs
Где log_time и log_rs — логарифм временной последовательности и r/s соответственно, а H и C — это коэффициенты линии, которые лучше всего соответствуют разбросанному графику зависимости log_rs от log_time. Мне это кажется нормальным, но когда я вычисляю H для дробного движения Браунинана с заданным показателем Херста, я ожидаю, что приведенный выше код вернет H, достаточно близкое к нему, но он всегда возвращает значения около 0,7-0,85, независимо от заданного показателя Херста.
Моя реализация следующая
Код: Выделить всё
from hurst import random_walk
length = 10000
true_H = 0.3
fbm = random_walk(length, proba=true_H)
H_fbm, C_fbm, log_time_fbm, log_fbm = hurst(fbm)
Как уже было сказано, вместо того, чтобы H_fbm был близок к true_H, я всегда получаю H_fbm в диапазоне 0,7-0,85, поэтому должно быть Что-то не так. Есть подсказки?
Подробнее здесь:
https://stackoverflow.com/questions/792 ... -range-r-s