From b317e382f67b769ebd5692963a6997a894f2a1dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Delacotte?= Date: Fri, 16 May 2025 17:47:05 +0200 Subject: [PATCH] Affichage graphique --- tools/Show_Backtest_Result.py | 92 +++++++++++++++++++++++++++++++++++ tools/statistique/vue_3d.py | 47 ++++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 tools/Show_Backtest_Result.py create mode 100644 tools/statistique/vue_3d.py diff --git a/tools/Show_Backtest_Result.py b/tools/Show_Backtest_Result.py new file mode 100644 index 0000000..931f8b2 --- /dev/null +++ b/tools/Show_Backtest_Result.py @@ -0,0 +1,92 @@ +import pandas as pd +import plotly.graph_objects as go +from jinja2 import Template +import json +import datetime + +# === CONFIGURATION === +SUMMARY_FILE = "user_data/backtest_results/result.json" # chemin vers ton JSON +BALANCE_HISTORY_FILE = "user_data/backtest_results/backtest_result.json" # ou fichier contenant le portefeuille + +# === CHARGEMENT DES DONNÉES === +with open(SUMMARY_FILE, "r") as f: + summary = json.load(f) + +df_summary = pd.DataFrame([summary]) +start = summary.get("backtest_start", "") +end = summary.get("backtest_end", "") +final_balance = summary.get("final_balance", 0) + +# === AFFICHAGE DES ÉVOLUTIONS DE BALANCE === +result = pd.read_json(BALANCE_HISTORY_FILE) +result["date"] = pd.to_datetime(result["date"]) +balance_trace = go.Scatter( + x=result["date"], + y=result["balance"], + mode="lines", + name="Balance", + line=dict(color="green") +) + +layout = go.Layout( + title="Évolution du portefeuille", + xaxis_title="Date", + yaxis_title="Balance (USDT)", + template="plotly_white" +) + +fig = go.Figure(data=[balance_trace], layout=layout) +fig.write_html("balance_plot.html", include_plotlyjs="cdn") + +# === GÉNÉRATION DU RAPPORT HTML === +template_str = """ + + + + + Rapport de Backtest + + + +

Rapport de Backtest

+

Période : {{ start }} → {{ end }}

+ + + {% for key, value in metrics.items() %} + + {% endfor %} +
MétriqueValeur
{{ key }}{{ value }}
+

Évolution de la balance

+ + + +""" + +metrics = { + "Trading Mode": summary.get("strategy", ""), + "Total Trades": summary.get("total_trades", 0), + "Final Balance": f"{final_balance:.2f} USDT", + "Profit (%)": f"{summary.get('profit_total_pct', 0):.2f}%", + "CAGR": f"{summary.get('cagr', 0):.2f}%", + "Sharpe": summary.get("sharpe", ""), + "Sortino": summary.get("sortino", ""), + "SQN": summary.get("sqn", ""), + "Calmar": summary.get("calmar", ""), + "Best Pair": summary.get("best_pair", ""), + "Worst Pair": summary.get("worst_pair", ""), + "Max Drawdown": summary.get("max_drawdown", ""), +} + +template = Template(template_str) +html_content = template.render(start=start, end=end, metrics=metrics) + +with open("backtest_report.html", "w") as f: + f.write(html_content) + +print("✅ Rapport généré : backtest_report.html") diff --git a/tools/statistique/vue_3d.py b/tools/statistique/vue_3d.py new file mode 100644 index 0000000..f4931a0 --- /dev/null +++ b/tools/statistique/vue_3d.py @@ -0,0 +1,47 @@ +import matplotlib.pyplot as plt +import numpy as np +from mpl_toolkits.mplot3d import Axes3D + +# Labels +x_labels = ['B5', 'B4', 'B3', 'B2', 'B1', 'N0', 'H1', 'H2', 'H3', 'H4', 'H5'] +y_labels = ['B5', 'B4', 'B3', 'B2', 'B1', 'N0', 'H1', 'H2', 'H3', 'H4', 'H5'] + +# Data +data = np.array([ + [40.3, 52.1, 60.2, 68.6, 86.3, 76.5, 75.1, 83.5, 88.7, 96.3, 91.6], + [26.6, 39.4, 48.1, 57.0, 76.7, 82.4, 79.6, 82.4, 91.8, 86.6, 87.8], + [21.5, 27.7, 42.7, 53.2, 70.9, 76.6, 80.8, 79.4, 88.3, 88.0, 87.8], + [15.1, 20.8, 32.9, 46.9, 59.1, 79.6, 82.5, 79.6, 80.8, 87.0, 85.5], + [15.7, 15.4, 21.9, 29.4, 48.3, 66.6, 76.4, 77.8, 80.8, 83.5, 81.4], + [15.0, 10.5, 20.1, 24.5, 36.9, 59.9, 68.8, 74.1, 77.7, 83.0, 75.7], + [14.8, 10.7, 15.1, 21.0, 30.1, 47.3, 59.2, 70.4, 76.1, 82.7, 82.6], + [7.9, 8.6, 13.6, 20.6, 27.0, 39.5, 55.2, 68.9, 69.0, 78.4, 83.4], + [9.2, 6.2, 12.6, 21.7, 23.6, 33.1, 42.3, 57.8, 66.0, 71.9, 81.9], + [4.8, 13.1, 16.3, 14.5, 19.5, 26.4, 35.6, 49.2, 63.2, 68.2, 71.6], + [17.9, 25.7, 20.8, 17.8, 8.7, 18.5, 32.3, 37.7, 49.3, 59.8, 61.7] +]) + +# Meshgrid for 3D plotting +x = np.arange(len(x_labels)) +y = np.arange(len(y_labels)) +x, y = np.meshgrid(x, y) + +# Plot +fig = plt.figure(figsize=(12, 8)) +ax = fig.add_subplot(111, projection='3d') +surf = ax.plot_surface(x, y, data, cmap='viridis', edgecolor='k') + +# Axis formatting +ax.set_xticks(np.arange(len(x_labels))) +ax.set_yticks(np.arange(len(y_labels))) +ax.set_xticklabels(x_labels) +ax.set_yticklabels(y_labels) +ax.set_xlabel("mid_smooth_deriv1_144_bin") +ax.set_ylabel("sma144_diff_bin") +ax.set_zlabel("Probabilité de hausse (%)") +ax.set_title("Probabilité de hausse pour futur_percent_3h en 3D") + +fig.colorbar(surf, shrink=0.5, aspect=10) + +plt.tight_layout() +plt.show()