Gibt es einen guten Algorithmus, um Änderungen der Daten über einen bestimmten Zeitraum zu überprüfen?

StackOverflow https://stackoverflow.com/questions/2113407

  •  22-09-2019
  •  | 
  •  

Frage

Wir haben rund 7.000 Finanzprodukte, deren Schlusspreise während eines bestimmten Zeitraums theoretisch innerhalb eines bestimmten prozentualen Bereichs auf und ab gehen sollten (z. B. eine Woche oder einen Monat Zeitraum).

Ich habe Zugriff auf ein internes System, das diese historischen Preise speichert (keine relationale Datenbank!). Ich möchte einen Bericht erstellen, der Produkte auflistet, deren Preis im Zeitraum nicht mehr oder weniger als 10% bewegt ist.

Ich kann den ersten Wert (Tag 1) nicht einfach mit dem Wert am Ende (Tag n) vergleichen, da der Preis möglicherweise auf das, was er am letzten Tag war hätte natürlich irgendwo dazwischen gewesen sein können.

Gibt es etablierte Algorithmen, um dies in angemessener Berechnung zu tun?

War es hilfreich?

Lösung

Wenn dies häufig überprüft werden muss (für eine große Anzahl von Intervall, wie täglich im letzten Jahr und für dieselbe Produkte), können Sie die hohen und niedrigen Werte jedes Elements pro Woche/Monat speichern. Durch die Kombination der richtigen wöchentlichen und/oder monatlichen Grenzen mit einigen Rohdaten an den Kanten des Intervalls können Sie den minimalen und maximalen Wert über das Intervall erhalten.

Andere Tipps

Es gibt keine Möglichkeit, dies zu tun, ohne jeden Tag zu betrachten.

Angenommen, die Daten sehen so aus:

oooo0oooo

Mit dieser eintägigen Spitze in der Mitte. Sie werden das nicht fangen, es sei denn, Sie überprüfen den Tag, an dem der Spike stattfindet - mit anderen Worten, Sie müssen jeden Tag überprüfen.

Wenn Sie KDB Daten hinzufügen können (dh Sie sind nicht auf Lesezugriff beschränkt), können Sie in Betracht ziehen, die Anzahl der Tage seit dem letzten Preisänderung als neue Datenmenge hinzuzufügen (dh eine Nummer pro Finanzinstrument). Eine tägliche Aufgabe würde dann die heutige Marke und das von dem von heute abholen und die gespeicherten Zahlen aktualisieren. In ähnlicher Weise könnten Sie die letzten (letzten Monat, letzten Jahr) Hochs und Tiefs in KDB beibehalten. Sie müssten einen Job über dem größeren Datensatz ausführen, um die Werte zunächst zu fördern, aber dann werden Ihre täglichen Updates viel weniger Daten beinhalten.

Empfehlen Sie, dass Sie, wenn Sie so etwas übernehmen, eine Möglichkeit haben, für alle oder einen Teil des Datensatzes auszutreten (z. B. für das Hinzufügen eines neuen Produkts).

Zuletzt - ist die Geschichte gegen aktuelle Preise normalisiert? (IE sind Revaluierungen für Aktienspalten oder ähnliche berücksichtige). Wenn nicht, müssten Sie diese Diskontinuitäten erkennen und sie teilen.

BEARBEITEN

Ich würde Usng untersuchen KDB+/q Um die Signalverarbeitung zu implementieren, anstatt die Rohdaten an eine Java -Anwendung zu extrahieren. Wie Sie sagen, ist es sehr leistungsfähig.

Sie können dies tun, wenn Sie während des Zeitintervalls den MIN- und Maximalwert des Preises verfolgen können. Dies setzt voraus, dass das Zeitintervall nicht ständig geändert wird. Eine Möglichkeit, die MIN- und maximalen Werte eines sich ändernden Elements zu verfolgen, besteht darin, dass zwei Haufen „Rücken an Rücken“ platziert werden. . Die Idee, zwei Haufen von Rücken an Rücken zu setzen, befindet sich in Knuths Art of Computer Programing Vol 3 als Übung 31 Abschnitt 5.2.3. Knuth nennt diese Art von Biest als Prioritäts -Dequeue, und dies scheint durchsuchbar zu sein. Min und Max sind zu ständigen Kosten erhältlich. Kosten für die Änderung, wenn ein neuer Preis ankommt, ist Protokoll N, wobei n die Anzahl der gespeicherten Artikel ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top