Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Исправление кода: правильный расчет экспоненты Hurst с использованием линейной регрессии

Delphi , Синтаксис , Математика

Экспонента 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




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


:: Главная :: Математика ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-20 22:24:33/0.0037000179290771/0