Documentazione

Ultimo aggiornamento il 5. 5. 2015 da Mark Fric

Aggiungere un nuovo valore statistico

in questo esempio estenderemo Quant Analyzer e aggiungeremo un nuovo valore statistico.

Tutti i valori statistici come il numero di operazioni, il profitto netto, il rendimento / DD, il rapporto Sharpe, il CAGR, ecc. sono implementati come frammenti - un pezzo di codice Java che implementa una funzionalità, nel nostro caso calcolerà un nuovo valore nel programma.
Ciò significa che il programma può essere facilmente ampliato con nuovi valori.

In questo esempio creeremo un nuovo valore statistico chiamato V Rapporto.
Viene calcolato come rapporto tra il massimo drawdown in denaro e il profitto medio mensile.
Esprime essenzialmente quanti mesi occorrono in media per recuperare dal massimo drawdown; il valore più alto è migliore.

Ad esempio, se il drawdown massimo è $500 e il profitto medio mensile è $100, il V Ratio si calcola come segue
100/500 = 0.2

In questo esempio mostreremo come:

  • 1. Lavorare con QuantEditor per creare nuovi snippet.
  • 2. Creare un nuovo valore statistico V Rapportoche verrà calcolato per ogni rapporto caricato nel programma.
  • 3. Aggiungere questo valore alle colonne disponibili della banca dati, in modo che sia visibile anche nella banca dati.
  • 4. Creare una nuova vista personalizzata della banca dati con la nuova colonna
  • 5. Creare un modello di panoramica dell'analizzatore personalizzato che visualizzi il nuovo valore

 

1. Lavorare con QuantEditor

QuantEditor è un editor integrato per gli snippet che si può usare per creare/modificare nuovi snippet ed esaminare il codice sorgente di quelli esistenti.

 

Può essere avviato dal programma utilizzando l'icona QuantEditor sulla barra degli strumenti.

 

2. Creare un nuovo valore di statistiche

Come primo passo dobbiamo creare un nuovo snippet che calcoli il valore del nostro rapporto V.

Avviamo quindi Quant Editor, andiamo nel pannello Navigatore e troviamo /extend/Snippets/StatsValues. Fare clic su StatsValues con il tasto destro del mouse e scegliere l'azione Nuovo file.

 

 

Dare un nome al nuovo snippet VRatioValue.

QE (QuantEditor) creerà un nuovo snippet con la struttura richiesta del codice e i metodi predefiniti.
Ora dobbiamo solo aggiungere il calcolo al posto giusto e salvare il valore.


Esaminiamo i metodi dello snippet uno per uno:

dependsOn()

questo metodo ci permette di impostare le dipendenze, se il valore che stiamo cercando di calcolare dipende da altri valori statistici che devono essere calcolati in precedenza. Nel nostro caso, abbiamo bisogno che i valori del drawdown massimo e del profitto medio mensile siano calcolati in anticipo, quindi li aggiungeremo a questo metodo:

public String dependsOn() {
	return StatsConst.join(StatsConst.DRAWDOWN, StatsConst.AVG_PROFIT_BY_MONTH);
}

 

initCompute()

questo metodo viene chiamato all'inizio del calcolo statistico.
Si può usare per impostare i valori iniziali di alcuni parametri, ma nel nostro caso non è necessario, quindi lo lasceremo vuoto:

public void initCompute(SQStats stats, StatsTypeCombination combination, SQOrderList ordersList, SQSettings settings, SQStats statsLong, SQStats statsShort) throws Exception {

}

 

computeForOrder()

questo metodo viene richiamato per ogni ordine nell'elenco degli ordini.
Può essere utilizzato se si calcolano le statistiche dagli ordini, ma nel nostro caso si tratta semplicemente di fare il rapporto tra due valori già precalcolati, quindi lo lasceremo vuoto:

public void computeForOrder(SQStats stats, StatsTypeCombination combination, SQOrder order, SQSettings settings) throws Exception {
}

 

fineComputo()

Questo metodo viene chiamato alla fine del calcolo e imposta i valori calcolati nell'oggetto SQStats utilizzato nel programma.
Ogni azione è commentata e facile da capire.

public void endCompute(SQStats stats, StatsTypeCombination combination, SQOrderList ordersList, SQSettings settings, SQStats statsLong, SQStats statsShort) throws Exception {
// ottenere i valori del drawdown e del profitto medio mensile che sono già stati calcolati nei rispettivi snippet
double drawdown = stats.getDouble(StatsConst.DRAWDOWN);
double avgProfitByMonth = stats.getDouble(StatsConst.AVG_PROFIT_BY_MONTH);

// calcoliamo il rapporto V - utilizziamo il metodo safeDivide() per evitare che
// dividere per zero gli errori nel caso in cui il profitto medio mensile sia 0
double vRatio = SQUtils.safeDivide(avgProfitByMonth, drawdown);

// aggiungere il nuovo valore alle statistiche.
// Ogni valore ha una chiave stringa unica, che abbiamo chiamato "VRatio".
// arrotondiamo anche questo valore a due cifre decimali
stats.set("VRatio", SQUtils.round2( vRatio ));
}

Tutto qui. Abbiamo creato un nuovo valore di statistiche che verrà calcolato per ogni rapporto caricato.

Ora colpisci Compilazione e il nuovo snippet dovrebbe essere compilato senza alcun errore.

 

3. Aggiungere il nuovo valore alle colonne della banca dati

abbiamo creato un nuovo valore VRatio, che viene calcolato per ogni report, ma non è ancora visibile da nessuna parte.

Se si controlla la banca dati o la panoramica, non la si vedrà perché non è stata ancora aggiunta alle colonne della banca dati.

Anche le colonne della banca dati sono snippet, con uno snippet per ogni colonna. Ciò significa che è facile aggiungere nuove colonne personalizzate alla banca dati.

Quindi, ancora una volta, in QE Navigator aprire /extend/Snippets/DatabankColumns. Fare clic con il tasto destro del mouse e scegliere Nuovo file, denominandolo VRatio.

Creato lo snippet di colonna VRatio predefinito, possiamo passare nuovamente in rassegna i suoi metodi.

VRatio()

è un costruttore di classe, in cui è possibile specificare il nome della colonna che sarà visibile nell'intestazione della banca dati, il tooltip ts e la larghezza.

public VRatio() {
   super();

   setName(L.t("VRatio"));

   setTooltip(L.t("VRatio"));

   setWidth(60);

}

 

getValue()

utilizzato per recuperare il valore di questa colonna. Nel nostro caso, il valore è memorizzato in SQStats,
quindi dobbiamo prima ottenere il risultato e da lì le statistiche. Poi possiamo ottenere il valore di VRatio dalle statistiche.

public Object getValue(SQResultsGroup strategyResults, String dataType, String direction, String sampleType, String plType) throws Exception {
    // ottiene il risultato per il portafoglio
    SQResult result = strategyResults.getResult(SQConst.SYMBOL_PORTFOLIO);
    
    // otteniamo le statistiche per il portafoglio e la combinazione corretta di direzione, tipo di pl, tipo di campione
    SQStats stats = result.getStats(direction, getCorrectPlType(plType), sampleType);
    if(stats==null) throw new StatsMissingException();
    
    // restituisce il valore
    return stats.getDouble("VRatio", 0);
 }

 

displayString()

che visualizza la stringa nella cella della banca dati. Ottiene il valore utilizzando la funzione getValue() e lo visualizza con una formattazione adeguata.

public String displayString(SQResultsGroup strategyResults, String dataType, String direction, String sampleType, String plType) throws Exception {
    // recupera il valore utilizzando il metodo getValue()
    Double value = (Double) getValue(strategyResults, dataType, direction, sampleType, plType);
    
    return twoDecimalFormat(value); // visualizza il numero con due punti decimali.
}

 

Questo è l'intero snippet. Possiamo compilarlo, dovrebbe essere compilato di nuovo senza alcun errore.
In questo modo, abbiamo aggiunto una nuova colonna alle colonne disponibili che possono essere visualizzate nella banca dati.

 

4. Creare una vista personalizzata della banca dati con la nuova colonna

Nella parte precedente abbiamo creato una nuova colonna. Per vederla effettivamente nella banca dati, dobbiamo creare una vista che contenga questa colonna.
Le banche dati di Quant Analyzer sono completamente personalizzabili. Visualizzazioni per controllare quali colonne devono essere visualizzate.

Dobbiamo creare una nuova vista che conterrà la nostra nuova colonna VRatio. Fare clic sul pulsante Gestisci accanto alle viste nella banca dati. Non è possibile modificare la vista predefinita, quindi è necessario crearne una nuova. Il modo più semplice è clonare la vista predefinita esistente.

Fare clic sul pulsante Clone per creare una nuova vista con le stesse colonne della vista predefinita. Chiamiamola "Nuova".Predefinito + VRatio. Nelle colonne disponibili si trova la nuova colonna VRatio.

Nell'elenco a destra selezionare Profitto netto (per aggiungere la nuova colonna subito dopo Profitto netto) e fare clic su > pulsante.

Questo aggiungerà la colonna alle colonne di questa vista. Ora non dimenticate di fare clic su Salva modifiche per salvare in modo sicuro la nostra nuova vista. Quindi si può chiudere la finestra di dialogo.

Ora, quando si apriranno nuovamente le viste, si vedrà la nuova vista appena definita e la si potrà selezionare.

Ora, quando caricheremo alcune strategie, vedremo il nostro nuovo VRatio correttamente calcolati e visualizzati.

5. Creare un modello di panoramica dell'analizzatore personalizzato che visualizzi il nuovo valore

Ora possiamo vedere il nostro nuovo valore VRatio nella banca dati, ma se volessimo vederlo anche nella finestra Analisi -> Panoramica?

Anche questo è possibile. Come molte altre cose, la scheda Panoramica è controllata da snippet. Ogni modello è implementato come uno snippet che rende il proprio file HTML.
Quindi ogni modello di panoramica è composto da snippet + modello di file HTML.

Abbiamo tre possibilità per visualizzare il valore nella scheda Panoramica:

Modifica di uno snippet di panoramica esistente (non consigliato)
possiamo modificare uno degli snippet Overview predefiniti dal sistema e fare in modo che visualizzi il valore VRatio invece di qualche altro valore che non ci serve.
Non è consigliabile, perché gli snippet di sistema predefiniti possono essere modificati durante un aggiornamento e le modifiche andrebbero perse.


Creare un nuovo frammento di panoramica che utilizzi il modello esistente
la seconda opzione consiste nel creare un nuovo snippet di Overview, ma utilizzando il file del modello HTML esistente. Questo ha il vantaggio che il nostro nuovo snippet non sarà modificato da un futuro aggiornamento.
Lo svantaggio è che, poiché utilizzeremo il file HTML del modello esistente, non possiamo aggiungere nuovi valori. Possiamo solo visualizzare la VRatio invece di qualche altro valore.


Creare un nuovo snippet di panoramica con un nuovo modello
in questa opzione creeremo un nuovo snippet e un nuovo modello di rendering HTML. Qui siamo liberi di fare tutto ciò che vogliamo, possiamo anche usare l'HTML che mostra il nostro design personalizzato.

Nel nostro esempio sceglieremo la seconda opzione: creare un nuovo snippet che utilizzi un modello HTML esistente.

Quindi, sempre in QuantEditor, andiamo su /extend/Snippets/OverviewTab e creare un nuovo snippet chiamato Rapporto predefinito/superiore.
Questo creerà un nuovo snippet che implementerà un nuovo modello per la scheda Panoramica.

Ne spiegheremo nuovamente i metodi, ma prima di tutto dobbiamo fare una modifica. Poiché in pratica vogliamo solo creare una copia del template SQDefault, con un solo valore sostituito, dovremo cambiare la classe padre del nostro nuovo snippet da OverviewTemplate a SQDefault.

Ciò significa che il nostro nuovo snippet utilizzerà tutti i metodi di SQDefault e noi dovremo implementare solo ciò che è diverso.

Se non lo facessimo, dovremmo scrivere il codice per sostituire tutti i valori come avviene nello snippet SQDefault.

Quindi modifichiamo la riga

public class DefaultPlusVRatio extends OverviewTemplate {

a

public class DefaultPlusVRatio extends SQDefault {

 

Ora possiamo esaminare il resto dei metodi.

 

DefaultPlusVRatio()

è il costruttore della classe, che viene richiamato quando viene creato lo snippet. Qui dobbiamo definire il nome del template, l'immagine della schermata e il file HTML del template.

public DefaultPlusVRatio() {
setName("DefaultPlusVRatio");

// copieremo i valori sottostanti dallo snippet SQDefault, il nostro nuovo snippet utilizzerà lo stesso modello HTML
// Questi file si trovano in /settings/plugins/OverviewTab
setScreenshotName("sqdefault_screenshot.jpg");
setHtmlTemplateName("sqdefault_template.htm");

 

disegnareValori()

è la funzione principale. Carica il file modello HTML, sostituisce le costanti presenti con le etichette e i valori corretti e lo restituisce al programma.
Nel nostro caso non è necessario modificarlo affatto.

public String drawValues(SQResultsGroup strategyResult, String symbol, StatsTypeCombination combination) throws Exception {
template = loadTemplate();
replaceValues(strategyResult, symbol, combination);

restituire il modello;
}

 

replaceValues()

Questa funzione viene richiamata da drawValues() e sostituisce le costanti nel modello HTML con i valori calcolati dal programma, che vengono memorizzati in result -> stats

public void replaceValues(SQResultsGroup strategyResult, String symbol, StatsTypeCombination combination) {
   SQStats stats = null;
   SQResult result = null;

// questo primo pars ottiene i valori appropriati delle statistiche dal risultato
// possiamo usare il codice predefinito per questo
if(strategyResult!=null) {
      risultato = strategyResult.getResult(simbolo);

      if(result!=null) {
         statistiche = result.getStats(combinazione);
      }
   }

// qui sostituiamo la costante 3_2 con il nostro valore di rapporto V
// se si controlla lo snippet SQDefault si vedrà che sostituisce 3_2 con R Expectancy
// quindi nel nostro template visualizzeremo il rapporto V invece dell'aspettativa

   replace("3_2", "V Ratio", stats==null ? NA : d2(stats.getDouble("VRatio"));

// alla fine dobbiamo richiamare il metodo replaceValues() della classe padre (SQDefault)
// per sostituire tutti i valori rimanenti
   super.replaceValues(strategyResult, symbol, combination);
}

 

Questo è tutto. Ora compilate questo snippet e vedrete il nuovo modello in Analisi -> Panoramica.

Quando si passa ad esso, si noterà che ora visualizza V Ratio al posto del modello standard SQDefault che visualizza R Expectancy.

 

Questo è un esempio di come creare un nuovo modello di panoramica che visualizzi il nostro valore personalizzato.

Se si dispone di più valori personalizzati, potrebbe essere utile creare una copia del modello HTML e modificarlo in modo da avere un'altra riga di valori.

Ricordare che è possibile impostare il proprio file nel costruttore dello snippet in setHtmlTemplateName()
I file dei modelli HTML utilizzati negli snippet della Panoramica si trovano in /settings/plugins/OverviewTab/

 

Questo è tutto in questa esercitazione.
Abbiamo dimostrato come sia facile estendere QuantAnalyzer con nuovi valori personalizzati e come visualizzarli nel databank e nella Panoramica.

 

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

Abbonarsi
Notificami
0 Commenti
Feedback in linea
Visualizza tutti i commenti