Kronos:金融市场语言的基础模型
本文目录
Kronos 是首个面向金融 K 线(candlestick,K-line)的开源基础模型(foundation model),训练数据来自全球 45 个以上的交易所。
📰 新闻#
- 🚩 [2025.11.10] Kronos 已被 AAAI 2026 接收。
- 🚩 [2025.08.17] 我们发布了微调脚本!查看这些脚本,把 Kronos 适配到你自己的任务上。
- 🚩 [2025.08.02] 我们的论文现已在 arXiv 上线!
📜 简介#
Kronos 是一系列仅解码器(decoder-only)基础模型,专门针对金融市场的“语言”——K 线序列——进行预训练。与通用时间序列基础模型(TSFM)不同,Kronos 旨在处理金融数据独特的高噪声特性。它采用新颖的两阶段框架:
- 专门的 tokenizer 首先将连续的多维 K 线数据(OHLCV)量化为分层离散 token。
- 一个大型自回归 Transformer 随后在这些 token 上预训练,使其成为适用于多种量化任务的统一模型。
✨ 在线演示#
我们搭建了一个在线演示,用于可视化 Kronos 的预测结果。网页展示了 BTC/USDT 交易对在未来 24 小时的预测。
👉 在此访问在线演示
📦 模型库#
我们发布了一系列容量各异的预训练模型,以适应不同的计算和应用需求。所有模型都可以从 Hugging Face Hub 直接获取。
| 模型 | Tokenizer | 上下文长度 | 参数 | 开源 |
|---|---|---|---|---|
| Kronos-mini | Kronos-Tokenizer-2k | 2048 | 4.1M | ✅ NeoQuasar/Kronos-mini |
| Kronos-small | Kronos-Tokenizer-base | 512 | 24.7M | ✅ NeoQuasar/Kronos-small |
| Kronos-base | Kronos-Tokenizer-base | 512 | 102.3M | ✅ NeoQuasar/Kronos-base |
| Kronos-large | Kronos-Tokenizer-base | 512 | 499.2M | ❌ |
🚀 快速开始#
安装#
安装 Python 3.10+,然后安装依赖:
pip install -r requirements.txt
📈 进行预测#
使用 KronosPredictor 类进行 Kronos 预测非常直接。它负责数据预处理、归一化、预测和反归一化,让你只需几行代码就能从原始数据得到预测结果。
重要说明:Kronos-small 和 Kronos-base 的 max_context 为 512。这是模型能够处理的最大序列长度。为获得最佳性能,建议输入数据长度(即回看窗口,lookback)不要超过这一限制。KronosPredictor 会自动对更长的上下文进行截断。
以下是完成第一次预测的分步指南。
1. 加载 Tokenizer 和模型#
首先,从 Hugging Face Hub 加载预训练的 Kronos 模型及其对应的 tokenizer。
from model import Kronos, KronosTokenizer, KronosPredictor
# Load from Hugging Face Hub
tokenizer = KronosTokenizer.from_pretrained("NeoQuasar/Kronos-Tokenizer-base")
model = Kronos.from_pretrained("NeoQuasar/Kronos-small")
2. 实例化预测器#
创建 KronosPredictor 实例,传入模型、tokenizer 和目标设备。
# Initialize the predictor
predictor = KronosPredictor(model, tokenizer, max_context=512)
3. 准备输入数据#
predict 方法需要三个主要输入:
df:包含历史 K 线数据的 pandas DataFrame。必须包含['open', 'high', 'low', 'close']列。volume和amount是可选的。x_timestamp:与df中历史数据对应的 pandas Series 时间戳。y_timestamp:你想要预测的未来时间段的 pandas Series 时间戳。
import pandas as pd
# Load your data
df = pd.read_csv("./data/XSHG_5min_600977.csv")
df['timestamps'] = pd.to_datetime(df['timestamps'])
# Define context window and prediction length
lookback = 400
pred_len = 120
# Prepare inputs for the predictor
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. 生成预测#
调用 predict 方法生成预测。你可以通过 T、top_p 和 sample_count 等参数控制采样过程,进行概率预测。
# Generate predictions
pred_df = predictor.predict(
df=x_df,
x_timestamp=x_timestamp,
y_timestamp=y_timestamp,
pred_len=pred_len,
T=1.0, # Temperature for sampling
top_p=0.9, # Nucleus sampling probability
sample_count=1 # Number of forecast paths to generate and average
)
print("Forecasted Data Head:")
print(pred_df.head())
predict 方法返回一个 pandas DataFrame,包含 open、high、low、close、volume 和 amount 的预测值,并以你提供的 y_timestamp 作为索引。
为了高效处理多条时间序列,Kronos 提供了 predict_batch 方法,可以同时对多个数据集进行并行预测。当你需要一次预测多个资产或多个时间段时,这尤其有用。
# Prepare multiple datasets for batch prediction
df_list = [df1, df2, df3] # List of DataFrames
x_timestamp_list = [x_ts1, x_ts2, x_ts3] # List of historical timestamps
y_timestamp_list = [y_ts1, y_ts2, y_ts3] # List of future timestamps
# Generate batch predictions
pred_df_list = predictor.predict_batch(
df_list=df_list,
x_timestamp_list=x_timestamp_list,
y_timestamp_list=y_timestamp_list,
pred_len=pred_len,
T=1.0,
top_p=0.9,
sample_count=1,
verbose=True
)
# pred_df_list contains prediction results in the same order as input
for i, pred_df in enumerate(pred_df_list):
print(f"Predictions for series {i}:")
print(pred_df.head())
批量预测的重要要求:
- 所有序列必须具有相同的历史长度(回看窗口)。
- 所有序列必须具有相同的预测长度(
pred_len)。 - 每个 DataFrame 必须包含必需的列:
['open', 'high', 'low', 'close']。 volume和amount列是可选的,缺失时会用零填充。
predict_batch 方法利用 GPU 并行来高效处理,并会独立地为每条序列自动完成归一化和反归一化。
5. 示例与可视化#
如需一个包含数据加载、预测和绘图的完整可运行脚本,请参见 examples/prediction_example.py。
运行该脚本会生成一张图,将真实数据与模型预测进行对比,类似下图所示。
此外,我们还提供了一个不使用 Volume 和 Amount 数据进行预测的脚本,位于 examples/prediction_wo_vol_example.py。
🔧 在自己的数据上微调(A 股市场示例)#
我们提供了一条完整的流水线,用于在你自己的数据集上微调 Kronos。作为示例,我们演示如何使用 Qlib 准备中国 A 股市场的数据,并进行一次简单的回测。
免责声明:这条流水线旨在作为演示,用以说明微调过程。它是一个简化示例,并非生产就绪的量化交易系统。一个稳健的量化策略需要更复杂的技术,例如投资组合优化和风险因子中性化,才能获得稳定的 alpha。
微调过程分为四个主要步骤:
- 配置:设置路径和超参数。
- 数据准备:使用 Qlib 处理和划分数据。
- 模型微调:微调 Tokenizer 和 Predictor 模型。
- 回测:评估微调后模型的性能。
前置条件#
首先,确保已安装 requirements.txt 中的所有依赖。
这条流水线依赖 qlib。请安装它:
pip install pyqlib
你需要准备 Qlib 数据。请遵循 Qlib 官方指南,在本地下载并配置数据。示例脚本假设使用的是日频数据。
步骤 1:配置实验#
数据、训练和模型路径的所有设置都集中在 finetune/config.py 中。运行任何脚本之前,请根据你的环境修改以下路径:
qlib_data_path:本地 Qlib 数据目录的路径。dataset_path:处理后的训练、验证、测试 pickle 文件的保存目录。save_path:保存模型检查点的基础目录。backtest_result_path:保存回测结果的目录。pretrained_tokenizer_path和pretrained_predictor_path:你想作为起点的预训练模型路径(可以是本地路径或 Hugging Face 模型名)。
你也可以调整 instrument、train_time_range、epochs 和 batch_size 等其他参数,以适配具体任务。如果你不使用 Comet.ml,请设置 use_comet = False。
步骤 2:准备数据集#
运行数据预处理脚本。该脚本会从你的 Qlib 目录加载原始市场数据,进行处理,划分为训练集、验证集和测试集,并保存为 pickle 文件。
python finetune/qlib_data_preprocess.py
运行后,你会在配置中 dataset_path 指定的目录下找到 train_data.pkl、val_data.pkl 和 test_data.pkl。
步骤 3:运行微调#
微调过程分为两个阶段:先微调 tokenizer,再微调 predictor。两个训练脚本都设计为使用 torchrun 进行多 GPU 训练。
3.1 微调 Tokenizer#
这一步让 tokenizer 适应你所处特定领域的数据分布。
# Replace NUM_GPUS with the number of GPUs you want to use (e.g., 2)
torchrun --standalone --nproc_per_node=NUM_GPUS finetune/train_tokenizer.py
最佳的 tokenizer 检查点会保存到 config.py 中配置的路径(由 save_path 和 tokenizer_save_folder_name 派生)。
3.2 微调 Predictor#
这一步为预测任务微调主要的 Kronos 模型。
# Replace NUM_GPUS with the number of GPUs you want to use (e.g., 2)
torchrun --standalone --nproc_per_node=NUM_GPUS finetune/train_predictor.py
最佳的 predictor 检查点会保存到 config.py 中配置的路径。
步骤 4:通过回测评估#
最后,运行回测脚本评估你微调后的模型。该脚本会加载模型,在测试集上进行推理,生成预测信号(例如预测的价格变化),并运行一个简单的 top-K 策略回测。
# Specify the GPU for inference
python finetune/qlib_test.py --device cuda:0
脚本会在控制台输出详细的性能分析,并生成一张图,展示你的策略相对于基准的累计收益曲线,类似下图所示。
💡 从演示到生产:重要注意事项#
- 原始信号与纯 Alpha:这个演示中模型生成的信号是原始预测。在真实的量化工作流中,这些信号通常会被送入投资组合优化模型。该模型会施加约束,以中性化对常见风险因子的暴露(例如市场 beta,以及规模、价值等风格因子),从而分离出“纯 alpha”,提高策略的稳健性。
- 数据处理:提供的
QlibDataset只是一个示例。对于不同的数据源或格式,你需要调整数据加载和预处理逻辑。 - 策略与回测复杂度:这里使用的简单 top-K 策略只是一个基础起点。生产级策略通常会包含更复杂的投资组合构建、动态仓位管理和风险管理逻辑(例如止损/止盈规则)。此外,高保真回测应细致地建模交易成本、滑点和市场冲击,才能更准确地估计真实世界中的表现。
📝 AI 生成的注释#
请注意,finetune/ 目录中的许多代码注释是由 AI 助手(Gemini 2.5 Pro)为解释目的而生成的。虽然它们力求有帮助,但可能包含不准确之处。我们建议将代码本身视为逻辑的最终依据。
📖 引用#
如果你在研究中使用了 Kronos,我们希望你能引用我们的论文:
@misc{shi2025kronos,
title={Kronos: A Foundation Model for the Language of Financial Markets},
author={Yu Shi and Zongliang Fu and Shuo Chen and Bohan Zhao and Wei Xu and Changshui Zhang and Jian Li},
year={2025},
eprint={2508.02739},
archivePrefix={arXiv},
primaryClass={q-fin.ST},
url={https://arxiv.org/abs/2508.02739},
}
📜 许可证#
本项目采用 MIT 许可证。