Skip to content

Instantly share code, notes, and snippets.

@ssghost
Forked from gaugau3000/binance_hl.ipynb
Created August 17, 2024 06:20
Show Gist options
  • Save ssghost/5d2c4c3a9676ddad1b5a1568a05ddfe9 to your computer and use it in GitHub Desktop.
Save ssghost/5d2c4c3a9676ddad1b5a1568a05ddfe9 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Defaulting to user installation because normal site-packages is not writeable\n",
"Requirement already satisfied: ccxt in c:\\users\\gautier\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (4.3.84)\n",
"Collecting pandas\n",
" Downloading pandas-2.2.2-cp312-cp312-win_amd64.whl.metadata (19 kB)\n",
"Requirement already satisfied: setuptools>=60.9.0 in c:\\users\\gautier\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from ccxt) (72.2.0)\n",
"Requirement already satisfied: certifi>=2018.1.18 in c:\\users\\gautier\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from ccxt) (2024.7.4)\n",
"Requirement already satisfied: requests>=2.18.4 in c:\\users\\gautier\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from ccxt) (2.32.3)\n",
"Requirement already satisfied: cryptography>=2.6.1 in c:\\users\\gautier\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from ccxt) (43.0.0)\n",
"Requirement already satisfied: typing-extensions>=4.4.0 in c:\\users\\gautier\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from ccxt) (4.12.2)\n",
"Requirement already satisfied: aiohttp>=3.8 in c:\\users\\gautier\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from ccxt) (3.10.3)\n",
"Requirement already satisfied: aiodns>=1.1.1 in c:\\users\\gautier\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from ccxt) (3.2.0)\n",
"Requirement already satisfied: yarl>=1.7.2 in c:\\users\\gautier\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from ccxt) (1.9.4)\n",
"Collecting numpy>=1.26.0 (from pandas)\n",
" Downloading numpy-2.0.1-cp312-cp312-win_amd64.whl.metadata (60 kB)\n",
"Requirement already satisfied: python-dateutil>=2.8.2 in c:\\users\\gautier\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from pandas) (2.9.0.post0)\n",
"Collecting pytz>=2020.1 (from pandas)\n",
" Downloading pytz-2024.1-py2.py3-none-any.whl.metadata (22 kB)\n",
"Collecting tzdata>=2022.7 (from pandas)\n",
" Downloading tzdata-2024.1-py2.py3-none-any.whl.metadata (1.4 kB)\n",
"Requirement already satisfied: pycares>=4.0.0 in c:\\users\\gautier\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from aiodns>=1.1.1->ccxt) (4.4.0)\n",
"Requirement already satisfied: aiohappyeyeballs>=2.3.0 in c:\\users\\gautier\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from aiohttp>=3.8->ccxt) (2.3.6)\n",
"Requirement already satisfied: aiosignal>=1.1.2 in c:\\users\\gautier\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from aiohttp>=3.8->ccxt) (1.3.1)\n",
"Requirement already satisfied: attrs>=17.3.0 in c:\\users\\gautier\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from aiohttp>=3.8->ccxt) (24.2.0)\n",
"Requirement already satisfied: frozenlist>=1.1.1 in c:\\users\\gautier\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from aiohttp>=3.8->ccxt) (1.4.1)\n",
"Requirement already satisfied: multidict<7.0,>=4.5 in c:\\users\\gautier\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from aiohttp>=3.8->ccxt) (6.0.5)\n",
"Requirement already satisfied: cffi>=1.12 in c:\\users\\gautier\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from cryptography>=2.6.1->ccxt) (1.17.0)\n",
"Requirement already satisfied: six>=1.5 in c:\\users\\gautier\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from python-dateutil>=2.8.2->pandas) (1.16.0)\n",
"Requirement already satisfied: charset-normalizer<4,>=2 in c:\\users\\gautier\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from requests>=2.18.4->ccxt) (3.3.2)\n",
"Requirement already satisfied: idna<4,>=2.5 in c:\\users\\gautier\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from requests>=2.18.4->ccxt) (3.7)\n",
"Requirement already satisfied: urllib3<3,>=1.21.1 in c:\\users\\gautier\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from requests>=2.18.4->ccxt) (2.2.2)\n",
"Requirement already satisfied: pycparser in c:\\users\\gautier\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from cffi>=1.12->cryptography>=2.6.1->ccxt) (2.22)\n",
"Downloading pandas-2.2.2-cp312-cp312-win_amd64.whl (11.5 MB)\n",
" ---------------------------------------- 0.0/11.5 MB ? eta -:--:--\n",
" ------ --------------------------------- 1.8/11.5 MB 10.1 MB/s eta 0:00:01\n",
" ------------- -------------------------- 3.9/11.5 MB 9.4 MB/s eta 0:00:01\n",
" -------------------- ------------------- 5.8/11.5 MB 9.3 MB/s eta 0:00:01\n",
" --------------------------- ------------ 7.9/11.5 MB 9.4 MB/s eta 0:00:01\n",
" ---------------------------------- ----- 10.0/11.5 MB 9.5 MB/s eta 0:00:01\n",
" --------------------------------------- 11.3/11.5 MB 9.0 MB/s eta 0:00:01\n",
" ---------------------------------------- 11.5/11.5 MB 8.3 MB/s eta 0:00:00\n",
"Downloading numpy-2.0.1-cp312-cp312-win_amd64.whl (16.3 MB)\n",
" ---------------------------------------- 0.0/16.3 MB ? eta -:--:--\n",
" ----- ---------------------------------- 2.1/16.3 MB 9.0 MB/s eta 0:00:02\n",
" ---------- ----------------------------- 4.2/16.3 MB 9.3 MB/s eta 0:00:02\n",
" --------------- ------------------------ 6.3/16.3 MB 9.4 MB/s eta 0:00:02\n",
" -------------------- ------------------- 8.4/16.3 MB 9.3 MB/s eta 0:00:01\n",
" ------------------------- -------------- 10.5/16.3 MB 9.4 MB/s eta 0:00:01\n",
" ------------------------------- -------- 12.8/16.3 MB 9.5 MB/s eta 0:00:01\n",
" ----------------------------------- ---- 14.4/16.3 MB 9.2 MB/s eta 0:00:01\n",
" --------------------------------------- 16.3/16.3 MB 9.2 MB/s eta 0:00:01\n",
" ---------------------------------------- 16.3/16.3 MB 8.6 MB/s eta 0:00:00\n",
"Downloading pytz-2024.1-py2.py3-none-any.whl (505 kB)\n",
"Downloading tzdata-2024.1-py2.py3-none-any.whl (345 kB)\n",
"Installing collected packages: pytz, tzdata, numpy, pandas\n",
"Successfully installed numpy-2.0.1 pandas-2.2.2 pytz-2024.1 tzdata-2024.1\n"
]
}
],
"source": [
"!pip install ccxt pandas matplotlib"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Error processing market BTCST/USDT:USDT on binance: binance {\"code\":-1122,\"msg\":\"Invalid symbol status.\"}\n",
"Error processing market BTCST/USDT:USDT on binance: binance {\"code\":-1122,\"msg\":\"Invalid symbol status.\"}\n",
"Error processing market BTCST/USDT:USDT on binance: binance {\"code\":-1122,\"msg\":\"Invalid symbol status.\"}\n",
"Error processing market BTCST/USDT:USDT on binance: binance {\"code\":-1122,\"msg\":\"Invalid symbol status.\"}\n",
"Error processing market BTCST/USDT:USDT on binance: binance {\"code\":-1122,\"msg\":\"Invalid symbol status.\"}\n",
"Error processing market BTCST/USDT:USDT on binance: binance {\"code\":-1122,\"msg\":\"Invalid symbol status.\"}\n"
]
}
],
"source": [
"import ccxt\n",
"from datetime import datetime, timedelta\n",
"\n",
"# Initialize exchanges\n",
"binance = ccxt.binance({\n",
" 'options': {\n",
" 'defaultType': 'future', # Set to 'future' for Binance Futures\n",
" }\n",
"})\n",
"\n",
"hyperliquid = ccxt.hyperliquid()\n",
"\n",
"# Helper function to fetch and calculate monthly volume for a specific month\n",
"def fetch_monthly_volume(exchange, markets, since, until):\n",
" total_volume = 0\n",
"\n",
" for market in markets:\n",
" try:\n",
" if (exchange.id == 'binance' and market.endswith('USDT:USDT')) or (exchange.id == 'hyperliquid'):\n",
" ohlcv = exchange.fetch_ohlcv(market, timeframe='1d', since=since, limit=None)\n",
" for candle in ohlcv:\n",
" timestamp = candle[0]\n",
" if since <= timestamp < until:\n",
" close_price = candle[4]\n",
" volume = candle[5]\n",
" total_volume += close_price * volume\n",
" except Exception as e:\n",
" print(f\"Error processing market {market} on {exchange.id}: {e}\")\n",
"\n",
" return total_volume\n",
"\n",
"# Function to aggregate volumes for the last 6 months\n",
"def fetch_last_six_months_volume(exchange, markets):\n",
" monthly_volumes = {}\n",
" now = datetime.now()\n",
"\n",
" for i in range(6):\n",
" # Calculate the start and end of the month\n",
" start_date = now - timedelta(days=30 * (i + 1))\n",
" end_date = now - timedelta(days=30 * i)\n",
" since = int(start_date.timestamp() * 1000)\n",
" until = int(end_date.timestamp() * 1000)\n",
" \n",
" # Fetch and store the volume for this month\n",
" monthly_volume = fetch_monthly_volume(exchange, markets, since, until)\n",
" month_name = start_date.strftime('%Y-%m')\n",
" monthly_volumes[month_name] = monthly_volume\n",
"\n",
" return monthly_volumes\n",
"\n",
"# Fetch all markets for Binance Futures and Hyperliquid\n",
"binance_markets = binance.load_markets()\n",
"hyperliquid_markets = hyperliquid.load_markets()\n",
"\n",
"# Calculate total monthly volume for the last 6 months for Binance Futures\n",
"binance_volumes_last_6_months = fetch_last_six_months_volume(binance, binance_markets)\n",
"\n",
"# Calculate total monthly volume for the last 6 months for Hyperliquid\n",
"hyperliquid_volumes_last_6_months = fetch_last_six_months_volume(hyperliquid, hyperliquid_markets)\n",
"\n",
"# Combine and display results\n",
"exchange_volumes = {\n",
" 'Binance Futures': binance_volumes_last_6_months,\n",
" 'Hyperliquid': hyperliquid_volumes_last_6_months\n",
"}\n",
"\n",
"# Convert the results to DataFrames for better display\n",
"binance_df = pd.DataFrame.from_dict(binance_volumes_last_6_months, orient='index', columns=['Monthly Volume (USD)'])\n",
"hyperliquid_df = pd.DataFrame.from_dict(hyperliquid_volumes_last_6_months, orient='index', columns=['Monthly Volume (USD)'])\n",
"\n",
"# Display the DataFrames\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Defaulting to user installation because normal site-packages is not writeable\n",
"Collecting matplotlib\n",
" Downloading matplotlib-3.9.2-cp312-cp312-win_amd64.whl.metadata (11 kB)\n",
"Collecting contourpy>=1.0.1 (from matplotlib)\n",
" Downloading contourpy-1.2.1-cp312-cp312-win_amd64.whl.metadata (5.8 kB)\n",
"Collecting cycler>=0.10 (from matplotlib)\n",
" Downloading cycler-0.12.1-py3-none-any.whl.metadata (3.8 kB)\n",
"Collecting fonttools>=4.22.0 (from matplotlib)\n",
" Downloading fonttools-4.53.1-cp312-cp312-win_amd64.whl.metadata (165 kB)\n",
"Collecting kiwisolver>=1.3.1 (from matplotlib)\n",
" Downloading kiwisolver-1.4.5-cp312-cp312-win_amd64.whl.metadata (6.5 kB)\n",
"Requirement already satisfied: numpy>=1.23 in c:\\users\\gautier\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from matplotlib) (2.0.1)\n",
"Requirement already satisfied: packaging>=20.0 in c:\\users\\gautier\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from matplotlib) (24.1)\n",
"Collecting pillow>=8 (from matplotlib)\n",
" Downloading pillow-10.4.0-cp312-cp312-win_amd64.whl.metadata (9.3 kB)\n",
"Collecting pyparsing>=2.3.1 (from matplotlib)\n",
" Downloading pyparsing-3.1.2-py3-none-any.whl.metadata (5.1 kB)\n",
"Requirement already satisfied: python-dateutil>=2.7 in c:\\users\\gautier\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from matplotlib) (2.9.0.post0)\n",
"Requirement already satisfied: six>=1.5 in c:\\users\\gautier\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from python-dateutil>=2.7->matplotlib) (1.16.0)\n",
"Downloading matplotlib-3.9.2-cp312-cp312-win_amd64.whl (7.8 MB)\n",
" ---------------------------------------- 0.0/7.8 MB ? eta -:--:--\n",
" -------- ------------------------------- 1.6/7.8 MB 8.3 MB/s eta 0:00:01\n",
" ------------------ --------------------- 3.7/7.8 MB 9.1 MB/s eta 0:00:01\n",
" ----------------------------- ---------- 5.8/7.8 MB 9.3 MB/s eta 0:00:01\n",
" -------------------------------------- - 7.6/7.8 MB 9.6 MB/s eta 0:00:01\n",
" ---------------------------------------- 7.8/7.8 MB 8.8 MB/s eta 0:00:00\n",
"Downloading contourpy-1.2.1-cp312-cp312-win_amd64.whl (189 kB)\n",
"Downloading cycler-0.12.1-py3-none-any.whl (8.3 kB)\n",
"Downloading fonttools-4.53.1-cp312-cp312-win_amd64.whl (2.2 MB)\n",
" ---------------------------------------- 0.0/2.2 MB ? eta -:--:--\n",
" --------------------------------- ------ 1.8/2.2 MB 10.0 MB/s eta 0:00:01\n",
" ---------------------------------------- 2.2/2.2 MB 7.7 MB/s eta 0:00:00\n",
"Downloading kiwisolver-1.4.5-cp312-cp312-win_amd64.whl (56 kB)\n",
"Downloading pillow-10.4.0-cp312-cp312-win_amd64.whl (2.6 MB)\n",
" ---------------------------------------- 0.0/2.6 MB ? eta -:--:--\n",
" ---------------------------- ----------- 1.8/2.6 MB 9.1 MB/s eta 0:00:01\n",
" ---------------------------------------- 2.6/2.6 MB 8.2 MB/s eta 0:00:00\n",
"Downloading pyparsing-3.1.2-py3-none-any.whl (103 kB)\n",
"Installing collected packages: pyparsing, pillow, kiwisolver, fonttools, cycler, contourpy, matplotlib\n",
"Successfully installed contourpy-1.2.1 cycler-0.12.1 fonttools-4.53.1 kiwisolver-1.4.5 matplotlib-3.9.2 pillow-10.4.0 pyparsing-3.1.2\n"
]
}
],
"source": [
"!pip install matplotlib"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0, 0.5, 'Percentage (%)')"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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wIvToOfOnQsPDw/8999/GDBgAEaOHIkFCxZI20hJScFPP/2ElStXwsTEBF27dsVXX32F33//HcCL786wYcMwdepUtGjRAomJiRp9bt++PSwtLbF9+3bY29vj119/RdOmTXHt2rU8z0Y8dOgQunXrJj0vXbo0XFxcsGvXLgQFBeHgwYMIDQ1FZmYm+vfvj6VLl8LU1FTrturVq4fnz5/j6NGjub7fRPT23vU40Pwy1PhRg4abl8cu5GXfvn0az2fNmoVZs2YVUEWF299//w0bGxuNaa/eH6t3797w9fVFXFwcXFxckJCQgH/++Qe7d+/WWG7QoEFo164dgBf/ke7YsQNLlizByJEjMW/ePNSuXRuTJ0+Wll+6dClcXV1x7do1VK5cGQBQqVIlTJs2Tef6f/nlF1SsWFHas1KlShWcP38eP/74o+5NeEVycjKWLFmCVatWoWnTpgBehI9Xx3alp6djx44dufay+Pr6wsTEBBkZGcjMzETfvn3fGG5q1KghjVupVKkS5s2bh4iICCncDBkyRFrW3d0dEydORL9+/TTCTWZmJhYuXIiKFSsCePHzmDBhgjR/4sSJGD58uMaek/fffx/Ai5By7NgxJCQkSIPpf/rpJ2zatAnr1q1D3759c9X85MkTJCYmokyZMtI0lUqFtWvXYujQoRg8eDBatmyJnj17YurUqWjcuDEsLCzg5+eHBw8e4IsvvtDYc2RlZQV7e/tc43GIiN4Fozlbit5e48aNpb1hOY4ePYquXbtKz+vXr49q1aph+fLlGDVqFFatWgU3N7dcF018+Yy0YsWKoV69etIhibNnz2Lv3r25ghQAREVFSeGmbt26etV/+fJlNGjQIM868iMqKgoZGRka23VwcMh1i489e/bA0dER1apV05i+Zs0aeHl5ITMzExcuXMAXX3yBEiVKYOrUqXm+Zo0aNTSe54TIHLt378aUKVNw5coVJCUl4fnz50hLS0NKSop0ZWwrKysp2Ly6jYSEBNy9e1cKa686e/YskpOTUbJkSY3pqampiIqK0rpOzuGjV68W7O/vj+PHj0vPr127hhUrVuD06dNo1KgRBg8ejBYtWqB69epo1KiRxnu3tLTkPdqIyCAYbhTE2toanp6eGtO0Xf+nd+/emD9/PkaNGoVly5ahR48eet3CIjk5GR9//LHWPSovD+x+3S008svExCTXHr/MzMy33u6WLVvQunXrXNNdXV2lnnp5eSEqKgpjx47F+PHj87xtgJmZmcZzlUqF7OxsAC/GGX300Ufo378/Jk2aBAcHBxw6dAi9evVCRkaGFG60bSPnfVtaWr72vSQnJ8PFxSXXXk8AeQ5+LlmyJFQqFR4/fvzabX/++eeYMWMGsrOzcfr0abRv3x5WVlYICAjA/v37NcLNo0ePULp06dduj4ioIBjFqeD0buUMwp47dy4uXbqE0NDQXMv8+++/0r+fP3+OkydPwsvLCwBQp04dXLx4Ee7u7vD09NR4vE2g8fLywrFjx/KsA3gxDiQ+Pl4j4Lw8IPlVFStWhJmZGY4ePSpNe/z4Ma5duyY9F0Jg69atrx1vk8PU1BTPnz/XevaXLk6ePIns7GzMmDEDH3zwASpXroy7d+/qtQ1bW1u4u7sjIiJC6/w6deogPj4exYoVy/XzKVWqlNZ1zM3N4e3tjUuXLuX5ukuWLIGDgwNat24tHe7MCZaZmZkah0CjoqKQlpaG2rVr6/XeiIjkwHBTBJUoUQKffPIJRowYgWbNmmm9ttD8+fOxceNGXLlyBQMHDsTjx4/Rs2dPAC/Ocnv06BE6deqE48ePIyoqCjt37kSPHj1yjfHRR79+/XD9+nWMGDECV69exerVq3NdQyYwMBD379/HtGnTEBUVhfnz52P79u15btPGxga9evXCiBEjsGfPHly4cAHdu3fXGKR+8uRJpKSkwN/fP9f6Dx8+RHx8PG7fvo3t27djzpw5aNy4Mezs7PL1Hj09PZGZmYmff/4Z//33H1auXImFCxfqvZ3x48djxowZmDt3Lq5fv45Tp07h559/BgAEBQXBx8cHbdu2xa5duxATE4MjR47g22+/xYkTJ/LcZnBwcJ4X0UxISMDEiROl1yhRogS8vLwwe/ZsREZGIiIiQjqFHAAOHjyIChUqaBxaIyJ6V3hYSkdKu2Jwr169sHr1aimwvGrq1KmYOnUqzpw5A09PT2zZskX6q79MmTI4fPgwvv76azRr1gzp6elwc3ND8+bN3+qGiOXLl8f69esxdOhQ/Pzzz6hfvz4mT56sUaOXlxcWLFiAyZMn44cffkC7du3w1VdfaVx/5VXTp0+XDqXZ2tpi+PDh0n3MAGDz5s1o2bKl1uvtBAUFAXixx8bFxQUtW7bEpEmT8v0ea9asiZkzZ+LHH3/E6NGj0ahRI0yZMuWNg5RfFRoairS0NMyaNQtfffUVSpUqJZ0Bp1Kp8M8//+Dbb79Fjx49cP/+fTg7O6NRo0Yap7m/qlevXqhXrx4SExNhb2+vMW/w4MEYPny4xoDjsLAwhIaGYu7cuRgxYoQ0oBkA/vjjD/Tp00ev90REJBeV0OWUJQVJSkqCvb09EhMTc/31nZaWhujoaHh4eOQ5nkIpVq5ciaFDh+Lu3bswNzeXphfULRHya9++fWjcuDEeP35cYBfLq1GjBsaMGYPPPvusQLZfmLRv3x516tTRuLaUvi5evIgmTZrg2rVruUJSjqL0XSMqCEXxVPDX/f/9Kh6WKmJSUlIQFRWFqVOn4vPPP9cINkVRRkYG2rVrhxYtWhi6FKMwffp0rWfB6SMuLg4rVqzIM9gQERU0HpYqYqZNm4ZJkyahUaNGb/XXuVKYm5tr3EupqHN3d8cXX3zxVtvIOZRHpE1h2OOgtGEIRRHDTREzfvz4XBeqe5m7u7tOF1d8VwIDA42qHiIiMn48LEVERESKwnCjBfcUEBUsfseIqCAx3Lwk56qwvGQ8UcHK+Y69eiVmIiI5cMzNS0xNTVG8eHHpHj5WVlZ63ZaA5HE1PsnQJbxRFef8XcSvqBNCICUlBQkJCShevHiedxUnInobDDevcHZ2BgCNGx3Su5XwONXQJbyReerr7+9Er1e8eHHpu0ZEJDeGm1eoVCq4uLjA0dFRlhsykv56b9hn6BLeKGJ4oKFLKLTMzMy4x4aIChTDTR5MTU35C9hA7jzN//2p3hVeVZeIyHhxQDEREREpCsMNERERKQrDDRERESkKww0REREpCsMNERERKQrDDRERESkKww0REREpCsMNERERKQrDDRERESkKww0REREpCsMNERERKQrDDRERESkKww0REREpCsMNERERKQrDDRERESkKww0REREpCsMNERERKQrDDRERESkKww0REREpCsMNERERKQrDDRERESkKww0REREpCsMNERERKQrDDRERESkKww0REREpCsMNERERKQrDDRERESkKww0REREpCsMNERERKQrDDRERESkKww0REREpCsMNERERKQrDDRERESlKMUMXQERk7NxHbTN0CW8UM7WVoUsgMhoMNzLhLz8iIiLjwMNSREREpCgMN0RERKQoDDdERESkKAw3REREpCgMN0RERKQo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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"# Calculate the ratio, reverse the order, and plot the bar chart\n",
"ax = (hyperliquid_df/binance_df*100).iloc[::-1].plot(kind=\"bar\")\n",
"\n",
"# Set a custom legend\n",
"ax.legend([\"Hyperliquid/Binance (%)\"], loc=\"best\")\n",
"\n",
"# Optionally, set a title and labels\n",
"plt.title(\"Hyperliquid vs Binance Monthly Volume Ratio\")\n",
"plt.xlabel(\"Month\")\n",
"plt.ylabel(\"Percentage (%)\")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.12.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment