2017/03/14

(Open-Close)のヒストグラムを再現してみました。

今回は、Jupyter Notebookの勉強も兼ねなが進めていきます。^^;方法として、まずTickVolumeをヒストリカルデータから見積もります。次に、作成したTickVolume数だけランダムウォークさせて実際の値幅との違いを見ます。

まずは、TIckVolumeの作成です。


次に密度分布の作成です。


いろいろなペアと時間で試してみました。




まとめ

 試行回数が異なるランダムウォークの密度分布がほぼ(Open-Close)の密度分布と重なるということは、(Open-Close)のヒストグラムは、分散が異なる正規分布の集合体で表せれる。ということですね。。

2015/08/08

外部エネルギーが加えられることによりエントロピーの増大が妨げられるとさ。。

はじめに

ご無沙汰しております^^;
 さてさて今回は、チャート内の特異値(Bar)を見える化する指標を作成することにしました。


手順


まず初めに、各Barの値として(高値-安値)《以下 高安値》を採用しました。
高安値を採用したことにより対数正規分布を連続確率分布として採用します。
参考記事:ベキ分布?  対数正規分布を調べてみた。  検証してみました。

あとは、分布のパラメータを推定して、各高安値を当てはめて発生確率を求めました。そして出来上がったのがコレです。。。。。なんだか全然見える化できていない。。orz


 そこで、選択情報量の定義を利用して左記のように見やすくしました。自画自賛w
※ちなみに情報量の定義などは、こちら








まとめ

  今回実施した特異値に理由付けを行ってみた結果が以下の画像です。

大きく指標が跳ね上がった部分は、何らかの理由付けができそうです。いや~黒田日銀総裁の円安是正発言は、まいりました。^^;
 さてさて、今回の指標は、高安値が高いから指標が跳ね上がるだけでなく極端に低い場合でも跳ね上がります。右のチャート部分は、時間当たり2ティックしかなく特異値として指標が跳ね上がりました。発生確率が低い値(高安値)を見える化する事が目的なのでこんな感じとなります。データの抜けが原因かな?。。
  ここでお題の話を少し。。情報エントロピーという情報量の定義指標があって(参考)、情報を受け取ると情報エントロピーは、最小となる。つまり、事象の不確かさが、最小となる。つまり、(ここからは、妄想。。)不確実さが低減されるのであれば、秩序だった動きが現れるんじゃないの?だったら∑(゚Д゚;)!! いや~妄想ってホント素敵ですねw 夏があまり好きではないおっさんの戯言でありました。


コード

DLは、ココ

//+------------------------------------------------------------------+
//|                                                       impact.mq4 |
//|                                         Copyright 2015, bighope. |
//|                        http://expertadviser-bighope.blogspot.jp/ |
//+------------------------------------------------------------------+
#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;     //データの取得開始Bar数
input int Range        = 2000;     //平均と偏差を導くためのデータ数
input double  wide    = 10.0;       //確率密度×○倍(特に意味がありません)

double Buf[];
string Indicator_Name ;

//+------------------------------------------------------------------+
//|GetData
//|out[Ns]     データの取得配列
//|Ns            データの取得数
//|St            開始インデックス
//+------------------------------------------------------------------+  
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);
}
//+------------------------------------------------------------------+
//| Logsd_likelihood 対数正規分布 最尤法によるパラメータ推定
//|data[Ns]     対象データ
//|Ns           データの取得数
//|mu           対数正規分布パラメータ
//|sigma2       対数正規分布パラメータ (sigma^2) 
//+------------------------------------------------------------------+  
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;
}
//+------------------------------------------------------------------+
//|Logsd_dist  対数正規分布の確率密度
//|dt              データ
//|w               対象データの幅
//|mu              対数正規分布パラメータ
//|sigma2          対数正規分布パラメータ  (sigma^2) 
//+------------------------------------------------------------------+ 
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); 
}
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(){
    IndicatorBuffers(1);
    SetIndexStyle(0,DRAW_LINE);
    SetIndexBuffer(0,Buf);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+