一个从 0 到 1 的 A 股策略回测框架。三百多行 Python,没有黑盒、没有付费数据、不用注册任何 token,clone 下来就能在真实历史行情上把 6 个经典策略跑一遍,并演示「大模型炒股的正确姿势」——让大模型把新闻变成可回测的因子,而不是问它「明天涨不涨」。
配套文章:公众号 Gatsby-Sec《从 0 到 1 用代码炒 A 股:6 个策略跑穿 4 年历史,顺便聊聊大模型炒股的正确姿势》
pip install -r requirements.txt
# 在沪深300上跑全部 6 个策略,输出绩效表 + 净值曲线图
python run_backtest.py 000300 --index
# 也可以跑个股(不复权)
python run_backtest.py 600519
# 大模型情绪因子 demo(需要 OPENROUTER_API_KEY,没有则自动退回词典法)
export OPENROUTER_API_KEY=sk-or-...
python llm_demo.py 600519| 文件 | 职责 |
|---|---|
quant/data.py |
行情/新闻获取 + 本地缓存(curl 直连新浪/东财,结果可离线复现) |
quant/strategies.py |
6 个技术策略,统一输出 0/1 仓位信号;加策略只要写个函数挂进 REGISTRY |
quant/backtest.py |
向量化回测引擎:防未来函数 + 真实手续费/印花税 + 8 项绩效指标 |
quant/llm_factor.py |
大模型情绪因子:把新闻按固定 schema 打分,聚合成每日因子接进策略 |
quant/factor_tools.py |
因子工程:缩尾 / 标准化 / 正交化 + IC(信息系数)评估 |
run_backtest.py |
一键多策略回测,出绩效表和净值曲线 |
llm_demo.py |
大模型因子的端到端演示 |
| 策略 | 思路 | 类型 |
|---|---|---|
| 买入持有 | 第一天买入一直拿,所有策略的基准线 | benchmark |
| 双均线 20/60 | 金叉满仓、死叉空仓 | 趋势跟踪 |
| MACD 趋势 | DIF 上穿 DEA 满仓 | 趋势确认 |
| 动量 60 日 | 过去 60 天涨了就拿,跌了就走 | 趋势/动量 |
| RSI 均值回归 | 超卖买、超买卖 | 均值回归 |
| 布林带回归 | 破下轨抄底、回中轨离场 | 均值回归 |
- 防未来函数:信号统一
shift(1),今天的信号明天才生效,杜绝用未来数据。 - 真实成本:A 股佣金双边 + 印花税卖出单边 + 滑点,按换手率扣。回测漂亮、实盘亏钱,多半死在没算成本。
- 结果可复现:行情落地本地 csv 缓存,同一份数据反复回测,结论稳定。
沪深300 上按夏普排序(节选):
| 策略 | 总收益 | 年化 | 夏普 | 最大回撤 |
|---|---|---|---|---|
| 布林带回归 | +17.7% | 4.1% | 0.49 | -11.0% |
| 买入持有 | +15.8% | 3.7% | 0.29 | -29.7% |
| MACD 趋势 | +10.9% | 2.6% | 0.27 | -17.6% |
| 双均线 20/60 | -2.9% | -0.7% | -0.01 | -24.8% |
关键结论:没有圣杯。 同一套策略,换个标的排名就大洗牌——
- 沪深300 / 上证指数(大盘、震荡):均值回归类(布林带)最稳,夏普能到 0.5~0.9;
- 创业板指 / 中证500(成长、趋势强):趋势类(MACD、动量)领先,创业板上 MACD 总收益 +82.6%;
- 个股茅台(2022 以来阴跌):买入持有 -24%,多数策略也亏——再次说明个股的坑比指数多。
策略要和市场风格匹配,这件事比「找一个最强策略」重要得多。
错误姿势:直接问大模型「茅台明天涨不涨」「给我个买卖信号」。语言模型对未来价格没有任何信息优势,这么用等于掷骰子还要交 token 费。
正确姿势:让大模型干它真正擅长的事——把非结构化文本变成结构化因子。llm_factor.py 做的就是:把新闻标题让 Claude 按固定 schema 打出情绪分(-1 利空 ~ +1 利好)和置信度,聚合成每日情绪因子,再交给回测引擎用历史数据检验它到底有没有 alpha。模型只负责「读懂文本」,赚不赚钱由回测说了算,不由模型嘴说了算。
[-0.60 | 置信0.80] "A股股王"源杰科技:陈文君因涉嫌刑事犯罪被刑拘…
[+0.40 | 置信0.80] 部分茅台酒产品价格上调,最高每瓶涨价200元
demo 用的新闻只覆盖近端窗口,样本短、噪声大,只演示「因子怎么接进框架」,不代表稳定 alpha。要上实盘必须用更长的历史新闻库重新验证。
factor_tools.py 提供把原始打分变成干净因子的标准三步(缩尾 → 标准化 → 正交化)和 IC(信息系数) 评估——IC 是因子值与未来收益的相关性,|IC|>0.03 算有点东西,能稳定为正/负比绝对值更重要。
实测:把 demo 的情绪分拿去算 IC,会发现近端新闻只覆盖了 4.2% 的交易日、有效样本 n≈12,IC 根本无法稳定估计。这恰恰是最该记住的工程教训:LLM 因子能不能用,由 IC 说了算;而 IC 要可信,先得有足够长、足够密、且严格按发布时间切片的历史文本库。
本项目仅用于量化方法学习与代码演示,所有回测均为历史数据复盘,不构成任何投资建议。历史业绩不代表未来收益,A 股有风险,下场需谨慎。