我们有大约7k的金融产品,其理论价格在理论上会在一段时间内(例如一周或一个月)在一定的百分比范围内上下移动。
我可以访问存储这些历史价格的内部系统(不是关系数据库!)。我想制作一份报告,列出任何价格在这段时间内根本没有移动或低于10%的产品。
我不能只将第一个值(第1天)与结束时的值(第n天)进行比较,因为价格可能会回到最后一天的价格,这会导致误报,而当然,产品的价格可能介于两者之间。
在合理的计算时间内是否有任何已建立的算法?
答案 0 :(得分:5)
如果不看每一天都没有办法做到这一点。
假设数据如下:
oooo0oooo
中间有一天的飙升。除非你检查尖峰发生的那一天,否则你不会抓住它 - 换句话说,你需要检查每一天。
答案 1 :(得分:4)
如果需要经常检查(对于大量间隔,例如去年的每日间隔以及同一组产品),您可以存储每周/每月每个项目的高值和低值。通过将正确的每周和/或月界限与区间边缘的一些原始数据相结合,您可以获得该区间的最小值和最大值。
答案 2 :(得分:2)
如果您可以向kdb添加数据(即您不限于读取权限),您可以考虑将“自上次价格变动后的天数”添加为一组新数据(即每个金融工具一个数字)。然后,每日任务将获取今天的标记和昨天的标记,并更新存储的数字。同样,你可以保持最近(上个月,去年)kdb的高点和低点。您必须在较大的数据集上运行作业以初始化值,但随后您的每日更新将涉及更少的数据。
建议如果采用这样的方法,你可以通过某种方式重新运行全部或部分数据集(例如添加新产品)。
最后 - 历史是否按当前价格标准化? (即考虑到股票拆分或类似情况的重估)。如果没有,你需要检测这些不连续性并将它们分开。
修改的
我将调查usng kdb+/Q来实现信号处理,而不是将原始数据提取到Java应用程序。正如你所说,它具有很高的性能。
答案 3 :(得分:1)
如果您可以在时间间隔内跟踪价格的最小值和最大值,则可以执行此操作 - 这假设时间间隔未经常更改。跟踪一组不断变化的项目的最小值和最大值的一种方法是“背靠背”放置两个堆 - 您可以存储这个以及在商店中的一个或两个阵列中查找和删除旧项目所需的一些指针。将两个堆叠背靠背的想法是在Knuth的计算机程序设计第3卷中作为练习31第5.2.3节。 Knuth称这种野兽为优先出队,这似乎是可以搜索的。最低和最高价格不变。当新价格到来时修改它的成本是log n,其中n是存储的项目数。