はじめに
ご無沙汰しております^^;
さてさて今回は、チャート内の特異値(Bar)を見える化する指標を作成することにしました。
手順
まず初めに、各Barの値として(高値-安値)《以下 高安値》を採用しました。
高安値を採用したことにより対数正規分布を連続確率分布として採用します。
参考記事:
ベキ分布? 対数正規分布を調べてみた。 検証してみました。
あとは、分布のパラメータを推定して、各高安値を当てはめて発生確率を求めました。そして出来上がったのがコレです。。。。。なんだか全然見える化できていない。。orz
そこで、選択情報量の定義を利用して左記のように見やすくしました。自画自賛w
※ちなみに情報量の定義などは、
こちら。
まとめ
今回実施した特異値に理由付けを行ってみた結果が以下の画像です。
大きく指標が跳ね上がった部分は、何らかの理由付けができそうです。いや~黒田日銀総裁の円安是正発言は、まいりました。^^;
さてさて、今回の指標は、高安値が高いから指標が跳ね上がるだけでなく極端に低い場合でも跳ね上がります。右のチャート部分は、時間当たり2ティックしかなく特異値として指標が跳ね上がりました。発生確率が低い値(高安値)を見える化する事が目的なのでこんな感じとなります。データの抜けが原因かな?。。
ここでお題の話を少し。。情報エントロピーという情報量の定義指標があって(
参考)、情報を受け取ると情報エントロピーは、最小となる。つまり、事象の不確かさが、最小となる。つまり、(ここからは、妄想。。)不確実さが低減されるのであれば、秩序だった動きが現れるんじゃないの?だったら∑(゚Д゚;)!! いや~妄想ってホント素敵ですねw 夏があまり好きではないおっさんの戯言でありました。
コード
DLは、
ココ
#property copyright "Copyright 2015,bighope."
#property link "http://expertadviser-bighope.blogspot.jp/"
#property version "1.00"
#property strict
#property indicator_separate_window
#property indicator_minimum 5
#property indicator_maximum 20
#property indicator_buffers 1
#property indicator_color1 Snow
#define pi 3.14159265358979
input int Startbar = 0; input int Range = 2000; input double wide = 10.0; double Buf[];
string Indicator_Name ;
int GetData(int St,int Ns,const double &hi[],const double &lw[],double &out[]){
int i;
double pt = MathPow(10,Digits);
for(i=0;i<Ns;i++) out[i]=(hi[St+i] - lw[St+i])*pt;
return(i);
}
void Logsd_likelihood(int Ns,double &data[],double &mu,double &sigma2){
int i;
mu =0.0;
sigma2 = 0.0;
for(i=0;i<Ns;i++)mu += MathLog(data[i]);
mu /= Ns;
for(i=0;i<Ns;i++) sigma2 += MathPow((MathLog(data[i])-mu),2);
sigma2 /= Ns;
}
double Logsd_dist(double dt,double w,double mu,double sigma2){
double A,B;
A = 1/MathSqrt(2*pi*sigma2);
B = MathPow((MathLog(dt)-mu),2)/(2 * sigma2);
return(w*A*MathExp(-B)/dt);
}
int OnInit(){
IndicatorBuffers(1);
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,Buf);
return(INIT_SUCCEEDED);
}
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
int i,limit;
double d;
ArraySetAsSeries(high,true);
ArraySetAsSeries(low,true);
static double Mu = 0.0;
static double Sigma2 = 0.0;
if(prev_calculated ==0){
double date[];
ArrayResize(date,Range);
if(GetData( Startbar,Range,high,low,date)<(Range-2)){
Print("データが設定分取得できませんでした。");
return(0);
}
Logsd_likelihood(Range,date,Mu,Sigma2);
if(Mu >0 && Sigma2 >0){
Print("mu=",Mu," Sigma^2=",Sigma2);
}else{
Print("パラメータの推定に失敗しました。");
return(0);
}
}
limit = rates_total-prev_calculated-1;
if(prev_calculated>0)limit++;
for(i=0;i<limit;i++){
d = (high[i+1]-low[i+1])* MathPow(10,Digits);
if(d>0) Buf[i] = -MathLog(Logsd_dist(d,wide,Mu,Sigma2));
}
return(rates_total);
}