Dokumentation

Anwendungen

Zuletzt aktualisiert am 18. 5. 2020 von Mark Fric

SQN Verhältnis InSample / OutOfSample

In diesem Beispiel werden wir eine neue Metrik (Datenbankspalte) hinzufügen, die als Verhältnis zweier bereits berechneter Spaltenwerte berechnet wird. In unserem Fall wollen wir das Verhältnis von SQN(IS) zu SQN (OOS) ermitteln.

Die Formel wird also einfach sein:

SQN IS OOS Verhältnis = SQN (IS) / SQN (OOS)

 

Wir werden Schritt für Schritt vorgehen:

Neues Datenbankspalten-Snippet erstellen

Wechseln Sie zum Code-Editor:

dann klicken Sie auf Neu erstellen Taste:

Legen Sie SQNRatioISOOS als Namen der neuen Spalte fest und wählen Sie den Spaltentyp Databank:

Dadurch wird ein neues Spalten-Snippet mit einer Standardvorlage erstellt.

Dieses neue Snippet bewirkt nicht viel. Eine neue Spalte wird der Datenbank hinzugefügt, nachdem Sie neu kompiliert und
SQ neu starten, aber es wird der normale Nettogewinnwert angezeigt, da dies die Beispielberechnung in der
Standardvorlage.

 

Berechnen Sie den gewünschten Wert im Snippet

Damit das Snippet den gewünschten Wert berechnen kann, müssen wir ein paar Änderungen vornehmen.

Zunächst wird der Konstruktor (erste Methode) geändert

Der ursprüngliche Code war:

public SQNRatioISOOS() {
  super("SQNRatioISOOS",
        DatabankColumn.Decimal2, // Format der Wertanzeige
        ValueTypes.Maximize, // ob Wert maximiert / minimiert / auf einen Wert angenähert werden soll
        0, // Zielwert, falls Annäherung gewählt wurde
        0, // durchschnittliches Minimum dieses Wertes
        100); // durchschnittliches Maximum dieses Wertes
  
  setWidth(80); // Standardspaltenbreite in Pixel
  
  setTooltip("Ihr Tooltip hier");
  
  /* Wenn diese neue Spalte von anderen Spalten abhängt, die zuerst berechnet werden müssen, fügen Sie sie hier ein.
     Achten Sie darauf, dass Sie keine zirkulären Abhängigkeiten erstellen, wie z.B. A hängt von B ab und B hängt von A ab.
     Spalten (=Statistikwerte) werden durch den Namen der Klasse identifiziert)
  */
  //setDependencies("DrawdownPct", "NumberOfTrades");
}

 

ändern wir es in:

public SQNRatioISOOS() {
  super("SQN-Quotient IS/OOS",
        DatabankColumn.Decimal2, // Format der Wertanzeige
        ValueTypes.Maximize, // ob Wert maximiert / minimiert / auf einen Wert angenähert werden soll
        0, // Zielwert, falls Annäherung gewählt wurde
        0, // durchschnittliches Minimum dieses Wertes
        100); // durchschnittliches Maximum dieses Wertes
  
  setWidth(80); // Standardspaltenbreite in Pixel
  
  setTooltip("Verhältnis von SQN (IS) / SQN (OOS)");
}

Wir haben nichts Besonderes gemacht, nur einen besseren Namen für unser Snippet angegeben und die Tooltip-Hilfe eingestellt. Wir haben auch Kommentare mit Abhängigkeiten gelöscht, die wir nicht brauchen.

 

Als nächstes löschen wir die Methode compute()

Normalerweise verwenden wir diese Methode, um den Snippet-Wert zu berechnen. Diese Methode kann verwendet werden, um den Metrikwert aus einer Liste von Geschäften oder als Verhältnis zwischen einigen bereits berechneten Feldern zu berechnen.

Leider müssen wir in unserem Fall das Verhältnis zwischen demselben Statistikwert (SQN) berechnen, der jedoch für zwei verschiedene Teile der Daten - In Sample und Out of Sample - berechnet wurde.

Da dies in der Methode compute() nicht möglich ist, können wir sie löschen.

 

 Methode getValue() hinzufügen

müssen wir eine spezielle Methode getValue() außer Kraft setzen, die aufgerufen wird, wenn das Datenbankraster den Wert für diese Zelle abruft.

Mit dieser Methode können wir separate Statistiken für den IS- und den OOS-Teil abrufen und daraus die Werte der SQN des IS- und des OOS-Teils ermitteln.

public String getValue(ResultsGroup results, String resultKey, byte direction, byte plType, byte sampleType) throws Exception {
    // liefert Statistiken für IS und OOS Teil
    SQStats statsIS = results.subResult(resultKey).stats(Directions.Both, PlTypes.Money, SampleTypes.InSample);
    SQStats statsOOS = results.subResult(resultKey).stats(Directions.Both, PlTypes.Money, SampleTypes.OutOfSample);

    double sqnIS = 0, sqnOOS = 0;
    
    // ermittelt die Werte von SQN für IS und OOS. Wir müssen sicherstellen, dass die stats-Objekte nicht null sind
    if(statsIS != null) sqnIS = statsIS.getDouble("SQN");
    if(statsOOS != null) sqnOOS = statsOOS.getDouble("SQN");

    // Berechne nun ihr Verhältnis und gib es zurück - beachte, dass wir safeDivide verwenden, da sqnOOS auch Null sein kann
    double ratio = SQUtils.safeDivide(sqnIS, sqnOOS);

    return String.format("%.2f", ratio);
}

ist dies alles, was benötigt wird. Nun wird das Snippet den Wert dieser Zelle als Verhältnis der bereits vorhandenen Werte von SQN (IS) und SQN (OOS) berechnen.

Hit Kompilieren und Sie sollten das Ergebnis der erfolgreichen Kompilierung sehen:

 

Starten Sie nun SQ neu und Sie sollten diese neue Spalte in den verfügbaren Spalten sehen. Um sie zu verwenden, öffnen Sie die Ansicht Verwalten in einer Datenbank und erstellen oder bearbeiten Sie eine Ansicht:

Speichern Sie, wählen Sie dann diese Ansicht in Ihrer Datenbank aus und Sie sollten sehen, dass Ihre neue Spalte korrekt berechnet wurde:

Das ist alles - wir haben ein neues Datenbankspalten-Snippet.

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

Abonnieren
Benachrichtigen Sie mich bei
5 Kommentare
Älteste
Neuestes Meistgewählt
Inline-Rückmeldungen
Alle Kommentare anzeigen
Emmanuel
27. 11. 2021 8:34 Uhr

sehr hilfreich!!! danke

Emmanuel
27. 11. 2021 4:24 Uhr

Ausgezeichnete Idee! Vielen Dank!

Emmanuel
27. 11. 2021 4:34 Uhr

Mit dieser Methode können wir separate Statistiken für den IS- und den OOS-Teil abrufen.", das ist wichtig zu wissen.
Gibt es noch eine andere Methode wie compute, bei der wir IS und OOS nicht erhalten können?
Es wäre hilfreich, andere Einschränkungen in jeder Klasse zu kennen, wie den Zugang zu Dateninstrumenten und andere

tomas262
Verwaltung
Antwort an  Emmanuel
29. 11. 2021 8:48 Uhr

In unserem API-Dokument finden Sie alle verfügbaren Methoden https://strategyquant.com/sqxapi/

Cyber
20. 6. 2022 4:17 am

Dies funktionierte bei Strategien, die von einer Build-Aufgabe generiert wurden. Es wird jedoch Null angezeigt, wenn ich dies auf einem WFO hinzugefügt habe. Gibt es einen anderen Weg, damit es auf WFO funktioniert?