b) 显然,彼得斯的第二本书是指,它是关于消除该系列的AR效应。在这种情况下,最好的解决办法是为每个系列单独分析地找到系数。然而,我从来没有使用过这种变换,所以我不能确切地说,应该如何找到这些系数。但不要高度重视这些转换,因为它们的意义在于消除对拱门型系列的RS估计的极其不明显的高估(我可能是错的,我记得很模糊)。最好从正态分布的随机游走开始工作(在这个阶段已经被这个方法卡住了)。
#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 1587using System;
using System.Collections.Generic;
using System.Linq;
using WealthLab.Indicators;
namespace WealthLab.MyIndicators
{
///<summary>/// Задает тип рассчета статистики Херста///<param name="NotDependentSubperiods"> Не зависимые подпериоды</param>///<param name="SlidingWindow"> Скользящее окно</param>///</summary>publicenum HerstCalculation
{
NotDependentSubperiods,
SlidingWindow,
Modern
} ;
publicclass EmptyStrategy : WealthScript
{
protectedoverridevoid 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;
}
}
publicclass 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){}*/publicdouble 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);
}
}
privatedouble 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;
}
privatedouble 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) return0.0;
R += Math.Log10((max - min)/std_dev);
}
}
R /= count;
return R;
}
publicdouble RSS(DataSeries series, int bar, int N)
{
if(bar < N) return0.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) return0.0;
double RS = Math.Log10((max - min) / std_dev);
return RS;
}
publicdouble CountH(double RS, int Period)
{
double n = RS / (Math.Log10(Period));
return n;
}
#endregion
}
}
这一切的结果是多么酷啊!:-)
这些研究可以附加(补充)到 它 身上,或者可以画出类似的东西(对过滤器来说是自给自足的),与趋势平坦的过滤器一样简单地 连接到交易猫头鹰上?
这里是我使用iVAR 指标读数的趋势猫头鹰的信号部分。
如果理论研究得到证实,将有一整套描述混沌和决定性效应的指标。
iVAR的预测价值似乎非常值得怀疑。在视觉上,它真的不比MA好,而且明显受到波动的影响。严格来说,"混沌 "指标不应该对波动性做出反应,而应该对确定性过程和初始条件做出反应,而它们是不一样的。也就是说,混乱的指标往往应该在价格变化之前就开始变化(预测变化),但iVAR的情况并非如此。
p.s. 最好使用偏振分形效率 指标。它显示了更多有趣的时刻(我认为)。
如果理论研究得到证实,将有一整套描述混沌和决定性效应的指标。
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. 我看了一下结果...我不想打扰你...但还是...为什么使用这种算法对你来说是不可接受的?
我很抱歉,但我不太理解第2点下......)如果你不介意发送代码....
1) P.S. 我看了一下结果...我不想打扰你...但还是...为什么使用这种算法对你来说是不可接受的?
2)我把n增加了一个(n++)...但事实证明,在n=46和47时,周期数是相同的......它变成了某种阶梯状的图形......
1)对我来说,使用这种算法是不能接受的,因为它不工作。
2)很难解释所有错综复杂的问题,最好看看代码,它很小,我就在这里给它。
你不能直接运行它,因为它被设计为与WealthLab一起工作。我附上适当的图书馆。有了一定的持久性,就有可能理解调用方法。按照承诺,我将公布一项有趣的研究。
在你面前的是对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市场更多的是帕累托和尾部,现在市场的流动性更强,更接近于正态分布。这是一个强有力的反驳,这就是为什么我现在正在努力研究波动率的估计,以平滑这种分布的影响,并有效地对抗随机的帕累托型摆动。
这更多是关于方法本身。如果你的方法在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. 不过,也许这一切都是因为错误的数据和方法造成的错误结论。