引言#
NumPy作为Python的核心科学计算库,在Quantopian量化平台上发挥着关键作用。它提供高效的多维数组支持及丰富的数学函数,特别适合处理投资组合优化等需要线性代数运算的场景。本文将带您掌握NumPy在金融分析中的核心应用技巧。
一、NumPy数组基础#
1.1 创建数组#
code
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 数组索引与切片#
code
print(returns[1:3]) # 输出: [5. 2.]
print(A[0, :]) # 输出: [1 2]
print(A[:, 0]) # 输出: [1 3]二、数组运算与统计#
2.1 数学函数应用#
code
print(np.log(returns)) # 对数运算
print(np.max(returns)) # 最大值: 8.02.2 统计计算#
code
mean_return = np.mean(returns)
std_dev = np.std(returns)
print(f"均值: {mean_return:.2f}, 标准差: {std_dev:.2f}")三、缺失值处理#
code
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 生成模拟资产#
code
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 计算投资组合收益#
code
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 矩阵运算基础#
code
A = np.random.rand(3,5)
B = np.random.rand(5,2)
# 合法矩阵乘法
result = np.dot(A, B) # 结果矩阵维度 (3,2)5.2 投资组合方差计算#
code
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),组合方差计算很简单:
code
组合方差 = (权重1)² × (资产1方差) + (权重2)² × (资产2方差) + ...6.3 现实情况:资产间存在相关性#
实际上,资产间往往存在相关性,需要考虑协方差:
code
组合方差 = Σ(权重i × 权重j × 资产i与j的协方差)
其中 i,j 遍历所有资产对6.4 协方差矩阵的概念#
协方差矩阵是一个方阵,包含:
-
对角线:各资产的方差
-
非对角线:两两资产间的协方差
示例代码:
code
# 计算协方差矩阵
cov_mat = np.cov(returns)
# 计算组合方差
portfolio_variance = np.dot(np.dot(weights, cov_mat), weights.T)
# 计算组合波动率(标准差)
portfolio_volatility = np.sqrt(portfolio_variance)协方差矩阵是投资组合风险计算的核心,其对角线元素为各资产的方差,非对角线元素为资产间的协方差:
其中:
-
表示第i个资产的方差
-
表示资产i和资产j之间的协方差
6.5 验证计算结果#
可以用另一种方法验证:
code
# 直接用numpy计算组合收益的方差
alt_volatility = np.sqrt(np.var(np.dot(weights, returns), ddof=1))
# 两种方法结果应该相同
print(portfolio_volatility == alt_volatility) # True组合方差公式:
其中:
-
为权重向量
-
为协方差矩阵
七、实战建议#
-
维度对齐:进行矩阵运算前务必检查矩阵维度
-
广播机制:理解NumPy的广播规则提升计算效率
-
内存优化:大矩阵运算时使用原地操作减少内存消耗
-
性能监控:使用
%timeit测试关键运算的性能
结语#
掌握NumPy的线性代数操作,能够显著提升金融数据分析效率。从简单的收益计算到复杂的组合优化,NumPy为量化分析提供了坚实的数学基础。建议读者结合实际金融场景,深入探索矩阵运算在风险管理、因子分析等领域的应用。