Heidi Labs
GitHub TrendingGitHub Trending 项目约 15 分钟5,950 字

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 旨在处理金融数据独特的高噪声特性。它采用新颖的两阶段框架:

  1. 专门的 tokenizer 首先将连续的多维 K 线数据(OHLCV)量化为分层离散 token。
  2. 一个大型自回归 Transformer 随后在这些 token 上预训练,使其成为适用于多种量化任务的统一模型。

✨ 在线演示#

我们搭建了一个在线演示,用于可视化 Kronos 的预测结果。网页展示了 BTC/USDT 交易对在未来 24 小时的预测。

👉 在此访问在线演示

📦 模型库#

我们发布了一系列容量各异的预训练模型,以适应不同的计算和应用需求。所有模型都可以从 Hugging Face Hub 直接获取。

模型Tokenizer上下文长度参数开源
Kronos-miniKronos-Tokenizer-2k20484.1M✅ NeoQuasar/Kronos-mini
Kronos-smallKronos-Tokenizer-base51224.7M✅ NeoQuasar/Kronos-small
Kronos-baseKronos-Tokenizer-base512102.3M✅ NeoQuasar/Kronos-base
Kronos-largeKronos-Tokenizer-base512499.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。

微调过程分为四个主要步骤:

  1. 配置:设置路径和超参数。
  2. 数据准备:使用 Qlib 处理和划分数据。
  3. 模型微调:微调 Tokenizer 和 Predictor 模型。
  4. 回测:评估微调后模型的性能。

前置条件#

首先,确保已安装 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 许可证。