Monday 13 November 2017

Berechnen Gleitend Durchschnittlich Python


Wir haben vorher eingeführt, wie man gleitende Mittelwerte mit Python erstellt. Dieses Tutorial wird eine Fortsetzung dieses Themas sein. Ein gleitender Durchschnitt im Kontext der Statistik, auch Rollingrunning-Durchschnitt genannt, ist eine Art von endlicher Impulsantwort. In unserem vorherigen Tutorial haben wir die Werte der Arrays x und y gezeichnet: Let8217s plot x gegen den gleitenden Durchschnitt von y, den wir yMA nennen werden: Erstens, let8217s entlasten die Länge beider Arrays: Und um dies im Kontext zu zeigen: Das Ergebnis Grafisch: Um dies zu verstehen, lassen Sie sich von den verschiedenen Beziehungen unterscheiden: x vs y und x vs MAY: Der gleitende Durchschnitt hier ist die grüne Handlung, die bei 3 beginnt: Teilen Sie diese: Wie folgt: Post Navigation Hinterlasse eine Antwort Antwort abbrechen Sehr nützlich I Möchte den letzten Teil auf großen Datensätzen lesen Hoffe, es wird bald kommen8230 d Blogger wie folgt: Im in den Prozess der Schaffung eines Forex Trading-Algorithmus und wollte meinen Schuss bei der Berechnung EMA (Exponential Moving Averages) zu versuchen. Meine Ergebnisse scheinen korrekt zu sein (im Vergleich zu den Berechnungen, die ich von Hand gemacht habe), so glaube ich, dass die folgende Methode funktioniert, aber wollte nur einen zusätzlichen Satz von Augen bekommen, um sicherzustellen, dass ich nichts fehlt. Beachten Sie, dass dies nur die EMA für den neuesten Preis zurückgibt, gibt es nicht ein Array von EMAs als das nicht was ich für meine Anwendung benötige. Rekursion ist ein gutes Werkzeug für den richtigen Job, aber hier wird es verwendet, um einfaches Looping zu erreichen. Als solche der Code. Ist schwer zu lesen und zu begründen. Ist langsamer, weil viel von dem Code in ema nur einmal laufen muss. Wird mit groß genug Wert des Fensters wegen überlaufenden Pythons Call Stack fehlschlagen. Bitte dokumentieren Sie mindestens die Parameter jeder Funktion, zB. Dieses Fenster ist die Länge des Fensters, und diese Position zählt rückwärts vom Ende der Daten. (In der Tat wäre es klarer, wenn Position ein normaler Vorwärtsindex in Daten wäre) Heben Sie eine Ausnahme an, wenn Sie einen Parameter einen ungültigen Wert finden. Das Zurückgeben von keinem wird nur eine verwirrende Ausnahme später verursachen. In der Tat, wenn ich versucht Indikatoren (). Ema (closeprices, 600) Ich bekomme unendliche Rekursion, weil sma zurückgibt Keine. Was macht ema rufen sma immer und immer wieder. Der vorherige Punkt zeigt auch, dass wenn len (Daten) lt Fenster 2 nicht die richtige Gültigkeitsprüfung ist. Die 1 in data-window2 1: - window 1 scheint mir nicht richtig zu sein. Ich nehme an, du willst data-window2: - window Die Anweisung return previousema ist an einem seltsamen Ort, weil an diesem Punkt haben Sie eine neue currentema berechnet. Dies ist der Grundfall der Rekursion, und es ist üblich, den Basisfall zuerst zu behandeln. Mein Vorschlag für ema: antwortete Nov 26 14 um 18:56 Hübsche flache Bewertung: Du brauchst nicht eine Klasse für das zu schreiben, was du tust (und ich schlage vor, dass du einen Blick auf dieses Video hast). Ihre Klasse verkapselt keine Daten und Sie verwenden sie einfach, um Ihre Funktionen in der gleichen Entität zu haben. Ich denke, die Dinge würden einfacher zu verstehen, wenn Sie klassifizieren würde, um es offensichtlich zu machen, dass Sie sich nicht wirklich auf irgendeine Instanz verlassen. Allerdings wäre eine noch bessere Option, nur Funktionen in einem Indikator-Modul zu definieren. Antwortete am 24. November 14 um 18:04 Vielen Dank für die Anregungen, die ich eigentlich hatte sie als Klassenmethoden und diskutiert hin und her zwischen sogar mit einer Klasse oder einfach nur definieren Funktionen in einem Indikator-Modul (was ich jetzt tun). Ndash ChrisC Nov 25 14 at 19:12 Nur das Video zu sehen, tolle Sachen. Ndash ChrisC Nov 25 14 at 19:43 Ihre Antwort 2017 Stack Exchange, IncLets sagen, ich habe eine Liste: Ich möchte eine Funktion erstellen, die den bewegten n-Tag Durchschnitt berechnet. Also, wenn n war 5, würde ich möchte, dass mein Code die ersten 1-5 berechnen, fügen Sie es hinzu und finden Sie den Durchschnitt, was 3,0 wäre, dann gehen Sie auf 2-6, berechnen Sie den Durchschnitt, das wäre 4,0, dann 3 -7, 4-8, 5-9, 6-10. Ich möchte nicht die ersten n-1 Tage zu berechnen, also ab dem n-ten Tag, itll zählen die vorherigen Tage. Dies scheint zu drucken, was ich will: Allerdings weiß ich nicht, wie man die Zahlen in diesen Listen zu berechnen. Irgendwelche Ideen gefragt 14. Februar 13 um 21:05 Während ich Martijns Antwort auf diese, wie george, ich frage mich, ob dies nicht schneller wäre, indem Sie eine laufende Summation statt der Anwendung der Summe () immer und immer wieder auf meist die gleichen Zahlen . Auch die Idee, dass keine Werte als Standard während der Ramp-Up-Phase sind, ist interessant. In der Tat kann es viele verschiedene Szenarien geben, die man für gleitende Durchschnitte vorstellen kann. Lässt die Berechnung der Mittelwerte in drei Phasen aufteilen: Ramp Up: Starten von Iterationen, bei denen die aktuelle Iterationszahl lt Fenstergröße Steady Progress: Wir haben genau Fenstergröße Anzahl der Elemente zur Berechnung eines normalen Durchschnitts: sum (xiterationcounter-windowsize: iterationcounter) windowsize Ramp Down: Am Ende der Eingabedaten konnten wir ein anderes Fenster - 1 durchschnittliche Zahlen zurückgeben. Heres eine Funktion, die willkürliche iterables akzeptiert (Generatoren sind in Ordnung) als Eingabe für Daten Beliebige Fenstergrößen 1 Parameter zum Einschalten der Produktion von Werten während der Phasen für Ramp UpDown Callback-Funktionen für diese Phasen, um zu steuern, wie die Werte erzeugt werden. Dies kann verwendet werden, um ständig eine Vorgabe (z. B. Keine) zu liefern oder Teildurchschnitte zu liefern. Es scheint ein bisschen schneller als die Martijns-Version zu sein - was weitaus eleganter ist. Heres der Testcode: Die ursprüngliche Frage kann nun mit diesem Funktionsaufruf gelöst werden: beantwortet 18. Februar 13 um 18:15 Verwenden Sie die Summen - und Kartenfunktionen. Die Kartenfunktion in Python 3 ist im Grunde eine faulen Version von diesem: Im sicher, dass Sie erraten können, was die Summenfunktion tut. Antwortete am 14. Februar 13 um 21:07 Ein Ansatz, der die Wiederherstellung von Zwischensummen vermeidet .. machen das läuft (int (v)). dann. Wenn du Ameisen hast, um Zahlen um eine Zeichenkette zu tragen. Alt ohne die Globale: Sei sicher, schwimmende Mathematik zu machen, auch wenn du Werte eingegeben hast, sind ganze Zahlen geantwortet 14. Februar 13 um 22:04 In der Tat ein Laufen Summenalgorithmus ist schneller. I39ve hat eine Antwort veröffentlicht. Hier gibt es hier keine Notwendigkeit für eine globale Variable. Ndash cfi Feb 18 13 um 18:16 rechts du bist, ich habe versucht zu hart zu aviod eine explizite für Schleife. Ndash agentp 19. Februar 13 um 18:37 Es gibt eine andere Lösung, die ein itertools Rezept paarweise () verlängert. Sie können dies auf nwise () erweitern. Das gibt Ihnen das Schiebefenster (und funktioniert, wenn das iterable ein Generator ist): Während ein relativ hohes Setup Kosten für kurze iterable s diese Kosten reduziert in Auswirkungen, je länger der Datensatz. Dies nutzt sum () aber der Code ist recht elegant: beantwortet 26. November 16 um 14: 59Backtesting ein Moving Average Crossover in Python mit Pandas Im vorherigen Artikel über Research Backtesting Umgebungen In Python Mit Pandas haben wir ein objektorientiertes forschungsorientiertes Backtesting erstellt Umwelt und testete es auf einer zufälligen Prognose-Strategie. In diesem Artikel werden wir von der Maschine Gebrauch machen, die wir eingeführt haben, um die Forschung über eine tatsächliche Strategie durchzuführen, nämlich die Moving Average Crossover auf AAPL. Moving Average Crossover-Strategie Die Moving Average Crossover-Technik ist eine äußerst bekannte, vereinfachte Impulsstrategie. Es wird oft als das Hallo-Welt-Beispiel für den quantitativen Handel betrachtet. Die hier beschriebene Strategie ist nur langwierig. Zwei separate, einfach gleitende Durchschnittsfilter werden mit unterschiedlichen Lookback-Perioden einer bestimmten Zeitreihe erstellt. Signale zum Kauf des Vermögenswertes treten auf, wenn der kürzere Rückblick gleitende Durchschnitt den längeren Rückblick gleitenden Durchschnitt überschreitet. Wenn der längere Durchschnitt später den kürzeren Durchschnitt übersteigt, wird der Vermögenswert zurückverkauft. Die Strategie funktioniert gut, wenn eine Zeitreihe einen starken Trend einbringt und dann langsam den Trend rückgängig macht. Für dieses Beispiel habe ich Apple, Inc. (AAPL) als Zeitreihe gewählt, mit einem kurzen Rückblick von 100 Tagen und einem langen Rückblick von 400 Tagen. Dies ist das Beispiel der zipline algorithmischen Handelsbibliothek. Wenn wir also unseren eigenen Backtester umsetzen wollen, müssen wir sicherstellen, dass er mit den Ergebnissen in der Zipline übereinstimmt. Implementierung Achten Sie darauf, dem vorherigen Tutorial zu folgen. Die beschreibt, wie die anfängliche Objekthierarchie für den Backtester aufgebaut wird, andernfalls wird der unten stehende Code nicht funktionieren. Für diese spezielle Implementierung habe ich die folgenden Bibliotheken verwendet: Die Implementierung von macross. py erfordert backtest. py aus dem vorherigen Tutorial. Der erste Schritt besteht darin, die notwendigen Module und Objekte zu importieren: Wie im vorherigen Tutorial werden wir die Strategy abstract Basisklasse unterteilen, um MovingAverageCrossStrategy zu produzieren. Die alle Details enthält, wie man die Signale erzeugt, wenn die gleitenden Mittelwerte von AAPL einander kreuzen. Das Objekt erfordert ein kurzes Fenster und ein langes Fenster, auf dem es zu bedienen ist. Die Werte wurden auf Vorgaben von 100 Tagen bzw. 400 Tagen gesetzt, wobei die gleichen Parameter im Hauptbeispiel der Zipline verwendet wurden. Die gleitenden Durchschnitte werden durch die Verwendung der Pandas Rollingmean-Funktion auf den Bars erstellt. Schließen Sie den Preis der AAPL-Aktie. Sobald die einzelnen sich bewegenden Mittelwerte konstruiert worden sind, wird die Signalreihe erzeugt, indem die Kolonne gleich 1,0 eingestellt wird, wenn der kurze gleitende Durchschnitt größer ist als der lange gleitende Durchschnitt oder 0.0 ansonsten. Daraus können die Positionen Aufträge erzeugt werden, um Handelssignale darzustellen. Das MarketOnClosePortfolio ist aus dem Portfolio untergeordnet. Die in backtest. py gefunden wird. Es ist fast identisch mit der im vorigen Tutorial beschriebenen Implementierung, mit der Ausnahme, dass die Trades nun auf einer Close-to-Close-Basis statt einer Open-to-Open-Basis durchgeführt werden. Weitere Informationen darüber, wie das Portfolio-Objekt definiert ist, finden Sie im vorherigen Tutorial. Ive verließ den Code in Vollständigkeit und behalte dieses Tutorial in sich geschlossen: Jetzt, da die MovingAverageCrossStrategy und MarketOnClosePortfolio Klassen definiert wurden, wird eine Hauptfunktion aufgerufen, um alle Funktionalität zusammen zu binden. Darüber hinaus wird die Performance der Strategie über eine Kurve der Eigenkapitalkurve untersucht. Das Pandas DataReader-Objekt lädt OHLCV-Preise von AAPL-Aktien für den Zeitraum vom 1. Januar 1990 bis zum 1. Januar 2002 zu, an welchem ​​Punkt die Signale DataFrame erstellt werden, um die Langzeitsignale zu erzeugen. Anschließend wird das Portfolio mit einer Anfangskapitalbasis von 100.000 USD erwirtschaftet und die Renditen werden auf der Eigenkapitalkurve berechnet. Der letzte Schritt ist es, matplotlib zu verwenden, um ein zweidimensionales Diagramm von beiden AAPL-Preisen zu zeichnen, überlagert mit den gleitenden Durchschnitten und Buysell-Signalen sowie die Eigenkapitalkurve mit den gleichen Buysell-Signalen. Der Plottencode wird aus dem Zipline-Implementierungsbeispiel genommen (und modifiziert). Die grafische Ausgabe des Codes ist wie folgt. Ich habe von der IPython-Paste-Befehl Gebrauch gemacht, um diese direkt in die IPython-Konsole zu setzen, während in Ubuntu, so dass die grafische Ausgabe im Blick blieb. Die rosa upticks stellen den Kauf der Aktie dar, während die schwarzen Abschlüsse den Verkauf wieder verkaufen: Wie man sieht, verliert die Strategie im Laufe der Zeit Geld mit fünf Hin - und Rückfahrten. Dies ist nicht verwunderlich angesichts des Verhaltens von AAPL über den Zeitraum, der auf einem leichten Abwärtstrend war, gefolgt von einem erheblichen Aufschwung, der 1998 begann. Die Rückblickperiode der gleitenden Durchschnittssignale ist ziemlich groß und dies hat den Gewinn des Endhandels beeinflusst , Die sonst die Strategie rentabel gemacht haben könnte. In den folgenden Artikeln werden wir ein anspruchsvolleres Mittel zur Leistungsanalyse schaffen und beschreiben, wie man die Lookback-Perioden der einzelnen gleitenden Mittelsignale optimiert. Nur mit dem quantitativen Handel begonnen

No comments:

Post a Comment