存储选型与适配场景¶
当前推荐架构为: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、推荐参数网格等放在对应业务页面。