|
from datetime import datetime, timedelta |
|
import gradio as gr |
|
import pandas as pd |
|
import duckdb |
|
import logging |
|
|
|
|
|
from scripts.metrics import ( |
|
compute_weekly_metrics_by_market_creator, |
|
compute_weekly_metrics_by_trader_type, |
|
compute_winning_metrics_by_trader, |
|
) |
|
from tabs.trader_plots import ( |
|
plot_trader_metrics_by_market_creator, |
|
plot_trader_metrics_by_trader_type, |
|
default_trader_metric, |
|
trader_metric_choices, |
|
get_metrics_text, |
|
plot_winning_metric_per_trader, |
|
get_interpretation_text, |
|
) |
|
|
|
from tabs.market_plots import ( |
|
plot_kl_div_per_market, |
|
) |
|
|
|
|
|
def get_logger(): |
|
logger = logging.getLogger(__name__) |
|
logger.setLevel(logging.DEBUG) |
|
|
|
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_all_data(): |
|
""" |
|
Get parquet files from weekly stats and new generated |
|
""" |
|
logger.info("Getting traders data") |
|
con = duckdb.connect(":memory:") |
|
|
|
query1 = f""" |
|
SELECT * |
|
FROM read_parquet('./data/all_trades_profitability.parquet') |
|
""" |
|
df1 = con.execute(query1).fetchdf() |
|
logger.info("Got all data from all_trades_profitability.parquet") |
|
|
|
|
|
query2 = f""" |
|
SELECT * |
|
FROM read_parquet('./data/closed_markets_div.parquet') |
|
""" |
|
df2 = con.execute(query2).fetchdf() |
|
logger.info("Got all data from closed_markets_div.parquet") |
|
|
|
con.close() |
|
|
|
return df1, df2 |
|
|
|
|
|
def prepare_data(): |
|
|
|
all_trades, closed_markets = get_all_data() |
|
|
|
all_trades["creation_date"] = all_trades["creation_timestamp"].dt.date |
|
|
|
|
|
volume_trades_per_trader_and_market = ( |
|
all_trades.groupby(["trader_address", "title"])["roi"].count().reset_index() |
|
) |
|
volume_trades_per_trader_and_market.rename( |
|
columns={"roi": "nr_trades_per_market"}, inplace=True |
|
) |
|
|
|
trader_agents_data = pd.merge( |
|
all_trades, volume_trades_per_trader_and_market, on=["trader_address", "title"] |
|
) |
|
|
|
trader_agents_data["trader_type"] = "singlebet" |
|
|
|
trader_agents_data = trader_agents_data.sort_values( |
|
by="creation_timestamp", ascending=True |
|
) |
|
|
|
trader_agents_data["month_year_week"] = ( |
|
trader_agents_data["creation_timestamp"].dt.to_period("W").dt.strftime("%b-%d") |
|
) |
|
|
|
closed_markets["month_year_week"] = ( |
|
closed_markets["opening_datetime"].dt.to_period("W").dt.strftime("%b-%d") |
|
) |
|
return trader_agents_data, closed_markets |
|
|
|
|
|
trader_agents_data, closed_markets = prepare_data() |
|
print("trader agents data before computing metrics") |
|
print(trader_agents_data.head()) |
|
demo = gr.Blocks() |
|
|
|
weekly_metrics_by_market_creator = compute_weekly_metrics_by_market_creator( |
|
trader_agents_data |
|
) |
|
print("weekly metrics by market creator") |
|
print(weekly_metrics_by_market_creator.head()) |
|
|
|
weekly_metrics_by_trader_type = compute_weekly_metrics_by_trader_type( |
|
trader_agents_data |
|
) |
|
weekly_winning_metrics = compute_winning_metrics_by_trader( |
|
trader_agents_data=trader_agents_data |
|
) |
|
with demo: |
|
gr.HTML("<h1>Trader agents monitoring dashboard </h1>") |
|
gr.Markdown( |
|
"This app shows the weekly performance of the trader agents in Olas Predict." |
|
) |
|
|
|
with gr.Tabs(): |
|
with gr.TabItem("🔥Trader Agents Dashboard"): |
|
with gr.Row(): |
|
gr.Markdown("# Weekly metrics of trader agents by market creator") |
|
with gr.Row(): |
|
trader_details_selector = gr.Dropdown( |
|
label="Select a trader metric", |
|
choices=trader_metric_choices, |
|
value=default_trader_metric, |
|
) |
|
|
|
with gr.Row(): |
|
with gr.Column(scale=3): |
|
trader_markets_plot = plot_trader_metrics_by_market_creator( |
|
metric_name=default_trader_metric, |
|
traders_df=weekly_metrics_by_market_creator, |
|
) |
|
with gr.Column(scale=1): |
|
trade_details_text = get_metrics_text() |
|
|
|
def update_trader_details(trader_detail): |
|
return plot_trader_metrics_by_market_creator( |
|
metric_name=trader_detail, |
|
traders_df=weekly_metrics_by_market_creator, |
|
) |
|
|
|
trader_details_selector.change( |
|
update_trader_details, |
|
inputs=trader_details_selector, |
|
outputs=trader_markets_plot, |
|
) |
|
|
|
with gr.TabItem("📉Closed Markets Kullback–Leibler divergence"): |
|
with gr.Row(): |
|
gr.Markdown( |
|
"# Weekly Market Prediction Accuracy for Closed Markets (Kullback-Leibler Divergence)" |
|
) |
|
with gr.Row(): |
|
gr.Markdown( |
|
"Aka, how much off is the market prediction’s accuracy from the real outcome of the event. Values capped at 20 for market outcomes completely opposite to the real outcome." |
|
) |
|
with gr.Row(): |
|
trade_details_text = get_metrics_text() |
|
with gr.Row(): |
|
with gr.Column(scale=3): |
|
kl_div_plot = plot_kl_div_per_market(closed_markets=closed_markets) |
|
with gr.Column(scale=1): |
|
interpretation = get_interpretation_text() |
|
|
|
with gr.TabItem("🎖️Weekly winning trades % per trader"): |
|
with gr.Row(): |
|
gr.Markdown("# Winning trades percentage from weekly trades by trader") |
|
with gr.Row(): |
|
metrics_text = get_metrics_text() |
|
with gr.Row(): |
|
|
|
winning_metric = plot_winning_metric_per_trader(weekly_winning_metrics) |
|
|
|
demo.queue(default_concurrency_limit=40).launch() |
|
|