Documentation

Dernière mise à jour le 5. 5. 2015 par Mark Fric

Ajouter une nouvelle valeur statistique

Dans cet exemple, nous allons étendre Quant Analyzer et ajouter une nouvelle valeur statistique.

Toutes les valeurs statistiques telles que le nombre de transactions, le bénéfice net, le rendement / DD, le ratio de Sharpe, le CAGR, etc. sont mises en œuvre sous la forme de extraits - un morceau de code Java qui met en œuvre une fonctionnalité, dans notre cas il calculera une nouvelle valeur dans le programme.
Cela signifie que le programme peut être facilement étendu à de nouvelles valeurs.

Dans cet exemple, nous allons créer une nouvelle valeur statistique appelée Rapport V.
Il est calculé comme un ratio entre la perte maximale en argent et le profit mensuel moyen.
Il exprime essentiellement le nombre de mois qu'il faut en moyenne pour se remettre d'une baisse maximale, plus la valeur est élevée, mieux c'est.

Par exemple, si le drawdown maximum est de $500, et le profit mensuel moyen de $100, le ratio V est calculé comme suit
100/500 = 0.2

Dans cet exemple, nous allons montrer comment.. :

  • 1. Travailler avec QuantEditor où nous pouvons créer de nouveaux snippets
  • 2. Créer une nouvelle valeur statistique Rapport Vqui sera calculée pour chaque rapport chargé dans le programme
  • 3. Ajouter cette valeur aux colonnes disponibles de la banque de données, afin qu'elle soit également visible dans la banque de données.
  • 4. Créer une nouvelle vue de banque de données personnalisée avec la nouvelle colonne
  • 5. Créer un modèle de vue d'ensemble Analyzer â†' personnalisé qui affiche la nouvelle valeur.

 

1. Travailler avec QuantEditor

QuantEditor est un éditeur intégré pour les snippets que vous pouvez utiliser pour créer/modifier de nouveaux snippets et consulter le code source des snippets existants.

 

Il peut être lancé à partir du programme en utilisant l'icône QuantEditor dans la barre d'outils.

 

2. Création d'une nouvelle valeur de statistiques

La toute première étape consiste à créer un nouveau snippet qui calculera la valeur de notre ratio V.

Démarrons Quant Editor, allons dans son panneau Navigateur et trouvons /extend/Snippets/StatsValues. Cliquez sur StatsValues avec le bouton droit de la souris et choisissez l'action Nouveau fichier.

 

 

Nommez le nouveau snippet VRatioValue.

QE (QuantEditor) créera un nouveau snippet avec la structure requise du code et les méthodes par défaut.
Il ne nous reste plus qu'à ajouter le calcul au bon endroit et à enregistrer la valeur.


Examinons une à une les méthodes de l'extrait :

dependsOn()

cette méthode nous permet de définir la dépendance - si la valeur que nous essayons de calculer dépend d'autres valeurs stat qui doivent être calculées plus tôt. Dans notre cas, nous avons besoin des valeurs de drawdown maximum et de profit mensuel moyen calculées au préalable, nous les ajouterons donc à cette méthode :

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

 

initCompute()

cette méthode est appelée au début du calcul des statistiques.
Nous pouvons l'utiliser pour définir les valeurs initiales de certains paramètres, mais nous n'en avons pas besoin dans notre cas, nous le laisserons donc vide :

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

}

 

computeForOrder()

cette méthode est appelée pour chaque commande de la liste des commandes.
Il peut être utilisé si nous calculons des statistiques à partir de commandes, mais dans notre cas, nous faisons simplement le ratio de deux valeurs déjà calculées, nous le laisserons donc vide également :

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

 

endCompute()

cette méthode est appelée à la fin du calcul, elle fixe les valeurs calculées dans l'objet SQStats utilisé dans le programme.
Chaque action est commentée et facile à comprendre.

public void endCompute(SQStats stats, StatsTypeCombination combination, SQOrderList ordersList, SQSettings settings, SQStats statsLong, SQStats statsShort) throws Exception {
// obtenir les valeurs du drawdown et du profit moyen par mois qui ont déjà été calculées dans leurs propres snippets
double drawdown = stats.getDouble(StatsConst.DRAWDOWN) ;
double avgProfitByMonth = stats.getDouble(StatsConst.AVG_PROFIT_BY_MONTH) ;

// calculer le rapport V - nous utilisons la méthode safeDivide() pour éviter les erreurs de calcul.
// la division par zéro entraîne des erreurs dans le cas où le bénéfice moyen par mois est égal à 0
double vRatio = SQUtils.safeDivide(avgProfitByMonth, drawdown) ;

// ajouter la nouvelle valeur aux statistiques.
// Chaque valeur doit avoir sa propre clé unique, nous avons nommé la nôtre "VRatio"
// nous arrondissons également cette valeur à deux décimales
stats.set("VRatio", SQUtils.round2( vRatio )) ;
}

Voilà, c'est fait. Nous avons créé une nouvelle valeur de statistiques qui sera calculée pour chaque rapport chargé.

Maintenant, frappez Compiler et le nouveau snippet devrait être compilé sans erreur.

 

3. Ajouter cette nouvelle valeur aux colonnes de la banque de données

nous avons créé une nouvelle valeur VRatio, et elle est calculée pour chaque rapport, mais elle n'est encore visible nulle part.

Si vous consultez votre banque de données ou votre aperçu, vous ne le verrez pas car il n'a pas encore été ajouté aux colonnes de la banque de données.

Les colonnes de la banque de données sont également des snippets, il y a un snippet pour chaque colonne. Cela signifie qu'il est facile d'ajouter de nouvelles colonnes personnalisées à la banque de données.

Dans QE Navigator, ouvrez /extend/Snippets/DatabankColumns. Cliquez avec le bouton droit de la souris et choisissez Nouveau fichier, nommez-le VRatio.

Après avoir créé l'extrait de colonne VRatio par défaut, nous pouvons à nouveau passer en revue ses méthodes.

VRatio()

Il s'agit d'un constructeur de classe, dans lequel vous pouvez spécifier le nom de la colonne qui sera visible dans l'en-tête de la banque de données, l'info-bulle et la largeur.

public VRatio() {
   super() ;

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

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

   setWidth(60) ;

}

 

getValue()

qui est utilisée pour récupérer la valeur de cette colonne. Dans notre cas, la valeur est stockée dans SQStats,
Nous devons donc d'abord obtenir le résultat, puis les statistiques. Ensuite, nous pouvons obtenir la valeur de VRatio à partir des statistiques.

public Object getValue(SQResultsGroup strategyResults, String dataType, String direction, String sampleType, String plType) throws Exception {
    // obtient le résultat pour le portefeuille
    SQResult result = strategyResults.getResult(SQConst.SYMBOL_PORTFOLIO) ;
    
    // Obtenir les statistiques du portefeuille et la combinaison correcte de la direction, du type de placement et du type d'échantillon
    SQStats stats = result.getStats(direction, getCorrectPlType(plType), sampleType) ;
    if(stats==null) throw new StatsMissingException() ;
    
    // renvoie la valeur
    return stats.getDouble("VRatio", 0) ;
 }

 

displayString()

qui affiche une chaîne de caractères dans la cellule de la banque de données. Elle récupère la valeur à l'aide de notre fonction getValue() et l'affiche avec un formatage approprié.

public String displayString(SQResultsGroup strategyResults, String dataType, String direction, String sampleType, String plType) throws Exception {
    // récupère la valeur à l'aide de la méthode getValue()
    Double value = (Double) getValue(strategyResults, dataType, direction, sampleType, plType) ;
    
    return twoDecimalFormat(value) ; // affiche le nombre avec deux points décimaux
}

 

C'est l'extrait complet. Nous pouvons le compiler, il devrait se compiler à nouveau sans aucune erreur.
Ce faisant, nous avons ajouté une nouvelle colonne aux colonnes disponibles qui peuvent être affichées dans la banque de données.

 

4. Créer une vue de banque de données personnalisée avec la nouvelle colonne

Dans la partie ci-dessus, nous avons créé une nouvelle colonne. Pour la voir dans la banque de données, nous devons créer une vue qui contiendra cette colonne.
Les banques de données de Quant Analyzer sont entièrement personnalisables. Points de vue pour contrôler les colonnes à afficher.

Nous devons créer une nouvelle vue qui contiendra notre nouvelle colonne VRatio. Cliquez sur le bouton Gérer à côté des vues dans la banque de données. Nous ne pouvons pas modifier la vue par défaut, nous devons donc en créer une nouvelle. Le plus simple est de cloner la vue par défaut existante.

Cliquez sur le bouton Clone Cela créera une nouvelle vue avec les mêmes colonnes que la vue par défaut. Nommons-la “Défaut + VRatioâ€&#157 ;. Dans les colonnes disponibles, vous trouverez notre nouvelle colonne VRatio.

Dans la liste de droite, sélectionnez Bénéfice net (pour ajouter la nouvelle colonne juste après Bénéfice net) et cliquez sur > bouton.

Cela ajoutera la colonne aux colonnes de cette vue. N'oubliez pas de cliquer sur Enregistrer les modifications pour sauvegarder notre nouvelle vue en toute sécurité. Nous pouvons ensuite fermer cette boîte de dialogue.

Maintenant, lorsque vous ouvrirez à nouveau les vues, vous verrez la nouvelle vue que nous venons de définir et nous pourrons la sélectionner.

Maintenant, lorsque nous chargerons quelques stratégies, nous verrons notre nouveau VRatio correctement calculée et affichée.

5. Créer un modèle de vue d'ensemble Analyzer â†' personnalisé qui affiche la nouvelle valeur.

Nous pouvons maintenant voir notre nouvelle valeur VRatio dans la banque de données, mais que faire si nous voulons la voir aussi dans la fenêtre Analyse -> Vue d'ensemble ?

C'est également possible. Comme beaucoup d'autres choses, l'onglet Vue d'ensemble est contrôlé par des extraits. Chaque modèle est implémenté comme un extrait qui rend son propre fichier HTML.
Chaque modèle d'aperçu se compose donc d'un extrait et d'un fichier HTML.

Trois possibilités s'offrent à nous pour afficher la valeur dans l'onglet Vue d'ensemble :

Modifier un extrait d'aperçu existant (non recommandé)
nous pouvons modifier l'un des snippets Overview par défaut du système et lui faire afficher la valeur VRatio au lieu d'une autre valeur dont nous n'avons pas besoin.
Ce n'est pas recommandé, car les extraits de système par défaut peuvent être modifiés lors d'une mise à jour et vos modifications seraient perdues.


Création d'un nouvel extrait de présentation qui utilisera le modèle existant
la deuxième option consiste à créer un nouveau snippet Overview, mais à utiliser le fichier modèle HTML existant. Cela présente l'avantage que notre nouveau snippet ne sera pas modifié par une future mise à jour.
L'inconvénient est que, puisque nous utiliserons le fichier de modèle HTML existant, nous ne pouvons pas y ajouter de nouvelles valeurs. Nous pouvons seulement afficher VRatio au lieu de une autre valeur.


Création d'un nouvel extrait de présentation avec un nouveau modèle
dans cette option, nous allons créer un nouveau snippet et un nouveau modèle de rendu HTML. Ici, nous sommes libres de faire ce que nous voulons, nous pouvons même utiliser du HTML qui montre notre propre design personnalisé.

Dans notre exemple, nous opterons pour la deuxième option - créer un nouvel extrait qui utilise un modèle HTML existant.

Ainsi, toujours dans QuantEditor, nous irons à /extend/Snippets/OverviewTab et créer un nouveau snippet appelé DefaultPlusVRatio.
Cela créera un nouveau snippet qui implémentera un nouveau modèle pour l'onglet Vue d'ensemble.

Nous allons à nouveau expliquer ses méthodes, mais avant tout, nous devons effectuer un changement. Parce que nous voulons simplement créer une copie du modèle SQDefault, avec une seule valeur remplacée, nous devons changer la classe parentale de notre nouveau snippet de OverviewTemplate à SQDefault.

Cela signifie que notre nouveau snippet utilisera toutes les méthodes de SQDefault et que nous ne devrons implémenter que ce qui est différent.

Si nous ne le faisions pas, nous devrions écrire le code pour remplacer toutes les valeurs de la même manière que dans l'extrait SQDefault.

Nous allons donc modifier la ligne

public class DefaultPlusVRatio extends OverviewTemplate {

à

public class DefaultPlusVRatio extends SQDefault {

 

Nous pouvons maintenant examiner le reste des méthodes.

 

DefaultPlusVRatio()

c'est le constructeur de la classe, il est appelé lorsque le snippet est créé. Nous devons définir ici le nom du modèle, l'image de la capture d'écran et le fichier du modèle HTML.

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

// nous copierons les valeurs ci-dessous du snippet SQDefault, notre nouveau snippet utilisera le même modèle HTML
// Ces fichiers sont situés dans /settings/plugins/OverviewTab
setScreenshotName("sqdefault_screenshot.jpg") ;
setHtmlTemplateName("sqdefault_template.htm") ;

 

drawValues()

c'est la fonction principale. Elle charge le fichier modèle HTML, remplace les constantes qui s'y trouvent par des étiquettes et des valeurs appropriées et renvoie le tout au programme.
Dans notre cas, nous n'avons pas besoin de le modifier du tout.

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

retourner le modèle ;
}

 

replaceValues()

cette fonction est appelée à partir de drawValues() et remplace les constantes du modèle HTML par des valeurs calculées par le programme - elles sont stockées dans result -> stats

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

// cette première partie obtient les valeurs de statistiques appropriées à partir du résultat
// nous pouvons utiliser le code par défaut pour cela
if(strategyResult!=null) {
      result = strategyResult.getResult(symbol) ;

      if(result!=null) {
         stats = result.getStats(combination) ;
      }
   }

// nous remplaçons ici la constante 3_2 par notre valeur V Ratio
// si vous vérifiez le snippet SQDefault, vous verrez qu'il remplace 3_2 par R Expectancy
// dans notre modèle, nous afficherons donc le ratio V au lieu de l'espérance de vie

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

// à la fin, nous devons appeler la méthode replaceValues() de la classe mère (SQDefault)
// pour remplacer toutes les valeurs restantes
   super.replaceValues(strategyResult, symbol, combination) ;
}

 

C'est tout. Maintenant, compilez ce snippet et vous verrez le nouveau modèle dans Analyse -> Vue d'ensemble.

Lorsque vous basculerez sur ce modèle, vous verrez qu'il affiche désormais le ratio V à la place du modèle standard SQDefault qui affiche l'espérance de vie.

 

Cet exemple montre comment créer un nouveau modèle de vue d'ensemble qui affiche notre valeur personnalisée.

Si vous avez plus d'une valeur personnalisée, il peut être utile de créer une copie du modèle HTML et de le modifier de manière à ce qu'il contienne une ligne supplémentaire de valeurs.

N'oubliez pas que vous pouvez définir votre propre fichier dans le constructeur du snippet dans setHtmlTemplateName()
Les fichiers de modèles HTML utilisés dans les snippets d'aperçu sont situés dans /settings/plugins/OverviewTab/.

 

C'est tout ce qu'il y a dans ce tutoriel.
Nous avons montré comment il est facile d'étendre QuantAnalyzer avec de nouvelles valeurs personnalisées et comment les afficher dans la banque de données et l'aperçu.

 

Cet article a-t-il été utile ? L'article était utile L'article n'était pas utile

S'abonner
Notification pour
0 Commentaires
Commentaires en ligne
Afficher tous les commentaires