scipy_demo · 统计工具箱 2026-09-27

内容:
年化波动率:这只股票一年颠簸得多厉害
夏普比率:每承担一分风险,换回多少超额收益
t 检验:你赚的是实力还是运气?
scipy 安装:pip install scipy

导入与主入口

import numpy as np # numpy:数值计算 import pandas as pd # pandas:表格处理 from scipy import stats # scipy.stats:统计学工具(工具箱) # from scipy import stats:从 scipy 包里导入 stats 子模块 from quant_data import get_kline # 从数据工具箱拿"拉数据"的函数 if __name__ == "__main__":

0. 复用上期的数据

# ========== 0. 复用上期的数据 ========== df = get_kline() # 拉默认股票日线 df["收益率"] = df["close"].pct_change() # 新增一列:每日收益率 r = df["收益率"].dropna() # 去掉空行(第一天没有前一日,收益率为空) print(f"\n共 {len(r)} 个交易日收益率样本") # 打印样本数量

1. 年化波动率

日波动率 × √252 = 年化波动率(252 是 A 股一年大概的交易日数量)
# ========== 1. 年化波动率 ========== vol_daily = r.std() # 日波动率:每天收益率的"颠簸程度" vol_year = vol_daily * np.sqrt(252) # 年化:乘以根号 252 # np.sqrt(252):开根号。252 是 A 股一年大概的交易日数量 print("\n===== 年化波动率 =====") print(f"日波动率 : {vol_daily:.4f}") # {:.4f}:保留 4 位小数 print(f"年化波动率: {vol_year:.2%}") # {:.2%}:按百分比显示,保留 2 位小数

2. 夏普比率

夏普比率 = 超额收益 ÷ 风险,再年化。(>1 不错,>2 很能打)
# ========== 2. 夏普比率 ========== rf = 0.02 # 无风险利率:假设 2%(比如国债收益,可换成你认可的数) excess_daily = r.mean() - rf / 252 # 平均日收益 减去 每天的无风险收益 sharpe = excess_daily / r.std() * np.sqrt(252) # 超额收益 ÷ 风险,再年化 print("\n===== 夏普比率 =====") print(f"年化收益率 : {r.mean() * 252:.2%}") # 平均日收益 × 252 = 年化 print(f"夏普比率 : {sharpe:.2f} (>1 不错,>2 很能打)")

3. t 检验:实力还是运气?

ttest_1samp(数据, 0):检验"数据的平均值是不是 0"。主要看 p 值:
p < 0.05 → 收益显著不为 0,大概率是实力
p ≥ 0.05 → 收益不够显著,可能只是运气
# ========== 3. t 检验:实力还是运气? ========== t_stat, p_value = stats.ttest_1samp(r, 0) # ttest_1samp(数据, 0):检验"数据的平均值是不是 0"(scipy 提供) # 返回两个数:t 统计量、p 值。我们主要看 p 值 print("\n===== t 检验 =====") print(f"t 统计量: {t_stat:.3f}") print(f"p 值 : {p_value:.4f}") if p_value < 0.05: # 条件分支:p 值小于 0.05 才叫"显著" print("p < 0.05 → 收益显著不为 0,大概率是实力,不是运气") else: # 否则 print("p >= 0.05 → 收益不够显著,可能只是运气")

核心要点速览

年化波动率:r.std() × √252
夏普比率:超额收益 ÷ 风险 × √252
t 检验:stats.ttest_1samp(r, 0)
年化收益:r.mean() × 252
无风险利率:rf = 0.02(可调)
显著性门槛:p < 0.05
年化因子:√252(A股交易日)
安装:pip install scipy
金句: std() × √252 算波动率, ttest_1samp() 验实力 —— scipy 把"统计学"变成"一行代码"。

运行输出 · python .\scipy_demo.py

PS> python .\scipy_demo.py [数据源] akshare 不可用(ProxyError),尝试 baostock... login success! logout success! [数据源] baostock 获取成功,共 178 条 共 177 个交易日收益率样本 ===== 年化波动率 ===== 日波动率 : 0.0155 年化波动率: 24.68% ===== 夏普比率 ===== 年化收益率 : -13.92% 夏普比率 : -0.65 (>1 不错,>2 很能打) ===== t 检验 ===== t 统计量: -0.473 p 值 : 0.6369 p >= 0.05 → 收益不够显著,可能只是运气
关键结论:年化波动率 24.68%;夏普比率 -0.65(负值,表现不佳);
t 检验 p = 0.6369 ≥ 0.05,收益不够显著,可能只是运气。