Py学习  »  Python

用 Python 预测股价?这个模型提前 3 天告诉你涨跌

数据科学实战 • 2 天前 • 100 次点击  

欢迎加入专注于财经数据与量化投研的【数据科学实战】知识星球!在这里,您将获取持续更新的《财经数据宝典》和《量化投研宝典》,这两部宝典相辅相成,为您在量化投研道路上提供明确指引。 我们提供了精选的国内外量化投研的 180+ 篇高质量文章,并每日更新最新研究成果,涵盖策略开发、因子分析、风险管理等核心领域。 无论您是量化投资新手还是经验丰富的研究者,星球社区都能帮您少走弯路,事半功倍,共同探索数据驱动的投资世界!

引言

在股票交易中,如果能提前知道明天的股价是涨是跌,那该有多好?传统的技术分析需要我们每天盯着布林带、移动平均线、支撑位和阻力位等指标,耗费大量时间。

今天要分享的这个项目,使用纯粹的历史数据,结合计量经济学模型和机器学习算法,实现了提前 3 天预测股价的功能。最重要的是,这个方法可以完全自动化运行,让你有更多时间关注市场新闻和整体趋势。

重要提示: 本文内容仅供教育学习使用,不构成任何投资建议。

核心策略解析

1. 数据准备

这个预测模型使用了以下数据:

  • 因变量: 石油股票价格(Shell、BP、SLB 等公司)
  • 自变量: 美国石油基金(USO)、纽交所石油指数、布伦特原油期货等多个指标

2. 特征工程的关键技巧

数据预处理包括以下步骤:

  • 数据重塑
  • 创建加权移动平均值等特征
  • 生成滞后特征(Lagged Features) —— 这是最关键的一步
  • 生成百分比变化特征
  • 删除空值

为什么滞后特征如此重要?

滞后特征本质上是将过去的数据与尚未发生的未来数据对齐,让模型能够使用历史信息来预测未来结果。这样我们就能仅用过去的数据来预测股价。

3. 特征筛选

使用 Python 的 mutual_info_regression 工具筛选最重要的特征,显著性阈值设定为 0.2:

# 准备特征和目标变量
X = df[X_pct_cols]
y = df['pct_y']

# 计算互信息
mi = mutual_info_regression(X, y, random_state=42)
mi_series = pd.Series(mi, index=X.columns).sort_values(ascending=False)

# 转换为 DataFrame
mi_df = mi_series.reset_index()
mi_df.columns = ['Feature''MI_Score']

# 选择显著特征(显著性阈值为 0.2)
corr = 0.2
feature_cols = mi_df.loc[mi_df['MI_Score'] >= corr, 'Feature'].tolist()

# 获取最终的列
basic_cols = ['ds''unique_id''y''pct_y']
all_cols = basic_cols + feature_cols
df = df[all_cols]

4. 数据集划分

将数据分为训练集和测试集,预测未来 3 天的价格:

# 预测天数设定为 3 天
days = 3

# 划分训练集和测试集
train = df.groupby('unique_id').apply(lambda g: g.iloc[:-days]).reset_index(drop=True)
test = df.groupby('unique_id').apply(lambda g: g.iloc[-days:]).reset_index(drop=True)

# 设置日期和 ID 为索引
train = train.set_index(['unique_id''ds'])
test = test.set_index(['unique_id''ds'])

# 分离特征和目标变量
y_train = train['pct_y']
X_train = train[feature_cols]
X_test = test[feature_cols]

5. 模型训练与预测

项目测试了 6 个不同的模型,包括 1 个计量经济学模型和 5 个机器学习模型:

# 定义多个模型
models = {
    'rf': RandomForestRegressor(n_estimators=100, max_depth=10, random_state=42),
    'gbr': GradientBoostingRegressor(n_estimators=500, learning_rate=0.01, max_depth=10),
    'xgb': xgb.XGBRegressor(n_estimators=500, learning_rate=0.01, max_depth=10),
    'lgbm': lgb.LGBMRegressor(n_estimators=500, learning_rate=0.01, max_depth=10),
    'cat': CatBoostRegressor(iterations=500, learning_rate=0.01, depth=10, random_state=42)
}

# 训练所有模型并生成预测
for key, model in models.items():
    model.fit(X_train, y_train)
    test[ f'pct_pred_{key}'] = model.predict(X_test)

实战案例:模型性能评估

评估指标

为了准确评估模型性能,使用了以下三个关键指标:

  1. R² 值: 越接近 1 表示预测越准确
  2. 平均绝对误差(MAE): 预测值与实际值的平均偏差
  3. 方向预测准确率: 预测涨跌方向的正确率

结果分析

最佳模型:固定效应模型(Fixed Effect Model)

  • R² = 0.9996
  • MAE = 0.43 美元
  • 方向预测:第 1 天和第 3 天完全准确,总体准确率 66%(3 天中预测对 2 天)

次优模型:LightGBM

  • R² = 0.9995
  • MAE = 0.39 美元

各模型表现对比

第 1 天预测: 6 个模型中有 4 个(固定效应模型、梯度提升、XGBoost、LightGBM)100% 正确预测了所有公司的涨跌方向

第 2 天预测: 没有模型完全预测正确

第 3 天预测: 只有固定效应模型完全预测正确

关键技术要点

1. 滞后特征的妙用

通过创建滞后特征,我们可以:

  • 使用历史数据预测未来
  • 避免数据泄露问题
  • 确保模型在实际应用中可行

2. 特征重要性评估

mutual_info_regression 可以衡量每个特征与目标变量之间的依赖关系,帮助我们:

  • 减少模型复杂度
  • 提高预测准确性
  • 避免过拟合

3. 多模型对比

同时训练多个模型的好处:

  • 发现最适合特定数据的模型
  • 交叉验证结果的可靠性
  • 了解不同算法的优劣势

实践建议

如果你想复现这个项目,建议:

  1. 从简单开始: 先用单只股票和少量特征测试
  2. 逐步优化: 根据结果调整特征工程策略
  3. 严格验证: 使用多种评估指标,不要只看 R²
  4. 风险意识: 记住这只是预测模型,不是投资建议

总结

这个项目展示了如何将计量经济学和机器学习结合起来预测股价。关键亮点包括:

  • 纯历史数据预测: 确保模型可以在实际中应用
  • 滞后特征工程: 巧妙地将过去与未来对齐
  • 多模型对比: 固定效应模型表现最佳,R² 达到 0.9996
  • 方向预测: 66% 的准确率在短期预测中已经相当不错

虽然模型表现优秀,但请记住:股市有风险,投资需谨慎。 任何预测模型都不能保证 100% 准确,这个项目的主要价值在于学习数据科学和机器学习的应用方法。

如果你对量化交易和机器学习感兴趣,不妨动手试试这个项目。通过实践,你会对时间序列预测、特征工程和模型评估有更深入的理解。

参考文章

加入专注于财经数据与量化投研的知识星球【数据科学实战】,获取本文完整研究解析、代码实现细节。

财经数据与量化投研知识社区

核心权益如下:

  1. 赠送《财经数据宝典》完整文档,汇集多年财经数据维护经验
  2. 赠送《量化投研宝典》完整文档,汇集多年量化投研领域经验
  3. 赠送《PyBroker-入门及实战》视频课程,手把手学习量化策略开发
  4. 每日分享高质量量化投研文章(已更新 180+篇)、代码和相关资料
  5. 定期更新高频财经数据
  6. 参与年度不少于 10 次专属直播与录播课程
  7. 与核心开发者直接交流,解决实际问题
  8. 获取专业微信群交流机会和课程折扣

星球已有丰富内容积累,包括量化投研论文、财经高频数据、 PyBroker 视频教程、定期直播、数据分享和答疑解难。适合对量化投研和财经数据分析有兴趣的学习者及从业者。欢迎加入我们!

好文推荐

1. 用 Python 打造股票预测系统:Transformer 模型教程(一)

2. 用 Python 打造股票预测系统:Transformer 模型教程(二)

3. 用 Python 打造股票预测系统:Transformer 模型教程(三)

4. 用 Python 打造股票预测系统:Transformer 模型教程(完结)

5. 揭秘隐马尔可夫模型:因子投资的制胜武器

6. YOLO 也能预测股市涨跌?计算机视觉在股票市场预测中的应用

7. 金融 AI 助手:FinGPT 让你轻松掌握市场分析

8. 量化交易秘籍:为什么专业交易员都在用对数收益率?

9. Python 量化投资利器:Ridge、Lasso 和 Elastic Net 回归详解

10. 掌握金融波动率模型:完整 Python 实现指南

好书推荐



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/189330