☰
DolphinDB V3.00.04 2.00.17 版本更新:多资产统一数据模型 + 流式 SQL 实战配置指南
2026/9/26 11:08:03 网站建设 项目流程

1. 多资产统一数据模型到底解决了什么麻烦

如果你做量化投研或者实时行情处理,大概率遇到过这种局面:债券一套字段、期货一套字段、外汇即期又是另一套,写个跨资产组合估值,光字段映射和类型适配就能耗掉半天。DolphinDB 在 V3.00.04 与 2.00.17 里推出的多资产统一数据模型,核心就是把这件事收敛掉——它用 INSTRUMENT 和 MKTDATA 两类对象,把金融工具和市场数据抽象成统一的“可计算对象”,存进库表就是一列,计算接口也统一。

换句话说,你不再需要为每个资产类型写 if-else 去判断适配规则。传入标准 JSON 或 Dict,parseInstrument和parseMktData会把它解析成强类型内部对象,之后无论是曲线构建、曲面构建,还是定价估值、风险计算,都走同一套函数。对量化投研来说,这意味着跨资产组合的估值、定价、风险管理可以在一套代码里完成,而不是拼多个脚本。

这篇面向的是正在搭建统一数据底座的量化开发、行情中台和实时计算同学。我会给出可复制的 config.toml 骨架、流式 SQL 建表与订阅脚本,以及多资产数据写入与查询的验证动作。顺带把新版本里 MCP server、ORCA Raft Learner 这些容易和统一模型配合使用的点串一下,方便你判断哪些能力该先落地。

2. 前置准备:环境、配置与 TaoToken 接入

在动手写流式 SQL 之前,先把环境理顺。DolphinDB 单机或集群都可以,社区版足够跑通本文的验证流程。建议单独建一个数据目录,避免和已有实例冲突。

配置文件我习惯放在$DOLPHINDB_HOME/server/config.toml,下面是一份可复制的骨架,重点参数我都标了注释:

# config.toml 骨架,按需调整 mode = single localSite = localhost:8848 # 数据与日志目录,建议独立磁盘卷 dataDir = /data/dolphindb/data logDir = /data/dolphindb/log volumeDir = /data/dolphindb/volumes # 内存与并发,按机器规格调整 maxMemSize = 32 workerNum = 8 maxConnections = 128 # 流式 SQL 相关,开启共享变量权限控制 enableSharedVarCreationControl = true # 低延时场景可关注 Swordfish 相关参数 # lowLatency = true

启动后先用login("admin", "123456")进控制台。这里有个容易忽略的点:新版本增加了enableSharedVarCreationControl,设为 true 后创建共享变量会检查CREATE_SHARED_VAR权限。如果你在流式 SQL 里用share声明输入表,记得给对应用户授权,否则declareStreamingSQLTable会直接报权限错误。

如果你打算把 DolphinDB 和大模型侧打通,比如让 AI 代理通过自然语言查询时序数据,可以顺带了解下 MCP server 的接入方式。TaoToken 这边提供了统一的模型对话与 API Key 管理入口,方便你在调试 MCP 工具调用时快速切换模型:

  • 模型对话调试:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=model_chat
  • API Key 管理:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=api_keys
  • 接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=doc

API 基础地址是https://taotoken.net/api,不带 UTM,配置时直接用这个即可。注意,TaoToken 在这里的角色是模型侧的统一入口,DolphinDB 仍然是你的数据底座,两者通过 MCP 协议协作,不要混为一谈。

3. 可复制配置:统一数据模型建表与流式 SQL 订阅

先建统一数据模型的存储表。INSTRUMENT 和 MKTDATA 作为列存进去,配合parseInstrument、parseMktData使用。下面这段可以直接在控制台执行:

// 建库表,存放统一对象 db = database("dfs://unified_model", VALUE, 2024.01.01..2030.12.31) t = table(1:0, `instrumentId`instrument`mktData`updateTime, [SYMBOL, BLOB, BLOB, TIMESTAMP]) db.createPartitionedTable(t, `unifiedData, `updateTime)

写入时,把标准 Dict 解析成对象再落库:

bond = { "productType": "Cash", "assetType": "Bond", "bondType": "FixedRateBond", "version": 0, "instrumentId": "240025.IB", "start": 2024.12.25, "maturity": 2031.12.25, "issuePrice": 100.0, "coupon": 0.0149, "frequency": "Annual", "dayCountConvention": "ActualActualISMA" } instrument = parseInstrument(bond) fxSpot = { "mktDataType": "Spot", "spotType": "FxSpot", "version": 0, "referenceDate": 2025.08.18, "value": 7.2659, "unit": "USDCNY", "spotDate": 2025.08.20 } mktData = parseMktData(fxSpot) insert into db.unifiedData values("240025.IB", instrument, mktData, now())

接下来是流式 SQL 的核心。新版本的流式 SQL 采用基于状态变化的增量计算,注册一次查询,底层数据微变就只算增量并推送。建共享表、声明输入表、注册查询、订阅结果,五步走:

// step1: 共享表作为输入 t = table(1..10 as id, rand(100, 10) as val) share t as st // step2: 声明为流式 SQL 输入表 declareStreamingSQLTable(st) // step3: 注册流式 SQL 查询,支持多表关联、过滤、排序 qId = registerStreamingSQL("select cumavg(val) from st", "sql_avg") // step4: 订阅结果 subscribeStreamingSQL(queryId=qId) // step5: 查询结果表 select * from objByName(qId + "_result")

清理时按顺序取消订阅、注销查询、注销输入表:

unsubscribeStreamingSQL(queryId=qId) revokeStreamingSQL(queryId=qId) revokeStreamingSQLTable("st")

这里有个实战细节:流式 SQL 支持查询语句热更新和多语句并发订阅。如果你做实时行情面板,多个客户端订阅同一 qId,引擎只算一次增量,结果推给所有订阅端,比每个客户端各自跑全量 SQL 省资源得多。

4. 验证请求与成功结果

配置写完,得验证数据真的进去了、流式 SQL 真的在增量算。先验证统一模型写入:

select instrumentId, updateTime from db.unifiedData where instrumentId = "240025.IB"

返回一行记录,说明 INSTRUMENT 和 MKTDATA 已作为列存进分区表。接着验证定价链路,用统一定价函数跑一下:

// 传入 instruments + marketData + 定价时间 instrumentPricer(instrument, mktData, 2025.08.18)

如果返回估值结果而不是类型错误,说明统一对象模型和定价接口已经打通。组合定价用portfolioPricer,传入 instruments 加头寸信息即可,系统自动匹配模型。

流式 SQL 的验证更直观:往共享表st里持续插入新数据,然后查结果表:

// 模拟上游注入 insert into st values(11, 88) insert into st values(12, 66) // 查增量结果 select * from objByName(qId + "_result")

结果表里cumavg会随每次插入实时更新,而不是重算全量。实测下来,这种增量模式在逐笔行情场景里延迟明显低于传统全量重算。如果你要验证多表关联,把registerStreamingSQL里的 SQL 换成带 LEFT JOIN 的语句,引擎同样只对变化部分重算。

对于跨资产查询,可以结合跨数据库联邦查询,用createExternalTable把 Oracle、MySQL 或 Parquet 虚拟化成本地表,再和统一模型表做关联:

loadPlugin("odbc") oracle_cfg = dict(["connectionString"], ["Dsn=MyOracleDB"]) ext = createExternalTable("aka_name", "oracle", oracle_cfg) select t.name from ext t where t.id > 200 limit 50

5. 本篇常见错排查

权限报错CREATE_SHARED_VAR:新版本enableSharedVarCreationControl = true后,普通用户创建共享变量会被拦。解决方式是给用户授予CREATE_SHARED_VAR权限,或者临时把配置项设为 false 做验证。生产环境建议保留权限控制。

declareStreamingSQLTable找不到表:输入表必须先share成共享表,再声明。顺序反了会报表不存在。另外共享表名和声明名要一致。

流式 SQL 结果表查不到数据:确认subscribeStreamingSQL已执行,且上游确实往输入表写了数据。增量计算只在数据变更时触发,空表不会产生结果。

parseInstrument返回类型错误:检查 Dict 里的字段名和类型是否匹配标准定义。比如frequency用字符串 "Annual",start和maturity用日期类型,混用会导致解析失败。

磁盘写入失败:新版本引入了更细的磁盘容量检查,按每个数据副本所在 Volume 校验,而不是节点平均使用率。如果某个卷写满,即使整体还有空间也会失败。检查volumeDir下各卷的剩余空间。

ORCA 跨集群订阅不通:跨集群订阅语法是<流表名称>@<集群标识符>,集群标识符要配置正确。Raft Learner 场景下,Learner 节点异步复制,不参与投票,确认网络和配置后再排查。

6. 后续怎么接:模型侧与长期编码

统一数据模型和流式 SQL 落地后,下一步通常是把数据能力暴露给上层应用。如果你想让 AI 代理通过自然语言查询 DolphinDB,MCP server 是当前版本提供的路径,它支持自定义 tool 和 prompt 的配置维护,并对不同用户做权限控制。模型侧的统一入口可以用 TaoToken 的模型对话快速验证工具调用效果:

  • 模型对话:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=model_chat
  • API Key:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=api_keys
  • 接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=doc

如果你在做长期的量化编码或 Agent 工作流,需要稳定的模型调用额度,可以看下 Coding Plan:

  • Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=coding_plan

最后留一个实操建议:流式 SQL 的 qId 建议按业务语义命名,比如sql_avg、sql_vwap,方便在objByName(qId + "_result")时定位。清理时严格按 unsubscribe、revoke、revokeTable 的顺序,否则残留的订阅会持续占用资源。统一数据模型的字段定义最好沉淀成一份内部规范文档,团队协作时少踩字段类型不一致的坑。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询