Descargar MetaTrader 5

Distribución de Weibull

En este apartado se muestran las funciones para trabajar con la distribución de Weibull. Estas permiten calcular la densidad, la probabilidad, los cuantiles y generar números pseudoaleatorios, distribuidos conforme a la ley de Weibull. La distribución de Weibull se describe con la siguiente fórmula:

pdf_weibull_distribution

donde:

  • x – valor de la magnitud aleatoria
  • a –  parámetro de distribución (shape)
  • b – parámetro de distribución (scale)

DemoWeibullDistribution

Aparte del cálculo de diferentes magnitudes aleatorias, se ha implementado la posibilidad de trabajar con sus matrices.  

Función

Descripción

MathProbabilityDensityWeibull

Calcula la densidad de probabilidad de la distribución de Weibull

MathCumulativeDistributionWeibull

Calcula el valor de la función de la distribución de la probabilidad de Weibull

MathQuantileWeibull

Calcula el valor de la función inversa de la distribución de Weibull para la probabilidad indicada

MathRandomWeibull

Genera una magnitud/matriz pseudoaleatoria de magnitudes pseudoaleatorias, distribuidas según la ley de Weibull

MathMomentsWeibull

La función calcula los valores numéricos teóricos de los 4 primeros momentos de la distribución de Weibull.

Ejemplo:

#include <Graphics\Graphic.mqh>
#include <Math\Stat\Weibull.mqh>
#include <Math\Stat\Math.mqh>
#property script_show_inputs
//--- input parameters
input double a_par=1;      // parámetro de distribución (shape)
input double b_par=5;      // parámetro de distribución (scale)
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- desactivamos la exhibición del gráfico de precio
   ChartSetInteger(0,CHART_SHOW,false);
//--- inicializamos el generador de números aleatorios  
   MathSrand(GetTickCount());
//--- generamos una muestra de la magnitud aleatoria
   long chart=0;
   string name="GraphicNormal";
   int n=1000000;       // número de valores en la muestra
   int ncells=51;       // número de intervalos en el histograma
   double x[];          // centros de los intervalos del histograma
   double y[];          // número de valores de la muestra que han entrado en el intervalo
   double data[];       // muestra de valores aleatorios 
   double max,min;      // valor máximo y mínimo en la muestra
//--- obtenemos la muestra de la distribución de Weibull
   MathRandomWeibull(a_par,b_par,n,data);
//--- calculamos los datos para construir el histograma
   CalculateHistogramArray(data,x,y,max,min,ncells);
//--- obtenemos los límites de la secuencia y el salto para construir la curva teórica
   double step;
   GetMaxMinStepValues(max,min,step);
   step=MathMin(step,(max-min)/ncells);
//--- obtenemos los datos calculados teóricamente en el intervalo [min,max]
   double x2[];
   double y2[];
   MathSequence(min,max,step,x2);
   MathProbabilityDensityWeibull(x2,a_par,b_par,false,y2);
//--- escalamos
   double theor_max=y2[ArrayMaximum(y2)];
   double sample_max=y[ArrayMaximum(y)];
   double k=sample_max/theor_max;
   for(int i=0; i<ncells; i++)
      y[i]/=k;
//--- mostramos el gráfico
   CGraphic graphic;
   if(ObjectFind(chart,name)<0)
      graphic.Create(chart,name,0,0,0,780,380);
   else
      graphic.Attach(chart,name);
   graphic.BackgroundMain(StringFormat("Weibull distribution a=%G b=%G",a_par,b_par));
   graphic.BackgroundMainSize(16);
//--- desactivamos el escalado automático del eje X
   graphic.XAxis().AutoScale(false);
   graphic.XAxis().Max(max);
   graphic.XAxis().Min(min);
//--- plot all curves
   graphic.CurveAdd(x,y,CURVE_HISTOGRAM,"Sample").HistogramWidth(6);
//--- y ahora construimos la curva teórica de la densidad de la distribución
   graphic.CurveAdd(x2,y2,CURVE_LINES,"Theory");
   graphic.CurvePlotAll();
//--- plot all curves
   graphic.Update();
  }
//+------------------------------------------------------------------+
//|  Calculate frequencies for data set                              |
//+------------------------------------------------------------------+
bool CalculateHistogramArray(const double &data[],double &intervals[],double &frequency[],
                             double &maxv,double &minv,const int cells=10)
  {
   if(cells<=1) return (false);
   int size=ArraySize(data);
   if(size<cells*10) return (false);
   minv=data[ArrayMinimum(data)];
   maxv=data[ArrayMaximum(data)];
   double range=maxv-minv;
   double width=range/cells;
   if(width==0) return false;
   ArrayResize(intervals,cells);
   ArrayResize(frequency,cells);
//--- establecemos los centros de los intervalos
   for(int i=0; i<cells; i++)
     {
      intervals[i]=minv+i*width;
      frequency[i]=0;
     }
//--- rellenamos las frecuencias de entrada en el intervalo
   for(int i=0; i<size; i++)
     {
      int ind=int((data[i]-minv)/width);
      if(ind>=cells) ind=cells-1;
      frequency[ind]++;
     }
   return (true);
  }
//+------------------------------------------------------------------+
//|  Calculates values for sequence generation                       |
//+------------------------------------------------------------------+
void GetMaxMinStepValues(double &maxv,double &minv,double &stepv)
  {
//--- calculamos la amplitud absoluta de la secuencia, para obtener la precisión de normalización
   double range=MathAbs(maxv-minv);
   int degree=(int)MathRound(MathLog10(range));
//--- normalizamos los valores máximos y mínimos con la precisión establecida
   maxv=NormalizeDouble(maxv,degree);
   minv=NormalizeDouble(minv,degree);
//--- el salto de generación de la secuencia también lo estableceremos a partir de la precisión indicada
   stepv=NormalizeDouble(MathPow(10,-degree),degree);
   if((maxv-minv)/stepv<10)
      stepv/=10.;
  }