2010-01-21 19 views
5

我們有大約7k種金融產品,其收盤價在理論上應該在特定的時間段(例如一週或一個月的時間段)內在一定的百分比範圍內上下移動。是否有一個很好的算法來檢查指定時間段內的數據更改?

我可以訪問存儲這些歷史數據的內部系統(而不是關係數據庫!)。我想編制一份報告,列出價格在這段時間內根本沒有變動或低於10%的產品。

我不能只比較第一個值(第1天)和最後的價值(第n天),因爲價格可能已經回到了最後一天會導致誤報的原因而產品的價格當然可能介於兩者之間。

是否有任何建立在算法合理計算時間做到這一點?

+0

@Patrick - 不是關係數據庫 - 它是什麼? – 2010-01-21 22:29:33

+0

這是一個實時價格數據庫(kdb + tic)。這是一個非常高性能的商店... – Patrick 2010-01-21 22:34:39

回答

5

如果需要經常檢查(爲大量的時間間隔,如每天的最後一年,而同組的產品),您可以存儲/月,每週每個項目的高值和低值。通過將正確的每週和/或每月邊界與間隔邊緣的一些原始數據相結合,您可以獲得整個間隔內的最小值和最大值。

+0

是的我想迭代價格數據並存儲總體的高低,然後找出它們之間的差異看起來像最明顯的方式和存儲間隔結果,以避免後續迭代也聽起來不錯.... – Patrick 2010-01-21 22:41:13

6

沒有任何辦法做到這一點不看的每一天。

假設數據看起來像這樣:

oooo0oooo 

隨着中間是一個爲期一天的高峯。除非您檢查發生峯值的那一天 - 換句話說,您需要檢查每一天。

3

如果您可以向kdb添加數據(即,您不限於讀取權限),則可以考慮將「上次價格變更後的天數」添加爲新的一組數據(即每個金融工具一個數字) 。然後每日任務將獲取今天的分數和昨天的分數,並更新存儲的數字。同樣,你可以維持近期(上個月,去年)的高點和低點kdb。您必須在較大的數據集上運行作業才能初始化值,但每日更新所涉及的數據會少得多。

建議,如果你採取這樣的事情,你有一些方法使數據集的全部或部分重新運行(比如添加新產品)。

最後 - 被歷史歸反對目前的價格? (即考慮到股票分割或類似的重新估價)。如果沒有,你需要檢測這些不連續性並將它們分開。

編輯

我調查USNG kdb+/Q執行信號處理,而不是提取原始數據的Java應用程序。正如你所說,這是非常高效的。

+0

謝謝,有一些好點。我們可以在商店中存儲更多的列,但我們現在寧願避免它。我們不需要處理交易後事件,如分割等,因爲這些都是我們自己的工具 - 幸運的是,這不適用。 – Patrick 2010-01-21 23:06:53

2

如果您可以在時間間隔內跟蹤價格的最小值和最大值,則可以執行此操作 - 假定時間間隔不會不斷變化。跟蹤不斷變化的項目集的最小值和最大值的一種方法是「背對背」放置兩個堆 - 您可以存儲這個和一些必要的指針,以查找和移除商店中一個或兩個數組中的舊項目。將兩堆堆放在背後的想法是Knuth的計算機編程藝術第3卷,練習31第5.2.3節。 Knuth把這種野獸稱爲Priority Dequeue,這似乎是可搜索的。最小值和最大值以不變的成本可用。新價格到達時修改它的成本是log n,其中n是存儲的項目數。

相關問題