如何用Python实现股票线性回归预测

企业微信

线性回归在股票与期货交易中的核心逻辑

股票和期货价格序列具有高噪声、非平稳特征。线性回归假设因变量与自变量之间存在线性关系,通过最小化残差平方和拟合参数。在量化交易中,线性回归可用于预测下一期收益率、构建多因子模型、配对交易中的价差回归。使用Python的scikit-learnstatsmodels库能快速实现。

数据准备与特征工程

获取股票或期货历史数据,推荐使用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-learnLinearRegression。划分训练集与测试集,按时间顺序切分,不能随机打乱。

如何用Python实现股票线性回归预测


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)

股票与期货市场存在体制转换,线性回归参数随时间变化。定期重新训练模型,监控残差分布。避免过度优化历史数据。

线性回归简单、可解释,是量化交易入门必备工具。正确使用需理解统计假设、金融数据特性、回测严谨性。

转载请注明出处:https://www.lianghuajiaoyi.top/wenzhang/xianxing-huigui-gupiao-yuce-613.html