kdb+历史数据库分区设计——每日上千品种数据

kdb+ historical database partitioning design - daily data on thousands of symbols

kdb+ 数据库存储 10,000 交易品种(例如股票、指数、ETF)的每日 price/return 数据的最佳分区(如果有)是什么?

我们谈论的是 25 年每个交易品种 (25 * 200 = 5,000 records) 的每日数据(中值)。所以整体大小将是 10,000 个符号 x 5,000 天 = 50,000,000 个记录。

数据库将在当天结束时为每个交易品种写入一个新价格。

最典型的查询是 读取 符号子集(10 秒甚至 100 秒)的整个每日价格历史记录到内存中,用于进一步的时间序列 analysis/portfolio模拟。

我正在考虑按符号进行分区,但在网上找不到任何人这样做,所以不确定这是否是最好的主意。 我发现了很多高于每日频率的解决方案,它们按 对报价数据进行分区(每个日期都有自己的分区,例如 2015-02-12),或按 符号范围(例如ABC DEF GHI ...),但不是个别符号.

在 backtesting/portfolio 模拟应用程序[1] 中,我怀疑通过能够计算价格转换(例如移动平均线或 RSI)通过给每个工作节点它自己的符号来处理。相反,按 day/week/year 分区不会提供该优势。

[1] 这基本上是首先循环每个符号并将其时间序列预处理为转换后的时间序列以生成信号(例如计算移动平均值的价格)。然后以路径相关(其中投资组合是有状态对象)的方式逐日循环,每天检查信号并根据信号采取行动

正如@GilbertLeBlanc 所说,50m 肯定不多,如果这是预期的大小,那么最好(在这个用例中)展开 table(即根本没有分区)在您将用于过滤的列上使用属性(p# org# on ticker,因为您将对其进行过滤,在插入新数据时注意维护这些属性)。但很明显,如果您确实计划扩展它(超过 100m 行),splay table 方法将无法很好地扩展。

如果您主要计划搜索特定符号的 所有 历史数据,那么日期分区将是一个坏主意(因为查询必须遍历每个日期分区 = 许多许多磁盘读取)。