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 验证
⚠️ 注意: 我曾经见过有人装了Anaconda又装原生Python,结果两个打架。建议只保留一个Python环境,用conda管理。

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、不能做空,这些约束都能轻松处理。

🔑 关键点: SciPy的优化器对初始值敏感。我建议多试几个初始点,或者用网格搜索先粗筛一遍,避免陷入局部最优。

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 知识体系总览

下面这张图,把本章的核心逻辑串起来了。你想想看,从数据输入到策略输出,每一步都离不开这些库。

Python量化投资工具箱 数据获取与清洗 Pandas + NumPy 数学计算与优化 NumPy + SciPy 结果可视化 Matplotlib 风险预算核心应用 协方差矩阵 → 权重优化 → 风险分解 时间序列处理 非线性优化求解 风险贡献可视化 四个库协同工作,覆盖量化投资全流程

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