金融市场的"语言"
K 线不是图表,它是市场在说话——理解为什么 Kronos 把价格当文字读
每根 K 线都是一个单词
你打开交易软件,看到的那根根红绿柱子,叫做K 线。每根 K 线包含四个维度的信息:开(Open)、高(High)、低(Low)、收(Close),有时还包括成交量(Volume)。
Kronos 的核心洞察是:K 线序列就像句子,每根 K 线就像一个单词。既然 GPT 能通过"预测下一个词"学会人类语言,那为什么不能通过"预测下一根 K 线"来学会市场规律?
传统量化方法:人工设计因子(如 RSI、MACD),然后对这些因子建模。Kronos 方法:让模型自己从海量 K 线历史中"读懂"市场规律,就像 LLM 读书学语言一样。
训练数据:45 个全球交易所,覆盖全球市场
Kronos 的预训练数据集横跨 45 个全球交易所,包含数十年的 K 线历史。就像 LLM 需要读遍互联网上的文字才能理解语言,Kronos 需要读遍全球市场的历史才能理解价格走势。
美股市场
NYSE、NASDAQ 等主要交易所的历史数据
A 股市场
沪深两市的 A 股历史数据,含微调示例
加密货币
BTC/ETH 等主流加密资产,提供实时 Demo
其他市场
欧洲、亚洲、商品期货等多元市场
传统时间序列模型 vs Kronos:根本区别
针对单一任务设计;需要大量特征工程;不同市场需要不同模型;无法迁移学到的知识
一个模型,多种任务(预测、分类、异常检测);跨市场迁移学习;可以用少量数据微调适应新市场
Kronos 于 2025 年 8 月发表在 arXiv,并于 2025 年 11 月被 AAAI 2026 接受。这是首个专注于金融 K 线序列的开源基础模型。
知识检验:金融语言模型基础
你想用 Kronos 来预测印度股市(Nifty 50),但 Kronos 的预训练数据主要是美股。你应该怎么做?
Kronos 架构与预训练
两阶段设计:先把价格"翻译"成 Token,再让 Transformer 学习
两阶段:先翻译,后学习
Kronos 采用两阶段框架,就像一个翻译官学习外语:第一步,学习把外语(K 线数值)翻译成符号(离散 Token);第二步,用这套符号语言来理解和预测。
KronosTokenizer:把价格变成"词"
KronosTokenizer 的工作是:将连续的 OHLCV 数值(比如 0.123, 0.456...)转换成离散的整数 Token(比如 42, 137...)。这个过程叫做向量量化。
class KronosTokenizer(nn.Module):
def __init__(self, d_in, d_model,
s1_bits, s2_bits, ...):
self.embed = nn.Linear(d_in, d_model)
self.encoder = nn.ModuleList([...])
self.tokenizer = BSQuantizer(
s1_bits, s2_bits, ...)
self.decoder = nn.ModuleList([...])
KronosTokenizer 是一个神经网络模块
d_in:输入维度(OHLCV = 6 个数)
d_model:内部工作维度(如 512)
s1_bits + s2_bits:分层量化的精度设置
embed:把 6 个数映射到 512 维的"理解空间"
encoder:Transformer 编码器,提取模式
BSQuantizer:核心量化器,产生离散 Token
decoder:从 Token 重建原始数值(训练时用)
分层 Token:s1 + s2 的聪明设计
Kronos 采用了一个独特的分层量化策略,叫做 BSQ(Binary Spherical Quantization):
s1 Token(粗粒度)
捕捉 K 线的"大方向":涨还是跌?幅度大还是小?就像音乐的主旋律。
s2 Token(细粒度)
在 s1 确定方向后,捕捉具体细节:影线长短、开收关系。就像音乐的和声细节。
为什么这样设计?因为预测"大方向"比预测"精确数值"容易得多,且更可靠。先让模型确定方向,再精化细节——与人类交易员的思考方式一致。
直接预测浮点数非常困难——微小的误差在实际交易中影响巨大。将连续值转换成离散 Token,让问题从"回归"(预测精确数值)变成"分类"(预测哪个 Token),更适合 Transformer 架构。
Transformer 主干:Kronos 怎么"预测下一根 K 线"
Kronos 的核心是一个自回归 Transformer,和 GPT 系列使用相同的基本原理。它的前向传播逻辑展示了分层预测的实现:
def forward(self, s1_ids, s2_ids,
stamp=None, ...):
x = self.embedding([s1_ids, s2_ids])
if stamp is not None:
x = x + self.time_emb(stamp)
for layer in self.transformer:
x = layer(x)
s1_logits = self.head(x)
x2 = self.dep_layer(x, sibling)
s2_logits = self.head.cond_forward(x2)
return s1_logits, s2_logits
接收历史 K 线的 s1 和 s2 Token 序列作为输入
把 Token 转换为高维向量(Embedding)
如果有时间戳,加入时间位置信息(了解是周一还是收盘前)
通过多层 Transformer 提取时序模式
先预测 s1(大方向),得到粗粒度预测分数
dep_layer:依赖感知层,让 s2 的预测依赖于 s1
再预测 s2(细节),得到细粒度预测分数
返回两级预测结果
Kronos 为什么使用分层 Token(s1 + s2)而不是单层量化?
K 线数据到 Token 流水线
数据如何从 CSV 变成模型能理解的格式
就像食品加工厂:原料进去,产品出来
你有一份 CSV 文件,里面是 BTC/USDT 的 5 分钟 K 线历史数据。Kronos 的 KronosPredictor 负责整个"加工"流程:从原始 OHLCV 数据到最终的预测价格。
用 pandas 读取 CSV,确保包含 open/high/low/close 列,时间戳解析为 datetime
归一化将绝对价格转为相对变动,消除不同资产价格量纲差异
KronosTokenizer 将 OHLCV 数值序列转换为 s1+s2 离散 Token 序列
Kronos 模型接收 Token 序列,自回归生成未来 K 线的预测 Token
将预测 Token 转换回 OHLCV 数值,然后恢复实际价格尺度
KronosPredictor:一站式预测接口
所有上述步骤都被封装在 KronosPredictor 类中,让使用者只需要三个输入就能得到预测结果:
predictor = KronosPredictor(
model, tokenizer, max_context=512)
pred_df = predictor.predict(
df=x_df,
x_timestamp=x_timestamp,
y_timestamp=y_timestamp,
pred_len=120,
T=1.0,
top_p=0.9,
)
创建预测器,传入模型、分词器和最大上下文长度
max_context=512:最多看过去 512 根 K 线来预测
调用 predict() 方法,传入三类参数:
df:历史 K 线 DataFrame(过去的数据)
x_timestamp:历史数据的时间戳序列
y_timestamp:要预测的未来时间点
pred_len=120:预测未来 120 根 K 线
T=1.0, top_p=0.9:控制预测随机性(类似 LLM 的 temperature)
组件之间的对话:预测请求的流转
批量预测:同时预测多个资产
Kronos 提供了 predict_batch() 方法,可以并行处理多个时间序列,充分利用 GPU 并行能力:
df_list
多个资产的历史数据列表(如 [BTC_df, ETH_df, SOL_df])
x_timestamp_list
对应的历史时间戳列表,所有序列历史长度必须相同
y_timestamp_list
要预测的未来时间点,所有序列预测长度必须相同
verbose=True
显示进度条,方便监控批量预测的进度