3、基础统计特征:均值、方差、偏度、峰度在交易数据中的应用、滚动窗口统计量

聊到交易数据的统计特征,很多人第一反应就是「算个平均值看看」。嗯,这没错,但远远不够。我做了这么多年量化,发现真正能从数据里挖出Alpha的,往往不是那些花里胡哨的模型,而是对基础统计量的深刻理解。

说白了,价格序列和收益率序列就像一个人的心电图。均值告诉你心脏跳得有多快,方差告诉你心跳稳不稳,偏度和峰度则能暴露出一些「异常搏动」——而这些异常,往往就是超额收益的来源。

3.1 均值:趋势的锚点

均值是最直观的统计量。在交易数据里,我们通常关注两种均值:

  • 价格均值:比如过去20日的平均收盘价(MA20),这是趋势跟踪的基础
  • 收益率均值:比如过去60日的平均日收益率,用来衡量一段时间的「赚钱效应」

我个人习惯把均值当作「回归的引力中心」。价格偏离均值太远,迟早要拉回来——这就是均值回归策略的逻辑基础。

实战经验: 我在做期货CTA策略时发现,单纯用价格均值做回归信号,胜率其实不高。后来我把均值换成「成交量加权均价」(VWAP),效果明显提升。为什么?因为VWAP包含了成交量的信息,更能反映真实的市场成本。

3.2 方差与标准差:波动率的度量

方差衡量的是数据偏离均值的程度。在金融里,我们更常用标准差(方差的平方根),因为它和价格单位一致。

标准差在交易中有两个核心用途:

  1. 风险度量:标准差越大,价格波动越剧烈,风险越高
  2. 信号过滤:当价格突破「均值±n倍标准差」时,往往意味着极端行情

你想想看,如果一只股票过去20天的标准差是2%,今天突然涨了5%,这已经偏离均值2.5个标准差。这种极端情况要么是趋势启动,要么是噪音——怎么判断?我一般会结合成交量来看。

小技巧: 计算标准差时,记得用「样本标准差」(ddof=1),而不是总体标准差。因为我们的数据只是历史样本,不是全量数据。这个细节我曾经踩过坑,回测结果漂亮得不行,实盘一跑就崩——后来发现是标准差算错了。

3.3 偏度:不对称性的信号

偏度衡量的是数据分布的不对称程度。简单说:

  • 正偏度:右尾更长,意味着有更多的大涨
  • 负偏度:左尾更长,意味着有更多的大跌
  • 零偏度:对称分布(比如正态分布)

在交易里,偏度是个被很多人忽视的Alpha来源。我记得有一次分析某只小盘股的收益率分布,发现它的偏度高达1.8——这意味着它经常出现「突然拉升」的情况。后来我基于这个特征做了一个事件驱动策略,效果相当不错。

注意: 偏度对异常值非常敏感。我曾经用一个月的数据算偏度,结果因为某一天的黑天鹅事件,偏度从0.3直接飙到2.1。所以计算偏度时,建议至少用60个以上的样本点,并且做一下异常值处理。

3.4 峰度:尾部风险的预警

峰度衡量的是数据分布的「尖峭程度」和「尾部厚度」。金融数据有个特点:峰度通常远大于3(正态分布的峰度)。

为什么?因为市场经常出现「肥尾」——极端事件发生的概率比正态分布预测的要高得多。

峰度的实际应用:

  • 高峰度(>3):意味着极端行情频繁,适合做波动率策略
  • 低峰度(<3):意味着市场相对平稳,适合做趋势策略

我个人习惯把峰度和偏度结合起来看。比如:负偏度+高峰度,这是典型的「崩盘前兆」——左尾厚且尖,说明市场随时可能暴跌。这个组合信号我在2015年股灾前就捕捉到过,可惜当时没敢重仓做空。

3.5 滚动窗口统计量:动态视角

静态的统计量只能告诉你「过去整体怎么样」,但交易需要的是「现在怎么样」。所以我们要用滚动窗口——也就是滑动时间窗,实时计算最新的统计特征。

滚动窗口的核心参数有两个:

参数 说明 常见取值
窗口大小 每次计算用多少条数据 20、60、120(日线)
步长 每次滑动多少条数据 1(逐日滚动)

下面是我常用的滚动统计量计算代码:

import pandas as pd
import numpy as np

def rolling_stats(price_series, window=20):
    """
    计算滚动窗口的均值、标准差、偏度、峰度
    """
    df = pd.DataFrame(index=price_series.index)
    df['rolling_mean'] = price_series.rolling(window).mean()
    df['rolling_std'] = price_series.rolling(window).std()
    df['rolling_skew'] = price_series.rolling(window).skew()
    df['rolling_kurt'] = price_series.rolling(window).kurt()
    return df

# 示例:计算某股票日收益率的滚动统计量
returns = pd.Series([0.01, -0.02, 0.03, 0.005, -0.01, ...])
stats = rolling_stats(returns, window=20)
print(stats.tail())
避坑指南: 我曾经在滚动窗口里直接用默认参数,结果发现前19天的数据全是NaN。后来才意识到,滚动窗口需要至少window个数据才能算出第一个有效值。所以实际使用时,要么填充前期的NaN,要么从第window天开始才生成信号。

3.6 知识体系总览

下面这张图把本章的核心逻辑串起来了。你可以看到,基础统计量从不同维度刻画了交易数据的特征,而滚动窗口则让这些特征「活」了起来。

基础统计特征在交易数据中的应用 交易数据(价格/收益率) 均值(Mean) 方差/标准差 偏度(Skew) 峰度(Kurt) 趋势跟踪 均值回归策略 风险度量 布林带信号 事件驱动策略 不对称性套利 尾部风险预警 波动率策略 滚动窗口统计量(动态计算) Alpha信号生成

这张图展示了从原始交易数据到Alpha信号的完整链路。四个基础统计量分别从不同角度刻画市场状态,而滚动窗口让这些特征具备了时效性。最终,我们把这些动态特征组合起来,就能生成有效的交易信号。

核心要点: 均值告诉你「在哪里」,方差告诉你「有多散」,偏度告诉你「往哪偏」,峰度告诉你「有多险」。四个维度缺一不可。

好了,这一章的内容就到这里。记住,统计量本身不是目的,目的是从数据里找到那些「不寻常」的模式。下次当你看到一只股票的偏度突然飙升时,不妨多问一句:是不是有什么事情要发生了?

专注资料整理