文章 "希尔伯特-施密特独立性判据(HSIC)"

 

新文章 希尔伯特-施密特独立性判据(HSIC)已发布:

本文讨论了非参数 HSIC(希尔伯特-施密特独立性判据)统计检验,该检验旨在识别数据中的线性和非线性依赖关系。本文提出了两种用 MQL5 语言计算 HSIC 的算法实现:精确置换测试和伽马近似法。该方法的有效性通过模拟特征与目标变量之间非线性关系的合成数据得到了验证。

交易者在处理金融工具报价时的主要任务是构建一个具有正数学期望值的交易系统(EA)。在设计此类系统时,通常假设用于训练和后续交易的数据中存在隐藏的依赖关系。然而,通常不会考虑对该假设进行统计检验的问题。人们认为可以通过对样本外数据进行测试来获得间接答案。

同时,对于特征与目标变量之间是否存在关系这一问题,一个具有统计意义的答案至关重要。肯定的答案支持使用预测模型,而否定的答案则让人不禁要问:算法到底想预测什么?

在数理统计中,随机变量之间是否存在概率依赖关系的问题是通过独立性检验来回答的。其中一项标准是 HSIC 统计检验,这是一种强大的非参数方法,由统计学家 Arthur Gretton 于 2005 年开发。

与仅能识别线性关系的相关系数不同,HSIC 能够同时检测线性和非线性关系。正因如此,它在机器学习中被广泛用于特征选择、因果分析和其他任务。在本文中,我们将分析 HSIC 的工作原理,并在 MQL5 环境中实现它。


作者:Evgeniy Chernish

 
谢谢,非常有意思。
 
请帮我解释一下我卡住的地方。也就是说,HSIC 能够显示任意经典函数Y=F(X1, X2, ...) 的依赖关系吗?
 
fxsaber #:
请帮我解释一下我的困惑。也就是说,HSIC 能够显示任何经典函数Y=F(X1, X2, ...) 的依赖关系吗?
恐怕并非对任何函数都成立,因为这种依赖关系可能非常微弱(例如由于强噪声),这种情况下它可能无法捕捉到。但总的来说,如果数据中存在有意义的信息,该检验就能检测出来。
 
Evgeniy Chernish #:
对任何人来说可能都不行,因为相关性可能非常微弱(例如由于噪声过大),这种情况下它可能无法检测到。不过,如果数据中确实存在有意义的内容,该测试就能检测出来。

我采用了另一类数据。

// Y - 符号的柱状图,X1 - 位于Y前面的柱状图,X2 - 位于X1前面的柱状图。
bool Fill( double &X1[], double &X2[], double &Y[], const int Size = 1000,
          const datetime Time = 0, const string Symb = NULL )
{
  int Pos = iBarShift(Symb, PERIOD_CURRENT, Time ? Time : TimeCurrent());
  
  return((CopyClose(Symb, PERIOD_CURRENT, Pos, Size, Y) == Size) &&  
         (CopyClose(Symb, PERIOD_CURRENT, Pos += Size, Size, X1) == Size) &&  
         (CopyClose(Symb, PERIOD_CURRENT, Pos += Size, Size, X2) == Size));
} 


在提供的重排脚本中进行了如下替换。

if (SData == Nonlinear_dependence){
/*
double x1 [];
MathRandomUniform(-5,5,data_,x1);
double x2 [];
MathRandomUniform(-5,5,data_,x2);
double NormD[];
MathRandomNormal(0,0.1,data_,NormD);
double y[];
ArrayResize(y,data_);
for (int i=0;i<data_;i++){
y[i] = pow(x1[i],2)*cos(M_PI*x2[i]) + NormD[i]; //  Y = X1^2 * cos(pi*X2) + 噪声
}
*/

double x1[], x2[], y[];

Fill(x1, x2, y, data_);


以下是EURUSD的结果。

Test6 (EURUSD,M1)       Коэффициент корреляции (X1, Y) = 0.3757
Test6 (EURUSD,M1)       Коэффициент корреляции (X2, Y) = -0.4280
Test6 (EURUSD,M1)       ----------------Nonlinear_dependence-------------
Test6 (EURUSD,M1)       Время выполнения: 12.688 seconds
Test6 (EURUSD,M1)       -----------------------------------
Test6 (EURUSD,M1)       Number observations 1000
Test6 (EURUSD,M1)       HSIC: 0.01050641
Test6 (EURUSD,M1)       p-value: 0.0000
Test6 (EURUSD,M1)       Critical value: 0.0010
Test6 (EURUSD,M1)       Отвергаем H0: Наблюдения зависимы


随后基于随机增量创建了一个自定义符号,并在该符号上运行了测试。

Test6 (RANDOM_EURUSD,M1)        Коэффициент корреляции (X1, Y) = -0.6103
Test6 (RANDOM_EURUSD,M1)        Коэффициент корреляции (X2, Y) = -0.4954
Test6 (RANDOM_EURUSD,M1)        ----------------Nonlinear_dependence-------------
Test6 (RANDOM_EURUSD,M1)        Время выполнения: 12.656 seconds
Test6 (RANDOM_EURUSD,M1)        -----------------------------------
Test6 (RANDOM_EURUSD,M1)        Number observations 1000
Test6 (RANDOM_EURUSD,M1)        HSIC: 0.00900188
Test6 (RANDOM_EURUSD,M1)        p-value: 0.0000
Test6 (RANDOM_EURUSD,M1)        Critical value: 0.0009
Test6 (RANDOM_EURUSD,M1)        Отвергаем H0: Наблюдения зависимы


为什么第二种情况会出现相关性?粗略地说,这三个向量(它们是随机变量的累积和)之间似乎存在相关性。

 
fxsaber #:
...

为什么第二种情况存在相关性?粗略地说,这三个向量作为随机变量的累积和,之间似乎存在相关性。

这种相关性确实存在,因为使用的随机数生成器相当简单(我推测您使用的是标准实现,可以例如在梅森涡旋上进行验证)。

另一个问题是——这种相关性有多强?对此我有些困惑,恳请作者阐明如何正确解读所得的指标。

[删除]  
fxsaber #:

获取了另一类数据。


在提供的重排脚本中进行了如下替换。


EURUSD的交易结果。


随后基于随机增量创建了一个自定义符号,并在该符号上运行了该策略。


为什么第二种情况存在相关性?粗略地说,这三个向量作为随机变量的累积和,之间似乎存在相关性。

AKF-SB是非平稳的,试着将时间滞后设大一些,例如X与Y的滞后为50。如果我通过手机查看代码时没看错的话。随着滞后时间的增加,相关性会按幂律衰减。
 
fxsaber #:

获取了另一类数据。


在提供的重排脚本中进行了如下替换。


EURUSD的交易结果。


随后基于随机增量创建了一个自定义符号,并在该符号上运行了该策略。


为什么第二种情况存在相关性?粗略地说,这三个向量作为随机变量的累积和,之间似乎存在相关性。

HSIC 不能用于非平稳序列。需要取的不是价格,而是价格增量。皮尔逊相关系数 之所以也显示“相关性”,原因与此相同。
 
Andrey Dik #:

这种(依赖关系)肯定存在,因为使用的RNG相当简单(我猜您使用的是系统自带的,可以试着在梅森涡旋上验证一下,例如)。

另一个问题是——这种依赖关系的强度究竟如何?对此我有些困惑,恳请作者说明如何正确解读所得的指标。

遗憾的是,HSIC 无法衡量相关性的强度,只能判断数据之间是否存在关联。
[删除]  
一篇很有意思的文章,之前不知道还有这种方法,谢谢。与互信息(Mutual information)相比,它是否具有某些假设性的优势?因为互信息是使用最广泛的。

我还注意到,使用快速MO模型来确定相关性通常比使用那些通常较慢的各种准则更快。虽然按理说应该是相反的 :)
 
Maxim Dmitrievsky #:
这篇文章很有意思,之前不知道还有这种方法,谢谢。与互信息(Mutual information)相比,这种方法是否存在某些理论上的优势?因为互信息是使用最广泛的。
据我所知,那里需要显式地构建分布,这相当费事。