Index de Hearst - page 33

 
Roman.:


Comme c'est cool tout ça ! :-)

Ces études peuvent-elles y être rattachées (complétées) ou peut-on en tirer quelque chose de similaire (autosuffisant pour le filtre) pour la même connexion simple à un hibou de trading qu'un filtre trend-flat ?

Voici mon signal partie de la chouette de la tendance en utilisant les lectures de l'indicateur iVAR .


Si les études théoriques se confirment, il y aura toute une série d'indicateurs décrivant les effets chaotiques et déterministes.

La valeur prédictive de l'iVAR semble très discutable. Visuellement, il n'est pas vraiment meilleur que MA et souffre clairement de la volatilité. Strictement parlant, les indicateurs "chaotiques" ne devraient pas réagir à la volatilité, mais au processus déterministe et aux conditions initiales, et ce ne sont pas les mêmes. Autrement dit, les indicateurs chaotiques devraient souvent commencer à changer avant même que le prix ne change (prédire les changements), mais ce n'est pas le cas avec iVAR.

p.s. Mieux vaut utiliser un indicateur d'efficacité fractale polarisé. Il montre des moments beaucoup plus intéressants (imho).

 
C-4:


Si les études théoriques se confirment, il y aura toute une série d'indicateurs décrivant les effets chaotiques et déterministes.

La valeur prédictive de l'iVAR semble très discutable. Visuellement, il n'est vraiment pas meilleur que MA et souffre clairement de la volatilité. Strictement parlant, les indicateurs "chaotiques" ne devraient pas réagir à la volatilité, mais au processus déterministe et aux conditions initiales, ce qui n'est pas la même chose. Autrement dit, les indicateurs chaotiques devraient souvent commencer à changer avant même que le prix ne change (prédire le changement), mais ce n'est pas le cas avec iVAR.

p.s. Mieux vaut utiliser un indicateur d'efficacité fractale polarisé. Il montre des moments beaucoup plus intéressants (imho).


Merci,C-4.

Je vais y regarder de plus près, je vais m'y faire...

 

Bonjour !

J'apprends actuellement l'analyse R/S et j'écris un programme en C# qui la met en œuvre. J'ai quelques questions à vous poser. J'espère que vous pourrez m'aider

1. dans son livre, Peters transforme la série temporelle originale

a) la différence entre le prix du premier jour et le prix du deuxième jour est-elle utilisée comme Yt ?

b) quelles doivent être les constantes a et b ?

2. et encore du livre :

Disons qu'il s'agit d'une série de 500 valeurs, je spécifie que le nombre initial n est de 20, comment puis-je ensuite augmenter le nombre n ?

Merci d'avance, j'espère votre aide.

 

b) Apparemment, il s'agit du deuxième livre de Peters, qui traite de l'élimination des effets indésirables de la série. La meilleure solution dans ce cas serait de trouver les coefficients analytiquement pour chaque série individuellement. Cependant, je n'ai jamais utilisé de telles transformations, et je ne peux donc pas dire exactement comment trouver ces coefficients. Mais n'attachez pas une grande importance à ces transformations, car leur signification est d'éliminer une surestimation extrêmement insignifiante de l'estimation RS sur des séries comme arch (je peux me tromper, je me souviens très vaguement). Il vaut mieux commencer par travailler avec des marches aléatoires normalement distribuées (on est déjà coincé avec cette méthode à ce stade).

a) Il est préférable d'utiliser les rendements logarithmiques plutôt que les différences de séries : ln(Pi/Pi-1).

2) Le N de Peters augmente d'une unité à chaque passage : n++. Le nombre de séries indépendantes doit être au moins égal à 2, c'est-à-dire que si vous avez une série de 500 valeurs, divisez-les par 2, et vous aurez N variant de 20 à 250 respectivement. Lorsque n couvrira la série avec un reste, par exemple n = 33, 250 / 33 = 7,5757575, prenez le nombre de barres pour lequel n sera un diviseur entier, par exemple pour n = 33 le nombre de barres sera 231. Ensuite, calculez d'abord rs pour le segment 1-231, puis pour le segment 20-250. La moyenne arithmétique des deux barres sera le RS souhaité.

P.S. En principe, je peux vous envoyer mon code en C#. Là, toutes ces conversions sont déjà faites, mais le code lui-même est inutile, car les statistiques de Peters ne montrent aucune régularité, et les résultats présentés dans son livre sont une pure profanation (voir les pages 24-26 du fil actuel).

 

Je suis désolé, mais je ne comprends pas bien le point 2)... si cela ne vous dérange pas d'envoyer le code....

P.S. J'ai regardé les résultats... Je ne veux pas vous déranger... mais quand même... pourquoi l'utilisation de cet algorithme n'est pas acceptable pour vous ?

 
J'ai augmenté n par un (n++)... mais il s'est avéré qu'avec n = 46, et 47 le nombre de périodes est le même... et il y avait une sorte de graphique échelonné...
 
kexs1k:

Je suis désolé, mais je ne comprends pas bien le point 2)... si cela ne vous dérange pas d'envoyer le code....

1) P.S. J'ai regardé les résultats... Je ne veux pas vous déranger... mais quand même... pourquoi l'utilisation de cet algorithme n'est pas acceptable pour vous ?


kexs1k:
2) J'ai augmenté n par un (n++)... mais il s'est avéré qu'à n = 46, et 47 le nombre de périodes est le même... et il s'avère qu'une sorte de graphique en escalier...


1) Pour moi, l'utilisation de cet algorithme n'est pas acceptable, car il ne fonctionne pas !

2) Il est difficile d'expliquer toutes les subtilités, mieux vaut voir le code, il est petit, je le donne ici :

#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
    }
}
Vous ne pouvez pas l'exécuter directement, car il est conçu pour fonctionner en conjonction avec WealthLab. Je joins les bibliothèques appropriées. Avec un peu de persistance, il est possible de comprendre les méthodes d'appel.
Dossiers :
wld5lib.zip  268 kb
 

Comme promis, je publie une étude intéressante :

Vous avez devant vous l'étude de deux segments temporels de l'indice RTS. Le premier segment (ligne verte) s'étend de 2006 à 2009, le second de 2009 à 2012. Vous pouvez constater que le RTS a fondamentalement changé depuis 2008. La première chose qui attire l'attention est que le RTS est devenu beaucoup plus efficace : sa courbe est devenue beaucoup plus proche du hasard. Le degré d'entropie et d'incertitude a augmenté. Toutefois, le degré d'entropie maximale, qui correspond à une marche aléatoire pure, n'a pas encore été atteint. Mais il faut comprendre qu'à ce stade, l'algorithme a tendance à surestimer ses relevés sur les distributions de Pareto et qu'en réalité la composante déterministe dans le RTS moderne est encore plus faible.

On s'intéresse à l'horizon temporel de 3 à 30 minutes (la période est de 10^N min, où N est porté sur l'axe des abscisses dans l'intervalle de 0,5 (10^0,5 = 3 min) à 3,5 (10^3,5 = 3162 min, ou 52 heures ou 3,7 jours)). Notez qu'il y a une composante anti-tendance hautement insignifiante mais statistiquement distinguable dans cette fourchette. Il est probable qu'elle soit encore plus grande en réalité, car nous avons gonflé les estimations sur les distributions de Pareto. Il n'existait pas avant 2009. Le marché a été extrêmement tendance sur tous les horizons temporels disponibles pour l'analyse. Qu'est-ce que c'est ? Peut-être sommes-nous en train d'observer les effets des algorithmes HFT qui n'étaient pas si largement représentés avant la crise de 2008. Ce n'est pas pour rien que les scalpers sur RTS disent depuis longtemps qu'il est presque impossible d'opérer - les robots ne permettent pas de négocier les formations habituelles.

Nous pouvons supposer que ces résultats différents des deux segments sont dus à la division par deux de l'échantillon statistique. Mais la quantité totale de données est importante et s'élève à environ 1 000 000 de barres de minutes de 2006 à 2012, ce qui donne 500 000 points de données pour chaque intervalle. Pour les petites périodes, cela représente des dizaines de milliers de sous-périodes, ce qui signifie que la réduction de la signification statistique est extrêmement faible et ne peut donner une telle dispersion des résultats (comme le montre la platitude des courbes). Toutefois, il existe une autre variante : de 2006 à 2009, le marché du RTS était plutôt de type Pareto et à queue, maintenant le marché est plus liquide et plus proche de la distribution normale. Il s'agit d'un contre-argument solide, et c'est pourquoi je travaille actuellement sur l'estimation de la volatilité afin de lisser les effets de ces distributions et de contrer efficacement le dérapage aléatoire de type Pareto.

 
C-4:


Il s'agit plutôt de la méthode elle-même. Si votre méthode donne 0,5 sur Norm. Random exactement 0,5 et 0,47-0,48 sur les devises - cela signifie que nous devrions sérieusement comprendre votre méthodologie. En théorie, les marchés ne devraient pas se diviser en deux catégories : les tendances et les anti-tendances. A Peters, tous les marchés étudiés avaient un H supérieur à 0,5.

Avez-vous essayé de mélanger aléatoirement les données des séries ? En théorie, cela devrait détruire les corrélations et ramener les estimations de H au maximum à 0,5 (il s'agit de vérifier l'exactitude de la méthode de calcul).

En ce qui concerne l'anti-récompense - après tout, la plupart des devises majeures, pour autant que je m'en souvienne, ont un AC des retours voisins inférieur à 0, et si nous supposons que la série est un mouvement brownien généralisé, alors C ~ 2^(H-1) - 1, c'est-à-dire que H doit être inférieur à 0.5...

 

Quel bordel ! !! C'est n'importe quoi !

En ce moment, je travaille sur le mélange des données. C'est ce que j'ai fait au début : j'ai mélangé toutes les barres RTS, j'ai fait un test sur les barres mélangées, et j'ai fini par avoir un RS encore plus déformé ! Mais ça ne peut pas être comme ça. Si RS ne montre que le fait que la distribution est non-normale, alors l'estimation ne devrait pas changer : après tout, statistiquement, les deux distributions sont identiques. Si la RS capte des corrélations complexes, alors celles-ci devraient être rompues par le mélange des données, et la RS ne devrait pas pouvoir être distinguée de la marche aléatoire. Au lieu de cela, la troisième option tombe obstinément. Peut-être est-ce l'incomparabilité dimensionnelle totale des barres RTS à différentes périodes. Les volatilités de 2006 sont trop différentes de celles des dernières années. Par conséquent, les grandes barres de 2006 se glissant dans la fourchette modérée des dernières années font que les valeurs aberrantes semblent encore plus grandes. Mon algorithme est écrit de telle sorte qu'il devrait traiter efficacement ces valeurs aberrantes, mais apparemment, quelque chose passe à travers les défenses.

Bon, sur la base de ce qui suit, présentons le scénario le plus négatif : l'algorithme ne retient que le fait que la distribution est non-normale. Il n'y a pas de composante déterministe dans les séries du marché. Vérifions de la manière suivante : si une hausse de prix a plus de chances d'être suivie d'une hausse (et vice versa, si une baisse est suivie d'une baisse), alors le graphique sera plus plat, quelle que soit la manière dont on le tourne. Le nombre de retournements pour une période de N barres sera moindre et donc le nombre de lignes en zig-zag sera également moindre. Nous décrivons cette dépendance comme suit : nous divisons le nombre de barres par le nombre de lignes en zigzag et obtenons le nombre moyen de barres par ligne ZZ. La distance parcourue n'est pas importante, donc le type de distribution ne devrait pas jouer de rôle. Nous traçons un graphique similaire en échelle logarithmique double. Nous prenons le dernier historique EURUSD d'un million de barres comme outil de test et le testons. Générons ensuite une marche aléatoire sur les mêmes volumes EURUSD. Elle ne sera pas normalement distribuée. Comparez maintenant deux graphiques, s'ils sont identiques, cela signifie que l'algorithme ne capte que les distributions non-normales et n'est d'aucune utilité. Alors, jetons un coup d'œil :

Whoa, whoa. Nos pires craintes se sont réalisées. Les deux graphiques sont identiques. Les deux sont distribués selon la loi Pareto et ne se distinguent pas d'une marche aléatoire, mais l'un est un véritable marché et l'autre un simple générateur basé sur des volumes réels.

Une dernière vérification : nous prenons à nouveau ces deux séries et nous calculons la distance pour elles. Si l'indicateur réagit seulement à la non-normalité de la distribution, le swing de la valeur aléatoire normale devrait montrer strictement 0.5, le swing de l'eurusd réel sera supérieur à 0.5 (parce que la distribution n'est pas normale), le swing de la distribution aléatoire générée sera presque indiscernable de l'eurusd réel comme vu dans le graphique ci-dessus. Testez et regardez :

Putain de merde ! !! Tu as vu ça ? L'EURUSD aléatoire est juste un tout petit peu plus élevé que la rampe aléatoire normale. Sa pente est presque égale à 0,5. La valeur aléatoire est restée inchangée, comme prévu. Mais l'EURUSD a sérieusement sous-estimé ( !) sa fourchette ! Dans le même temps, l'indice de Hurst de l'eurusd atteint 0,53, c'est-à-dire que la monnaie est en tendance, mais nous ne voyons que le début de sa tendance. Sa tendance ne se renforce qu'après 70 jours ( !), et avant cela, c'est un marché en fort repli. Cela signifie que l'EURUSD a un horizon gigantesque, nous ne voyons que le tout début du prologue.

Apparemment, c'est la non-normalité de la distribution qui cache tous les effets déterministes. Toutefois, la principale anomalie ne réside pas tant dans l'étrange volatilité, mais dans les incréments de prix (barres) eux-mêmes. Il s'agit d'un mécanisme très complexe et profond et il n'y a aucun moyen de travailler avec lui au hasard.

Mais peut-être qu'il s'agit de conclusions erronées en raison de données et de méthodes erronées.

Raison: