🔴
入学要求
💯
能力测试
🛣️
课程安排
🕹️
研究资源

第3讲:NumPy入门 (Introduction to NumPy)

💡

查看全集:💎Quantopia量化分析56讲

引言

NumPy作为Python的核心科学计算库,在Quantopian量化平台上发挥着关键作用。它提供高效的多维数组支持及丰富的数学函数,特别适合处理投资组合优化等需要线性代数运算的场景。本文将带您掌握NumPy在金融分析中的核心应用技巧。

一、NumPy数组基础

1.1 创建数组

import numpy as np

stock_list = [3.5, 5, 2, 8, 4.2]
returns = np.array(stock_list)
print(returns)  # 输出: [3.5 5.  2.  8.  4.2]

# 创建二维数组
A = np.array([[1, 2], [3, 4]])
print(A.shape)  # 输出: (2, 2)

1.2 数组索引与切片

print(returns[1:3])    # 输出: [5. 2.]
print(A[0, :])         # 输出: [1 2]
print(A[:, 0])         # 输出: [1 3]

二、数组运算与统计

2.1 数学函数应用

print(np.log(returns))  # 对数运算
print(np.max(returns))  # 最大值: 8.0

2.2 统计计算

mean_return = np.mean(returns)
std_dev = np.std(returns)
print(f"均值: {mean_return:.2f}, 标准差: {std_dev:.2f}")

三、缺失值处理

v = np.array([1, 2, np.nan, 4, 5])

# 方法1:过滤NaN
clean_v = v[~np.isnan(v)]
print(np.mean(clean_v))  # 输出: 3.0

# 方法2:使用nan函数
print(np.nanmean(v))     # 输出: 3.0

四、投资组合分析

4.1 生成模拟资产

N = 10  # 10个资产
days = 100  # 100个交易日
returns = np.zeros((N, days))

# 生成基准资产
base_returns = np.random.normal(1.01, 0.03, days)
returns[0] = base_returns

# 生成相关资产
for i in range(1, N):
    returns[i] = base_returns + np.random.normal(0.001, 0.02, days)

4.2 计算投资组合收益

weights = np.random.uniform(0, 1, N)
weights /= weights.sum()  # 归一化权重

portfolio_return = np.dot(weights, [np.mean(r)*100 for r in returns])
print(f"预期组合收益率: {portfolio_return:.2f}%")

五、线性代数核心应用

5.1 矩阵运算基础

A = np.random.rand(3,5)
B = np.random.rand(5,2)

# 合法矩阵乘法
result = np.dot(A, B)  # 结果矩阵维度 (3,2)

5.2 投资组合方差计算

cov_matrix = np.cov(returns)
weights = weights.reshape(-1, 1)  # 转换为列向量

portfolio_var = weights.T @ cov_matrix @ weights
portfolio_vol = np.sqrt(portfolio_var)
print(f"组合波动率: {portfolio_vol[0][0]:.4f}")

六、关键概念解析

6.1 组合方差的基本概念

投资组合的方差反映了整体风险水平。计算组合方差需要考虑:

6.2 从简单情况开始理解

如果资产之间完全独立(相关性为0),组合方差计算很简单:

组合方差 = (权重1)² × (资产1方差) + (权重2)² × (资产2方差) + ...

6.3 现实情况:资产间存在相关性

实际上,资产间往往存在相关性,需要考虑协方差:

组合方差 = Σ(权重i × 权重j × 资产i与j的协方差)
其中 i,j 遍历所有资产对

6.4 协方差矩阵的概念

协方差矩阵是一个方阵,包含:

示例代码:

# 计算协方差矩阵
cov_mat = np.cov(returns)

# 计算组合方差
portfolio_variance = np.dot(np.dot(weights, cov_mat), weights.T)

# 计算组合波动率(标准差)
portfolio_volatility = np.sqrt(portfolio_variance)

协方差矩阵是投资组合风险计算的核心,其对角线元素为各资产的方差,非对角线元素为资产间的协方差:

Σ=[ σ12cov(1,2)cov(2,1)σ22]\Sigma = \begin{bmatrix} \sigma_1^2 & \text{cov}(1,2) & \cdots \\\text{cov}(2,1) & \sigma_2^2 & \cdots \\\vdots & \vdots & \ddots\end{bmatrix}

其中:

6.5 验证计算结果

可以用另一种方法验证:

# 直接用numpy计算组合收益的方差
alt_volatility = np.sqrt(np.var(np.dot(weights, returns), ddof=1))

# 两种方法结果应该相同
print(portfolio_volatility == alt_volatility)  # True

组合方差公式:

σp2=wTΣw\sigma_p^2 = \mathbf{w}^T \Sigma \mathbf{w}

其中:

七、实战建议

  1. 维度对齐:进行矩阵运算前务必检查矩阵维度
  1. 广播机制:理解NumPy的广播规则提升计算效率
  1. 内存优化:大矩阵运算时使用原地操作减少内存消耗
  1. 性能监控:使用%timeit测试关键运算的性能

结语

掌握NumPy的线性代数操作,能够显著提升金融数据分析效率。从简单的收益计算到复杂的组合优化,NumPy为量化分析提供了坚实的数学基础。建议读者结合实际金融场景,深入探索矩阵运算在风险管理、因子分析等领域的应用。

附:练习合集