DolphinDB 在深度学习中的应用:股票实时波动率预测
本文介绍量化金融中深度学习落地的常见难点,并给出以 DolphinDB、AI DataLoader 与 Libtorch 插件串联的端到端流程示例,覆盖因子存储与计算、Python 侧训练、DolphinDB 侧实时推理等环节。
Source: https://dolphindb.cn/blogs/161
What this page covers
- 背景、挑战与一站式方案概览
- 现有方案的限制与工程代价
- 基于 Level 2 快照的特征因子计算与数据规模说明
- 使用 AI DataLoader 在 Python 中加载训练数据与建模训练
- 流式实时因子计算与回放测试思路
- 使用 Libtorch 插件在 DolphinDB 中进行实时推理与结果写入
- 实时预测性能与延迟拆分统计
技能认证特训营第二期正式开启(限时报名) navigation
页面顶部包含限时报名的推广信息,并提供注册入口与权益提示。
- 包含报名链接或入口信息。
- 强调活动具有时间限制。
DolphinDB 在深度学习中的应用:股票实时波动率预测 hero
文章头部展示标题、作者信息与发布日期。
- 发布日期为 2025-03-20。
- 该部分属于文章的头部信息区。
背景与挑战、DolphinDB 方案概览 value_proposition
该部分讨论深度学习在量化金融的工程落地难点,并将 DolphinDB 与 AI DataLoader、Libtorch 插件组合描述为一体化实现路径,同时说明教程范围与示例代码/环境注意事项。
- 列举落地难点包括大规模因子存储与计算。
- 列举落地难点包括因子实时流式计算。
- 列举落地难点包括因子数据与深度学习模型的工程化集成。
- 提到 AI DataLoader 与 Libtorch 插件用于对接深度学习框架。
- 声明重点在操作流程介绍,模型与结果仅供参考。
1. 概述 product_overview
该部分从算法交易工作流阶段出发,提出需要对比常见技术栈与 DolphinDB 一站式方法的动机。
- 按流程阶段讨论算法交易中的数据与计算需求。
- 引出与现有技术栈的对比与改进空间。
1.1 现有解决方案的优缺点 comparison
该部分介绍研究与实时因子常见方案,并指出在并行性、扩展性、高可用、开发与运维成本等方面的限制。
- 算法研究阶段常见方案包含 NAS 文件存储 + HDFS + Python。
- 指出 Python 受 GIL 影响难以并行计算。
- 指出 NAS/HDFS + Python 在容量扩展、性能与高可用方面可能不足。
- 指出某些实时计算实现仅支持全量计算而非增量计算。
- 指出以 C++ 复现研究代码会带来双代码维护与一致性成本。
1.2 DolphinDB 解决方案 how_it_works
该部分给出三阶段端到端流程:历史数据存储与离线因子计算、Python 侧训练数据加载与训练、以及在 DolphinDB 内结合流计算与 Libtorch 插件进行实时推理,并支持下游订阅。
- 阶段 1:在 DolphinDB 分布式数据库中存储历史行情并计算因子。
- 阶段 2:在 Python 中用 AI DataLoader 读取因子并转为 Tensor 用于训练。
- 阶段 3:训练模型可被 Libtorch 插件识别并在 DolphinDB 内推理。
- 结合流数据表与流计算引擎生成实时因子表与预测结果表。
- 实时预测结果表可被 Python 等策略程序订阅用于后续处理。
2. 特征因子计算与存储 how_it_works
该部分说明特征工程设置:基于 Level 2 快照数据构建 10 分钟频率的衍生特征(共 676 列),并持久化以支持模型训练,同时描述数据规模与样例数据范围。
- 输入数据为股票 Level 2 快照数据,快照间隔为 3 秒。
- 衍生特征的频率为 10 分钟。
- 衍生特征列数为 676 列。
- 示例提到已导入数据库的快照测试数据约 17 亿条。
- 附录样例快照数据为一支股票一个月范围。
2.1 特征因子计算 feature_list
该部分描述因子构建:使用 10 档盘口量价信息,并将 10 分钟窗口切分为多段进行聚合,得到 676 维特征;同时给出基于 DolphinDB 元编程的因子生成方式与性能对比表述。
- 因子基于 Level 2 快照中的 10 档买卖量价数据。
- 将 10 分钟窗口切分为 0-600s、150-600s、300-600s、450-600s 四段。
- 聚合后得到 676 维特征。
- 676 个因子由元编程动态生成,代码量不超过 70 行。
- 声明相同并行度下 DolphinDB 分布式计算较并行 Pandas 约提升 30 倍。
2.2 特征因子存储 how_it_works
该部分推荐因子库采用窄表存储,并给出 TSDB 引擎下的分区与排序策略示例。
- 推荐因子库采用窄表存储以便高效增删改因子。
- 本例使用 TSDB 存储引擎。
- 分区方式为时间按月 + 因子名的组合分区。
- 排序列为股票代码 + 交易时间。
3. 模型开发与训练 how_it_works
该部分描述在 Python 中用 AI DataLoader 从 DolphinDB 加载因子并训练 PyTorch 模型,以预测未来 10 分钟波动率,并给出目标变量名称。
- 预测目标变量为 LogReturn0_realizedVolatility。
- 使用 AI DataLoader 在 Python 侧加载因子用于模型训练。
- 训练目标为未来 10 分钟波动率预测。
3.1 AI Dataloader 加载训练数据 how_it_works
该部分说明 Python 依赖安装、数据预处理与训练/测试拆分,并展示 DDBDataLoader 的窗口化参数配置以生成时序张量。
- 安装依赖包含 pip install dolphindb 与 pip install dolphindb-tools。
- AI DataLoader 可将数据转换为深度学习框架可识别的 tensor。
- AI DataLoader 可拆分 SQL 查询以减少客户端内存占用。
- 窄表可用 pivot by 转成宽表以便在 Python 端转 tensor。
- 示例按日期 8:2 划分训练集与测试集。
3.2 模型搭建 how_it_works
该部分给出用于波动率时序预测的 LSTM 模型选择与相关结构定义。
- 模型类型选择为 LSTM。
- 模型用于波动率的时序预测任务。
3.3 模型训练 how_it_works
该部分展示使用 AI DataLoader 输出进行训练,并将模型以 TorchScript 格式保存以便服务端推理使用。
- 模型保存格式为 TorchScript(保存为 .pt)。
- 训练流程使用 PyTorch 风格训练循环。
- 训练数据来自 AI DataLoader(DDBDataLoader)的加载结果。
3.4 训练性能 trust_signal
该部分给出训练实验设置与耗时等信息,包括数据规模、特征维度、模型结构示例与训练设备说明。
- 示例训练 100 轮总耗时为 72 秒。
- 示例训练数据集规模为 5832 行(10 分钟频率,一年)。
- 示例特征为 676 个因子(输入维度 675,目标维度 1)。
- 损失函数为 SmoothL1Loss。
- 优化器为 Adam,初始学习率 0.0001。
4. 实时计算与预测 how_it_works
该部分描述将批处理逻辑迁移到流处理:将快照数据回放注入流表、实时计算因子、实时推理,并记录输出结果。
- 示例以 100 倍速回放一只股票一天的快照数据。
- 将快照数据注入到流表作为实时输入。
- 实时计算生成因子数据用于后续推理。
- 推理输出写入结果表以供读取或订阅。
4.1 流式实时因子计算 how_it_works
该部分说明流批一体实现:复用同一套因子函数,在历史计算中走 SQL 引擎,在流式计算中走聚合引擎,并用时序聚合引擎持续产出 10 分钟因子。
- 复用相同因子函数实现流批一体。
- 历史计算使用 SQL 引擎执行因子函数。
- 流式计算使用聚合引擎执行因子函数。
- 时序聚合引擎参数示例为 windowSize=600000ms,step=600000ms。
- 实时因子流表示例包含 676 个 DOUBLE 特征列。
4.2 使用 Libtorch 插件进行实时模型推理 how_it_works
该部分讲解在 DolphinDB 中加载 Libtorch 插件并进行实时推理:选择 CPU/GPU 插件、加载 TorchScript 模型、设置设备、从实时因子流取数并完成预处理与推理、将预测写入结果流表,并说明列顺序一致性、历史窗口与预热等注意点。
- CPU 插件名为 Libtorch,GPU 插件名为 GpuLibtorch。
- CPU 与 GPU 版本插件不能同时加载。
- 示例因 server 为 GPU 版本而加载 GpuLibtorch 插件。
- 示例推理设备设置为 Libtorch::setDevice(model, "CUDA")。
- 结果流表字段包含 Predicted、SecurityID、DateTime、ReceiveTime、HandleTime、PredictedTime。
- 示例窗口含义为 window=120:用 120 个时间点预测下一个时间点。
- 示例取当天往前 20 日十分钟因子作为历史窗口数据来源。
- 需要保证 676 维特征顺序与 Python 训练时一致。
- 示例使用 reorderColumns! 调整因子列顺序。
- 示例在实时预测前先调用一次模型用于预热。
4.3 通过 PythonAPI 实时订阅预测结果 how_it_works
该部分展示通过 DolphinDB Python API 订阅实时预测结果流表,并对到达的数据进行处理的示例方式。
- 订阅前进行 s.enableStreaming()。
- 使用 s.subscribe 订阅 result10min。
- 订阅参数示例 tableName="result10min"。
- 订阅参数示例 actionName="result10min"。
4.4 实时预测性能 trust_signal
该部分通过时间戳埋点拆分因子计算与模型推理延迟,并给出 100 倍速回放条件下的统计结果与脚本。
- 注入引擎时记录 ReceiveTime,计算结束记录 HandleTime。
- 因子计算耗时定义为 HandleTime-ReceiveTime。
- 推理结束记录 PredictedTime。
- 推理耗时定义为 PredictedTime-HandleTime。
- 示例单次响应平均总时延约 9.8 毫秒。
5. 总结 misc
该部分总结 DolphinDB 可支撑从因子计算到训练与实时推理的端到端流程,并强调该流程可根据需求调整扩展。
- 总结强调端到端流程覆盖离线与实时环节。
- 总结指出方案可按场景进行适配与调整。
附录 legal
附录列出开发环境规格,并提供相关脚本与样例数据文件链接。
- 列出开发环境 CPU 为 AMD EPYC 7513 32-Core Processor @ 2.60GHz。
- 列出开发环境 GPU 为 NVIDIA A800 80GB PCIe。
- 提供 snapshotDB.dos 等脚本资源链接。
- 提供 Level 2 快照样例数据 Snapshot.csv 链接。
Facts index
| Entity | Attribute | Value | Confidence |
|---|---|---|---|
| 文章 | 发布日期 | 2025-03-20 | high |
| DolphinDB | 定位/类型 | 分布式计算、存储及实时流计算一体化的高性能时序数据库 | medium |
| 本文示例场景 | 案例主题 | 股票实时波动率预测 | high |
| 深度学习在量化金融落地难点 | 列举的难点 | 大规模因子存储和计算;因子实时流式计算;因子数据与深度学习模型集成工程化 | high |
| DolphinDB | 与深度学习框架的结合方式 | 推出 AI DataLoader 和 Libtorch 插件等工具,以便与 PyTorch、TensorFlow 等深度学习框架紧密结合 | medium |
| 本文内容范围 | 包含的解决方案环节 | 高频因子存储与计算;在 Python 中使用 AI DataLoader 加载因子完成训练;在 DolphinDB 中使用 Libtorch 插件完成实时推理 | high |
| 本文预测模型与结果 | 适用性声明 | 重点在操作流程介绍,不提供最佳模型;模型与结果仅供参考 | high |
| 本文代码运行环境 | CPU/GPU 兼容性说明 | 示例使用 GPU 版本的 DolphinDB 与 GPU 版 LibTorch 插件,但也可用 CPU 版本运行本文代码 | high |
| 算法研究阶段常用方案 | 技术栈示例 | NAS 文件存储 + HDFS 大数据存储集群 + Python | high |
| Python (GIL) | 并行计算限制 | 受 Global Interpreter Lock 限制,无法进行并行计算 | medium |
| NAS/HDFS + Python 方案 | 在高频数据存取下的不足 | 容量可扩展性、性能和高可用逐渐难以满足不断增长的数据量与计算需求,且需要大量二次开发与持续运维成本 | medium |
| python 实时计算 | 增量计算能力 | 仅支持全量计算,不支持增量计算,难以满足实时计算性能要求 | medium |
| 研究代码用 C++ 复现的生产方案 | 代价 | 需要维护两套代码,开发成本(时间和人力)大幅增加,并需精力确保结果一致 | high |
| DolphinDB 一站式解决方案 | 阶段1:历史数据与离线计算 | 在 DolphinDB 分布式数据库中存储海量历史行情数据并进行大批量因子计算 | high |
| DolphinDB 一站式解决方案 | 阶段2:训练数据加载与训练 | 在 Python 中使用 AI DataLoader 读取因子并转换为深度学习框架可识别的 Tensor,用于模型训练 | high |
| DolphinDB 一站式解决方案 | 阶段3:实时推理与流计算 | 训练得到的模型可被 Libtorch 插件识别,在 DolphinDB 中完成推理;结合流数据表和流计算引擎得到实时因子表与实时预测结果表 | high |
| 实时预测结果表 | 下游对接方式 | 可被 Python 等策略程序订阅进行信号加工等后续操作 | high |
| 特征构建输入数据 | 数据来源与采样间隔 | 使用股票 Level 2 快照数据,每幅快照间隔时间为 3 秒 | high |
| 衍生特征 | 频率 | 10 分钟 | high |
| 衍生特征计算 | 特征列数 | 676 列衍生特征 | high |
| 快照测试数据(已导入数据库) | 数据量 | 约 17 亿条(2021 年某交易所所有股票快照测试数据) | medium |
| 附录提供的样例快照数据 | 范围 | 一支股票一个月的快照数据(Snapshot 文件) | high |
| 附录数据与训练数据差异 | 说明 | 模型训练使用全年数据;附录因大小限制仅提供一个月数据 | high |
| 因子计算 | 使用的盘口档位数据 | 基于 Level 2 快照行情数据中的 10 档买卖单量价数据 | high |
| 特征时间窗口切分 | 切分段 | 将 10 分钟特征切分为 0-600s、150-600s、300-600s、450-600s 四段 | high |
| 特征维度 | 聚合特征维度 | 676 维聚合特征 | high |
| 因子生成方式 | 代码量 | 676 个因子由元编程动态生成,代码量不超过 70 行 | high |
| 性能对比(因子计算) | 性能提升倍数 | 与多个 Python Pandas 进程并行计算相比,相同并行度的 DolphinDB 分布式计算约 30 倍性能提升 | medium |
| 因子存储模式 | 推荐 | 推荐使用窄表存储因子库(相对宽表更高效地添加/更新/删除因子) | medium |
| 本例因子库分区方式 | 组合分区 | 时间维度按月 + 因子名 的组合分区 | high |
| 本例因子库存储引擎 | 引擎 | TSDB | high |
| 本例因子库排序列 | 排序列 | 股票代码 + 交易时间 | high |
| 预测目标变量 | 目标列 | LogReturn0_realizedVolatility | high |
| AI DataLoader / DDBDataLoader | 作用 | 将训练数据转换为 PyTorch 等深度学习框架可识别的 tensor,并将 SQL 查询拆分以减少客户端内存占用 | medium |
| Python 依赖安装 | pip 包 | pip install dolphindb;pip install dolphindb-tools | high |
| DolphinDB 连接信息(示例) | host/port/user/password | 192.168.100.201:8848,admin/123456 | high |
| 训练数据日期范围(示例) | 范围 | 2021.01.01-2021.12.31 | high |
| 训练/测试集划分(示例) | 比例与方法 | 按日期 8:2 划分训练集与测试集 | high |
| 训练数据选取(示例) | 股票代码 | SecurityID=`600030 | high |
| 窄表转宽表 | 方法 | 使用 pivot by 语句将窄表因子转为宽表以便在 Python 端转 tensor | high |
| DDBDataLoader 参数(示例) | batchSize | 256 | high |
| DDBDataLoader 参数(示例) | windowSize | [120, 1](输入窗口 120 个时间点,目标窗口 1 个时间点) | high |
| DDBDataLoader 参数(示例) | windowStride | [1, 1] | high |
| DDBDataLoader 参数(示例) | offset | 120(目标相对输入偏移 120 个时间点) | high |
| DDBDataLoader 参数(示例) | excludedColumns | SecurityID, DateTime, LogReturn0_realizedVolatility | high |
| 模型类型选择 | 使用的模型 | LSTM(用于波动率的时序预测) | high |
| 模型结构(示例) | 层数与隐藏单元 | 3 层 LSTM:隐藏单元 256、128、32;输出层全连接输出维度 1 | high |
| Dropout 设置(示例) | 各层 dropout | LSTM1: 0.4;LSTM2: 0.3;LSTM3: 0.1 | high |
| 模型保存格式 | 格式 | TorchScript(torch.jit.script 后保存为 .pt) | high |
| 训练耗时(示例) | 训练 100 轮总耗时 | 72 秒(基于一支股票一年的 10 分钟因子数据) | medium |
| 训练数据集规模(示例) | 行数 | 5832 行(一年 10 分钟频率数据) | high |
| 特征与维度(训练示例) | 特征数量与输入/目标维度 | 676 个因子(输入维度 675,目标维度 1) | high |
| 训练超参数(示例) | 损失函数 | SmoothL1Loss | high |
| 训练超参数(示例) | 优化器与初始学习率 | Adam,初始学习率 0.0001 | high |
| 训练超参数(示例) | 训练轮数 | 100 轮 | high |
| 训练设备(示例) | 设备类型 | NVIDIA GPU(具体型号见附录) | medium |
| 实时测试数据回放 | 回放倍速 | 以 100 倍速回放一只股票一天的快照数据 | high |
| 流批一体方式(本例) | 实现思路 | 复用相同因子函数:历史计算代入 SQL 引擎,流式计算代入聚合引擎 | high |
| 时序聚合引擎参数(示例) | windowSize/step | windowSize=600000ms,step=600000ms(10 分钟) | high |
| 实时因子表(示例) | 输出特征数量 | 创建流表包含 676 个 DOUBLE 特征列(take(`DOUBLE, 676)) | high |
| Libtorch 插件 | CPU/GPU 插件名 | CPU 版本插件名 'Libtorch',GPU 版本插件名 'GpuLibtorch',且两者不能同时加载 | high |
| 本例推理插件选择 | 原因与选择 | DolphinDB server 为 GPU 版本(Shark),因此加载 GpuLibtorch 插件 | high |
| 模型推理设备设置(示例) | device | Libtorch::setDevice(model, "CUDA") | high |
| 实时预测结果表(示例) | 字段 | Predicted, SecurityID, DateTime, ReceiveTime, HandleTime, PredictedTime | high |
| 实时推理历史窗口(示例) | 历史数据范围 | 取当天往前 20 日的十分钟因子作为历史数据(用于 120 点窗口) | high |
| 实时推理窗口(示例) | 窗口大小含义 | window=120:用 120 个时间点的因子预测下一个时间点的波动率 | high |
| 因子列顺序一致性 | 约束 | 需要保证 676 维特征顺序与 Python 训练时一致,使用 reorderColumns! 调整顺序 | high |
| 模型预热(示例) | 目的 | 实时预测前先调用一次模型以避免第一次推理耗时较大(CUDA 初始化/预热等) | medium |
| Python 订阅流表 | 前置操作 | s.enableStreaming() 后使用 s.subscribe 订阅 result10min | high |
| Python 订阅参数(示例) | tableName/actionName | tableName="result10min",actionName="result10min" | high |
| 实时延迟统计方法 | 因子计算时延定义 | 在注入引擎时打 ReceiveTime,计算结束打 HandleTime;差值为因子计算耗时 | high |
| 实时延迟统计方法 | 模型推理时延定义 | 推理结束打 PredictedTime;PredictedTime-HandleTime 为推理耗时 | high |
| 单次响应总时延(示例) | 平均总时延 | 约 9.8 毫秒(100 倍速回放一天快照,单股票,LSTM 实时预测) | medium |
| 因子计算时延(示例) | 平均/95分位/最小/最大 | 平均 2ms;95分位 2ms;最小 2ms;最大 2ms | high |
| 模型推理时延(示例) | 平均/95分位/最小/最大 | 平均 7.5ms;95分位 8.7ms;最小 7ms;最大 12ms | high |
| 总时延(示例) | 平均/95分位/最小/最大 | 平均 9.8ms;95分位 10.7ms;最小 9ms;最大 14ms | high |
| 开发环境 CPU | 型号 | AMD EPYC 7513 32-Core Processor @ 2.60GHz | high |
| 开发环境逻辑 CPU 总数 | 数量 | 128 | high |
| 开发环境 GPU | 型号 | NVIDIA A800 80GB PCIe | high |
| 开发环境磁盘 | 配置 | NVMe * 1块 | high |
| 开发环境 CUDA | 版本 | 12.4 | high |
| 开发环境 OS | 版本 | 64 位 CentOS Linux 7 (Core) | high |
| DolphinDB 版本(开发环境) | 版本号 | 3.00.2.3 2024.11.04 LINUX_ABI x86_64 shark版本 | high |
| DolphinDB Python API 版本(开发环境) | 版本号 | 3.0.2.3 | high |
| Python 版本(开发环境) | 版本号 | 3.12.9 | high |
| 脚本资源链接 | snapshot 建库建表与文件导入 | snapshotDB.dos(docs.dolphindb.cn 链接) | high |
| 脚本资源链接 | 特征因子计算与存储脚本 | FeatureEngineering.dos(docs.dolphindb.cn 链接) | high |
| 脚本资源链接 | 模型训练脚本 | LSTMmodel.py(docs.dolphindb.cn 链接) | high |
| 脚本资源链接 | 模型实时推理脚本 | StreamComputing.dos(docs.dolphindb.cn 链接) | high |
| 数据资源链接 | Level 2 快照数据样例 | Snapshot.csv(docs.dolphindb.cn 链接) | high |