统计基础与数据准备:均值、方差、标准差、正态分布、Z-score、数据获取与清洗
各位好,欢迎来到第二章。
上一章我们聊了均值回归的核心思想——价格涨多了会跌,跌多了会涨。但光有想法不够,你得有工具去量化它。说白了,你得知道“涨多了”到底是多少,“跌多了”又该怎么定义。
这一章,我们就来搞定这些基础工具。我敢说,这些统计概念你大学都学过,但真正用在交易里,感觉完全不一样。我自己刚入行时也踩过坑,以为懂公式就能赚钱,结果被市场狠狠教育了一顿。
2.1 均值与方差:描述数据的两个维度
先问个问题:给你一组价格数据,你最想知道什么?
大部分人第一反应是“平均价格”。没错,均值就是最直观的指标。它告诉我们数据的“中心”在哪里。
均值(Mean):所有数据加起来除以个数。
公式:μ = (x₁ + x₂ + ... + xₙ) / n
但光有均值够吗?不够。举个例子:
- 股票A:价格一直在100元附近波动,偶尔到101或99
- 股票B:价格从80元冲到120元,又跌回90元
两只股票的均值可能都是100元,但它们的“性格”完全不同。这时候就需要方差出场了。
方差(Variance)衡量的是数据偏离均值的程度。公式是:
σ² = Σ(xᵢ - μ)² / n
嗯,这里要注意:方差是平方过的,单位也跟着平方了。比如价格是元,方差就是“元²”,这玩意儿不太好直观理解。所以更常用的是标准差——方差开个根号就行。
我的经验:在量化交易中,我习惯用标准差来设置价格通道。比如“价格偏离均值2个标准差”就是一个常见的交易信号。我曾经用这个逻辑做过一个简单的均值回归策略,回测效果还不错,但实盘时发现——嗯,市场极端行情下,2个标准差根本不够用。后来我改成了动态标准差,根据波动率调整阈值。
2.2 正态分布:市场的“理想模型”
正态分布,也叫高斯分布,就是那个钟形曲线。你想想看,自然界里很多现象都符合正态分布:人的身高、考试成绩、测量误差……
在金融领域,我们经常假设资产收益率服从正态分布。为什么?因为正态分布有很好的数学性质,方便我们计算概率。
正态分布的几个关键特征:
- 68%的数据落在均值±1个标准差内
- 95%的数据落在均值±2个标准差内 li>
- 99.7%的数据落在均值±3个标准差内
这个“68-95-99.7法则”在交易中非常实用。比如你发现某只股票的价格偏离均值超过2个标准差,按照正态分布,这种情况发生的概率只有5%。那它大概率会回归——这就是均值回归策略的理论基础。
避坑指南:我曾经天真地以为市场完全服从正态分布,结果在2008年金融危机时吃了大亏。实际上,金融数据有“肥尾”特征——极端事件发生的概率比正态分布预测的要高得多。所以用正态分布做交易时,一定要留个心眼,设置好止损。
2.3 Z-score:标准化的利器
Z-score,说白了就是“距离均值有几个标准差”。公式很简单:
Z = (x - μ) / σ
Z-score的好处是标准化。不同股票的价格尺度不一样,茅台几百块,农业银行几块钱,没法直接比较。但Z-score把它们都变成了“偏离均值的标准差倍数”,这样就能放在一起看了。
举个例子:
- 茅台当前价格1800元,均值1700元,标准差100元 → Z-score = (1800-1700)/100 = 1.0
- 农业银行当前价格3.6元,均值3.0元,标准差0.3元 → Z-score = (3.6-3.0)/0.3 = 2.0
你看,农业银行的Z-score更高,说明它偏离均值的程度更大,回归的“动力”可能更强。
我的习惯:在构建均值回归策略时,我通常用Z-score作为入场信号。当Z-score的绝对值大于2时,我会关注;大于2.5时,我会考虑入场。当然,这个阈值不是固定的,需要根据具体品种和波动率来调整。
2.4 数据获取:从哪里来?
巧妇难为无米之炊。没有数据,再好的策略也是白搭。
我个人常用的数据源有:
- Yahoo Finance:免费,覆盖面广,适合个人研究
- 东方财富:A股数据比较全,有API接口
- Wind/聚宽:专业数据源,收费,但数据质量高
这里用Python的yfinance库举个例子:
import yfinance as yf
# 获取贵州茅台的历史数据
maotai = yf.download('600519.SS', start='2023-01-01', end='2023-12-31')
print(maotai.head())
运行这段代码,你会得到一个DataFrame,包含开盘价、最高价、最低价、收盘价、成交量等字段。嗯,收盘价是我们最常用的。
2.5 数据清洗:脏数据是策略的杀手
数据拿到手,别急着用。我敢打赌,90%的原始数据都有问题。常见的问题包括:
- 缺失值:某一天没有交易数据(节假日、停牌)
- 异常值:价格突然跳空,或者成交量异常放大
- 重复值:同一时间戳出现多条数据
清洗步骤我一般这样处理:
- 检查缺失值:用
isnull()函数看看哪些列有空值 - 填充或删除:对于少量缺失,可以用前向填充(ffill)或插值;缺失太多就直接删除
- 去重:用
drop_duplicates()干掉重复行 - 处理异常值:用Z-score或IQR方法识别并处理
代码示例:
import pandas as pd
import numpy as np
# 假设df是原始数据
# 1. 检查缺失值
print(df.isnull().sum())
# 2. 前向填充
df.fillna(method='ffill', inplace=True)
# 3. 去重
df.drop_duplicates(inplace=True)
# 4. 用Z-score识别异常值(以收盘价为例)
z_scores = np.abs((df['Close'] - df['Close'].mean()) / df['Close'].std())
df = df[z_scores < 3] # 保留Z-score小于3的数据
避坑指南:我曾经在回测时发现策略表现特别好,兴奋得不行。结果一查,原来是数据里包含了未来信息——我用的是当天的收盘价来计算信号,但实际交易中,收盘价是在收盘后才确定的。这种“前视偏差”是新手最容易犯的错误。记住:只能用历史数据计算信号,不能用未来数据。
2.6 知识体系总览
说了这么多,我们来画个图,把这一章的知识结构串起来。
这张图把本章的内容分成了两大块:统计基础和数据准备。左边是理论工具,右边是实操技能。两者缺一不可。
2.7 小结
这一章我们聊了:
- 均值和方差——描述数据的基本特征
- 正态分布——市场的理想模型,但要注意肥尾
- Z-score——标准化的利器,用于识别极端值
- 数据获取与清洗——从源头保证策略质量
我个人觉得,统计基础这部分虽然看起来简单,但真正理解透了,对后续的策略构建帮助巨大。尤其是Z-score,它几乎是所有均值回归策略的基石。
下一章,我们会把这些工具用起来,构建一个完整的均值回归策略。到时候你会发现,原来这些统计概念真的能赚钱——前提是你用对了地方。