from datetime import datetime, timedelta import gradio as gr import matplotlib.pyplot as plt import pandas as pd import seaborn as sns import duckdb import logging from tabs.trades import ( prepare_trades, get_overall_trades, get_overall_by_market_trades, get_overall_winning_trades, get_overall_winning_by_market_trades, plot_trades_by_week, plot_trades_per_market_by_week, plot_winning_trades_by_week, plot_winning_trades_per_market_by_week, integrated_plot_trades_per_market_by_week, integrated_plot_winning_trades_per_market_by_week, ) from tabs.metrics import ( metric_choices, default_metric, plot_trade_details, plot2_trade_details, plot_trade_metrics, WIDTH, HEIGHT, ) from tabs.tool_win import ( get_tool_winning_rate, get_overall_winning_rate, plot_tool_winnings_overall, plot_tool_winnings_by_tool, ) from tabs.tool_accuracy import ( compute_weighted_accuracy, plot_tools_accuracy_graph, plot_tools_weighted_accuracy_graph, ) from tabs.invalid_markets import ( plot_daily_dist_invalid_trades, plot_ratio_invalid_trades_per_market, plot_top_invalid_markets, plot_daily_nr_invalid_markets, ) from tabs.error import ( get_error_data, get_error_data_overall, plot_error_data, plot_tool_error_data, plot_week_error_data, ) from tabs.about import about_olas_predict, about_this_dashboard from scripts.utils import INC_TOOLS def get_logger(): logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) # stream handler and formatter stream_handler = logging.StreamHandler() stream_handler.setLevel(logging.DEBUG) formatter = logging.Formatter( "%(asctime)s - %(name)s - %(levelname)s - %(message)s" ) stream_handler.setFormatter(formatter) logger.addHandler(stream_handler) return logger logger = get_logger() def get_last_one_month_data(): """ Get the last one month data from the tools.parquet file """ logger.info("Getting last one month data") con = duckdb.connect(":memory:") one_months_ago = (datetime.now() - timedelta(days=60)).strftime("%Y-%m-%d") # Query to fetch data from all_trades_profitability.parquet query2 = f""" SELECT * FROM read_parquet('./data/all_trades_profitability.parquet') WHERE creation_timestamp >= '{one_months_ago}' """ df2 = con.execute(query2).fetchdf() logger.info("Got last one month data from all_trades_profitability.parquet") query1 = f""" SELECT * FROM read_parquet('./data/tools.parquet') WHERE request_time >= '{one_months_ago}' """ df1 = con.execute(query1).fetchdf() logger.info("Got last one month data from tools.parquet") con.close() return df1, df2 def get_all_data(): """ Get all data from the tools.parquet, tools_accuracy and trades parquet files """ logger.info("Getting all data") con = duckdb.connect(":memory:") # Query to fetch invalid trades data query4 = f""" SELECT * FROM read_parquet('./data/invalid_trades.parquet') """ df4 = con.execute(query4).fetchdf() # Query to fetch tools accuracy data query3 = f""" SELECT * FROM read_csv('./data/tools_accuracy.csv') """ df3 = con.execute(query3).fetchdf() # Query to fetch data from all_trades_profitability.parquet query2 = f""" SELECT * FROM read_parquet('./data/all_trades_profitability.parquet') """ df2 = con.execute(query2).fetchdf() logger.info("Got all data from all_trades_profitability.parquet") query1 = f""" SELECT * FROM read_parquet('./data/tools.parquet') """ df1 = con.execute(query1).fetchdf() logger.info("Got all data from tools.parquet") con.close() return df1, df2, df3, df4 def prepare_data(): """ Prepare the data for the dashboard """ tools_df, trades_df, tools_accuracy_info, invalid_trades = get_all_data() print(trades_df.info()) tools_df["request_time"] = pd.to_datetime(tools_df["request_time"]) trades_df["creation_timestamp"] = pd.to_datetime(trades_df["creation_timestamp"]) trades_df = prepare_trades(trades_df) tools_accuracy_info = compute_weighted_accuracy(tools_accuracy_info) print("weighted accuracy info") print(tools_accuracy_info.head()) invalid_trades["creation_timestamp"] = pd.to_datetime( invalid_trades["creation_timestamp"] ) invalid_trades["creation_date"] = invalid_trades["creation_timestamp"].dt.date return tools_df, trades_df, tools_accuracy_info, invalid_trades tools_df, trades_df, tools_accuracy_info, invalid_trades = prepare_data() demo = gr.Blocks() error_df = get_error_data(tools_df=tools_df, inc_tools=INC_TOOLS) error_overall_df = get_error_data_overall(error_df=error_df) winning_rate_df = get_tool_winning_rate(tools_df=tools_df, inc_tools=INC_TOOLS) winning_rate_overall_df = get_overall_winning_rate(wins_df=winning_rate_df) trades_count_df = get_overall_trades(trades_df=trades_df) trades_winning_rate_df = get_overall_winning_trades(trades_df=trades_df) trades_by_market = get_overall_by_market_trades(trades_df=trades_df) winning_trades_by_market = get_overall_winning_by_market_trades(trades_df=trades_df) with demo: gr.HTML("

Olas Predict Actual Performance

") gr.Markdown( "This app shows the actual performance of Olas Predict tools on the live market." ) with gr.Tabs(): with gr.TabItem("🔥Trades Dashboard v1"): with gr.Row(): gr.Markdown("# Trend of weekly trades") with gr.Row(): with gr.Column(min_width=400): qs_trades_by_week = plot_trades_per_market_by_week( trades_df=trades_by_market, market_type="quickstart" ) with gr.Column(min_width=400): pearl_trades_by_week = plot_trades_per_market_by_week( trades_df=trades_by_market, market_type="pearl" ) with gr.Column(min_width=400): all_trades_by_week = plot_trades_per_market_by_week( trades_df=trades_by_market, market_type="all" ) with gr.Row(): gr.Markdown("# Percentage of winning trades per week") with gr.Row(): with gr.Column(min_width=400): qs_wtrades_by_week = plot_winning_trades_per_market_by_week( trades_df=winning_trades_by_market, market_type="quickstart" ) with gr.Column(min_width=400): pearl_wtrades_by_week = plot_winning_trades_per_market_by_week( trades_df=winning_trades_by_market, market_type="pearl" ) with gr.Column(min_width=400): all_wtrades_by_week = plot_winning_trades_per_market_by_week( trades_df=winning_trades_by_market, market_type="all" ) with gr.Row(): gr.Markdown("# ⚖️ Trading metrics") with gr.Row(): trade_details_selector = gr.Dropdown( label="Select a trade metric", choices=metric_choices, value=default_metric, ) with gr.Row(): trade_details_plot = plot_trade_metrics( metric_name=default_metric, trades_df=trades_df, ) def update_trade_details(trade_detail): return plot_trade_metrics(metric_name=trade_detail, trades_df=trades_df) trade_details_selector.change( update_trade_details, inputs=trade_details_selector, outputs=trade_details_plot, ) with gr.Row(): trade_details_selector with gr.Row(): trade_details_plot with gr.TabItem("🔥Trades Dashboard v2"): with gr.Row(): gr.Markdown("# Trend of weekly trades") with gr.Row(): trades_by_week = integrated_plot_trades_per_market_by_week( trades_df=trades_df ) with gr.Row(): gr.Markdown("# Percentage of winning trades per week") with gr.Row(): all_wtrades_by_week = integrated_plot_winning_trades_per_market_by_week( trades_df=trades_df ) with gr.Row(): gr.Markdown("# ⚖️ Trading metrics") with gr.Row(): trade_details_selector = gr.Dropdown( label="Select a trade metric", choices=metric_choices, value=default_metric, ) with gr.Row(): trade_details_plot = plot_trade_metrics( metric_name=default_metric, trades_df=trades_df, height=400, width=1400, ) def update_trade_details(trade_detail): return plot_trade_metrics( metric_name=trade_detail, trades_df=trades_df, height=400, width=1400, ) trade_details_selector.change( update_trade_details, inputs=trade_details_selector, outputs=trade_details_plot, ) with gr.Row(): trade_details_selector with gr.Row(): trade_details_plot with gr.TabItem("🚀 Tool Winning Dashboard"): with gr.Row(): gr.Markdown("# All tools winning performance") with gr.Row(): winning_selector = gr.Dropdown( label="Select the tool metric", choices=["losses", "wins", "total_request", "win_perc"], value="win_perc", ) with gr.Row(): winning_plot = plot_tool_winnings_overall( wins_df=winning_rate_overall_df, winning_selector="win_perc" ) def update_tool_winnings_overall_plot(winning_selector): return plot_tool_winnings_overall( wins_df=winning_rate_overall_df, winning_selector=winning_selector ) winning_selector.change( update_tool_winnings_overall_plot, inputs=winning_selector, outputs=winning_plot, ) with gr.Row(): winning_selector with gr.Row(): winning_plot with gr.Row(): gr.Markdown("# Winning performance by each tool") with gr.Row(): sel_tool = gr.Dropdown( label="Select a tool", choices=INC_TOOLS, value=INC_TOOLS[0] ) with gr.Row(): tool_winnings_by_tool_plot = plot_tool_winnings_by_tool( wins_df=winning_rate_df, tool=INC_TOOLS[0] ) def update_tool_winnings_by_tool_plot(tool): return plot_tool_winnings_by_tool(wins_df=winning_rate_df, tool=tool) sel_tool.change( update_tool_winnings_by_tool_plot, inputs=sel_tool, outputs=tool_winnings_by_tool_plot, ) with gr.Row(): sel_tool with gr.Row(): tool_winnings_by_tool_plot with gr.TabItem("🎯 Tool Accuracy Dashboard"): with gr.Row(): gr.Markdown("# Tools accuracy ranking") with gr.Row(): gr.Markdown( "The data used for this metric is from the past two months. This accuracy is computed based on right answers from the total requests received." ) with gr.Row(): _ = plot_tools_accuracy_graph(tools_accuracy_info) with gr.Row(): gr.Markdown("# Weighted accuracy ranking per tool") with gr.Row(): gr.Markdown( "This metric is an approximation to the real metric used by the trader since some parameters are only dynamically generated." ) with gr.Row(): gr.Markdown( "The data used for this metric is from the past two months. This metric is computed using both the tool accuracy and the volume of requests received by the tool" ) with gr.Row(): _ = plot_tools_weighted_accuracy_graph(tools_accuracy_info) with gr.TabItem("⛔ Invalid Markets Dashboard"): with gr.Row(): gr.Markdown("# Daily distribution of invalid trades") with gr.Row(): daily_trades = plot_daily_dist_invalid_trades(invalid_trades) # with gr.Row(): # gr.Markdown("# Ratio of invalid trades per market") # with gr.Row(): # plot_ratio_invalid_trades_per_market(invalid_trades) with gr.Row(): gr.Markdown("# Top markets with invalid trades") with gr.Row(): top_invalid_markets = plot_top_invalid_markets(invalid_trades) with gr.Row(): gr.Markdown("# Daily distribution of invalid markets") with gr.Row(): invalid_markets = plot_daily_nr_invalid_markets(invalid_trades) with gr.TabItem("🏥 Tool Error Dashboard"): with gr.Row(): gr.Markdown("# All tools errors") with gr.Row(): error_overall_plot = plot_error_data(error_all_df=error_overall_df) with gr.Row(): gr.Markdown("# Error percentage per tool") with gr.Row(): sel_tool = gr.Dropdown( label="Select a tool", choices=INC_TOOLS, value=INC_TOOLS[0] ) with gr.Row(): tool_error_plot = plot_tool_error_data( error_df=error_df, tool=INC_TOOLS[0] ) def update_tool_error_plot(tool): return plot_tool_error_data(error_df=error_df, tool=tool) sel_tool.change( update_tool_error_plot, inputs=sel_tool, outputs=tool_error_plot ) with gr.Row(): sel_tool with gr.Row(): tool_error_plot with gr.Row(): gr.Markdown("# Tools distribution of errors per week") with gr.Row(): choices = error_overall_df["request_month_year_week"].unique().tolist() # sort the choices by the latest week to be on the top choices = sorted(choices) sel_week = gr.Dropdown( label="Select a week", choices=choices, value=choices[-1] ) with gr.Row(): week_error_plot = plot_week_error_data( error_df=error_df, week=choices[-1] ) def update_week_error_plot(selected_week): return plot_week_error_data(error_df=error_df, week=selected_week) sel_tool.change( update_tool_error_plot, inputs=sel_tool, outputs=tool_error_plot ) sel_week.change( update_week_error_plot, inputs=sel_week, outputs=week_error_plot ) with gr.Row(): sel_tool with gr.Row(): tool_error_plot with gr.Row(): sel_week with gr.Row(): week_error_plot with gr.TabItem("ℹ️ About"): with gr.Accordion("About Olas Predict"): gr.Markdown(about_olas_predict) with gr.Accordion("About this dashboard"): gr.Markdown(about_this_dashboard) demo.queue(default_concurrency_limit=40).launch()