Seite 1 von 1

Gibt es eine Funktion für folgende Spaltenerstellung?

Verfasst: Sonntag 4. August 2019, 00:24
von Bayne
Hey,

ich habe bisher meine datascience features mit lambda und map() erstellen können.
Nun benötige ich jedoch eine komplexere Target-label -Spalte in meinem Neuronalen Netz...
Ich habe den Code soweit es ging aus meinem C++ beispiel in Python übernommen, und ich hoffe es ist einigermaßen verständlich was ich suche:

nämlich eine schnellere Umsetzung des ganzen ohne derartige for loops, denn bei 126.614 Zeilen an Börsenkurs-Schlusspreise ("Close") und Höchst und Tiefkursen ("High","Low")
dauert das ganze ziemlich lange... gibt es da vielleicht eine schnellere Lösung?

Hier der Code wie ich in aus C++ zu Python übernahm:

Code: Alles auswählen

import pandas as pd 


Target_tp_Long = 0.0400
Target_sl_Long = 0.0200
Target_tp_Short = 0.0400
Target_sl_Short = 0.0200
FUTURE_PERIOD_PREDICT=12    

df = pd.read_csv("Training Data/EURUSD1999-2019.csv",delimiter= ",")

# wir brauchen nur folgende 3 Spalten aus dem CSV
#df["Close"]
#df["Low"]
#df["High"]   

Y = pd.DataFrame()
Y["target"] = df["Close"]
print(Y["target"])
for i in range(len(df)-FUTURE_PERIOD_PREDICT):
    
    #print(i)
    
    Long_sl=False
    Short_sl =False

    for j in range(1,FUTURE_PERIOD_PREDICT):
        #print(j)
        if Long_sl ==True:
            print("Long_sl",Long_sl, " j = ",j-i)
        if Short_sl ==True:
            print("Short_sl",Short_sl, " j = ",j-i)
            
        # gewünschter Stoploss long: wenn wert diesen wert unterschreitet, kann man die Kauf-position vergessen    
        if ((df["Close"].iloc[i] - df["Low"].iloc[i+j]) > Target_sl_Long):
                Long_sl = True
                print("Long_sl",Long_sl, " j = ",j)
        # gewünschter Stoploss Short: wenn wert diesen wert unterschreitet, kann man die Leerverkauf-position vergessen 
        if (( df["High"].iloc[i+j] - df["Close"].iloc[i]) > Target_sl_Short):
                Short_sl = True
                print("Short_sl",Long_sl, " j = ",j)
                
        # wenn wert innerhalb der nächsten FUTURE_PERIOD_PREDICT den gewünschten Long TakeProfit übersteigt ist es einen Kauf wert :)
        if( ( df["High"].iloc[i+j] - df["Close"].iloc[i]) >Target_tp_Long and Long_sl ==False ):
            Y["target"].iloc[i]=1
            print("Target = 1,  i=",i)
            print( (df["High"].iloc[i+j] - df["Close"].iloc[i])," > ",Target_tp_Long ,"and Long_sl == ",Long_sl) 
            break
        # wenn wert innerhalb der nächsten FUTURE_PERIOD_PREDICT den gewünschten Short TakeProfit durchfällt ist es einen LeerVerkauf wert :)    
        elif ( (df["Close"].iloc[i] - df["Low"].iloc[i+j] ) > Target_tp_Short and Short_sl==False):
            Y["target"].iloc[i]=-1
            print("Target = -1,  i=",i)
            print( (df["Close"].iloc[i] - df["Low"].iloc[i+j] )," > ",Target_tp_Short, "and Short_sl == ",Short_sl) 
            break
        # Weder Kauf- noch Verkaufsposition lohnen sich, wir tun also nichts -> 0    
        elif (j == FUTURE_PERIOD_PREDICT -1): 
            Y["target"].iloc[i]=0
            
            
            
    if Y["target"].iloc[i] != (0 or 1 or -1):
        print("fehler im algorythmus")
Hier der code aus C++:


Code: Alles auswählen

 for(int i = bars- LatestBarBack -1 ; i> LatestBarForward ;i--)  //LatestBarForward - DeadlineBars weil wir diesmal um {DeadlineBars} Bars in die zukunft gehen
                     {                                     
                     static bool Long_sl,Short_sl =false;
                     for(int j=DeadlineBars; j>0;j--)
                           {
                           ResetLastError(); int error = 0;
                           if((Y_Close[i] - Y_Lows[i-j]) > Target_sl_Long*_Point)
                                 {Long_sl = true;}
                           if(( Y_Highs[i-j] - Y_Close[i]) > Target_sl_Short*_Point) 
                                 {Short_sl = true;}      
                                 
                           if( ( Y_Highs[i-j] - Y_Close[i]) >Target_tp_Long*_Point && !Long_sl ) 	
                                 {Y[i]=1;
                           else if ( (Y_Close[i] - Y_Lows[i-j] ) >Target_tp_Short*_Point && !Short_sl) 	
                                 {Y[i]=0;	
                           else if (j == DeadlineBars -1) 
                                 {Y[i]=0; 	 // bei letztem J wird Y = 0 wenn kein target       
                           }
                     }    

Re: Gibt es eine Funktion für folgende Spaltenerstellung?

Verfasst: Montag 5. August 2019, 09:48
von Sirius3
Der Code ist wegen der viele überflüssigen Klammern und prints schwer lesbar.
Y["target"] sollte doch nur die Werte 0, -1 oder 1 enthalten, warum initialisierst Du ihn mit df["Close"]?
Die if-Abfrage am Ende ist übrigens kaputt, (0 or 1 or -1) ist ein logischer Ausdruck, der zu 1 evaluiert wird. Die Abfrage kann weg, da sie nie eintritt.

Das ganz mal aufgeräumt:

Code: Alles auswählen

df = pd.read_csv("Training Data/EURUSD1999-2019.csv", delimiter=",")
Y = pd.DataFrame()
Y["target"] = [0] * len(df)
for i in range(len(df)-FUTURE_PERIOD_PREDICT):
    Long_sl = False
    Short_sl = False
    close = df["Close"].iloc[i]
    for j in range(1,FUTURE_PERIOD_PREDICT):
        # gewünschter Stoploss long: wenn wert diesen wert unterschreitet, kann man die Kauf-position vergessen    
        if close - df["Low"].iloc[i+j] > Target_sl_Long:
            Long_sl = True
        # gewünschter Stoploss Short: wenn wert diesen wert unterschreitet, kann man die Leerverkauf-position vergessen 
        if df["High"].iloc[i+j] - close > Target_sl_Short:
            Short_sl = True
                
        # wenn wert innerhalb der nächsten FUTURE_PERIOD_PREDICT den gewünschten Long TakeProfit übersteigt ist es einen Kauf wert :)
        if df["High"].iloc[i+j] - close > Target_tp_Long and not Long_sl:
            Y["target"].iloc[i] = 1
            break
        # wenn wert innerhalb der nächsten FUTURE_PERIOD_PREDICT den gewünschten Short TakeProfit durchfällt ist es einen LeerVerkauf wert :)    
        elif close - df["Low"].iloc[i+j] > Target_tp_Short and not Short_sl:
            Y["target"].iloc[i] = -1
            break
    else:
        Y["target"].iloc[i] = 0
Der C-Code ist kaputt, kann also schlecht als Vorlage dienen.