Dokumentation

Anwendungen

Zuletzt aktualisiert am 22. 12. 2021 von Mark Fric

Erkennen von Ergebnissen in der WF-Matrix um das benutzerdefinierte Feld

Der ursprüngliche Antrag:

Gibt es eine Möglichkeit, eine bestimmte Zelle im WFM auszuwählen, die eine bestimmte Anzahl von benachbarten Zellen haben muss?
D.h. ich möchte einen bestandenen WFM haben, wenn 4 Zellen, die die 10 Runs und 20%OOS Zelle umgeben, ein bestandenes Ergebnis haben. Ich möchte nicht, dass SQX die beste Zelle anhand der Ergebnisse in der Umgebung auswählt, sondern ich möchte festlegen, welche Zelle ich in der Umgebung der bestandenen Zellen haben muss.

Ja, das ist möglich. Am einfachsten geht es mit dem Snippet Custom Analysis, das direkt nach der Optimierung gestartet werden kann.

Kommentierter Code des CustomAnalysis-Snippets:

Paket SQ.CustomAnalysis;

import org.slf4j.Logger;
importieren org.slf4j.LoggerFactory;

import com.strategyquant.tradinglib.*;
import com.strategyquant.tradinglib.optimization.WalkForwardMatrixResult;

public class CAWFMCheck extends CustomAnalysisMethod {
    public static final Logger Log = LoggerFactory.getLogger("CAWFMCheck");
    
    //------------------------------------------------------------------------
    //------------------------------------------------------------------------
    //------------------------------------------------------------------------
    
    public CAWFMCheck() {
        super("CA WFM Prüfung", TYPE_FILTER_STRATEGY);
    }
    
    //------------------------------------------------------------------------
    
    @Override
    public boolean filterStrategy(String project, String task, String databankName, ResultsGroup rg) throws Exception {

        // Wie viele Nachbarn müssen passen, damit die WF-Matrix passt?
        int neighboursToPass = 3;

        // Finde das gewünschte WF-Ergebnis in der Strategie ResultsGroup - in unserem Fall 10 Runs und 20% OOS
        WalkForwardResult wfResult;
        try {
            wfResult = findWFResult(rg, 20, 10); // 10 Runs und 20%OOS
        } catch(Exception e) {
            Log.info("WFResult nicht gefunden: " + e.getMessage());

            return true;
        }

        // WFM-Matrix als zweidimensionales Array erstellen
        WalkForwardMatrixResult wfm = (WalkForwardMatrixResult) rg.mainResult().get(SettingsKeys.WalkForwardResult);
        WalkForwardResult[][] wfMatrix = createMatrix(wfm);
        
        int matrixRows = wfMatrix.length;
        int matrixColumns = wfMatrix[0].length;

        // Gehen Sie nun durch dieses zweidimensionale Array und suchen Sie nach den Nachbarn des von uns gewählten WF-Ergebnisses
        for(int rowIndex=0; rowIndex<matrixRows; rowIndex++) {
            for(int colIndex=0; colIndex<matrixColumns; colIndex++) {
                
                if(wfMatrix[rowIndex][colIndex].param1 == wfResult.param1 && wfMatrix[rowIndex][colIndex].param2 == wfResult.param2) {
                    //WF-Ergebnisposition in der Matrix gefunden, Nachbarn prüfen
                    int neighboursPassed = 0;
                    int neighboursChecked = 0;
                    
                    for(int neighbourRowIndex=rowIndex-1; neighbourRowIndex<=rowIndex+1; neighbourRowIndex++) {
                        if(neighbourRowIndex=matrixRows) {
                            weiter;
                        }
                        
                        for(int neighbourColIndex=colIndex-1; neighbourColIndex<=colIndex+1; neighbourColIndex++) {
                            if(neighbourColIndex=matrixColumns) {
                                weiter;
                            }
                            
                            if(neighbourRowIndex==rowIndex && neighbourColIndex==colIndex) {
                                fortfahren;
                            }
                            
                            WalkForwardResult wfResultNeighbour = wfMatrix[neighbourRowIndex][neighbourColIndex];
                            if(wfResultNeighbour.passed) {
                                neighboursPassed++;
                            }
                            
                            neighboursChecked++;
                        }
                    }
                    
                    Log.info(String.format("Neighbours checked %d / passed %d", neighboursChecked, neighboursPassed));

                    // fand die WF Ergebnis, bestanden Nachbarn geprüft. Mit Schwellenwert vergleichen
                    return neighboursPassed >= neighboursToPass;
                }
            }
        }
        
        return false;
    }
    
    //------------------------------------------------------------------------
    
    private WalkForwardResult findWFResult(ResultsGroup rg, int param1, int param2) throws Exception {
        WalkForwardMatrixResult wfm = (WalkForwardMatrixResult) rg.mainResult().get(SettingsKeys.WalkForwardResult);
        if(wfm==null) {
            throw new Exception("WFMatrixResult nicht gefunden.");
        }
        
        return wfm.getWFResult(param1, param2);
    }
    
    //------------------------------------------------------------------------

    private WalkForwardResult[][] createMatrix(WalkForwardMatrixResult wfm) throws Exception {
        int rows = 0;
        int columns = 0;

        for(int j=wfm.start2; j<=wfm.stop2; j+=wfm.increment2) rows++;
        for(int i=wfm.start1; i<=wfm.stop1; i+=wfm.increment1) columns++;
            
        WalkForwardResult[][] wfMatrix = new WalkForwardResult[rows][columns];

        int param1Index = 0;
        int param2Index = 0;
        
        for(int j=wfm.start2; j<=wfm.stop2; j+=wfm.increment2) {
            for(int i=wfm.start1; i<=wfm.stop1; i+=wfm.increment1) {
                WalkForwardResult wfResult = wfm.getWFResult(i, j);
              				
                wfMatrix[param2Index][param1Index] = wfResult;
                param1Index++;
            }
                        
            param2Index++;
            param1Index=0;
        }
        
        return wfMatrix;
    }
}

 

 

War dieser Artikel hilfreich? Der Artikel war nützlich Der Artikel war nicht nützlich

Abonnieren
Benachrichtigen Sie mich bei
1 Kommentar
Älteste
Neuestes Meistgewählt
Inline-Rückmeldungen
Alle Kommentare anzeigen
Emmanuel
23. 12. 2021 12:53 Uhr

Ausgezeichnet! Vielen Dank!

Verwandte Beiträge