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