FAQs zu JMA Was ist die Theorie hinter JMA. Warum hat JMA einen PHASE-Parameter. Hat JMA eine Zeitreihe prognostiziert. Werden vorherige JMA-Werte, die bereits geplottet wurden, ändern, wenn neue Daten ankommen. Kann ich andere Indikatoren mit JMA verbessern? Hat JMA eine besondere Garantie Wie sieht JMA mit anderen Filtern aus? ALLGEMEINE THEMEN auf JURIK-WERKZEUGEN Können die Werkzeuge viele Kurven auf jedem von vielen Diagrammen zeichnen. Können die Werkzeuge jede Art von Daten verarbeiten. Können die Werkzeuge in Echtzeit arbeiten. Sind die Algorithmen offenbart oder schwarz-boxed. Machen Jurik-Werkzeuge in die Zukunft einer Zeitreihe blicken. Haben die Werkzeuge ähnliche Werte über alle Plattformen (TradeStation, Multicharts). Werden die Werkzeuge von Juriks mit einer Garantie versehen. Wie viele Installations-Passwörter bekomme ich? Was ist die Theorie hinter JMA. TEIL 1. PREISGAPS Das Glätten von Zeitreihendaten, wie z. B. tägliche Börsenkurse, um unerwünschtes Rauschen zu beseitigen, erzeugt unweigerlich einen Graphen (Indikator), der sich langsamer bewegt als die ursprüngliche Zeitreihe. Diese quotslownessquot wird dazu führen, dass die Handlung etwas hinter der ursprünglichen Serie lag. Zum Beispiel wird ein 31 Tage einfacher gleitender Durchschnitt die Preiszeitreihen um 15 Tage verzögern. Lag ist sehr unerwünscht, weil ein Handelssystem, das diese Informationen verwendet, seinen Handel verzögert hat. Late Trades können oft schlechter sein als gar keine Trades, wie Sie auf der falschen Seite des Marktzyklus kaufen oder verkaufen können. Folglich wurden viele Versuche unternommen, um die Verzögerung zu minimieren, jedes mit ihren eigenen Fehlern. Erobernde Verzögerung, während keine vereinfachenden Annahmen (z. B. diese Daten bestehen aus überlagerten Zyklen, tägliche Preisänderungen mit einer Gaußschen Verteilung, alle Preise gleichermaßen wichtig sind usw.) ist keine triviale Aufgabe. Am Ende musste JMA auf der gleichen Technologie basieren, die das Militär benutzt, um bewegte Objekte in der Luft zu verfolgen, mit nichts mehr als ihrem lärmenden Radar. JMA sieht die Preis-Zeitreihe als lärmende Bild eines bewegten Ziels (der zugrunde liegende glatte Preis) und versucht, den Standort des realen Ziels (glatter Preis) abzuschätzen. Die proprietäre Mathematik wird modifiziert, um die besonderen Eigenschaften einer finanziellen Zeitreihe zu berücksichtigen. Das Ergebnis ist eine seidig glatte Kurve, die keine Annahmen über die Daten mit irgendwelchen zyklischen Komponenten macht. Infolgedessen kann JMA den Quoten-Dimequot verwandeln, wenn der Markt (bewegliches Ziel) entscheidet, die Richtung oder die Lücke zu ändern, Keine Preislücke ist zu groß. TEIL 2. ALLES SELBST Nach mehreren Jahren der Forschung haben wir Jurik Research festgestellt, dass der perfekte Rauschunterdrückungsfilter für Finanzdaten folgende Voraussetzungen hat: Minimaler Verzögerung zwischen Signal und Preis, sonst werden Handelsauslöser zu spät kommen. Minimales Überschwingen, sonst erzeugt das Signal falsche Preisniveaus. Minimaler Unterschwung, ansonsten geht die Wartezeit auf Konvergenz nach Preislücken. Maximale Glätte, außer in dem Moment, in dem die Preislücken auf ein neues Niveau fallen. Wenn diese bis zu diesen vier Anforderungen gemessen werden, sind alle gängigen Filter (außer JMA) schlecht. Hier ist eine Zusammenfassung der beliebtesten Filter. Gewichteter Bewegungsdurchschnitt - nicht auf Lücken reagieren Exponentieller Umzugsdurchschnitt - Übertriebene Unterschreitung Lärmende Adaptive Moving Averages - (nicht unsere), die typischerweise auf überdimensionierten Annahmen über Marktaktivitäten basieren, leicht getäuscht Regression Line - nicht auf Lücken reagieren übermäßige Überschreitung von FFT-Filtern - Leicht verzerrt durch Nicht-Gauß-Rauschen im Datenfenster ist typischerweise zu klein, um echte Zyklen genau zu bestimmen. FIR-Filter - ist bekannt als quotgroup delayquot. Kein Umweg, es sei denn, du willst einige Ecken schneiden. Siehe quotBand-Passquot-Filter. Band-Pass-Filter - keine Verzögerung nur in der Mitte des Frequenzbandes neigt dazu, oszillieren und überschreiten tatsächlichen Preisen. Maximale Entropie-Filter - leicht verzerrt durch Nicht-Gauß-Rauschen im Datenfenster ist typischerweise zu klein, um echte Zyklen genau zu bestimmen. Polynomfilme - nicht auf Lücken reagieren übermäßiges Überschwingen Im Gegensatz dazu integriert JMA Informationstheorie und adaptive nichtlineare Filterung auf einzigartige Weise. Durch die Kombination einer Bewertung des Informationsinhalts in einer Zeitreihe mit der Kraft der adaptiven nichtlinearen Transformation, drückt das Ergebnis die theoretische quotenvelopequot auf die finanzielle Zeitreihe Filterung fast so weit wie es gehen kann. Noch mehr und wed up gegen Heisenburgs Ungewissheitsprinzip (etwas, das niemand überwunden hat oder jemals wird). Soweit wir wissen, ist JMA das Beste. Wir laden jeden ein, uns anders zu zeigen. Für eine vergleichsweiseere Analyse der Fehler der populären Filter, laden Sie unseren Bericht quotThe Evolution of Moving Averagesquot aus unserem Special Reports Abteilung. Sehen Sie unseren Vergleich mit anderen beliebten Filtern. Warum hat JMA einen PHASE-Parameter. Es gibt zwei Möglichkeiten, um Rauschen in einer Zeitreihe mit JMA zu verringern. Wenn Sie den LENGTH-Parameter erhöhen, wird JMA sich langsamer bewegen und dadurch das Rauschen auf Kosten der hinzugefügten Verzögerung reduzieren. Alternativ können Sie die Menge an quotinertiaquot in JMA enthalten ändern. Trägheit ist wie physische Masse, je mehr Sie haben, desto schwieriger ist es, die Richtung zu wenden. So verlangt ein Filter mit viel Trägheit mehr Zeit, um die Richtung umzukehren und dadurch das Rauschen auf Kosten des Überschwingens während der Umkehrungen in der Zeitreihe zu reduzieren. Alle starken Rauschfilter haben Verzögerung und Überschwingen, und JMA ist keine Ausnahme. Die JMAs einstellbaren Parameter PHASE und LENGTH bieten Ihnen jedoch die Möglichkeit, den optimalen Kompromiss zwischen Verzögerung und Überschwingen zu wählen. Dies gibt Ihnen die Möglichkeit, verschiedene technische Indikatoren fein abzustimmen. Zum Beispiel zeigt das Diagramm (rechts) eine schnelle JMA-Linie, die eine langsamere JMA-Linie überquert. Um die schnelle JMA-Linie zu machen, drehen Sie den Quoten ein Dimequot, wenn der Markt sich umkehrt, es wurde eingestellt, um keine Trägheit zu haben. Im Gegensatz dazu wurde das langsame JMA auf große Trägheit gesetzt, wodurch seine Fähigkeit, sich während der Marktumkehr zu verkürzen, verlangsamte. Diese Anordnung bewirkt, dass die schnellere Linie so schnell wie möglich über die langsamere Linie kreuzt, wodurch niedrig verzerrte Überkreuzungssignale erzeugt werden. Die Benutzer-Kontrolle über eine Filter-Trägheit bietet eine beträchtliche Leistung über Filter, die diese Fähigkeit nicht haben. Hat JMA eine Zeitreihe prognostiziert. Es wird nicht in die Zukunft prognostiziert. JMA reduziert Lärm so ziemlich wie ein exponentieller gleitender Durchschnitt, aber oftmals besser. Werden vorherige JMA-Werte, die bereits geplottet wurden, ändern, wenn neue Daten ankommen. Nr. Für irgendeinen Punkt auf einem JMA-Plot werden nur historische und aktuelle Daten in der Formel verwendet. Infolgedessen werden, da neue Preisdaten zu späteren Zeitschlitzen kommen, diese Werte von JMA, die bereits aufgezeichnet sind, nicht betroffen sind und sich NIE ändern. Betrachten Sie auch den Fall, wenn die neueste Bar auf einem Diagramm in Echtzeit aktualisiert wird, da jedes neue Tick ankommt. Da sich der Schlusskurs der letzten Bar wahrscheinlich ändern wird, wird JMA automatisch neu bewertet, um den neuen Schlusskurs zu reflektieren. Allerdings bleiben historische Werte von JMA (auf allen vorherigen Stäben) unberührt und ändern sich nicht. Man kann eindrucksvolle Indikatoren für historische Daten erstellen, wenn er sowohl vergangene als auch zukünftige Werte, die jeden verarbeiteten Datenpunkt umgeben, analysiert. Jedoch kann jede Formel, die zukünftige Werte in einer Zeitreihe sehen muss, nicht im realen Welthandel angewendet werden. Dies liegt daran, dass bei der Berechnung des heutigen Wertes eines Indikators zukünftige Werte nicht existieren. Alle Jurik-Indikatoren verwenden in ihren Berechnungen nur aktuelle und vorherige Zeitreihendaten. Damit können alle Jurik-Indikatoren in allen Echtzeit-Bedingungen arbeiten. Kann ich andere Indikatoren mit JMA verbessern Ja. Normalerweise ersetzen wir die meisten gleitenden Durchschnittsberechnungen in klassischen technischen Indikatoren mit JMA. Dies führt zu reibungsloseren und aktuelleren Ergebnissen. Zum Beispiel, durch einfaches Einfügen von JMA in die Standard-DMI technische Indikator, produzierten wir die DMX-Indikator, die mit Ihrer Bestellung von JMA kostenlos kommt. Hat JMA eine besondere Garantie Wenn Sie uns einen nicht-proprietären Algorithmus für einen gleitenden Durchschnitt zeigen, dass, wenn es kodiert ist, um entweder in TradeStation, Matlab oder Excel VBA laufen zu lassen, führt es quittierbar als unser gleitender Durchschnitt in kurzen, mittleren und langen Zeitrahmen von Ein zufälliger Spaziergang, gut zurückerstattet Ihre gekaufte Benutzerlizenz für JMA. Was wir mit quotbetterquot meinen, ist, dass es im Durchschnitt glatter sein muss, ohne eine größere durchschnittliche Verzögerung als unsere, kein größeres durchschnittliches Überschwingen und kein größeres durchschnittliches Unterschreiten als unser. Was wir mit quotshort bedeuten, mittel - und langzeitrahmen ist, dass die Vergleiche drei getrennte JMA-Längen beinhalten müssen: 7 (kurz), 35 (mittel), 175 (lang). Was wir mit einem zufälligen Spaziergang meinen, ist eine Zeitreihe, die durch eine kumulative Summe von 5000 Null-Mittelwert, Cauchy verteilte Zufallszahlen, erzeugt wird. Diese beschränkte Garantie ist gut für nur den ersten Monat, in dem Sie eine Benutzerlizenz für JMA von uns oder einem unserer weltweiten Händler gekauft haben. Wie funktioniert JMA mit anderen Filtern. Der Kalman-Filter ähnelt JMA darin, dass beide leistungsstarke Algorithmen sind, die für die Schätzung des Verhaltens eines lärmenden dynamischen Systems verwendet werden, wenn alle, mit denen Sie arbeiten müssen, laute Datenmessungen sind. Der Kalman-Filter schafft reibungslose Prognosen der Zeitreihe, und diese Methode ist für die finanziellen Zeitreihen nicht ganz angemessen, da die Märkte anfällig sind, heftige Gyrationen und Preislücken herzustellen, Verhaltensweisen, die nicht typisch für reibungslos funktionierende dynamische Systeme sind. Folglich fällt die Kalman-Filterglättung häufig hinterher oder überschreitet Marktpreis-Zeitreihen. Im Gegensatz dazu verfolgt JMA die Marktpreise eng und reibungslos, passt sich den Lücken an und vermeidet unerwünschte Überschreitungen. Siehe Beispiel unten für ein Beispiel. Ein Filter, der in populären Zeitschriften beschrieben wird, ist der Kaufmann gleitenden Durchschnitt. Es ist ein exponentieller gleitender Durchschnitt, dessen Geschwindigkeit je nach Preiswirkungsgrad variiert. Mit anderen Worten, wenn die Preisaktion in einem klaren Trend mit wenig Retracement ist, beschleunigt der Kaufmann-Filter und wenn die Aktion überstürzt, verlangsamt sich der Filter. (Siehe Grafik oben) Obwohl seine adaptive Natur hilft es zu überwinden, einige der Verzögerung typisch für exponentielle gleitende Durchschnitte, es immer noch deutlich hinter JMA. Lag ist ein grundsätzliches Thema für alle Händler. Denken Sie daran, jede Bar von Verzögerung kann Ihre Trades verzögern und verweigern Sie profitieren. Ein weiterer gleitender Durchschnitt, der in populären Zeitschriften beschrieben wird, ist Chandes VIDYA (Variable Index Dynamic Average). Der Index, der am häufigsten in VIDYA verwendet wird, um seine Geschwindigkeit zu bestimmen, ist die Preisvolatilität. Da die kurzfristige Volatilität zunimmt, ist der exponentielle gleitende Durchschnitt von VIDYAs schneller verschoben, und da die Volatilität abnimmt, verlangsamt sich VIDYA. Auf der Oberfläche macht das Sinn. Leider hat dieses Design einen offensichtlichen Fehler. Obwohl die seitliche Stauung ungeachtet ihrer Volatilität gründlich geglättet werden sollte, würde eine sehr volatile Stauperiode von VIDYA genau verfolgt (nicht geglättet). Folglich kann VIDYA nicht unerwünschtes Rauschen entfernen. Zum Beispiel vergleicht das Diagramm JMA mit VIDYA, beide setzen auf einen Abwärtstrend gleich gut. Doch während der anschließenden Stauung versäumt VIDYA, die Preisspitzen zu glätten, während JMA erfolgreich durch das Geschwätz gleitet. In einem anderen Vergleich, in dem sowohl VIDYA als auch Juriks JMA auf die gleiche Glätte gesetzt wurden, sehen wir in der Tabelle, dass VIDYA hinterherhinkt. Wie bereits erwähnt, kann spätes Timing leicht stehlen Ihre Gewinne in jedem Handel. Zwei weitere populäre Indikatoren sind T3 und TEMA. Sie sind glatt und haben wenig Verzögerung. T3 ist das bessere von den beiden. Trotzdem kann T3 ein ernstes Überschwingungsproblem aufweisen, wie in der folgenden Tabelle zu sehen ist. Abhängig von Ihrer Anwendung, können Sie nicht wollen, dass ein Indikator zeigt ein Preisniveau der reale Markt nie erreicht, da dies unbeabsichtigt initiieren können unerwünschte Trades. Hier sind zwei Kommentare gefunden, die auf relevanten Internetforen veröffentlicht wurden: "Der T3-Indikator ist sehr gut (und Ive sang sein Lob vor, auf dieser Liste). Allerdings hatte ich die Möglichkeit, einige alternative Marktmessungen abzuleiten und ich glätte sie. Sie haben sich manchmal ziemlich schlecht benommen. Wenn sie sie glätten, wird T3 instabil und schlägt schlecht, während JMA direkt durch sie hindurchläuft. Allan Kaminsky allank xmission quotMy eigenen Blick auf JMA ist im Einklang mit dem, was andere Leute geschrieben haben (Ive verbrachte viel Zeit visuell Vergleich von JMA zu TEMA Ich würde nicht jetzt über die Verwendung von TEMA anstelle von JMA denken.) Steven Buss sbuss pacbell Ein Artikel in der Jan. 2000 Ausgabe von TASC beschreibt einen gleitenden Durchschnitt, der in den 1950er Jahren entworfen wurde, um eine niedrige Verzögerung zu haben. Sein Erfinder, Robert Brown, entwarf die quotModified Moving Averagequot (MMA), um Verzögerung bei der Schätzung der Vorräte zu reduzieren. In seiner Formel schätzte die lineare Regression den Kurvenstromimpuls, der wiederum zur Schätzung der vertikalen Verzögerung verwendet wird. Die Formel subtrahiert dann die geschätzte Verzögerung von dem gleitenden Durchschnitt, um niedrige Verzögerungsergebnisse zu erhalten. Diese Technik funktioniert ok auf gut erzogenen (reibungslos übergangenden) Preiskarten, aber dann wieder, also die meisten anderen erweiterten Filter. Das Problem ist, dass der echte Markt alles andere als gut erzogen ist. Ein wahres Maß an Fitness ist, wie gut jeder Filter auf realen Finanzdaten arbeitet, eine Eigenschaft, die mit unserer gut etablierten Batterie von Benchmark-Tests gemessen werden kann. Diese Tests zeigen, dass MMA Preisdiagramme überschreitet, wie unten dargestellt. Im Vergleich dazu kann der Benutzer einen Parameter in JMA setzen, um den Betrag des Überschwingens einzustellen, sogar vollständig zu eliminieren. Es ist deine Entscheidung. Denken Sie daran, das letzte, was Sie wollen, ist ein Indikator zeigt ein Preisniveau der reale Markt nie erreicht, da dies unbeabsichtigt initiieren unerwünschte Trades. Mit MMA haben Sie keine Wahl und müssen sich mit Überschwemmung, ob Sie es mögen oder nicht. (Siehe untenstehende Tabelle) Die Ausgabe von TASC im Juli 2000 enthielt einen Artikel von John Ehlers, der ein quotModified Optimal Elliptical Filterquot beschreibt (Abkürzung hier als quotMEFquot). Dies ist ein hervorragendes Beispiel für die klassische Signalanalyse. Die nachstehende Grafik vergleicht MEF mit JMA, deren Parameter (JMA length7, phase50) so eingestellt wurden, dass JMA möglichst ähnlich wie MEF ist. Der Vergleich zeigt diese Vorteile bei der Verwendung von JMA: JMA reagiert schneller auf extreme Preisschwankungen. Folglich werden alle Schwellwerte, die zum Auslösen von Signalen verwendet werden, früher durch JMA ausgeführt. JMA hat fast kein Überschwingen, so dass die Signalleitung genauer verfolgen Preis Aktion direkt nach großen Preisbewegungen. JMA gleitet durch kleine Marktbewegungen. Dies ermöglicht es Ihnen, sich auf echte Preis-Aktion und nicht kleine Marktaktivität, die keine wirkliche Konsequenz hat konzentrieren. Eine Lieblingsmethode unter Ingenieuren zum Glätten von Zeitreihendaten ist es, die Datenpunkte mit einem Polynom (eq, einem parabolischen oder kubischen Spline) zu platzieren. Ein effizientes Design dieser Art ist eine Klasse, die als Savitzy-Golay-Filter bekannt ist. Die nachstehende Grafik vergleicht JMA mit einem Savuby-Golay-Filter mit Kubikspline (3. Ordnung), dessen Parametereinstellungen oben gewählt wurden, so dass sie möglichst nahe an JMA läuft. Beachten Sie, wie reibungslos JMA durch Regionen des Handelsstaues gleitet. Im Gegensatz dazu ist der S-G-Filter ganz gezackt. Klar ist JMA wieder einmal der Gewinner. Eine andere Technik, die verwendet wird, um die Verzögerung in einem gleitenden Durchschnittsfilter zu reduzieren, besteht darin, dem Filter einen gewissen Impuls (Steilheit) des Signals hinzuzufügen. Das reduziert die Verzögerung, aber mit zwei Strafen: mehr Lärm und mehr Überschwingen bei Preis-Pivot-Punkten. Um das Rauschen zu kompensieren, kann man einen symmetrisch gewichteten FIR-Filter einsetzen, der glatter ist als ein einfacher gleitender Durchschnitt, dessen Gewichte sein könnten: 1-2-3-4-3-2-1 und dann diese Gewichte anpassen, um etwas Verzögerung hinzuzufügen Reduzierende Impulse. Die Wirksamkeit dieses Ansatzes ist in der folgenden Abbildung dargestellt (rote Linie). Obwohl der FIR-Filter den Kurs genau verfolgt, bleibt er noch hinter JMA zurück und zeigt ein größeres Überschwingen. Darüber hinaus hat der FIR-Filter feste Glätte und muss für jede andere gewünschte Glätte neu gestaltet werden. Im Vergleich dazu muss der Benutzer nur einen quotsmoothnessquot-Parameter von JMA ändern, um einen gewünschten Effekt zu erhalten. Nicht nur, dass JMA bessere Preisdiagramme produziert, sondern auch andere klassische Indikatoren verbessern kann. Zum Beispiel betrachten die klassischen MACD-Indikator, die ein Vergleich von zwei gleitenden Durchschnitten ist. Ihre Konvergenz (Umzug näher) und Divergenz (auseinanderbewegen) liefern Signale, dass ein Markttrend die Richtung ändert. Es ist wichtig, dass Sie so wenig Verzögerung wie möglich mit diesen Signalen haben oder Ihre Trades werden zu spät kommen. Im Vergleich dazu hat ein mit JMA erzeugter MACD deutlich weniger Verzögerung als ein MACD mit exponentiellen gleitenden Durchschnitten. Um diese Behauptung zu veranschaulichen, ist die folgende Abbildung ein hypothetisches Preisdiagramm, das vereinfacht wird, um die herausragenden Probleme zu verbessern. Wir sehen gleich große Balken in einem steigenden Trend, unterbrochen durch eine plötzliche Abwärtslücke. Die beiden farbigen Linien sind exponentielle gleitende Durchschnitte, die eine MACD bilden. Beachten Sie, dass Crossover eine lange Zeit nach der Lücke auftritt, so dass eine Handelsstrategie zu warten und spät zu spät, wenn überhaupt. Wenn du versuchst, das Timing dieses Indikators zu beschleunigen, indem du die gleitenden Durchschnitte schneller machst, würden die Linien lärmender und gezackter werden. Dies führt dazu, dass falsche Auslöser und schlechte Trades entstehen. Auf der anderen Seite zeigt das untenstehende Diagramm die blaue JMA, die sich schnell auf das neue Preisniveau anpasst, was frühere Übergänge und frühere Benennung eines Aufwärtstrends ermöglicht. Jetzt können Sie den Markt früher betreten und einen größeren Teil des Trends fahren. Im Gegensatz zum exponentiellen gleitenden Durchschnitt hat JMA einen zusätzlichen Parameter (PHASE), mit dem der Benutzer das Ausmaß des Überschwingens anpassen kann. In der obigen Tabelle durfte die gelbe Linie JMA mehr als das Blau überschwingen. Das gibt ideale Übergänge. Eines der schwierigsten Merkmale, um in einen Glättungsfilter zu entwerfen, ist eine adaptive Antwort auf Preislücken, ohne das neue Preisniveau zu überschreiten. Dies gilt insbesondere für Filterdesigns, die die Filter eigene Impulse einsetzen, um die Verzögerung zu reduzieren. Die folgende Tabelle vergleicht das Überschwingen durch JMA und den Hull gleitenden Durchschnitt (HMA). Die Parametereinstellungen für die beiden Filter wurden so eingestellt, dass ihre stationäre Leistung nahezu identisch war. Ein anderes Design Problem ist, ob der Filter kann die gleiche scheinbare Glätte während der Umkehrungen wie während der Trends behalten. Die folgende Tabelle zeigt, wie sich JMA während des gesamten Zyklus nahezu konstant glättet, während HMA bei Umkehrungen oszilliert. Dies würde Probleme für Strategien darstellen, die Trades auslösen, je nachdem, ob der Filter nach oben oder unten bewegt wird. Schließlich gibt es den Fall, wenn der Preis einläuft und sich dann in einem Abwärtstrend zurückzieht. Dies ist besonders schwierig, im Moment des Rückzugs zu verfolgen. Glücklicherweise haben adaptive Filter eine viel einfachere Zeit, die anzeigt, wenn eine Umkehrung als feste Filter auftritt, wie in der folgenden Tabelle gezeigt. Natürlich gibt es bessere Filter als JMA, meist vom Militär benutzt. Aber wenn Sie im Geschäft der Verfolgung von guten Trades und nicht feindlichen Flugzeugen sind, ist JMA der beste erschwingliche Lärm reduzierende Filter für Finanzmarktdaten verfügbar. Wir garantieren it. Motion Analyse und Objektverfolgung calcOpticalFlowPyrLK Berechnet einen optischen Fluss für einen spärlichen Feature-Set mit der iterativen Lucas-Kanade-Methode mit Pyramiden. C: void calcOpticalFlowPyrLK (InputArray prevImg InputArray nextImg InputArray prevPts InputOutputArray nextPts OutputArray-Status OutputArray err. Größe winSize Größe (21,21), int maxLevel 3, TermCriteria-Kriterien TermCriteria :: COUNTTermCriteria :: EPS, 30, 0,01), int Flags 0, double minEigThreshold 1e-4) Python: cv2. CalcOpticalFlowPyrLK (prevImg, nextImg, prevPt. NextPts.-Nr. err. WinSize. MaxLevel. Kriterien Flags minEigThreshold) rarr nextPts, status, err C: void cvCalcOpticalFlowPyrLK (const CvArr prev. Const CvArr curr CvArr prevpyr CvArr currpyr CvPoint2D32f prevfeatures CvPoint2D32f currfeatures int count CvSize winsize int-Ebene char-Status float trackerror CvTermCriteria-Kriterien int Flags) Python: cv. CalcOpticalFlowPyrLK (prev, curr, prevPyr, currPyr, prevFeatures, winSize, Level, Kriterien, Flags, guessesNone) - gt (currFeatures, status, trackerror) prevImg 8211 erstes 8-Bit-Eingabebild oder Pyramide, konstruiert von buildOpticalFlowPyramid (). NextImg 8211 zweites eingabebild oder pyramide der gleichen größe und der gleichen typ wie prevImg. PrevPts 8211 vector von 2D punkten, für die der flow gefunden werden muss punktkoordinaten müssen single-precision floating-point nummern sein NextPts 8211-Ausgangsvektor von 2D-Punkten (mit einfach-präzisen Gleitkomma-Koordinaten), die die berechneten neuen Positionen von Eingangsmerkmalen im zweiten Bild enthalten, wenn das OPTFLOWUSEINITIALFLOW-Flag übergeben wird, muss der Vektor die gleiche Größe wie in der Eingabe haben. Status 8211 Ausgabestatusvektor (von unsignierten Zeichen) wird jedes Element des Vektors auf 1 gesetzt, wenn der Fluss für die entsprechenden Merkmale gefunden wurde, andernfalls wird er auf 0 gesetzt. Fehler 8211 Ausgangsvektor der Fehler jedes Element des Vektors ist Auf einen Fehler für das entsprechende Merkmal setzen, Typ des Fehlermaßes kann in Flags-Parameter gesetzt werden, wenn der Flow nicht gefunden wurde, dann ist der Fehler nicht definiert (verwenden Sie den Status-Parameter, um solche Fälle zu finden). WinSize 8211 Größe des Suchfensters auf jeder Pyramidenebene. MaxLevel 8211 0-basierte maximale Pyramiden-Level-Nummer, wenn auf 0 gesetzt, Pyramiden werden nicht verwendet (einstufig), wenn auf 1 gesetzt, zwei Ebenen verwendet werden, und so weiter, wenn Pyramiden an den Eingang übergeben werden, wird der Algorithmus so viele Ebenen wie verwenden Pyramiden haben aber nicht mehr als maxLevel. Kriterien 8211-Parameter, die die Beendigungskriterien des iterativen Suchalgorithmus angeben (nach der angegebenen maximalen Anzahl von Iterationenkriterien. maxCount oder wenn sich das Suchfenster um weniger als Kriterien bewegt. Entwicklungsflags 8211 OPTFLOWUSEINITIALFLOW verwendet erste Schätzungen, die in nextPts gespeichert sind, wenn das Flag Ist nicht gesetzt, dann wird prevPts auf nextPts kopiert und gilt als die anfängliche Schätzung. OPTFLOWLKGETMINEIGENVALS verwenden minimale Eigenwerte als Fehlermaß (siehe minEigThreshold Beschreibung), wenn das Flag nicht gesetzt ist, dann L1 Abstand zwischen Patches um das Original und einen verschobenen Punkt , Geteilt durch die Anzahl der Pixel in einem Fenster, wird als Fehlermaß verwendet. MinEigThreshold 8211 Der Algorithmus berechnet den minimalen Eigenwert einer 2x2 Normalmatrix der optischen Strömungsgleichungen (diese Matrix wird als räumliche Gradientenmatrix in Bouguet00 bezeichnet), dividiert durch Anzahl der Pixel in einem Fenster, wenn dieser Wert kleiner als minEigThreshold ist, dann wird ein entsprechendes Feature herausgefiltert und seine Strömung wird nicht verarbeitet, so dass es möglich ist, schlechte Punkte zu entfernen und einen Performance-Boost zu erhalten. Die Funktion implementiert eine spärliche iterative Version des Lucas-Kanade-optischen Flusses in Pyramiden. Siehe Bouguet00. Die Funktion wird mit der TBB-Bibliothek parallelisiert. Ein Beispiel mit dem Lucas-Kanade-Optik-Flow-Algorithmus finden Sie unter opencvsourcecodesamplescpplkdemo. cpp (Python) Ein Beispiel mit dem Lucas-Kanade Optical Flow Algorithmus finden Sie unter opencvsourcecodesamplespython2lktrack. py (Python) Ein Beispiel mit dem Lucas-Kanade Tracker für Homographie Matching finden Sie unter opencvsourcecodesamplespython2lkhomography. py buildOpticalFlowPyramid Konstruiert die Bildpyramide, die an calcOpticalFlowPyrLK () übergeben werden kann. C: int buildOpticalFlowPyramid (InputArray img. OutputArrayOfArrays Pyramide Größe winSize int maxLevel bool mitDerivatives true, int pyrBorder BORDERREFLECT101, int derivBorder BORDERCONSTANT, bool tryReuseInputImage true) Python: cv2. BuildOpticalFlowPyramid (img, winSize, maxLevel. pyramide mitDerivativen pyrBorder. derBorder tryReuseInputImage) rarr retval, pyramide img 8211 8-bit Eingabebild. Pyramide 8211 Ausgangspyramide. WinSize 8211 Fenstergröße des optischen Flussalgorithmus. Muss nicht weniger sein als winSize Argument von calcOpticalFlowPyrLK (). Es wird benötigt, um erforderliche Polsterung für Pyramidenstufen zu berechnen. MaxLevel 8211 0-basierte maximale Pyramidenstufennummer. MitDerivaten 8211 setzen auf Vorgänge für die Pyramidenebene vorberechnen. Wenn die Pyramide ohne die Gradienten konstruiert wird, berechnet calcOpticalFlowPyrLK () sie intern. PyrBorder 8211 der Randmodus für Pyramidenschichten. DerBorder 8211 der Randmodus für Gradienten. TryReuseInputImage 8211 setzen ROI des Eingabebildes in die Pyramide, wenn möglich. Sie können falsch passieren, um das Datenkopieren zu erzwingen. Anzahl der Ebenen in der konstruierten Pyramide. Kann kleiner sein als maxLevel. CalcOpticalFlowFarneback Berechnet einen dichten optischen Fluss mit dem Gunnar Farneback8217s Algorithmus. C: void calcOpticalFlowFarneback (InputArray prev. InputArray als nächstes InputOutputArray fließt doppelte Pyraleale int Ebenen int winsize int intratoren int polyn Doppelpolysigma int Flags C: void cvCalcOpticalFlowFarneback (const CvArr prev. Const CvArr next CvArr flow Doppelte Pyrale, int Ebenen, int winsize, int-iterationen int polyn, doppelte polysigma, int flags) Python: cv2. CalcOpticalFlowFarneback (prev, next, pyrscale, Levels, Winsize, Iterationen, Polyn, Polysigma, Flags Flow) Rarr Flow Prev 8211 erste 8-Bit Einkanal-Eingangsbild. Nächstes 8211 zweites Eingabebild der gleichen Größe und der gleiche Typ wie prev. Fluß 8211 berechnetes Flußbild, das die gleiche Größe wie prev und Typ CV32FC2 hat. Pyrscale 8211-Parameter, Angabe der Bildskala (lt1) zum Erstellen von Pyramiden für jedes Bild pyrscale0.5 bedeutet eine klassische Pyramide, wobei jede nächste Schicht zweimal kleiner als die vorherige ist. Ebenen 8211 Anzahl der Pyramidenschichten einschließlich der anfänglichen Bildstufen1 bedeutet, dass keine zusätzlichen Schichten erzeugt werden und nur die Originalbilder verwendet werden. Winsize 8211 durchschnittliche Fenstergröße größere Werte erhöhen die Algorithmus Robustheit auf Bildrauschen und geben mehr Chancen für eine schnelle Bewegungserkennung, sondern liefern mehr verschwommenes Bewegungsfeld. Iterationen 8211 Anzahl der Iterationen der Algorithmus auf jeder Pyramidenebene. Polyn 8211 Größe der Pixel Nachbarschaft verwendet, um Polynom-Erweiterung in jedem Pixel größere Werte zu finden bedeutet, dass das Bild wird mit glatteren Oberflächen angenähert werden, was einen robusteren Algorithmus und mehr verschwommenes Bewegungsfeld, in der Regel Polyn 5 oder 7. Polysigma 8211 Standardabweichung der Gaussian, der verwendet wird, um die Derivate zu reduzieren, die als Grundlage für die Polynomausdehnung für Polyn5 verwendet werden. Sie können polysigma1.1 setzen. Für polyn7 Ein guter Wert wäre polysigma1.5. Flags 8211 Betriebsflags, die eine Kombination aus folgendem sein können: OPTFLOWUSEINITIALFLOW verwendet den Eingangsfluss als anfängliche Strömungsannäherung. OPTFLOWFARNEBACKGAUSSIAN verwendet den Gaußschen Filter anstelle eines Kastenfilters der gleichen Größe für die optische Flussschätzung in der Regel, diese Option gibt z genaueren Durchfluss als bei einem Kastenfilter, auf Kosten der niedrigeren Geschwindigkeit normalerweise, winsize für ein Gaußscher Fenster sollte eingestellt werden Ein größerer Wert, um das gleiche Maß an Robustheit zu erreichen. Die Funktion findet einen optischen Fluss für jedes Prev-Pixel unter Verwendung des Farneback2003-Algorithmus, so dass ein Beispiel, das den von Gunnar Farneback beschriebenen optischen Flussalgorithmus verwendet, bei opencvsourcecodesamplescppfback. cpp (Python) gefunden werden kann. Ein Beispiel, das den von Gunnar Farneback beschriebenen optischen Flussalgorithmus verwendet, kann sein Gefunden bei opencvsourcecodesamplespython2optflow. py estimateRigidTransform Berechnet eine optimale affine Transformation zwischen zwei 2D-Punkt-Sets. C: Mat estimateRigidTransform (InputArray src. InputArray dst. Bool fullAffine) Python: cv2. EstimateRigidTransform (src, dst, fullAffine) rarr retval src 8211 Erster Eingang 2D Punkt gesetzt gespeichert in std :: Vektor oder Mat. Oder ein in Mat. Dst 8211 Zweiter Eingang 2D Punkt Satz der gleichen Größe und der gleiche Typ wie A. oder ein anderes Bild. FullAffine 8211 Wenn es wahr ist, findet die Funktion eine optimale affine Transformation ohne zusätzliche Einschränkungen (6 Freiheitsgrade). Andernfalls beschränkt sich die Klasse der Transformationen auf Kombinationen von Translation, Rotation und einheitlicher Skalierung (5 Freiheitsgrade). Die Funktion findet eine optimale affine Transformation Ab (eine 2 x 3 Gleitkomma-Matrix), die am besten die affine Transformation zwischen: Zwei Punkt-Sets Zwei Rasterbilder annähert. In diesem Fall findet die Funktion zunächst einige Features im src-Bild und findet die entsprechenden Features im dst-Bild. Danach wird das Problem auf den ersten Fall reduziert. Im Falle von Punktmengen wird das Problem wie folgt formuliert: Sie müssen einen 2x2 Matrix A und 2x1 Vektor b finden, so dass: wo srci und dsti die i-ten Punkte in src und dst sind. In der Tat werden FastAtan2 () und Phase () verwendet, so dass der berechnete Winkel in Grad gemessen wird und den vollen Bereich 0..360 abdeckt. Außerdem wird die Maske gefüllt, um Pixel anzuzeigen, wo der berechnete Winkel gültig ist. (Python) Ein Beispiel für die Durchführung einer Motion-Template-Technik finden Sie unter opencvsourcecodesamplespython2motempl. py calcGlobalOrientation Berechnet eine globale Bewegungsorientierung in einer ausgewählten Region. C: double calcGlobalOrientation (InputArray Orientierung InputArray Maske InputArray mhi doppelter Zeitstempel Doppelte Dauer) Python: cv2. CalcGlobalOrientation (Orientierung, Maske, Mhi, Zeitstempel, Dauer) rarr retval C: double cvCalcGlobalOrientation (const CvArr Orientierung const cvArr Maske const CvArr mhi doppelte Zeitstempel doppelte Dauer) Python: cv. CalcGlobalOrientation (Orientierung, Maske, Mhi, Zeitstempel, Dauer) rarr Schwimmer Orientierung 8211 Bewegungsgradient Orientierungsbild berechnet durch die Funktion calcMotionGradient (). Maske 8211 Maskenbild. Es kann eine Verbindung einer gültigen Gradientenmaske sein, die auch von calcMotionGradient () berechnet wird. Und die Maske einer Region, deren Richtung berechnet werden muss. Mhi 8211 Bewegungshistoriebild berechnet durch updateMotionHistory (). Zeitstempel 8211 Zeitstempel an updateMotionHistory () übergeben. Dauer 8211 Maximale Laufzeit einer Bewegungsspur in Millisekunden, an updateMotionHistory () übergeben. Die Funktion berechnet eine mittlere Bewegungsrichtung im ausgewählten Bereich und gibt den Winkel zwischen 0 Grad und 360 Grad zurück. Die mittlere Richtung wird aus dem gewichteten Orientierungshistogramm berechnet, wo eine neuere Bewegung ein größeres Gewicht hat und die Bewegung in der Vergangenheit aufgetreten ist, hat ein kleineres Gewicht, wie in mhi aufgezeichnet. SegmentMotion Teilen Sie ein Bewegungshistoriebild in ein paar Teile, die separaten unabhängigen Bewegungen entsprechen (z. B. linke Hand, rechte Hand). C: void segmentMotion (InputArray mhi. OutputArray segmask. vektorltRectgtamp boundingRects doppelter Zeitstempel double segThresh) boundingRects, double timestamp, double segThresh) titlePermalink zu dieser Definition Python: cv2. Segmentmotion (mhi, timestamp, segThresh segmask) rarr segmask, boundingRects C: CvSeq cvSegmentMotion (const CvArr mhi. CvArr segmask. CvMemStorage Speicher Doppelte Zeitstempel Doppel-Segthresh) Python: cv. Segmentmotion (mhi, segmask, speicher, timestamp, segthresh) rarr boundingRects mhi 8211 Bewegungshistoriebild. Segmask 8211 Bild, wo die gefundene Maske gespeichert werden sollte, Einkanal-, 32-Bit-Gleitkomma. BoundingRects 8211 Vector mit ROIs von bewegten verbundenen Komponenten. Zeitstempel 8211 Aktuelle Zeit in Millisekunden oder anderen Einheiten. SegThresh 8211 Segmentierungsschwelle, die empfohlen wird, gleich dem Intervall zwischen dem Bewegungsverlauf 8220steps8221 oder größer zu sein. Die Funktion findet alle Bewegungssegmente und markiert sie in Segmaske mit individuellen Werten (1,2.). Es berechnet auch einen Vektor mit ROIs von bewegten verbundenen Komponenten. Danach kann die Bewegungsrichtung für jede Komponente mit calcGlobalOrientation () mit der extrahierten Maske der jeweiligen Komponente berechnet werden. Finds an object center, size, and orientation. C: RotatedRect CamShift ( InputArray probImage . Rectamp window . TermCriteria criteria ) Python: cv2. CamShift ( probImage, window, criteria ) rarr retval, window C: int cvCamShift ( const CvArr probimage . CvRect window . CvTermCriteria criteria . CvConnectedComp comp . CvBox2D box NULL ) Python: cv. CamShift ( probimage, window, criteria) - gt (int, comp, box ) Sometimes the background image can be very blurry, as it contain the average background statistics. BackgroundSubtractorMOG class BackgroundSubtractorMOG. public BackgroundSubtractor Gaussian Mixture-based BackgroundForeground Segmentation Algorithm. The class implements the algorithm described in P. KadewTraKuPong and R. Bowden, An improved adaptive background mixture model for real-time tracking with shadow detection . Proc. 2nd European Workshop on Advanced Video-Based Surveillance Systems, 2001: personal. ee. surrey. ac. ukPersonalR. Bowdenpublicationsavbs01avbs01.pdf BackgroundSubtractorMOG::BackgroundSubtractorMOG C: BackgroundSubtractorMOG. BackgroundSubtractorMOG ( ) C: BackgroundSubtractorMOG. BackgroundSubtractorMOG ( int history . int nmixtures . double backgroundRatio . double noiseSigma 0 ) Python: cv2. BackgroundSubtractorMOG ( history, nmixtures, backgroundRatio . noiseSigma ) rarr ltBackgroundSubtractorMOG objectgt history 8211 Length of the history. nmixtures 8211 Number of Gaussian mixtures. backgroundRatio 8211 Background ratio. noiseSigma 8211 Noise strength. Default constructor sets all parameters to default values. BackgroundSubtractorMOG::operator() Updates the background model and returns the foreground mask C: void BackgroundSubtractorMOG. operator() ( InputArray image . OutputArray fgmask . double learningRate 0 ) BackgroundSubtractorMOG2 Gaussian Mixture-based BackgroundForeground Segmentation Algorithm. class BackgroundSubtractorMOG2. public BackgroundSubtractor Here are important members of the class that control the algorithm, which you can set after constructing the class instance: Maximum allowed number of mixture components. Actual number is determined dynamically per pixel. Threshold defining whether the component is significant enough to be included into the background model ( corresponds to TB1-cf from the paperwhich paper). cf0.1 gt TB0.9 is default. For alpha0.001. it means that the mode should exist for approximately 105 frames before it is considered foreground. Threshold for the squared Mahalanobis distance that helps decide when a sample is close to the existing components (corresponds to Tg ). If it is not close to any component, a new component is generated. 3 sigma gt Tg339 is default. A smaller Tg value generates more components. A higher Tg value may result in a small number of components but they can grow too large. Initial variance for the newly generated components. It affects the speed of adaptation. The parameter value is based on your estimate of the typical standard deviation from the images. OpenCV uses 15 as a reasonable value. Parameter used to further control the variance. Parameter used to further control the variance. Complexity reduction parameter. This parameter defines the number of samples needed to accept to prove the component exists. CT0.05 is a default value for all the samples. By setting CT0 you get an algorithm very similar to the standard StaufferampGrimson algorithm. The value for marking shadow pixels in the output foreground mask. Default value is 127. Shadow threshold. The shadow is detected if the pixel is a darker version of the background. Tau is a threshold defining how much darker the shadow can be. Tau 0.5 means that if a pixel is more than twice darker then it is not shadow. See Prati, Mikic, Trivedi, Cucchiarra, Detecting Moving Shadows. . IEEE PAMI,2003. The class implements the Gaussian mixture model background subtraction described in: Z. Zivkovic, Improved adaptive Gausian mixture model for background subtraction . International Conference Pattern Recognition, UK, August, 2004, zoranzPublicationszivkovic2004ICPR. pdf. The code is very fast and performs also shadow detection. Number of Gausssian components is adapted per pixel. Z. Zivkovic, F. van der Heijden, Efficient Adaptive Density Estimapion per Image Pixel for the Task of Background Subtraction . Pattern Recognition Letters, vol. 27, no. 7, pages 773-780, 2006. The algorithm similar to the standard StaufferampGrimson algorithm with additional selection of the number of the Gaussian components based on: Z. Zivkovic, F. van der Heijden, Recursive unsupervised learning of finite mixture models, IEEE Trans. on Pattern Analysis and Machine Intelligence, vol.26, no.5, pages 651-656, 2004. BackgroundSubtractorMOG2::BackgroundSubtractorMOG2 C: BackgroundSubtractorMOG2. BackgroundSubtractorMOG2 ( ) C: BackgroundSubtractorMOG2. BackgroundSubtractorMOG2 ( int history . float varThreshold . bool bShadowDetection true ) history 8211 Length of the history. varThreshold 8211 Threshold on the squared Mahalanobis distance to decide whether it is well described by the background model (see Cthr). This parameter does not affect the background update. A typical value could be 4 sigma, that is, varThreshold4416 (see Tb). bShadowDetection 8211 Parameter defining whether shadow detection should be enabled ( true or false ). BackgroundSubtractorMOG2::operator() Updates the background model and computes the foreground mask C: void BackgroundSubtractorMOG2. operator() ( InputArray image . OutputArray fgmask . double learningRate -1 ) BackgroundSubtractorMOG2::getBackgroundImage Returns background image C: void BackgroundSubtractorMOG2. getBackgroundImage ( OutputArray backgroundImage ) Implementing Pairs Trading Using Kalman Filter This article is the final project submitted by the author as a part of his coursework in Executive Programme in Algorithmic Trading (EPAT) at QuantInsti. Do check our Projects page and have a look at what our students are building. Introduction Some stocks move in tandem because the same market events affect their prices. However, idiosyncratic noise might make them temporarily deviate from the usual pattern and a trader could take advantage of this apparent deviation with the expectation that the stocks will eventually return to their long term relationship. Two stocks with such a relationship form a pair. We have talked about the statistics behind pairs trading in a previous article. This article describes a trading strategy based on such stock pairs. The rest of the article is organized as follows. We will be talking about the basics of trading an individual pair, the overall strategy that chooses which pairs to trade and present some preliminary results. In the end, we will describe possible strategies for improving the results. Let us consider two stocks, x and y, such that alpha and beta are constants and e is white noise. The parameters alpha, beta could be obtained from a linear regression of prices of the two stocks with the resulting spread Let the standard deviation of this spread be sigma . The z-score of this spread is Trading Strategy The trading strategy is that when the z-score is above a threshold . say 2, the spread can be shorted . i. e. sell 1 unit of y and buy beta units of x. we expect that the relationship between x and y will hold in the future and eventually the z-score will come down to zero and even go negative and then the position could be closed. By selling the spread when it is high and closing out the position when it is low, the strategy hopes to be statistically profitable. Conversely, if the z-score is below a lower threshold say -2, the strategy will go long the spread, i. e. buy 1 unit of y and sell beta units of x and when the z score rises to zero or above the position can be closed realizing a profit. There are a couple of issues which make this simple strategy difficult to implement in practice: The constants alpha and beta are not constants in practice and vary over time. They are not market observables and hence have to be estimated with some estimates being more profitable than others. The long term relationship can break down, the spread can move from one equilibrium to another such that the changing gives an open short signal and the spread keeps rising to a new equilibrium such that when the close long signal come the spread is above the entry value resulting in a loss. Both of these facts are unavoidable and the strategy has to account for them. Determining Parameters The parameters can be estimated from the intercept and slope of a linear regression of the prices of y against the prices of x. Note that linear regression is not reversible, i. e. the parameters are not the inverse of regressing x against y. So the pairs (x, y) is not the same as (y, x). While most authors use ordinary least squares regression, some use total least squares since they assume that the prices have some intraday noise as well. However, the main issue with this approach is that we have to pick an arbitrary lookback window. In this paper, we have used Kalman filter which is related to an exponential moving average. This is an adaptive filter which updates itself iteratively and produces alpha, beta, e and sigma simultaneously. We use the python package pykalman which has the EM method that calibrates the covariance matrices over the training period. Another question that comes up is whether to regress prices or returns. The latter strategy requires holding equal dollar amount in both long and short positions, i. e. the portfolio would have to be rebalanced every day increasing transaction cost, slippage, and bidask spread. Hence we have chosen to use prices which is justified in the next subsection. Stability of the Long Term Relationship The stability of the long term relationship is determined by determining if the pairs are co-integrated. Note that even if the pairs are not co-integrated outright, they might be for the proper choice of the leverage ratio. Once the parameters have been estimated as above, the spread time series e is tested for stationarity by the augmented Dickey Fuller (ADF) test. In python, we obtain this from the adfuller function in the statsmodels module. The result gives the t-statistics for different confidence levels. We found that not many pairs were being chosen at the 1 confidence level, so we chose 10 as our threshold. One drawback is that to perform the ADF test we have to choose a lookback period which reintroduces the parameter we avoided using the Kalman filter. Choosing Sectors and Stocks The trading strategy deploys an initial amount of capital. To diversify the investment five sectors will be chosen: financials, biotechnology, automotive etc. A training period will be chosen and the capital allocated to each sector is decided based on a minimum variance portfolio approach. Apart from the initial investment, each sector is traded independently and hence the discussion below is limited to a single sector, namely financials. Within the financial sector, we choose about n 47 names based on large market capitalization. We are looking for stocks with high liquidity, small bidask spread, ability to short the stocks etc. Once the stock universe is defined we can form n (n-1) pairs, since as mentioned above (x, y) is not the same as (y, x). In our financial portfolio, we would like to maintain up to five pairs at any given time. On any day that we want to enter into a position (for example the starting date) we run a screen on all the n (n-1) pairs and select the top pair(s) according to some criteria some of which are discussed next. Choosing Pairs For each pair, the signal is obtained from the Kalman filter and we check if e gt nz sigma, where nz is the z-score threshold to be optimized. This ensures that this pair has an entry point. We perform this test first since this is inexpensive. If the pair has an entry point, then we choose a lookback period and perform the ADF test. The main goal of this procedure is not only to determine the list of pairs which meets the standards but rank them according to some metrics which relates to the expected profitability of the pairs. Once the ranking is done we enter into the positions corresponding to the top pairs until we have a total of five pairs in our portfolio. In the following, we calibrated the Kalman filter over Cal11 and then used the calibrated parameters to trade in Cal12. In the following, we kept only one stock-pair in the portfolio. In the tests shown we kept the maximum allowed drawdown per trade to 9, but allowed a maximum loss of 6 in one strategy and only 1 in the other. As we see from above the performance improves with the tightening of the maximum allowed loss per trade. The Sharpe ratio (assuming zero index) was 0.64 and 0.81 respectively while the total PampL was 9.14 and 14. The thresholds were chosen based on the simulation in the training period. Future Work Develop better screening criterion to identify the pairs with the best potentials. I already have several ideas and this will be ongoing research. Optimize the lookback window and the buysell Z-score thresholds. Gather more detailed statistics in the training period. At present, I am gathering statistics of only the top 5 (based on my selection criteria). However, in future, I should record statistics of all pairs that pass. This will indicate which trades are most profitable. In the training period, I am measuring profitability by the total PampL of the trade, from entry till the exit signal is reached. However, I should also record max profit so that I could determine an earlier exit threshold. Run the simulation for several years, i. e. calibrate one year and then test the next year. This will generate several years worths of out-of-sample tests. Another window to optimize is the length of the training period and how frequently the Kalman filter has to be recalibrated. Expand the methodology to other sectors beyond financials. Explore other filters instead of just Kalman filter. Next Steps If you are a coder or a tech professional looking to start your own automated trading desk. Learn automated trading from live Interactive lectures by daily-practitioners. Executive Programme in Algorithmic Trading (EPAT) covers training modules like Statistics amp Econometrics, Financial Computing amp Technology, and Algorithmic amp Quantitative Trading. Enroll now The work presented in the article has been developed by the author, Mr. Dyutiman Das. The underlying codes which form the basis for this article are not being shared with the readers. For readers who are interested in further readings on implementing pairs trading using Kalman Filter, please find the article below. Zusammenhängende Posts:
No comments:
Post a Comment