Commit Graph

74 Commits

Author SHA1 Message Date
ramseshk 8cb59239c6 Hallmark Cobalt header: clean professional nav
Removed: FTDT Quant Lab branding, purple badges, green pulse dot,
  shadcn Tabs dependency, backdrop blur noise
Replaced with: Hallmark Cobalt engineered aesthetic
  - Hairline borders (#e0e4ec), cool paper (#f8f9fb)
  - JetBrains Mono header labels, Inter tab buttons
  - Electric cobalt (#0ea5e9) signal accent on active tab
  - Flat text labels: Live · Paper · Historical
  - Status dot + CONNECTED/OFFLINE subtle indicator
  - No shadows, no gradients, no rounded cards
2026-08-06 03:59:41 +00:00
ramseshk 232d2dae10 Quant Report inline: embed in strategy detail view
Removed: popup button + fullscreen overlay
Added: QuantReport renders directly below trade history
  in every strategy detail view (live, paper, historical).
  White background, 6-panel layout, QF-Lib header.
2026-08-06 03:56:23 +00:00
ramseshk 79870925f7 Fix QuantReport: fuzzy file matching + proper backtestId from historical data
- API: fuzzy matcher resolves files by strategy name substring
- Frontend: backtestId now uses historical[name].name (the filename)
- Server restarted with quant_report endpoint
2026-08-06 03:50:28 +00:00
ramseshk 0e08543823 QF-Lib Quant Report: full strategy performance analytics
Backend: strategies/quant_report.py
  - equityCurve: daily PnL from trade history
  - monthlyReturns: heatmap matrix (years x months)
  - yearlyReturns: bar chart data with mean
  - monthlyReturnDistribution: histogram bins
  - qqPlot: theoretical vs observed quantiles
  - rollingStats: 6-month rolling return + volatility

API: /api/quant-report/{name}
  Computes full report from any backtest JSON file

Frontend: QuantReport.tsx
  - Strategy Performance chart (equity curve, blue line)
  - Monthly Returns heatmap (blue saturation)
  - Yearly Returns bar chart with mean line
  - Distribution histogram
  - Normal QQ plot with diagonal reference
  - Rolling Statistics (6-month, dual line)
  - QF-Lib header with logo and metadata
  - Access via QF-Lib Report button in detail view
2026-08-06 03:37:25 +00:00
ramseshk 03ebe9e795 Paper trader: 00 per strategy, match live node 8-strategy set
- Capital: 00,000 -> 00 (8 x 00)
- 12 old strategies -> 8 core strategies matching live node
- Asset distribution: 4 BTC + 4 ETH
- Removed Hawkes/DeepLOB/Cartea/Gueant/QueueImbalance imports
- Added Kalman Pairs signal generation
- All strategies share same signal logic as live node:
  BTC: OBI, Iceberg, Funding, A-S
  ETH: Pairs, Momentum, Mean Reversion, Kalman
2026-08-06 03:22:05 +00:00
ramseshk 0b8943c926 PostgreSQL persistence layer + seen_fills fix
New: strategies/persistence.py
  Tables: strategies_snap, trade_log, equity_history, fill_tracker
  Auto-creates on first use, batches inserts per tick

Fix: seen_fills loads from PG (not 2000 API fills)
  Before: every restart loaded all 2000 fills from API into
  seen_fills, blocking new fills with matching TIDs for ~20min
  After: only loads last 100 from API + full history from PG.
  New fills saved to PG immediately - survives restarts.

Live node integration:
  - write_metrics() → save_strategies() every tick
  - On fill → save_trade() to trade_log
  - On fill → TID saved to fill_tracker for cross-restart dedup
2026-08-06 03:12:10 +00:00
ramseshk 162c535c7c Lower thresholds for silent strategies:
- Funding: 3% -> 1% APR (BTC funding ~0.87%, still below)
- Kalman: Z-entry 2.0 -> 1.5 sigma
- Momentum: 1.2σ -> 1.0σ Bollinger bands
- Mean Reversion: 1.0σ -> 0.8σ VWAP deviation
2026-08-05 10:23:37 +00:00
ramseshk 941c07fe32 Per-strategy type badges with color coding + asset labels
reversal:    blue    (OBI, Mean Reversion)
  momentum:    amber   (Iceberg, Momentum Breakout)
  stat_arb:    purple  (Pairs, Kalman Pairs)
  carry:       cyan    (Funding Rate Arb)
  market_making: emerald (Avellaneda-Stoikov)

Each card now shows: [TYPE badge] [ASSET] [status] [maker/taker]
2026-08-05 10:05:43 +00:00
ramseshk bf137a08a3 Comprehensive live strategy review and fixes
Strategy asset redistribution:
  BTC-USD-PERP: OBI (0.000200), Iceberg (0.000210), A-S (0.000230), Funding (0.000220)
  ETH-USD-PERP: Pairs (0.006), Momentum (0.0005), Mean Reversion (0.0005), Kalman (0.005)

Bug fixes:
  - OBI size: 0.000200504030201000 -> 0.000200 (garbage from bad replace)
  - Iceberg: up>=7 BUY, up<=3 SELL (was both firing at up==5)
  - Kalman: unique ETH size 0.005 (was 0.006 colliding with Pairs)
  - Momentum: switched to ETH data, tighter 1.2sigma bands
  - Mean Reversion: switched to ETH data, higher vol = more signals
  - Pairs: sharper Z threshold 1.2 (was 1.5)

Strategy types (for dashboard viz):
  reversal: OBI, Mean Reversion (equity + PnL cards)
  momentum: Iceberg, Momentum (breakout visualization)
  stat_arb: Pairs, Kalman (spread + hedge ratio charts)
  carry: Funding Rate Arb (funding rate gauge)
  market_making: Avellaneda-Stoikov (quote tracking)
2026-08-05 10:03:36 +00:00
ramseshk d31d301822 Clean dashboard: remove footer links + positions panel
Removed:
  - Three footer link cards (ftdt.io, Quant Lab, Git Repo)
  - Open Positions & Orders collapsible panel
  - Unused imports (Activity, Database, TrendingUp, Collapsible)

Positions already shown live on each strategy card (Pos: 0.0000).
Dashboard is now cleaner: strategies grid + L2 Terminal button only.
2026-08-05 09:55:56 +00:00
ramseshk f198d2ccf6 L2 Terminal: full-screen SOTA order book depth map
Replaces the cramped 480px component with a full-screen
production-grade trading terminal:

  DOM Ladder (25%):
    - 40 price rows centered on mid
    - Bid/ask volume bars with opacity scaling
    - Floating mid price, volume text on both sides

  Depth Heatmap (75%):
    - Cumulative volume profile (filled gradient areas)
    - Green bid fill, red ask fill
    - Yellow dashed mid line with floating labels
    - Price axis, volume scale, imbalance gauge

  Trade Tape (30% bottom):
    - Amber trade path with colored markers
    - Sized dots (trade size proportional)
    - Latest trade callout with direction

  Header bar:
    - Live connection indicator, mid, spread, imbalance
    - Real-time trade count

Access: click L2 Depth Map button on main dashboard
Fullscreen overlay with close button, ESC to dismiss
2026-08-05 09:45:54 +00:00
ramseshk 9b1d46526b Fix strategy isolation: unique sizes + testnet meta fallback
- 6 BTC strategies now have unique sizes (0.000200-0.000250)
- Fill attribution uses tighter tolerance (1e-6) for unambiguous matching
- Testnet meta API returns null -> fallback to mainnet for perp loading
- All strategies placing orders with correct isolation
2026-08-05 09:29:29 +00:00
ramseshk e9629b698b Fix Hyperliquid WebSocket subscribe format: type -> method 2026-08-05 09:04:40 +00:00
ramseshk bfc3214967 Fix L2 tape visibility: add to OBI detail component
Root cause: OrderBookDepthMap was only in non-OBI detail branch.
When user clicked Order Book Imbalance card, the OBIDetail component
replaced the entire detail view, and the tape was never mounted.

Fix: Added OrderBookDepthMap to OBIDetail component below trade history.
Now visible in ALL strategy detail views (both OBI and non-OBI).
2026-08-05 08:58:11 +00:00
ramseshk fb231eef7c Strategy isolation fix: unique sizes + tighter fill matching
Root cause: 6 BTC strategies shared size=0.0002. Fill attribution
by size-matching always credited fills to first strategy in dict
(Order Book Imbalance), leaving other 5 with zero attributed fills.

Fix:
  OBI:     0.000200 (unchanged)
  Iceberg: 0.000210 (+5%)
  Funding: 0.000220 (+10%)
  A-S:     0.000230 (+15%)
  Momentum:0.000240 (+20%)
  MeanRev: 0.000250 (+25%)

Matching tolerance tightened 1e-5 → 1e-6 for unambiguous attribution.
Also fixed MAINNET_INFO → TESTNET_API undefined variable.
2026-08-05 08:43:48 +00:00
ramseshk 2f74e076b4 Live L2 Order Book + Trade Tape visualization (Bookmap-style)
New components:
  - hyperliquid-ws.ts: WebSocket hook for Hyperliquid L2 + trades
    - Auto-reconnect, ring buffer (500 trades)
    - Computes imbalance, total bid/ask volume, mid, spread
    - Type-safe interfaces: L2Snapshot, TradeTapeEntry

  - orderbook-depth-map.tsx: Dual-panel Canvas 2D visualization
    - Top panel (~55%): L2 volume profile histogram
      - Green bid bars (#00C853), red ask bars (#FF1744)
      - Yellow mid line (#FFEB3B) with floating price labels
      - Price axis, volume scale, orange mid marker
      - Quant overlay system: fair value, VWAP, signals
    - Bottom panel (~45%): Live trade tape
      - Amber trade path (#FFAB00)
      - Buy/sell markers (green/red dots sized by trade size)
      - Latest trade callout with side + price
    - Dark theme (#000000), monospace fonts, zero flicker

Integration:
  - Added to all strategy detail views (live tab only)
  - Renders below trade history table
  - WebSocket connects on mount, reconnects on error

Visual specification per user request:
  - Bid/ask bars: neon green/red on pure black
  - Mid line: yellow dashed with floating labels
  - Trade path: amber staircase with colored markers
  - No grid clutter, professional trading terminal aesthetic
2026-08-05 07:42:27 +00:00
ramseshk f7f47b5484 Fix Kalman Pairs historical backtest: real BTC/ETH pair data
Root cause: Kalman filter needs a cointegrated pair, but the
historical runner was feeding it synthetic noise (close vs SMA).
The Kalman filter found no mean-reverting spread, producing 0 signals.

Fix: Intercept kalman_pairs in main(), fetch real ETH candles,
run the full backtest_kalman_pairs() with BTC/ETH or X/ETH data.

Results (30-day, 720h candles, BTC/ETH pair):
  BTC: 35 trades, -0.36% PnL
  ETH: 34 trades, -0.01% PnL  (ETH/BTC pair)
  HYPE: 27 trades, -0.00% PnL (HYPE/BTC pair)
  VVV: 33 trades, -0.01% PnL  (VVV/BTC pair)

Total: 32 historical backtests (8 strategies x 4 coins)
2026-08-05 07:32:41 +00:00
ramseshk 803a38b237 Funding Rate Arb: historical backtests running (was pass/skip)
Historical runner:
  - funding_arb was just "pass" — replaced with hourly trend proxy
  - Annualizes 1h return as funding rate: rate = ret_1h * 365 * 24
  - Entry when |annual_rate| > 3%, scales strength with rate

Backtest results (30-day, 720h candles):
  BTC: +146.94% net, 75% win, 72 trades
  ETH: -13.76% net, 69% win, 87 trades
  HYPE: -0.95% net, 73% win, 63 trades
  VVV: +0.10% net, 78% win, 86 trades

Total: 32 historical backtests (8 strategies x 4 coins)
Cleaned 4 duplicate files from old names
2026-08-05 07:10:39 +00:00
ramseshk 70d43fefe0 Complete Funding Rate Arb: real API data for live + paper
New module: strategies/funding_arb.py
  - get_funding_rates(): fetches predicted funding from Hyperliquid
    Uses metaAndAssetCtxs (primary) + predictedFundings (fallback)
  - funding_arb_signal(): generates entry/exit signals
    Entry: |annual_rate| > threshold (3% testnet, 5% mainnet)
    Exit:  rate drops below 2% or flips sign
  - 30s cache to avoid rate-limiting

Live node:
  - Replaced proxy-based funding (20-period return) with real API
  - Calls get_funding_rates(use_testnet=True) every compute_signals()
  - Lowered threshold to 3% APR for testnet (lower liquidity)

Paper trader:
  - Replaced manual funding calc with unified funding_arb_signal()
  - Proper entry/exit logic with position tracking
  - 5% APR threshold for mainnet data

Current rates: BTC +0.87% APR, ETH -0.82% APR
(Arb fires when rates exceed threshold during volatility)
2026-08-05 07:09:29 +00:00
ramseshk 84efb4014a Add Kalman Pairs to all three systems: live, paper, historical
Live node:
  - Registered in STRATEGIES dict (8th strategy)
  - Signal: KalmanPairsTrader.step(eth, btc) every compute_signals()
  - Adaptive hedge ratio updates with every tick

Paper trader:
  - Registered in STRATEGIES dict
  - Signal: KalmanPairsTrader integrated into compute_signals()
  - Falls back gracefully if kalman_pairs module not importable

Historical backtests:
  - Ran for BTC, ETH, HYPE, VVV (4 files)
  - kalman_pairs_{TICKER}_*.json in results/historical/
  - Visible on dashboard under Historical tab (8 strategies x 4 coins)

Dashboard: now shows Kalman Pairs card on all three tabs.
2026-08-05 07:05:00 +00:00
ramseshk 5004b23331 Fix live node: all 7 strategies now firing (was only 1/7)
Root cause analysis:
  - Round-robin bottleneck: each strategy got attention every ~28s
  - Orders cancelled immediately: POST-ONLY orders lived <=28s, near zero fill prob
  - 5 strategies had over-tight thresholds (Iceberg 7/10, Momentum 2σ, etc.)
  - No position management: no take-profit, no opposing signal close

Fixes applied:
  1. ALL strategies execute every 4s (for name in names: parallel)
  2. Orders rest 60s before refresh (was: cancelled every round)
  3. Take-profit at 0.1% move + close on opposing signal
  4. Aggressive 0.03% offset inside spread for higher fill probability
  5. Iceberg: 7/10 -> 5/10 consecutive ticks
  6. Momentum: 2σ -> 1.5σ Bollinger breakout
  7. Mean Reversion: 1.5σ -> 1.0σ VWAP deviation
  8. Funding Arb: uses real Hyperliquid API funding rate
  9. OFI threshold kept at 0.04% (was 0.08%)

Verification:
  Post-patch log shows all 7 strategies placing orders every 4 seconds.
  Order Book Imbalance, Iceberg Detection, Funding Rate Arb, Pairs Trading
  all confirmed active in tick 12680 output.
2026-08-05 07:00:07 +00:00
ramseshk f4c8bca15a Kalman Filter Pairs Trading System — full production-grade implementation
Core engine (pure NumPy, zero external deps beyond NumPy):
- kalman_filter.py: KalmanFilter + KalmanPairsTrader
  - Time-varying observation matrix H_t = [1, X_t]
  - RTS smoother for offline analysis
  - Properties: alpha, beta, spread = Y - (alpha + beta*X)
  - Signal: z-score crossing z_entry/z_exit/z_stop thresholds

Pair discovery (pure NumPy):
- pair_discovery.py: Engle-Granger cointegration + OU half-life
  - ADF test with MacKinnon critical values (no statsmodels)
  - Half-life estimation via OLS on AR(1) residuals
  - Pair screening: cointegrated + 1-20 period half-life
  - Rolling OLS hedge ratio for baseline comparison

Production system:
- trading_system.py: KalmanPairsTradingSystem
  - Multi-pair orchestration with risk overlay
  - Capital allocation, stop-loss, drawdown controls
  - KalmanPairsConfig dataclass (YAML-compatible)

Backtesting:
- backtest.py: Walk-forward backtest with realistic execution
  - Transaction costs, capital tracking, per-trade PnL
  - Side-by-side Kalman vs rolling OLS comparison
  - Metrics: CAGR, Sharpe, Sortino, max DD, win rate, turnover

Tuning:
- tuning.py: Grid search over transition_covariance
  - Train/validation split (chronological)
  - Objective: maximize Sharpe - penalty * max_drawdown

Regime-shift test results:
  Kalman: Sharpe 2.17, beta adapts from 2.0 -> 0.5 in ~50 bars
  OLS 60d: Sharpe 0.17 (stuck on old beta)
  OLS 120d: Sharpe 0.66 (even slower adaptation)

Integration: Added to historical_runner.py as kalman_pairs strategy
2026-08-05 06:47:33 +00:00
ramseshk 5c41d232c1 Fix OBI depth map: single unified 3D surface, no subplots
- Single surface spanning -50 to +50 bps (bid left, ask right)
- Clean warm amber/gold colorscale with contour projection
- NaN/Infinity filtering on Z matrix for clean rendering
- ResizeObserver for responsive canvas sizing
- uirevision v2 for stable camera across updates
- Removed dual-subplot approach (single colorbar, single scene)
- Imbalance overlay: +0.051 style with wall detection + formula
- L2RingBuffer unchanged, l2SnapshotsToSurface produces 60-row matrix
2026-08-05 06:30:40 +00:00
ramseshk 7fd289f562 3D Order Book Depth Map: Plotly subplots (bid/ask split) + remove Three.js
- Replaced single surface with dual synchronized 3D subplots:
  Left: BID depth (green colorscale, -50 to 0 bps)
  Right: ASK depth (red colorscale, 0 to +50 bps)
- Independent colorbars per side with proper labeling
- Camera sync via scene anchor mirroring
- Contour projection on both surfaces
- Live imbalance overlay centered between subplots

Data pipeline:
- l2SnapshotsToDualSurface() splits bid/ask into separate matrices
- L2RingBuffer unchanged (60 snapshots, O(1) append)

Removed:
- depth-map-three.tsx (Three.js alternative)
- Engine toggle buttons from OBI detail
- Three.js CDN loading
2026-08-05 06:24:09 +00:00
ramseshk 8855c013a6 3D Order Book Depth Map: Plotly.js + Three.js live visualization
Architecture:
- depth-map-utils.ts: L2RingBuffer, l2SnapshotsToSurface, computeImbalance
  └─ O(1) ring buffer, 60-snapshot capacity
  └─ Surface matrix: ±50 bps × 100 resolution
  └─ Imbalance formula: I = (V_b-V_a)/(V_b+V_a) with wall detection

- depth-map-plotly.tsx: Plotly.js 3D Surface
  └─ 7-stop warm colorscale (dark→amber→gold)
  └─ contour projection, ambient+diffuse lighting
  └─ Live imbalance overlay: gauge bar + formula
  └─ uirevision for stable camera on updates

- depth-map-three.tsx: Three.js high-perf alternative
  └─ BufferGeometry + vertex colors + OrbitControls
  └─ 60fps suitable, WebGL renderer with alpha
  └─ Warm gradient matching Plotly colorscale
  └─ Double-sided faces, dark grid helper

- obi-detail.tsx: Combined strategy detail panel
  └─ Engine toggle: Plotly.js ↔ Three.js
  └─ Synthetic data generation for testing
  └─ 6-stat metrics row (PnL, BTC B&H, Sharpe, Hit Rate, Max DD, Signal)
  └─ Equity curve comparison + trade history table

- Page integration: OBI strategy triggers dedicated 3D view
2026-08-05 06:11:33 +00:00
ramseshk 156ea40e78 Add multi-ticker historical backtests: 28 results (7 strategies × 4 coins)
- Cleaned old timestamp-named files
- New files with proper ticker naming: {strategy}_{TICKER}_{timestamp}.json
- BTC, ETH, HYPE, VVV backtests for all 7 strategies
- Mean Reversion BTC: +76.42%, VVV: +0.04%, ETH: -0.12%, HYPE: -0.02%
2026-08-05 05:11:32 +00:00
ramseshk 6665d0cd2a Multi-ticker historical backtests: ticker filter + per-coin grouping
- Historical cards now deduplicated by strategy+ticker (28 entries: 7×4)
- Ticker filter bar: ALL | BTC | ETH | HYPE | VVV
- Coin badge on each card
- BacktestSummary.coin now required string field
- fetchHistorical groups by strategy · coin composite key
2026-08-05 05:11:32 +00:00
ramseshk 96ca132fa2 Fix historical runner: store actual ticker name (BTC/ETH/HYPE/VVV) not timestamp
- Added HYPE and VVV to --coin choices
- Fixed coin field to store ticker name instead of first candle timestamp
- Added coin_name parameter to simulate_strategy_on_candles
2026-08-05 05:11:32 +00:00
ramseshk a09954017e Recreate Next.js source — shadcn components, chart, types, hooks
Source files were untracked and lost during reset. Recreated:
- page.tsx (full 3-tab dashboard), layout.tsx, globals.css (shadcn theme)
- types.ts, api.ts, utils.ts
- strategy-card.tsx, equity-chart.tsx, positions-panel.tsx
- ui/ (7 shadcn wrappers: card, badge, button, table, tabs, sheet, collapsible, select)
- Config files: next.config.ts, tsconfig.json, postcss.config.mjs, components.json
2026-08-05 05:05:26 +00:00
ramseshk ac1b33a014 gitignore: exclude Next.js build artifacts from tracking 2026-08-05 04:52:43 +00:00
ramseshk eb2dc32c53 FTDT Dashboard: Next.js shadcn SOTA UI
- Next.js 16 + React + TypeScript static export
- shadcn/ui components: Card, Tabs, Badge, Sheet, Collapsible, Table
- Claude Blu 2 dark theme via oklch CSS variables
- lightweight-charts v4 for equity curve rendering
- Framer Motion for layout animations
- 3 tabs: Live Testnet, Paper Mainnet (00K), Historical
- Full-page strategy detail with equity chart + trade history
- Fee tier selector (7 official Hyperliquid tiers + staking)
- API routes prefixed with /api/ for clean Caddy proxying
- _next/ mount for Next.js static assets
- WebSocket data flowing for live metrics and paper trader
2026-08-05 04:51:58 +00:00
ramseshk e6dd16908c shadcn/ui design system — Claude Blu 2 dark theme
- Full oklch color space from tweakcn/r/themes/cmmea3qbd000004jvb99v39cd
- Semantic tokens: --background, --foreground, --card, --primary, etc.
- Backward compat mappings (--bg, --srf, --ln, --tx, --hi, etc.)
- Dark shadows with proper opacity (--shadow-xs through --shadow-xl)
- 8px scrollbar, focus rings, backdrop blurs
- Cleaner card styling with subtle borders and hover lift
- All existing JS functionality preserved
2026-08-05 03:31:10 +00:00
ramseshk 9be02b47f9 Clean architecture: Paper=Mainnet, Live=Testnet, Historical=Mainnet
- Live node: testnet-only API for prices/orderbook/instruments
  (removed mainnet fallback, added resilience wrappers)
- Paper trader: mainnet-only API — simulates with real Hyperliquid data
  $120K paper capital, 12 strategies, mainnet mark prices
- Historical backtests: mainnet candle API (unchanged, already correct)
- All three tiers: strategy_equity tracking, dynamic perp lookup,
  win_rate fix (pnl_net/pnl_gross), CSS contrast improvement
2026-08-05 03:02:50 +00:00
ramseshk 4457cdffc5 Comprehensive fix: live node resilience + CSS contrast + win_rate + equity curves
- Mainnet API fallback when testnet unavailable (prices, orderbook, instruments)
- Bypassed broken SDK instrument loading, uses raw mainnet meta API
- Dynamic BTC/ETH perp ID lookup (handles "-USD-PERP" suffix changes)
- Strategy-level equity tracking for per-strategy detail charts
- Win rate fixed: checks pnl_net/pnl_gross not just pnl field
- CSS contrast improved: --tx #6b6b7b→#9e9eae, borders/highlights brightened
- Equity curve recalculated on fee tier change (chart adjusts visually)
- Added Open Positions & Orders panel placeholder
2026-08-05 02:53:31 +00:00
ramseshk f45417c105 feat(dashboard): add REST metrics endpoints for Next.js polling
- GET /metrics — live trading metrics
- GET /metrics/paper — paper trading metrics
- Enables polling from Next.js quant-lab page via Caddy proxy
2026-08-04 18:21:13 +00:00
ramseshk 9360296ef4 Add volume requirements to fee tier dropdown labels
Each tier now shows the 14-day rolling volume threshold from the
official Hyperliquid fee schedule:
  Tier 0 → Tier 1 >$5M → Tier 2 >$25M → Tier 3 >$100M
  → Tier 4 >$500M → Tier 5 >$2B → Tier 6 >$7B
2026-08-04 09:12:55 +00:00
ramseshk 526a40b01e Rename VIP→Tier, recalculate equity curve on fee tier change
Renamed all "VIP N" to "Tier N" in config, server, and HTML dropdowns.

Added recalc_equity_curve() that rebuilds the equity curve with new
fee rates. Previously the equity curve was passed through unchanged
when switching tiers, so the chart visually stayed identical even
though PnL numbers changed. Now each tier produces its own curve.

Example OBI historical: Tier 0 equity ends at 141.5, Tier 6 at 149.7 —
the chart visibly shifts up as fees drop from 4.5bp to 2.4bp taker.
2026-08-04 09:12:07 +00:00
ramseshk 055da97a79 Fix fee tiers to match official Hyperliquid docs
Perps tiers 4-6 had wrong volume thresholds, taker rates, and
incorrect negative maker rebates (HL only has rebates via staking).

Changes (matching https://hyperliquid.gitbook.io/.../trading/fees):
  Tier 4: $250M→$500M vol, taker 0.025%→0.028%
  Tier 5: $750M→$2B vol, taker 0.020%→0.026%, maker -0.002%→0.000%
  Tier 6: $2.5B→$7B vol, taker 0.015%→0.024%, maker -0.004%→0.000%

UI dropdown labels updated to match. Chart refresh enhanced with
resize+fitContent after recalc for smooth transitions.
2026-08-04 09:04:05 +00:00
ramseshk b47948b604 Fix fee tier recalculation for historical backtests
Server: recalc endpoint now checks HISTORICAL_DIR as fallback
when file not found in BACKTEST_DIR. Previously historical backtests
returned "not found" on recalc.

Frontend: renderBTDetail now accepts pnl_net/pnl_net_pct from
recalc response (the endpoint returns pnl_net not pnl).

Verified: VIP 0 → VIP 6 on OBI historical backtest changes
net PnL from 54.31% to 66.57% with fees dropping $18.10 → $5.85.
2026-08-04 08:56:22 +00:00
ramseshk f1c2d367a0 Fix historical chart blank — ISO time strings rejected by LightweightCharts
The historical runner stores equity curve times as ISO strings like
"2026-07-05T07:00:00" but LightweightCharts only accepts Unix timestamps.
Chart was loading 721 data points but rendering blank because time values
were silently rejected.

Changes:
- renderBTDetail: convert string times to Unix timestamps before setData()
- openDetail: same conversion for live/paper detail charts
- pushEquity: same conversion for main area equity charts

All chart codepaths now handle both string ISO and numeric timestamps.
2026-08-04 08:44:12 +00:00
ramseshk 24cf3722fa Fix strategy detail charts showing empty for Live tab
Root cause: openDetail() never set equity/trades for live tab because
the live node doesn't send per-strategy equity or per-strategy trades.
The live WS sends overall equity_history[] and trades[] array.

Changes:
- Live tab: uses overall equity_history for chart, filters trades[]
  by strategy name
- Paper tab: uses per-strategy strategy_equity[name]
- Chart data: handles both array (live) and dict (paper) equity formats
- Backtest: unchanged, already works (720 pts)
- Historical: unchanged, already works (721 pts)

All four detail charts now render:
  Live: 600 equity pts + filtered trade rows
  Paper: per-strategy equity + trades
  Backtest: 720 equity pts + 100 trades
  Historical: 721 equity pts from mainnet candles
2026-08-04 08:38:14 +00:00
ramseshk 2538ccc456 Add equity curve charts to Live and Paper main tabs
Two LightweightCharts area-series charts added below strategy cards
in Live and Paper tabs. Each chart renders equity_history from the
WebSocket data stream, updating on every tick.

Changes:
- chart-live and chart-paper containers with 220px height
- initMainCharts() creates chart instances + area series
- pushEquity() converts equity points to chart data, auto-fits view
- renLive() and renPaper() push equity_history to respective charts
- .main-chart CSS for dark-theme background
- init chain calls initMainCharts() after initDetChart()

Live chart: 600 data points rendering on first load
Paper chart: loads on tab activation, 600 points
2026-08-04 08:17:46 +00:00
ramseshk 275d9231a6 Fix historical backtests tab not showing data
Root cause: switchTab() didn't show the historical panel (pnl-historical).
Added panel visibility toggle and tab highlight for 'historical' tab.

Also fixed broken JS quote escaping in loadHistBT function — ''+s+''
was missing backslash-escaped quotes, causing "Unexpected string" syntax
error that prevented the entire script from executing.

Historical tab now shows 7 real-data backtest cards from Hyperliquid
mainnet candles.
2026-08-04 07:45:23 +00:00
ramseshk 9bfadaec27 Merge risk analytics panel into dashboard HTML (recovered from subagent)
Risk panel now shows below strategy grid: VaR 95%, CVaR 95%, Max DD,
Calmar ratio, Sharpe, Sortino. Strategy correlation summary with
color-coded ρ values (red=high >0.7, amber=medium). Auto-refreshes
when paper data updates (throttled 30s). Collapsible with ▶ toggle.
2026-08-04 07:33:43 +00:00
ramseshk 1bf54b4c00 Add real historical backtesting with Hyperliquid mainnet candle data
backtests/historical_runner.py: Fetches real 1h candles from Hyperliquid
mainnet API (candleSnapshot endpoint). Runs all 7 strategies against
actual BTC price history (721 candles, 30 days, $63,024→$63,605).
Each strategy's signal logic operates on real OHLCV data with
configurable fee tiers. Saves to backtests/results/historical/.

Results on 30d BTC data at VIP0:
  Mean Reversion: +93.87% net (Sharpe 0.94)
  Order Book Imbalance: +54.31% net (Sharpe 1.03)
  Avellaneda-Stoikov: -1.02% net (Sharpe -0.13)
  Iceberg Detection: -33.20% net
  Momentum Breakout: -54.72% net

Server: Added /api/backtests/historical (list) and
/api/backtest/historical/{name} (full data) endpoints.

Dashboard: Added "Historical" tab with "Real Data" badge. Cards show
coin + mainnet source. Click opens the same detail panel with fee
tier dropdown and equity chart.
2026-08-04 07:29:51 +00:00
ramseshk 0c0d2124ad Add Hyperliquid fee tier selector — 7 VIP levels × 7 staking tiers
config/fee_tiers.py: complete Hyperliquid fee schedule with perps and spot
base rates plus staking discount multipliers. effective_rate() computes
the actual fee after staking discount. get_perp_fees() returns the
effective rate for a given VIP tier, staking tier, and fee model.

Backtest runner: added --fee-tier (0-6) and --staking-tier flags.
Regenerated all 12 backtests at VIP 0 baseline. Runner now shows fee tier
info at startup.

Server: /api/backtest/{name}/recalc endpoint accepts ?fee_tier=X&staking_tier=Y
and returns recalculated PnL with the new fee structure. On-the-fly
recalculation — no need to re-run the backtest.

Dashboard: VIP tier dropdown (VIP 0-6) and staking tier dropdown
(None/Wood/Bronze/Silver/Gold/Platinum/Diamond) in backtest detail panel.
Changing either instantly recalculates PnL via the API.

Key finding: Cartea-Jaimungal goes from -5.58% net at VIP0 to +2.39% net
at VIP6+Diamond (maker rebate: exchange pays YOU -0.0024% to provide
liquidity). Fee structure completely changes strategy viability assessment.
2026-08-04 07:26:40 +00:00
ramseshk ecfdd56d8f Add fee-toggle for backtests, CSV trade download, fee simulation in runner
Backtest runner: added per-trade fee simulation (maker 2bps, taker 5bps).
Each trade now records pnl_gross, pnl_net, and fee. New --no-fees flag
excludes fees from PnL. Output includes pnl_gross/pnl_gross_pct and
fees_total alongside existing pnl (net). Regenerated all 12 backtests.

Server: added /api/backtest/{name}/csv endpoint — returns trades as CSV
with columns time,side,size,price,pnl_gross,pnl_net,fee.
Content-Disposition: attachment triggers browser download.

Dashboard: added "Inc. fees" checkbox toggle in backtest detail panel.
Unchecking shows gross PnL (before fees). "↓ CSV" button downloads
the trade history. Both hidden when detail is closed.
2026-08-04 07:16:41 +00:00
ramseshk e4de21192a Fix dashboard backtest detail, deterministic backtest seeds, paper trader fees, live node crash guard
Backtest detail: openDetail() now fetches full backtest JSON from the API
instead of showing "Full trade data not in summary". Renders equity curve
chart + full trade history table with 100 rows.

Backtest reproducibility: replaced hash(key) with fixed per-strategy seeds.
Python's hash() is randomized per process (PYTHONHASHSEED), causing wildly
different results for same strategy across runs. Now deterministic.

Server: added total_trades and sortino to /api/backtests summary response.

Paper trader: fixed Avellaneda-Stoikov simulate using TAKER_FEE instead of
MAKER_FEE. Lowered OBI signal threshold from 5bps to 1.5bps for flat markets.

Live node: added None-guard in get_mark_prices — Hyperliquid testnet API
sometimes returns null, crashing the node. Wrapped in try/except.
2026-08-04 07:07:15 +00:00
ramseshk 1c83fd378e Fix backtest tab: match API field names pnl_pct, max_dd 2026-08-04 06:42:47 +00:00
ramseshk cc2b7df740 Professional dashboard: strategy detail panel with chart, trades, and signal reasons 2026-08-04 06:30:36 +00:00