别怕数学!用Python的NumPy和Pandas,手把手带你搞定量化交易里的线性代数与统计
·
别怕数学!用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))
这个流程虽然简化,但包含了量化分析的核心要素。
更多推荐



所有评论(0)