{
"cells": [
{
"cell_type": "markdown",
"id": "1c0daa6c",
"metadata": {},
"source": [
"## **Crypto Statistical Arbitrage via Cointegration and Regime Filtering**"
]
},
{
"cell_type": "markdown",
"id": "5c2f853a",
"metadata": {},
"source": [
"### Research Framework\n",
"\n",
"#### **Objective**\n",
"Discover cointegrated crypto baskets that exhibit stable, regime-aware mean-reverting relationships, and combine them into a portfolio that generates strong risk-adjusted returns, evaluated via out-of-sample testing.\n",
"\n",
"---\n",
"\n",
"#### **Step 1 — Walk-Forward Backtest**\n",
"To avoid overfitting, the entire history was split into rolling **365-day train windows** and **60-day test windows**, stepped forward sequentially. \n",
"Within each train window:\n",
"\n",
"- **Basket Discovery** — Johansen cointegration was applied across all candidate baskets (2–4 assets). Only baskets with exactly one cointegrating relationship (**rank = 1**) were retained. \n",
"\n",
"- **Quality Filtering** — Surviving baskets were passed through a sequential pipeline:\n",
" - ADF stationarity \n",
" - Variance ratio (mean-reversion check) \n",
" - Half-life between 2–15 days (estimated via OLS) \n",
" - Rolling half-life stability \n",
" - Spread predictability \n",
"\n",
"- **Parameter Calibration** — Since mean-reversion speed varies across time, key parameters were calibrated within each train window. \n",
" In particular, the **half-life lookback window** used in signal construction was scaled based on the **median half-life of the filtered baskets**. \n",
" This ensures that the signal adapts to the prevailing market regime, rather than relying on fixed global parameters.\n",
"\n",
"- **Dynamic Cointegrating Weights** — Rolling cointegration weights were computed to allow hedge ratios to adapt to slow structural drift, with weights forward-filled to ensure no look-ahead bias. \n",
"\n",
"- **Alpha & Regime Signal** — An Ornstein-Uhlenbeck mean-reversion signal was computed on the dynamic spread, with clipping and deadbanding to suppress noise. \n",
" A two-tier regime filter was applied:\n",
" - **Hard filters**: volatility spikes and ADF breakdown (signal = 0) \n",
" - **Soft score**: continuous weighting based on mean-reversion strength, stationarity quality, and volatility stability \n",
"\n",
"---\n",
"\n",
"#### **Step 2 — Basket Scoring & Selection**\n",
"After all walk-forward folds, each basket was evaluated using **per-basket PnL attribution** to ensure accurate contribution measurement.\n",
"\n",
"- Baskets were scored using a composite metric combining:\n",
" - Mean fold Sharpe \n",
" - Consistency across folds \n",
" - Number of fold appearances \n",
"\n",
"- Baskets were filtered to those that:\n",
" - Appeared in at least **2 folds** \n",
" - Had both **minimum and mean Sharpe > 0** across folds \n",
"\n",
"- A greedy diversification step was then applied, capping each asset to at most **2 baskets** to ensure diversification. \n",
"\n",
"---\n",
"\n",
"#### **Step 3 — Out-of-Sample Testing**\n",
"The selected baskets were traded on a fully held-out **20% test set**.\n",
"\n",
"- **Execution** — Positions were sized using a **bucketed framework** (e.g., flat / partial / full exposure), where trades occur only when alpha crosses bucket boundaries, significantly reducing turnover. \n",
"\n",
"- **Portfolio Construction** — Capital was allocated using **inverse-volatility risk parity**, based on trailing 30-day basket returns. \n",
"\n",
"- **Transaction Costs** — ~20 bps transaction costs were applied **only on signal-driven position changes**."
]
},
{
"cell_type": "markdown",
"id": "3189df63",
"metadata": {},
"source": [
""
]
},
{
"cell_type": "markdown",
"id": "a719bb9e",
"metadata": {},
"source": [
"### 1. Setup & Imports"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "9426c67e",
"metadata": {},
"outputs": [],
"source": [
"from binance.client import Client\n",
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from itertools import combinations\n",
"import statsmodels.api as sm\n",
"from statsmodels.tsa.vector_ar.vecm import coint_johansen\n",
"from scipy.optimize import minimize\n",
"from statsmodels.tsa.stattools import adfuller\n",
"import statsmodels.api as sm\n",
"from tqdm import tqdm\n",
"import warnings\n",
"warnings.filterwarnings('ignore')"
]
},
{
"cell_type": "markdown",
"id": "4bfe5998",
"metadata": {},
"source": [
"### 2. Constants & Hyperparameters"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "b046413b",
"metadata": {},
"outputs": [],
"source": [
"# ── Data & Spread ──────────────────────────────────────────────────────────────\n",
"MIN_HALF_LIFE = 2 # minimum acceptable half-life (days)\n",
"MAX_HALF_LIFE = 15 # maximum acceptable half-life (days)\n",
"HL_WINDOW = 120 # lookback (bars) for rolling OU parameter estimation\n",
"REGIME_WINDOW = 30 # lookback (bars) for regime vol and ADF checks\n",
"\n",
"# ── OU Signal ─────────────────────────────────────────────────────────────────\n",
"ALPHA_CLIP = 3.0 # winsorise raw alpha to ±3σ\n",
"ALPHA_DEADBAND = 0.10 # zero out alpha below this\n",
"\n",
"# ── Regime Filter ─────────────────────────────────────────────────────────────\n",
"# Tier 1 — hard kill: either condition triggers immediate alpha = 0\n",
"HARD_VOL_RATIO = 4.0 # short-term vol / long-term vol > this → structural break\n",
"HARD_ADF_PVAL = 0.40 # rolling ADF p-value > this → spread non-stationary\n",
"\n",
"# Tier 2 — soft score weights (must sum to 1.0)\n",
"REGIME_W_KAPPA = 0.35 # mean reversion speed\n",
"REGIME_W_ADF = 0.35 # stationarity quality\n",
"REGIME_W_VOL = 0.30 # volatility sanity\n",
"\n",
"# ── Position Sizing ───────────────────────────────────────────────────────────\n",
"ENTRY_THRESHOLD = 0.08 # minimum alpha to open a position\n",
"EXIT_THRESHOLD = 0.02 # alpha below this → exit\n",
"MAX_POS_SIZE = 1.0 # maximum position size\n",
"MIN_POS_SIZE = 0.10 # minimum position size\n",
"\n",
"# ── Risk Parity ───────────────────────────────────────────────────────────────\n",
"VOL_WINDOW = 30 # trailing bars for per-basket volatility estimation\n",
"VOL_FLOOR = 1e-6 # prevents division by zero for near-constant spreads\n",
"\n",
"# ── Basket Selection ──────────────────────────────────────────────────────────\n",
"MIN_FOLDS = 2 # basket must appear in at least this many WF folds\n",
"MIN_MEAN_SR = 0.0 # mean fold Sharpe must be positive\n",
"MIN_FLOOR_SR = 0.0 # worst single fold Sharpe must be non-negative\n",
"N_SELECT = 8 # max baskets after greedy diversification\n",
"\n",
"# ── OOS Deployment ────────────────────────────────────────────────────────────\n",
"BUCKET_THRESHOLDS = [0.08, 0.10] # alpha boundaries for position buckets\n",
"BUCKET_SIZES = [0.0, 0.5, 1.0] # position sizes: flat / half / full\n",
"TCOST_BPS = 20.0 # round-trip transaction cost"
]
},
{
"cell_type": "markdown",
"id": "804f76e3",
"metadata": {},
"source": [
"### 3. Data Acquisition"
]
},
{
"cell_type": "markdown",
"id": "b04037da",
"metadata": {},
"source": [
"#### 3.1 Download Prices"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "35bada5f",
"metadata": {},
"outputs": [],
"source": [
"class BinanceDataLoader:\n",
" def __init__(self):\n",
" self.client = Client(tld='US')\n",
" \n",
" def get_klines(self, symbol, interval, start, end):\n",
" klines = self.client.get_historical_klines(symbol, interval, start, end)\n",
" df = pd.DataFrame(klines, columns=[\n",
" \"open_time\", \"open\", \"high\", \"low\", \"close\", \"volume\",\n",
" \"close_time\", \"quote_asset_volume\", \"number_of_trades\",\n",
" \"taker_buy_base\", \"taker_buy_quote\", \"ignore\"\n",
" ])\n",
" df[\"open_time\"] = pd.to_datetime(df[\"open_time\"], unit=\"ms\")\n",
" df = df.set_index(\"open_time\")\n",
" df = df.astype(float)\n",
" return df\n",
" \n",
" def download_prices(self, symbols, interval=\"1d\",\n",
" start=\"1 Jan 2021\", end=\"1 Mar 2026\"):\n",
" prices = {}\n",
" for symbol in tqdm(symbols):\n",
" try:\n",
" df = self.get_klines(symbol, interval, start, end)\n",
" prices[symbol] = df[\"close\"]\n",
" except Exception as e:\n",
" print(f\"Failed: {symbol} — {e}\")\n",
" prices = pd.DataFrame(prices).sort_index()\n",
" return prices"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "efe37a65",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 23/23 [00:07<00:00, 2.90it/s]\n"
]
}
],
"source": [
"symbols = [\n",
" \"BTCUSDT\",\"ETHUSDT\",\"SOLUSDT\",\"BNBUSDT\",\"XRPUSDT\",\"ADAUSDT\",\"AVAXUSDT\",\"DOTUSDT\",\"ATOMUSDT\",\"LINKUSDT\",\"LDOUSDT\",\n",
" \"ARBUSDT\",\"OPUSDT\",\"FILUSDT\",\"LTCUSDT\",\"DOGEUSDT\",\"FETUSDT\",\"MATICUSDT\",\"NEARUSDT\",\"APTUSDT\",\"SUIUSDT\",\"MKRUSDT\",\n",
" \"CRVUSDT\"\n",
"]\n",
"\n",
"loader = BinanceDataLoader()\n",
"prices = loader.download_prices(\n",
" symbols,\n",
" interval=\"1d\",\n",
" start=\"1 Mar 2023\",\n",
" end= '1 Mar 2026'\n",
")"
]
},
{
"cell_type": "markdown",
"id": "ac30e63d",
"metadata": {},
"source": [
"#### 3.2 Clean & Filter"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "729e7366",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
| \n", " | BTCUSDT | \n", "ETHUSDT | \n", "SOLUSDT | \n", "BNBUSDT | \n", "ADAUSDT | \n", "AVAXUSDT | \n", "DOTUSDT | \n", "ATOMUSDT | \n", "LINKUSDT | \n", "LDOUSDT | \n", "OPUSDT | \n", "FILUSDT | \n", "LTCUSDT | \n", "DOGEUSDT | \n", "FETUSDT | \n", "NEARUSDT | \n", "APTUSDT | \n", "CRVUSDT | \n", "
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| open_time | \n", "\n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " |
| 2023-03-01 | \n", "23629.08 | \n", "1664.92 | \n", "22.5147 | \n", "302.5647 | \n", "0.36042 | \n", "17.75 | \n", "6.520 | \n", "12.781 | \n", "7.540 | \n", "3.040 | \n", "2.770 | \n", "7.280 | \n", "97.68 | \n", "0.081962 | \n", "0.4838 | \n", "2.324 | \n", "13.4800 | \n", "1.0370 | \n", "
| 2023-03-02 | \n", "23468.02 | \n", "1647.28 | \n", "21.9753 | \n", "299.8583 | \n", "0.34933 | \n", "17.46 | \n", "6.330 | \n", "12.450 | \n", "7.230 | \n", "3.019 | \n", "2.723 | \n", "6.920 | \n", "95.18 | \n", "0.080486 | \n", "0.4663 | \n", "2.239 | \n", "12.8428 | \n", "0.9900 | \n", "
| 2023-03-03 | \n", "22358.06 | \n", "1569.11 | \n", "21.3900 | \n", "290.4000 | \n", "0.34290 | \n", "16.66 | \n", "6.036 | \n", "12.011 | \n", "6.952 | \n", "2.813 | \n", "2.540 | \n", "6.228 | \n", "90.43 | \n", "0.076820 | \n", "0.4391 | \n", "2.094 | \n", "11.7475 | \n", "0.9360 | \n", "
| 2023-03-04 | \n", "22346.68 | \n", "1566.84 | \n", "20.9800 | \n", "289.6000 | \n", "0.33630 | \n", "16.13 | \n", "5.910 | \n", "11.838 | \n", "6.850 | \n", "2.549 | \n", "2.363 | \n", "5.904 | \n", "89.33 | \n", "0.074650 | \n", "0.4292 | \n", "2.042 | \n", "11.2763 | \n", "0.9060 | \n", "
| 2023-03-05 | \n", "22430.68 | \n", "1564.63 | \n", "20.9900 | \n", "288.6000 | \n", "0.33660 | \n", "16.18 | \n", "5.975 | \n", "12.030 | \n", "6.914 | \n", "2.602 | \n", "2.427 | \n", "6.110 | \n", "89.94 | \n", "0.074660 | \n", "0.4320 | \n", "2.026 | \n", "11.0906 | \n", "0.9240 | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 2026-02-25 | \n", "67957.93 | \n", "2057.35 | \n", "88.0300 | \n", "625.4700 | \n", "0.29580 | \n", "9.50 | \n", "1.639 | \n", "1.930 | \n", "9.200 | \n", "0.294 | \n", "0.123 | \n", "1.091 | \n", "56.59 | \n", "0.099940 | \n", "0.1656 | \n", "1.173 | \n", "1.0020 | \n", "0.2516 | \n", "
| 2026-02-26 | \n", "67481.40 | \n", "2026.71 | \n", "85.9300 | \n", "625.9300 | \n", "0.28690 | \n", "9.30 | \n", "1.643 | \n", "1.901 | \n", "9.110 | \n", "0.302 | \n", "0.117 | \n", "1.033 | \n", "55.43 | \n", "0.097030 | \n", "0.1625 | \n", "1.130 | \n", "0.9780 | \n", "0.2484 | \n", "
| 2026-02-27 | \n", "65882.98 | \n", "1929.82 | \n", "81.9800 | \n", "614.2000 | \n", "0.27710 | \n", "8.94 | \n", "1.603 | \n", "1.876 | \n", "8.680 | \n", "0.292 | \n", "0.120 | \n", "0.975 | \n", "54.55 | \n", "0.093380 | \n", "0.1559 | \n", "1.098 | \n", "0.9570 | \n", "0.2421 | \n", "
| 2026-02-28 | \n", "66954.13 | \n", "1964.65 | \n", "84.3000 | \n", "617.2400 | \n", "0.28150 | \n", "9.18 | \n", "1.675 | \n", "1.828 | \n", "8.830 | \n", "0.310 | \n", "0.138 | \n", "1.012 | \n", "54.49 | \n", "0.093860 | \n", "0.1545 | \n", "1.177 | \n", "0.9490 | \n", "0.2505 | \n", "
| 2026-03-01 | \n", "65721.17 | \n", "1939.12 | \n", "83.5700 | \n", "620.7100 | \n", "0.27350 | \n", "9.04 | \n", "1.538 | \n", "1.800 | \n", "8.680 | \n", "0.310 | \n", "0.121 | \n", "0.990 | \n", "53.23 | \n", "0.091820 | \n", "0.1516 | \n", "1.160 | \n", "0.9090 | \n", "0.2430 | \n", "
1097 rows × 18 columns
\n", "| \n", " | BTCUSDT | \n", "ETHUSDT | \n", "SOLUSDT | \n", "BNBUSDT | \n", "ADAUSDT | \n", "AVAXUSDT | \n", "DOTUSDT | \n", "ATOMUSDT | \n", "LINKUSDT | \n", "LDOUSDT | \n", "OPUSDT | \n", "FILUSDT | \n", "LTCUSDT | \n", "DOGEUSDT | \n", "FETUSDT | \n", "NEARUSDT | \n", "APTUSDT | \n", "CRVUSDT | \n", "
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| open_time | \n", "\n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " |
| 2023-03-01 | \n", "23629.08 | \n", "1664.92 | \n", "22.5147 | \n", "302.5647 | \n", "0.36042 | \n", "17.75 | \n", "6.520 | \n", "12.781 | \n", "7.540 | \n", "3.040 | \n", "2.770 | \n", "7.280 | \n", "97.68 | \n", "0.081962 | \n", "0.4838 | \n", "2.324 | \n", "13.4800 | \n", "1.0370 | \n", "
| 2023-03-02 | \n", "23468.02 | \n", "1647.28 | \n", "21.9753 | \n", "299.8583 | \n", "0.34933 | \n", "17.46 | \n", "6.330 | \n", "12.450 | \n", "7.230 | \n", "3.019 | \n", "2.723 | \n", "6.920 | \n", "95.18 | \n", "0.080486 | \n", "0.4663 | \n", "2.239 | \n", "12.8428 | \n", "0.9900 | \n", "
| 2023-03-03 | \n", "22358.06 | \n", "1569.11 | \n", "21.3900 | \n", "290.4000 | \n", "0.34290 | \n", "16.66 | \n", "6.036 | \n", "12.011 | \n", "6.952 | \n", "2.813 | \n", "2.540 | \n", "6.228 | \n", "90.43 | \n", "0.076820 | \n", "0.4391 | \n", "2.094 | \n", "11.7475 | \n", "0.9360 | \n", "
| 2023-03-04 | \n", "22346.68 | \n", "1566.84 | \n", "20.9800 | \n", "289.6000 | \n", "0.33630 | \n", "16.13 | \n", "5.910 | \n", "11.838 | \n", "6.850 | \n", "2.549 | \n", "2.363 | \n", "5.904 | \n", "89.33 | \n", "0.074650 | \n", "0.4292 | \n", "2.042 | \n", "11.2763 | \n", "0.9060 | \n", "
| 2023-03-05 | \n", "22430.68 | \n", "1564.63 | \n", "20.9900 | \n", "288.6000 | \n", "0.33660 | \n", "16.18 | \n", "5.975 | \n", "12.030 | \n", "6.914 | \n", "2.602 | \n", "2.427 | \n", "6.110 | \n", "89.94 | \n", "0.074660 | \n", "0.4320 | \n", "2.026 | \n", "11.0906 | \n", "0.9240 | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 2025-07-20 | \n", "117232.91 | \n", "3760.19 | \n", "181.4600 | \n", "757.4900 | \n", "0.85710 | \n", "25.12 | \n", "4.445 | \n", "5.196 | \n", "19.290 | \n", "1.241 | \n", "0.793 | \n", "2.859 | \n", "116.88 | \n", "0.273710 | \n", "0.8000 | \n", "2.986 | \n", "5.2200 | \n", "0.9558 | \n", "
| 2025-07-21 | \n", "117480.91 | \n", "3767.17 | \n", "195.7300 | \n", "766.3900 | \n", "0.88970 | \n", "25.56 | \n", "4.473 | \n", "5.203 | \n", "19.530 | \n", "1.190 | \n", "0.807 | \n", "2.897 | \n", "115.52 | \n", "0.271220 | \n", "0.8420 | \n", "3.038 | \n", "5.4400 | \n", "0.9779 | \n", "
| 2025-07-22 | \n", "119999.61 | \n", "3749.89 | \n", "205.8500 | \n", "783.7100 | \n", "0.90210 | \n", "25.87 | \n", "4.519 | \n", "5.120 | \n", "19.660 | \n", "1.220 | \n", "0.800 | \n", "2.932 | \n", "119.48 | \n", "0.270430 | \n", "0.8240 | \n", "3.028 | \n", "5.4680 | \n", "0.9796 | \n", "
| 2025-07-23 | \n", "118620.89 | \n", "3624.05 | \n", "189.1600 | \n", "776.0000 | \n", "0.81480 | \n", "23.96 | \n", "4.100 | \n", "4.687 | \n", "18.150 | \n", "1.096 | \n", "0.690 | \n", "2.640 | \n", "112.24 | \n", "0.240400 | \n", "0.7460 | \n", "2.766 | \n", "4.8490 | \n", "0.9383 | \n", "
| 2025-07-24 | \n", "118322.03 | \n", "3705.54 | \n", "182.7900 | \n", "769.7100 | \n", "0.80660 | \n", "23.62 | \n", "3.989 | \n", "4.639 | \n", "17.880 | \n", "1.052 | \n", "0.693 | \n", "2.617 | \n", "111.94 | \n", "0.231130 | \n", "0.7240 | \n", "2.708 | \n", "4.6330 | \n", "0.9495 | \n", "
877 rows × 18 columns
\n", "| \n", " | BTCUSDT | \n", "ETHUSDT | \n", "SOLUSDT | \n", "BNBUSDT | \n", "ADAUSDT | \n", "AVAXUSDT | \n", "DOTUSDT | \n", "ATOMUSDT | \n", "LINKUSDT | \n", "LDOUSDT | \n", "OPUSDT | \n", "FILUSDT | \n", "LTCUSDT | \n", "DOGEUSDT | \n", "FETUSDT | \n", "NEARUSDT | \n", "APTUSDT | \n", "CRVUSDT | \n", "
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| open_time | \n", "\n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " |
| 2025-07-25 | \n", "117577.40 | \n", "3720.94 | \n", "186.58 | \n", "784.57 | \n", "0.8167 | \n", "24.02 | \n", "4.075 | \n", "4.712 | \n", "18.23 | \n", "1.049 | \n", "0.718 | \n", "2.636 | \n", "113.53 | \n", "0.23617 | \n", "0.7400 | \n", "2.857 | \n", "4.765 | \n", "1.0229 | \n", "
| 2025-07-26 | \n", "117850.00 | \n", "3740.65 | \n", "184.88 | \n", "792.91 | \n", "0.8202 | \n", "24.91 | \n", "4.124 | \n", "4.770 | \n", "18.41 | \n", "1.098 | \n", "0.725 | \n", "2.658 | \n", "113.96 | \n", "0.23530 | \n", "0.7310 | \n", "2.895 | \n", "4.849 | \n", "1.1037 | \n", "
| 2025-07-27 | \n", "119395.67 | \n", "3873.34 | \n", "188.56 | \n", "842.39 | \n", "0.8304 | \n", "26.02 | \n", "4.226 | \n", "4.857 | \n", "19.21 | \n", "1.147 | \n", "0.742 | \n", "2.761 | \n", "115.03 | \n", "0.24056 | \n", "0.7550 | \n", "2.972 | \n", "4.914 | \n", "1.0437 | \n", "
| 2025-07-28 | \n", "118080.54 | \n", "3794.79 | \n", "182.39 | \n", "823.26 | \n", "0.7898 | \n", "25.19 | \n", "3.941 | \n", "4.609 | \n", "18.05 | \n", "1.068 | \n", "0.755 | \n", "2.592 | \n", "108.93 | \n", "0.22599 | \n", "0.7180 | \n", "2.774 | \n", "4.692 | \n", "1.0233 | \n", "
| 2025-07-29 | \n", "117875.98 | \n", "3794.85 | \n", "181.61 | \n", "804.75 | \n", "0.7834 | \n", "24.39 | \n", "3.885 | \n", "4.522 | \n", "17.79 | \n", "1.064 | \n", "0.726 | \n", "2.547 | \n", "108.24 | \n", "0.22300 | \n", "0.7070 | \n", "2.727 | \n", "4.575 | \n", "0.9713 | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 2026-02-25 | \n", "67957.93 | \n", "2057.35 | \n", "88.03 | \n", "625.47 | \n", "0.2958 | \n", "9.50 | \n", "1.639 | \n", "1.930 | \n", "9.20 | \n", "0.294 | \n", "0.123 | \n", "1.091 | \n", "56.59 | \n", "0.09994 | \n", "0.1656 | \n", "1.173 | \n", "1.002 | \n", "0.2516 | \n", "
| 2026-02-26 | \n", "67481.40 | \n", "2026.71 | \n", "85.93 | \n", "625.93 | \n", "0.2869 | \n", "9.30 | \n", "1.643 | \n", "1.901 | \n", "9.11 | \n", "0.302 | \n", "0.117 | \n", "1.033 | \n", "55.43 | \n", "0.09703 | \n", "0.1625 | \n", "1.130 | \n", "0.978 | \n", "0.2484 | \n", "
| 2026-02-27 | \n", "65882.98 | \n", "1929.82 | \n", "81.98 | \n", "614.20 | \n", "0.2771 | \n", "8.94 | \n", "1.603 | \n", "1.876 | \n", "8.68 | \n", "0.292 | \n", "0.120 | \n", "0.975 | \n", "54.55 | \n", "0.09338 | \n", "0.1559 | \n", "1.098 | \n", "0.957 | \n", "0.2421 | \n", "
| 2026-02-28 | \n", "66954.13 | \n", "1964.65 | \n", "84.30 | \n", "617.24 | \n", "0.2815 | \n", "9.18 | \n", "1.675 | \n", "1.828 | \n", "8.83 | \n", "0.310 | \n", "0.138 | \n", "1.012 | \n", "54.49 | \n", "0.09386 | \n", "0.1545 | \n", "1.177 | \n", "0.949 | \n", "0.2505 | \n", "
| 2026-03-01 | \n", "65721.17 | \n", "1939.12 | \n", "83.57 | \n", "620.71 | \n", "0.2735 | \n", "9.04 | \n", "1.538 | \n", "1.800 | \n", "8.68 | \n", "0.310 | \n", "0.121 | \n", "0.990 | \n", "53.23 | \n", "0.09182 | \n", "0.1516 | \n", "1.160 | \n", "0.909 | \n", "0.2430 | \n", "
220 rows × 18 columns
\n", "| \n", " | basket | \n", "n_folds | \n", "mean_sharpe | \n", "min_sharpe | \n", "std_sharpe | \n", "consistency | \n", "composite | \n", "
|---|---|---|---|---|---|---|---|
| 0 | \n", "OPUSDT_FILUSDT_APTUSDT | \n", "2 | \n", "4.031 | \n", "3.941 | \n", "0.090 | \n", "0.917 | \n", "4.063 | \n", "
| 1 | \n", "FILUSDT_NEARUSDT_APTUSDT | \n", "2 | \n", "4.326 | \n", "3.747 | \n", "0.579 | \n", "0.633 | \n", "3.010 | \n", "
| 2 | \n", "ADAUSDT_ATOMUSDT_CRVUSDT | \n", "2 | \n", "2.230 | \n", "2.130 | \n", "0.100 | \n", "0.909 | \n", "2.227 | \n", "
| 3 | \n", "DOTUSDT_OPUSDT_LTCUSDT | \n", "2 | \n", "1.859 | \n", "0.826 | \n", "1.033 | \n", "0.492 | \n", "1.005 | \n", "