Report delle performance di una strategia in Python

Report delle performance di una strategia in Python – parte 1

Sommario

In questo articolo descriviamo come implementare un report delle performance di una strategia in Python per verificare i risultati di un backtest. Questo articolo fa parte di una mini-serie di che offre una panoramica su come creare un generatore HTML personalizzabile per un report di una strategia di trading.

Obiettivo

L’obiettivo è creare uno strumento che crea un file HTML a partire da un file csv che contiene i dati dell’equity di una strategia e (facoltativamente) una  serie equity di benchmark. Dobbiamo quindi solamente creare il file csv, posizionalo in una cartella particolare,  lanciare uno script. Otteniamo un file HTML che può essere visualizzato nel browser e contiene tutti i tipi di grafici, statistiche e analisi sulle prestazioni della strategia.

Prima di passare all’analisi delle prestazioni e calcolo delle statistiche pertinenti, dobbiamo creare lo “scheletro” del progetto. Questo scheletro contiene tutti i file, i moduli e la logica necessari per generare i file HTML di output più basilari, tramite una semplice variabile “placeholder” per assicurarsi che le cose funzionino come previsto.

Per prima cosa dobbiamo creare la struttura di cartelle necessaria insieme ad alcuni file necessari durante l’implementazione.

				
					Project
|
+– main.py
|
+– templates
| |
| +– template.html
|
+– data
| |
| +– data.csv
|
+– output
| |
| +– report.html
|
+– static
  |
  +– app.css
  |
  +– app.js
				
			

Inizialmente lasciamo i file vuoti. Torniamo su di loro a tempo debito e apportare le  modifiche necessarie in ogni fase del progetto.

Il progetto è composto dalle seguenti parti e funzionalità:

  1. Il componente principale dell’intero progetto è la classe “PerformanceReport”, implementata all’interno del file “main.py”.
  2. La classe PerformanceReport sfrutta le potenzialità di jinja2 e le sue funzionalità di “templating”. Possiamo calcolare e creare tutti i grafici e statistiche nel corpo della classe, e quindi “iniettare” questi oggetti come variabili in un template HTML.
  3. Il file “template.html”, nella cartella “templates”, è modello HTML dove  inseriamo i nostri oggetti.
  4. Jinja2 è usato per convertire tutti gli oggetti e template in una lunga stringa html, che è poi scritta nel file “report.html” nella cartella “output”. Questo file “report.html” è quindi pronto per  essere aperto e renderizzato da qualsiasi browser moderno per  poter visualizzare i risultati della strategia.

Creare un template

Iniziamo quindi ad organizzare correttamente il codice base in modo da poter istanziare la classe PerformanceReport, impostare una variabile fittizia da inserire nel modello HTML e quindi convertire tutto in file report.html come output finale.

Creiamo il file main.py ed aggiungiamo il seguente codice:

				
					import os
from jinja2 import Environment, FileSystemLoader


class PerformanceReport:
    """ Report con le statistiche delle performance stats per una data strategia
    """

    def __init__(self):
        pass

    def generate_html(self):
        env = Environment(loader=FileSystemLoader('.'))
        template = env.get_template("templates/template.html")
        placeholder = 'Hello World'
        html_out = template.render(test_variable=placeholder)
        return html_out

    def generate_html_report(self):
        """ Restitusice un report HTML con le analisi
        """
        html = self.generate_html()
        outputdir = "output"
        outfile = os.path.join(outputdir, 'report.html')
        file = open(outfile, "w")
        file.write(html)
        file.close()


if __name__ == "__main__":
    report = PerformanceReport()
    report.generate_html_report()
				
			

Notiamo che il codice definisce una variabile placeholder con un valore di default pari alla stringa “Hello World”. Questa variabile è usata come argomento d’ingresso alla funzione template.render(), facendo riferimento ad essa come test_variable“. La funzionalità di Jinja2 permette di accedere a quella variabile direttamente dal modello HTML in cui è stata inserita.

A tale scopo dobbiamo aggiungere il seguente codice al file “template.html” nella cartella “templates”:

				
					<pre lang="html">
<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8" />
    <title>App</title>
    <meta name= "viewport"content="width=device-width, initial-scale=1" />
    <script charset="utf-8" src="static/app.js"></script>
    <link rel="stylesheet" href="static/app.css" />
</head>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/

Page Caching using Disk: Enhanced 

Served from: datatrading.info @ 2024-07-27 06:32:36 by W3 Total Cache
-->