第三章:Python风险分析工具——NumPy、Pandas、SciPy、CVXPY、Riskfolio-Lib库介绍与安装
做量化投资,说白了就是跟数据打交道。而Python之所以能成为这个领域的王者,靠的就是它那一整套生态工具。今天咱们就来聊聊风险分析中最核心的五个库:NumPy、Pandas、SciPy、CVXPY和Riskfolio-Lib。
我个人习惯把这五个库分成两组。前三兄弟——NumPy、Pandas、SciPy——是基本功,你写任何策略都绕不开它们。后两个——CVXPY和Riskfolio-Lib——是进阶武器,专门用来解决优化问题,尤其是风险预算这种带约束的分配问题。
一句话总结:NumPy管计算,Pandas管数据,SciPy管统计,CVXPY管优化,Riskfolio-Lib管组合构建。五个库配合起来,基本能覆盖风险预算的全流程。
3.1 NumPy:一切计算的基石
NumPy,全称Numerical Python。它是Python科学计算的底层引擎。你想想看,我们做风险预算,要算协方差矩阵、要算收益率序列、要做矩阵分解——这些操作底层全是NumPy在撑腰。
我在项目中遇到过最典型的场景:从数据库拉出500只股票的日收益率数据,第一件事就是用np.array()转成矩阵格式。为什么?因为Pandas的DataFrame虽然好用,但纯数值计算还是NumPy快,尤其是做大规模蒙特卡洛模拟的时候,速度差距能到10倍以上。
import numpy as np
# 创建一个收益率矩阵(假设10只股票,252个交易日)
returns = np.random.randn(252, 10) * 0.02 # 模拟日收益率,标准差2%
# 计算协方差矩阵
cov_matrix = np.cov(returns, rowvar=False)
# 计算相关系数矩阵
corr_matrix = np.corrcoef(returns, rowvar=False)
print("协方差矩阵形状:", cov_matrix.shape)
print("相关系数矩阵形状:", corr_matrix.shape)
避坑指南:我曾经在计算协方差矩阵时忘了设置rowvar=False,结果算出来的矩阵维度完全不对。默认情况下,np.cov()认为每一行是一个变量,而我们通常把每列当作一个资产。这个坑我踩过,你千万别再踩。
3.2 Pandas:数据处理的瑞士军刀
Pandas,说白了就是Python界的Excel。但它比Excel强太多了——处理时间序列、处理缺失值、做数据对齐,这些操作在Pandas里就是一行代码的事。
做风险预算,最核心的数据结构就是收益率时间序列。Pandas的DataFrame天然支持日期索引,这让我们做滚动窗口计算、做回测分析变得极其方便。
import pandas as pd
import numpy as np
# 创建日期索引
dates = pd.date_range('2020-01-01', periods=500, freq='B') # 500个交易日
# 模拟5只基金的收益率数据
funds = ['基金A', '基金B', '基金C', '基金D', '基金E']
returns_df = pd.DataFrame(
np.random.randn(500, 5) * 0.015,
index=dates,
columns=funds
)
# 计算滚动波动率(60天窗口)
rolling_vol = returns_df.rolling(window=60).std() * np.sqrt(252)
# 查看前几行
print(rolling_vol.head())
我个人习惯用Pandas做数据清洗。比如从Wind或聚宽拉回来的数据,经常有空值、有异常值。用df.dropna()、df.fillna()、df.clip()这些方法,几分钟就能把数据收拾得干干净净。
3.3 SciPy:统计与优化的百宝箱
SciPy,全称Scientific Python。它建立在NumPy之上,提供了更高级的科学计算功能。对我们做风险预算来说,最常用的就是它的统计模块和优化模块。
你想想看,风险预算里要算VaR(在险价值)、要算CVaR(条件在险价值)、要做分布拟合——这些全得靠SciPy。尤其是scipy.stats这个子模块,里面封装了几十种概率分布函数。
from scipy import stats
import numpy as np
# 假设某基金的日收益率服从正态分布
mu = 0.0008 # 日收益率均值
sigma = 0.015 # 日收益率标准差
# 计算95%置信水平下的VaR
var_95 = stats.norm.ppf(0.05, loc=mu, scale=sigma)
print(f"95% VaR(日频): {var_95:.4f}")
# 计算CVaR(条件在险价值)
# 其实就是尾部损失的期望
cvar_95 = mu - sigma * stats.norm.pdf(stats.norm.ppf(0.05)) / 0.05
print(f"95% CVaR(日频): {cvar_95:.4f}")
注意:实际金融市场中,收益率并不服从正态分布。它有尖峰厚尾的特征。我建议你用stats.t(t分布)或者stats.skewnorm(偏正态分布)来做拟合,结果会更贴近真实情况。
3.4 CVXPY:凸优化的利器
CVXPY,这是个专门用来求解凸优化问题的库。为什么它对风险预算这么重要?因为风险预算本质上就是一个带约束的优化问题——你要在给定风险预算比例的前提下,找到最优的资产权重。
我记得第一次接触风险预算时,手动推导了半天KKT条件,结果发现用CVXPY几行代码就搞定了。它把数学建模和求解器解耦了,你只需要描述问题,它自动帮你选求解器。
import cvxpy as cp
import numpy as np
# 假设我们有4个资产
n_assets = 4
cov_matrix = np.array([
[0.1, 0.02, 0.01, 0.03],
[0.02, 0.08, 0.015, 0.02],
[0.01, 0.015, 0.12, 0.025],
[0.03, 0.02, 0.025, 0.09]
])
# 定义优化变量(资产权重)
w = cp.Variable(n_assets)
# 目标:最小化组合方差
portfolio_variance = cp.quad_form(w, cov_matrix)
objective = cp.Minimize(portfolio_variance)
# 约束:权重和为1,且不能做空
constraints = [
cp.sum(w) == 1,
w >= 0
]
# 求解
problem = cp.Problem(objective, constraints)
problem.solve()
print("最优权重:", w.value)
print("最小方差:", portfolio_variance.value)
小技巧:CVXPY默认使用ECOS或SCS求解器。如果你的问题规模很大(比如上千只股票),我建议安装MOSEK或GUROBI这类商业求解器,速度能快一个数量级。
3.5 Riskfolio-Lib:专为组合优化而生
Riskfolio-Lib,这个库是专门为投资组合优化设计的。它把Markowitz均值-方差模型、Black-Litterman模型、风险平价模型、风险预算模型全都封装好了。你不需要自己写优化代码,直接调API就行。
我个人觉得,Riskfolio-Lib最大的价值在于它内置了多种风险度量指标——波动率、CVaR、CDaR、最大回撤、尾端风险等等。你只需要指定风险度量方式,它自动帮你做优化。
import riskfolio as rp
import pandas as pd
import numpy as np
# 准备收益率数据
dates = pd.date_range('2020-01-01', periods=500, freq='B')
returns = pd.DataFrame(
np.random.randn(500, 5) * 0.02,
index=dates,
columns=['资产A', '资产B', '资产C', '资产D', '资产E']
)
# 构建组合优化对象
port = rp.Portfolio(returns=returns)
# 设置风险预算模型
port.risk_budget = {
'资产A': 0.2,
'资产B': 0.2,
'资产C': 0.2,
'资产D': 0.2,
'资产E': 0.2
}
# 计算最优权重
w_rb = port.optimization(model='Classic',
rm='MV', # 风险度量:均值-方差
obj='MinRisk', # 目标:最小化风险
hist=True)
print("风险预算模型权重:")
print(w_rb)
3.6 安装指南
安装这些库其实很简单。我建议你用pip一次性安装,省得一个一个来。
# 基础三件套
pip install numpy pandas scipy
# 优化工具
pip install cvxpy
# 组合优化专用库
pip install riskfolio-lib
# 如果遇到依赖问题,可以试试conda
conda install -c conda-forge numpy pandas scipy cvxpy riskfolio-lib
常见问题:CVXPY在Windows上安装时,有时会因为缺少Visual C++编译环境而报错。我建议你直接去微软官网下载"Visual C++ Redistributable"安装包,装完重启一下就好了。
3.7 知识体系总览
下面这张图,是我自己总结的这五个库在风险预算中的定位和关系。你一看就明白了。
嗯,这张图其实已经说得很清楚了。从数据到计算,再到优化和应用,每个库各司其职。你只要把这五个库装好、用熟,风险预算的实战基础就算打牢了。
我个人建议你按这个顺序学:先玩熟NumPy和Pandas,再啃SciPy的统计部分,然后上手CVXPY做几个优化案例,最后用Riskfolio-Lib把整个流程串起来。别贪多,一个一个来。
公众号:蓝海资料掘金营,微信deep3321