From 74c79aa6c1ce1c95adefcf3a8c1c337c9c1ec182 Mon Sep 17 00:00:00 2001 From: Adriano Dal Pastro Date: Wed, 3 Jun 2026 18:01:30 +0000 Subject: [PATCH] feat(live): position_size configurabile da overrides (0.5 = max impiego dei 2K senza debito margine) Co-Authored-By: Claude Opus 4.8 (1M context) --- portfolios.yml | 4 ++++ src/portfolio/runner.py | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/portfolios.yml b/portfolios.yml index 9360cd0..b219703 100644 --- a/portfolios.yml +++ b/portfolios.yml @@ -8,6 +8,10 @@ overrides: leverage: 2 # sobrio per il live reale rebalance: 1D poll_seconds: 60 + # Frazione di capitale-sleeve per posizione (canonico backtest = 0.15). + # 0.5 con leva 2x = 100% della fetta impegnata quando in posizione (max impiego + # dei 2K senza debito di margine). NB: il DD scala ~lineare (~×3.3 vs validato). + position_size: 0.5 # Esecuzione REALE su Deribit testnet, in SHADOW (sim + reale in parallelo). # Solo i 6 fade single-leg (MR01/MR02/MR07 x BTC/ETH); ordini sui LINEARI USDC # (payoff lineare = matematica del backtest; fee/PnL in USDC). Gli altri sleeve diff --git a/src/portfolio/runner.py b/src/portfolio/runner.py index eca38e4..ef14bc6 100644 --- a/src/portfolio/runner.py +++ b/src/portfolio/runner.py @@ -148,6 +148,10 @@ def run(config_path: str = "portfolios.yml"): p: Portfolio = load_active_portfolio(config_path) _ov = (yaml.safe_load(Path(config_path).read_text()) or {}).get("overrides", {}) poll = int(_ov.get("poll_seconds", 60)) + # Frazione di capitale-sleeve impegnata per posizione (default 0.15 = canonico backtest). + # Con leva 2x: notional = capital * position_size * 2. A 0.5 ogni sleeve in posizione + # impegna il 100% della sua fetta (max impiego senza debito di margine); DD scala ~lineare. + position_size = float(_ov.get("position_size", 0.15)) def _supported(s): return s.kind in ("pairs",) + _MULTI_KINDS or s.name in _STRAT_MODULE @@ -188,6 +192,7 @@ def run(config_path: str = "portfolios.yml"): for s in live_specs: ex, inst = _exec_for(s) workers[s.sid] = build_worker_for(s, alloc[s.sid], p.leverage, + position_size=position_size, executor=ex, exec_instrument=inst) # lookback (giorni) richiesto per ogni asset = max sui worker che lo usano