Python Stats Packages

// quick reference for quant research & interview prep

scipy.stats SciPy 底层统计分布 / 假设检验
分布对象(rv_continuous / rv_discrete)
每个分布都是一个对象,支持 pdf/pmf, cdf, ppf, rvs, fit, stats 等方法。
from scipy import stats

# 正态分布
d = stats.norm(loc=0, scale=1)
d.pdf(1.96)        # f(x)
d.cdf(1.96)        # F(x) ≈ 0.975
d.ppf(0.975)       # 分位数 ≈ 1.96
d.rvs(size=1000)   # 随机采样

# 拟合:MLE
mu, sigma = stats.norm.fit(data)

# 常用分布
stats.t(df=30)           # t 分布
stats.chi2(df=5)         # χ² 分布
stats.f(dfn=2, dfd=20)  # F 分布
stats.poisson(mu=3)     # Poisson
stats.binom(n=10, p=.3) # Binomial
假设检验
返回 (statistic, pvalue),部分返回完整 result 对象(含 CI)。
# 单样本 t 检验
stats.ttest_1samp(x, popmean=0)

# 双样本 t 检验
stats.ttest_ind(x, y, equal_var=False)  # Welch

# 配对 t 检验
stats.ttest_rel(x, y)

# 正态性检验
stats.shapiro(x)        # n < 5000 推荐
stats.kstest(x, 'norm') # K-S 检验
stats.jarque_bera(x)    # JB 检验

# 相关性
stats.pearsonr(x, y)    # Pearson + p-val
stats.spearmanr(x, y)   # Spearman
stats.kendalltau(x, y)  # Kendall τ

# 非参数
stats.mannwhitneyu(x, y)
stats.kruskal(x, y, z)
多元统计 / 其他
多元正态、Bootstrap、核密度估计。
# 多元正态
mvn = stats.multivariate_normal(mean=[0,0], cov=[[1,.5],[.5,1]])
mvn.pdf([0, 0])
mvn.rvs(500)

# KDE(核密度估计)
kde = stats.gaussian_kde(data)
kde.evaluate(grid)

# Box-Cox 变换
xt, lam = stats.boxcox(x)

# Quantile / percentile
stats.scoreatpercentile(x, 95)
stats.percentileofscore(x, val)
statsmodels statsmodels 回归 / 时间序列 / 推断统计
OLS 线性回归
R 风格 formula 接口,.summary() 输出完整推断表。支持 HC/HAC 鲁棒标准误。
import statsmodels.formula.api as smf
import statsmodels.api as sm

# Formula 接口(推荐)
res = smf.ols('y ~ x1 + x2 + C(sector)', data=df).fit()
print(res.summary())
res.params       # 系数
res.bse          # 标准误
res.rsquared     # R²
res.fvalue       # F 统计量

# 鲁棒标准误
res_hc = res.get_robustcov_results(cov_type='HC3')
res_hac = res.get_robustcov_results(cov_type='HAC', maxlags=5)

# 矩阵接口
X = sm.add_constant(X_raw)
res2 = sm.OLS(y, X).fit()
$\hat{\beta} = (X^\top X)^{-1} X^\top y$,$\text{Var}(\hat\beta) = \sigma^2(X^\top X)^{-1}$
GLM / Logit / Probit
广义线性模型框架,Logit/Probit 用于二分类,Poisson 用于计数。
# Logistic Regression
res = smf.logit('y ~ x1 + x2', data=df).fit()
res.predict(df)       # P(Y=1|X)
res.get_margeff()     # 边际效应

# Probit
smf.probit('y ~ x', data=df).fit()

# Poisson GLM
sm.GLM(y, X, family=sm.families.Poisson()).fit()

# Negative Binomial
smf.negativebinomial('y ~ x', data=df).fit()
时间序列:ARIMA / GARCH
ARIMA、SARIMAX、状态空间模型;GARCH 需配合 arch 库。
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.tsa.statespace.sarimax import SARIMAX

# ARIMA(p,d,q)
model = ARIMA(ts, order=(2,1,1))
res = model.fit()
res.forecast(steps=10)

# 平稳性检验
from statsmodels.tsa.stattools import adfuller, kpss
adfuller(ts)   # ADF 检验
kpss(ts)       # KPSS 检验

# ACF / PACF
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
plot_acf(ts, lags=40)

# VAR 向量自回归
from statsmodels.tsa.vector_ar.var_model import VAR
VAR(df_multi).fit(maxlags=5)
检验工具箱
异方差检验、自相关检验、多重检验校正等。
from statsmodels.stats import diagnostic, stattools

# 异方差:White & Breusch-Pagan
diagnostic.het_white(res.resid, res.model.exog)
diagnostic.het_breuschpagan(res.resid, res.model.exog)

# 自相关:Durbin-Watson / Ljung-Box
stattools.durbin_watson(res.resid)
diagnostic.acorr_ljungbox(res.resid, lags=[10])

# 多重检验校正
from statsmodels.stats.multitest import multipletests
multipletests(pvals, method='fdr_bh')  # Benjamini-Hochberg

# F 检验(线性约束)
res.f_test('x1 = x2')
sklearn scikit-learn 机器学习 / 特征工程 / 交叉验证
统一 Estimator API
所有模型都遵循 fit / predict / score / transform 接口,方便 Pipeline 组合。
from sklearn.linear_model import Ridge, Lasso, ElasticNet
from sklearn.ensemble import RandomForestRegressor, GradientBoostingClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline

pipe = Pipeline([
    ('scaler', StandardScaler()),
    ('ridge',  Ridge(alpha=1.0))
])
pipe.fit(X_train, y_train)
pipe.predict(X_test)
pipe.score(X_test, y_test)   # R² / accuracy
Ridge: $\min_\beta \|y - X\beta\|^2 + \alpha\|\beta\|^2$,Lasso: $+ \alpha\|\beta\|_1$
交叉验证 & 超参数调优
cross_val_score 快速评估;GridSearchCV / RandomizedSearchCV 搜索最优超参。
from sklearn.model_selection import (
    cross_val_score, KFold, TimeSeriesSplit,
    GridSearchCV, RandomizedSearchCV
)

# 时序 CV(金融中常用)
tscv = TimeSeriesSplit(n_splits=5)
scores = cross_val_score(model, X, y, cv=tscv, scoring='neg_mean_squared_error')

# Grid Search
gs = GridSearchCV(
    Ridge(), {'alpha': [0.01, 0.1, 1, 10]},
    cv=tscv, scoring='r2'
)
gs.fit(X, y)
gs.best_params_   # {'alpha': 0.1}
评估指标
回归、分类、排序指标一应俱全。
from sklearn import metrics

# 回归
metrics.mean_squared_error(y, yhat)
metrics.mean_absolute_error(y, yhat)
metrics.r2_score(y, yhat)

# 分类
metrics.accuracy_score(y, yhat)
metrics.roc_auc_score(y, prob)
metrics.classification_report(y, yhat)
metrics.confusion_matrix(y, yhat)

# 信息准则(近似)via cross-entropy
metrics.log_loss(y, prob)
特征工程 & 降维
PCA、StandardScaler、PolynomialFeatures 等预处理工具。
from sklearn.decomposition import PCA
from sklearn.preprocessing import PolynomialFeatures, RobustScaler
from sklearn.feature_selection import SelectKBest, f_regression

# PCA
pca = PCA(n_components=5)
X_pc = pca.fit_transform(X)
pca.explained_variance_ratio_

# 多项式特征
poly = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly.fit_transform(X)

# 单变量特征选择
sel = SelectKBest(f_regression, k=10).fit(X, y)
sel.get_support()
matplotlib Matplotlib 底层绘图引擎 / 完全可控
Figure / Axes 对象模型
优先用 OO 接口(fig, ax = plt.subplots()),而非 pyplot 状态机接口,便于多子图控制。
import matplotlib.pyplot as plt
import numpy as np

fig, axes = plt.subplots(2, 2, figsize=(10, 8))
ax = axes[0, 0]

x = np.linspace(-3, 3, 200)
ax.plot(x, np.sin(x), color='#00e5ff', lw=2, label='sin')
ax.fill_between(x, np.sin(x), alpha=0.15)
ax.set_title('Sine Wave', fontsize=13)
ax.legend()

# 双 y 轴
ax2 = ax.twinx()
ax2.plot(x, np.cos(x), color='#fb923c', ls='--')

plt.tight_layout()
plt.savefig('out.png', dpi=150, bbox_inches='tight')
常用图形速查
散点图、柱状图、直方图、热力图等。
# 散点图
ax.scatter(x, y, c=colors, s=20, alpha=0.7, cmap='viridis')

# 柱状图
ax.bar(categories, values, color='#a78bfa', edgecolor='none')

# 直方图
ax.hist(data, bins=50, density=True, alpha=0.7)

# 热力图(相关矩阵)
im = ax.imshow(corr, cmap='coolwarm', vmin=-1, vmax=1)
fig.colorbar(im, ax=ax)

# 误差棒
ax.errorbar(x, y, yerr=err, fmt='o', capsize=4)

# 填充置信区间
ax.fill_between(x, lower, upper, alpha=0.2)
seaborn Seaborn 高级统计可视化 / 基于 Matplotlib
统计图形
一行代码实现带置信区间的回归图、分布图、热力图,与 pandas DataFrame 无缝配合。
import seaborn as sns

# 带 CI 的回归线
sns.regplot(x='x', y='y', data=df, ci=95)

# 分布 + KDE
sns.histplot(data, kde=True, stat='density')
sns.kdeplot(data, bw_adjust=1.5)

# 相关矩阵热力图
sns.heatmap(df.corr(), annot=True, fmt='.2f', cmap='RdBu_r', center=0)

# Pairplot(多变量探索)
sns.pairplot(df, hue='sector')

# 箱图 / 小提琴图
sns.boxplot(x='group', y='ret', data=df)
sns.violinplot(x='group', y='ret', data=df, inner='quartile')
Figure-level vs Axes-level
Figure-level(lmplot, FacetGrid)返回独立对象;Axes-level(regplot, histplot)可嵌入已有 Axes。
# FacetGrid 分组绘图
g = sns.FacetGrid(df, col='sector', row='year', height=3)
g.map(sns.histplot, 'daily_return', kde=True)

# lmplot(带分组回归)
sns.lmplot(x='mktcap', y='ret', hue='sector', data=df)

# 嵌入已有 Axes
fig, ax = plt.subplots()
sns.regplot(x='x', y='y', data=df, ax=ax)
ax.set_title('My custom title')
numpy NumPy(统计函数) 向量化基础运算 / 最快
描述统计
所有函数都支持 axis= 参数,沿特定轴计算,配合 keepdims=True 保持维度。
import numpy as np

a = np.random.randn(1000, 50)  # 1000 rows, 50 features

np.mean(a, axis=0)      # 每列均值
np.std(a, axis=0, ddof=1) # 样本标准差
np.var(a, axis=0, ddof=1)
np.median(a, axis=0)
np.percentile(a, [5, 25, 75, 95], axis=0)
np.quantile(a, 0.95, axis=0)

# 协方差 / 相关矩阵
np.cov(a.T)       # (50×50) 协方差矩阵
np.corrcoef(a.T)  # (50×50) 相关系数矩阵
随机数生成(推荐新 API)
np.random.default_rng(seed) 替代旧的全局状态 API,可重复且线程安全。
# 新 API(推荐)
rng = np.random.default_rng(seed=42)
rng.normal(0, 1, size=(1000,))
rng.uniform(0, 1, size=100)
rng.multivariate_normal(mu, Sigma, size=500)
rng.choice(arr, size=50, replace=False)  # 无放回采样
rng.integers(0, 10, size=20)

# Cholesky 法模拟相关收益
L = np.linalg.cholesky(Sigma)
Z = rng.standard_normal((50, 10000))
X_corr = L @ Z    # shape (50, 10000)

summary 对比总览 选哪个包?
核心用途 优势 典型场景(Quant)
scipy.stats 概率分布、假设检验、基础统计 分布对象全面,底层可靠 检验因子 IC 是否显著、分布拟合、VaR 计算
statsmodels 回归推断、时序建模、GLM 完整推断表(SE、p-val、CI)、鲁棒 SE、HAC 因子回归、Fama-MacBeth、ARIMA 预测、协整检验
scikit-learn ML 建模、特征工程、交叉验证 Pipeline、丰富评估指标、超参搜索 机器学习选股、Ridge/Lasso 特征压缩、随机森林信号
matplotlib 底层绘图,完全可控 灵活性最高,发表级图形 自定义 P&L 曲线、vol surface 3D 图、回测报告
seaborn 高级统计可视化 代码简洁,DataFrame 友好 EDA、相关矩阵、分组分布探索
numpy 向量化计算基础 速度最快,底层支撑 协方差矩阵、Cholesky 采样、滚动统计量

决策流程
需要 p 值 / 置信区间 / 推断?→ statsmodelsscipy.stats
需要 概率分布对象(pdf/cdf/rvs)?→ scipy.stats
需要 预测 / 机器学习?→ scikit-learn
需要 时序模型(ARIMA/VAR)?→ statsmodels
需要 快速 EDA 可视化?→ seaborn
需要 精细控制图形?→ matplotlib
需要 大规模矩阵运算?→ numpy