当我们谈论金融时间序列的基础模型时,目光往往容易被模型架构本身所吸引 ——Transformer 层数、注意力机制、量化策略等。然而,决定一个基础模型能否真正理解「市场语言」的关键,往往在数据进入模型之前的预处理阶段。Kronos 作为首个专门针对金融 K 线数据训练的开源基础模型,其数据预处理流水线设计堪称典范。本文将深入解析这套 pipeline,揭示原始市场数据是如何被转化为模型可以学习的「金融语言嵌入」的。

从原始 K 线到模型输入:预处理的核心挑战

金融 K 线数据与自然语言有着本质区别。语言数据经过分词后具有相对稳定的语义边界,而 K 线数据则是连续的多维时间序列,每个时间步包含 Open(开盘价)、High(最高价)、Low(最低价)、Close(收盘价)、Volume(成交量)和 Amount(成交额)六个维度。更为关键的是,金融市场数据充斥着噪声 —— 流动性枯竭导致的零成交、涨跌停导致的的价格停滞、数据源错误产生的异常值,这些问题如果不在预处理阶段解决,会直接腐蚀模型的表示能力。

Kronos 的预处理流水线分为三个核心阶段:输入归一化、时间特征注入和数据质量过滤。这三个阶段协同工作,确保模型接收到的每一批数据都是「干净」的、富含市场周期信息的、且在数值尺度上一致的。

输入归一化:Z-Score 与截断的工程权衡

对于任何深度学习模型,输入数据的尺度统一都是基础中的基础。Kronos 采用两步归一化策略:第一步是对每个特征维度独立执行 Z-Score 标准化,即将每个维度减去其均值并除以标准差,使处理后的数据服从均值为 0、标准差为 1 的分布。公式可以表示为:x_normalized = (x - μ) / σ,其中 μ 和 σ 分别代表该维度在整个历史窗口内的均值和标准差。

第二步更为关键 —— 对标准化后的数值执行截断处理,将其限制在 [-5, 5] 区间内。这一设计的核心动机在于金融数据的极端值问题。金融市场存在「胖尾」特征,极端行情(black swan 事件)虽然发生概率低,但幅度可能远超正常波动数倍。如果不加限制,这些极端值会在前向传播中产生过大的梯度,导致训练不稳定。截断到 [-5, 5] 相当于假设极端值在正态分布视角下已经是超过 5 个标准差的离群点,进一步的幅度信息对模型学习的边际贡献已经很小,反而可能带来负面影响。

值得注意的是,这种截断策略在推理阶段同样适用。当新数据进入模型时,需要使用训练期间计算得到的均值和标准差进行归一化,确保分布一致性。

时间周期嵌入:捕获市场的节律性

金融市场的运行具有强烈的周期性 —— 日内波动模式、周内效应、季节性规律这些特征构成了「市场节律」的核心。Kronos 创新性地引入可学习的时间周期嵌入,为每个 K 线单元注入显式的时间上下文信息。

具体而言,模型为每个时间步提取五个时间特征:分钟位(minute-of-day,0-1439)、小时位(hour-of-day,0-23)、星期位(day-of-week,0-6)、月日位(day-of-month,1-31)和月份位(month-of-year,1-12)。每个特征通过独立的嵌入层映射为密集向量,五个嵌入向量求和后添加到对应 token 的输入表示中。这一设计让模型能够区分「周一开盘」与「周五收盘」的语义差异 —— 即使这两时刻的价格序列在数值上完全相同,其市场含义也可能截然不同。

从工程角度看,这种时间嵌入机制解决了金融时间序列建模中的一个经典难题:传统 RNN 或 LSTM 难以捕获长周期的季节性模式,因为信息需要在数百甚至数千个时间步的传播中保持完整。而通过直接注入周期信息,模型获得了「显式记忆」市场节律的能力。

低质量数据过滤:守护模型认知的防线

数据质量是基础模型的命门。Kronos 的预训练数据来自超过 45 个全球交易所、7 种时间频率、总量超过 120 亿条 K 线记录。在如此大规模的数据中,噪声数据的存在几乎是必然的。Kronos 设计了一套多阶段的数据清洗流水线,专门针对金融数据的特有噪声模式。

第一个清洗阶段是结构性断点分割。系统计算相邻 K 线之间的价格跳空幅度 —— 即当前开盘价与前一收盘价的相对变化。如果跳空幅度超过该时间频率的阈值(1 分钟数据为 10%,日线数据为 30%),则在该点将序列切分。这种处理能够有效隔离合约换月、股票分红、配股等事件导致的数据不连续性。

第二个阶段是流动性枯竭检测。系统识别连续零成交或极低成交的时段。不同频率的数据有不同的容忍阈值:1 分钟 K 线允许连续 15 个低流动性棒线,而日线仅允许 1 个。一旦超过阈值,该区域被标记为无效数据。

第三个阶段是价格停滞检测。当收盘价在连续多个时间步保持不变时,往往意味着数据源故障或市场长期停牌。系统同样根据时间频率设定不同的停滞阈值进行过滤。

经过三重过滤后,只有满足最小长度要求的连续有效数据段才会被送入预训练流程。这种「宁可错过、不可错入」的严格策略,是 Kronos 能够在下游任务中取得优异表现的重要保障。

成交量与成交额的特殊处理

Volume 和 Amount 在 Kronos 的设计中被赋予「辅助但非必需」的地位。系统对缺失的成交量数据采用零值填充策略,并额外引入了一项正则化技术:在训练过程中随机将 5% 样本的成交量和成交额强制置零。这一设计的精妙之处在于:它迫使模型学习仅基于价格信息进行预测的能力 —— 当某些市场数据源缺少成交量信息时(如部分场外交易或低频数据),模型依然能够做出合理预测。

从另一个角度看,这种随机置零操作也提升了模型的鲁棒性。真实市场中,成交量数据往往存在各种质量问题 —— 有的数据源提供的是代理指标(如持仓量),有的存在明显的统计口径差异。通过让模型在训练阶段就「习惯」缺失的成交量信息,测试时遇到类似情况的表现会更加稳定。

推理阶段的采样策略

预处理不仅服务于训练,同样影响推理效果。Kronos 在生成预测时使用温度采样(Temperature Scaling)和核采样(Top-p Sampling)的组合。温度参数 T 控制概率分布的平滑程度:较低的 T(如 0.6)会强化高概率分支,适合需要确定性的价格预测任务;较高的 T(如 1.0)则增加生成多样性,适合波动率预测或合成数据生成。Top-p 参数则动态调整采样池大小 —— 较小的 p 值限制采样的词汇表范围,较大的 p 值保持更多可能性。

这种「因任务而异」的采样策略,反映了预处理与推理的协同设计理念:相同的预处理流水线可以支撑多种下游任务,关键在于推理阶段的采样控制。

工程实践的参数清单

对于希望复现或改进 Kronos 预处理流程的开发者,以下核心参数值得关注。归一化方面,使用 Z-Score 标准化后截断至 [-5, 5],这一截断阈值对应约 2.87×10^-7 的极端值容忍度。时间嵌入维度与模型主维度保持一致(Kronos-small 为 512 维),五个周期特征的嵌入向量直接求和而非拼接,以保持输入维度简洁。

数据清洗参数需要根据具体时间频率调整。以日线数据为例,最大连续低流动性棒线阈值为 1,最大连续停滞棒线阈值为 3,最小有效段长度为 128。不同频率的参数组合存在显著差异,这是由于高频数据的噪声模式与低频数据完全不同。

批量处理时,所有序列需保持相同的回看窗口长度(lookback)和预测长度(pred_len),这是 Transformer 架构对输入一致性的本质要求。Kronos 支持的最长上下文为 512 个 token,超过此长度的序列会被自动截断。

结语

Kronos 的数据预处理流水线揭示了一个深刻的事实:金融基础模型的性能瓶颈往往不在模型架构的复杂度,而在于数据表征的质量与适应性。通过精心设计的归一化策略、时间周期嵌入、严格的数据清洗和质量控制,Kronos 成功将原始的市场数据流转化为模型可以高效学习的「离散语言」。这套 pipeline 不仅为 Kronos 本身奠定了坚实的技术基座,也为金融时间序列的基础模型研究提供了宝贵的工程参考 —— 毕竟,只有高质量的输入,才能孕育出真正理解市场语言的人工智能。

资料来源:本文技术细节主要参考 Kronos 论文(arXiv:2508.02739)及 GitHub 开源实现。