Thursday 26 October 2017

Forex Backtesting Python


Bt - Flexible Backtesting für Python Was ist bt bt ist ein flexibles Backtesting Framework für Python verwendet, um quantitative Handelsstrategien zu testen. Backtesting ist der Prozess des Testens einer Strategie über einen gegebenen Datensatz. Dieses Framework ermöglicht es Ihnen, leicht zu schaffen Strategien, die Mischung und passen verschiedene Algos. Es zielt darauf ab, die Schaffung von leicht zu testenden, wiederverwendbaren und flexiblen Blöcken der Strategielogik zu fördern, um die rasche Entwicklung komplexer Handelsstrategien zu erleichtern. Das Ziel: Quants zu retten, das Rad neu zu erfinden und sie auf den wichtigen Teil des Jobs - die Strategieentwicklung - zu konzentrieren. Bt ist in Python codiert und verbindet ein lebendiges und reiches Ökosystem für die Datenanalyse. Zahlreiche Bibliotheken existieren für das maschinelle Lernen, die Signalverarbeitung und die Statistik und können genutzt werden, um das Rad nicht neu zu erfinden - etwas, das allzu oft bei der Verwendung anderer Sprachen auftritt, die den gleichen Reichtum an qualitativ hochwertigen Open-Source-Projekten haben. Bt wird auf der ffn - einer Finanzfunktionsbibliothek für Python - erstellt. Check it out Ein schnelles Beispiel Hier ist ein schneller Geschmack von bt: Eine einfache Strategie Backtest Let8217s schaffen eine einfache Strategie. Wir schaffen eine monatliche, rebalanced, long-only Strategie, in der wir gleiche Gewichte für jeden Vermögenswert in unserem Universum von Vermögenswerten platzieren. Zuerst werden wir einige Daten herunterladen. Standardmäßig lädt bt. get (alias für ffn. get) das Adjusted Close von Yahoo Finance herunter. Wir werden einige Daten ab dem 1. Januar 2010 für die Zwecke dieser Demo herunterladen. Sobald wir unsere Daten haben, schaffen wir unsere Strategie. Das Strategie-Objekt enthält die Strategie-Logik durch die Kombination verschiedener Algos. Schließlich erstellen wir einen Backtest. Die die logische Kombination einer Strategie mit einem Datensatz ist. Sobald dies geschehen ist, können wir den Backtest ausführen und die Ergebnisse analysieren. Nun können wir die Ergebnisse unseres Backtests analysieren. Das Ergebnis-Objekt ist ein dünner Wrapper um ffn. GroupStats, der einige Helfer-Methoden hinzufügt. Event-Driven Backtesting mit Python - Teil I Weve verbrachte die letzten paar Monate auf QuantStart Backtesting verschiedener Handelstrategien unter Verwendung von Python und Pandas. Die vektorisierte Natur von Pandas stellt sicher, dass bestimmte Vorgänge auf großen Datasets extrem schnell sind. Allerdings leiden die Formen der vektorisierten Backtester, die wir bisher studiert haben einige Nachteile in der Art und Weise, dass Handelsausführung simuliert wird. In dieser Reihe von Artikeln werden wir einen realistischeren Ansatz zur historischen Strategie-Simulation durch die Konstruktion einer Ereignis-getriebenen Backtesting-Umgebung mit Python diskutieren. Event-Driven Software Bevor wir uns mit der Entwicklung eines solchen Backtests beschäftigen, müssen wir das Konzept der ereignisgesteuerten Systeme verstehen. Videospiele bieten einen natürlichen Anwendungsfall für ereignisgesteuerte Software und bieten ein einfaches Beispiel zu erkunden. Ein Videospiel hat mehrere Komponenten, die miteinander interagieren in einer Echtzeit-Einstellung bei hohen Frameraten. Dies wird durch Ausführen des gesamten Satzes von Berechnungen innerhalb einer Endlosschleife, die als die Ereignisschleife oder die Spielschleife bekannt ist, behandelt. An jedem Tick der Game-Loop wird eine Funktion aufgerufen, um das letzte Event zu empfangen. Die durch einige entsprechende vorherige Maßnahmen innerhalb des Spiels erzeugt worden sind. Abhängig von der Art des Ereignisses, das einen Tastendruck oder einen Mausklick beinhalten könnte, wird eine nachfolgende Aktion ausgeführt, die entweder die Schleife beendet oder einige zusätzliche Ereignisse erzeugt. Der Vorgang wird dann fortgesetzt. Hier ist ein Beispiel Pseudocode: Der Code prüft ständig nach neuen Ereignissen und führt dann Aktionen aus, die auf diesen Ereignissen basieren. Insbesondere ermöglicht es die Illusion von Echtzeit-Response-Handling, weil der Code ständig geschleift wird und Ereignisse überprüft werden. Wie deutlich wird, ist dies genau das, was wir brauchen, um Hochfrequenz-Handel Simulation durchzuführen. Warum ein Ereignis-getriebener Backtester Ereignisgesteuerte Systeme bieten viele Vorteile gegenüber einem vektorisierten Ansatz: Code Reuse - Ein ereignisgesteuerter Backtester kann durch Design sowohl für das historische Backtesting als auch für den Live-Trading mit minimalem Aus - schalten von Komponenten verwendet werden. Dies gilt nicht für vektorisierte Backtester, bei denen alle Daten zur Verfügung stehen müssen, um statistische Analysen durchzuführen. Lookahead Bias - Bei einem ereignisgesteuerten Backtester gibt es keine Lookahead-Bias, da der Marktdateneingang als Ereignis behandelt wird, auf das gehandelt werden muss. Somit ist es möglich, Feeds mit einem Ereignis-getriebenen Backtester mit Marktdaten zu trocknen und zu replizieren, wie sich ein Order - und Portfolio-System verhalten würde. Realismus - Eventgetriebene Backterters ermöglichen eine wesentliche Anpassung, wie Aufträge ausgeführt und Transaktionskosten angefallen sind. Es ist einfach, grundsätzliche Markt - und Limitaufträge sowie Market-on-Open (MOO) und Market-on-Close (MOC) zu behandeln, da ein Custom-Exchange-Handler aufgebaut werden kann. Obwohl ereignisgesteuerte Systeme mit vielen Vorteilen verbunden sind, leiden sie an zwei Hauptnachteilen gegenüber einfacheren vektorisierten Systemen. Erstens sind sie wesentlich komplexer zu implementieren und zu testen. Es gibt mehr bewegliche Teile, die zu einer größeren Chance zur Einführung von Bugs führen. Um diese angemessene Software-Testmethode zu verringern, wie z. B. eine testgetriebene Entwicklung, kann angewendet werden. Zweitens sind sie im Vergleich zu einem vektorisierten System langsamer. Optimale vektorisierte Operationen können bei der Durchführung mathematischer Berechnungen nicht verwendet werden. Wir werden über Möglichkeiten diskutieren, diese Einschränkungen in späteren Artikeln zu überwinden. Event-Driven Backtester Überblick Für die Anwendung eines ereignisgesteuerten Ansatzes auf ein Backtesting-System ist es notwendig, unsere Komponenten (oder Objekte) zu definieren, die bestimmte Aufgaben behandeln: Event - Das Event ist die fundamentale Klasseneinheit des ereignisgesteuerten Systems. Es enthält einen Typ (wie MARKET, SIGNAL, ORDER oder FILL), der bestimmt, wie er innerhalb der Ereignisschleife behandelt wird. Ereigniswarteschlange - Die Ereigniswarteschlange ist ein im Arbeitsspeicher befindliches Python-Warteschlangenobjekt, das alle Objekte der Ereignisunterklasse speichert, die vom Rest der Software generiert werden. DataHandler - Der DataHandler ist eine abstrakte Basisklasse (ABC), die eine Schnittstelle für die Behandlung von historischen oder Live-Marktdaten darstellt. Dies bietet eine beträchtliche Flexibilität, da die Strategy - und Portfolio-Module somit zwischen beiden Ansätzen wiederverwendet werden können. Der DataHandler erzeugt bei jedem Herzschlag des Systems ein neues MarketEvent (siehe unten). Strategie - Die Strategie ist auch ein ABC, das eine Schnittstelle für die Aufnahme von Marktdaten und die Erzeugung entsprechender SignalEvents präsentiert, die letztendlich vom Portfolio-Objekt genutzt werden. Ein SignalEvent enthält ein Tickersymbol, eine Richtung (LONG oder SHORT) und einen Zeitstempel. Portfolio - Hierbei handelt es sich um ein ABC, das das Auftragsmanagement mit aktuellen und nachfolgenden Positionen für eine Strategie verknüpft. Darüber hinaus wird ein Risikomanagement über das gesamte Portfolio hinweg, einschließlich Sektor-Exposition und Position Sizing durchgeführt. In einer anspruchsvolleren Implementierung könnte dies an eine RiskManagement-Klasse delegiert werden. Das Portfolio nimmt SignalEvents aus der Warteschlange und generiert OrderEvents, die der Warteschlange hinzugefügt werden. ExecutionHandler - Der ExecutionHandler simuliert eine Verbindung zu einem Brokerage. Die Aufgabe des Handlers besteht darin, OrderEvents aus der Warteschlange zu nehmen und sie entweder über einen simulierten Ansatz oder eine tatsächliche Verbindung zu einem Lever-Brokerage auszuführen. Sobald Aufträge ausgeführt werden, erstellt der Handler FillEvents, die beschreiben, was tatsächlich getätigt wurde, einschließlich Gebühren, Provision und Schlupf (falls modelliert). Der Loop - Alle diese Komponenten werden in eine Ereignis-Schleife gepackt, die alle Ereignistypen korrekt verarbeitet und sie an die entsprechende Komponente weiterleitet. Dies ist ein ganz grundlegendes Modell eines Trading-Engine. Es gibt erhebliche Erweiterungsmöglichkeiten, insbesondere in Bezug auf die Verwendung des Portfolios. Darüber hinaus könnten auch unterschiedliche Transaktionskostenmodelle in ihre eigene Klassenhierarchie abstrahiert werden. In diesem Stadium führt es unnötige Komplexität in dieser Reihe von Artikeln, so dass wir nicht diskutieren sie weiter. In späteren Tutorials werden wir wahrscheinlich erweitern das System um zusätzliche Realismus. Hier ist ein Snippet aus Python-Code, der zeigt, wie der Backtester in der Praxis funktioniert. Es gibt zwei Schleifen, die im Code auftreten. Die äußere Schleife wird verwendet, um dem Rückentester einen Herzschlag zu geben. Für Live-Handel ist dies die Häufigkeit, mit der neue Marktdaten abgefragt werden. Für Backtesting-Strategien ist dies nicht unbedingt erforderlich, da der Backtester die im Drip-Feed-Formular bereitgestellten Marktdaten verwendet (siehe die Zeile bars. updatebars ()). Die innere Schleife verarbeitet die Ereignisse aus dem Ereigniswarteschlangenobjekt. Spezifische Ereignisse werden an die jeweilige Komponente delegiert und anschließend werden neue Ereignisse zur Warteschlange hinzugefügt. Wenn die Ereignis-Warteschlange leer ist, fährt die Heartbeat-Schleife fort: Dies ist der grundlegende Überblick, wie ein ereignisgesteuerter Backtester entworfen wird. Im nächsten Artikel werden wir die Ereignisklassenhierarchie erörtern. Eine Anwendung, um grundlegende Handelsstrategien für den FX-Markt auf Basis historischer Daten zu testen. Dieser Code ist für Python 2.7 geschrieben und nicht mit Python 3 kompatibel. Voraussetzungen: Tkinter Zum Ausführen des Programms laden Sie alle Dateien herunter, pflegen die gleiche Verzeichnisstruktur und führen die Datei inputhandling. py aus dem Python-Interpreter aus. Die Parametereinstellungen sind wie folgt: StartEnd Datum: die Daten, die die zu testenden historischen Daten festlegen Anfangsablagerung: die Menge des Geldes (USD) im Brokerage-Konto, um mit TimeFrame zu beginnen: die Breite jedes Balkens der Historie Daten, die getestet werden sollen Dies ist der Zeitrahmen, der für jede Strategie verwendet wird Symbol: Unterstützung für nur EURUSD, USDJPY, GBPUSD und USDCHF mit eingeschlossenen Daten Position zu Handel: Beschränken Sie den Backtest nur auf Long-Positionen, Short-Positionen oder beide Trading Criterium: die Hauptstrategie, die verwendet wird, um historische Trades zu simulieren (Moving Average Crossover und Stochastics enthalten) Leverage (Margin): die maximale Leverage Ratio Bevorzugte Lotgröße: eine feste Losgröße, die gehandelt wird, wenn eine Position geöffnet wird. Wenn der freie Rand die Losgröße beschränkt, wird er während des Tests angepasst. Spread Modeling Technik: Durchschnittliche Spreads - davon ausgehen, dass die Spreads konstant bleiben während der gesamten historischen Daten Trade Management-Technik: TPSL - setzen Sie einen festen Gewinn-und Stop-Loss in Pips aus Einstiegspreis Preis SL - stellen Sie den Stop-Loss zu einem Prozentsatz des Preises und Aktualisieren jeden Balken Sobald diese Parameter eingegeben werden, wird das Programm einen rudimentären Backtest mit Bar-by-Bar-Analyse, um festzustellen, was die endgültige Kontostand werden. Dieses Programm kann durch Hinzufügen weiterer Handelsstrategien erweitert werden. Sie sollten die gleiche Schnittstelle wie die Moving Average und Stochastischen Strategien implementieren. Sie können diese Aktion nicht zu diesem Zeitpunkt durchführen. Sie haben sich mit einem anderen Tab oder Fenster angemeldet. Aktualisieren Sie Ihre Sitzung neu. Sie haben sich in einem anderen Tab oder Fenster angemeldet. Aktualisieren Sie Ihre Sitzung neu.

No comments:

Post a Comment