别怕数学!用Python的NumPy和Pandas,手把手带你搞定量化交易里的线性代数与统计

量化交易听起来高大上,但核心不过是数学和代码的结合。很多开发者一听到"线性代数"、"时间序列分析"就头大,其实这些概念用Python实现起来比你想象的简单得多。本文将用NumPy和Pandas这两个利器,带你用代码理解量化交易中的关键数学概念。

1. 为什么量化交易离不开线性代数

金融数据本质上都是多维度的。股票价格、交易量、财务指标...这些数据天然适合用矩阵表示。NumPy的ndarray就是为这种场景而生的。

1.1 用NumPy实现投资组合优化

假设我们有3只股票的历史收益率数据:

import numpy as np

# 三只股票的年化收益率(%)
returns = np.array([
    [12.5, 15.2, 9.8],  # 股票A
    [8.7, 10.1, 11.3],  # 股票B
    [14.2, 13.6, 12.9]  # 股票C
])

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

这个3×3的协方差矩阵告诉我们各股票收益率之间的联动关系。现代投资组合理论(MPT)的核心就是利用这个矩阵找到最优权重分配。

1.2 奇异值分解(SVD)在因子模型中的应用

量化交易中常用因子模型来解释股票收益。SVD可以帮助我们提取关键因子:

# 假设我们有100只股票过去5年的月度收益率数据
stock_returns = np.random.normal(0.01, 0.15, (60, 100))  # 模拟数据

U, s, Vh = np.linalg.svd(stock_returns, full_matrices=False)

# 前三个主成分解释了大部分方差
factors = U[:, :3] @ np.diag(s[:3])

这个技巧在风险管理和阿尔法因子挖掘中非常实用。

2. 统计学在量化交易中的实战应用

统计学不是书本上的公式,而是发现市场规律的显微镜。Pandas让这些分析变得异常简单。

2.1 用Pandas进行时间序列分析

金融数据大多是时间序列,平稳性是很多模型的前提假设:

import pandas as pd
from statsmodels.tsa.stattools import adfuller

# 加载苹果公司股价数据
aapl = pd.read_csv('AAPL.csv', index_col='Date', parse_dates=True)

# ADF检验平稳性
result = adfuller(aapl['Close'])
print(f'ADF统计量: {result[0]}')
print(f'p值: {result[1]}')

如果p值大于0.05,说明序列不平稳,需要进行差分处理。

2.2 蒙特卡洛模拟预测股价

不需要复杂的微分方程,用随机模拟也能预测股价走势:

def monte_carlo_simulation(S0, mu, sigma, days, simulations):
    dt = 1/days
    returns = np.exp((mu - 0.5 * sigma**2) * dt + 
                    sigma * np.random.normal(0, np.sqrt(dt), (days, simulations)))
    return S0 * returns.cumprod(axis=0)

# 参数设置
S0 = 100      # 初始价格
mu = 0.1      # 年化收益率
sigma = 0.2   # 年化波动率
days = 252    # 交易日
sims = 1000   # 模拟次数

paths = monte_carlo_simulation(S0, mu, sigma, days, sims)

这种模拟在期权定价和风险管理中非常有用。

3. 量化策略开发中的数学技巧

好的量化策略往往建立在对数学工具的巧妙运用上。

3.1 用线性回归挖掘阿尔法

简单的线性回归也能发现交易机会:

from sklearn.linear_model import LinearRegression

# 假设factor是我们的预测因子,returns是目标股票收益
model = LinearRegression()
model.fit(factor.reshape(-1,1), returns)

# 计算残差 - 这就是我们的阿尔法信号
alpha = returns - model.predict(factor.reshape(-1,1))

3.2 卡尔曼滤波处理噪声数据

市场数据充满噪声,卡尔曼滤波可以帮助我们提取真实信号:

from pykalman import KalmanFilter

kf = KalmanFilter(transition_matrices=[1],
                  observation_matrices=[1],
                  initial_state_mean=0,
                  initial_state_covariance=1,
                  observation_covariance=1,
                  transition_covariance=0.01)

state_means, _ = kf.filter(noisy_prices)

这在处理高频交易数据时特别有效。

4. 构建完整的量化分析流水线

现在我们把所有技术整合到一个完整的分析流程中。

4.1 数据获取与清洗

import yfinance as yf

# 获取数据
data = yf.download('AAPL MSFT GOOG', start='2020-01-01')

# 处理缺失值
data = data.ffill().bfill()

# 计算对数收益率
returns = np.log(data['Close'] / data['Close'].shift(1)).dropna()

4.2 特征工程与模型构建

from sklearn.ensemble import RandomForestClassifier

# 创建滞后特征
for lag in [1, 2, 3, 5, 8, 13]:
    returns[f'lag_{lag}'] = returns['AAPL'].shift(lag)

# 定义目标变量:明日上涨为1,否则为0
returns['target'] = (returns['AAPL'].shift(-1) > 0).astype(int)

# 移除缺失值
returns = returns.dropna()

# 训练随机森林模型
model = RandomForestClassifier(n_estimators=100)
model.fit(returns.drop('target', axis=1), returns['target'])

4.3 策略回测与评估

# 生成预测信号
returns['pred'] = model.predict(returns.drop('target', axis=1))

# 计算策略收益
returns['strategy'] = returns['pred'] * returns['AAPL']

# 计算累计收益
cumulative = (returns[['AAPL', 'strategy']] + 1).cumprod()

# 绘制结果
cumulative.plot(figsize=(10,6))

这个流程虽然简化,但包含了量化分析的核心要素。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐