Backtesting FX Systre mit Python (1) Es ist eine Fortsetzung von.
Die einzigen Systeme, die in (1) zurückgetestet werden können, sind diejenigen, die den Markt zum Eröffnungspreis des nächsten Balkens für das aus dem festen Schlusskurs erzeugte Signal kaufen und verkaufen. Dieses Mal habe ich versucht, vom Limit-Handel und Open-Position-Gewinn / Verlust zum Gewinnmitnahme- und Verlustsenkungssystem zu expandieren.
Der Gesamtfluss ist der gleiche wie (1). Die gemeinsamen Teile sind kurz geschrieben. Weitere Informationen finden Sie in Artikel (1).
Erstellen Sie EUR / USD, 1-Stunden-4-Wert-Daten für 2015 als ohlc.
import numpy as np
import pandas as pd
import indicators as ind #indicators.Import von py
dataM1 = pd.read_csv('DAT_ASCII_EURUSD_M1_2015.csv', sep=';',
                     names=('Time','Open','High','Low','Close', ''),
                     index_col='Time', parse_dates=True)
dataM1.index += pd.offsets.Hour(7) #7 Stunden Offset
ohlc = ind.TF_ohlc(dataM1, 'H') #Erstellung von Stundendaten
Erstellen Sie ein Kauf- / Verkaufssignal für das System, das erneut getestet werden soll. Diesmal ist der Einstieg der Schnittpunkt des gleitenden Durchschnitts und der Ausgang der Schnittpunkt des gleitenden Durchschnitts und des Schlusskurses.
Die verwendeten technischen Indikatoren sind zwei gleitende Durchschnitte für den Eintritt und ein gleitender Durchschnitt für den Austritt.
FastMA = ind.iMA(ohlc, 10) #Kurzfristiger gleitender Durchschnitt für den Eintritt
SlowMA = ind.iMA(ohlc, 30) #Langfristiger gleitender Durchschnitt für den Eintritt
ExitMA = ind.iMA(ohlc, 5) #Gleitender Durchschnitt für den Ausstieg
Erstellen Sie mit diesen Indexwerten ein Kauf- / Verkaufssignal.
#Einstiegssignal kaufen
BuyEntry = ((FastMA > SlowMA) & (FastMA.shift() <= SlowMA.shift())).values
#Eingangssignal verkaufen
SellEntry = ((FastMA < SlowMA) & (FastMA.shift() >= SlowMA.shift())).values
#Ausgangssignal kaufen
BuyExit = ((ohlc.Close < ExitMA) & (ohlc.Close.shift() >= ExitMA.shift())).values
#Ausgangssignal verkaufen
SellExit = ((ohlc.Close > ExitMA) & (ohlc.Close.shift() <= ExitMA.shift())).values
Diese Signale werden an allen Positionen erzeugt, die die Schnittbedingungen erfüllen, aber einige werden abhängig vom Vorhandensein oder Fehlen von Positionen nicht tatsächlich übernommen. Die Steuerung wird von der folgenden Backtest-Funktion durchgeführt.
Dieses Mal wurden die folgenden zwei Punkte als Erweiterung der Systemhandelsregeln hinzugefügt.
Daher wird das Argument der Funktion wie folgt erhöht.
def Backtest(ohlc, BuyEntry, SellEntry, BuyExit, SellExit, lots=0.1, spread=2, TP=0, SL=0, Limit=0, Expiration=10):
Wenn Sie hier einen positiven Wert für "Limit" einsetzen, wird ein Limitpreis angezeigt, der beim Kauf um "Limit" -Pips billiger ist, und ein Limitpreis, der beim Verkauf um "Limit" -Pips höher ist, ohne sofort beim Eingangssignal zu kaufen oder zu verkaufen. .. "Ablauf" ist die Gültigkeitsdauer des Grenzpreises und wird durch die Anzahl der Balken angegeben.
"TP" und "SL" repräsentieren Gewinn (Pips) für Gewinnmitnahmen bzw. Verlust (Pips) für Verlustreduzierung. Es funktioniert durch Zuweisen eines positiven Wertes.
Die ganze Funktion sieht so aus:
def Backtest(ohlc, BuyEntry, SellEntry, BuyExit, SellExit, lots=0.1, spread=2, TP=0, SL=0, Limit=0, Expiration=10):
    Open = ohlc.Open.values #Offener Preis
    Low = ohlc.Low.values #Niedriger Preis
    High = ohlc.High.values #Hoher Preis
    Point = 0.0001 #Wert von 1pip
    if(Open[0] > 50): Point = 0.01 #1 Pip-Wert des Kreuzkreises
    Spread = spread*Point #Ausbreitung
    Lots = lots*100000 #Tatsächliches Handelsvolumen
    N = len(ohlc) #FX-Datengröße
    
    LongTrade = np.zeros(N) #Handelsinformationen kaufen
    ShortTrade = np.zeros(N) #Handelsinformationen verkaufen
    #Einstiegspreis kaufen
    BuyEntryS = np.hstack((False, BuyEntry[:-1])) #Eingangssignalverschiebung kaufen
    if Limit == 0: LongTrade[BuyEntryS] = Open[BuyEntryS]+Spread #Marktkauf
    else: #Limit kaufen
        for i in range(N-Expiration):
            if BuyEntryS[i]:
                BuyLimit = Open[i]-Limit*Point #Preis begrenzen
                for j in range(Expiration):
                    if Low[i+j] <= BuyLimit: #Vertragsbedingungen
                        LongTrade[i+j] = BuyLimit+Spread
                        break
    #Ausstiegspreis kaufen
    BuyExitS = np.hstack((False, BuyExit[:-2], True)) #Ausgangssignalverschiebung kaufen
    LongTrade[BuyExitS] = -Open[BuyExitS]
    
    #Einstiegspreis verkaufen
    SellEntryS = np.hstack((False, SellEntry[:-1])) #Eingangssignalverschiebung verkaufen
    if Limit == 0: ShortTrade[SellEntryS] = Open[SellEntryS] #Marktverkauf
    else: #Beschränken Sie den Verkauf
        for i in range(N-Expiration):
            if SellEntryS[i]:
                SellLimit = Open[i]+Limit*Point #Preis begrenzen
                for j in range(Expiration):
                    if High[i+j] >= SellLimit: #Vertragsbedingungen
                        ShortTrade[i+j] = SellLimit
                        break
    #Ausstiegspreis verkaufen
    SellExitS = np.hstack((False, SellExit[:-2], True)) #Ausgangssignalverschiebung verkaufen
    ShortTrade[SellExitS] = -(Open[SellExitS]+Spread)
    
    LongPL = np.zeros(N) #Gewinn / Verlust der Kaufposition
    ShortPL = np.zeros(N) #Gewinn / Verlust der Verkaufsposition
    BuyPrice = SellPrice = 0.0 #Verkaufspreis
    
    for i in range(1,N):
        if LongTrade[i] > 0: #Einstiegssignal kaufen
            if BuyPrice == 0:
                BuyPrice = LongTrade[i]
                ShortTrade[i] = -BuyPrice #Ausgang verkaufen
            else: LongTrade[i] = 0
        if ShortTrade[i] > 0: #Eingangssignal verkaufen
            if SellPrice == 0:
                SellPrice = ShortTrade[i]
                LongTrade[i] = -SellPrice #Ausgang kaufen
            else: ShortTrade[i] = 0
        if LongTrade[i] < 0: #Ausgangssignal kaufen
            if BuyPrice != 0:
                LongPL[i] = -(BuyPrice+LongTrade[i])*Lots #Gewinn- und Verlustrechnung
                BuyPrice = 0
            else: LongTrade[i] = 0
                
        if ShortTrade[i] < 0: #Ausgangssignal verkaufen
            if SellPrice != 0:
                ShortPL[i] = (SellPrice+ShortTrade[i])*Lots #Gewinn- und Verlustrechnung
                SellPrice = 0
            else: ShortTrade[i] = 0
        if BuyPrice != 0 and SL > 0: #Abwicklung der Kaufposition durch SL
            StopPrice = BuyPrice-SL*Point
            if Low[i] <= StopPrice:
                LongTrade[i] = -StopPrice
                LongPL[i] = -(BuyPrice+LongTrade[i])*Lots #Gewinn- und Verlustrechnung
                BuyPrice = 0
        if BuyPrice != 0 and TP > 0: #Abwicklung der Kaufposition durch TP
            LimitPrice = BuyPrice+TP*Point
            if High[i] >= LimitPrice:
                LongTrade[i] = -LimitPrice
                LongPL[i] = -(BuyPrice+LongTrade[i])*Lots #Gewinn- und Verlustrechnung
                BuyPrice = 0
                
        if SellPrice != 0 and SL > 0: #Abwicklung der Verkaufsposition durch SL
            StopPrice = SellPrice+SL*Point
            if High[i]+Spread >= StopPrice:
                ShortTrade[i] = -StopPrice
                ShortPL[i] = (SellPrice+ShortTrade[i])*Lots #Gewinn- und Verlustrechnung
                SellPrice = 0
        if SellPrice != 0 and TP > 0: #Abwicklung der Verkaufsposition durch TP
            LimitPrice = SellPrice-TP*Point
            if Low[i]+Spread <= LimitPrice:
                ShortTrade[i] = -LimitPrice
                ShortPL[i] = (SellPrice+ShortTrade[i])*Lots #Gewinn- und Verlustrechnung
                SellPrice = 0
                
    return pd.DataFrame({'Long':LongTrade, 'Short':ShortTrade}, index=ohlc.index),\
            pd.DataFrame({'Long':LongPL, 'Short':ShortPL}, index=ohlc.index)
Es ist ziemlich lange her, aber um es kurz zu erklären, verarbeiten Sie das Signal zunächst wie folgt vor.
Drehen Sie danach die Messlatte von Anfang bis Ende und verarbeiten Sie den Kauf und Verkauf sowie die Abrechnung, während Sie das Vorhandensein der Position sowie den Gewinn und Verlust der Position überprüfen. Gibt den tatsächlich gehandelten Preis an "LongTrade", "ShortTrade" und den festen Gewinn und Verlust an "LongPL", "ShortPL" zurück.
Das folgende Beispiel ist ein Backtest eines Systems, das zu einem Grenzpreis kauft und verkauft, der 20 Pips vom Preis zum Zeitpunkt des Eingangssignals entfernt ist und mit einem Gewinn von 100 Pips oder einem Verlust von 50 Pips getrennt vom Ausgangssignal abgerechnet wird.
Trade, PL = Backtest(ohlc, BuyEntry, SellEntry, BuyExit, SellExit, TP=100, SL=50, Limit=20)
Dieses Mal werde ich nur die Asset-Kurve anzeigen.
from pandas_highcharts.display import display_charts
Initial = 10000 #Anfangsvermögen
Equity = (PL.Long+PL.Short).cumsum() #Kumulierter Gewinn und Verlust
display_charts(pd.DataFrame({'Equity':Equity+Initial}), chart_type="stock", title="Asset-Kurve", figsize=(640,480), grid=True)

Der in diesem Artikel veröffentlichte Code wurde unten hochgeladen. MT5IndicatorsPy/EA_sample2.ipynb
Recommended Posts