DolphinDB × Kronos:海量 K 线高效训练的正确打开方式
如果把一段 K 线看成一句“金融语言”,那么模型能不能像理解文字一样,理解价格、成交量和波动?这是近年来金融时序大模型正在尝试回答的问题。

传统时间序列模型通常直接对连续数值进行预测,但金融市场的数据有一个很明显的特点:噪声高、波动大、非平稳性强。同样的上涨形态,换一个市场环境可能对应完全不同的结果。对于气温、流量等相对规律的时序数据表现不错的通用时序模型,放到 K 线上,往往并不能直接复现同样的效果。
作为全球首个专门面向金融 K 线数据构建的开源基础模型,Kronos 在 GitHub 上已经收获了 2 万 Star。它并没有把 K 线简单视作一串普通的连续数值序列来处理,而是借鉴了大语言模型的思路,先将 K 线离散化为模型能够理解的 Token,再通过自回归方式去学习金融市场里的变化规律。落到应用层面,这套方法可以用于价格预测、波动率预测,以及合成 K 线生成。
这次不妨就拿 DolphinDB × Kronos 这组组合来展开,直接从真实股票 K 线数据切入,演示一个简洁但完整的 K 线预测案例。再往后一步看,当数据规模不再停留在单只股票和短周期,而是一路扩展到分钟级、多股票、海量历史数据,甚至进入 DDP 多卡训练场景时,关键问题就变成了:怎样让 DolphinDB 直接接管 Kronos 的训练数据供给。
快速上手:用一段真实 K 线跑通 Kronos
完成 Kronos 项目的环境部署并安装相关依赖后,先加载官方已经训练好的 Kronos-small 模型和对应的分词器:
代码语言:ja vascript复制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 线:
代码语言:ja vascript复制s = ddb.session()s.connect("localhost", 8848, "admin", "123456")# 改为实际IPscript = '''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 个时间点:
代码语言:ja vascript复制lookback = 400pred_len = 100x_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 线预测” 链路就跑通了。
大规模数据下,如何让 Kronos 高效“吃”到 K 线?
上面的例子展示了如何从 DolphinDB 获取 K 线,并使用已经训练好的 Kronos 完成预测。对于数据量较小的场景,这种方式已经足够。
但如果进一步希望使用自己的历史 K 线数据对 Kronos 进行训练或微调,就需要面对更大规模的数据读取问题。尤其是在分钟级、多股票以及 DDP 多卡训练的场景下,数据量可能远超单机内存容量。
针对不同规模的训练数据,DolphinDB 提供了三种数据接入训练的方案:
方案 | 适用场景 |
|---|---|
一次性加载进内存 | 数据量小 |
分批取数存 pkl DataLoader | 数据量中等 |
DDBDataLoader 直连训练 | 数据量大、DDP 多卡 |
前两种方式比较容易理解。
数据量小时,直接从 DolphinDB 取出来放进内存,最简单;数据量中等时,可以分批读取并保存为 pkl,再利用 PyTorch DataLoader 进行训练。
但如果数据规模继续扩大,这两种方式都会遇到一个共同的问题:数据最终还是要进入 Python 本地内存或本地文件。
这也是 DDBDataLoader 要解决的问题。
DDBDataLoader:让 DolphinDB 直接成为训练数据源
训练过程中,DDBDataLoader 按需从 DolphinDB 获取数据,并将数据组织成 PyTorch 训练所需要的 batch。对于数据量较大的 K 线训练任务,这种方式可以减少中间数据落盘和本地数据管理的工作。
如果进一步进入多卡训练场景,还需要额外考虑训练数据如何分配到不同进程。这里 DDBDataLoader 可以结合 DolphinDB 的分区存储方式,在代码中根据 rank 和 world_size 为不同 GPU 分配不同的数据范围。
总的来说,对于 Kronos 这种需要处理分钟级、多股票、大规模 K 线数据的模型,DDBDataLoader 更适合成为数据输入层:数据量小,直接读;数据量中等,可以分批落盘;数据量真正大起来,则让 DolphinDB 直接参与训练数据供给。
使用小贴士
steps_per_epoch 需要手动估算。 DDBDataLoader 从数据库实时获取数据,无法直接拿到全部数据的长度,也就没有 len 方法,因此训练时需要自己估算每个 epoch 的 step 数,建议宁高勿低,避免训练数据没有被充分遍历。取数表建议合理分区。 对于股票 K 线这类数据,可以考虑按照股票代码等字段进行分区,减少查询时的数据扫描范围,否则数据量较大时可能影响取数性能。提前安装 dolphindb_tools。 DDBDataLoader 依赖该工具包,使用前需要完成相关环境和依赖安装。数据规模越大,越要关注数据读取效率。 模型训练本身只是整个流程的一部分,数据能否稳定、持续地供给 GPU,同样会直接影响整体训练效率。如果你手里也有沉淀多年的历史行情数据,不妨试着使用 DolphinDB 将数据接入 Kronos 进行训练,看看这个"读懂 K 线"的模型,能帮你的量化研究省下多少功夫。
-
- 元宵节猜灯谜的祝福短信
- 角色扮演 |
-
- 关于柯南的沙雕网名有哪些
- 角色扮演 | 1
- 网名
-
- 最新中性名字男女通用网名有哪些
- 角色扮演 | 1
- 网名
-
- 关于蓝色说唱的网名有哪些
- 角色扮演 | 1
- 网名
-
- 我好喜欢你是什么梗?
- 角色扮演 |