Diskussion zum Artikel "Erstellung einer Strategie der Rückkehr zum Mittelwert auf der Grundlage von maschinellem Lernen" - Seite 8

[Gelöscht]  
sibirqk #:

Imho natürlich, aber die Verwendung von Savitsky_Golay ist nicht viel anders als die Verwendung von Muve. Der SG-Filter ist der Mittelwert einer polynomialen Regression in einem bestimmten gleitenden Fenster mit einem bestimmten Polynomgrad. Für den Grad 1 ist es eine perfekte Übereinstimmung mit der Muve der entsprechenden Periode.

Um die Rückkehr zum Mittelwert zu ermitteln, ist es meiner Meinung nach sinnvoller, Amplitudenfilterung zu verwenden - Renko, Renji, Zigzags. Ich denke, dass die Bereiche am besten sind - die Differenz zwischen Hg und Lw ist eine Konstante. Nun, oder eine konstante Größe ZZ, was im Grunde das Gleiche ist.

Nun, die ZZ hat sich als schlechter erwiesen.
[Gelöscht]  

Fourier und Singulärwertzerlegung eignen sich recht gut als Filter. Ich habe mich nicht an der Auswahl der Parameter, der ersten Varianten, beteiligt.


[Gelöscht]  

Ein Beispiel für das Hinzufügen eines exponentiellen Abklingens zum Filterprozess, basierend auf der ersten Auszeichnungsfunktion des Artikels. Die letzten Beispiele werden im Markup stärker gewichtet, um neuere Daten zu berücksichtigen.

def get_labels_filter(dataset, rolling=200, quantiles=[.45, .55], polyorder=3, decay_factor=0.95) -> pd.DataFrame:
    """
    Generates labels for a financial dataset based on price deviation from a Savitzky-Golay filter,
    with exponential weighting applied to prioritize recent data.

    Args:
        dataset (pd.DataFrame): DataFrame containing financial data with a 'close' column.
        rolling (int, optional): Window size for the Savitzky-Golay filter. Defaults to 200.
        quantiles (list, optional): Quantiles to define the "reversion zone". Defaults to [.45, .55].
        polyorder (int, optional): Polynomial order for the Savitzky-Golay filter. Defaults to 3.
        decay_factor (float, optional): Exponential decay factor for weighting past data. 
                                        Lower values prioritize recent data more. Defaults to 0.95.

    Returns:
        pd.DataFrame: The original DataFrame with a new 'labels' column and filtered rows:
                       - 'labels' column: 
                            - 0: Buy
                            - 1: Sell
                       - Rows where 'labels' is 2 (no signal) are removed.
                       - Rows with missing values (NaN) are removed.
                       - The temporary 'lvl' column is removed. 
    """

    # Berechnung der geglätteten Preise mit dem Savitzky-Golay-Filter
    smoothed_prices = savgol_filter(dataset['close'].values, window_length=rolling, polyorder=polyorder)
    
    # Berechnen Sie die Differenz zwischen den tatsächlichen Schlusskursen und den geglätteten Kursen.
    diff = dataset['close'] - smoothed_prices
    
    # Exponentielle Gewichtung auf die 'diff'-Werte anwenden
    weighted_diff = diff * np.exp(np.arange(len(diff)) * decay_factor / len(diff)) 
    dataset['lvl'] = weighted_diff # Die gewichtete Differenz als 'lvl' hinzufügen

    # Alle Zeilen mit NaN-Werten entfernen 
    dataset = dataset.dropna()
    
    # Berechnen Sie die Quantile der Spalte "lvl" (Preisabweichung).
    q = dataset['lvl'].quantile(quantiles).to_list() 

    # Extrahieren der Schlusskurse und der berechneten 'lvl'-Werte als NumPy-Arrays
    close = dataset['close'].values
    lvl = dataset['lvl'].values
    
    # Berechnung der Kauf-/Verkaufsmarken mit der Funktion 'calculate_labels_filter'. 
    labels = calculate_labels_filter(close, lvl, q) 

    # Trimmen des Datensatzes, um die Länge der berechneten Beschriftungen anzupassen
    dataset = dataset.iloc[:len(labels)].copy()
    
    # Fügen Sie die berechneten Beschriftungen als neue Spalte 'labels' zum DataFrame hinzu.
    dataset['labels'] = labels
    
    # Alle Zeilen mit NaN-Werten entfernen
    dataset = dataset.dropna()
    
    # Zeilen entfernen, in denen die Spalte "Labels" den Wert 2,0 hat (Verkaufssignale)
    dataset = dataset.drop(dataset[dataset.labels == 2.0].index)
    
    # Rückgabe des geänderten DataFrame, wobei die Spalte 'lvl' entfernt wurde.
    return dataset.drop(columns=['lvl'])


  • Der decay_factor-Parameter (Standardwert 0,95) wird dem Code hinzugefügt, um die Gewichtung der vergangenen Daten zu steuern.
  • Für jeden Datenpunkt wird die Gewichtung mit np.exp(np.exp(np.arange(len(diff))) * decay_factor / len(diff))), und multiplizieren es mit den Diff-Werten. Auf diese Weise werden neuere Diffs stärker und ältere weniger stark gewichtet. Gewichtete 'lvl'-Spalte: In der lvl-Spalte werden jetzt exponentiell gewichtete Differenzen gespeichert, wodurch der Aufschlagsprozess empfindlicher auf die jüngsten Kursbewegungen reagiert.
  • Ein kleinerer decay_factor-Wert (näher an 0) macht die Gewichtung aggressiver und hebt die jüngsten Preisänderungen stärker hervor. Das bedeutet, dass der Algorithmus schneller auf jüngste Abweichungen vom geglätteten Preistrend reagiert.
  • Ein größerer decay_factor-Wert (näher an 1) führt zu einer gleichmäßigeren Gewichtung, die den Daten der Vergangenheit mehr Gewicht verleiht. Dies kann nützlich sein, um den Einfluss von kurzfristigem Rauschen zu verringern und langfristige Trends zu erkennen.
[Gelöscht]  

Beim Training auf kürzeren Intervallen, z. B. 2018 bis 2024, können wenige Abschlüsse erzielt werden, wenn n_clusters = 10 in den Hyperparametern ist. Eine Verringerung der Anzahl der Cluster, z. B. auf 5-3, hilft, mehr Trades zu erhalten.

Auf diese Weise können Sie auf kürzeren Zeiträumen trainieren und nach guten Mustern suchen, indem Sie verschiedene Parameter variieren.

Sie können auch die Filterperioden (Savitzky-Golei-Filter oder Splines) von Samplern von Trades reduzieren.


 
Hallo Max! Ich schreibe, um zu sagen, dass ich mich auf die Artikel von 'Maxim Dmitrievsky' freue. Ich studiere jeden Artikel, den Sie veröffentlichen, und verfolge Ihre Arbeit schon seit 2 Jahren. Ich komme aus Brasilien, ich studiere und lerne etwas Neues und Wertvolles.

Ich hoffe von ganzem Herzen, dass Sie, Maxim, weiterhin Ihr Wissen und Ihre Forschung mit anderen teilen und dass das MetaQuotes-Team Sie als angesehenen Autor schätzt und "den Gewinn teilt", um Sie zu ermutigen, Ihre erstaunliche Arbeit fortzusetzen. Ich hoffe, Sie sind der Beste, Maxim!

Bitte, @MetaQuotes und das @MetaQuotes @alexx Team , gebt diesem Mann eine Gehaltserhöhung! Er hat es verdient <3

Grüße aus Brasilien
Maxim Dmitrievsky
Maxim Dmitrievsky
  • 2025.03.07
  • www.mql5.com
Профиль трейдера
[Gelöscht]  
Vinicius Barenho Pereira #:
Hallo Max! Ich schreibe, um zu sagen, dass ich mich auf die Artikel von 'Maxim Dmitrievsky' freue. Ich studiere jeden Artikel, den Sie veröffentlichen, und verfolge Ihre Arbeit seit 2 Jahren sehr genau. Ich komme aus Brasilien, ich studiere und lerne etwas Neues und Wertvolles.

Ich hoffe von ganzem Herzen, dass Sie, Maxim, weiterhin Ihr Wissen und Ihre Forschung mit anderen teilen und dass das MetaQuotes-Team Sie als angesehenen Autor schätzt und "den Gewinn teilt", um Sie zu ermutigen, Ihre erstaunliche Arbeit fortzusetzen. Ich hoffe, Sie sind der Beste, Maxim!

Bitte, @MetaQuotes und das @MetaQuotes @alexx Team , gebt diesem Mann eine Gehaltserhöhung! Er hat es verdient <3

Grüße aus Brasilien

Danke, ich werde versuchen, in Zukunft etwas Interessantes und vielleicht Nützliches zu machen :)

 

das ist großartig: Am Ende des Artikels wird es möglich sein, verschiedene Machine-Learning-Modelle in Python zu trainieren und sie in Handelssysteme für das MetaTrader 5-Handelsterminal umzuwandeln.

Ich werde mir das genauer ansehen - danke für den Artikel!

[Gelöscht]  
Roman Shiredchenko Machine-Learning-Modelle in Python zu trainieren und sie in Handelssysteme für das MetaTrader 5-Handelsterminal umzuwandeln.

Ich werde mir das genauer ansehen - danke für den Artikel!

Gern geschehen, manchmal verdienen sie sogar Geld )
 

Hallo Maxim,

ich habe ein Problem mit der Wertegenerierung in der Funktion get_features in Python und in MetaTrader 5 gefunden.

Das Problem liegt in der "skew"-Statistik in Python und "skewness" in MQL5. Die von mir durchgeführten Tests haben ergeben, dass die von den beiden Sprachen generierten Werte leicht unterschiedlich sind. Zum Beispiel:

-0.087111
in MQL5, und
-0.092592
in Python

Es mag unbedeutend erscheinen, aber nach der Klassifizierung der meta_labels führt dies zu einer verzögerten Vorhersage, wodurch der EA in der Regel eine Kerze zu spät einsteigt, was die Strategie unwirksam macht. Ich empfehle, diese Statistik in MQL5 nicht zu verwenden oder zu versuchen, sie manuell zu berechnen, um die gleichen Werte zu erhalten.

Grüße aus Brasilien

[Gelöscht]  
KleversonGerhardt #:

Hallo Maxim,

ich habe ein Problem mit der Wertegenerierung in der Funktion get_features in Python und im MetaTrader 5 gefunden.

Das Problem liegt in der "skew"-Statistik in Python und "skewness" in MQL5. Die von mir durchgeführten Tests haben ergeben, dass die von den beiden Sprachen generierten Werte leicht unterschiedlich sind. Zum Beispiel:

-0.087111
in MQL5, und
-0.092592
in Python

Es mag unbedeutend erscheinen, aber nach der Klassifizierung der meta_labels führt dies zu einer verzögerten Vorhersage, wodurch der EA in der Regel eine Kerze zu spät einsteigt, was die Strategie unwirksam macht. Ich empfehle, diese Statistik in MQL5 nicht zu verwenden oder zu versuchen, sie manuell zu berechnen, um die gleichen Werte zu erhalten.

Grüße aus Brasilien

Hallo, vielen Dank! Ich werde es überprüfen.