Backtesting eines Moving Average Crossover in Python mit Pandas Im vorigen Artikel über Research Backtesting Umgebungen In Python Mit Pandas haben wir eine objektorientierte forschungsbasierte Backtesting-Umgebung erstellt und auf einer zufälligen Prognosestrategie getestet. In diesem Artikel werden wir nutzen die Maschinen, die wir eingeführt, um die Forschung über eine tatsächliche Strategie, nämlich die Moving Average Crossover auf AAPL. Moving Average Crossover-Strategie Die Moving Average Crossover-Technik ist eine äußerst bekannte simples Impulsstrategie. Es wird oft als die Hello World Beispiel für quantitative Handel. Die Strategie, wie hier skizziert, ist lang-nur. Zwei getrennte einfache gleitende Durchschnittsfilter werden mit variierenden Rückblickperioden einer bestimmten Zeitreihe erzeugt. Beim Kauf des Assets treten Signale auf, wenn der kürzere Lookback-Bewegungsdurchschnitt den längeren Lookback-Bewegungsdurchschnitt übersteigt. Wenn der längere Durchschnitt anschließend den kürzeren Durchschnitt übersteigt, wird der Vermögenswert zurückgekauft. Die Strategie funktioniert gut, wenn eine Zeitreihe einen starken Trend eintritt und dann langsam den Trend rückgängig macht. Für dieses Beispiel habe ich Apple, Inc. (AAPL) als Zeitreihe mit einem kurzen Rückblick von 100 Tagen und einem langen Rückblick von 400 Tagen gewählt. Dies ist das Beispiel der zipline algorithmischen Handelsbibliothek. Wenn wir also unseren eigenen Backtester implementieren wollen, müssen wir sicherstellen, dass er die Ergebnisse in Zipline, als ein grundlegendes Mittel der Validierung entspricht. Implementierung Bitte folgen Sie dem vorherigen Tutorial. Die beschreibt, wie die anfängliche Objekthierarchie für den Backtester konstruiert wird, andernfalls funktioniert der nachfolgende Code nicht. 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 ist, die notwendigen Module und Objekte zu importieren: Wie im vorherigen Tutorial werden wir die abstrakte Basisklasse Strategy unterteilen, um MovingAverageCrossStrategy zu produzieren. Die alle Details enthält, wie die Signale erzeugt werden, wenn die sich bewegenden Mittelwerte von AAPL einander kreuzen. Das Objekt benötigt ein kurzes Fenster und ein langes Fenster. Die Werte wurden auf Standardwerte von 100 Tagen bzw. 400 Tagen gesetzt, wobei es sich um dieselben Parameter handelt, die im Hauptbeispiel der Zipline verwendet werden. Die gleitenden Mittelwerte werden durch die Verwendung der Pandas-Rollmechanik auf den BarsClose-Schlusskurs der AAPL-Aktie erstellt. Sobald die einzelnen Bewegungsdurchschnitte konstruiert worden sind, wird die Signalserie dadurch erzeugt, daß die Säule gleich 1,0 gesetzt wird, wenn der kurzlebige Durchschnitt größer ist als der lang fortschreitende Durchschnitt oder 0,0 sonst. Daraus können Positionsaufträge generiert werden, um Handelssignale darzustellen. Das MarketOnClosePortfolio wird von Portfolio subklassen. Die in backtest. py gefunden wird. Es ist fast identisch mit der im vorherigen 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. Einzelheiten darüber, wie das Portfolio-Objekt definiert ist, finden Sie im vorherigen Tutorial. Ive ließ den Code in für Vollständigkeit und dieses Tutorium in sich geschlossen halten: Nun, da die MovingAverageCrossStrategy und MarketOnClosePortfolio Klassen definiert worden sind, wird eine Hauptfunktion aufgerufen, um alle Funktionalität zusammen zu binden. Darüber hinaus wird die Performance der Strategie über eine Handlung der Eigenkapitalkurve untersucht. Das Pandas DataReader-Objekt lädt OHLCV-Preise für AAPL-Aktien für den Zeitraum vom 1. Januar 1990 bis zum 1. Januar 2002 herunter, wobei an diesem Punkt die Signale DataFrame erzeugt werden, um die Langzeitsignale zu erzeugen. Anschließend wird das Portfolio mit einer Stammkapitalzuführung von 100.000 USD erstellt und die Erträge auf der Eigenkapitalkurve berechnet. Der letzte Schritt ist die Verwendung von matplotlib, um einen zweidimensionalen Plot der beiden AAPL-Kurse, überlagert mit den sich bewegenden Durchschnitten und buysell Signale, sowie die Equity-Kurve mit den gleichen buysell Signale. Der Plot-Code wird aus dem Zipline-Implementierungsbeispiel genommen (und modifiziert). Die grafische Ausgabe des Codes ist wie folgt. Ich benutzte den IPython-Einfüge-Befehl, um diesen direkt in die IPython-Konsole zu legen, während in Ubuntu, so dass die grafische Ausgabe in Sicht blieb. Die rosafarbenen upticks stellen Kauf der Vorlage dar, während die schwarzen downticks Vertretung verkaufen es zurück: Wie gesehen werden kann, verliert die Strategie Geld über dem Zeitraum mit fünf Hin - und Rücktransaktionen. Dies ist nicht überraschend angesichts des Verhaltens der AAPL in der Periode, die auf einem leichten Abwärtstrend war, gefolgt von einem erheblichen Aufschwung, der 1998 begann. Die Rückblickperiode der gleitenden durchschnittlichen Signale ist ziemlich groß und dieses beeinflußte den Profit des abschließenden Geschäfts , Die sonst die Strategie rentabel gemacht haben könnte. In nachfolgenden Artikeln werden wir ein anspruchsvolleres Verfahren zur Leistungsanalyse erstellen und beschreiben, wie die Rückblickperioden der einzelnen gleitenden Durchschnittssignale zu optimieren sind. Ich habe eine Reihe von Daten und eine Messung an jedem dieser Daten. Id wie zu berechnen einen exponentiellen gleitenden Durchschnitt für jeden der Termine. Weiß jemand, wie dies zu tun Im neu zu python. Es scheint nicht, dass Durchschnittswerte in die Standard-Python-Bibliothek, die mich als ein wenig seltsam schlägt gebaut werden. Vielleicht Im nicht auf der Suche nach der richtigen Stelle. Also, angesichts der folgenden Code, wie könnte ich berechnen die bewegten gewichteten Durchschnitt der IQ-Punkte für Kalendertermine (theres vermutlich eine bessere Art und Weise, die Daten zu strukturieren, würde jeder Rat geschätzt werden) Ask Jan 28 09 at 18:01 My python is a Etwas rostig (jedermann kann frei fühlen, diesen Code zu redigieren, um Korrekturen vorzunehmen, wenn Ive die Syntax irgendwie verwirrte), aber hier geht. Diese Funktion bewegt sich von dem Ende der Liste an den Anfang rückwärts, wobei der exponentielle gleitende Durchschnitt für jeden Wert durch Rückwärtsarbeiten berechnet wird, bis der Gewichtungskoeffizient für ein Element kleiner als der gegebene Wert ist. Am Ende der Funktion kehrt es die Werte um, bevor die Liste zurückgegeben wird (so dass sie in der richtigen Reihenfolge für den Aufrufer liegen). (SEITE HINWEIS: Wenn ich eine andere Sprache als Python verwendet habe, erstelle ich zuerst ein leeres Array mit voller Größe und fülle es dann rückwärts, damit ich es nicht am Ende umkehren muss, aber ich glaube nicht, dass du es erklären kannst Eine große leere Array in python. And in Python-Listen, Anhängen ist viel weniger teuer als vorangestellt, weshalb ich baute die Liste in umgekehrter Reihenfolge. Korrigieren Sie mich, wenn Im falsch.) Das Alpha-Argument ist der Zerfallsfaktor auf jeder Iteration. Zum Beispiel, wenn Sie ein Alpha von 0,5 verwendet haben, würde der heutige gleitende Durchschnittswert aus den folgenden gewichteten Werten bestehen: Natürlich, wenn Sie eine riesige Palette von Werten erhalten haben, werden die Werte von zehn oder fünfzehn Tagen nicht viel dazu beitragen Heute gewichteter Durchschnitt. Mit dem Argument epsilon können Sie einen Grenzwert festlegen, unterhalb dessen Sie nicht mehr auf alte Werte achten (da ihr Beitrag zum heutigen Wert unbedeutend ist). Youd rufen die Funktion so etwas wie folgt auf: Ich weiß nicht, Python, aber für die Mittelung Teil, meinst du ein exponentiell abklingendes Tiefpassfilter des Formulars, wo Alpha-dttau, dt der Zeitstep des Filters , Tau die Zeitkonstante des Filters (die variable-timestep Form davon ist wie folgt, nur Clip dttau auf nicht mehr als 1,0) Wenn Sie etwas wie ein Datum filtern möchten, stellen Sie sicher, dass Sie in eine Gleitkommazahl konvertieren Wie von Sekunden seit 1. Januar 1970. antwortete Jan 28 09 am 18:10 Ich fand das oben Code-Snippet von Earino ziemlich nützlich - aber ich brauchte etwas, das kontinuierlich glatt einen Strom von Werten könnte - so dass ich es umgestaltet: und ich benutze Es wie folgt: (wobei Pin. read () erzeugt den nächsten Wert Id wie zu konsumieren). Antwortete am 12. Februar 14 um 20:35 Im immer Berechnen EMAs mit Pandas: Hier ist ein Beispiel, wie es zu tun: Mehr infos über Pandas EWMA: beantwortet Oct 04 15 am 12:42 Don39t neuere Versionen von Pandas haben neue und bessere Funktionen. Ndash Cristian Ciupitu Mai 11 16 at 14:10 Beachten Sie, dass im Gegensatz zu ihrer Kalkulationstabelle, ich nicht berechnen die SMA, und ich nicht warten, um die EMA nach 10 Proben zu generieren. Dies bedeutet, meine Werte unterscheiden sich geringfügig, aber wenn Sie es Diagramm, es folgt genau nach 10 Proben. Während der ersten 10 Proben, die EMA I berechnen ist angemessen geglättet. Im in den Prozess der Schaffung eines Forex Trading-Algorithmus und wollte meinen Versuch bei der Berechnung EMA (Exponential Moving Averages) versuchen. Meine Ergebnisse scheinen korrekt zu sein (im Vergleich zu den Berechnungen, die ich von Hand gemacht habe), so dass ich glaube, die folgende Methode funktioniert, aber wollte nur eine zusätzliche Menge von Augen, um sicherzustellen, dass im nicht fehlt etwas zu bekommen. Beachten Sie, dass dies nur die EMA für den letzten Preis zurückgibt, gibt es nicht ein Array von EMAs, wie das ist nicht das, was ich für meine Anwendung benötigen. Rekursion ist ein gutes Werkzeug für den richtigen Job, aber hier wird es verwendet, um einfaches Looping zu erreichen. Als solcher der Code. Ist schwerer zu lesen und zu begründen. Ist langsamer, da ein Großteil des Codes in ema nur einmal ausgeführt werden muss. Wird fehlschlagen mit groß genug Wert des Fensters durch überlaufende Python-Aufruf-Stack. 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 waren ein normaler Vorwärts-Index in Daten) Heben Sie eine Ausnahme, wenn Sie einen Parameter einen ungültigen Wert finden. Wenn Sie stattdessen nichts zurückgeben, wird dies später nur zu einer verwirrenden Ausnahme führen. In der Tat, wenn ich Indicators () versuchen. Ema (closeprices, 600) Ich bekomme unendliche Rekursion, weil sma keine zurückgibt. Das macht ema sma immer und immer wieder. Der vorhergehende Punkt zeigt auch, dass wenn len (data) lt window 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, Sie möchten data-window2: - window Die Anweisung return previousema ist an einem ungeraden Ort, da Sie an diesem Punkt haben Sie eine neue currentema berechnet. Dies ist der Basisfall der Rekursion, und es ist üblich, das Basisgehäuse zuerst zu behandeln. Mein Vorschlag für ema: beantwortet 26 November at 18:56 Pretty flachen Überprüfung: Sie müssen nicht eine Klasse für das, was Sie tun, schreiben (und ich schlage vor, Sie haben einen Blick auf dieses Video). Ihre Klasse kapselt keine Daten und Sie verwenden es nur, um Ihre Funktionen in einer gleichen Entität haben. Ich denke, Dinge wäre leichter zu verstehen, wenn Sie classmethod zu definieren, um es offensichtlich, dass Sie nicht wirklich auf irgendeine Instanz verlassen wollen. Eine noch bessere Möglichkeit wäre jedoch, Funktionen in einem Indikatormodul zu definieren. Antwortete Nov 24 14 am 18:04 Vielen Dank für die Vorschläge, die ich tatsächlich haben sie als classmethods und debattiert 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 am 19:12 Nur gerade das Video zu, große Sachen. Ndash ChrisC Nov 25 14 um 19:43 Deine Antwort 2017 Stack Exchange, Inc
Binäre Optionen - eine reine und einfache Art zu handeln oder einfach ein SCAM Eine unvoreingenommene Anleitung für binäre Optionen - Aufdeckung von Betrug und Tatsachen, die Sie jetzt brauchen. Was sind binäre Optionen Binäre Optionen für Dummies: Eine binäre Option ist eine Option, deren Auszahlung entweder eine feste Menge oder Null ist. Zum Beispiel könnte es eine binäre Option, die 200, wenn ein Hurrikan trifft Miami vor einem bestimmten Datum und Null sonst. Auch als digitale Option. Binäre Optionen unterscheiden sich von konventionellen Optionen in signifikanter Weise. Eine binäre Option ist eine Art von Optionskontrakt, in dem die Auszahlung ganz auf das Ergebnis eines yesno-Vorschlags abhängt. Der yesno-Vorschlag bezieht sich typischerweise darauf, ob der Preis eines bestimmten Vermögenswertes, der der binären Option zugrunde liegt, über einen bestimmten Betrag steigt oder unterschreitet. Beispielsweise könnte der mit der binären Option verbundene yesno-Vorschlag etwas so einf...
Comments
Post a Comment