Показатель Херста - страница 33

 
Roman.:


Как всё оказывается здОрово! :-)

А эти исследования к этому как - то можно привязать (дополнить) или нечто подобное (самодостаточное для фильтра) изобразить для такого же простого подключения к торгующему сову в качестве трендо-флетового фильтра?

Вот моя сигнальная часть трендового сова, использующая показания индика iVAR.


Если теоретические исследования подтвердятся, будет целая серия индикаторов описывающая хаотические и детерменистические эффекты.

Видится весьма сомнительной прогностическая ценность iVAR. Визуально, он действительно не чуть не лучше MA и явно страдает от волатильности. Строго говоря "хаотические" индикаторы должны реагировать не на волатильность, а на детерменистичность процесса и начальные условия, а это ни одно и тоже. Т.е. хаотические индикаторы должны зачастую начинать изменяться еще до изменения цены (предсказывать изменения), а этого в iVAR нет.

p.s. Лучше уж используйте индикатор поляризованной фрактальной эффективности. Он и то показывает гораздо больше интересных моментов (имхо).

 
C-4:


Если теоретические исследования подтвердятся, будет целая серия индикаторов описывающая хаотические и детерменистические эффекты.

Видится весьма сомнительной прогностическая ценность iVAR. Визуально, он действительно не чуть не лучше MA и явно страдает от волатильности. Строго говоря "хаотические" индикаторы должны реагировать не на волатильность, а на детерменистичность процесса и начальные условия, а это ни одно и тоже. Т.е. хаотические индикаторы должны зачастую начинать изменяться еще до изменения цены (предсказывать изменения), а этого в iVAR нет.

p.s. Лучше уж используйте индикатор поляризованной фрактальной эффективности. Он и то показывает гораздо больше интересных моментов (имхо).


Благодарю, C-4.

Посмотрю его поближе, поразбираюсь...

 

Добрый день!

Я сейчас занимаюсь изучением R/S анализа и пишу программу на C# которая реализует его. У меня возникло несколько вопросов. Я надеюсь что вы сможете помочь мне

1.в своей книге Петерс преобразует изначальный временной ряд

а) в качестве Yt используется разница между ценой первого дня и ценой второго дня?

б) какие должны быть константы а, и b?

2. и опять же из книги:

Вот допустим ряд из 500 значений, начальное n я укажу 20, как потом увеличивать число n???

Заранее спасибо, надеюсь на вашу помощь.

 

б) По всей видимости имеется в виду вторая книга Петерса и речь идет об устранении AR-эффектов ряда. Лучшем решением в этом случае будет аналитический поиск коэффициентов для каждого ряда индивидуально. Однако, подобные преобразования я никогда не использовал, поэтому не смогу сказать как именно надо искать эти коэффициенты. Но не придавайте этим преобразованиям большого значения, т.к. их смысл в устранении крайне незначительного завышения RS оценки на рядах типа arch (могу ошибаться, помню очень смутно). Лучше для начала работайте с нормально распределенными случайными блужданиями (с этим методом застопоритесь уже на этом этапе).

а) Лучше используйте логарифмические доходности, а не разности ряда: ln(Pi/Pi-1).

2) N у Петерса в каждом прогоне увеличивается на единицу: n++. При этом количество независимых отрезков должно быть не меньше 2. Т.е. если у вас ряд из 500 значений, разделите их на 2, и N у Вас будет меняться от 20 до 250 соответственно. При этом когда n будет покрывать ряд с остатком, например n=33, 250 / 33 = 7,5757575, берите количество баров, для которых n будет целым делителем, например для n=33 количество баров будет 231. Затем сперва рассчитайте rs для отрезка 1-231, затем для отрезка 20-250. Среднее арифметическое для обоих отрезков и будет нужным RS.

P.S. В принципе могу скинуть Вам мой код на C#. Там все эти преобразования уже проделаны, правда код сам бесполезный, т.к. статистика Петерса никаких закономерностей не выявляет, и результаты представленные в его книге - чистой воды профанация (результаты см. страницы 24-26 текущей ветки).

 

извиняюсь, но не совсем понял под пунктом 2)... если не трудно скиньте код....

P.S. я смотрел результаты... не хочу утруждать вас... но все же... почему использование данного алгоритма не приемлемо для вас?

 
я увеличивал n на единицу (n++)... но получалось так что при n = 46, и 47 количество периодов одинаковое... и получался какой-то ступенчатый график...
 
kexs1k:

извиняюсь, но не совсем понял под пунктом 2)... если не трудно скиньте код....

1) P.S. я смотрел результаты... не хочу утруждать вас... но все же... почему использование данного алгоритма не приемлемо для вас?


kexs1k:
2) я увеличивал n на единицу (n++)... но получалось так что при n = 46, и 47 количество периодов одинаковое... и получался какой-то ступенчатый график...


1) Для меня использования данного алгоритма не приемлемо, потому что он НЕ РАБОТАЕТ!

2) Сложно объяснить все тонкости, лучше смотрите код, он небольшой, привожу его прямо здесь:

#pragma warning disable 1587
///<summary>
/// <para>
/// Класс WealthLab.Strategies.Herst реализует методы R/S статистики, такие как таблица R/S оценки к периоду R/S расчета
/// в двойном логарифмическом масштабе, U-статистика, V-статистика, Коэффициент Херста (H) и т.д.</para>
/// <para>
/// Используется  два вида расчета: 1. по скользящему окну; 2. по разбиению всех доступных данных на независимые подпериоды
/// длинной N (задается пользователем).
/// </para>
/// <para>
/// При втором методе для использования всех доступных данных в случае, если 
/// имеется остаток (количество наблюдений не делится на размерность периода N без остатка)расчет производится
/// дважды. Первый раз рассчитываются значения для данных таким образом, что неиспользованные данные (остаток)
/// остаются в самом конце, на втором проходе неиспользованные данные (остаток) остаются в самом начале. Т.е.
/// используется метод скользящего окна, с шагом равным величене остатка. Таким образом и при первом и при втором
/// методе рассчета используются все доступные для наблюдения данные.
/// </para>
/// </>
///</summary>
#pragma warning restore 1587
using System;
using System.Collections.Generic;
using System.Linq;
using WealthLab.Indicators;

namespace WealthLab.MyIndicators
{
    /// <summary>
    /// Задает тип рассчета статистики Херста
    /// <param name="NotDependentSubperiods">Не зависимые подпериоды</param>
    /// <param name="SlidingWindow">Скользящее окно</param>
    /// </summary>
    public enum HerstCalculation
    {
        NotDependentSubperiods,
        SlidingWindow,
        Modern
    } ;
    public class EmptyStrategy : WealthScript
    {
        protected override void Execute()
        {
            PrintDebug("Run Empty Strategy...");
        }
    }


    public abstract class MyIndicators
    {
        protected WealthScript ws_strategy;
        protected bool InitEnable = false;
        public MyIndicators() : this (null){}
        /// <summary>
        /// Основной конструктор требует текущего окружения WealtLab через класс WealthLab.WealthLabScript
        /// </summary>
        /// <param name="wl_script">Класс типа WealthLab.WealthLabScript содержащий все необходимые данные</param>
        public MyIndicators(WealthScript wl_script)
        {
            if(wl_script == null) return;
            ws_strategy = wl_script;
        }
    }

    public class Herst : MyIndicators
    {
        //Хранит ценовой (аккумулятивный) ряд доходностей
        private List<double> series = new List<double>();
        /// <summary>
        /// Инициализиурет класс Herst текущем окружением WealthScript 
        /// </summary>
        /// <param name="ws">Текущий класс WealthScript</param>
        
        public Herst() : this(new EmptyStrategy()){}
        public Herst(WealthScript ws) : base(ws) {}
        #region RSAnalysis
        /// <summary>
        /// Возвращает пролагорифмированное по основанию 10 отношение R/S для периода N.
        /// </summary>
        /// <param name="N">Период расчета R/S</param>
        /// <param name="CalcType">Тип рассчета</param>
        /// <returns>
        /// Значение RS
        /// </returns>
        /*public static DataSeries operator + (DataSeries ds1, DataSeries ds2){}*/
        public double RS(ref DataSeries data, int N, HerstCalculation CalcType)
        {
            if (N > data.Count) return -1.0;
            switch (CalcType)
            {
                case HerstCalculation.NotDependentSubperiods:
                    return RSAnalysisInLogScaleSubperiods(ref data, N);
                //case HerstCalculation.Modern(N):
                //    return RSAnalysisInLogModern(N);
                default:
                    return RSAnalysisInLogScaleSubperiods(ref data, N);
            }
        }
        
        private double RSAnalysisInLogScaleSubperiods(ref DataSeries series, int N)
        {
            //находим количество не используемых наблюдений для выбранного периода.
            int NotUsingM = series.Count - (int)(Math.Floor((double)series.Count/N))*N;
            //Создаем конвертер данных
            //Для простоты рассчетов конвертируем DataSeries в List<double>
            List<double> first = Convert.DataSeriesToList(ref series);
            //if(NotUsingM != 0){}

            List<double> second = Convert.DataSeriesToList(ref series);
            //1. Удаляем неиспользуемые наблюдения с начала списка
            first.RemoveRange(0, NotUsingM);
            //2. Затем удаляем неиспользуемые наблюдения с конца списка (0 - первый элемент)
            second.RemoveRange(second.Count - NotUsingM, NotUsingM);
            //3. Разбиваем ряд на k равных групп, и для каждой из них подсчитываем R/S размах к периоду затем
            //   находим их среднее значение.
            //Для простоты рассчета индикатора снова конвертируем списки в DataSeries
            DataSeries firstDS = Convert.ListToDataSeries(ref first);
            DataSeries secondDS = Convert.ListToDataSeries(ref second);
            double avrg_r1 = CountR(ref firstDS, N);
            double avrg_r2 = CountR(ref secondDS, N);
            double R = (avrg_r1 + avrg_r2)/2;
            return R;
        }
        private double CountR(ref DataSeries series, int N)
        {
            //DataSeries R = new DataSeries("R");
            double R = 0.0;
            int count = 0;
            for (int i = 0; i < series.Count; i++)
            {
                if ((i + 1) % N == 0)
                {
                    count++;
                    int first_element = i + 1 - N;
                    //находим среднее значение или математическое ожидание периода:
                    double sma = Indicators.SMA.Value(i, series, N);
                    //находим стандартное отклонение
                    double std_dev = Indicators.StdDev.Value(i, series, N, StdDevCalculation.Sample);
                    double acum = 0.0;
                    DataSeries acum_series = new DataSeries("Acum Series");
                    double min = double.MaxValue, max = double.MinValue;
                    for (int k = first_element; k <= i; k++)
                    {
                        acum += series[k] - sma;
                        acum_series.Add(acum, DateTime.Now);
                        if (acum < min) min = acum;
                        if (acum > max) max = acum;
                    }
                    if (std_dev == 0.0) return 0.0;
                    R += Math.Log10((max - min)/std_dev);
                }
            }
            R /= count;
            return R;
        }

        public double RSS(DataSeries series, int bar, int N)
        {
            if(bar < N) return 0.0;
            int first_element = bar + 1 - N;
            //находим среднее значение или математическое ожидание периода:
            double sma = Indicators.SMA.Value(bar, series, N);
            //находим стандартное отклонение
            double std_dev = Indicators.StdDev.Value(bar, series, N, StdDevCalculation.Sample);
            double acum = 0.0;
            DataSeries acum_series = new DataSeries("Acum Series");
            double min = double.MaxValue, max = double.MinValue;
            for (int k = first_element; k <= bar; k++)
            {
                acum += series[k] - sma;
                acum_series.Add(acum, DateTime.Now);
                if (acum < min) min = acum;
                if (acum > max) max = acum;
            }
            if (std_dev == 0.0) return 0.0;
            double RS = Math.Log10((max - min) / std_dev);
            return RS;
        }

        public double CountH(double RS, int Period)
        {
            double n = RS / (Math.Log10(Period));
            return n;
        }
        #endregion
    }
}
Но, напрямую его запустить не получиться, потому что он рассчитан для работы в связке с WealthLab. Прикрепляю соответствующие библиотеки. При определенной настойчивости можно разобраться в методах вызова.
Файлы:
wld5lib.zip  268 kb
 

Как и обещал публикую любопытное исследование:

Перед вами исследование двух временных отрезков индекса РТС. Первый отрезок (зеленая линия) тестирование с 2006 по 2009 год, второй с 2009 по 2012 год. Видно, что после 2008 года РТС принципиально изменился. Первое, что бросается в глаза, РТС стал гораздо эффективней: его кривая стала гораздо ближе к случайной. Степень энтропии и неопределенности увеличилась. Однако степень максимальной энтропии, которой является чистое случайное блуждание еще не достигнута. Но необходимо понимать, что на сегодняшнем этапе алгоритм имеет склонность завышать свои показания на распределениях Парето и в реальности детерменистической составляющей в современном РТС еще меньше.

Интерес представляет временной горизонт от 3 до 30 минут (период равен 10^N мин., где N отложена на оси абцисс в диапазоне от 0,5 (10^0,5 = 3 мин) до 3,5 (10^3,5 = 3162 мин, или 52 часа или 3,7 дня)). Обратите внимание, что в этом диапазоне имеется крайне не значительная, но статистически различимая антитрендовая составляющая. Скорее всего, в реальности она даже больше, т.к. мы имеем завышенные оценки на Паретовских распределениях. До 2009 года ее не было. Рынок был крайне трендовым на всех доступных для анализа временных горизонтах. Что это? Возможно мы видим эффекты работы HFT алгоритмов, которые не были так широко представленны до кризиса 2008 года. Не даром скальперы на РТС уже давно говорят, что работать стало практически не возможно - роботы не дают выторговывать привычные формации.

Можно предположить что такие различные результаты двух отрезков вызваны уменьшение статистической выборки вдвое. Но общее количество данных велико и составляет примерно 1 000 000 минутных баров с 2006 по 2012 год, что дает по 500 000 точек данных для каждого отрезка. На малых периодах это десятки тысяч подпериодов, а значит снижение статистической значимости крайне не значительно и не может дать такой разброс результатов (что и видно по ровности кривых). Правда остается еще один вариант: с 2006 по 2009 год рынок РТС был более Паретовским и хвостатым, сейчас рынок более ликвидный и ближе к нормальному распределению. Это сильный контраргумент, поэтому сейчас я усилено работаю над оценкой волатильности, что бы сглаживать эффекты таких распределений и эффективно противостоять случайному блужданию Паретовского типа.

 
C-4:


Здесь скорее дело в самом методе. Если Ваш метод дает на Norm. Random ровно 0,5 а на валютах 0,47-0,48 - значит надо серьезно разбираться в Вашей методологии. Теоретически не должны рынки делиться на трендовые и антитрнедовые. У Петерса все исследуемые рынки обладали H выше 0,5.

Не пробовали перемешать случайным образом данные ряда? по идее это должно разрушить корреляции и приблизить оценку Н максимально к 0.5 (это к вопросу о проверке корректности метода расчета)

Насчет антирендовости - все таки большинство валютных мажоров, насколько я помню, имеют КК соседних возвратов чуть меньше 0, и если мы принимаем, что ряд - обобщенное броуновское движение, то С ~ 2^(H-1) - 1, т.е. Н обязано быть меньше 0.5 ...

 

Чертовшина какая-то!!! Просто бред!

Вот прямо сейчас я работаю над перемешиванием данных. Вначале так и сделал: перемешал все бары РТС, прогнал тест на перемешенных, в итоге получил RS наклон еще больше! Но такого быть не может. Если RS показывает лишь факт ненормальности распределения, то оценка не должна измениться: ведь статистически оба распределения идентичны. Если RS ловит сложные корреляционные взаимосвязи, то они должны быть разрушены перемешиванием данных, и RS должен быть не отлечим от случайного блуждания. Вместо этого упорно выпадает третий вариант. Возможно дело в полной размерной несопоставимости баров РТС на разных периодах. Волатильности 2006 года слишком отличаются по сравнению с последними годами. В итоге большие бары 2006 года вкрапливаясь в умеренный диапазон последних лет делают выбросы как-бы еще больше. Мой алгоритм написан таким образом, что по идеи, должен эффективно обрабатывать такие вхождения, но по всей видимости что-то все-таки серъезно прорывает оборону.

Ладно, исходя из нижеперечисленного представим самый негативный вариант: Алгоритм ловит только факт ненормальности распределения. Детерменистической компоненты в рыночных рядах нет. Проверим следущим образом: если за повышением цены более вероятно следует повышение (и наоборот, за понижением - понижение), то как не крути, график будет ровней. Количество возратов за период N баров будет меньше, а значит количество линий заг-зага будет также меньше. Описываем зависимость следующим образом: делим количество баров на количество линий зиг-зага, получаем усредненный показатель количество баров на одну линию ZZ. Проделанное расстояние при этом не важно, а значит, тип распределения не должен играть роли. Строим аналогичный график в двойном логарифмическом масштабе. В качестве тестируемого инструмента берем последнюю историю EURUSD продолжительностью 1 миллион баров, тестируем на нем. Затем на тех же самых объемах EURUSD генерируем случайное блуждание. Оно будет не нормально распределено. Теперь сравниваем два графика, если они будут идентичны, значит алгоритм ловит лишь ненормальность распределения, и ни на что не годен. Итак, смотрим:

Опа-па. Наши самые худшие опасения сбылись. Оба графика идентичны. Оба распределены по Парето и неотличимы от случайного блуждания, но одно настящий рынок, а другой простой генератор на основе реальных объемов.

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

Хренасе!!! Вы видели!? Рандомный EURUSD лишь самую чутку выше нормального случайного блуждания. Его угол наклона практически равен 0,5. Случайная величина как и ожидалось осталась неизменной. А вот EURUSD показывает серъезное занижение(!) своего размаха! При этом показатель Херста у eurusd аж целых 0,53, т.е. валюта трендовая, но мы видим лишь самое начало ее тренда. Её тренд набирает силу лишь после 70 дней(!), а до этого она является сильно откатным рынком. Это означает, что у EURUSD гигантский горизонт действия, мы видим лишь самое начало пролога.

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

з.ы. хотя может быть все это неверные выводы из-за неправильных данных и методов. х.з.