4、Python环境搭建:NumPy、Pandas、SciPy、Matplotlib等库的安装与基础用法
做量化投资,说白了就是跟数据打交道。你想想看,没有趁手的工具,再好的策略也跑不起来。我个人习惯把Python环境比作一个工具箱——NumPy是扳手,Pandas是万用表,SciPy是计算器,Matplotlib是示波器。缺了哪个,干活都不顺手。
这一章,咱们就把这些工具装好,再简单试试手。嗯,这里要注意,版本问题经常坑人,我会把避坑的点都指出来。
4.1 环境准备:先搭好地基
我建议直接用Anaconda,别自己折腾原生Python。为什么?因为Anaconda把科学计算常用的库都打包好了,省得你一个个装。我在项目中遇到过好几次,新手自己装库装到崩溃,最后发现是依赖冲突。
安装步骤很简单:
- 去Anaconda官网下载对应系统的安装包
- 安装时记得勾选“Add Anaconda to my PATH environment variable”
- 装完后打开终端,输入
conda --version验证
4.2 核心库安装:一行命令搞定
打开终端或Anaconda Prompt,依次执行以下命令:
conda install numpy pandas scipy matplotlib
# 或者用pip
pip install numpy pandas scipy matplotlib
我个人习惯用conda,因为它会自动处理依赖关系。你想想看,如果某个库依赖另一个库的特定版本,pip有时候会直接覆盖,而conda会帮你协调好。
验证安装是否成功,可以写个小脚本:
import numpy as np
import pandas as pd
import scipy as sp
import matplotlib.pyplot as plt
print(f"NumPy版本: {np.__version__}")
print(f"Pandas版本: {pd.__version__}")
print(f"SciPy版本: {sp.__version__}")
print(f"Matplotlib版本: {plt.matplotlib.__version__}")
如果没报错,说明环境搭好了。嗯,这里要注意,版本号可能不一样,只要不低于我下面列的最低版本就行。
| 库名 | 推荐版本 | 最低版本 | 用途 |
|---|---|---|---|
| NumPy | 1.24+ | 1.20 | 数组运算、线性代数 |
| Pandas | 2.0+ | 1.5 | 数据处理、时间序列 |
| SciPy | 1.11+ | 1.8 | 优化、统计、插值 |
| Matplotlib | 3.7+ | 3.5 | 数据可视化 |
4.3 NumPy基础:一切从数组开始
NumPy的核心就是ndarray,也就是多维数组。做风险预算时,协方差矩阵、权重向量,全是数组。
先看几个最常用的操作:
import numpy as np
# 创建数组
weights = np.array([0.3, 0.4, 0.3]) # 三个资产的权重
returns = np.array([0.05, 0.08, 0.06]) # 预期收益率
# 计算组合收益
portfolio_return = np.dot(weights, returns)
print(f"组合收益: {portfolio_return:.4f}")
# 创建协方差矩阵(模拟)
cov_matrix = np.array([
[0.01, 0.002, 0.001],
[0.002, 0.02, 0.003],
[0.001, 0.003, 0.015]
])
# 计算组合方差
portfolio_variance = np.dot(weights.T, np.dot(cov_matrix, weights))
print(f"组合方差: {portfolio_variance:.6f}")
我在项目中遇到过一个问题:用 np.dot 做矩阵乘法时,维度搞错了。你想想看,如果权重是(3,)而协方差是(3,3),直接乘没问题。但如果权重是(3,1)的列向量,就得转置。所以,我建议养成好习惯——用 @ 运算符代替 np.dot,更直观:
portfolio_variance = weights.T @ cov_matrix @ weights
np.eye(n) 创建单位矩阵,用 np.zeros((m,n)) 创建全零矩阵。做风险预算时,经常需要初始化。
4.4 Pandas基础:数据处理的瑞士军刀
Pandas的DataFrame,说白了就是Excel的Python版。但比Excel强太多了——处理时间序列、合并数据、分组聚合,都是它的强项。
做量化投资,最常打交道的就是收益率序列。看个例子:
import pandas as pd
import numpy as np
# 创建日期范围
dates = pd.date_range('2024-01-01', periods=5, freq='D')
# 创建收益率数据
data = {
'沪深300': [0.01, -0.005, 0.02, 0.015, -0.01],
'中证500': [0.008, 0.01, -0.003, 0.025, 0.005],
'国债指数': [0.002, 0.001, 0.003, 0.002, 0.001]
}
df = pd.DataFrame(data, index=dates)
print(df)
# 计算协方差矩阵
cov_df = df.cov()
print("\n协方差矩阵:")
print(cov_df)
# 计算相关系数
corr_df = df.corr()
print("\n相关系数矩阵:")
print(corr_df)
嗯,这里要注意,Pandas的 cov() 默认是样本协方差,分母是n-1。如果你想要总体协方差,可以设置 ddof=0。我曾经在这个细节上吃过亏——算出来的风险预算跟理论值对不上,查了半天才发现是自由度的问题。
4.5 SciPy基础:优化与统计
SciPy在风险预算里最常用的就是优化和统计模块。做风险平价时,需要求解一个非线性方程组,SciPy的 optimize 模块正好派上用场。
先看个简单的:用SciPy计算正态分布的分位数,这在VaR计算中很常见。
from scipy import stats
from scipy.optimize import minimize
# 计算95%置信水平下的VaR分位数
confidence = 0.95
z_score = stats.norm.ppf(confidence)
print(f"95%置信水平对应的z值: {z_score:.4f}")
# 简单的优化示例:最小化组合方差
def portfolio_vol(weights, cov_matrix):
return np.sqrt(weights.T @ cov_matrix @ weights)
# 假设三个资产,等权重初始化
n_assets = 3
init_weights = np.array([1/3, 1/3, 1/3])
# 约束条件:权重和为1
constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
bounds = [(0, 1) for _ in range(n_assets)]
result = minimize(portfolio_vol, init_weights,
args=(cov_matrix,),
method='SLSQP',
bounds=bounds,
constraints=constraints)
print(f"最小方差组合权重: {result.x.round(4)}")
print(f"最小方差: {result.fun:.6f}")
我个人习惯用SLSQP方法,因为它支持等式和不等式约束。做风险预算时,权重和为1、不能做空,这些约束都能轻松处理。
4.6 Matplotlib基础:把数据画出来
做量化投资,光看数字不行,得画图。Matplotlib就是干这个的。我个人习惯用 plt.style.use('seaborn-v0_8') 让图表更好看。
import matplotlib.pyplot as plt
import numpy as np
# 设置风格
plt.style.use('seaborn-v0_8')
# 生成模拟数据
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=100, freq='D')
returns = np.random.randn(100) * 0.02 + 0.001
cum_returns = np.cumprod(1 + returns)
# 画净值曲线
plt.figure(figsize=(10, 6))
plt.plot(dates, cum_returns, linewidth=2, label='组合净值')
plt.title('模拟组合净值曲线', fontsize=14)
plt.xlabel('日期')
plt.ylabel('净值')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
嗯,这里要注意,如果是在Jupyter Notebook里画图,记得加一行 %matplotlib inline,不然图不会显示。我曾经在远程服务器上跑代码,忘了这个,折腾了半天才发现是显示模式的问题。
4.7 知识体系总览
下面这张图,把本章的核心逻辑串起来了。你想想看,从数据输入到策略输出,每一步都离不开这些库。
4.8 避坑指南
最后,分享几个我踩过的坑:
- 版本冲突:我曾经同时装了TensorFlow和旧版NumPy,结果TensorFlow要求NumPy 1.19以下,而Pandas需要1.20以上。解决办法是用conda创建虚拟环境,每个项目独立环境。
- 中文乱码:Matplotlib默认不支持中文。加两行代码解决:
plt.rcParams['font.sans-serif'] = ['SimHei']和plt.rcParams['axes.unicode_minus'] = False。 - 性能问题:处理百万级数据时,别用Pandas的
iterrows(),那玩意儿慢得离谱。用向量化操作,或者用apply()配合NumPy函数。
环境搭好了,工具也试过了。下一章,咱们就正式进入风险预算的核心——用这些工具去计算风险贡献、做风险分解。嗯,到时候你会发现,前面这些基础操作,全都能用上。
公众号:蓝海数据掘金营,微信deep3321