{
"cells": [
{
"cell_type": "code",
"execution_count": 183,
"id": "25697582",
"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"
]
},
{
"cell_type": "code",
"execution_count": 184,
"id": "cd9ecfde",
"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": 185,
"id": "60cc2366",
"metadata": {},
"outputs": [],
"source": [
"def funding_rate_hist_extend(market: str, startTime: int | None = None, endTime: int | None = None ):\n",
" if startTime is None:\n",
" startTime = int(round(datetime.now().timestamp() * 1000)) - int(1000 * 60 * 60 * 24 * 30)\n",
" if endTime is None:\n",
" endTime = int(round(datetime.now().timestamp() * 1000))\n",
" \n",
" r = requests.get(f\"https://api.starknet.extended.exchange/api/v1/info/{market}/funding?startTime={startTime}&endTime={endTime}\")\n",
" return json.loads(r.text)"
]
},
{
"cell_type": "code",
"execution_count": 186,
"id": "55ae5271",
"metadata": {},
"outputs": [],
"source": [
"def ratio_trades_to_midbars(df: pd.DataFrame, ts_col: str, is_buyer_maker_col: str, price_col: str = 'price', qty_col: str = 'qty', freq: str ='s') -> tuple[pd.DataFrame, pd.DataFrame]:\n",
" df_maker = df.loc[df[is_buyer_maker_col]==1, :].groupby(pd.Grouper(key=ts_col, freq=freq)).agg({'price':['min','median','max'], 'qty':'sum'}) # Resting on the bid (buyer is maker): ASK [Taker] [Seller] -- Crossed into --> BID [Maker] [Buyer]\n",
" df_taker = df.loc[df[is_buyer_maker_col]==0, :].groupby(pd.Grouper(key=ts_col, freq=freq)).agg({'price':['min','median','max'], 'qty':'sum'}) # Resting on the ask (seller is maker): BID [Taker] [Buyer] -- Crossed into --> ASK [Maker] [Seller]\n",
" df_maker.columns = ['_'.join(col).strip() for col in df_maker.columns.to_flat_index()]\n",
" df_taker.columns = ['_'.join(col).strip() for col in df_taker.columns.to_flat_index()]\n",
" \n",
" return df_maker, df_taker"
]
},
{
"cell_type": "code",
"execution_count": 187,
"id": "2b7232e5",
"metadata": {},
"outputs": [],
"source": [
"def get_24hrs_midbars(table_name: str, freq='min', ts_col='timestamp_trade', is_buyer_maker_col='is_buyer_mkt_maker'):\n",
" df = pd.read_sql(\n",
" text(f'''\n",
" SELECT *\n",
" FROM {table_name}\n",
" '''),\n",
" con=ENGINE\n",
" )\n",
" df['timestamp_trade_dt'] = pd.to_datetime(df[ts_col], unit='ms')\n",
"\n",
" df_maker, df_taker = ratio_trades_to_midbars(\n",
" df=df,\n",
" freq=freq,\n",
" ts_col='timestamp_trade_dt',\n",
" is_buyer_maker_col=is_buyer_maker_col\n",
" )\n",
"\n",
" return df_maker.dropna(), df_taker.dropna()\n"
]
},
{
"cell_type": "code",
"execution_count": 188,
"id": "f1174bae",
"metadata": {},
"outputs": [],
"source": [
"df_fr = funding_rate_hist_extend(market='ETH-USD')\n",
"df_fr = pd.DataFrame(df_fr['data']).rename({'m':'market','f':'funding_rate','T':'timestamp'}, axis=1)\n",
"df_fr['timestamp_dt'] = pd.to_datetime(df_fr['timestamp'], unit='ms')"
]
},
{
"cell_type": "code",
"execution_count": 189,
"id": "068a54b6",
"metadata": {},
"outputs": [],
"source": [
"df_aster_trades_by_sec_maker, df_aster_trades_by_sec_taker = get_24hrs_midbars(\n",
" table_name='fr_aster_mkt_trades',\n",
")\n",
"\n",
"df_extend_trades_by_sec_maker, df_extend_trades_by_sec_taker = get_24hrs_midbars(\n",
" table_name='fr_extended_mkt_trades',\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 190,
"id": "2862e7e3",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.plotly.v1+json": {
"config": {
"plotlyServerURL": "https://plot.ly"
},
"data": [
{
"hovertemplate": "timestamp_trade_dt=%{x}
qty_sum=%{y}
qty_sum=%{y}
| \n", " | price_median_aster | \n", "price_median_extend | \n", "ratio | \n", "
|---|---|---|---|
| timestamp_trade_dt | \n", "\n", " | \n", " | \n", " |
| 2026-04-27 15:24:00 | \n", "2267.700 | \n", "2269.50 | \n", "0.999207 | \n", "
| 2026-04-27 15:25:00 | \n", "2267.300 | \n", "2267.25 | \n", "1.000022 | \n", "
| 2026-04-27 15:26:00 | \n", "2268.300 | \n", "2267.60 | \n", "1.000309 | \n", "
| 2026-04-27 15:27:00 | \n", "2271.610 | \n", "2271.60 | \n", "1.000004 | \n", "
| 2026-04-27 15:28:00 | \n", "2271.225 | \n", "2270.70 | \n", "1.000231 | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "
| 2026-04-28 03:54:00 | \n", "2287.500 | \n", "2287.10 | \n", "1.000175 | \n", "
| 2026-04-28 03:57:00 | \n", "2289.310 | \n", "2288.60 | \n", "1.000310 | \n", "
| 2026-04-28 04:01:00 | \n", "2288.115 | \n", "2288.20 | \n", "0.999963 | \n", "
| 2026-04-28 04:02:00 | \n", "2287.370 | \n", "2287.40 | \n", "0.999987 | \n", "
| 2026-04-28 04:06:00 | \n", "2287.710 | \n", "2287.10 | \n", "1.000267 | \n", "
624 rows × 3 columns
\n", "| \n", " | market | \n", "funding_rate | \n", "timestamp | \n", "timestamp_dt | \n", "
|---|---|---|---|---|
| 0 | \n", "ETH-USD | \n", "-0.000023 | \n", "1777348801028 | \n", "2026-04-28 04:00:01.028 | \n", "
| 1 | \n", "ETH-USD | \n", "-0.000002 | \n", "1777345201018 | \n", "2026-04-28 03:00:01.018 | \n", "
| 2 | \n", "ETH-USD | \n", "0.000003 | \n", "1777341601019 | \n", "2026-04-28 02:00:01.019 | \n", "
| 3 | \n", "ETH-USD | \n", "-0.000001 | \n", "1777338001032 | \n", "2026-04-28 01:00:01.032 | \n", "
| 4 | \n", "ETH-USD | \n", "0.000011 | \n", "1777334401026 | \n", "2026-04-28 00:00:01.026 | \n", "
| 5 | \n", "ETH-USD | \n", "0 | \n", "1777330801011 | \n", "2026-04-27 23:00:01.011 | \n", "
| 6 | \n", "ETH-USD | \n", "0.000013 | \n", "1777327200342 | \n", "2026-04-27 22:00:00.342 | \n", "
| 7 | \n", "ETH-USD | \n", "-0.000003 | \n", "1777323600342 | \n", "2026-04-27 21:00:00.342 | \n", "
| 8 | \n", "ETH-USD | \n", "0 | \n", "1777320000722 | \n", "2026-04-27 20:00:00.722 | \n", "
| 9 | \n", "ETH-USD | \n", "0.000003 | \n", "1777316400934 | \n", "2026-04-27 19:00:00.934 | \n", "
| 10 | \n", "ETH-USD | \n", "-0.000015 | \n", "1777312801025 | \n", "2026-04-27 18:00:01.025 | \n", "
| 11 | \n", "ETH-USD | \n", "-0.000007 | \n", "1777309201012 | \n", "2026-04-27 17:00:01.012 | \n", "
| 12 | \n", "ETH-USD | \n", "0.000013 | \n", "1777305600343 | \n", "2026-04-27 16:00:00.343 | \n", "