{ "cells": [ { "cell_type": "code", "execution_count": 1, "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": 19, "id": "d3206fe9", "metadata": {}, "outputs": [], "source": [ "start_ts = (round(datetime.now().timestamp()*1000)-(60*60*24*1000))" ] }, { "cell_type": "code", "execution_count": 20, "id": "9847869c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Timestamp('2026-05-01 22:56:30.744000')" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.to_datetime(start_ts, unit='ms')" ] }, { "cell_type": "code", "execution_count": 21, "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": 22, "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": 23, "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": 24, "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": 25, "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": "4fed1e21-7dd2-454b-b923-48d479d7aa72", "rows": [ [ "0", "328652716", "2026-05-02 01:00:01.450000", "FILLED", "BUY", "551.0", "0.0", "0.9059", "True", "2050627894673694720", "2026-05-02 17:26:03.721000", "FILLED", "SELL", "273.0", "0.06208", "0.8957", "False", "0.9059", "0.8957", "551.0", "273.0", "ASTER", "-2.8466799999999965", "-0.5101158787853532" ], [ "1", "329066650", "2026-05-02 17:25:57.700000", "FILLED", "SELL", "277.0", "0.1007726", "0.9095", "False", "2050627894673694720", "2026-05-02 17:26:03.721000", "FILLED", "SELL", "273.0", "0.06208", "0.8957", "False", "0.8957", "0.9095", "273.0", "277.0", "EXTEND", "3.659747399999979", "0.030284701714868006" ], [ "2", "329183551", "2026-05-02 21:42:27.900000", "FILLED", "SELL", "273.0", "0.0", "0.9126", "True", "2050694154048565248", "2026-05-02 21:49:21.186000", "FILLED", "BUY", "273.0", "0.062319", "0.9131", "False", "0.9131", "0.9126", "273.0", "273.0", "EXTEND", "-0.1988190000000153", "-0.0005475851494907951" ], [ "3", "329195229", "2026-05-02 22:08:49.450000", "FILLED", "BUY", "273.0", "0.0", "0.9136", "True", "2050699055663546368", "2026-05-02 22:08:49.823000", "FILLED", "SELL", "272.0", "0.062056", "0.9123", "False", "0.9136", "0.9123", "273.0", "272.0", "ASTER", "-0.41565599999999125", "-0.005080733627143444" ], [ "4", "329206619", "2026-05-02 22:33:28.550000", "FILLED", "SELL", "274.0", "0.0", "0.9106", "True", "2050705268467499008", "2026-05-02 22:33:52.752000", "FILLED", "BUY", "274.0", "0.0", "0.9105", "True", "0.9105", "0.9106", "274.0", "274.0", "EXTEND", "0.027399999999996982", "0.00010982976386600805" ], [ "5", "329210143", "2026-05-02 22:41:58.300000", "FILLED", "SELL", "274.0", "0.0", "0.912", "True", "2050707405608058880", "2026-05-02 22:42:05.138000", "FILLED", "BUY", "274.0", "0.0", "0.9117", "True", "0.9117", "0.912", "274.0", "274.0", "EXTEND", "0.08220000000002137", "0.0003290556103982722" ] ], "shape": { "columns": 23, "rows": 6 } }, "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", "328652716 | \n", "2026-05-02 01:00:01.450 | \n", "FILLED | \n", "BUY | \n", "551.0 | \n", "0.000000 | \n", "0.9059 | \n", "True | \n", "2050627894673694720 | \n", "2026-05-02 17:26:03.721 | \n", "... | \n", "0.062080 | \n", "0.8957 | \n", "False | \n", "0.9059 | \n", "0.8957 | \n", "551.0 | \n", "273.0 | \n", "ASTER | \n", "-2.846680 | \n", "-0.510116 | \n", "
| 1 | \n", "329066650 | \n", "2026-05-02 17:25:57.700 | \n", "FILLED | \n", "SELL | \n", "277.0 | \n", "0.100773 | \n", "0.9095 | \n", "False | \n", "2050627894673694720 | \n", "2026-05-02 17:26:03.721 | \n", "... | \n", "0.062080 | \n", "0.8957 | \n", "False | \n", "0.8957 | \n", "0.9095 | \n", "273.0 | \n", "277.0 | \n", "EXTEND | \n", "3.659747 | \n", "0.030285 | \n", "
| 2 | \n", "329183551 | \n", "2026-05-02 21:42:27.900 | \n", "FILLED | \n", "SELL | \n", "273.0 | \n", "0.000000 | \n", "0.9126 | \n", "True | \n", "2050694154048565248 | \n", "2026-05-02 21:49:21.186 | \n", "... | \n", "0.062319 | \n", "0.9131 | \n", "False | \n", "0.9131 | \n", "0.9126 | \n", "273.0 | \n", "273.0 | \n", "EXTEND | \n", "-0.198819 | \n", "-0.000548 | \n", "
| 3 | \n", "329195229 | \n", "2026-05-02 22:08:49.450 | \n", "FILLED | \n", "BUY | \n", "273.0 | \n", "0.000000 | \n", "0.9136 | \n", "True | \n", "2050699055663546368 | \n", "2026-05-02 22:08:49.823 | \n", "... | \n", "0.062056 | \n", "0.9123 | \n", "False | \n", "0.9136 | \n", "0.9123 | \n", "273.0 | \n", "272.0 | \n", "ASTER | \n", "-0.415656 | \n", "-0.005081 | \n", "
| 4 | \n", "329206619 | \n", "2026-05-02 22:33:28.550 | \n", "FILLED | \n", "SELL | \n", "274.0 | \n", "0.000000 | \n", "0.9106 | \n", "True | \n", "2050705268467499008 | \n", "2026-05-02 22:33:52.752 | \n", "... | \n", "0.000000 | \n", "0.9105 | \n", "True | \n", "0.9105 | \n", "0.9106 | \n", "274.0 | \n", "274.0 | \n", "EXTEND | \n", "0.027400 | \n", "0.000110 | \n", "
| 5 | \n", "329210143 | \n", "2026-05-02 22:41:58.300 | \n", "FILLED | \n", "SELL | \n", "274.0 | \n", "0.000000 | \n", "0.9120 | \n", "True | \n", "2050707405608058880 | \n", "2026-05-02 22:42:05.138 | \n", "... | \n", "0.000000 | \n", "0.9117 | \n", "True | \n", "0.9117 | \n", "0.9120 | \n", "274.0 | \n", "274.0 | \n", "EXTEND | \n", "0.082200 | \n", "0.000329 | \n", "
6 rows × 23 columns
\n", "