第三章: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 知识体系总览

下面这张图,是我自己总结的这五个库在风险预算中的定位和关系。你一看就明白了。

Python风险分析工具全景图 数据层 Pandas(数据处理、时间序列、数据清洗) 计算层 NumPy(矩阵运算、线性代数) + SciPy(统计分布、优化算法) 优化层 CVXPY(凸优化建模、约束求解) 应用层 Riskfolio-Lib(风险预算、风险平价、组合优化) 数据层 → 计算层 → 优化层 → 应用层,层层递进

嗯,这张图其实已经说得很清楚了。从数据到计算,再到优化和应用,每个库各司其职。你只要把这五个库装好、用熟,风险预算的实战基础就算打牢了。

我个人建议你按这个顺序学:先玩熟NumPy和Pandas,再啃SciPy的统计部分,然后上手CVXPY做几个优化案例,最后用Riskfolio-Lib把整个流程串起来。别贪多,一个一个来。


公众号:蓝海资料掘金营,微信deep3321