Java 是否有一个好的算法来检查指定时间段内数据的变化?

Java 是否有一个好的算法来检查指定时间段内数据的变化?,java,algorithm,kdb,Java,Algorithm,Kdb,我们有大约7k种金融产品,其收盘价理论上应在一定的百分比范围内在规定的时间内(比如一周或一个月)上下波动 我可以访问存储这些历史价格的内部系统(不是关系数据库!)。我想制作一份报告,列出在这段时间内价格没有变化或低于10%的任何产品 我不能仅仅比较第一天的价值(第1天)和最后一天的价值(第n天),因为价格可能会回到最后一天的价格,这会导致误报,而产品的价格可能会在这两者之间的某个地方暴涨 在合理的计算时间内,是否有任何已建立的算法可以做到这一点?如果不查看每一天,就没有任何方法可以做到这一点 假

我们有大约7k种金融产品,其收盘价理论上应在一定的百分比范围内在规定的时间内(比如一周或一个月)上下波动

我可以访问存储这些历史价格的内部系统(不是关系数据库!)。我想制作一份报告,列出在这段时间内价格没有变化或低于10%的任何产品

我不能仅仅比较第一天的价值(第1天)和最后一天的价值(第n天),因为价格可能会回到最后一天的价格,这会导致误报,而产品的价格可能会在这两者之间的某个地方暴涨


在合理的计算时间内,是否有任何已建立的算法可以做到这一点?

如果不查看每一天,就没有任何方法可以做到这一点

假设数据如下所示:

oooo0oooo

中间有一天的尖峰。除非你检查尖峰发生的那天,否则你不会发现这一点。换句话说,你需要每天检查。

如果需要经常检查(对于大量的间隔,如去年的每天,以及对于同一组产品),你可以每周/每月存储每个项目的高值和低值。通过将正确的周和/或月边界与间隔边上的一些原始数据相结合,可以在间隔上获得最小值和最大值。

< P>如果可以向KDB中添加数据(即,不限于读访问),则可以考虑将“自上次价格更改以来的天数”作为新的数据集添加。(即,每个金融工具一个数字)。然后,每天的任务将获取今天和昨天的标记,并更新存储的数字。同样,您可以维护最近(上个月、去年)的标记kdb中的高和低。您必须在较大的数据集上运行作业来初始化值,但是您的日常更新将涉及更少的数据

建议如果您采用这样的方式,您可以通过某种方式重新运行全部或部分数据集(例如添加新产品)

最后-历史是否与当前价格进行了标准化?(即是否考虑了股票分割或类似情况的重估)。如果没有,则需要检测这些不连续性并将其划分

编辑


我会研究usng来实现信号处理,而不是将原始数据提取到Java应用程序。正如您所说,它的性能很高。

如果您可以跟踪时间间隔内价格的最小值和最大值,则可以这样做-这假设时间间隔没有不断变化。kee的一种方法是ping跟踪一组不断变化的项目的最小值和最大值时,会“背靠背”放置两个堆-您可以将其和一些必要的指针存储在存储中的一个或两个数组中,以查找和删除旧项目。将两个堆背靠背放置在Knuth的《计算机编程艺术》第3卷练习31第5.2.3节Knuth c中所有这类beast都有一个优先级出列,而且似乎是可搜索的。最小值和最大值以固定成本提供。当新价格到达时,修改它的成本是log n,其中n是存储的项目数。

@Patrick-不是关系数据库-那是什么?这是一个实时价格的tic数据库(kdb+tic).这是一个性能非常好的存储…是的,我想迭代价格数据,存储整体的高低,然后计算出它们之间的差异,这看起来是最明显的方法,存储过程中的间隔结果以避免后续的迭代也很好…谢谢,有一些好的地方。我们可以存储附加内容Atic商店中的l列,但我们现在宁愿避免。我们不需要处理交易后事件,如拆分等,因为这些是我们自己的工具-所以幸运的是,这不适用。