跳转至

存储选型与适配场景

当前推荐架构为:SQLite 主库 + 文件系统文档存储 + Parquet 行情湖 + DuckDB 查询引擎。

这个组合面向个人单机量化研究,目标是轻量、可备份、低维护成本,不引入 Docker 或常驻数据库服务。

分层选型

层次 选型 存储内容 适配场景
系统主库 SQLite + FTS5 配置、任务、策略元数据、回测记录、资源池、知识库元数据、文档分块索引、问答历史 单机、低并发写入、需要事务和全文检索的轻量业务数据
文档文件 文件系统 PDF、Word、Markdown、HTML、报告、按库隔离的正文、分块及来源清单 知识问答用zvec-grep读取当前有效分块;原件通过文件ID关联,兼容正文与目录仍保留于SQLite
行情湖 Parquet 历史行情、因子截面、回测面板、组合净值等列式数据 数据量持续增长、按日期/标的批量扫描、需要压缩和分区
查询引擎 DuckDB 直接查询 Parquet 文件,也可维护本地 DuckDB 文件 单机 OLAP 分析,不需要服务端数据库或 Docker

为什么 SQLite 仍然保留

SQLite 适合本系统的主库职责:

  • 单机应用开箱即用,数据库就是一个本地文件。
  • 配置、任务、策略记录、问答历史等写入频率低,事务边界清晰。
  • FTS5继续支持新闻等业务;知识库问答采用模型生成关键词与zvec-grep文件检索,见检索原理。
  • 备份简单,随 data/ 目录迁移即可。

SQLite 不适合长期承载全部行情矩阵:

  • 单写者模型不适合高频并发写入。
  • 全市场多年日线、分钟线、因子截面会形成大量列式扫描。
  • 大批量分析查询会影响同一个主库中的业务操作。

因此系统把 SQLite 定位为“主控账本”,把行情和因子大表放到 Parquet。

为什么选择 Parquet + DuckDB

Parquet 和 DuckDB 都是单机友好的轻量方案:

  • 不需要 Docker,不需要启动服务。
  • 可以用 pip、uv 或 conda 安装。
  • Parquet 是列式文件格式,适合行情、因子、回测面板这种按列扫描的数据。
  • DuckDB 可以直接查询 Parquet 文件,适合本地聚合、回测数据切片和研究报表。
  • 数据文件仍然位于本地目录,便于压缩、备份、移动和版本化管理。

适合放入 Parquet 的数据:

  • 日线、分钟线、指数、板块、成交额、换手率。
  • 因子截面、RankIC 结果、分层收益面板。
  • 回测中间面板、组合净值、候选池历史快照。

不建议放入 Parquet 的数据:

  • 用户配置、模型密钥、任务状态、订单状态机。
  • 需要频繁单行更新和事务约束的业务表。
  • 小而频繁的 UI 状态。

什么时候再升级

触发条件 建议
个人单机、日线/分钟线研究、文档只存路径 保持 SQLite + Parquet + DuckDB
多用户同时访问、权限隔离、远程服务化 评估 PostgreSQL
Tick 级行情、百亿级扫描、复杂实时聚合 评估 ClickHouse
多进程任务队列、跨进程共享缓存、推送状态流 再考虑 Redis

当前暂不引入 Redis。页面切换慢的主要瓶颈是 Gradio 组件挂载和回调渲染,Redis 不能直接解决这个问题;短期更有效的是页面懒加载、分页、进程内 TTL 缓存和 Parquet/DuckDB 数据分层。

当前配置项

系统设置页提供全局配置:

  • data_dir:系统数据根目录。
  • db_path:SQLite 主库路径。
  • document_storage_dir:文档文件目录。
  • market_parquet_dir:Parquet 行情湖目录。
  • duckdb_path:DuckDB 查询库路径。
  • data_timeout_seconds:外部数据请求超时。
  • data_http_retries:429/5xx 的 HTTP 重试次数。
  • data_cache_ttl_seconds:真实行情短时缓存 TTL 上限。
  • trading_calendar_path:全局交易日历路径。
  • scheduler_executors_path:自定义调度执行体白名单。

局部设置不进入系统设置页:AI/CLI 放在 AI 工作台,关系图谱深度、知识库 TopK、推荐参数网格等放在对应业务页面。