纯随机性检测也成白噪声检测,是专门用来检测序列是否为纯随机序列的一种方法。我们知道如果一个序列是纯随机序列,那么它的序列值之间应该没有任何关联关系,这是一种理论上才会出现的理想状况。实际上,由于观察序列的有限性,导致纯随机数序列的样本自相关系数不会绝对为零。Barlett证明,如果一个时间序列是纯随机的,得到一个观察期为n的观察序列{Xi:i=1,2,......,n},那么该序列的延迟非零期的样板自相关系数将近似服从均值为零、方差为序列观察期数的倒数的正态分布。根据Barlett定理,我们可以构造检验统计量来检查序列的纯随机性。
一 假设条件
由于序列之间的变异性是绝对的,而相关性是偶然的,所以假设条件如下确定:
- 原假设:延迟期数小于或等于m期的序列值之间相互独立。
- 备选假设:延迟期数小于或等于m期的序列值之间有相关性。
二 检验统计量
1 Q统计量
Box和Pierce推导出了Q统计量
根据正态分布和卡方分布之间的关系,我们很容易推导出Q统计量近似服从自由度为m的卡方分布:
当Q统计量大于卡方分布的分位点,或者统计量的P值小于a时候,可以以1-a的置信水平拒绝原假设,认为该序列为非白噪声序列,否则,接受原假设,认为序列为纯随序列。
2 LB统计量
在实际应用中人们发现Q统计量在大样本长夜(n很大的场合)检验效果很好,但是在小样本场合就不太精确,为了弥补这一缺陷,Box和Ljong又推导出LB统计量
Box和Ljung证明LB统计量同样近似的服从自由度为m的卡方分布。
实际上LB统计量就是Box和Pierce的Q统计量的修正,所以人们习惯上吧他们统称为Q统计量,分别纪委QNP和QLB统计量,在各种检验场合普遍采用的Q统计量通常指的就是LB统计量。
import datetime as dt
import pandas as pd
import statsmodels.api as sm
from statsmodels import *
from statsmodels.tsa import *
import tushare as ts
import warnings
import ffn
warnings.simplefilter('ignore')
%matplotlib inline
import seaborn
seaborn.mpl.rcParams['figure.figsize'] = (10.0, 6.0)
seaborn.mpl.rcParams['savefig.dpi'] = 90
ts.get_stock_basics()
stocks = ts.get_stock_basics()
codes = stocks.index.values
def get_return(codes):
sh_return = pd.DataFrame()
index = None
for i, code in enumerate(codes):
dw = ts.get_k_data(code)
if len(dw) >= 640:
print '\r', i, code,
sh_return[code]= dw.close
index = pd.to_datetime(dw.date)
if len(sh_return) == len(index):
sh_return.index = index
return ffn.to_returns(sh_return).dropna()
def get_BoxLjung(sh_return):
q_stat = pd.DataFrame()
p_value = pd.DataFrame()
for code in sh_return.columns.values:
ret = sh_return[code]
q,p = stattools.q_stat(stattools.acf(ret)[1:], len(ret))
q_stat[code] = q
p_value[code] = p
return q_stat,p_value
sh_return = get_return(codes)
q_stat,p_value = get_BoxLjung(sh_return)
ru如果P值显著大于显著性水平a,序列就不能拒绝纯随机的原假设。平稳序列通常具有短期相关性,如果序列值之间有显著的相关关系,通常只存在延迟比较短的序列之间。所以一个序列如果如果短期序列延迟值之间都不存在相关性,通常长期延迟之间就更不会存在相关关系。
另一方面,假如一个平稳序列显示显著的短期相关性,那么该序列就一定不是白噪声序列,我们就可以对序列值之间存在的相关性进行分析。假如此时考虑的延迟时期数太长,反而可能淹没了该序列的短期相关性。因为平稳序列只要延迟足够长,自相关系数都会收敛于零。