赫斯特指数 - 页 33

 
Roman.:


这一切的结果是多么酷啊!:-)

这些研究可以附加(补充)到 身上,或者可以画出类似的东西(对过滤器来说是自给自足的),与趋势平坦的过滤器一样简单地 连接到交易猫头鹰上?

这里是我使用iVAR 指标读数的趋势猫头鹰的信号部分。


如果理论研究得到证实,将有一整套描述混沌和决定性效应的指标。

iVAR的预测价值似乎非常值得怀疑。在视觉上,它真的不比MA好,而且明显受到波动的影响。严格来说,"混沌 "指标不应该对波动性做出反应,而应该对确定性过程和初始条件做出反应,而它们是不一样的。也就是说,混乱的指标往往应该在价格变化之前就开始变化(预测变化),但iVAR的情况并非如此。

p.s. 最好使用偏振分形效率 指标。它显示了更多有趣的时刻(我认为)。

 
C-4:


如果理论研究得到证实,将有一整套描述混沌和决定性效应的指标。

iVAR的预测价值似乎非常值得怀疑。在视觉上,它真的不比MA好,而且明显受到波动的影响。严格来说,"混沌 "指标不应该对波动性做出反应,而是对确定的过程和初始条件做出反应,这不是一回事。也就是说,混乱的指标往往应该在价格变化之前就开始变化(预测变化),但iVAR的情况并非如此。

p.s. 最好使用偏振分形效率 指标。它显示了更多有趣的时刻(我认为)。


谢谢你,C-4。

我会仔细看看,我会掌握它......

 

下午好!

我目前正在学习R/S分析,并正在用C#编写一个实现它的程序。我有几个问题。我希望你能帮助我

1.在他的书中,彼得斯对原始时间序列 进行了转换

a) 第一天的价格和第二天的价格之间的差额是否作为Yt使用?

b) 常数a和b应该是什么?

2.再一次从书中看到。

这里让我们说说一系列500个值,我指定初始n为20,然后我如何增加n的数量呢?

提前感谢,我希望得到您的帮助。

 

b) 显然,彼得斯的第二本书是指,它是关于消除该系列的AR效应。在这种情况下,最好的解决办法是为每个系列单独分析地找到系数。然而,我从来没有使用过这种变换,所以我不能确切地说,应该如何找到这些系数。但不要高度重视这些转换,因为它们的意义在于消除对拱门型系列的RS估计的极其不明显的高估(我可能是错的,我记得很模糊)。最好从正态分布的随机游走开始工作(在这个阶段已经被这个方法卡住了)。

a) 最好使用对数回报,而不是系列差异:ln(Pi/Pi-1)。

2)彼得斯的N在每次运行中增加一个:N++。独立运行的数量必须至少为2。也就是说,如果你有一系列500个值,把它们除以2,你就会有N,分别从20到250变化。当n涵盖了有余数的系列,例如n=33,250/33=7.5757575,取n为整数除数的条数,例如n=33的条数为231。然后首先计算1-231段的rs,然后计算20-250段的rs。两条杠的算术平均值将是所需的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
 

按照承诺,我将公布一项有趣的研究。

在你面前的是对RTS指数两个时间段的研究。第一段(绿线)测试从2006年到2009年,第二段从2009年到2012年。你可以看到,自2008年以来,RTS已经发生了根本性的变化。首先映入眼帘的是RTS变得更有效率:它的曲线变得更接近于随机。熵和不确定性的程度已经增加。然而,尚未达到最大熵的程度,也就是纯随机行走。但必须明白,在目前阶段,该算法倾向于高估其在帕累托分布上的读数,实际上,现代RTS中的确定性成分甚至更小。

从3分钟到30分钟的时间范围是值得关注的(周期为10^N分钟,其中N是在0.5(10^0.5=3分钟)到3.5(10^3.5=3162分钟,或52小时或3.7天)的范围内绘制的尾轴)。请注意,在这个范围内有一个非常不明显但在统计上可区分的反趋势成分。在现实中可能更大,因为我们对帕累托分布有夸大的估计。它在2009年之前并不存在。在所有可供分析的时间范围内,市场都非常有趋势性。这是什么?也许我们看到的是2008年危机前没有如此广泛体现的HFT算法的影响。RTS上的剥头皮者长期以来一直在说,这几乎是不可能操作的--机器人不允许交易通常的阵型,这并不是没有道理。

我们可以假设,两个部分的这种不同结果是由统计样本减半造成的。但数据总量很大,从2006年到2012年,大约有1 000 000个分钟条,每个区间有500 000个数据点。对于小周期来说,这是几万个子周期,这意味着统计学意义的减少是非常小的,不可能给出这样的结果分布(这从曲线的平坦性可以看出)。然而,还有一个变体:从2006年到2009年,RTS市场更多的是帕累托和尾部,现在市场的流动性更强,更接近于正态分布。这是一个强有力的反驳,这就是为什么我现在正在努力研究波动率的估计,以平滑这种分布的影响,并有效地对抗随机的帕累托型摆动。

 
C-4:


这更多是关于方法本身。如果你的方法在Norm上给出0.5。随机正好是0,5和0,47-0,48的货币 - 这意味着我们应该认真了解你的方法。理论上,市场不应该分为潮流和反潮流。在彼得斯,所有研究的市场的H值都在0.5以上。

你是否尝试过随机地混合系列数据? 理论上,它应该破坏相关性,使H的估计值最大限度地达到0.5(这是一个关于检查计算方法正确性的问题)。

关于反回报--毕竟在我的印象中,大多数货币主力的相邻回报的AC都小于0,如果我们假设系列是广义布朗运动,那么C ~ 2^(H-1) - 1,即H一定小于0.5......

 

多么血腥的混乱!!!。这简直是无稽之谈!

现在,我正在努力混合数据。我一开始就是这么做的:洗掉所有的RTS条,在洗掉的条上进行测试,结果是RS的倾斜度更大!这就是我的做法。但不可能是这样的。如果RS只显示了分布是非正态的事实,那么估计值就不应该改变:毕竟从统计学上看,两个分布是相同的。如果RS抓住了复杂的相关性,那么它们应该被数据混合所打破,而且RS不应该与随机漫步相区别。相反,第三个选项却顽固地落空了。也许是不同时期的RTS条形图在尺寸上完全没有可比性。2006年的波动性与最近几年有太大的不同。因此,2006年的大柱子爬到了最近几年的中等范围,使离群值看起来更大。我的算法是这样写的,它应该有效地处理这种异常值,但显然有什么东西突破了防线。

好吧,基于以下情况,让我们提出最消极的情况:该算法只抓住了分布是非正态的事实。市场系列中没有决定性的成分。让我们用以下方式检查:如果价格的上涨更有可能是紧随其后的上涨(反之亦然,如果下跌是紧随其后的下跌),那么无论你怎么转,图表都会更平坦。N条周期的反转次数将减少,因此Zag-Zag线的数量也将减少。我们对这种依赖关系描述如下:我们用条形图的数量除以之字形线的数量,得到每条之字形线的平均数量。覆盖的距离并不重要,所以分配的类型不应该起作用。我们用双对数比例画一个类似的图表。我们以欧元兑美元最近的100万条历史记录作为测试工具,进行测试。然后让我们在相同的欧元兑美元交易量上生成一个随机走势。它将不是正态分布。现在比较两个图表,如果它们是相同的,这意味着该算法只抓住了非正态分布,没有用处。因此,让我们来看看。

哇,哇。我们最担心的事情已经成真。两张图都是一样的。两者都是帕累托分布,与随机漫步没有区别,但一个是真正的市场,另一个是基于真实数量的简单生成器。

最后检查一下:我们再次取这两个系列,计算它们的距离。如果指标只对分布的非正态性做出反应,正常随机值的摆动应该严格显示为0.5,真实金牛座的摆动将高于0.5(因为分布不正常),生成的随机分布的摆动将几乎与真实金牛座没有区别,如上图所示。测试和观察。

你看到了吗!?随机的欧元兑美元只是比正常的随机斜率高了一丁点。其斜率几乎等于0.5。随机值按预期保持不变。但欧元兑美元严重低估了(!)其区间!同时,eurusd的Hurst指数高达0.53,也就是说,该货币是有趋势的,但我们看到的只是其趋势的开始。它的趋势只有在70天后才会聚集力量(!),而在此之前,它是一个强烈的回调市场。这意味着,欧元兑美元有一个巨大的地平线,我们只看到序幕的最开始。

显然,正是分布的非正态性掩盖了所有决定性的影响。然而,主要的异常并不在于奇怪的波动性,而是在于价格增量(柱状)本身。这是一个非常复杂和深刻的机制,没有办法随意地与它合作。

s.s. 不过,也许这一切都是因为错误的数据和方法造成的错误结论。