ramseshk
268fe606fa
fix: clear stale __pycache__ causing 'datetime is not defined' error
2026-08-10 14:03:56 +08:00
ramseshk
e71b47ac56
refactor: VBT sidebar — cleaner UX with grouped sections + collapsible fee tiers
...
Sidebar reorganized into clear sections:
[FILTERS] — Strategy + Asset + Interval + Sort
▶ Fee Tiers — collapsible (hidden by default), shows summary
T0 + staking tier name when collapsed
[NEW BACKTEST] — compact: Strategy (short names) + Interval + Limit
Row 2: Coin + ▶ Run button (side by side) + ↻ Refresh
[RESULTS] — count header + list + pagination
Removed:
- Full-width run strategy row (now inline with interval/limit)
- Duplicate fee tier labels in select options
- Separate run/refresh button row (now same row as coin)
Added:
- toggleFeeTiers() — expand/collapse fee settings
- updateFeeSummary() — shows current tier in collapsed label
- Fee changes auto-recalculate (no manual onchange needed)
- Section headers: small uppercase labels
2026-08-10 12:58:37 +08:00
ramseshk
0486e8c93f
feat: VBT overview + light mode + /api/vbt/summary
...
dashboard/static/vbt.html — complete rewrite:
- CSS variables for theming (--bg, --text, --blue, etc.)
- Light mode toggle (☀/☾) persisted in localStorage
- Plotly charts update colors on theme switch
- Overview panel on load: strategy cards + heatmap
- Strategy cards: best Sharpe, best return, top combo,
+Sharpe %, run count. Click to filter.
- Heatmap: color-coded strategy×interval table
(green>2, green>0.5, yellow>0, orange>-0.5, red)
- Back-to-overview button on detail view
- Default sort: Sharpe (was date)
dashboard/server.py:
- New /api/vbt/summary endpoint:
Per-strategy best (Sharpe, Return, Calmar, trades,
positive-Sharpe %, top combo)
Heatmap: strategy×interval best Sharpe matrix
Tests: 241 passing (excl. Hawkes)
2026-08-10 12:38:31 +08:00
ramseshk
b7c7fbb0af
feat: VBT dashboard overview — strategy cards + heatmap + /api/vbt/summary
...
dashboard/server.py — new /api/vbt/summary endpoint:
- Aggregated per-strategy best stats (Sharpe, Return, Calmar, trades,
positive-Sharpe %, top combo details)
- Heatmap: strategy × interval matrix with best Sharpe per cell
dashboard/static/vbt.html — overview panel replaces empty state:
- Strategy cards grid: best Sharpe, best return, top combo,
positive-Sharpe %, run count. Click to filter sidebar.
- Heatmap: color-coded strategy × interval table (green=good,
red=bad). Hover for tooltip, click to load result.
- Back-to-overview button when viewing a strategy detail
- Overview re-shown on page load, auto-loads from /api/vbt/summary
Dashboard opens to overview → select strategy → drill into details
2026-08-10 12:03:49 +08:00
ramseshk
140b0cc360
feat: full-information live terminal — all 10 modules with coefficients
...
live/monitor_service.py — rewritten state() includes all 10:
- Hawkes: 3x3 alpha excitation matrix, mu baseline per type, beta decay
- Dealer GEX: net GEX (), pin levels, direction signal
- Tick Regime: current/next tick size, boundary price, bars-to-cross
- Triangular Arb: venue count, opportunities, best spread bps
- Sequencer: stale-state detection, P50/P99 latency, event count
- Full: prices, microstructure, HLP, whipsaw, liq, term, spoof
live.html — complete rewrite: Bloomberg-terminal 4-column grid
- Panel 1: Prices (mid, mark, oracle, premium, spread, funding)
- Panel 2: Microstructure (OBI, best bid/ask, toxicity bar, branching ratio, sequencer latency P50/P99)
- Panel 3: Composite Signals (HLP, Whipsaw w/countdown, Term Structure w/z-score, GEX w/signal, Tick Regime, Spoof probability bar)
- Panel 4: Dealer GEX (net GEX bar, pin levels, direction)
- Full-width: HLP Vault (total delta, assets, toxicity, per-coin signals)
- Wide: Hawkes Coefficients (3x3 alpha matrix, mu per type, beta)
- Liq Waterfall + Tri Arb + Sequencer + Tick Regime
- Term Structure + Funding Whipsaw with countdown
2026-08-10 10:54:54 +08:00
ramseshk
e0be9f4d40
feat: advanced microstructure — sequencer latency, dealer GEX, tick regime, triangular arb
...
4 new modules with 20 tests:
#22 Sequencer Latency Detector (live/monitors/sequencer_latency.py):
Detects stale-state windows between WebSocket and REST API.
- WebSocket vs REST timestamp delta tracking
- Transport latency percentiles (p50, p99)
- Liquidation-triggered stale-state detection
- Stale asset identification for cross-margin arbitrage
#25 Dealer GEX (microstructure/dealer_gex.py):
Dealer Gamma Exposure estimation via Black-Scholes.
- Per-strike gamma × OI × spot² GEX computation
- Pin level detection (strikes where dealers are long gamma)
- Net GEX aggregation
- Signal: fade_breakout (long gamma pinning) vs ride_momentum
(short gamma amplification)
- nearest_pin() for distance-to-magnet calculation
#30 Tick-Size Regime Exploitation (microstructure/tick_regime.py):
Detects when asset price approaches tick-size boundaries.
- Hyperliquid tick schedule (BTC 0.1/0.5, ETH 0.01/0.05, SOL 0.001/0.005)
- Boundary approach detection with configurable threshold
- Linear trend estimation for expected bars-to-cross
- Signal: widen_quotes or tighten_quotes with urgency classification
- Per-coin state tracking
#33 Triangular Latency Arb (live/monitors/triangular_arb.py):
Cross-venue A→B→C triangular arbitrage detection.
- Internal triangular: BTC-USDT → ETH-BTC → ETH-USDT
- Cross-venue: price discrepancy across slow/fast venues
- Latency gap detection between venue pairs
- Implied cross-rate computation vs direct quote
- Minimum spread threshold gating
2026-08-10 10:34:56 +08:00
ramseshk
27c096dc9e
feat: live monitoring dashboard — Bloomberg-terminal UI for all advanced modules
...
live/monitor_service.py (LiveMonitorService):
Background service running all 6 advanced monitors plus microstructure.
Polls Hyperliquid REST API every 4s for prices, books, funding.
Exposes unified state() method for the live dashboard API.
dashboard/server.py:
Added /api/monitors/status?coin=BTC — combined state of all monitors
Added /api/monitors/hlp — HLP vault state
Added /api/monitors/funding — funding whipsaw signal
Added /api/monitors/spoof — spoof detector summary
Added /live route serving the live dashboard
Monitor service auto-starts on first API request
dashboard/static/live.html:
Professional dark-themed live monitoring dashboard.
Three-column grid layout with real-time polling:
- Price panel: mid, mark, oracle, premium, spread, funding
- Microstructure panel: OBI, VPIN/toxicity bar, bid/ask depths
- Composite signal panel: HLP signal, funding whipsaw signal,
term structure signal, spoof probability bar, branching ratio
- HLP Vault panel: total delta, assets tracked, toxicity %,
overextended assets, per-coin rebalancing signals
- Bottom row: Spoof Detector, Liquidation Waterfall,
Term Structure
- Coin selector (BTC/ETH) with color-coded signal rows
- Auto-refreshes every 3s with live indicator
Access: http://localhost:9175/live
2026-08-07 18:00:48 +08:00
ramseshk
5304534e38
feat: advanced microstructure modules — HLP, Hawkes, Whipsaw, Term Structure, Liq Waterfall, Spoof Detector
...
6 new modules with 46 new tests (230 total):
#21 HLP Vault Monitor (live/monitors/hlp_vault.py):
Tracks Hyperliquid's native protocol market maker at address
0xfefefe... Queries clearinghouseState + metaAndAssetCtxs.
- Delta exposure per asset (notional + PnL)
- Overextension detection (notional exceeds M threshold)
- Rebalancing signals: fade_short when HLP too short,
fade_long when HLP too long (front-run forced rebalancing)
- Toxicity score: HLP losing money = absorbing informed flow
- Historical delta tracking
#29 Hawkes Processes (microstructure/hawkes.py):
Multivariate Hawkes calibrator for limit order book dynamics.
- MLE calibration via SGD gradient descent on log-likelihood
- Branching ratio enforcement (alpha/beta < 0.99 for stationarity)
- Intensity computation λ_i(t) with cross-excitation
- Activity forecasting (expected event count in horizon)
- Synthetic event generator (Ogata thinning)
- Pure functions: hawkes_intensity, hawkes_log_likelihood,
generate_hawkes_events
#23 Funding Whipsaw Trader (live/strategies/funding_whipsaw.py):
Premium index decay trading in final 60s of funding epoch.
- Detects deterministic convergence of premium→0 at settlement
- Time-scaled position sizing (larger closer to settlement)
- Auto-close after funding epoch completes
- Confidence scoring based on premium magnitude
#32 Term Structure Monitor (live/monitors/term_structure.py):
Perp/quarterly/bi-quarterly futures basis curve trading.
- Quarterly-perp basis with z-score anomaly detection
- BiQ-quarterly curve steepness monitoring
- Fair quarterly price via interest rate parity + funding carry
- Calendar spread signals: buy_basis, sell_basis,
curve_steepener, curve_flattener
#24 Liquidation Waterfall (live/monitors/liq_waterfall.py):
Cross-margin liquidation order prediction.
- Margin ratio tracking (equity / maintenance margin)
- Danger/critical level classification
- Asset liquidation priority: maintenance / book_liquidity ratio
(least liquid asset relative to margin = dumped first)
- Strategy output: widen_spreads on target, tighten on rest
#31 Spoof Detector (microstructure/spoof_detector.py):
Adversarial ML-style spoofing pattern recognition.
- Rule 1: Large order far from mid, cancelled immediately
- Rule 2: Cancel right before trade approaches price level
- Rule 3: Oversized order with no fill within short lifetime
- Spoof probability (rolling window ratio)
- Cancel-to-fill ratio monitoring
2026-08-07 17:52:20 +08:00
ramseshk
31c1fe7fbe
chore: sweep all strategies on HFT/intraday/intraweek intervals — 639 clean results
...
Archived all old historical/ files (zero trade prices, broken).
Removed 67 zero-trade sweep files.
Fresh sweep: 360/360 succeeded across 9 strategies
HFT (1m,5m), intraday (15m,1h,4h), intraweek (1d)
6 bar limits (100-5000), BTC + ETH for pairs
Key results by timeframe:
HFT (1m/5m, 235 files):
hurst_vpin 1m 200b S=82.05 1t +0.60%
hurst_vpin 1m 100b S=62.06 1t +0.22%
momentum 1m 100b S=31.96 2t +0.16%
NOTE: 1m results are noisy, single-trade Sharpe unreliable
INTRADAY (15m/1h/4h, 303 files):
hurst_vpin 15m 100b S=19.38 1t +0.58%
grid_mm 1h 100b S= 8.56 4t +2.50%
obi 15m 100b S= 6.95 2t +0.29%
momentum 4h 100b S= 2.91 3t +2.70%
INTRAWEEK (1d, 101 files):
hurst_vpin 1d 100b S= 1.17 1t +5.03%
grid_mm 1d 5000b S= 0.78 1t +446%*
momentum 1d 5000b S= 0.51 66t +56%
mean_rev 1d 5000b S= 0.69 111t +37%
* grid_mm 1d returns suspiciously high — likely signal artifact
VBT Dashboard: 639 results, paginated, searchable
2026-08-07 17:34:55 +08:00
ramseshk
2aca789581
fix: NaN win_rate/profit_factor/expectancy crash JSON serialization
...
Root cause: VBT produces NaN for win_rate, profit_factor, and
expectancy when all trades have zero PnL (no winners, no losers).
JSON.dumps() rejects NaN/Inf values with 'ValueError: Out of range
float values are not JSON compliant'.
Fixes:
- Add _sanitize_nan(): recursive NaN/Inf → 0.0 for JSON safety
- Apply at end of _normalize_vbt_fields (after field fixes)
- Fix win_rate check: use 'is None' instead of 'not' (0.0 is falsy)
- Previously crashing files now work:
grid_mm_BTC_4h_100b, hurst_vpin_BTC_1m_100b, etc.
2026-08-07 16:46:14 +08:00
ramseshk
745174f0e6
fix: iceberg strategy — bool dtype + consecutive spike detection
...
Root cause: iceberg signal generator produced object-dtype entries
that crashed VectorBT's numba JIT compiler with 'non-precise type
array(pyobject, 1d, C)'. All 28 sweep combos returned 0 trades.
Fixes:
- iceberg: lower vol spike threshold (1.3→1.15), require 2/3
consecutive same-direction spikes (not just single bar)
- exit when spike subsides (not arbitrary 5-bar hold)
- .astype(bool) on all entries/exits before returning from
_generate_signals, preventing numba JIT errors
Results (36/36 succeeded):
iceberg 1d 2000b BTC S=0.18 85t ret=9.38% (best)
iceberg 15m 100b BTC S=-36.34 4t ret=-0.18% (worst)
Consistently negative Sharpe except 1d interval —
volume-spike following loses on sub-daily timescales
2026-08-07 16:27:06 +08:00
ramseshk
78a170a42b
feat: VBT sweep runner — batch backtest all strategy/interval/limit/coin combos
...
backtests/sweep_runner.py:
- Generates all valid strategy x interval x limit x coin combinations
(9 strategies, 6 intervals, 6 bar limits, 2 coins = 360 combos)
- Sequential mode with configurable rate-limiting delay
- Multi-process parallel mode (ProcessPoolExecutor)
- Progress logging, ETA, summary stats
- --dry-run flag to preview without executing
- CLI: python -m backtests.sweep_runner --workers 2 --delay 1.0
Results from initial sweep (262/360 succeeded):
Best performers:
grid_mm 1h 100b S=5.08 ret=1.45% 4 trades
composite_mm 4h S=3.50 ret=1.50% 1 trade
momentum 4h 200b S=3.12 ret=5.94% 7 trades
hurst_vpin 4h 100b S=2.88 ret=1.89% 1 trade
Regime issues found:
- 1m interval: universally extreme negative Sharpe
(VBT can't model sub-minute HFT dynamics)
- iceberg: generated 0 trades across all 28 runs (signal bug)
- as_mm: many combos with 'no results' (A-S in low vol)
- mean_rev: consistent negative across all combos
Archived 67 old broken files, kept 310 clean sweep results
2026-08-07 16:14:13 +08:00
ramseshk
7d5b05b640
chore: archive 7 broken backtest files with no equity curves
...
Archived files (backtests/results/archive/):
as_mm_BTC_20260806-081121.json — 506 trades, no EC, no PnL
as_mm_ETH_20260806-081122.json — 505 trades, no EC, no PnL
as_mm_HYPE_20260806-081123.json — 510 trades, no EC, no PnL
as_mm_VVV_20260806-081123.json — 512 trades, no EC, no PnL
hurst_vpin_BTC_20260806-071308.json — 47 trades, no EC
spx_reversion_1h_20260806-073445.json — 38 trades, no EC
spx_reversion_30m_20260806-073445.json — 22 trades, no EC
Remaining: 102 files with valid equity curves (720+ points)
and meaningful Sharpe ratios + trade data
2026-08-07 15:52:04 +08:00
ramseshk
0162e83138
feat: Hyperliquid fee schedule — all tiers, staking, maker rebates
...
config/fee_tiers.py — complete rewrite:
- 7 perps fee tiers (T0-T6) matching HL docs:
T0: 0.045/0.015% → T6: 0.024/0.000%
- 7 spot fee tiers (T0-T6):
T0: 0.070/0.040% → T6: 0.025/0.000%
- 7 staking tiers (none → diamond):
multiplier 1.00 → 0.60 (40% discount)
- 3 maker rebate tiers (>0.5%, >1.5%, >3% maker ratio)
extra -0.001% to -0.003% on positive maker rates
- compute_trade_fees() — per-trade fee breakdown
- fee_tier_from_volume(), staking_tier_from_hype()
- STRATEGY_FEE_MODELS: maker/taker classification per strategy
backtests/vbt_runner.py:
- Accept vip_tier, staking_tier, maker_rebate_tier at init
- Auto-detect fee model per strategy (maker vs taker)
- compute_trade_fees() for per-trade fee calculation
- Include fee_info in result JSON
dashboard/server.py:
- /api/vbt/run accepts fee_tier/aking_tier/maker_rebate params
- Trade normalization uses proper HL fee schedule per strategy
- /api/vbt/result/{filename}/recalc — recalc trades with new tiers
- /api/vbt/fee_tiers — get full fee schedule as JSON
dashboard/static/vbt.html:
- Fee tier selector (T0-T6) + staking tier selector
- Auto-recalculate on tier change when a result is selected
- Fee rate shown in trade log header (e.g. 0.045%)
2026-08-07 15:44:43 +08:00
ramseshk
9d817ac2fa
feat: VBT trade log — show asset, entry/exit prices, Hyperliquid fees
...
Backend (vbt_runner.py):
- Add asset (BTC/ETH) to each trade record
- Compute per-trade fee using HL taker rate (0.05%)
entry_fee = size * entry_px * fee_rate
exit_fee = size * exit_px * fee_rate
- Add pnl_gross (before fees) and pnl_net (after fees)
- Add fee_rate field for transparency
Server (server.py):
- Normalize old backtest trades: add missing asset, fee,
pnl_net, pnl_gross fields
- Holyliquid default fee rate: 0.05% taker
Frontend (vbt.html):
- Trade log table now shows:
Time | Side + Asset | Size | Entry | Exit | Fee | PnL (net) | Duration
- Asset shown as inline badge in Side column
- Fee column with explicit USD amount
- PnL now explicitly labeled 'net' (after fees)
- Fallback to old 'pnl' field for legacy backtest files
2026-08-07 15:35:33 +08:00
ramseshk
9ee13a45bb
fix: LTTB downsampling crashes on string timestamps + abs→Math.abs
...
- _lttb_downsample: equity curve timestamps are ISO strings,
not numeric. Rewrote to use array indices for triangle area
instead of trying to multiply string * float.
- Fixed IndexError from reusing 'a' variable incorrectly
- Also fixed earlier: abs(dd) → Math.abs(dd) in vbt.html
2026-08-07 15:26:42 +08:00
ramseshk
870df57051
fix: dashboard errors — Math.abs, API routing, fetchHistorical guard
...
Fixes three bugs in dashboard:
1. vbt.html: bare abs(dd) → Math.abs(dd) — fixes ReferenceError
2. server.py: Add /cv/ routing for Next.js quant dashboard
- Mount _next static assets at /cv/_next (not /cv/ which eats API routes)
- Add /cv/api/* routes for backtests/historical, detail, recalc, risk
- Add /cv/ws WebSocket endpoints for live/paper metrics
- Add /cv/ catchall for Next.js HTML pages
3. dashboard-next/src/lib/api.ts: add res.ok guard to fetchHistorical()
— prevents SyntaxError when API returns HTML error pages
4. sim/maker.py: guard observe() against zero mid_price
2026-08-07 15:19:18 +08:00
ramseshk
e58c5951b7
feat: Phase 5 — integration layer (analytics pipeline, production node v2, CLI) + 12 tests
...
live/integrator.py (AnalyticsPipeline):
Real-time pipeline: data → microstructure → signals.
Accumulates book snapshots + trades, computes OBI, VPIN, microprice,
spread, depth, trade imbalance, HFT regime, and emits composite
signal with confidence and breakdown. Per-coin isolation.
live/node_v2.py (ProductionNode):
Rebuilt production node integrating ALL Phase 1-4 modules:
- REST data fetching (order book, mark prices, funding rates)
- AnalyticsPipeline per coin for real-time microstructure signals
- Treasury for position/capital/PnL/breaker management
- ToxicityFilter integration via HlMakerPool makers
- HlMakerPool for per-coin A-S quoting
- CrossVenueMonitor, FundingBasisMonitor, LiquidationRiskOverlay
- Paper trading with probabilistic fill simulation
- Dashboard metrics JSON output (equity, treasury, analytics, maker)
- Periodic status logging
cli.py (unified CLI):
Subcommands integrating all modules:
collect — Run Hyperliquid data collector to Parquet
analyze — Run microstructure analytics on stored data
simulate — Run market-making simulator on stored data
run — Start production trading node (paper or live)
backtest — Run VectorBT backtest
12 integration tests (all pass):
- AnalyticsPipeline: empty, book, trade, VPIN, emit, regime, isolation
- ProductionNode: creation, tick cycle (3 ticks), metrics JSON output
- CLI: import verification
Total test suite: 184 tests, all passing.
2026-08-07 14:54:47 +08:00
ramseshk
4f66ef36a9
feat: Phase 4 — controlled strategy deployment module + 38 tests
...
New live/ sub-modules for production-ready market making:
live/filters/toxicity.py (ToxicityFilter):
VPIN-based pre-trade filter. Accumulates buy/sell volume, computes
VPIN via microstructure module, produces quoting decision:
- allow_quoting: bool
- size_multiplier: 0.0–1.0 (graduated reduction approaching alarm)
- granular thresholds (threshold vs alarm) with smooth reduction
live/treasury.py (Treasury):
Central capital/risk management — single source of truth:
- Position tracking per coin (opening, closing, average entry)
- Realized + unrealized PnL computation
- Pre-trade constraint checks (inventory limits, fee estimates)
- Circuit breaker (drawdown, trade count, toxic fill rate, API errors)
- Liquidation distance monitoring
- Automatic cooldown reset after trip expiry
live/makers/hl_btc_eth.py:
HlMaker — per-coin market maker integrating:
- AvellanedaStoikovMaker (Phase 3) for optimal quotes
- ToxicityFilter for pre-trade gating
- Treasury for position/risk checks
HlMakerPool — manages multiple HlMaker instances with shared treasury
and coordinated observe_all()/quote_all()
live/monitors/cross_venue.py (CrossVenueMonitor):
Cross-exchange lead-lag detection via cross-correlation at multiple
lags. Spot premium (basis proxy) computation. Multi-venue summary.
live/monitors/funding_basis.py (FundingBasisMonitor):
Funding regime classification, momentum detection, carry PnL
estimation, basis spread analysis. Uses microstructure/funding.py.
live/monitors/liq_risk.py (LiquidationRiskOverlay):
Per-position liquidation distance monitoring with tiered warnings
(safe/warning/danger/critical). Recommended position reduction.
38 tests across 4 files (all pass):
test_live_filters.py (5)
test_live_maker.py (9)
test_live_monitors.py (11)
test_live_treasury.py (13)
Total test suite: 172 tests, all passing.
2026-08-07 14:47:08 +08:00
ramseshk
639dd4fb6d
feat: Phase 3 — event-driven market-making simulator + 53 tests
...
New sim/ module — 7 files + init, replays stored L2/trade data
through a realistic market-making simulation:
sim/engine.py (SimulationEngine):
Event-driven core — processes L2 updates, trades, mark prices
sequentially. Orchestrates queue model, maker quotes, fill sim,
constraints, scenarios. Supports periodic re-quoting and
stale order cancellation.
sim/queue.py (QueueModel):
Price-time FIFO queue per price level. Tracks where maker orders
sit in queue. Simulates order eating by aggressor trades.
fill_probability() — Poisson thinning model for fill odds.
sim/maker.py:
AvellanedaStoikovMaker — stochastic control quoting with
aeta, k, tau parameters. Reservation price based on inventory.
quote() and quote_with_skew() with configurable inventory tilt.
GridMaker — evenly-spaced grid quoting at N levels.
sim/fills.py:
FillSimulator — partial fills, adverse selection probability,
cancel latency (gaussian RTT). FillEvent/CancelEvent tracking.
adverse_selection_intensity() — measures post-fill price moves.
sim/constraints.py:
InventoryConstraint — long/short/net/gross position limits.
FundingConstraint — hourly funding cost estimation.
FeeSchedule — maker/taker fee calculation.
LiquidationRisk — liquidation price and safety distance.
CircuitBreaker — PnL, trade count, toxic rate, slippage trips.
ConstraintManager — unified pre-trade constraint check.
sim/scenario.py:
ScenarioEngine — randomized exchange downtimes, latency spikes,
volatility bursts. State query per sim_time for spread/trade-rate.
sim/reporter.py:
PnLReporter — component-level PnL breakdown:
spread_capture, inventory_pnl, fees, funding, adverse_selection.
SimulationStats — trade counts, fill rates, drawdown, sharpe.
Equity curve tracking and max drawdown computation.
53 new tests across 4 files (all pass):
test_sim_queue.py (12) — order placement, FIFO, fills, cancels
test_sim_maker.py (9) — A-S quotes, inventory skew, grid maker
test_sim_constraints.py (14) — limits, funding, fees, liquidation, breakers
test_sim_reporter.py (12) — PnL components, equity curve, stats
test_sim_engine.py (6) — full engine integration
Total test suite: 134 tests, all passing.
2026-08-07 14:39:59 +08:00
ramseshk
fcfc136384
feat: Phase 2 — microstructure analytics + 81 tests
...
New microstructure/ module with pure-function analytics:
microstructure/book.py:
microprice() — depth-weighted mid price
mid_price() — simple bid/ask midpoint
order_book_imbalance() — ranged [-1, 1] volume skew
depth_imbalance() — imbalance at fixed price distance
spread_stats() — spread, spread_bps, mid, bid, ask
depth_resiliency() — bid/ask volume within impact radius
queue_depletion_prob() — Poisson fill probability at level
batch_book_stats() — aggregate stats across snapshots
microstructure/trades.py:
classify_lee_ready() — Lee-Ready aggressor classification
classify_bulk_lee_ready() — batch classification with mids/bids/asks
compute_markouts() — forward mid-price change at configurable horizons
markout_summary() — mean/std/t-stat per side per horizon
trade_volume_profile() — size bucket distribution
trade_arrival_rate() — rolling trades/sec with burst detection
microstructure/toxicity.py:
compute_vpin() — volume-synchronized informed trading probability
compute_vpin_time_series() — rolling VPIN with alarm threshold
fill_toxicity() — adverse price movement post-trade
adverse_selection_ratio() — per-side adverse selection
liquidation_clustering() — cluster detection in liquidation events
microstructure/funding.py:
funding_regime() — classify regime (neutral/positive/negative/high)
funding_predictability() — AR(1) autocorrelation analysis
funding_carry_pnl() — cumulative carry PnL estimation
basis_spread() — perp premium over spot (bps)
basis_convergence_speed() — mean-reversion half-life via AR(1)
microstructure/signals.py:
composite_signal() — weighted OBI + trade + VPIN + funding signal
SignalPipeline — stateful pipeline accumulating book/trade updates
detect_hft_regime() — regime classifier for HFT strategy selection
Bug fixes in Phase 1:
- data/latency.py: proper linear-interpolation percentiles
- data/normalizer.py: UTC timezone for naive datetimes
- data/normalizer.py: detect_sequence_gap returns gap-1 (missing count)
- microstructure/toxicity.py: consistent vpin_value key in compute_vpin
81 tests across 4 test files (store, normalizer, latency, microstructure)
2026-08-07 14:34:18 +08:00
ramseshk
a7f811eb81
feat: Phase 1 — real-time & historical data system
...
New data/ module with:
- data/store.py: Parquet-based raw message storage with background writer
thread. Messages partitioned by channel/coin/date. Thread-safe queue.
Supports pyarrow Parquet with zstd compression. Includes read_range()
helper for replay.
- data/collectors/hyperliquid.py: HL WebSocket + REST collector
- WebSocket: l2Book (full book reconstruction), trades, allMids (mark prices)
- REST pollers: funding rates, predicted funding, open interest, liquidations
- Per-coin OrderBook class with snapshot/update reconstruction
- Sequence gap detection with per-coin re-snapshot on gap
- Latency tracking (exchange transport, signal, order, roundtrip)
- Periodic stats reporter (book stats + latency summary every 60s)
- CLI entrypoint: python -m data.collectors.hyperliquid --coins BTC ETH
- data/normalizer.py: Timestamp normalization (ms, s, ISO strings from
HL/Binance/Bybit/OKX/Coinbase/Deribit) + SequenceTracker with gap detection
- data/latency.py: Rolling-window latency metrics (p50/p90/p95/p99) for
transport, signal computation, order submission, and roundtrip
- Added pyarrow + aiohttp to requirements.txt
2026-08-07 14:28:21 +08:00
ramseshk
b13ce68fef
fix: inverted condition in loadResults — new API response format was falling into wrong branch
2026-08-07 14:17:03 +08:00
ramseshk
6889e06a86
feat: VBT dashboard overhaul — pagination, caching, LTTB downsampling, deep links, export, more metrics
...
- Merge vbt_server.py into server.py (eliminate duplicated VBT API)
- Add server-side pagination (offset/limit) with metadata (total, has_more)
- Add server-side ?asset= filtering to results endpoint
- Add JSON file caching with 5s TTL to avoid re-parsing on every request
- Add LTTB (Largest-Triangle-Three-Buckets) downsampling for equity curves
- Add pre-computed drawdown curve to result detail response
- Add /api/vbt/result/{filename}/csv endpoint for trade export
- Add Calmar ratio and expectancy to results metadata
- Rebuild vbt.html frontend with:
- URL hash deep-linking (#filename) for bookmarkable views
- JSON and CSV export buttons in detail panel
- More metrics: Calmar, Sortino, Expectancy, End Equity (10 total)
- Running backtest progress indicator with elapsed seconds
- Pagination controls (prev/next) with page info
- Filter/sort changes auto-apply (no manual refresh needed)
- Better error states with retry buttons
- Run strategy selector independent of filter
2026-08-07 14:14:40 +08:00
ramseshk
92ba6a564a
chore: ignore generated VBT backtest result files
2026-08-07 12:59:34 +08:00
ramseshk
887a33f278
feat: trade log table, strategy params panel, B+W color scheme
...
Dashboard:
- Trade log table: all trades with time, side, size, entry/exit price, PnL, duration
in scrollable panel below charts
- Strategy params panel: displays all coefficients (z_entry, gamma, obi_entry,
grid_levels, etc.) for the selected strategy
- Color scheme: professional black/white
• positive: #03A9F4 (light blue)
• negative: #FF5252 (red)
• neutral: #777 (gray)
• backgrounds: #0a0a0a / #111 / #181818
• borders: #222 / #333
VBT runner:
- _extract_metrics now captures trades from pf.trades.records_readable
(Avg Entry Price, Avg Exit Price, PnL, Return, Duration, Direction)
- _strategy_params() returns key coefficients per strategy type
- _empty_result includes empty trades/params
New vbt_server.py: minimal standalone dashboard (no live trading machinery,
no memory guard, no broadcast loop) — avoids crashing issues
2026-08-07 12:53:52 +08:00
ramseshk
121c67ae5f
feat: VBT dashboard — asset badges, interval/bar selectors, sort/filter
...
Dashboard (vbt.html):
- Interval selector: 1m, 5m, 15m, 1h, 4h, 1d (all Hyperliquid intervals)
- Candle limit selector: 100-5000 bars (6 levels)
- Asset selector: auto/BTC/ETH/SOL for run
- Strategy filter dropdown
- Sort dropdown: Latest, Sharpe, Return%, Min DD, Trades
- Asset badge on every result item in sidebar
- Asset interval filter for results list
- Improved layout: compact 3-row control panel
API (server.py):
- /api/vbt/results: new sort param (sharpe/return/dd/trades/date)
new interval filter, asset field with _infer_asset()
- /api/vbt/run: new coin param, interval already supported
coin suffix in saved filenames
- _infer_asset(): maps strategy names to BTC/ETH/BTC-ETH/SOL
Verified: sort=sharpe shows A-S S=+11.37, interval=1h filters
correctly, 7 dashboard controls rendered, asset badges on all items
2026-08-07 12:41:08 +08:00
ramseshk
623345c4d7
fix: normalize old backtest field names in VBT dashboard API
...
Old files used pnl_pct (not total_return_pct), max_dd (decimal,
not max_drawdown_pct %), num_periods (not n_bars), no profit_factor.
Added _normalize_vbt_fields() that:
- Maps pnl_pct/ann_return_pct → total_return_pct
- Converts max_dd (decimal) → max_drawdown_pct (percentage)
- Maps num_periods → n_bars
- Computes profit_factor from trades (gross_wins / gross_losses)
- Computes win_rate from trades if missing
Both /api/vbt/results and /api/vbt/result/{filename} now normalise.
Verified: old Cartea-Jaimungal file now shows ret=0.82%, pf=1.18, bars=720
2026-08-07 12:35:18 +08:00
ramseshk
737b24895c
fix: VBT dashboard — proper metrics display + redesigned UI
...
- Fixed total_return_pct, profit_factor, n_bars showing 0 in detail view
by using ?? operator instead of || 0 and fixing renderDetail logic
- Run Backtest now renders result directly from API response
(no re-fetch race condition)
- Redesigned UI: monospace trading terminal aesthetic
- Darker palette (#090d14 background, #0d1321 cards)
- Indigo histogram, proper grid layout
- Subtle borders (1px #1a2332), better spacing
- Status indicator with pulse animation
- Sidebar shows Sharpe, Return%, Profit Factor per result
- 8 metric cards: Return, Sharpe, DD, Win Rate, PF, Trades,
End Equity, Sortino
- Smaller, cleaner fonts, monospace throughout
- Bumped memory guard to 2GB to prevent dashboard getting killed
2026-08-07 12:31:24 +08:00
ramseshk
3606e7f92e
feat: proper Grid MM, Composite MM, Hurst/VPIN, Iceberg, A-S strategies
...
New strategies (strategies/nt/):
- GridMMNT: symmetric limit order grid around mid-price, captures spread from
oscillation. Simulates fills from candle high/low. Rebuilds grid every 20 bars.
- CompositeMMNT: weighted ensemble of OBI (30%) + A-S inventory skew (40%) +
Hurst/VPIN (30%). Votes: +1 long, -1 short, 0 neutral. Entry |score| > 0.5.
- IcebergNT: volume spike detection for whale accumulation. Dual-mode:
candle proxy (volume > avg*2.5, >= 3 consecutive same-direction) and
L2 wall detection (single level > avg*3). Exit on stop-loss/time/spike-fade.
Fixed strategies:
- Hurst/VPIN VBT: added proper VPIN proxy from candle volume (buy_vol when close
> open, sell_vol when close < open). 50-bar rolling VPIN window. Signal:
H>0.55 AND VPIN>0.25 AND |direction|>0.05. Exit: H<0.45 or direction flips.
- Hurst/VPIN paper trader: added HurstVPINLive integration (was missing entirely)
- A-S VBT: replaced placeholder spread filter with proper A-S simulation using
reservation price formula (mid - q*gamma*sigma^2*tau), inventory tracking
- A-S NT formula: fixed to standard: mid - q*gamma*sigma^2*tau (was scaled by
notional and gamma_scale improperly)
- Iceberg VBT: new volume spike detection replacing the old trend proxy
Registry: all 7 strategies now ✅ (pairs, hurst_vpin, as_mm, obi, grid_mm,
composite_mm, iceberg)
VBT backtest results (500 BTC 1h bars):
pairs: -2.81% 13 trades 38% win
hurst_vpin: -0.77% 1 trade (VPIN now active, very selective)
as_mm: -16.38% 73 trades 29% win
obi: -7.19% 15 trades 7% win
grid_mm: -4.79% 22 trades 33% win
iceberg: 0 trades (threshold strict for 1h BTC data)
2026-08-07 11:42:32 +08:00
ramseshk
37da46a016
feat: proper Order Book Imbalance strategy for BTC-USD on HL
...
strategies/nt/obi_nt.py:
- Dual-mode OBI: candle proxy (backtest) + real L2 orderbook (live)
- Volume-based imbalance: buy_vol / (buy_vol + sell_vol) over rolling window
- Entry when |imbalance| > 0.35, exit on reversion < 0.10
- Stop-loss 2%, take-profit 0.5%, cooldown 3 bars
- compute_signal(price, orderbook=None) for paper trader integration
backtests/vbt_runner.py:
- Replaced placeholder z-score with proper volume-based OBI
- Buy vol = volume where close > open, sell vol = volume where close < open
- Rolling window imbalance computation
- Parameter sweep support with 12 combos tested
Registered across: deploy.py, nt_runner.py, dashboard, strategies/nt/__init__
Verified:
- VectorBT OBI backtest: 15 trades, -7.2% on default (window=20)
- Param sweep best: w=30 t=0.35 → sharpe -0.82, 49% win, 23% DD
- Real L2 orderbook signal: BUY obi=0.880 (bids 88% of depth)
- NT backtest engine: 201 bars, 8 days, 236ms
2026-08-07 10:50:43 +08:00
ramseshk
879372f69e
merge: resolve conflicts, keep local framework changes
2026-08-06 17:52:55 +08:00
ramseshk
9cf871be46
Fix order pricing: 1-tick advantage at best bid/ask + process guard
...
A-S was quoting at best bid/ask (0% win) — orders filled but
0.04% round-trip maker fee exceeded spread capture.
Now: bid+1 / ask-1 = captures spread minus 1 tick each side.
Signal-driven strategies: same 1-tick pricing instead of
0.03% offset that crossed the book or sat too far away.
Added fcntl file lock to prevent duplicate live nodes.
Added IOC fallback (market-crossing) when post-only rejected.
A-S win rate: 0% → 25% (first 8 trades with new pricing)
2026-08-06 09:47:21 +00:00
ramseshk
6934bfdaa0
feat: VectorBT results dashboard with Plotly charts
...
Dashboard (dashboard/):
- New /api/vbt/results — list VBT backtest results with full metrics
- New /api/vbt/result/{file} — load result + equity curve (auto-decimated >500pts)
- New /api/vbt/run — run backtests on-demand from the UI
- New /api/vbt/sweep — parameter sweep as heatmap data
- New /api/vbt/strategies — list available strategy keys
- New /vbt — interactive HTML dashboard (Plotly.js):
- Equity curve chart with area fill
- Drawdown waterfall chart
- Returns distribution histogram
- Metric cards: Sharpe, Sortino, max DD, win rate, profit factor
- Strategy filter sidebar
- One-click backtest runner
- Fix BACKTEST_DIR auto-detection for local/dev paths
API verified: all 5 endpoints tested against live data
2026-08-06 17:43:47 +08:00
ramseshk
39545ac94b
fix: NT backtest engine venue registration and bar precision
...
- Fix add_venue call with required OmsType, AccountType, Money params
- Fix Bar volume precision to match instrument size_precision
- Fix subscribe_bars to use BarType not InstrumentId
- Fix _submit_order to gracefully handle NT internal API
- All tests pass: VBT, NT, signals, paper exec, param sweep
2026-08-06 17:33:52 +08:00
ramseshk
f5ffe4baee
feat: NautilusTrader + VectorBT unified framework for Hyperliquid
...
Add complete framework for testing and deploying quant strategies:
Framework (framework/):
- HyperliquidInstrumentCatalog: loads perps as NT CryptoPerpetual
- HyperliquidDataProvider: real candle/orderbook/mark-price data
- HyperliquidExecutionProvider: live + PaperExecutionProvider: simulated
- BaseHlStrategy: shared NT strategy lifecycle with signal library
- StrategyConfig: YAML-based parameter management
- DeployOrchestrator: CLI for backtest -> paper -> live pipeline
Backtesting (backtests/):
- VBTBacktestRunner: VectorBT vectorized backtests on real HL candles
- NTBacktestRunner: NautilusTrader event-driven backtest engine
NT Strategy ports (strategies/nt/):
- PairsTradingNT: BTC/ETH ratio Z-score mean reversion
- HurstVPINNT: Hurst exponent regime + VPIN flow imbalance
- ASMarketMakingNT: Avellaneda-Stoikov stochastic control MM
E2E verified: real HL candles fetch, VectorBT backtest (Sharpe 5.2
on Hurst/VPIN), instrument catalog, deploy CLI --list, strategy signals.
Existing live/node.py and paper_trader.py unchanged.
2026-08-06 17:23:49 +08:00
ramseshk
8461ed5097
Live open orders/positions + A-S gamma fix + MR 60-tick window
...
1. Live dashboard now shows real open orders (87) and positions (2)
from Hyperliquid API, cached every 5s to avoid 429 rate limit.
2. A-S gamma scaling: gamma*500K gives ~0 skew at max inventory
(was bash.003, functionally identical to naive dual-quote).
3. Mean Reversion: 60-tick window with 0.5σ threshold
(20s of 1s ticks was noise, not mean-reverting).
4. Sizes reduced for margin safety (wallet 86, 9 concurrent orders).
5. Kalman win_rate bug fixed: added net_pnl/gross_pnl field support.
2026-08-06 09:13:51 +00:00
ramseshk
2429394cd8
Deep audit fixes: A-S gamma scaling + Mean Rev window
...
1. A-S reservation price now uses gamma*500000 scaling.
Before: bash.003 skew on 4K BTC (invisible, same as naive dual-quote)
After: ~0 skew at max inventory (0.05% of mid — enough to suppress one side)
2. Mean Reversion: 20-tick → 60-tick window, threshold 1.0σ → 0.5σ.
20 seconds of 1s ticks is noise, not mean-reverting.
60 seconds captures real short-term reversion dynamics.
Fill attribution verified: BTC sizes differ by 50 μBTC, ETH by 0.0025 — all above matching tolerance.
Orderbook null guards present — no crash on failed fetch.
2026-08-06 08:34:37 +00:00
ramseshk
a6905f2691
Fix win_rate() for Kalman Pairs: add net_pnl/gross_pnl field support
...
Bug: win_rate() only checked pnl_net/pnl_gross/pnl fields,
but Kalman backtests save trades with net_pnl/gross_pnl (underscore-first).
Result: all 4 Kalman assets showed 0% win on 27-35 trades.
After fix:
BTC: 0% → 45% (16/35)
ETH: 0% → 47% (16/34)
HYPE: 0% → 51% (14/27)
VVV: 0% → 57% (19/33)
Also corrected paper trader coin assignments for Mean Reversion
and Momentum Breakout (was BTC, should be ETH).
2026-08-06 08:26:35 +00:00
ramseshk
37b8496dc2
Optimal position sizing: 4x BTC, 40x ETH utilization
...
Strategy Old→New Notional Capital Utilization
─────────────────────────────────────────────────────────
OBI (BTC) 3→1 12%→51% (4x)
Iceberg (BTC) 3→4 13%→54% (4x)
Funding (BTC) 4→8 14%→58% (4x)
A-S MM (BTC) 5→1 15%→61% (4x)
Hurst VPIN (BTC) 5→4 15%→64% (4x)
Momentum (ETH) →8 1%→38% (40x)
Mean Reversion (ETH) →3 1%→43% (45x)
Kalman Pairs (ETH) 0→8 10%→48% (5x)
Pairs Trading (ETH) 1→2 11%→52% (5x)
ETH strategies were using <1% of capital — essentially generating no PnL.
Kelly-based optimal sizing: 40-65% utilization is the sweet spot for
balancing return vs drawdown at 00/strategy scale.
2026-08-06 08:16:48 +00:00
ramseshk
74113ab624
A-S MM backtest: 4 assets with FIFO round-trip PnL
...
Results on real 5m candle data (7 days):
BTC: +0.65% PnL | 506 matched | 72% win | 1044 fills
ETH: 0.00% PnL | 505 matched | 57% win
HYPE: 0.00% PnL | 510 matched | 61% win
VVV: 0.00% PnL | 512 matched | 42% win
Side-selection via reservation price reduces adverse fills.
BTC shows clear edge: spreads are wider in absolute terms.
2026-08-06 08:11:46 +00:00
ramseshk
f9bed72b1c
Proper A-S: side selection via reservation price (not spread formula)
...
The AS optimal spread formula gives absurd spreads at crypto scale.
Real market makers quote at the MARKET spread (best bid/ask) and use
AS to decide WHEN to quote based on inventory-adjusted fair value:
r = s - q * gamma * sigma^2 * tau
If r < best_bid (long-biased) → stop quoting bid
If r > best_ask (short-biased) → stop quoting ask
If circuit breaker active → pause both sides
Decoupled: spread is market-driven, inventory skew is AS-driven.
2026-08-06 08:04:49 +00:00
ramseshk
a5de7d526f
Proper Avellaneda-Stoikov: reservation price + optimal spread model
2026-08-06 08:00:08 +00:00
ramseshk
08a95e8fe2
Proper Avellaneda-Stoikov: reservation price + optimal spread model
2026-08-06 16:00:00 +08:00
ramseshk
50f8f4f970
Refactor: review, fix, and test entire codebase
...
Live node:
- Fix null-handling for open_ords and get_fills requests
- Cap equity_history, strategy_equity at 600-1000 entries (memory leak fix)
- Dynamic strategy count in startup log
- Loop error recovery: catch exceptions, backoff 5s, continue
Dashboard server:
- Fix backtest detail API: check HISTORICAL_DIR first
- This was causing all historical detail views to show zeros
Tests (5 suites, all passing):
1. Signal generation: Mean Reversion VWAP + Momentum + Pairs + OBI
2. Backtest: SPX mean reversion on 500-point series
3. Hurst/VPIN: 15 signals from 280 dollar bars
4. Memory guard: RSS monitoring, GC thresholds
5. Dashboard API: historical listing + SPX detail
38 backtests on dashboard, 2 SPX entries with real trade data.
2026-08-06 07:52:02 +00:00
ramseshk
392bde44a0
Fix backtest detail API — check historical/ subdirectory first
...
Bug: /api/backtest/{name} only looked in backtests/results/,
but all historical backtests are saved in backtests/results/historical/.
Fix: check HISTORICAL_DIR first, then fall back to BACKTEST_DIR.
This fixes SPX backtest detail showing zero prices/fees.
2026-08-06 07:44:07 +00:00
ramseshk
6fcf5e7c7d
TradeXYZ SPX S&P 500 Mean Reversion backtest
...
Data: real Hyperliquid SPX perpetual candles (licensed S&P 500).
1h 30d: +0.26% PnL, 38 trades, 74% win rate
30m 7d: +0.14% PnL, 22 trades, 77% win rate
Strategy: Z-score mean reversion on 20-bar rolling window.
Entry at ±1.5σ, exit at ±0.3σ reversion. 1% capital per trade.
2026-08-06 07:34:55 +00:00
ramseshk
cbbd0ef941
Fix Mean Reversion VWAP bug — was never firing
...
Root cause: VWAP weighted the current price highest so dev≈0 always.
- Use prior 19 prices (exclude current) for mean/std calculation
- Compare current price vs prior mean, normalized by prior std
- Paper trader: was using BTC prices instead of ETH (wrong coin)
- Threshold unified: 1.0σ (was 1.5σ in paper, 1.0σ in live)
Backtests show BTC Mean Reversion: +76.42% PnL, 91% win, 22 trades.
2026-08-06 07:28:31 +00:00
ramseshk
ff3e68855c
Repo cleanup: README with full stack summary + .gitignore + remove stale backups
2026-08-06 07:21:04 +00:00
ramseshk
3cc68cd46a
Fix Hurst/VPIN exit logic — time-based exit (20 bars max holding)
...
Backtest on 6000 synth trades: 46 trades, 44 wins, +1.10% PnL.
Entry: H>0.52 + VPIN>0.15 + direction bias
Exit: after 20 bars OR Hurst decay below exit threshold
2026-08-06 07:13:17 +00:00