{ "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": [ "
| \n", " | order_id_ast | \n", "timestamp_ts_ast | \n", "status_ast | \n", "side_ast | \n", "filled_qty_ast | \n", "payed_fee_ast | \n", "price_ast | \n", "is_mkt_maker_ast | \n", "order_id_ext | \n", "timestamp_ts_ext | \n", "... | \n", "payed_fee_ext | \n", "price_ext | \n", "is_mkt_maker_ext | \n", "buy_price | \n", "sell_price | \n", "buy_qty | \n", "sell_qty | \n", "buy_side | \n", "per_trade_pnl | \n", "per_trade_pnl_pct | \n", "
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | \n", "17371700930 | \n", "2026-04-30 08:46:33.100 | \n", "FILLED | \n", "BUY | \n", "0.441 | \n", "0.0 | \n", "2260.01 | \n", "True | \n", "2049778331801128960 | \n", "2026-04-30 09:10:12.149 | \n", "... | \n", "0.248690 | \n", "2255.7 | \n", "False | \n", "2260.01 | \n", "2255.70 | \n", "0.441 | \n", "0.441 | \n", "ASTER | \n", "-2.149400 | \n", "-0.001907 | \n", "
| 1 | \n", "17372582002 | \n", "2026-04-30 13:59:05.000 | \n", "FILLED | \n", "SELL | \n", "0.439 | \n", "0.0 | \n", "2262.50 | \n", "True | \n", "2049851052585218048 | \n", "2026-04-30 13:59:15.023 | \n", "... | \n", "0.000000 | \n", "2261.7 | \n", "True | \n", "2261.70 | \n", "2262.50 | \n", "0.438 | \n", "0.439 | \n", "EXTEND | \n", "0.351200 | \n", "0.002638 | \n", "
| 2 | \n", "17372999630 | \n", "2026-04-30 15:32:12.700 | \n", "FILLED | \n", "BUY | \n", "0.438 | \n", "0.0 | \n", "2274.09 | \n", "True | \n", "2049881470860271616 | \n", "2026-04-30 16:00:02.415 | \n", "... | \n", "0.247886 | \n", "2263.7 | \n", "False | \n", "2274.09 | \n", "2263.70 | \n", "0.438 | \n", "0.438 | \n", "ASTER | \n", "-4.798706 | \n", "-0.004569 | \n", "
| 3 | \n", "17373094474 | \n", "2026-04-30 16:00:02.050 | \n", "FILLED | \n", "SELL | \n", "0.439 | \n", "0.0 | \n", "2264.61 | \n", "True | \n", "2049881470860271616 | \n", "2026-04-30 16:00:02.415 | \n", "... | \n", "0.247886 | \n", "2263.7 | \n", "False | \n", "2263.70 | \n", "2264.61 | \n", "0.438 | \n", "0.439 | \n", "EXTEND | \n", "0.151604 | \n", "0.002686 | \n", "
| 4 | \n", "17373547036 | \n", "2026-04-30 19:06:50.200 | \n", "FILLED | \n", "BUY | \n", "0.442 | \n", "0.0 | \n", "2260.48 | \n", "True | \n", "2049929626042335232 | \n", "2026-04-30 19:11:23.505 | \n", "... | \n", "0.249440 | \n", "2262.5 | \n", "False | \n", "2260.48 | \n", "2262.50 | \n", "0.442 | \n", "0.441 | \n", "ASTER | \n", "0.641380 | \n", "-0.001371 | \n", "
| 5 | \n", "17373827670 | \n", "2026-04-30 21:48:38.550 | \n", "FILLED | \n", "SELL | \n", "0.221 | \n", "0.0 | \n", "2257.17 | \n", "True | \n", "2049969423813185536 | \n", "2026-04-30 21:49:32.034 | \n", "... | \n", "0.124041 | \n", "2255.4 | \n", "False | \n", "2255.40 | \n", "2257.17 | \n", "0.220 | \n", "0.221 | \n", "EXTEND | \n", "0.267129 | \n", "0.005334 | \n", "
| 6 | \n", "17373941409 | \n", "2026-04-30 23:01:21.150 | \n", "FILLED | \n", "SELL | \n", "0.221 | \n", "0.0 | \n", "2253.58 | \n", "True | \n", "2049987504752680960 | \n", "2026-04-30 23:03:53.771 | \n", "... | \n", "0.000000 | \n", "2252.6 | \n", "True | \n", "2252.60 | \n", "2253.58 | \n", "0.221 | \n", "0.221 | \n", "EXTEND | \n", "0.216580 | \n", "0.000435 | \n", "
7 rows × 23 columns
\n", "