1、从Stooq中下载五个公司的数据存放在data文件夹下 data_OHLCV.py
- apple,hsbc,pepsi,tencent,toyota
2、对数据做特征工程
-
使用
pandas-ta计算多种指标(表 1):- SMA_5、SMA_20
- EMA_10
- Momentum_3、Momentum_10
- RSI_14
- MACD、MACD_Signal
- BB_Upper、BB_Lower
- OBV
3、构建提示词 prepare_prompt.py
- 生成的提示词放在prompts文件夹下
4、调用大模型进行生成
- 生成的alpha在llmGeneration下,目前调用的是qwen3-max的api
整体上,这篇文章的工作流可以看成一个自上而下的流水线: 先做数据与特征,再让 LLM 写公式化 alpha,然后用这些 alpha 去喂 Transformer(加上一些对比模型)做次日收盘价预测。
| 阶段 | 主要操作 | 输入 | 输出 |
|---|---|---|---|
| 1 | 原始数据采集 | 目标公司列表、时间区间、数据 API | 日度 OHLCV 行情、新闻文本 |
| 2 | 特征工程(技术指标 + 情感) | 日度 OHLCV、新闻文本 | 带技术指标 & 多公司情感分数的 DataFrame |
| 3 | LLM 生成公式化 Alpha | 结构化 DataFrame 示例 + Prompt | 每公司 5 条公式化 alpha(文本)+ 推理说明 |
| 4 | 计算 Alpha 序列 | DataFrame + alpha 公式文本 | 日度 alpha_t 数值序列(添加到 DataFrame) |
| 5 | 构造时序样本(滑动窗口) | 完整特征表(含 alpha) | Transformer/LSTM/TCN/SVR/RF 的训练和测试张量 |
| 6 | 训练 Transformer | 训练张量 + 超参数 | 训练好的 Transformer 模型、测试集预测 |
| 7 | 训练对比模型 | 同上(输入特征基本一致) | 各模型预测结果 |
| 8 | 评估与扩展指标 | 真实价格 + 预测结果 + alpha 序列 | MSE、带/不带情感对比、不同 alpha 来源对比、IC |
-
目标公司列表(5 家):
- Apple, HSBC, Pepsi, Toyota, Tencent
-
时间区间
- 2016-05-01 ~ 2024-05-08
-
数据源
- 行情:
yfinance(Open/High/Low/Close/Volume) - 新闻:EODHD 的 “Financial News Feed and Stock News Sentiment Data API”
- 行情:
-
日度行情表(每家公司一份 DataFrame)
- 列:
[Date, Open, High, Low, Close, Volume]
- 列:
-
新闻原始数据
- 每条新闻至少包含:
[date, company, title/body text, …] - 公司既包括目标公司,也包括相关新闻中的关联公司(表 2 给出了最终的关联公司集合)
- 每条新闻至少包含:
复现时:
- 行情用 yfinance 很好做。
- 新闻用不到同一个 API 也行,只要能拿到“公司 + 日期 + 文本”即可。
- 阶段 1 输出的 OHLCV 日线数据
-
使用
pandas-ta计算多种指标(表 1):- SMA_5、SMA_20
- EMA_10
- Momentum_3、Momentum_10
- RSI_14
- MACD、MACD_Signal
- BB_Upper、BB_Lower
- OBV
-
扩展后的行情 DataFrame:
- 列包含:
[Open, High, Low, Close, Volume, SMA_5, SMA_20, EMA_10, …, OBV]
- 列包含:
- 来自前一篇工作的 NER 和共现分析结果(论文里直接给了表 2)
- 对于每个目标公司,有一个“关联公司列表”(长度大约 10)
复现时你可以直接硬编码表 2 里的关联公司,而不用再做一次 NER。
- 阶段 1 的新闻文本(目标公司 + 关联公司)
- 关联公司列表
修改:概念
-
用 VADER 对每条新闻做情感分析,得到
polarity分数。 -
对每个公司、每一天,把所有新闻的 polarity 平均:
- 得到:
Sentiment(company, date)的时间序列。
- 得到:
文本里面有什么维度(llm生成)
-
一个“公司–日期–情感”的表/多列:
- 对于 Apple:
Apple_polarity_t - 对于 Google:
Google_polarity_t - ……(表 2 中列出的所有公司)
- 对于 Apple:
- 行情 + 技术指标 DataFrame
- 多公司日度情感表
- 按日期对齐,inner join,去掉缺失过多的行。
- 对所有数值特征可以做标准化(论文中提示使用 Z-score 等标准化方法作为 LLM 输入要求的一部分)。
- 数据集划分:前 70% 为训练,后 30% 为测试。
- 设置滑动窗口 长度 5 天:稍后要用于构造模型输入。
-
每个目标公司的一个“干净的、对齐后的” DataFrame:
- 列包括:OHLCV、所有技术指标、目标公司及关联公司的情感分数。
- 有清晰的日期 index,适合之后喂给 LLM/模型。
-
结构化 Prompt(论文表 3):
-
描述任务目标:生成 5 个 alpha,用于预测某公司的股价。
-
明确输入数据格式:一个 pandas DataFrame(JSON 格式示例)。
-
要求 alpha 结合:
- 股价特征(Open, High, Low, Close, Volume)
- 技术指标(RSI, SMA, EMA, MACD 等)
- 目标公司与关联公司的日度情感分数
-
-
数据示例:
- 不是把全量数据塞进去,而是取几行(或仅列名+描述),转成 JSON 片段作为 LLM 的上下文。
-
具体公司名(通过
{Company}占位替换为 Apple/HSBC/...) -
LLM 模型:
- deepseek-r1-distill-llama-70b(在 Groq 上运行)
-
每家公司 5 条 Alpha 公式(文本形式)
-
论文表 4 给出了最终采纳的 5 条 alpha,比如:
- Apple 的
alpha1_t = (C_t - O_t) / O_t + 0.5 * (Apple_polarity_t + Google_polarity_t) - Toyota 的
alpha5_t = (OBV_t > OBV_t-1) * (C_t > C_t-1) * (1 if BYD_polarity_t > 0 and TSLA_polarity_t > 0 else 0)等等。
- Apple 的
-
-
LLM 的自然语言推理过程(比如图 3 展示 Toyota 的推理)
- 主要用于解释“为什么这样写公式”。
复现选择:
- 严格复现思路:你自己也调用同类 LLM,用论文的 prompt 和你的数据结构去生成 alpha。
- 严格复现结果:直接使用表 4 中给出的公式,跳过 LLM 这一步,把它当作“已生成的公式”。
- 阶段 2 输出的 DataFrame(含所有基础特征和情感)
- 阶段 3 生成的 5 条 alpha 公式(每公司一套)
对每一天 t,按公式计算 alpha1_t ~ alpha5_t:
-
直接是算术表达式的公式:
-
用向量运算即可,如:
alpha1_t = (C_t - O_t) / O_t + 0.5*(Apple_polarity_t + Google_polarity_t)
-
-
带条件的公式(Toyota 有不少是 0/1 特征):
- 在代码中用布尔判断转成 0/1。
-
每家公司一个新的 DataFrame:
-
在原有列的基础上新增:
alpha1,alpha2,alpha3,alpha4,alpha5
-
这些就是之后模型主要使用的“高层约束特征”。
-
- 阶段 4 的 DataFrame(对每家公司)
-
Transformer Encoder 输入:
-
对每个样本 i,取过去 5 天的 5 个 alpha:
- 形状(伪)≈
(window=5, num_alpha=5)
- 形状(伪)≈
-
-
Transformer Decoder 输入:
-
同样是过去 5 天的 收盘价 Close:
- 形状≈
(window=5, 1)
- 形状≈
-
-
时间特征:
- 从日期提取
day_of_week, day_of_month, month等,作为 Temporal Embedding 输入。
- 从日期提取
-
标签 y:
- 第 i 个样本标签:第 6 天(窗口之后)的 Close,即 次日收盘价。
-
训练/验证/测试集张量:
X_enc(alpha 序列 + 时间/位置嵌入)X_dec(历史 Close 序列 + 时间/位置嵌入)y(下一天 Close)
同样的窗口构造也会被 LSTM/TCN/SVR/RandomForest 使用,区别只是输入的维度/形状稍微不一样。
-
阶段 5 的训练集张量
-
模型结构和超参数设定:
- Encoder / Decoder 结构(图 2)
- 1D Conv Embedding + Temporal Embedding + Position Embedding
- 损失函数:MSE
- 优化器:Adam,学习率 5e-5
- Epoch:50
- Batch size:8~64(不同股票略有差异)
-
训练好的 Transformer 模型(对当前公司)
-
对测试集的预测:
y_pred:测试集中每一天对应的预测 Close- 和真实
y_true对比可画出图 4 那种曲线,也可计算 MSE(表 5、表 6)
- 与 Transformer 相同的数据(同一批 alpha 特征 + 滑动窗口构造出 X, y)
-
分别搭建四种模型:
- LSTM(时序 RNN)
- TCN(1D 卷积时序网络)
- SVR(支持向量回归)
- Random Forest(树模型集成)
-
损失/评估同样用 MSE。
-
各模型在测试集上的预测结果 & MSE:
- 汇总在表 5(只看 LLM alpha)
- 表 10(对比不同 Alpha 来源:LLM / Featuretools / 101 人工 Alpha)
- 各模型预测的
y_pred - 对应真实
y_true(测试集 Close)
-
MSE(每公司、每模型)
-
对比:
- Transformer vs 其他模型(表 5)
- 有无情感特征 vs 有情感特征(表 6)
- 不同 Alpha 生成方式(LLM / Featuretools / 101 人工 Alpha,表 10)
- 每个 alpha_t 序列
- 对应的未来收益(return,论文中后面用 IC 来测 alpha 对收益的预测力)
-
Information Coefficient(IC):即 alpha 排序 vs 实际收益排序的相关系数(表 11)
-
文章结论:
- LLM alpha 对“价格”预测很好,对“收益”预测相对较弱,但这不影响其在价格预测任务中的效果。
-
先跑完整的数据与特征流程(阶段 1–2):
- 确保每家公司有一个 DataFrame,包含 OHLCV + 技术指标 + 目标公司/关联公司情感。
-
决定 A 或 B:
- A:完全照论文的 alpha(表 4)重写计算代码。
- B:自己再调一次 LLM 生成新的 alpha(保持 prompt 结构一致),做一次“方法级复现”。
-
用这些 alpha 构造 5 天滑动窗口样本,做成 Transformer 所需的 Encoder/Decoder 输入 + 标签。
-
搭建 Transformer 结构(照图 2 + 文中描述)并训练,记录测试 MSE。
-
可选:再训练 LSTM/TCN/SVR/RF,对比结果;再实现 Featuretools/101 Alpha 的流程,做三种 Alpha 的对比。