{ "cells": [ { "cell_type": "code", "execution_count": 28, "id": "0b5ca901", "metadata": {}, "outputs": [], "source": [ "import requests\n", "import pandas as pd\n", "import numpy as np\n", "from datetime import datetime\n", "import time\n", "import json\n", "import valkey\n", "from dataclasses import dataclass, field\n", "\n", "VAL_KEY = valkey.Valkey(host='localhost', port=6379, db=0, decode_responses=True)" ] }, { "cell_type": "code", "execution_count": 29, "id": "20665e82", "metadata": {}, "outputs": [], "source": [ "### ********** TODO: ADD IN VOLUME DATA TO FILTER MKTS ###" ] }, { "cell_type": "code", "execution_count": 30, "id": "53647b40", "metadata": {}, "outputs": [], "source": [ "# ### ASTER Historical FR ###\n", "# params = {\n", "# 'limit': 1000,\n", "# }\n", "# r = json.loads(requests.get('https://fapi.asterdex.com/fapi/v3/fundingRate', params=params).text)\n", "# df_aster_hist_fr = pd.DataFrame(r)\n", "# df_aster_hist_fr['funding_rate_ts_dt'] = pd.to_datetime(df_aster_hist_fr['fundingTime'], unit='ms')\n", "# df_aster_hist_fr = df_aster_hist_fr.sort_values(by='fundingTime', ascending=True).drop_duplicates(subset=['symbol'], keep='last')" ] }, { "cell_type": "code", "execution_count": 31, "id": "1f3b65ee", "metadata": {}, "outputs": [], "source": [ "# ### ASTER Current FR ###\n", "# r = json.loads(requests.get('https://fapi.asterdex.com/fapi/v3/fundingInfo').text)\n", "# df_aster_current_fr = pd.DataFrame(r)\n", "# df_aster_current_fr['funding_rate_ts_dt'] = pd.to_datetime(df_aster_current_fr['time'], unit='ms')\n", "# df_aster_current_fr['funding_rate'] = df_aster_current_fr['interestRate']\n" ] }, { "cell_type": "code", "execution_count": 32, "id": "e33ec721", "metadata": {}, "outputs": [], "source": [ "### Extended Current FR ###\n", "r = json.loads(requests.get('https://api.starknet.extended.exchange/api/v1/info/markets').text)\n", "df_extend_current_mkt_stats = pd.DataFrame(r['data'])\n", "\n", "df_extend_current_mkt_stats['funding_rate'] = df_extend_current_mkt_stats['marketStats'].apply(lambda x: x.get('fundingRate',{}))\n", "df_extend_current_mkt_stats['funding_rate_ts'] = df_extend_current_mkt_stats['marketStats'].apply(lambda x: x.get('nextFundingRate',{}))\n", "df_extend_current_mkt_stats['min_order_size'] = df_extend_current_mkt_stats['tradingConfig'].apply(lambda x: x.get('minOrderSize',{}))\n", "df_extend_current_mkt_stats['min_price_change'] = df_extend_current_mkt_stats['tradingConfig'].apply(lambda x: x.get('minPriceChange',{}))\n", "df_extend_current_mkt_stats['max_leverage'] = df_extend_current_mkt_stats['tradingConfig'].apply(lambda x: x.get('maxLeverage',{}))\n", "\n", "\n", "# df_extend_current_fr = df_extend_current_mkt_stats[['status','name','assetName','collateralAssetName','category','min_order_size','min_price_change','max_leverage','funding_rate','funding_rate_ts']]\n", "# df_extend_current_fr['funding_rate_ts_dt'] = pd.to_datetime(df_extend_current_fr['funding_rate_ts'], unit='ms')\n", "# df_extend_current_fr = df_extend_current_fr.loc[df_extend_current_fr['status']=='ACTIVE',:]" ] }, { "cell_type": "code", "execution_count": 33, "id": "782a5d56", "metadata": {}, "outputs": [], "source": [ "@dataclass(kw_only=False)\n", "class Asset_Leverage:\n", " exchange: str\n", " lh_asset: str\n", " rh_asset: str\n", " max_leverage: int\n", " max_notional: float\n", " # max_leverage_notional: list = field(default_factory=list)\n", "\n", "### MANUAL LEVERAGE DATA ###\n", "LEVERAGE_BY_EXCH: list[Asset_Leverage] = [\n", " Asset_Leverage('ASTER', 'ASTER', 'USDT', 75 , 20_000 ), Asset_Leverage('EXTEND', 'ASTER', 'USDT', 25, 400_000 ),\n", " Asset_Leverage('ASTER', 'AAVE' , 'USDT', 10 , 115_290), Asset_Leverage('EXTEND', 'AAVE' , 'USDT', 50, 500_000 ),\n", " Asset_Leverage('ASTER', '4' , 'USDT', 50 , 5_000 ), Asset_Leverage('EXTEND', '4' , 'USDT', 5 , 100_000 ),\n", " Asset_Leverage('ASTER', 'BNB' , 'USDT', 100, 10_000 ), Asset_Leverage('EXTEND', 'BNB' , 'USDT', 50, 500_000 ),\n", " Asset_Leverage('ASTER', 'BTC' , 'USDT', 150, 300_000), Asset_Leverage('EXTEND', 'BTC' , 'USDT', 50, 4_000_000),\n", " Asset_Leverage('ASTER', 'CHIP' , 'USDT', 50 , 5_000 ), Asset_Leverage('EXTEND', 'CHIP' , 'USDT', 5 , 100_000 ),\n", " Asset_Leverage('ASTER', 'CLU' , 'USDT', 50 , 10_000 ), Asset_Leverage('EXTEND', 'WTI' , 'USDT', 5 , 1_000_000),\n", " Asset_Leverage('ASTER', 'DOGE' , 'USDT', 75 , 80_000 ), Asset_Leverage('EXTEND', 'DOGE' , 'USDT', 50, 500_000 ),\n", " Asset_Leverage('ASTER', 'ENA' , 'USDT', 25 , 30_473 ), Asset_Leverage('EXTEND', 'ENA' , 'USDT', 50, 500_000 ),\n", " Asset_Leverage('ASTER', 'ETH' , 'USDT', 150, 300_000), Asset_Leverage('EXTEND', 'ETH' , 'USDT', 50, 4_000_000),\n", " Asset_Leverage('ASTER', 'HYPE' , 'USDT', 300, 1_000 ), Asset_Leverage('EXTEND', 'HYPE' , 'USDT', 50, 1_000_000),\n", " Asset_Leverage('ASTER', 'INIT' , 'USDT', 50 , 5_000 ), Asset_Leverage('EXTEND', 'INIT' , 'USDT', 5 , 100_000 ),\n", " Asset_Leverage('ASTER', 'LIT' , 'USDT', 50 , 2_500 ), Asset_Leverage('EXTEND', 'LIT' , 'USDT', 25, 400_000 ),\n", " Asset_Leverage('ASTER', 'SOL' , 'USDT', 100, 50_000 ), Asset_Leverage('EXTEND', 'SOL' , 'USDT', 50, 1_000_000),\n", " Asset_Leverage('ASTER', 'SUI' , 'USDT', 75 , 5_416 ), Asset_Leverage('EXTEND', 'SUI' , 'USDT', 50, 500_000 ),\n", " Asset_Leverage('ASTER', 'TRUMP', 'USDT', 50 , 5_567 ), Asset_Leverage('EXTEND', 'TRUMP', 'USDT', 25, 400_000 ),\n", " Asset_Leverage('ASTER', 'WLFI' , 'USDT', 25 , 104_869), Asset_Leverage('EXTEND', 'WLFI' , 'USDT', 10, 250_000 ),\n", " Asset_Leverage('ASTER', 'XAG' , 'USDT', 100, 50_000 ), Asset_Leverage('EXTEND', 'XAG' , 'USDT', 10, 1_000_000),\n", " Asset_Leverage('ASTER', 'XAU' , 'USDT', 75 , 2_500 ), Asset_Leverage('EXTEND', 'XAU' , 'USDT', 25, 2_000_000),\n", " Asset_Leverage('ASTER', 'XMR' , 'USDT', 50 , 10_000 ), Asset_Leverage('EXTEND', 'XMR' , 'USDT', 25, 400_000 ),\n", " Asset_Leverage('ASTER', 'XPT' , 'USDT', 3 , 30_000 ), Asset_Leverage('EXTEND', 'XPT' , 'USDT', 5 , 1_000_000),\n", " Asset_Leverage('ASTER', 'XRP' , 'USDT', 100, 40_000 ), Asset_Leverage('EXTEND', 'XRP' , 'USDT', 50, 500_000 ),\n", " Asset_Leverage('ASTER', 'ZEC' , 'USDT', 75 , 6_250 ), Asset_Leverage('EXTEND', 'ZEC' , 'USDT', 10, 250_000 ),\n", " Asset_Leverage('ASTER', 'ZORA' , 'USDT', 5 , 100_000), Asset_Leverage('EXTEND', 'ZORA' , 'USDT', 5 , 100_000 ),\n", "]\n", "df_leverage_by_exch = pd.DataFrame(LEVERAGE_BY_EXCH)" ] }, { "cell_type": "code", "execution_count": 34, "id": "62815940", "metadata": {}, "outputs": [], "source": [ "### ASTER Current FR from Mark Price Req ###\n", "# r = json.loads(requests.get('https://fapi.asterdex.com/fapi/v3/exchangeInfo').text)\n", "# df_aster_current_mkt_stats = pd.DataFrame(r)\n", "# ### ASTER Current FR from Mark Price Req ###\n", "# r = json.loads(requests.get('https://fapi.asterdex.com/fapi/v3/premiumIndex').text)\n", "# df_aster_current_mkt_stats = pd.DataFrame(r)" ] }, { "cell_type": "code", "execution_count": 35, "id": "271a67c1", "metadata": {}, "outputs": [], "source": [ "### ASTER CURRENT FR - WS ###\n", "df_aster_current_fr = pd.DataFrame(json.loads(VAL_KEY.get('fund_rate_aster_all')))\n", "df_aster_current_fr = df_aster_current_fr[['s','E','r','T']].rename({'s':'symbol','E':'funding_rate_updated_ts_ms','r':'funding_rate','T':'next_funding_ts'}, axis=1)\n", "df_aster_current_fr['funding_rate_updated_dt'] = pd.to_datetime(df_aster_current_fr['funding_rate_updated_ts_ms'], unit='ms')\n", "df_aster_current_fr['funding_rate'] = df_aster_current_fr['funding_rate'].astype(float)\n", "df_aster_current_fr['time_delta_to_next_funding'] = pd.to_datetime(df_aster_current_fr['next_funding_ts'], unit='ms') - pd.Timestamp.now()" ] }, { "cell_type": "code", "execution_count": 36, "id": "1ce2fde4", "metadata": {}, "outputs": [], "source": [ "### EXTEND CURRENT FR - WS ###\n", "df_extended_current_fr = pd.DataFrame(json.loads(VAL_KEY.get('fund_rate_extended_all')))\n", "df_extended_current_fr = df_extended_current_fr[['symbol','funding_rate_updated_ts_ms','funding_rate']]\n", "df_extended_current_fr['funding_rate_updated_dt'] = pd.to_datetime(df_extended_current_fr['funding_rate_updated_ts_ms'], unit='ms')\n", "df_extended_current_fr['funding_rate'] = df_extended_current_fr['funding_rate'].astype(float)\n", "\n", "# df_extended_current_fr = df_extended_current_fr.merge(df_extend_current_mkt_stats[['name','assetName','status', 'funding_rate_ts','max_leverage']].rename({'name':'symbol','funding_rate_ts':'next_funding_ts'}, axis=1), on='symbol', how='left')\n", "df_extended_current_fr = df_extended_current_fr.merge(df_extend_current_mkt_stats[['name','assetName','status', 'funding_rate_ts']].rename({'name':'symbol','funding_rate_ts':'next_funding_ts'}, axis=1), on='symbol', how='left')\n", "df_extended_current_fr = df_extended_current_fr.loc[df_extended_current_fr['status']=='ACTIVE',:]\n", "df_extended_current_fr['USDT_Symbol'] = df_extended_current_fr['assetName'] + 'USDT'\n", "df_extended_current_fr['time_delta_to_next_funding'] = pd.to_datetime(df_extended_current_fr['next_funding_ts'], unit='ms') - pd.Timestamp.now()" ] }, { "cell_type": "code", "execution_count": 37, "id": "ff88b413", "metadata": {}, "outputs": [], "source": [ "### COMBINED CURRENT FR - WS ###\n", "df_comb_current_fr = df_extended_current_fr.merge(df_aster_current_fr, left_on='USDT_Symbol', right_on='symbol', how='inner', suffixes=('_ext', '_ast'))\n", "df_comb_current_fr['next_funding_at_same_time'] = (abs(df_comb_current_fr['time_delta_to_next_funding_ext'].dt.total_seconds() - df_comb_current_fr['time_delta_to_next_funding_ast'].dt.total_seconds()) / 60) < 1\n", "df_comb_current_fr['net_funding_rate'] = (df_comb_current_fr[['funding_rate_ext', 'funding_rate_ast']].max(axis=1) - df_comb_current_fr[['funding_rate_ext', 'funding_rate_ast']].min(axis=1)).where(df_comb_current_fr['next_funding_at_same_time'], df_comb_current_fr['funding_rate_ext'])\n", "df_comb_current_fr['net_funding_rate_abs'] = df_comb_current_fr['net_funding_rate'].abs()\n", "\n", "### NET MULT ###\n", "df_comb_current_fr = df_comb_current_fr.merge(df_leverage_by_exch.loc[df_leverage_by_exch['exchange']=='EXTEND'], left_on='assetName', right_on='lh_asset').merge(df_leverage_by_exch.loc[df_leverage_by_exch['exchange']=='ASTER'], left_on='assetName', right_on='lh_asset', suffixes=('_ext', '_ast'))\n", "df_comb_current_fr['net_mult'] = 1 / ( ( 0.5 / df_comb_current_fr['max_leverage_ext'] ) + ( 0.5 / df_comb_current_fr['max_leverage_ast'] ) )\n", "df_comb_current_fr['net_mult'] = df_comb_current_fr['net_mult'].round(2)\n", "df_comb_current_fr['net_mult_x_net_fr_abs'] = df_comb_current_fr['net_funding_rate_abs'] * df_comb_current_fr['net_mult']" ] }, { "cell_type": "code", "execution_count": 38, "id": "f5ade993", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'symbol_ast': 'CHIPUSDT', 'symbol_extended': 'CHIP-USD'}" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_best_fr_rate = df_comb_current_fr[['symbol_ext','symbol_ast','net_mult_x_net_fr_abs','net_funding_rate_abs','net_funding_rate','next_funding_at_same_time']].sort_values(by='net_mult_x_net_fr_abs', ascending=False).reset_index(drop=True)\n", "df_best_fr_rate['hourly_dollars_per_1k'] = df_best_fr_rate['net_mult_x_net_fr_abs'] * 1000\n", "df_best_fr_rate['hourly_dollars_per_1k'] = df_best_fr_rate['hourly_dollars_per_1k'].round(2)\n", "\n", "best_next_funding_pair = {'symbol_ast':df_best_fr_rate['symbol_ast'][0],'symbol_extended':df_best_fr_rate['symbol_ext'][0]}\n", "best_next_funding_pair" ] }, { "cell_type": "code", "execution_count": 39, "id": "0972d5f4", "metadata": {}, "outputs": [ { "data": { "application/vnd.microsoft.datawrangler.viewer.v0+json": { "columns": [ { "name": "index", "rawType": "int64", "type": "integer" }, { "name": "symbol_ext", "rawType": "str", "type": "string" }, { "name": "symbol_ast", "rawType": "str", "type": "string" }, { "name": "net_mult_x_net_fr_abs", "rawType": "float64", "type": "float" }, { "name": "net_funding_rate_abs", "rawType": "float64", "type": "float" }, { "name": "net_funding_rate", "rawType": "float64", "type": "float" }, { "name": "next_funding_at_same_time", "rawType": "bool", "type": "boolean" }, { "name": "hourly_dollars_per_1k", "rawType": "float64", "type": "float" } ], "ref": "33130419-3234-458e-82da-43648a261793", "rows": [ [ "0", "CHIP-USD", "CHIPUSDT", "0.00352692", "0.000388", "-0.000388", "False", "3.53" ], [ "1", "HYPE-USD", "HYPEUSDT", "0.00111423", "1.3e-05", "1.3e-05", "False", "1.11" ], [ "2", "BTC-USD", "BTCUSDT", "0.000975", "1.3e-05", "1.3e-05", "False", "0.98" ], [ "3", "ETH-USD", "ETHUSDT", "0.000975", "1.3e-05", "1.3e-05", "False", "0.98" ], [ "4", "BNB-USD", "BNBUSDT", "0.0008667099999999999", "1.3e-05", "1.3e-05", "False", "0.87" ], [ "5", "XAU-USD", "XAUUSDT", "0.0008625", "2.3e-05", "2.3e-05", "False", "0.86" ], [ "6", "DOGE-USD", "DOGEUSDT", "0.00078", "1.3e-05", "1.3e-05", "False", "0.78" ], [ "7", "XMR-USD", "XMRUSDT", "0.0007332599999999999", "2.2e-05", "2.2e-05", "False", "0.73" ], [ "8", "XPT-USD", "XPTUSDT", "0.0006299999999999999", "0.000168", "0.000168", "False", "0.63" ], [ "9", "SUI-USD", "SUIUSDT", "0.00054", "9e-06", "-9e-06", "False", "0.54" ], [ "10", "ASTER-USD", "ASTERUSDT", "0.0004875", "1.3e-05", "1.3e-05", "False", "0.49" ], [ "11", "ENA-USD", "ENAUSDT", "0.00043328999999999997", "1.3e-05", "1.3e-05", "False", "0.43" ], [ "12", "LIT-USD", "LITUSDT", "0.00043328999999999997", "1.3e-05", "1.3e-05", "False", "0.43" ], [ "13", "ZEC-USD", "ZECUSDT", "0.00038829999999999995", "2.2e-05", "-2.2e-05", "False", "0.39" ], [ "14", "SOL-USD", "SOLUSDT", "0.00033335000000000005", "5e-06", "-5e-06", "False", "0.33" ], [ "15", "WLFI-USD", "WLFIUSDT", "0.00018576999999999998", "1.3e-05", "-1.3e-05", "False", "0.19" ], [ "16", "XRP-USD", "XRPUSDT", "0.00013334", "2e-06", "2e-06", "False", "0.13" ], [ "17", "INIT-USD", "INITUSDT", "0.00011816999999999999", "1.3e-05", "1.3e-05", "False", "0.12" ], [ "18", "4-USD", "4USDT", "0.00011816999999999999", "1.3e-05", "1.3e-05", "False", "0.12" ], [ "19", "AAVE-USD", "AAVEUSDT", "0.00010002000000000001", "6e-06", "6e-06", "False", "0.1" ], [ "20", "ZORA-USD", "ZORAUSDT", "6.5e-05", "1.3e-05", "1.3e-05", "False", "0.06" ], [ "21", "XAG-USD", "XAGUSDT", "5.454e-05", "3e-06", "3e-06", "False", "0.05" ], [ "22", "TRUMP-USD", "TRUMPUSDT", "3.3329999999999994e-05", "1e-06", "-1e-06", "False", "0.03" ] ], "shape": { "columns": 7, "rows": 23 } }, "text/html": [ "
| \n", " | symbol_ext | \n", "symbol_ast | \n", "net_mult_x_net_fr_abs | \n", "net_funding_rate_abs | \n", "net_funding_rate | \n", "next_funding_at_same_time | \n", "hourly_dollars_per_1k | \n", "
|---|---|---|---|---|---|---|---|
| 0 | \n", "CHIP-USD | \n", "CHIPUSDT | \n", "0.003527 | \n", "0.000388 | \n", "-0.000388 | \n", "False | \n", "3.53 | \n", "
| 1 | \n", "HYPE-USD | \n", "HYPEUSDT | \n", "0.001114 | \n", "0.000013 | \n", "0.000013 | \n", "False | \n", "1.11 | \n", "
| 2 | \n", "BTC-USD | \n", "BTCUSDT | \n", "0.000975 | \n", "0.000013 | \n", "0.000013 | \n", "False | \n", "0.98 | \n", "
| 3 | \n", "ETH-USD | \n", "ETHUSDT | \n", "0.000975 | \n", "0.000013 | \n", "0.000013 | \n", "False | \n", "0.98 | \n", "
| 4 | \n", "BNB-USD | \n", "BNBUSDT | \n", "0.000867 | \n", "0.000013 | \n", "0.000013 | \n", "False | \n", "0.87 | \n", "
| 5 | \n", "XAU-USD | \n", "XAUUSDT | \n", "0.000862 | \n", "0.000023 | \n", "0.000023 | \n", "False | \n", "0.86 | \n", "
| 6 | \n", "DOGE-USD | \n", "DOGEUSDT | \n", "0.000780 | \n", "0.000013 | \n", "0.000013 | \n", "False | \n", "0.78 | \n", "
| 7 | \n", "XMR-USD | \n", "XMRUSDT | \n", "0.000733 | \n", "0.000022 | \n", "0.000022 | \n", "False | \n", "0.73 | \n", "
| 8 | \n", "XPT-USD | \n", "XPTUSDT | \n", "0.000630 | \n", "0.000168 | \n", "0.000168 | \n", "False | \n", "0.63 | \n", "
| 9 | \n", "SUI-USD | \n", "SUIUSDT | \n", "0.000540 | \n", "0.000009 | \n", "-0.000009 | \n", "False | \n", "0.54 | \n", "
| 10 | \n", "ASTER-USD | \n", "ASTERUSDT | \n", "0.000487 | \n", "0.000013 | \n", "0.000013 | \n", "False | \n", "0.49 | \n", "
| 11 | \n", "ENA-USD | \n", "ENAUSDT | \n", "0.000433 | \n", "0.000013 | \n", "0.000013 | \n", "False | \n", "0.43 | \n", "
| 12 | \n", "LIT-USD | \n", "LITUSDT | \n", "0.000433 | \n", "0.000013 | \n", "0.000013 | \n", "False | \n", "0.43 | \n", "
| 13 | \n", "ZEC-USD | \n", "ZECUSDT | \n", "0.000388 | \n", "0.000022 | \n", "-0.000022 | \n", "False | \n", "0.39 | \n", "
| 14 | \n", "SOL-USD | \n", "SOLUSDT | \n", "0.000333 | \n", "0.000005 | \n", "-0.000005 | \n", "False | \n", "0.33 | \n", "
| 15 | \n", "WLFI-USD | \n", "WLFIUSDT | \n", "0.000186 | \n", "0.000013 | \n", "-0.000013 | \n", "False | \n", "0.19 | \n", "
| 16 | \n", "XRP-USD | \n", "XRPUSDT | \n", "0.000133 | \n", "0.000002 | \n", "0.000002 | \n", "False | \n", "0.13 | \n", "
| 17 | \n", "INIT-USD | \n", "INITUSDT | \n", "0.000118 | \n", "0.000013 | \n", "0.000013 | \n", "False | \n", "0.12 | \n", "
| 18 | \n", "4-USD | \n", "4USDT | \n", "0.000118 | \n", "0.000013 | \n", "0.000013 | \n", "False | \n", "0.12 | \n", "
| 19 | \n", "AAVE-USD | \n", "AAVEUSDT | \n", "0.000100 | \n", "0.000006 | \n", "0.000006 | \n", "False | \n", "0.10 | \n", "
| 20 | \n", "ZORA-USD | \n", "ZORAUSDT | \n", "0.000065 | \n", "0.000013 | \n", "0.000013 | \n", "False | \n", "0.06 | \n", "
| 21 | \n", "XAG-USD | \n", "XAGUSDT | \n", "0.000055 | \n", "0.000003 | \n", "0.000003 | \n", "False | \n", "0.05 | \n", "
| 22 | \n", "TRUMP-USD | \n", "TRUMPUSDT | \n", "0.000033 | \n", "0.000001 | \n", "-0.000001 | \n", "False | \n", "0.03 | \n", "