Documentazione

Applicazioni

Ultimo aggiornamento il 18. 5. 2020 da Mark Fric

Rapporto SQN InSample / OutOfSample

In questo esempio aggiungeremo una nuova metrica (colonna della banca dati) che sarà calcolata come rapporto tra due valori di colonna già calcolati. Nel nostro caso vogliamo ottenere il rapporto tra SQN (IS) e SQN (OOS).

La formula sarà quindi semplice:

Rapporto SQN IS OOS = SQN (IS) / SQN (OOS)

 

Procederemo passo dopo passo:

Creare un nuovo frammento di colonna della banca dati

Passare all'editor di codice:

quindi fare clic su Creare un nuovo pulsante:

Impostare SQNRatioISOOS come nome della nuova colonna e scegliere il tipo di colonna Databank:

Questo creerà un nuovo frammento di colonna con un modello standard.

Questo nuovo snippet non fa molto. Una nuova colonna sarà aggiunta al database dopo la ricompilazione e l'aggiunta di un'altra colonna.
riavviare SQ, ma visualizzerà il valore normale dell'utile netto perché questo è l'esempio di calcolo in
modello standard.

 

Calcolo del valore desiderato nello snippet

Affinché lo snippet calcoli il valore desiderato, è necessario apportare alcune modifiche.

Per prima cosa, modificheremo il suo costruttore (primo metodo)

Il codice originale era:

public SQNRatioISOOS() {
  super("SQNRatioISOOS",
        DatabankColumn.Decimal2, // formato di visualizzazione del valore
        ValueTypes.Maximize, // se il valore deve essere massimizzato / minimizzato / approssimato a un valore
        0, // valore target se è stata scelta l'approssimazione
        0, // minimo medio di questo valore
        100); // massimo medio di questo valore
  
  setWidth(80); // larghezza predefinita della colonna in pixel
  
  setTooltip("Il vostro tooltip qui");
  
  /* Se questa nuova colonna dipende da altre colonne che devono essere calcolate prima, inserirle qui.
     Assicurarsi di non creare dipendenze circolari, come ad esempio A dipende da B e B dipende da A.
     Le colonne (=valori statistici) sono identificate dal nome della classe)
  */
  //setDependencies("DrawdownPct", "NumberOfTrades");
}

 

lo cambieremo in:

public SQNRatioISOOS() {
  super("SQN Ratio IS/OOS",
        DatabankColumn.Decimal2, // formato di visualizzazione del valore
        ValueTypes.Maximize, // se il valore deve essere massimizzato / minimizzato / approssimato a un valore
        0, // valore target se è stata scelta l'approssimazione
        0, // minimo medio di questo valore
        100); // massimo medio di questo valore
  
  setWidth(80); // larghezza predefinita della colonna in pixel
  
  setTooltip("Rapporto tra SQN (IS) / SQN (OOS)");
}

Non abbiamo fatto nulla di speciale, solo specificato un nome migliore per il nostro snippet e impostato l'aiuto del tooltip. Abbiamo anche eliminato i commenti con le dipendenze che non ci servono.

 

Quindi elimineremo il metodo compute()

Normalmente si usa questo metodo per calcolare il valore dello snippet. Questo metodo può essere utilizzato per calcolare il valore della metrica da un elenco di compravendite o come rapporto tra alcuni campi già calcolati.

Purtroppo, nel nostro caso dobbiamo calcolare il rapporto tra lo stesso valore statistico (SQN), ma calcolato per due parti diverse dei dati - In Sample e Out of Sample.

Questo non può essere fatto nel metodo compute(), quindi possiamo eliminarlo.

 

 Aggiungere il metodo getValue()

dobbiamo sovrascrivere un metodo speciale getValue() che viene richiamato quando la griglia della banca dati recupera il valore di questa cella.

Con questo metodo possiamo recuperare statistiche separate per la parte IS e la parte OOS e da queste ricavare i valori di SQN della parte IS e della parte OOS.

public String getValue(ResultsGroup results, String resultKey, byte direction, byte plType, byte sampleType) throws Exception {
    // ottiene le statistiche per la parte IS e OOS
    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;
    
    // otteniamo i valori di SQN per IS e OOS. Dobbiamo assicurarci che gli oggetti stats non siano null
    if(statsIS != null) sqnIS = statsIS.getDouble("SQN");
    if(statsOOS != null) sqnOOS = statsOOS.getDouble("SQN");

    // calcoliamo e restituiamo il loro rapporto - si noti che usiamo safeDivide perché sqnOOS può essere anche zero
    double ratio = SQUtils.safeDivide(sqnIS, sqnOOS);

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

è tutto ciò che serve. Ora lo snippet calcolerà il valore di questa cella come rapporto tra i valori già esistenti di SQN (IS) e SQN (OOS).

Colpire Compilazione e si dovrebbe vedere il risultato della compilazione:

 

Ora riavviate SQ e dovreste vedere questa nuova colonna tra le colonne disponibili. Per utilizzarla, aprire Gestione viste in una banca dati e creare o modificare una vista:

Salvare, quindi selezionare questa vista nella banca dati e si dovrebbe vedere la nuova colonna calcolata correttamente:

È tutto: abbiamo un nuovo frammento di colonna della banca dati.

Questo articolo è stato utile? L'articolo è stato utile L'articolo non è stato utile

Abbonarsi
Notificami
5 Commenti
Il più vecchio
Più recente I più votati
Feedback in linea
Visualizza tutti i commenti
Emmanuel
27. 11. 2021 8:34

Molto utile!!! grazie

Emmanuel
27. 11. 2021 4:24 pm

Ottima idea! Grazie

Emmanuel
27. 11. 2021 16:34

Con questo metodo è possibile recuperare statistiche separate per la parte IS e OOS.", questo è importante da sapere.
Esiste un altro metodo come il calcolo in cui non è possibile ottenere IS e OOS?
Sarebbe utile conoscere altre limitazioni di ogni classe, come l'accesso allo strumento dati e altre

tomas262
Admin
Rispondi a  Emmanuel
29. 11. 2021 20:48

È possibile consultare la documentazione dell'API per vedere tutti i metodi disponibili. https://strategyquant.com/sqxapi/

Cyber
20. 6. 2022 4:17

Questo funziona sulle strategie generate da un'attività di costruzione. Tuttavia, quando l'ho aggiunto a un WFO, il risultato è zero. C'è un modo diverso per farlo funzionare su WFO?