时间序列主要特性的分析:TSAnalysis 通用体检工具
一、为什么先给序列「体检」再建模
拿到一段价格或指标序列,很多人第一反应是套模型、做预测。但作者主张先「体检」:用零输入参数的通用工具把序列的核心统计特性算出来,帮你判断这条路值不值得走。理由很实在——相关研究往往耗时费力,且现成脚本的参数含义只有开发者懂、用户未必清楚;如果某个假设在特性层面就不成立(比如明显非平稳、严重厚尾),早期就能驳回,避免把几周时间浪费在错误方向上。通用工具的代价是性能不如专用软件,但换来的是「装好即用、无需调参」,非常适合做第一步的粗筛和假设生成。
文中给出的工具是 TSAnalysis 类,随 TSAnalysis.zip 发布。安装只需把目录整体复制到 MQL5/Scripts 下,无需重命名、无需任何输入参数。运行附带的 TSAexample.mq5,它会准备数据、调用默认浏览器,用 TSAnalysis 类把结果以 HTML 图表形式展示出来——注意类正常运行要求终端启用外部 DLL。卸载更简单:删掉那个目录即可。
二、TSAnalysis 类:零参数通用工具
整个序列分析逻辑封装在 TSAnalysis.mqh 的 TSAnalysis 类里,对外只暴露一个公共方法 Calc,它负责所有计算,之后再调用一个虚方法 Display 把结果呈现出来。显示方式是可以重写的——基类默认生成 HTML 文件再调浏览器,你继承后完全可以改成写数据库、画自有控件等任意形式。输入序列有两个硬性限制:至少 8 个元素(实际应用很少更短);方差不能近零(否则后续除法不稳定)。长度上限则取决于机器内存,两三千个元素的序列通常无压力。违反前两条会中断计算并在日志报错。
Calc 内部用在线算法(one-pass)累积均值、二阶/三阶/四阶总和,避免先存全量再算,省内存也稳数值。得到这些累积量后,就能推导出方差、标准差、偏度、峰度等描述性统计量,以及 Jarque-Bera 正态性检验及其 p 值、调整后的短序列版本。
Mean=0; sum2=0; sum3=0; sum4=0;
for(i=0;i<NumTS;i++) {
n=i+1; delta=TS[i]-Mean; a=delta/n; Mean+=a; // 均值
sum4+=a*(a*a*delta*i*(n*(n-3.0)+3.0)+6.0*a*sum2-4.0*sum3);
b=TS[i]-Mean; sum3+=a*(b*delta*(n-2.0)-3.0*sum2); // 三阶
sum2+=delta*b; // 二阶
}
三、基础统计量:均值、方差、偏度、峰度
这些是一阶到四阶矩。均值与方差/标准差描述位置与离散程度;偏度(skewness)描述分布不对称性——正偏说明右侧有长尾(大涨罕见但幅度大),负偏相反;峰度(kurtosis)描述尾部厚薄,正态分布峰度为 3,超出峰度(excess kurtosis)则减 2 使正态为 0。对交易者而言,价格收益率往往「尖峰厚尾」:偏度告诉你单边极端行情的偏向,峰度告诉你「黑天鹅」出现的频繁程度,直接关系仓位与止损设置。
比如一段收益率偏度明显为负,意味着下跌极端值比上涨更常见或更剧烈,做多时要更狠地前置止损;峰度远高于 3,说明用正态假设算的 VaR 会严重低估风险。这些特性在建模前看一眼,比直接丢进神经网络有用得多。
四、正态性检验:Jarque-Bera 与离群值
对序列做的第一个拟合优度检验通常是 Jarque-Bera 统计量,它用偏度和峰度轻易算出,p 值随序列变长渐近趋于卡方分布(两个自由度)。短序列下 p 值误差显著,所以文中额外算了「调整后的 Jarque-Bera」,能缓解但不完全消除这个偏差。如果 p 值很小,就拒绝「序列服从正态分布」的原假设——这对选模型至关重要:正态假设不成立时,很多基于高斯假设的统计/ML 方法都得打问号。
此外工具会算离群值(outlier)限制线:超出该线的点视为不属于原序列的异常值。限值公式来自《Statistics for Traders》一书。注意:工具只计算并显示这条线,并不删改你的输入序列——离群值是信息不是垃圾,先肉眼判断它是真异常(错单、数据缺口)还是极端行情,再决定去留。
五、直方图与经验分布
直方图把序列分布画出来,柱子数按 Bulashev 的公式 K ≈ (Kurt+1.5)·N^0.4/6 估算后向下取最近的奇整数,且不少于 5。X 轴按标准差单位、Y 轴对应概率密度,方便和理论正态曲线叠放对比。肉眼看直方图是「左偏还是右偏、单峰还是多峰、尾部多厚」最快的方式——多峰往往暗示序列里混了不同状态(趋势段/震荡段),单模型可能拟合不好,需要先分段。
六、自相关(ACF)、偏自相关(PACF)与谱估计
要判断「今天的收益和昨天的收益有没有关系」,看自相关函数 ACF——它算序列与自身滞后版本的相关性;偏自相关 PACF 则剔除中间滞后的干扰,专看某滞后阶的净相关。图上叠加 95% 置信带(随机性检验用恒定带;定 ARIMA 阶用随阶增长的带),超出带的点说明该滞后显著相关。这对识别均值回复、动量持续性、以及定 ARIMA 阶数都直接有用。
更进一步,工具用最大熵法(MEM,一种自回归谱估计)算频谱,并用快速哈特利变换(FHT,基2 DIF 算法)加速——它不像 FFT 涉及复数,输入输出都是实序列,只多一个 1/N 系数就能逆变换。谱估计揭示序列的「主导频率」:低频主导可能是长期趋势,某中频突出可能是周期(如周内效应),高频主导则偏噪声。短序列下参数法(AR)比经典周期图分辨率高得多,但 AR 阶数难定——阶太低过平滑、阶太高不稳定,文中用 IP 阶(取自前面自相关计算)作折中。
// 莱文逊-德宾递归:由自相关系数 R[] 求 AR 系数 A[] 与偏自相关 K[]
void TSAnalysis::LevinsonRecursion(const double &R[], double &A[], double &K[]) {
int p=ArraySize(R); double Em=1.0, km;
for(int m=0;m<p;m++) {
double err=0; for(int i=0;i<m;i++) err+=Am1[i]*R[m-i-1];
km=(R[m]-err)/Em; K[m]=km; A[m]=km;
for(int i=0;i<m;i++) A[i]=Am1[i]-km*Am1[m-i-1];
Em*=(1.0-km*km); ArrayCopy(Am1,A);
}
}
七、在交易中怎么用这些特性
把 TSAnalysis 当「建模前的体检中心」:1) 先看正态性 p 值,决定能不能用高斯假设的方法;2) 看偏度/峰度,给仓位和止损定调(厚尾就别用正态 VaR);3) 看直方图是否多峰,判断是否要分段建模;4) 看 ACF/PACF 哪些滞后显著,定均值回复或动量的窗口、给 ARIMA 定阶;5) 看谱估计的主导频率,找隐藏的周期(如日内/周内节律)。做完这五步,你要么驳回错误假设省下时间,要么拿到一组靠谱的超参数再进精细建模。它不替代模型,但是避免「拿错模型套错数据」的第一道闸门。
八、小结
TSAnalysis 是一个零输入参数的通用工具,把序列的均值、方差、偏度、峰度、Jarque-Bera 正态性检验、离群值、直方图、ACF/PACF、谱估计一次性算出来并可视化。它的价值在「建模前体检」:早拒错误假设、给模型定超参、识别厚尾与周期。记住它只描述不预测,且要求序列至少 8 个元素、方差非零。配合在线统计算法和 FHT 加速,两三千点序列轻松跑——是量化工作流里性价比极高的一步粗筛。