
如果把一段 K 线看成一句“金融语言”,那么模型能不能像理解文字一样,理解价格、成交量和波动?这是近年来金融时序大模型正在尝试回答的问题。
传统时间序列模型通常直接对连续数值进行预测,但金融市场的数据有一个很明显的特点:噪声高、波动大、非平稳性强。同样的上涨形态,换一个市场环境可能对应完全不同的结果。对于气温、流量等相对规律的时序数据表现不错的通用时序模型,放到 K 线上,往往并不能直接复现同样的效果。
作为全球首个专门为金融 K 线数据打造的开源基础模型,Kronos 已经拿下 GitHub 2 万+ Star。它没有简单地把 K 线当作普通的连续数值序列,而是借鉴大语言模型的思路,将 K 线离散化为模型可以理解的 Token,再通过自回归方式学习金融市场中的变化规律。可以应用于价格预测、波动率预测、合成 K 线生成。
今天我们就以 DolphinDB × Kronos 为例,从真实股票 K 线出发,模拟一个简单的 K 线预测案例,并进一步讨论,当数据从单只股票、短周期数据扩大到分钟级、多股票、海量历史数据甚至 DDP 多卡训练时,如何让 DolphinDB 直接成为 Kronos 的训练数据源。
以下案例基于 DolphinDB Server 3.00.5、Python 3.12、CUDA 13.2 和 PyTorch 2.11 环境进行部署与实验。
完成 Kronos 项目的环境部署并安装相关依赖后,先加载官方已经训练好的 Kronos-small 模型和对应的分词器:
tokenizer = KronosTokenizer.from_pretrained("NeoQuasar/Kronos-Tokenizer-base")
model = Kronos.from_pretrained("NeoQuasar/Kronos-small")
predictor = KronosPredictor(model, tokenizer, max_context=512)接下来,通过 DolphinDB Python API 查询真实股票 K 线数据,并整理成 Kronos 需要的格式——这里读取的是某只股票 2025 年以来的 5 分钟 K 线:
s = ddb.session()
s.connect("localhost", 8848, "admin", "123456") # 改为实际IP
script = '''
select trade_time as timestamps, open, high, low, close, vol as volume, amount
from loadTable("dfs://tushare_minute_db", "stock_5min_k")
where trade_date >= 2025.01.01 and code = `000514.SZ
'''
df = s.run(script)
df['timestamps'] = pd.to_datetime(df['timestamps'])拿到数据后,用过去 400 个时间点作为输入,预测未来 100 个时间点:
lookback = 400
pred_len = 100
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']
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
)至此,一条完整的 “DolphinDB 数据 → Kronos 模型 → K 线预测” 链路就跑通了。
上面的例子展示了如何从 DolphinDB 获取 K 线,并使用已经训练好的 Kronos 完成预测。对于数据量较小的场景,这种方式已经足够。
但如果进一步希望使用自己的历史 K 线数据对 Kronos 进行训练或微调,就需要面对更大规模的数据读取问题。尤其是在分钟级、多股票以及 DDP 多卡训练的场景下,数据量可能远超单机内存容量。
针对不同规模的训练数据,DolphinDB 提供了三种数据接入训练的方案:
方案 | 适用场景 |
|---|---|
一次性加载进内存 | 数据量小 |
分批取数存 pkl + DataLoader | 数据量中等 |
DDBDataLoader 直连训练 | 数据量大、DDP 多卡 |
前两种方式比较容易理解。
数据量小时,直接从 DolphinDB 取出来放进内存,最简单;数据量中等时,可以分批读取并保存为 pkl,再利用 PyTorch DataLoader 进行训练。
但如果数据规模继续扩大,这两种方式都会遇到一个共同的问题:数据最终还是要进入 Python 本地内存或本地文件。
这也是 DDBDataLoader 要解决的问题。
训练过程中,DDBDataLoader 按需从 DolphinDB 获取数据,并将数据组织成 PyTorch 训练所需要的 batch。对于数据量较大的 K 线训练任务,这种方式可以减少中间数据落盘和本地数据管理的工作。
如果进一步进入多卡训练场景,还需要额外考虑训练数据如何分配到不同进程。这里 DDBDataLoader 可以结合 DolphinDB 的分区存储方式,在代码中根据 rank 和 world_size 为不同 GPU 分配不同的数据范围。
总的来说,对于 Kronos 这种需要处理分钟级、多股票、大规模 K 线数据的模型,DDBDataLoader 更适合成为数据输入层:数据量小,直接读;数据量中等,可以分批落盘;数据量真正大起来,则让 DolphinDB 直接参与训练数据供给。
使用小贴士
steps_per_epoch 需要手动估算。 DDBDataLoader 从数据库实时获取数据,无法直接拿到全部数据的长度,也就没有 len 方法,因此训练时需要自己估算每个 epoch 的 step 数,建议宁高勿低,避免训练数据没有被充分遍历。dolphindb_tools。 DDBDataLoader 依赖该工具包,使用前需要完成相关环境和依赖安装。如果你手里也有沉淀多年的历史行情数据,不妨试着使用 DolphinDB 将数据接入 Kronos 进行训练,看看这个"读懂 K 线"的模型,能帮你的量化研究省下多少功夫。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。