
1) 【一句话结论】
采用混合数据库架构,结合时序数据库存储时间序列回测结果(如净值、指标),关系型数据库管理策略元数据与维度信息,通过分区、索引优化查询,实现高效存储与查询回测数据。
2) 【原理/概念讲解】
strategy_backtest_fact):存储核心业务指标(如策略收益、夏普比率),是查询的核心数据源。time_dimension、strategy_dimension):存储辅助事实表查询的描述性数据(如时间、策略ID、参数),类比“事实表是超市的收银记录(每个时间点的销售额),维度表是客户(购买者信息)、商品(商品信息),通过客户和商品信息查询某个客户购买的商品的销售额”。3) 【对比与适用场景】
| 数据库类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 时序数据库(如TimescaleDB) | 专为时间序列数据设计 | 高写入速率、时间范围查询优化、自动压缩 | 回测结果的时间序列数据(如净值、指标)、日志数据 | 不适合复杂关联查询,写入非时间序列数据效率低 |
| 关系型数据库(如PostgreSQL) | 结构化数据存储,支持ACID事务 | 强一致性、复杂查询(JOIN)、索引优化 | 策略元数据(参数、配置)、维度信息(时间、策略分类) | 写入速率不如时序数据库,查询复杂时性能下降 |
4) 【示例】
strategy_backtest_fact,字段:backtest_id(主键)、strategy_id(外键,关联策略维度表)、timestamp(时间戳,存储回测时间)、strategy_params(JSONB存储参数)、net_value(浮点,净值)、sharpe_ratio(浮点,夏普比率)、max_drawdown(浮点,最大回撤)。time_dimension,字段:date(日期)、week_of_year(周)、quarter(季度)、year(年份)。strategy_dimension,字段:strategy_id(主键)、strategy_name(策略名称)、strategy_type(类型,如量化、基本面)、created_at(创建时间)。strategy_id=1)最近一年的净值曲线:
SELECT
t.date,
f.net_value
FROM
strategy_backtest_fact f
JOIN
time_dimension t ON f.timestamp::date = t.date
WHERE
f.strategy_id = 1
AND t.year = EXTRACT(YEAR FROM CURRENT_DATE) - 1
ORDER BY
t.date;
(注:TimescaleDB支持按时间范围查询,自动优化时间范围扫描,提升查询效率。)5) 【面试口播版答案】
面试官您好,针对回测数据量大,我建议采用混合数据库架构。核心思路是:用**时序数据库(如TimescaleDB)存储时间序列的回测结果(如净值、夏普比率),因为它天然支持时间范围查询,写入高效;用关系型数据库(如PostgreSQL)**管理策略元数据(参数、配置)和维度信息(时间、策略分类)。数据模型上,事实表(策略回测事实表)存储核心指标,维度表(时间、策略、参数维度表)辅助查询。查询优化方面,对事实表按时间分区(如按月),对维度表建立复合索引(如策略ID+时间戳),这样查询回测结果时,通过时间范围和策略ID快速过滤,聚合计算(如年化收益)效率高。比如查询某策略最近一年的净值曲线,可以按时间范围过滤事实表,连接时间维度表获取日期信息,快速生成图表。这种方案既保证了数据存储的高效性,又支持复杂查询,适合中低频策略回测数据的存储与查询需求。
6) 【追问清单】
7) 【常见坑/雷区】