Files
Funding_Rate/pnl.ipynb

1656 lines
44 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "code",
"execution_count": 109,
"id": "44ff5c50",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"from pprint import pprint\n",
"from sqlalchemy import create_engine, text\n",
"import plotly.express as px\n",
"import requests\n",
"import json\n",
"import time\n",
"from datetime import datetime\n",
"import plotly.graph_objects as go\n",
"from plotly.subplots import make_subplots\n",
"import numpy as np\n",
"from sqlalchemy.sql.elements import TextClause"
]
},
{
"cell_type": "code",
"execution_count": 110,
"id": "527235c9",
"metadata": {},
"outputs": [],
"source": [
"start_ts = 1777498660*1000"
]
},
{
"cell_type": "code",
"execution_count": 111,
"id": "ca48e11c",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Connection successful\n"
]
}
],
"source": [
"### MYSQL ###\n",
"ENGINE = create_engine('mysql+pymysql://root:pwd@localhost/fund_rate')\n",
"try:\n",
" with ENGINE.connect() as conn:\n",
" print(\"Connection successful\")\n",
"except Exception as e:\n",
" print(f\"Connection failed: {e}\") "
]
},
{
"cell_type": "code",
"execution_count": 112,
"id": "ec8f5d67",
"metadata": {},
"outputs": [],
"source": [
"### ASTER ###\n",
"aster_orders = text(f'''\n",
" SELECT *\n",
" FROM fr_aster_user_order_trade\n",
" WHERE timestamp_arrival > {start_ts}\n",
"''')\n",
"df_aster_orders = pd.read_sql(aster_orders, con=ENGINE)\n",
"df_aster_orders['timestamp_dt'] = pd.to_datetime(df_aster_orders['timestamp_transaction'], unit='ms')\n",
"df_aster_orders_fill = df_aster_orders.loc[df_aster_orders['execution_type']=='TRADE',:]\n",
"df_aster_orders_fill = df_aster_orders_fill[['timestamp_transaction','order_trade_time_ts','timestamp_dt','order_id','trade_id','client_order_id','order_status','side','last_filled_qty','filled_accumulated_qty','commission','last_filled_price','realized_profit']].reset_index(drop=True)\n",
"\n",
"df_aster_trades = df_aster_orders_fill.groupby('order_id').agg({'timestamp_transaction': 'first','order_trade_time_ts':'last','order_status':'last','side':'last','last_filled_qty':'sum','filled_accumulated_qty':'last','commission':'sum','last_filled_price':'mean','realized_profit':'sum'}).reset_index()\n",
"df_aster_trades['is_mkt_maker'] = df_aster_trades['commission'] == 0.00\n",
"df_aster_trades['timestamp_ts'] = pd.to_datetime(df_aster_trades['order_trade_time_ts'], unit='ms')\n",
"\n",
"df_aster_trades = df_aster_trades.rename({'order_status':'status','filled_accumulated_qty':'filled_qty','commission':'payed_fee','last_filled_price':'price'}, axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 113,
"id": "1cb4869a",
"metadata": {},
"outputs": [],
"source": [
"### EXTEND ###\n",
"# Load and Transform Orders\n",
"extend_orders = text(f'''\n",
" SELECT *\n",
" FROM fr_extended_user_order\n",
" WHERE timestamp_arrival > {start_ts}\n",
"''')\n",
"df_extend_orders = pd.read_sql(extend_orders, con=ENGINE)\n",
"df_extend_orders['timestamp_dt'] = pd.to_datetime(df_extend_orders['updated_time_ts'], unit='ms')\n",
"df_extend_orders_fill = df_extend_orders.loc[df_extend_orders['status'].isin(['FILLED','PARTIALLY_FILLED']),:]\n",
"df_extend_orders_fill = df_extend_orders_fill[['created_time_ts','updated_time_ts','timestamp_dt','order_id','external_id','status','side','qty','filled_qty','payed_fee','price','averagePrice']].reset_index(drop=True)\n",
"\n",
"# Trades\n",
"df_extend_trades = df_extend_orders_fill.groupby('order_id').agg({'created_time_ts':'first','updated_time_ts':'last','status': 'last','side': 'last', 'filled_qty':'last','payed_fee':'sum','price':'last'}).reset_index()\n",
"df_extend_trades['duration_sec_ast'] = ( df_extend_trades['updated_time_ts'] - df_extend_trades['created_time_ts'] ) / 1000\n",
"df_extend_trades['is_mkt_maker'] = df_extend_trades['payed_fee'] == 0.00\n",
"df_extend_trades['timestamp_ts'] = pd.to_datetime(df_extend_trades['updated_time_ts'], unit='ms')"
]
},
{
"cell_type": "code",
"execution_count": 119,
"id": "0ebf54b3",
"metadata": {},
"outputs": [],
"source": [
"def tie_trades_together_get_extend_from_aster(row):\n",
" row = row.to_frame().T\n",
" row.index=[1]\n",
"\n",
" extend_row = df_extend_trades[['order_id','timestamp_ts','status','side','filled_qty','payed_fee','price','is_mkt_maker']].loc[df_extend_trades['timestamp_ts']>row['timestamp_ts'].iloc[0],:].iloc[0]\n",
" extend_row = extend_row.to_frame().T\n",
" extend_row.index=[1]\n",
"\n",
" return_row = row.merge(extend_row, left_index=True, right_index=True, suffixes=('_ast','_ext'))\n",
"\n",
" return return_row.iloc[0]\n",
"\n",
"df_comb_trades = df_aster_trades[['order_id','timestamp_ts','status','side','filled_qty','payed_fee','price','is_mkt_maker']].apply(tie_trades_together_get_extend_from_aster, axis=1)\n",
"df_comb_trades['buy_price'] = df_comb_trades['price_ast'].where(df_comb_trades['side_ast']=='BUY', df_comb_trades['price_ext'])\n",
"df_comb_trades['sell_price'] = df_comb_trades['price_ast'].where(df_comb_trades['side_ast']=='SELL', df_comb_trades['price_ext'])\n",
"df_comb_trades['buy_qty'] = df_comb_trades['filled_qty_ast'].where(df_comb_trades['side_ast']=='BUY', df_comb_trades['filled_qty_ext'])\n",
"df_comb_trades['sell_qty'] = df_comb_trades['filled_qty_ast'].where(df_comb_trades['side_ast']=='SELL', df_comb_trades['filled_qty_ext'])\n",
"df_comb_trades['buy_side'] = df_comb_trades['order_id_ast'].where(df_comb_trades['side_ast']=='BUY', df_comb_trades['order_id_ext'])\n",
"df_comb_trades['buy_side'] = df_comb_trades['order_id_ast'] == df_comb_trades['buy_side']\n",
"df_comb_trades['buy_side'] = df_comb_trades['buy_side'].replace(True, 'ASTER').replace(False,'EXTEND')\n",
"\n",
"df_comb_trades['per_trade_pnl'] = ( ( df_comb_trades['sell_price'] - df_comb_trades['buy_price'] ) * df_comb_trades['sell_qty'] ) - df_comb_trades['payed_fee_ast'] - df_comb_trades['payed_fee_ext']\n",
"df_comb_trades['per_trade_pnl_pct'] = ( (df_comb_trades['sell_price']*df_comb_trades['sell_qty']) - (df_comb_trades['buy_price']*df_comb_trades['buy_qty']) ) / (df_comb_trades['buy_price']*df_comb_trades['buy_qty'])"
]
},
{
"cell_type": "code",
"execution_count": 120,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.microsoft.datawrangler.viewer.v0+json": {
"columns": [
{
"name": "index",
"rawType": "int64",
"type": "integer"
},
{
"name": "order_id_ast",
"rawType": "int64",
"type": "integer"
},
{
"name": "timestamp_ts_ast",
"rawType": "datetime64[ms]",
"type": "datetime"
},
{
"name": "status_ast",
"rawType": "str",
"type": "string"
},
{
"name": "side_ast",
"rawType": "str",
"type": "string"
},
{
"name": "filled_qty_ast",
"rawType": "float64",
"type": "float"
},
{
"name": "payed_fee_ast",
"rawType": "float64",
"type": "float"
},
{
"name": "price_ast",
"rawType": "float64",
"type": "float"
},
{
"name": "is_mkt_maker_ast",
"rawType": "bool",
"type": "boolean"
},
{
"name": "order_id_ext",
"rawType": "str",
"type": "string"
},
{
"name": "timestamp_ts_ext",
"rawType": "datetime64[ms]",
"type": "datetime"
},
{
"name": "status_ext",
"rawType": "str",
"type": "string"
},
{
"name": "side_ext",
"rawType": "str",
"type": "string"
},
{
"name": "filled_qty_ext",
"rawType": "float64",
"type": "float"
},
{
"name": "payed_fee_ext",
"rawType": "float64",
"type": "float"
},
{
"name": "price_ext",
"rawType": "float64",
"type": "float"
},
{
"name": "is_mkt_maker_ext",
"rawType": "bool",
"type": "boolean"
},
{
"name": "buy_price",
"rawType": "float64",
"type": "float"
},
{
"name": "sell_price",
"rawType": "float64",
"type": "float"
},
{
"name": "buy_qty",
"rawType": "float64",
"type": "float"
},
{
"name": "sell_qty",
"rawType": "float64",
"type": "float"
},
{
"name": "buy_side",
"rawType": "object",
"type": "string"
},
{
"name": "per_trade_pnl",
"rawType": "float64",
"type": "float"
},
{
"name": "per_trade_pnl_pct",
"rawType": "float64",
"type": "float"
}
],
"ref": "ba489ddb-f098-469d-8584-5f1564160359",
"rows": [
[
"0",
"17371700930",
"2026-04-30 08:46:33.100000",
"FILLED",
"BUY",
"0.441",
"0.0",
"2260.01",
"True",
"2049778331801128960",
"2026-04-30 09:10:12.149000",
"FILLED",
"SELL",
"0.441",
"0.24869",
"2255.7",
"False",
"2260.01",
"2255.7",
"0.441",
"0.441",
"ASTER",
"-2.1494000000001763",
"-0.0019070712076496412"
],
[
"1",
"17372582002",
"2026-04-30 13:59:05",
"FILLED",
"SELL",
"0.439",
"0.0",
"2262.5",
"True",
"2049851052585218048",
"2026-04-30 13:59:15.023000",
"FILLED",
"BUY",
"0.438",
"0.0",
"2261.7",
"True",
"2261.7",
"2262.5",
"0.438",
"0.439",
"EXTEND",
"0.35120000000007984",
"0.0026376288252886937"
],
[
"2",
"17372999630",
"2026-04-30 15:32:12.700000",
"FILLED",
"BUY",
"0.438",
"0.0",
"2274.09",
"True",
"2049881470860271616",
"2026-04-30 16:00:02.415000",
"FILLED",
"SELL",
"0.438",
"0.247886",
"2263.7",
"False",
"2274.09",
"2263.7",
"0.438",
"0.438",
"ASTER",
"-4.798706000000144",
"-0.00456886051123762"
],
[
"3",
"17373094474",
"2026-04-30 16:00:02.050000",
"FILLED",
"SELL",
"0.439",
"0.0",
"2264.61",
"True",
"2049881470860271616",
"2026-04-30 16:00:02.415000",
"FILLED",
"SELL",
"0.438",
"0.247886",
"2263.7",
"False",
"2263.7",
"2264.61",
"0.438",
"0.439",
"EXTEND",
"0.15160400000013574",
"0.002686019554602488"
],
[
"4",
"17373547036",
"2026-04-30 19:06:50.200000",
"FILLED",
"BUY",
"0.442",
"0.0",
"2260.48",
"True",
"2049929626042335232",
"2026-04-30 19:11:23.505000",
"FILLED",
"SELL",
"0.441",
"0.24944",
"2262.5",
"False",
"2260.48",
"2262.5",
"0.442",
"0.441",
"ASTER",
"0.641379999999992",
"-0.0013708496781846692"
],
[
"5",
"17373827670",
"2026-04-30 21:48:38.550000",
"FILLED",
"SELL",
"0.221",
"0.0",
"2257.17",
"True",
"2049969423813185536",
"2026-04-30 21:49:32.034000",
"FILLED",
"BUY",
"0.22",
"0.124041",
"2255.4",
"False",
"2255.4",
"2257.17",
"0.22",
"0.221",
"EXTEND",
"0.26712899999999595",
"0.0053338049287769895"
],
[
"6",
"17373941409",
"2026-04-30 23:01:21.150000",
"FILLED",
"SELL",
"0.221",
"0.0",
"2253.58",
"True",
"2049987504752680960",
"2026-04-30 23:03:53.771000",
"FILLED",
"BUY",
"0.221",
"0.0",
"2252.6",
"True",
"2252.6",
"2253.58",
"0.221",
"0.221",
"EXTEND",
"0.21658000000000402",
"0.0004350528278434247"
]
],
"shape": {
"columns": 23,
"rows": 7
}
},
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>order_id_ast</th>\n",
" <th>timestamp_ts_ast</th>\n",
" <th>status_ast</th>\n",
" <th>side_ast</th>\n",
" <th>filled_qty_ast</th>\n",
" <th>payed_fee_ast</th>\n",
" <th>price_ast</th>\n",
" <th>is_mkt_maker_ast</th>\n",
" <th>order_id_ext</th>\n",
" <th>timestamp_ts_ext</th>\n",
" <th>...</th>\n",
" <th>payed_fee_ext</th>\n",
" <th>price_ext</th>\n",
" <th>is_mkt_maker_ext</th>\n",
" <th>buy_price</th>\n",
" <th>sell_price</th>\n",
" <th>buy_qty</th>\n",
" <th>sell_qty</th>\n",
" <th>buy_side</th>\n",
" <th>per_trade_pnl</th>\n",
" <th>per_trade_pnl_pct</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>17371700930</td>\n",
" <td>2026-04-30 08:46:33.100</td>\n",
" <td>FILLED</td>\n",
" <td>BUY</td>\n",
" <td>0.441</td>\n",
" <td>0.0</td>\n",
" <td>2260.01</td>\n",
" <td>True</td>\n",
" <td>2049778331801128960</td>\n",
" <td>2026-04-30 09:10:12.149</td>\n",
" <td>...</td>\n",
" <td>0.248690</td>\n",
" <td>2255.7</td>\n",
" <td>False</td>\n",
" <td>2260.01</td>\n",
" <td>2255.70</td>\n",
" <td>0.441</td>\n",
" <td>0.441</td>\n",
" <td>ASTER</td>\n",
" <td>-2.149400</td>\n",
" <td>-0.001907</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>17372582002</td>\n",
" <td>2026-04-30 13:59:05.000</td>\n",
" <td>FILLED</td>\n",
" <td>SELL</td>\n",
" <td>0.439</td>\n",
" <td>0.0</td>\n",
" <td>2262.50</td>\n",
" <td>True</td>\n",
" <td>2049851052585218048</td>\n",
" <td>2026-04-30 13:59:15.023</td>\n",
" <td>...</td>\n",
" <td>0.000000</td>\n",
" <td>2261.7</td>\n",
" <td>True</td>\n",
" <td>2261.70</td>\n",
" <td>2262.50</td>\n",
" <td>0.438</td>\n",
" <td>0.439</td>\n",
" <td>EXTEND</td>\n",
" <td>0.351200</td>\n",
" <td>0.002638</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>17372999630</td>\n",
" <td>2026-04-30 15:32:12.700</td>\n",
" <td>FILLED</td>\n",
" <td>BUY</td>\n",
" <td>0.438</td>\n",
" <td>0.0</td>\n",
" <td>2274.09</td>\n",
" <td>True</td>\n",
" <td>2049881470860271616</td>\n",
" <td>2026-04-30 16:00:02.415</td>\n",
" <td>...</td>\n",
" <td>0.247886</td>\n",
" <td>2263.7</td>\n",
" <td>False</td>\n",
" <td>2274.09</td>\n",
" <td>2263.70</td>\n",
" <td>0.438</td>\n",
" <td>0.438</td>\n",
" <td>ASTER</td>\n",
" <td>-4.798706</td>\n",
" <td>-0.004569</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>17373094474</td>\n",
" <td>2026-04-30 16:00:02.050</td>\n",
" <td>FILLED</td>\n",
" <td>SELL</td>\n",
" <td>0.439</td>\n",
" <td>0.0</td>\n",
" <td>2264.61</td>\n",
" <td>True</td>\n",
" <td>2049881470860271616</td>\n",
" <td>2026-04-30 16:00:02.415</td>\n",
" <td>...</td>\n",
" <td>0.247886</td>\n",
" <td>2263.7</td>\n",
" <td>False</td>\n",
" <td>2263.70</td>\n",
" <td>2264.61</td>\n",
" <td>0.438</td>\n",
" <td>0.439</td>\n",
" <td>EXTEND</td>\n",
" <td>0.151604</td>\n",
" <td>0.002686</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>17373547036</td>\n",
" <td>2026-04-30 19:06:50.200</td>\n",
" <td>FILLED</td>\n",
" <td>BUY</td>\n",
" <td>0.442</td>\n",
" <td>0.0</td>\n",
" <td>2260.48</td>\n",
" <td>True</td>\n",
" <td>2049929626042335232</td>\n",
" <td>2026-04-30 19:11:23.505</td>\n",
" <td>...</td>\n",
" <td>0.249440</td>\n",
" <td>2262.5</td>\n",
" <td>False</td>\n",
" <td>2260.48</td>\n",
" <td>2262.50</td>\n",
" <td>0.442</td>\n",
" <td>0.441</td>\n",
" <td>ASTER</td>\n",
" <td>0.641380</td>\n",
" <td>-0.001371</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>17373827670</td>\n",
" <td>2026-04-30 21:48:38.550</td>\n",
" <td>FILLED</td>\n",
" <td>SELL</td>\n",
" <td>0.221</td>\n",
" <td>0.0</td>\n",
" <td>2257.17</td>\n",
" <td>True</td>\n",
" <td>2049969423813185536</td>\n",
" <td>2026-04-30 21:49:32.034</td>\n",
" <td>...</td>\n",
" <td>0.124041</td>\n",
" <td>2255.4</td>\n",
" <td>False</td>\n",
" <td>2255.40</td>\n",
" <td>2257.17</td>\n",
" <td>0.220</td>\n",
" <td>0.221</td>\n",
" <td>EXTEND</td>\n",
" <td>0.267129</td>\n",
" <td>0.005334</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>17373941409</td>\n",
" <td>2026-04-30 23:01:21.150</td>\n",
" <td>FILLED</td>\n",
" <td>SELL</td>\n",
" <td>0.221</td>\n",
" <td>0.0</td>\n",
" <td>2253.58</td>\n",
" <td>True</td>\n",
" <td>2049987504752680960</td>\n",
" <td>2026-04-30 23:03:53.771</td>\n",
" <td>...</td>\n",
" <td>0.000000</td>\n",
" <td>2252.6</td>\n",
" <td>True</td>\n",
" <td>2252.60</td>\n",
" <td>2253.58</td>\n",
" <td>0.221</td>\n",
" <td>0.221</td>\n",
" <td>EXTEND</td>\n",
" <td>0.216580</td>\n",
" <td>0.000435</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>7 rows × 23 columns</p>\n",
"</div>"
],
"text/plain": [
" order_id_ast timestamp_ts_ast status_ast side_ast filled_qty_ast \\\n",
"0 17371700930 2026-04-30 08:46:33.100 FILLED BUY 0.441 \n",
"1 17372582002 2026-04-30 13:59:05.000 FILLED SELL 0.439 \n",
"2 17372999630 2026-04-30 15:32:12.700 FILLED BUY 0.438 \n",
"3 17373094474 2026-04-30 16:00:02.050 FILLED SELL 0.439 \n",
"4 17373547036 2026-04-30 19:06:50.200 FILLED BUY 0.442 \n",
"5 17373827670 2026-04-30 21:48:38.550 FILLED SELL 0.221 \n",
"6 17373941409 2026-04-30 23:01:21.150 FILLED SELL 0.221 \n",
"\n",
" payed_fee_ast price_ast is_mkt_maker_ast order_id_ext \\\n",
"0 0.0 2260.01 True 2049778331801128960 \n",
"1 0.0 2262.50 True 2049851052585218048 \n",
"2 0.0 2274.09 True 2049881470860271616 \n",
"3 0.0 2264.61 True 2049881470860271616 \n",
"4 0.0 2260.48 True 2049929626042335232 \n",
"5 0.0 2257.17 True 2049969423813185536 \n",
"6 0.0 2253.58 True 2049987504752680960 \n",
"\n",
" timestamp_ts_ext ... payed_fee_ext price_ext is_mkt_maker_ext \\\n",
"0 2026-04-30 09:10:12.149 ... 0.248690 2255.7 False \n",
"1 2026-04-30 13:59:15.023 ... 0.000000 2261.7 True \n",
"2 2026-04-30 16:00:02.415 ... 0.247886 2263.7 False \n",
"3 2026-04-30 16:00:02.415 ... 0.247886 2263.7 False \n",
"4 2026-04-30 19:11:23.505 ... 0.249440 2262.5 False \n",
"5 2026-04-30 21:49:32.034 ... 0.124041 2255.4 False \n",
"6 2026-04-30 23:03:53.771 ... 0.000000 2252.6 True \n",
"\n",
" buy_price sell_price buy_qty sell_qty buy_side per_trade_pnl \\\n",
"0 2260.01 2255.70 0.441 0.441 ASTER -2.149400 \n",
"1 2261.70 2262.50 0.438 0.439 EXTEND 0.351200 \n",
"2 2274.09 2263.70 0.438 0.438 ASTER -4.798706 \n",
"3 2263.70 2264.61 0.438 0.439 EXTEND 0.151604 \n",
"4 2260.48 2262.50 0.442 0.441 ASTER 0.641380 \n",
"5 2255.40 2257.17 0.220 0.221 EXTEND 0.267129 \n",
"6 2252.60 2253.58 0.221 0.221 EXTEND 0.216580 \n",
"\n",
" per_trade_pnl_pct \n",
"0 -0.001907 \n",
"1 0.002638 \n",
"2 -0.004569 \n",
"3 0.002686 \n",
"4 -0.001371 \n",
"5 0.005334 \n",
"6 0.000435 \n",
"\n",
"[7 rows x 23 columns]"
]
},
"execution_count": 120,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_comb_trades"
]
},
{
"cell_type": "code",
"execution_count": 116,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.plotly.v1+json": {
"config": {
"plotlyServerURL": "https://plot.ly"
},
"data": [
{
"hovertemplate": "timestamp_ts_ext=%{x}<br>per_trade_pnl=%{y}<extra></extra>",
"legendgroup": "",
"line": {
"color": "#636efa",
"dash": "solid"
},
"marker": {
"symbol": "circle"
},
"mode": "lines",
"name": "",
"orientation": "v",
"showlegend": false,
"type": "scatter",
"x": [
"2026-04-30T09:10:12.149000",
"2026-04-30T13:59:15.023000",
"2026-04-30T16:00:02.415000",
"2026-04-30T16:00:02.415000",
"2026-04-30T19:11:23.505000",
"2026-04-30T21:49:32.034000",
"2026-04-30T23:03:53.771000"
],
"xaxis": "x",
"y": {
"bdata": "bS+QoPgxAcA3wZaQD3rWP3d6VPzfMRPAQMD4hsJnwz/J3olZL4bkP+wKtDukGNE/gd17uOS4yz8=",
"dtype": "f8"
},
"yaxis": "y"
}
],
"layout": {
"legend": {
"tracegroupgap": 0
},
"margin": {
"t": 60
},
"template": {
"data": {
"bar": [
{
"error_x": {
"color": "#f2f5fa"
},
"error_y": {
"color": "#f2f5fa"
},
"marker": {
"line": {
"color": "rgb(17,17,17)",
"width": 0.5
},
"pattern": {
"fillmode": "overlay",
"size": 10,
"solidity": 0.2
}
},
"type": "bar"
}
],
"barpolar": [
{
"marker": {
"line": {
"color": "rgb(17,17,17)",
"width": 0.5
},
"pattern": {
"fillmode": "overlay",
"size": 10,
"solidity": 0.2
}
},
"type": "barpolar"
}
],
"carpet": [
{
"aaxis": {
"endlinecolor": "#A2B1C6",
"gridcolor": "#506784",
"linecolor": "#506784",
"minorgridcolor": "#506784",
"startlinecolor": "#A2B1C6"
},
"baxis": {
"endlinecolor": "#A2B1C6",
"gridcolor": "#506784",
"linecolor": "#506784",
"minorgridcolor": "#506784",
"startlinecolor": "#A2B1C6"
},
"type": "carpet"
}
],
"choropleth": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"type": "choropleth"
}
],
"contour": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "contour"
}
],
"contourcarpet": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"type": "contourcarpet"
}
],
"heatmap": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "heatmap"
}
],
"histogram": [
{
"marker": {
"pattern": {
"fillmode": "overlay",
"size": 10,
"solidity": 0.2
}
},
"type": "histogram"
}
],
"histogram2d": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "histogram2d"
}
],
"histogram2dcontour": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "histogram2dcontour"
}
],
"mesh3d": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"type": "mesh3d"
}
],
"parcoords": [
{
"line": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "parcoords"
}
],
"pie": [
{
"automargin": true,
"type": "pie"
}
],
"scatter": [
{
"marker": {
"line": {
"color": "#283442"
}
},
"type": "scatter"
}
],
"scatter3d": [
{
"line": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scatter3d"
}
],
"scattercarpet": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scattercarpet"
}
],
"scattergeo": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scattergeo"
}
],
"scattergl": [
{
"marker": {
"line": {
"color": "#283442"
}
},
"type": "scattergl"
}
],
"scattermap": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scattermap"
}
],
"scattermapbox": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scattermapbox"
}
],
"scatterpolar": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scatterpolar"
}
],
"scatterpolargl": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scatterpolargl"
}
],
"scatterternary": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scatterternary"
}
],
"surface": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "surface"
}
],
"table": [
{
"cells": {
"fill": {
"color": "#506784"
},
"line": {
"color": "rgb(17,17,17)"
}
},
"header": {
"fill": {
"color": "#2a3f5f"
},
"line": {
"color": "rgb(17,17,17)"
}
},
"type": "table"
}
]
},
"layout": {
"annotationdefaults": {
"arrowcolor": "#f2f5fa",
"arrowhead": 0,
"arrowwidth": 1
},
"autotypenumbers": "strict",
"coloraxis": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"colorscale": {
"diverging": [
[
0,
"#8e0152"
],
[
0.1,
"#c51b7d"
],
[
0.2,
"#de77ae"
],
[
0.3,
"#f1b6da"
],
[
0.4,
"#fde0ef"
],
[
0.5,
"#f7f7f7"
],
[
0.6,
"#e6f5d0"
],
[
0.7,
"#b8e186"
],
[
0.8,
"#7fbc41"
],
[
0.9,
"#4d9221"
],
[
1,
"#276419"
]
],
"sequential": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"sequentialminus": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
]
},
"colorway": [
"#636efa",
"#EF553B",
"#00cc96",
"#ab63fa",
"#FFA15A",
"#19d3f3",
"#FF6692",
"#B6E880",
"#FF97FF",
"#FECB52"
],
"font": {
"color": "#f2f5fa"
},
"geo": {
"bgcolor": "rgb(17,17,17)",
"lakecolor": "rgb(17,17,17)",
"landcolor": "rgb(17,17,17)",
"showlakes": true,
"showland": true,
"subunitcolor": "#506784"
},
"hoverlabel": {
"align": "left"
},
"hovermode": "closest",
"mapbox": {
"style": "dark"
},
"paper_bgcolor": "rgb(17,17,17)",
"plot_bgcolor": "rgb(17,17,17)",
"polar": {
"angularaxis": {
"gridcolor": "#506784",
"linecolor": "#506784",
"ticks": ""
},
"bgcolor": "rgb(17,17,17)",
"radialaxis": {
"gridcolor": "#506784",
"linecolor": "#506784",
"ticks": ""
}
},
"scene": {
"xaxis": {
"backgroundcolor": "rgb(17,17,17)",
"gridcolor": "#506784",
"gridwidth": 2,
"linecolor": "#506784",
"showbackground": true,
"ticks": "",
"zerolinecolor": "#C8D4E3"
},
"yaxis": {
"backgroundcolor": "rgb(17,17,17)",
"gridcolor": "#506784",
"gridwidth": 2,
"linecolor": "#506784",
"showbackground": true,
"ticks": "",
"zerolinecolor": "#C8D4E3"
},
"zaxis": {
"backgroundcolor": "rgb(17,17,17)",
"gridcolor": "#506784",
"gridwidth": 2,
"linecolor": "#506784",
"showbackground": true,
"ticks": "",
"zerolinecolor": "#C8D4E3"
}
},
"shapedefaults": {
"line": {
"color": "#f2f5fa"
}
},
"sliderdefaults": {
"bgcolor": "#C8D4E3",
"bordercolor": "rgb(17,17,17)",
"borderwidth": 1,
"tickwidth": 0
},
"ternary": {
"aaxis": {
"gridcolor": "#506784",
"linecolor": "#506784",
"ticks": ""
},
"baxis": {
"gridcolor": "#506784",
"linecolor": "#506784",
"ticks": ""
},
"bgcolor": "rgb(17,17,17)",
"caxis": {
"gridcolor": "#506784",
"linecolor": "#506784",
"ticks": ""
}
},
"title": {
"x": 0.05
},
"updatemenudefaults": {
"bgcolor": "#506784",
"borderwidth": 0
},
"xaxis": {
"automargin": true,
"gridcolor": "#283442",
"linecolor": "#506784",
"ticks": "",
"title": {
"standoff": 15
},
"zerolinecolor": "#283442",
"zerolinewidth": 2
},
"yaxis": {
"automargin": true,
"gridcolor": "#283442",
"linecolor": "#506784",
"ticks": "",
"title": {
"standoff": 15
},
"zerolinecolor": "#283442",
"zerolinewidth": 2
}
}
},
"xaxis": {
"anchor": "y",
"domain": [
0,
1
],
"title": {
"text": "timestamp_ts_ext"
}
},
"yaxis": {
"anchor": "x",
"domain": [
0,
1
],
"title": {
"text": "per_trade_pnl"
}
}
}
}
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"px.line(df_comb_trades, x='timestamp_ts_ext', y='per_trade_pnl', template='plotly_dark')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "1827a1ca",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "a0380428",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "bf5e2eaa",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "py_313",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.13.13"
}
},
"nbformat": 4,
"nbformat_minor": 5
}