#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.偏光フラクタル効率 インジケータを使用した方が良い。もっと面白い瞬間を見せてくれるはずだ(imho)。
理論的な研究が確認されれば、カオス的な効果や決定論的な効果を記述する一連の指標が出てくるでしょう。
iVARの予測値には大いに疑問があるようです。ビジュアル的には、本当にMAと変わらないし、明らかにボラティリティに苦しんでいる。厳密に言えば、「カオス」な指標はボラティリティに反応するのではなく、決定論的なプロセスや初期条件に反応するはずであり、それは同じものではありません。つまり、カオス的な指標は、価格が変化する前から変化を始める(変化を予測する)ことが多いはずですが、iVARの場合はそうではありません。
p.s.偏光フラクタル効率 インジケータを使用した方が良い。もっと面白い瞬間を見せてくれるはずだ(imho)。
C-4 さん、ありがとうございました。
もっと よく見て、 もっと突き詰めて...。
こんにちは。
現在、R/S解析を学び、それを実装したプログラムをC#で書いているところです。いくつか質問があります。よろしくお願いします
1.Petersの著書では、元の時系列を 変換することで
a) 1日目の価格と2日目の価格の差をYtとして使用するのですか?
b) 定数a,bはどうあるべきか?
2.そして再び本から。
ここでは、500個の値の系列を想定し、初期値としてnを20と指定しますが、その後nをどのように増やせばよいのでしょうか?
よろしくお願いします。
b)どうやらピータースの2冊目が意味するところは、シリーズのAR効果をなくすということらしい。この場合、各系列の係数を個別に解析的に求めることが最適な解決策となる。しかし、私はこのような変換を使ったことがないので、これらの係数をどのように求めるべきか、正確なことは言えません。しかし、これらの変換は、archのような系列(間違っているかもしれない、非常に曖昧に覚えている)のRS推定の極めて些細な過大評価を排除することに意味があるので、あまり重要視しないでください。正規分布のランダムウォークを扱うところから始めた方が良い(この段階で既にこの手法にはまっている)。
a) 系列差ではなく対数リターンを使う方が良い: ln(Pi/Pi-1).
2) PetersのNは実行のたびに1ずつ増加する:n++。独立したランの数は少なくとも2でなければならない。 つまり、500の値の系列があれば、それを2で割ると、それぞれ20から250まで変化するNを持つことになる。n が余りを持つ級数をカバーする場合、例えば n = 33 の場合、250 / 33 = 7.5757575 となり、n が整数の約数となる小節 数を取る、例えば n = 33 の場合は 231 となる。次に、まずセグメント1-231のrsを計算し、次にセグメント20-250のrsを計算する。両方のバーの算術平均が目的のRSになります。
追伸:基本的にはC#の私のコードをお送りすることができます。そこではこれらすべての変換がすでに行われていますが、Petersの統計は何の規則性も示しておらず、彼の本で示された結果は純粋な冒涜です(現在のスレッドの24-26ページ参照)ので、コードそのものは役に立ちません。
申し訳ないのですが、ポイント②以下がよくわからないのですが...。)コードを送っても構わないのなら...。
追伸:結果を見てみると・・・。お構いなくが、それでも...なぜ、このアルゴリズムを使うことが受け入れられないのでしょうか?
申し訳ないのですが、ポイント②以下がよくわからないのですが...。)コードを送っても構わないのなら...。
1) 追伸:結果を見てみると・・・。お構いなくが、それでも...なぜ、このアルゴリズムを使うことが受け入れられないのでしょうか?
2)nを1つ増やした(n++)...。が、n=46と47では、周期数が同じであることが判明した...。と、何やら段々畑のようなグラフになっていく...。
1) 私にとって、このアルゴリズムを使用することは受け入れがたいことです。
2) すべての複雑な部分を説明するのは難しいので、コードを見てください。
WealthLabと連携して動作するように設計されているため、直接実行することはできません。適切なライブラリを添付しています。ある程度の永続性があれば、呼び出し方法を理解することは可能である。約束通り、面白い研究を発表します。
今回は、RTSインデックスの2つの時間セグメントをご紹介します。最初のセグメント(緑の線)は2006年から2009年まで、2番目は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のスキャルパーが、「運用はほとんど不可能だ」「ロボットでは通常のフォーメーションは取引できない」と長い間言い続けてきたのは、決して無駄なことではありません。
このような2つのセグメントの結果の違いは、統計サンプルを半分にしたことに起因すると考えることができる。しかし、データの総量は大きく、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はランダムウォークと区別がつかないはずである。その代わり、3つ目の選択肢は頑として落ちない。おそらく、異なる時期のRTSバーを完全に次元的に比較できないことです。2006年のボラティリティは、ここ数年と違いすぎる。その結果、近年の中庸な範囲に忍び寄る2006年の大きなバーが、異常値をさらに大きくしているように感じられる。私のアルゴリズムは、このような異常値を効果的に処理するように書かれているのですが、どうやら何かがその防御を破っているようなのです。
さて、以下に基づいて、最も否定的なシナリオを提示しよう:このアルゴリズムは、分布が非正規であるという事実のみを捕らえる。市場系列に決定論的な要素はない。次のように確認してみよう。もし、価格の上昇の方が後に続くなら(逆に下落の方が後に続くなら)、どう転んでもグラフは平坦になるはずだ。N本の期間での反転回数が少なくなるため、ザグザグ線の数も少なくなります。その依存性を次のように表現する。バーの数をジグザグ線の数で割って、ZZ線あたりのバーの平均数を求めるのである。移動距離は重要ではありませんから、配布物の種類は関係ないはずです。同様のグラフを両対数スケールで描いてみる。テストツールとして直近のEURUSDの履歴100万本を取り上げ、テストしています。次に、同じEURUSDの出来高でランダムウォークを生成してみましょう。正規分布にはならない。ここで2つのグラフを比較してみて、もし同じであれば、このアルゴリズムは非正規分布を捕らえるだけで、何の役にも立たないということになります。では、見てみましょう。
おっとっと、おっとっと。私たちが最も恐れていたことが現実になったのです。両者のグラフは同じものです。どちらもパレート分布でランダムウォークと区別がつかないが、一方は真の市場、もう一方は実際の出来高に基づく単純なジェネレータである。
最終確認:もう一度、この2つの系列をとって、距離を計算してみる。分布の非正規性にのみ反応する指標であれば、正規の乱数値の揺れは厳密に0.5を示すはずですが、実際のユーリスドの揺れは(分布が正規でないため)0.5以上になり、生成した乱数分布の揺れは上のチャートにあるように実際のユーリスドとほとんど見分けがつかないことになります。テストして見る。
って感じですね(・∀・)イイ!見たか!?ランダムEURUSDは、通常のランダムランプよりほんの少し高いです。その傾きは、ほぼ0.5と等しい。乱数値は予想通り変化していない。しかし、EURUSDはそのレンジを真剣に過小評価(!?)している!同時に、eurusdのハースト指数は0.53と大きく、つまり通貨はトレンドを形成しているが、トレンドの始まりに過ぎないと見ることができる。そのトレンドが強まるのは70日後(!)であり、それ以前は強く引き戻される相場である。つまり、EURUSDには巨大な地平線があり、私たちはプロローグの一番最初しか見ていないのです。
どうやら、分布の非正規性が、すべての決定論的効果を隠しているようだ。しかし、主な異常は奇妙なボラティリティではなく、価格刻み(バー)そのものにあるのです。非常に複雑で奥の深い仕組みなので、適当に手を出すのは無理があります。
中略)しかし、データや方法が間違っているから、すべて間違った結論になるのかもしれません。