程序库: 统计功能

 

统计功能:

统计功能的集合,令您能够计算时间序列的某些值。

作者: Haruna Nakamura

 
如何实施?
 
ziad8978:
如何实施?

感谢您对我的库感兴趣。使用它非常简单,主要是对一维数组进行操作。

例如,您可以使用 detrend函数 轻松去除时间序列中的线性趋势:
detrend(timeSerie, detrendResultArray);


timeSerie 是一个包含价格的数组,detrendResultArray 应该是一个空数组,您的结果将存储在其中。因此,调用函数后,您将得到一个包含去趋势时间序列的数组,您可以对其进行进一步分析(例如检查序列是否静止)。

例如,假设数组中包含 Currency1(可能是后向),则可以用它预测下一个值:

double detrendedSerie[];
double forecastedValue;

//使 Currency1 向后存储(数组中的最后一个值为最新价格)
detrend(Currency1, detrendedSerie);

if(dickeyFuller(detrendedSerie)){
  forecastedValue = AR1(detrendedSerie); 
}

if(forecastedValue > detrendedSerie[ArraySize(detrendedSerie)-1]){
  //购买
}else{
  //出售
}

另一个有趣的函数是带符号积分。在当前形式下使用它非常简单,只需调用函数定义极限和多项式度(可以很小),
,即可获得给定积分的良好近似值。您还可以编辑 "foo "函数,对 f(x) = x 以外的函数进行积分。

 
ziad8978:
如何实施?
 
ziad8978:
如何实施?
 
tinakorn kunchai:
附加的文件:
 
非常感谢你,Herajika,分享了这个代码!!!
 
Rodrigo Malacarne:
非常感谢Herajika 分享这个代码!!很高兴听到您喜欢这个代码!
很高兴听到你喜欢它!如果您使用该库创建了一些 EA/指示器,请将链接粘贴到这里。
 
Haruna Nakamura:
很高兴听到您喜欢它!如果您使用该库创建了一些 EA/指示器,请在此处粘贴链接。

你好,Herajika

我正在尝试用其他统计/数学软件复制您分享的代码中的 Dickey-Fuller 检验统计。特别是,我正在使用 Wolfram Mathematica。

请考虑您使用的原始文章(来自 Scribd)中的数据:

double data[] = {6109.58, 6157.84, 5850.22, 5976.63, 6382.12, 6437.74, 6877.68, 6611.79, 7040.23, 6842.36, 6512.78, 6699.44, 
                 6700.20, 7092.49, 7558.50, 7664.99, 7589.78, 7366.89, 6931.43, 5530.71, 5611.90, 6208.28, 6343.87, 6485.84};

为了使用您的代码获得测试统计数据,我删除了 Print 函数前的注释,如下代码所示:

bool dickeyFuller(double &arr[])
  {
// n=25 50 100 250 500 >500
// {-2.62, -2.60, -2.58, -2.57, -2.57, -2.57};
   double cVal;
   bool result;
   int n=ArraySize(arr);
   double tValue;
   double corrCoeff;
   double copyArr[];
   double difference[];
   ArrayResize(difference,n-1);
//---
   for(int i=0; i<n-1; i++)
     {
      difference[i]=arr[i+1]-arr[i];
     }
//---
   ArrayCopy(copyArr,arr,0,0,n-1);
   corrCoeff=correlation(copyArr,difference);
   tValue=corrCoeff*MathSqrt((n-2)/1-MathPow(corrCoeff,2));
//---
   if(n<25)
     {
      cVal=-2.62;
        }else{
      if(n>=25 && n<50)
        {
         cVal=-2.60;
           }else{
         if(n>=50 && n<100)
           {
            cVal=-2.58;
              }else{
            cVal=-2.57;
           }
        }
     }
   Print(tValue); //--- 测试统计?
   result=tValue>cVal;
   return(result);
  }

如前所述,我更感兴趣的是测试统计本身,而不是测试结论。从这个意义上说,使用您分享的代码,我得到的是:

void OnStart()
  {
//--- 来源:http://pt.scribd.com/doc/80877200/How-to-do-a-Dickey-Fuller-Test-using-Excel#
   double data[] = {6109.58, 6157.84, 5850.22, 5976.63, 6382.12, 6437.74, 6877.68, 6611.79, 7040.23, 6842.36, 6512.78, 6699.44, 
                     6700.20, 7092.49, 7558.50, 7664.99, 7589.78, 7366.89, 6931.43, 5530.71, 5611.90, 6208.28, 6343.87, 6485.84};
//---
   dickeyFuller(data);
  }

因为我现在打印的是包含测试统计数据的行,所以我得到的是......:

-1.719791886975595

然而,原文指出 t 统计量为 1.8125。

然而,当我使用 Wolfram Mathematica 处理相同的数据集时,我得到的结果却是: 1.8125:


您知道是什么原因导致 3 次测试得到 3 个不同的测试结果吗?


Malacarne

 

你好!关于文章(http://pt.scribd.com/doc/80877200/How-to-do-a-Dickey-Fuller-Test-using-Excel#) 中的结果与我的实现之间的差异,
,请注意,在上述网站上,符号(+、-)的显示存在一些问题。因此,文章中的结果实际上是-1.8125。

至于与 Wolfram Mathematica 的差异,可能是不同的实现使用不同的临界值,计算 tValues 的方法也不同。在 Matlab 中做同样的操作,我得到了
另一个结果(0.6518)。

不过,如果在 excel 中做同样的尝试,应该会显示出接近 -1.8125 的结果。


Herajika

 
Haruna Nakamura:

你好!关于文章(http://pt.scribd.com/doc/80877200/How-to-do-a-Dickey-Fuller-Test-using-Excel#) 中的结果与我的实现之间的差异,
,请注意,在上述网站上,符号(+、-)的显示存在一些问题。因此,文章中的结果实际上是-1.8125。

至于与 Wolfram Mathematica 的差异,可能是不同的实现使用不同的临界值,计算 tValues 的方法也不同。在 Matlab 中做同样的操作,我得到了
另一个结果(0.6518)。

不过,如果在 excel 中做同样的尝试,应该会显示出接近 -1.8125 的结果。


Herajika

你好,Herajika

感谢您的回复。那么,在这种情况下,什么统计数据才是正确的?

原文显示的测试统计量值是否有误?


Malacarne

附注:在 Mathematica 中,如果我不使用 "TestStatistic "选项,得到的结果与 MatLab 中的相似。