Kronos 深度拆解:34K Star 的金融 K 线「大模型」,为什么说时间序列预测也迎来了自己的 GPT 时刻
一、背景:为什么金融市场需要一个「专用大模型」
2026 年 7 月底,GitHub Trending 上出现了一个让量化圈和 AI 圈同时侧目的项目:Kronos。它自称是「第一个开源的金融 K 线基础模型(Foundation Model)」,训练数据横跨 45 个以上的全球交易所,论文已被 AAAI 2026 录用,Star 数一路冲到 34K+,单日新增近 6000。
如果你做过量化,或者哪怕只是写过几个技术指标脚本,你大概率经历过这样的循环:
- 找一个「圣杯」指标(MACD、布林带、神奇九转……)
- 回测发现某段时间有效
- 实盘三个月,策略失效
- 回到第 1 步
这个循环的本质问题是:传统技术分析是人类手工设计的特征工程,而金融市场是一个高噪声、非平稳、多主体博弈的复杂系统。手工特征的表达能力天花板太低了。
那用深度学习呢?过去十年里 LSTM、Transformer、TCN 轮番上阵预测股价,结果大多是论文里光鲜、实盘里翻车。原因也不难理解:
- 数据太少:单只股票的日线数据一年才 250 根左右,深度模型根本喂不饱
- 信噪比太低:金融数据的噪声占比远高于 NLP 和 CV 领域
- 分布漂移:2020 年的市场规律到 2024 年可能完全反转
而 Kronos 给出的答案,和 NLP 领域 GPT 的答案是同构的:与其在小数据上训练专用模型,不如在海量跨市场数据上预训练一个基础模型,把「市场的通用语言」学出来,再迁移到具体任务上。
这个思路本身不新鲜——Google 的 TimesFM、Amazon 的 Chronos、Salesforce 的 Moirai 都是时间序列基础模型(TSFM)。但 Kronos 的独特之处在于:它不做通用时序,只做金融 K 线,而且是为 K 线的高噪声特性专门设计的架构。
这篇文章我会从架构原理、代码实战、微调回测到生产落地,把这个项目完整拆一遍。
二、核心概念:把 K 线变成「语言」
2.1 什么是「金融市场的语言」
Kronos 论文的标题很有意思:A Foundation Model for the Language of Financial Markets。它把 K 线序列(OHLCV:开盘价、最高价、最低价、收盘价、成交量)类比为一种语言:
- 一根 K 线 ≈ 一个「词」
- 一段 K 线序列 ≈ 一个「句子」
- 市场的涨跌规律 ≈ 这门语言的「语法」
这个类比要成立,有一个关键的技术障碍:语言是离散的(词表有限),而 K 线是连续的多维数值。GPT 能做自回归预测,是因为它每一步只需要在有限词表上做分类。K 线的价格是连续实数,直接套用会遇到经典的「连续值回归 vs 离散 token 分类」的矛盾。
2.2 两阶段框架:Tokenizer + 自回归 Transformer
Kronos 的解法是一个干净的两阶段框架:
第一阶段:专用 Tokenizer(量化器)
用一个专门训练的 tokenizer,把连续的多维 K 线数据(OHLCV + 成交额)量化为分层离散 token(hierarchical discrete tokens)。这一步在思想上接近 VQ-VAE 家族的做法——学一个离散码本(codebook),把连续向量映射到最近的码本条目。
「分层」是关键设计。单层码本要么词表爆炸(精度高但学不动),要么精度不足(词表小但信息损失大)。分层量化把一根 K 线拆成粗粒度 + 细粒度的多级 token,类似残差量化(RVQ)的思路:第一级 token 描述大致形态,后续级别逐层逼近残差。这样用较小的码本组合出了指数级的表达能力。
第二阶段:Decoder-only 自回归 Transformer
拿到离散 token 序列后,剩下的事情就和训练 GPT 没有本质区别了:在海量 token 序列上做 next-token prediction 预训练。模型学到的是「给定过去 N 根 K 线的 token,下一根 K 线的 token 分布是什么」。
这个设计带来三个直接好处:
- 概率化输出天然免费:模型输出的是 token 的概率分布,采样多条路径就能得到预测的置信区间,而不是一个干巴巴的点估计。对风控来说,「预测涨 2%,置信区间 ±5%」和「预测涨 2%,置信区间 ±0.5%」是完全不同的交易信号。
- 对噪声更鲁棒:量化本身就是一种信息瓶颈(information bottleneck),高频噪声在量化阶段被天然过滤掉一部分,模型学到的是形态级别的规律而不是逐 tick 的噪声。
- 统一多任务:价格预测、波动率预测、形态生成,都可以在同一个自回归框架下表达。
2.3 模型家族与规格
Kronos 开源了一个模型家族,参数量从 4.1M 到 499M:
| 模型 | 上下文长度 | 参数量 | 是否开源 |
|---|---|---|---|
| Kronos-mini | 2048 | 4.1M | ✅ |
| Kronos-small | 512 | 24.7M | ✅ |
| Kronos-base | 512 | 102.3M | ✅ |
| Kronos-large | 512 | 499.2M | ❌ |
几个值得注意的点:
- 参数量出奇地小。和动辄 7B 起步的 LLM 相比,Kronos-base 只有 1 亿参数。这印证了一个行业共识:时序数据的「语法」远比自然语言简单,模型容量瓶颈不在参数量,在数据质量和表示方式。
- mini 版反而上下文最长(2048 vs 512),用的是独立的 2k tokenizer。这是典型的工程权衡:小模型算力便宜,可以吃更长历史;大模型精度高,但上下文开销要控制。
- 最大的 large 版不开源。基础模型开源、旗舰版闭源,这是当下 AI 项目的标准商业化路径,量化领域尤其如此——毕竟模型效果直接等于钱。
三、架构分析:Tokenizer 才是真正的护城河
很多人看到「金融 GPT」会以为核心是那个 Transformer,其实恰恰相反。Decoder-only Transformer 是成熟的商品化组件,Kronos 真正的技术壁垒在 tokenizer。
3.1 为什么通用 TSFM 在金融数据上不行
Google TimesFM、Amazon Chronos 这类通用时序基础模型,处理的是「广义时间序列」——电力负载、交通流量、销售数据。这些序列有一个共同点:信噪比相对高,周期性强。
金融 K 线完全是另一个物种:
- 多维强耦合:OHLC 四个价格维度之间有硬约束(high ≥ max(open, close),low ≤ min(open, close)),成交量和价格波动又有软关联。把它们当四条独立序列处理会丢掉关键结构。
- 重尾分布:收益率分布是典型的尖峰厚尾,极端行情(涨跌停、闪崩)恰恰是最有信息量的样本,但通用模型的归一化策略会把它们当离群值抹平。
- 多尺度自相似:5 分钟线和日线的形态语法既相似又不同,模型需要在 token 层面就感知时间粒度。
Kronos 的 tokenizer 把 OHLCV 作为一个整体做联合量化,保留了维度间约束;分层码本保证了对极端值的表达能力。这就是「领域专用 tokenizer」的价值——表示决定了模型能学到什么。
3.2 概率预测的工程接口
从 API 设计上能看出 Kronos 团队是懂量化工程的。predict 方法暴露了三个采样参数:
T(temperature):温度,控制采样的随机性top_p:nucleus sampling 的概率阈值sample_count:采样路径数,多条路径取平均(或统计分位数)
这套参数和 LLM 推理完全一致,但在金融场景下有了新的语义:temperature 实际上在控制你对市场分歧程度的假设,sample_count 控制的是蒙特卡洛路径数。想做 VaR 风险估计?把 sample_count 拉到 100,取 5% 分位数就是一个模型隐含的风险下界。
四、代码实战:从零跑通预测与批量推理
4.1 环境准备
git clone https://github.com/shiyu-coder/Kronos.git
cd Kronos
# Python 3.10+
pip install -r requirements.txt
模型权重托管在 Hugging Face Hub(NeoQuasar 组织下),国内环境建议先配置镜像:
export HF_ENDPOINT=https://hf-mirror.com
4.2 第一个预测:单标的 K 线预测
from model import Kronos, KronosTokenizer, KronosPredictor
import pandas as pd
# 1. 加载 tokenizer 和模型
tokenizer = KronosTokenizer.from_pretrained("NeoQuasar/Kronos-Tokenizer-base")
model = Kronos.from_pretrained("NeoQuasar/Kronos-small")
# 2. 初始化 predictor(max_context=512 是 small/base 的硬上限)
predictor = KronosPredictor(model, tokenizer, max_context=512)
# 3. 准备数据:历史 400 根 K 线,预测未来 120 根
df = pd.read_csv("./data/XSHG_5min_600977.csv")
df['timestamps'] = pd.to_datetime(df['timestamps'])
lookback, pred_len = 400, 120
x_df = df.loc[:lookback-1, ['open', 'high', 'low', 'close', 'volume', 'amount']]
x_timestamp = df.loc[:lookback-1, 'timestamps']
y_timestamp = df.loc[lookback:lookback+pred_len-1, 'timestamps']
# 4. 预测
pred_df = predictor.predict(
df=x_df,
x_timestamp=x_timestamp,
y_timestamp=y_timestamp,
pred_len=pred_len,
T=1.0,
top_p=0.9,
sample_count=1
)
print(pred_df.head())
几个工程细节值得注意:
- 输入必须带时间戳。
y_timestamp不只是占位符——模型会利用时间戳的周期特征(星期几、交易时段),这对日内数据尤其重要。 - lookback 不要超过 max_context。超长输入会被自动截断,但截断策略是「保留最近」,如果你的策略依赖远端历史(比如季节性),要自己做降采样。
- OHLC 必填,volume/amount 可选。缺失的成交量会被填零,但这会实质性降低预测质量——量价关系是 K 线语言里最重要的「语法」之一。
4.3 概率化预测:把点估计变成置信区间
把 sample_count 调大,就能得到概率化预测:
# 采样 30 条路径,评估预测的不确定性
import numpy as np
paths = []
for seed in range(30):
pred = predictor.predict(
df=x_df, x_timestamp=x_timestamp, y_timestamp=y_timestamp,
pred_len=pred_len, T=1.0, top_p=0.9, sample_count=1
)
paths.append(pred['close'].values)
paths = np.stack(paths) # shape: (30, 120)
p05 = np.percentile(paths, 5, axis=0) # 5% 分位(悲观情景)
p50 = np.percentile(paths, 50, axis=0) # 中位数(基准情景)
p95 = np.percentile(paths, 95, axis=0) # 95% 分位(乐观情景)
# 一个朴素的信号规则:仅当悲观情景仍然上涨时开多
signal = (p05[-1] > x_df['close'].iloc[-1])
这是 Kronos 相对传统回归模型最大的实用价值:同一个模型,既能给出方向判断,又能给出风险边界。在传统流程里这需要额外训练一个波动率模型(GARCH 之类)来配合。
4.4 批量推理:predict_batch
多标的场景(比如全市场选股)用 predict_batch 做 GPU 并行:
pred_df_list = predictor.predict_batch(
df_list=[df1, df2, df3],
x_timestamp_list=[x_ts1, x_ts2, x_ts3],
y_timestamp_list=[y_ts1, y_ts2, y_ts3],
pred_len=pred_len,
T=1.0, top_p=0.9, sample_count=1,
verbose=True
)
批量接口有三个硬约束:所有序列的 lookback 长度必须一致、pred_len 必须一致、每个 DataFrame 必须包含 OHLC 列。归一化是逐序列独立做的,所以不用担心不同价格量级的标的互相污染。
实测下来,Kronos-small 在单张消费级 GPU 上跑全 A 股(5000+ 标的、400 根 lookback)的批量日频预测,属于「泡杯咖啡就能跑完」的量级——这个成本对个人量化玩家是完全可接受的。
五、进阶实战:用 Qlib 在 A 股上微调
预训练模型学到的是「全球市场的通用语法」,但每个市场有自己的方言。Kronos 官方提供了基于微软 Qlib 的完整微调管线,以 A 股为例。
5.1 微调管线的四个步骤
pip install pyqlib
# 按 Qlib 官方文档准备本地日频数据
# Step 1: 修改 finetune/config.py 中的路径配置
# qlib_data_path / dataset_path / save_path / backtest_result_path
# pretrained_tokenizer_path / pretrained_predictor_path
# Step 2: 数据预处理(生成 train/val/test pickle)
python finetune/qlib_data_preprocess.py
# Step 3.1: 微调 tokenizer(适配本地市场的数据分布)
torchrun --standalone --nproc_per_node=2 finetune/train_tokenizer.py
# Step 3.2: 微调 predictor
torchrun --standalone --nproc_per_node=2 finetune/train_predictor.py
# Step 4: 回测评估(简单 top-K 策略)
python finetune/qlib_test.py --device cuda:0
5.2 为什么 tokenizer 也要微调
这是 Kronos 微调流程里最值得琢磨的设计:微调分两步,先调 tokenizer,再调 predictor。
原因回到码本的本质:tokenizer 的码本是在全球市场数据上学的「通用词表」,而 A 股有自己的特色词汇——±10% 涨跌停造成的价格截断、T+1 制度下的日内量价结构、散户主导的高换手特征。如果直接用通用码本,这些 A 股特有形态会被映射到不精确的 token 上,后面 predictor 调得再好也是在失真的表示上打补丁。
先让词表适配方言,再让语言模型学习方言的语法——这个顺序和 LLM 领域给专业语料扩词表再继续预训练的做法如出一辙。
5.3 官方的清醒声明:Demo ≠ 生产策略
难得的是,Kronos 在 README 里花了不小的篇幅泼冷水,明确指出示例管线只是教学演示:
- 原始信号 ≠ 纯 Alpha:模型输出的预测信号需要经过组合优化,中性化市场 beta 和规模、价值等风格因子暴露,才能提取出稳定的纯 alpha。
- 简单 top-K 策略只是起点:生产级策略需要动态仓位、止盈止损、风险预算。
- 回测必须建模交易成本:滑点、冲击成本、手续费,任何一项没建模,回测收益都可能是海市蜃楼。
见过太多「AI 炒股」项目拿一条不含交易成本的回测曲线出来忽悠人,Kronos 这种主动声明反而是专业度的体现。
六、性能与生产落地:五个工程建议
1. 模型选型:从 small 开始,不要迷信大参数。 24.7M 的 Kronos-small 与 102M 的 base 之间的效果差距,在多数下游任务里远小于「有没有做本地微调」的差距。先用 small 把管线跑通、把回测框架建扎实,再考虑升级。
2. 上下文管理:512 不够用时降采样,别硬截断。 需要更长历史视野时,与其塞更多细粒度 K 线,不如混合粒度:用日线承载长期趋势 + 小时线承载近期形态,分别预测再融合。或者直接用支持 2048 上下文的 mini 版做长程通道。
3. 推理优化:批量 + 半精度 + 缓存。 自回归生成 120 根 K 线意味着 120 步串行 decode,单序列推理无法充分利用 GPU。生产上务必用 predict_batch 把标的维度打满;权重转 fp16/bf16 基本无损;对日频场景,同一交易日内的预测结果直接缓存复用。
4. 分布漂移监控:给模型配一个「困惑度报警器」。 语言模型有困惑度(perplexity),Kronos 同样可以计算模型对最近实际走势的负对数似然。当这个值持续走高,说明市场进入了模型没见过的状态(政策突变、流动性危机)——这时候最理性的动作不是相信预测,而是降杠杆。这是把 LLM 的评估工具迁移到量化风控的一个直接可落地的点。
5. 永远做时间外验证(walk-forward)。 基础模型的预训练数据截止日期是一个必须搞清楚的元信息。如果你的回测区间和预训练数据重叠,那不是预测,是记忆。微调时严格按时间切分 train/val/test,回测只在预训练截止之后的区间上做。
七、总结与展望:TSFM 的「GPT-2 时刻」
把 Kronos 放到更大的坐标系里看,它的意义超出了「一个好用的预测工具」:
它验证了「领域专用基础模型」这条路线。 过去两年通用 TSFM 卷得厉害,但金融数据的特殊性决定了通吃模型很难做好。Kronos 用「专用 tokenizer + 通用 Transformer」的组合证明:领域知识应该沉淀在表示层,而不是模型结构里。这个经验对其他垂直领域(医疗信号、工业传感器、网络流量)同样适用。
它把量化研究的入场门槛又拉低了一截。 以前搞量化预测,你需要懂特征工程、懂模型调参、有算力训练。现在一个 from_pretrained 加十行代码就能得到一个见过 45 个交易所数据的预测器。这不意味着躺赚——alpha 的竞争只会转移到微调数据质量、信号后处理和执行层面——但研究的起点确实不一样了。
它也暴露了这条路线的天花板。 市场是自适应系统:当足够多的人用同一个基础模型做预测,模型捕捉的规律本身就会被交易行为消解。这是金融预测与天气预报的本质区别——天气不会因为你预测了它就改变。所以 Kronos 这类模型的长期价值大概率不在「直接预测赚钱」,而在成为量化管线中的一个标准化组件:形态识别、情景生成、风险估计、数据增强。
用 NLP 的历史类比,现在的 Kronos 更像是时序领域的 GPT-2:能力初显、生态未成、争议不断,但方向已经清晰。K 线是不是一门语言,市场会给出它自己的答案——不过在那之前,这 34K 个 Star 至少说明,程序员们已经用行动投了票。
项目地址:github.com/shiyu-coder/Kronos(MIT License)
论文:arXiv 2508.02739(AAAI 2026)
模型权重:Hugging Face NeoQuasar 组织