Экспонента Hurst (H) является важным показателем, используемым в различных областях, таких как финансовый анализ, изучение сложных систем и прогнозирование. Она описывает степень автокорреляции временного ряда и может принимать значения от 0 до 1. Для расчета экспоненты Hurst часто используется метод линейной регрессии, основанный на рассмотрении изменяющихся временных масштабов.
Проблема, с которой столкнулся пользователь, заключалась в получении значений экспоненты Hurst, выходящих за пределы диапазона 0..1. В частности, значения часто были равны 1.9 или отрицательным числам, приближенным к нулю. После детального анализа кода и предложенных альтернативных ответов, можно прийти к выводу, что проблема была связана с неправильным расчетом массива Z, который представляет собой кумулятивную сумму.
Вот исправленный код на Object Pascal (Delphi), который правильно рассчитывает экспоненту Hurst:
var
max_z, min_z, x_m: Double; // max и min значений кумулятивной суммы и среднее значение X для каждого Tau
st, ss, sst, st2: Double;
Al, Herst: Double;
x_vr: array of Double; // массив с длиной Tau
i, j, nach: Integer;
begin
// Открытие файла и получение значений массива X - в другом месте
nach := 3; // начальное значение Tau
SetLength(ln_rs, l - nach + 1); // длина массива ln(R/S)
SetLength(ln_t, l - nach + 1); // длина массива ln(Tau)
SetLength(r, l - nach + 1); // длина массива R
SetLength(s, l - nach + 1); // длина массива S
// Начало расчета
for tau := nach to l do // изменяем Tau
begin
SetLength(x_vr, tau + 1); // создаем новый локальный массив (длина = Tau)
for i := 0 to Length(x_vr) - 1 do
x_vr[i] := x[i];
x_m := Mean(x_vr); // среднее значение
SetLength(y, tau + 1); // длина массива разностей со средним значением
SetLength(z, tau + 1); // длина массива кумулятивной суммы
for i := 0 to tau do
y[i] := x_vr[i] - x_m; // разность со средним значением
z[0] := y[0];
for i := 1 to tau do // кумулятивная сумма
for j := i downto 0 do
z[i] := z[i] + y[j - i + 1];
max_z := z[0];
for i := 1 to tau do // максимум кумулятивной суммы
max_z := Max(max_z, z[i]);
min_z := z[0];
for i := 1 to tau do // минимум кумулятивной суммы
min_z := Min(min_z, z[i]);
r[tau - nach] := max_z - min_z; // значение R
s[tau - nach] := 0;
for i := 0 to tau do
s[tau - nach] := s[tau - nach] + Power(y[i], 2);
s[tau - nach] := Sqrt(s[tau - nach] / (tau + 1)); // значение S
// новые значения массива
ln_rs[tau - nach] := Log(R[tau - nach] / S[tau - nach]); // ln(R/S)
ln_t[tau - nach] := Log(tau); // ln(Tau)
end; // конец расчета
// Метод наименьших квадратов
for i := 0 to Length(ln_rs) - 1 do
begin
st := st + ln_t[i];
ss := ss + ln_rs[i];
sst := sst + ln_t[i] * ln_rs[i];
st2 := st2 + Power(ln_t[i], 2);
end;
st := st / Length(ln_rs);
ss := ss / Length(ln_rs);
sst := sst / Length(ln_rs);
st2 := st2 / Length(ln_rs);
Herst := (sst - st * ss) / (st2 - st * st); // коэффициент приблизительной функции
Al := ss - st * Herst;
end;
В данном коде исправлена ошибка в цикле, который рассчитывает кумулятивную сумму z[i]. Вместо y[j] должен использоваться y[j - i + 1], чтобы правильно итеративно складывать элементы массива y.
Также стоит обратить внимание на корректное управление памятью и размерностями массивов, а также на правильный расчет статистических сумм, используемых в методе наименьших квадратов.
Экспонента Hurst, полученная с помощью данного исправленного кода, будет находиться в нужном диапазоне от 0 до 1.
Исправление кода для правильного расчета экспоненты Hurst с использованием линейной регрессии.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.