
线性回归在股票与期货交易中的核心逻辑
股票和期货价格序列具有高噪声、非平稳特征。线性回归假设因变量与自变量之间存在线性关系,通过最小化残差平方和拟合参数。在量化交易中,线性回归可用于预测下一期收益率、构建多因子模型、配对交易中的价差回归。使用Python的scikit-learn或statsmodels库能快速实现。
数据准备与特征工程
获取股票或期货历史数据,推荐使用yfinance(股票)或ccxt(期货)。以下代码拉取苹果公司日线数据并构造滞后特征。
import yfinance as yf
import pandas as pd
import numpy as np
df = yf.download('AAPL', start='2020-01-01', end='2023-12-31')
df['Return'] = df['Close'].pct_change()
df['Lag1'] = df['Return'].shift(1)
df['Lag2'] = df['Return'].shift(2)
df['Volume_Change'] = df['Volume'].pct_change()
df.dropna(inplace=True)
期货数据可从ccxt获取,注意合约乘数和展期处理。特征可包含滞后收益率、成交量变化、波动率、技术指标(RSI、MACD)。避免使用未来数据,所有特征必须基于当前及历史信息。
线性回归模型构建与训练
使用scikit-learn的LinearRegression。划分训练集与测试集,按时间顺序切分,不能随机打乱。

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
features = ['Lag1', 'Lag2', 'Volume_Change']
X = df[features].values
y = df['Return'].values
split = int(len(X) * 0.8)
X_train, X_test = X[:split], X[split:]
y_train, y_test = y[:split], y[split:]
model = LinearRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print('系数:', model.coef_)
print('截距:', model.intercept_)
print('MSE:', mean_squared_error(y_test, y_pred))
print('R2:', r2_score(y_test, y_pred))
股票收益率预测的R2通常极低(0.01以下),甚至为负,说明线性回归直接预测收益效果有限。更实用的场景是预测价格水平或价差。
期货跨期套利中的线性回归
期货跨期套利常用线性回归确定两个合约的合理价差。以螺纹钢期货为例,近月合约价格与远月合约价格存在长期均衡关系。
import ccxt
import pandas as pd
exchange = ccxt.binance()
# 获取期货数据示例,实际需使用交易所API
# 假设df包含近月价格near和远月价格far
df['Spread'] = df['near'] - df['far']
X = df['far'].values.reshape(-1, 1)
y = df['near'].values
model = LinearRegression()
model.fit(X, y)
df['Residual'] = y - model.predict(X)
残差平稳时,可构建均值回归策略:残差高于阈值做空价差,低于阈值做多价差。注意交易成本与保证金。
模型评估与回测要点
线性回归评估不能只看R2。股票预测需关注方向准确率、夏普比率、最大回撤。使用滚动窗口训练避免过拟合。
from sklearn.model_selection import TimeSeriesSplit
tscv = TimeSeriesSplit(n_splits=5)
for train_idx, test_idx in tscv.split(X):
X_train, X_test = X[train_idx], X[test_idx]
y_train, y_test = y[train_idx], y[test_idx]
model.fit(X_train, y_train)
pred = model.predict(X_test)
# 计算策略收益
期货回测需考虑主力合约换月、手续费、滑点。线性回归假设残差独立同分布,金融数据常违反该假设,需用Newey-West标准误调整。
常见陷阱与改进方向
多重共线性导致系数不稳定,使用VIF检验。异方差性使普通最小二乘估计无效,改用加权最小二乘。非线性关系可引入多项式特征或样条回归。股票预测中,线性回归更适合作为基准模型,实际交易需结合树模型、神经网络或集成方法。
from statsmodels.stats.outliers_influence import variance_inflation_factor
vif = pd.DataFrame()
vif['feature'] = features
vif['VIF'] = [variance_inflation_factor(X, i) for i in range(X.shape[1])]
print(vif)
期货高频数据中,线性回归可用于预测买卖价差或订单流不平衡。注意数据频率与交易频率匹配。
代码整合与实战建议
将数据获取、特征工程、模型训练、回测封装为类。使用joblib保存模型。实盘前用模拟盘验证。
import joblib
class LinearModel:
def __init__(self):
self.model = LinearRegression()
def train(self, X, y):
self.model.fit(X, y)
def predict(self, X):
return self.model.predict(X)
def save(self, path):
joblib.dump(self.model, path)
股票与期货市场存在体制转换,线性回归参数随时间变化。定期重新训练模型,监控残差分布。避免过度优化历史数据。
线性回归简单、可解释,是量化交易入门必备工具。正确使用需理解统计假设、金融数据特性、回测严谨性。