Skip to main content

NumPy 数值计算

NumPy 是 Python 科学计算的基础库,提供了高性能的多维数组对象和处理工具。


为什么量化投资需要 NumPy?

量化投资涉及大量数值计算:价格序列、收益率计算、统计分析等。NumPy 提供了:

  • 高效的数组运算(比 Python 原生列表快 10-100 倍)
  • 丰富的数学函数和统计方法
  • 线性代数运算(投资组合优化必备)

创建数组

import numpy as np

# 从列表创建
arr = np.array([1, 2, 3, 4, 5])

# 创建特殊数组
zeros = np.zeros((3, 3)) # 全零数组
ones = np.ones((2, 4)) # 全一数组
range_arr = np.arange(0, 10, 2) # 等差数列 [0, 2, 4, 6, 8]
linspace = np.linspace(0, 1, 5) # 等间距 [0, 0.25, 0.5, 0.75, 1.]

# 创建随机数组
random_arr = np.random.randn(100) # 标准正态分布
uniform_arr = np.random.uniform(0, 1, 100) # 均匀分布

数组索引与切片

arr = np.array([10, 20, 30, 40, 50])

print(arr[0]) # 第一个元素: 10
print(arr[1:3]) # 切片: [20, 30]
print(arr[-1]) # 最后一个: 50

# 布尔索引(量化选股常用!)
print(arr[arr > 25]) # 选出大于25的: [30, 40, 50]

向量化运算

# NumPy 支持向量化运算,无需循环
a = np.array([1, 2, 3, 4])
b = np.array([10, 20, 30, 40])

print(a + b) # [11, 22, 33, 44]
print(a * b) # [10, 40, 90, 160]
print(a ** 2) # [1, 4, 9, 16]
print(np.sqrt(a)) # 平方根
print(np.log(a)) # 对数

统计方法

returns = np.array([0.01, -0.02, 0.03, -0.01, 0.02])

# 基本统计
print(np.mean(returns)) # 平均收益
print(np.std(returns)) # 标准差(波动率)
print(np.var(returns)) # 方差
print(np.max(returns)) # 最大值
print(np.min(returns)) # 最小值
print(np.median(returns)) # 中位数
print(np.percentile(returns, 95)) # 95% 分位数

# 累计收益
cumulative = np.cumprod(1 + returns) # 累计收益率
print(f"累计收益: {(cumulative[-1] - 1) * 100:.2f}%")

量化中常用的 NumPy 操作

# 计算收益率
prices = np.array([100, 102, 105, 103, 108])
returns = np.diff(prices) / prices[:-1] # 日收益率

# 对数收益率
log_returns = np.diff(np.log(prices))

# 移动平均
def moving_average(data, window):
return np.convolve(data, np.ones(window)/window, mode='valid')

ma5 = moving_average(prices, 3)

# 夏普比率
risk_free_rate = 0.02 / 252 # 日化无风险利率
excess_returns = returns - risk_free_rate
sharpe = np.sqrt(252) * np.mean(excess_returns) / np.std(excess_returns)
print(f"年化夏普比率: {sharpe:.2f}")

性能对比

import time

# Python 原生列表
start = time.time()
py_list = [i ** 2 for i in range(1000000)]
print(f"Python 列表: {time.time() - start:.3f}s")

# NumPy 数组
start = time.time()
np_arr = np.arange(1000000) ** 2
print(f"NumPy 数组: {time.time() - start:.3f}s")
# NumPy 通常快 10-100 倍

下一步Pandas 数据处理 →