欢迎加入专注于财经数据与量化投研的【数据科学实战】知识星球!在这里,您将获取持续更新的《财经数据宝典》和《量化投研宝典》,这两部宝典相辅相成,为您在量化投研道路上提供明确指引。 我们提供了精选的国内外量化投研的 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)
实战案例:模型性能评估
评估指标
为了准确评估模型性能,使用了以下三个关键指标:
- 平均绝对误差(MAE): 预测值与实际值的平均偏差
结果分析
最佳模型:固定效应模型(Fixed Effect Model)
- 方向预测:第 1 天和第 3 天完全准确,总体准确率 66%(3 天中预测对 2 天)
次优模型:LightGBM
各模型表现对比
第 1 天预测: 6 个模型中有 4 个(固定效应模型、梯度提升、XGBoost、LightGBM)100% 正确预测了所有公司的涨跌方向
第 2 天预测: 没有模型完全预测正确
第 3 天预测: 只有固定效应模型完全预测正确
关键技术要点
1. 滞后特征的妙用
通过创建滞后特征,我们可以:
2. 特征重要性评估
mutual_info_regression 可以衡量每个特征与目标变量之间的依赖关系,帮助我们:
3. 多模型对比
同时训练多个模型的好处:
实践建议
如果你想复现这个项目,建议:
总结
这个项目展示了如何将计量经济学和机器学习结合起来预测股价。关键亮点包括:
- 多模型对比: 固定效应模型表现最佳,R² 达到 0.9996
- 方向预测: 66% 的准确率在短期预测中已经相当不错
虽然模型表现优秀,但请记住:股市有风险,投资需谨慎。 任何预测模型都不能保证 100% 准确,这个项目的主要价值在于学习数据科学和机器学习的应用方法。
如果你对量化交易和机器学习感兴趣,不妨动手试试这个项目。通过实践,你会对时间序列预测、特征工程和模型评估有更深入的理解。
参考文章
加入专注于财经数据与量化投研的知识星球【数据科学实战】,获取本文完整研究解析、代码实现细节。财经数据与量化投研知识社区
核心权益如下:
- 赠送《财经数据宝典》完整文档,汇集多年财经数据维护经验
- 赠送《量化投研宝典》完整文档,汇集多年量化投研领域经验
- 赠送《PyBroker-入门及实战》视频课程,手把手学习量化策略开发
- 每日分享高质量量化投研文章(已更新 180+篇)、代码和相关资料
星球已有丰富内容积累,包括量化投研论文、财经高频数据、 PyBroker 视频教程、定期直播、数据分享和答疑解难。适合对量化投研和财经数据分析有兴趣的学习者及从业者。欢迎加入我们!