Ich habe eine Liste von 6500 Artikeln, mit denen ich gerne handeln oder investieren würde. (Nicht für echtes Geld, sondern für ein bestimmtes Spiel.) Jeder Gegenstand hat 5 Nummern, die verwendet werden, um ihn unter den anderen zu ordnen / p>
Gesamtmenge des gehandelten Artikels pro Tag: Je höher diese Zahl, desto besser.
Der Donchian Channel des Artikels in den letzten 5 Tagen: Je höher diese Zahl, desto besser.
Die mittlere Streuung des Preises: Je niedriger diese Zahl, desto besser.
Die Verteilung des gleitenden 20-Tage-Durchschnitts für den Artikel: Je niedriger diese Zahl, desto besser.
Die Verteilung des gleitenden 5-Tage-Durchschnitts für den Artikel: Je höher diese Zahl, desto besser.
Alle 5 Zahlen haben das gleiche "Gewicht", oder mit anderen Worten, sie sollten alle die endgültige Zahl in dem gleichen Wert oder Wert betreffen.
Im Moment multipliziere ich einfach alle 5 Zahlen für jeden Gegenstand, aber es sortiert die Gegenstände nicht so ein, wie ich sie rangieren würde. Ich möchte nur alle 5 Zahlen zu einer gewichteten Zahl zusammenfassen, die ich verwenden kann, um alle 6500 Elemente zu ordnen, aber ich bin mir nicht sicher, wie ich das richtig oder mathematisch machen soll.
Hinweis: Die Gesamtmenge des gehandelten Artikels pro Tag und der Donchian-Kanal sind Zahlen, die viel höher sind als die Spreads, bei denen es sich mehr um prozentuale Typnummern handelt. Das ist wahrscheinlich der Grund, warum es für mich nicht funktionierte, sie alle zu vermehren; Die gehandelte Menge pro Tag und der Donchian-Kanal hatten eine viel größere Rolle in der endgültigen Zahl.
Normalerweise würden Sie Ihre Dateneinträge auf ihren jeweiligen Bereich normalisieren. Da es keinen festen Bereich für sie gibt, müssen Sie einen Gleitbereich verwenden - oder, um es einfacher zu halten, normalisieren Sie sie auf die täglichen Bereiche.
Erhalte für jeden Tag alle Einträge für einen bestimmten Typ, erhalte den höchsten und den niedrigsten von ihnen, ermittle den Unterschied zwischen ihnen. Lassen Sie Bottom = Wert des niedrigsten, Range = Unterschied zwischen dem höchsten und niedrigsten. Dann berechnen Sie für jeden Eintrag (Wert - Bottom) / Range, was zu etwas zwischen 0,0 und 1,0 führt. Das sind die Zahlen, mit denen du weiterarbeiten kannst.
Pseudocode (Klammern durch Einrückung ersetzt, um das Lesen zu erleichtern):
%Vor%so etwas. Ich werde mit einer guten Bibliothek eleganter sein (STL, Boost, was auch immer Sie auf der Implementierungsplattform haben), und die Normalisierung sollte in einer separaten Funktion sein, so dass Sie sie bei Bedarf durch andere Varianten wie log () ersetzen können .
Der Grund, warum Leute Schwierigkeiten haben, diese Frage zu beantworten, ist, dass wir keine Möglichkeit haben, zwei verschiedene "Attribute" zu vergleichen. Wenn es nur zwei Attribute gibt, sagen wir die gehandelte Menge und die mittlere Preisspanne, wäre (20 Millionen, 50%) schlechter oder besser als (100,1%)? Nur du kannst das entscheiden.
Alles in die gleiche Größe zu konvertieren könnte helfen, das ist die sogenannte "Normalisierung". Ein guter Weg, dies zu tun, ist der Z-Score, den Prasad erwähnt. Dies ist ein statistisches Konzept, bei dem untersucht wird, wie die Menge variiert. Sie müssen einige Annahmen über die statistischen Verteilungen Ihrer Zahlen treffen, um dies zu verwenden.
Dinge wie Spreads sind wahrscheinlich normal verteilt - wie eine normale Distribution . Nehmen wir für diese, wie Prasad sagt, z(spread) = (spread-mean(spreads))/standardDeviation(spreads)
.
Dinge wie die gehandelte Menge könnten eine Machtgesetzverteilung sein. Für diese möchten Sie möglicherweise die log()
vor der Berechnung der Mittelwert und SD zu nehmen. Das ist der Z-Score ist z(qty) = (log(qty)-mean(log(quantities)))/sd(log(quantities))
.
Dann addiere einfach den Z-Score für jedes Attribut.
Um dies für jedes Attribut zu tun, müssen Sie eine Vorstellung von seiner Verteilung haben. Sie könnten raten, aber der beste Weg ist, einen Graphen zu zeichnen und einen Blick darauf zu werfen. Vielleicht möchten Sie auch Diagramme in logarithmischen Skalen darstellen. Siehe Wikipedia für eine lange Liste .
Sie können jeden Attributvektor x
(der Länge N = 6500
) durch den z-Wert des Vektors Z(x)
ersetzen, wobei
Dies würde sie in die gleiche "Skala" umwandeln, und dann können Sie die Z-Scores (mit gleichen Gewichten) addieren, um eine endgültige Punktzahl zu erhalten, und die N=6500
-Einträge nach dieser Gesamtpunktzahl einstufen. Wenn Sie in Ihrem Problem einen anderen Attributvektor finden, der ein Indikator für "Güte" wäre (sagen Sie die 10-tägige Rückkehr der Sicherheit?), Dann könnten Sie ein Regressionsmodell dieses vorhergesagten Attributs gegen diese z-Punkte anpassen Variablen, um die besten nicht-einheitlichen Gewichte zu ermitteln.
Beginnen Sie jeden Gegenstand mit einer Punktzahl von 0. Sortieren Sie für jede der 5 Zahlen die Liste nach dieser Nummer und fügen Sie die Rangfolge jedes Gegenstands in dieser Sortierung zu seiner Punktzahl hinzu. Dann sortiere die Gegenstände einfach nach der kombinierten Punktzahl.
Gesamtmenge des gehandelten Artikels pro Tag: Je höher diese Zahl, desto besser. (a)
Der Donchian Channel des Artikels in den letzten 5 Tagen: Je höher diese Zahl, desto besser. (b)
Die mittlere Streuung des Preises: Je niedriger diese Zahl, desto besser. (c)
Die Verteilung des gleitenden 20-Tage-Durchschnitts für den Artikel: Je niedriger diese Zahl, desto besser. (d)
Die Verteilung des 5-Tage-Moving Averages für den Artikel: Je höher diese Zahl, desto besser. (e)
a + b -c -d + e="Punktzahl" (höhere Punktzahl = bessere Punktzahl)