1. 当时间序列预测遇上大语言模型:一场特征工程的跨界实验
金融时间序列预测一直是个充满挑战的领域。传统方法通常依赖于历史价格、技术指标等数值特征,但市场情绪、新闻事件等非结构化数据的影响同样不可忽视。最近我在做一个道琼斯指数预测项目时,突发奇想:能否用大语言模型(LLM)处理财经新闻文本,将其转化为数值嵌入特征,来增强传统时间序列模型的预测能力?
这个想法源于一个观察:当重大财经新闻发布时,市场常会出现剧烈波动。但如何量化这种文本信息对价格的影响?传统做法是使用情感分析或关键词提取,但这些方法往往丢失了大量语义信息。而现代LLM的文本嵌入能力,或许能更全面地捕捉新闻中的微妙信号。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 实验设计与数据准备
2.1 双数据集架构设计
我设计了一个对比实验框架,使用两个核心数据集:
-
道琼斯工业平均指数(DJIA)日线数据
通过yfinance库获取2008-2016年的每日收盘价,计算收益率并构建以下特征:- 滞后特征(lag_1, lag_2, lag_3, lag_5)
- 滚动统计量(roll_mean_5, roll_std_5)
- 二分类目标变量(次日涨跌)
-
Combined_News_DJIA新闻数据集
包含同期每日Top25财经新闻标题,经过以下处理:- 合并所有标题为单一文本
- 清洗字节编码异常字符
- 使用Sentence-BERT生成文本嵌入
python复制# 特征工程核心代码示例
def create_ts_features(df):
df["return"] = df["Close"].pct_change()
df["target"] = (df["return"].shift(-1) > 0).astype(int)
for lag in [1, 2, 3, 5]:
df[f"lag_{lag}"] = df["return"].shift(lag)
df["roll_mean_5"] = df["return"].rolling(5).mean()
df["roll_std_5"] = df["return"].rolling(5).std()
return df.dropna()
2.2 文本嵌入的降维处理
直接使用原始嵌入(384维)会导致维度灾难,我采用PCA降维到20维。这个数字的选择基于方差解释率曲线拐点,在保留信息和防止过拟合之间取得平衡:
python复制pca = PCA(n_components=20)
embeddings_reduced = pca.fit_transform(embeddings)
print(f"解释方差比例: {sum(pca.explained_variance_ratio_):.2f}")
提示:文本嵌入的质量直接影响最终效果。我对比了多种预训练模型,最终选择all-MiniLM-L6-v2,因为它在语义相似度任务表现优异且计算效率高。
3. 模型构建与对比实验
3.1 特征组合策略
将特征分为两组进行对比实验:
- 基线特征:纯时间序列特征(5个滞后特征+2个滚动统计量)
- 增强特征:时间序列特征+20维新闻嵌入
python复制# 特征分组示例
ts_features = [col for col in df.columns if "lag_" in col or "roll_" in col]
emb_features = [col for col in df.columns if "emb_" in col]
3.2 模型训练与评估
使用LightGBM分类器,按时间划分训练集(2008-2013)和测试集(2014-2016),确保符合金融预测的时序特性:
python复制model = LGBMClassifier(random_state=42)
model.fit(X_train[ts_features], y_train) # 基线模型
model.fit(X_train[ts_features+emb_features], y_train) # 增强模型
4. 结果分析与实践启示
4.1 性能对比
模型在测试集上的表现:
- 基线模型准确率:50.00%
- 增强模型准确率:50.48%
虽然数值上略有提升,但经过McNemar检验(p=0.37),差异不具有统计显著性。这与近期一些研究结论一致:在高频金融预测中,LLM嵌入的增益可能有限。
4.2 关键发现与改进方向
通过特征重要性分析,发现:
- 时间序列特征(尤其是roll_std_5)贡献度最高
- 部分嵌入维度显示出一定预测力,但整体信号较弱
- 新闻影响的滞后效应可能未被充分捕捉
可能的改进方向:
- 尝试更细粒度的新闻过滤(仅保留与成分股直接相关的新闻)
- 加入新闻情感分数作为辅助特征
- 使用时序交叉验证替代单一时间划分
python复制# 特征重要性可视化
plt.figure(figsize=(10,6))
pd.Series(model.feature_importances_, index=X_train.columns).sort_values().plot(kind='barh')
plt.title("Feature Importance")
5. 工程实践中的经验总结
5.1 文本处理中的坑与技巧
- 编码问题:原始新闻数据中存在大量字节字符串(如b'Apple'),需要特殊处理:
python复制def clean_bytes_text(x):
if isinstance(x, str) and x.startswith("b'"):
- 文本合并策略:简单拼接所有标题可能引入噪声,更好的做法是:
- 按实体出现频率加权
- 去除停用词和低信息量文本
5.2 时间序列特有的注意事项
- 避免前瞻性偏差:任何基于未来信息的操作(如全局PCA)都应严格在滚动窗口中进行
- 处理非平稳性:金融时间序列通常需要差分或对数变换
- 评估指标选择:准确率可能不是最优指标,应考虑Sharp Ratio、最大回撤等金融指标
6. 延伸思考:何时LLM嵌入可能有效?
基于本次实验和行业案例,LLM嵌入可能在以下场景更具价值:
- 低频宏观预测(季度/年度)
- 与文本强相关的领域(如社交媒体情绪分析)
- 数据匮乏时的迁移学习
而在高频交易、复杂衍生品定价等场景,传统计量方法可能更可靠。最终,没有银弹——关键是通过严谨的实验设计,在特定上下文中验证方法的有效性。
