feat(strategy): abbandono gating settimanale — entry daily 24/7
Crypto opera 24/7: la cadenza settimanale lunedì-only era un retaggio TradFi senza giustificazione. La nuova cadenza è giornaliera (cron 0 14 * * *), con i gate quantitativi a decidere se entrare o saltare. Cambiamenti principali: * runtime/orchestrator.py — _CRON_ENTRY 0 14 * * * (era MON) * runtime/auto_pause.py — pause_until(days=) (era weeks=); minimo clamp 1 giorno (era 1 settimana) * core/backtest.py — MondayPick→DailyPick, monday_picks→daily_picks (1 pick per calendar-day all'ora target); Sharpe annualization su ~120 trade/anno (era 52) * config/schema.py — default cron daily; max_concurrent_positions 1→5; AutoPauseConfig.pause_weeks→pause_days, default 14 * runtime/option_chain_snapshot_cycle.py + orchestrator — cron */15 per accumulo continuo dataset di backtest empirico Strategy yamls (config_version 1.3.0 → 1.4.0, hash rigenerati): * strategy.yaml — max_concurrent 1→5, cap_aggregate coerente * strategy.aggressiva.yaml — max_concurrent 2→8, cap_aggregate 3200→6400, max_contracts_per_trade invariato a 16 * strategy.conservativa.yaml — max_concurrent 1→3 * tutti — pause_weeks→pause_days: 14 GUI (pages/7_📚_Strategia.py): * slider Trade/anno: range 20-200 (era 8-30), default 110, help riallineato sulla math 365 candidature × pass-rate 30-40% * card profili: versione letta dinamicamente da config_version invece che hard-coded "v1.2.0" * warning "entrambi perdono soldi" ora valuta i P/L effettivi (cons['annual_pl'], aggr['annual_pl']) invece del win_rate grezzo; aggiunto stato intermedio quando solo conservativo è in perdita Tests (450/450 passati): * test_auto_pause: pause_days, clamp ≥1 giorno * test_backtest: rinomina + ridisegno daily picks (assert su calendar-day dedupe e hour filter) * test_sizing_engine: other_open_positions=5 per cap default * test_config_loader: version 1.4.0 Docs (README + 9 file in docs/) — tutti i riferimenti weekly/lunedì allineati a daily/24-7, volume option_chain ricalcolato per cron */15 (~1.1 MB/giorno, ~400 MB/anno). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -435,7 +435,7 @@ def _compute_pl(
|
||||
- ``A`` (delta dinamico, §3.2): +1.5 pp win-rate, sl_loss × 0.95.
|
||||
- ``D`` (vol-harvest, §7-bis): 5% delle would-be-loss diventano
|
||||
harvest exit a +0.20 × credito.
|
||||
- ``F`` (auto-pause, §7-bis): −8% trade/anno (skip-week dopo
|
||||
- ``F`` (auto-pause, §7-bis): −8% trade/anno (skip-day dopo
|
||||
streak), e nei calcoli di drawdown atteso il streak_99 è
|
||||
cappato a lookback_trades=5.
|
||||
|
||||
@@ -691,8 +691,13 @@ def _render_pl_panel(
|
||||
),
|
||||
)
|
||||
trades_per_year = col_d.slider(
|
||||
"Trade / anno (post-filtri)", 8, 30, value=18, step=1,
|
||||
help="52 lunedì × probabilità di superare i filtri (30–50%).",
|
||||
"Trade / anno (post-filtri)", 20, 200, value=110, step=5,
|
||||
help=(
|
||||
"Crypto è 24/7: l'entry cycle gira ogni giorno alle 14:00 UTC "
|
||||
"(`0 14 * * *`). 365 candidature × ~30-50% pass-rate effettivo "
|
||||
"(post-filtri + cap concorrenza) ≈ 110-180/anno. Auto-pause F "
|
||||
"riduce ulteriormente di ~8% in regime drawdown."
|
||||
),
|
||||
)
|
||||
|
||||
cons_caps = _profile_caps(strategy_conservativa or strategy_main)
|
||||
@@ -746,13 +751,17 @@ def _render_pl_panel(
|
||||
features=feats_aggr,
|
||||
)
|
||||
|
||||
cons_version = getattr(
|
||||
strategy_conservativa or strategy_main, "config_version", "?"
|
||||
)
|
||||
aggr_version = getattr(strategy_aggressiva, "config_version", "?")
|
||||
col_cons, col_aggr = st.columns(2)
|
||||
with col_cons:
|
||||
_render_profile_card(
|
||||
"🛡️ Conservativa",
|
||||
cons_caps,
|
||||
cons,
|
||||
"_(golden config v1.2.0)_",
|
||||
f"_(golden config v{cons_version})_",
|
||||
features=feats_cons,
|
||||
metrics_base=cons_base if apply_features and any(feats_cons.values()) else None,
|
||||
)
|
||||
@@ -761,7 +770,7 @@ def _render_pl_panel(
|
||||
"🔥 Aggressiva",
|
||||
aggr_caps,
|
||||
aggr,
|
||||
"_(deroga §11, richiede paper trading)_",
|
||||
f"_(v{aggr_version} · deroga §11, richiede paper trading)_",
|
||||
features=feats_aggr,
|
||||
metrics_base=aggr_base if apply_features and any(feats_aggr.values()) else None,
|
||||
)
|
||||
@@ -774,14 +783,24 @@ def _render_pl_panel(
|
||||
"APR). Drawdown atteso scala con lo stesso fattore."
|
||||
)
|
||||
|
||||
if win_rate < 0.72:
|
||||
if cons["annual_pl"] < 0 and aggr["annual_pl"] < 0:
|
||||
st.error(
|
||||
"**Win rate sotto 0.72: entrambi i profili perdono soldi.** "
|
||||
"Selling vol nudo è strutturalmente neutro qui. L'edge della "
|
||||
"strategia sono i FILTRI (dealer gamma>0, no macro, "
|
||||
"liquidation≠high, bias chiaro) che alzano il win rate sopra "
|
||||
"il 0.75. Senza filtri attivi nessuno dei due profili è "
|
||||
"viable."
|
||||
f"**Entrambi i profili in perdita** (cons {cons['apr']:+.1%}, "
|
||||
f"aggr {aggr['apr']:+.1%} APR). Selling vol nudo a win rate "
|
||||
f"{win_rate:.0%} è strutturalmente non profittevole. L'edge "
|
||||
"sono i FILTRI (dealer gamma>0, no macro, liquidation≠high, "
|
||||
"bias chiaro) e i miglioramenti F+D+A+IV-RV gate, che alzano "
|
||||
"il win rate effettivo sopra ~0.75 e/o riducono i tail loss. "
|
||||
"Spunta l'opzione 'Applica gli effetti dei miglioramenti' qui "
|
||||
"sopra per vedere i numeri con i filtri attivi."
|
||||
)
|
||||
elif cons["annual_pl"] < 0:
|
||||
st.warning(
|
||||
f"**Conservativo in perdita** ({cons['apr']:+.1%} APR), "
|
||||
f"aggressivo positivo ({aggr['apr']:+.1%} APR). I miglioramenti "
|
||||
"F+D+A+IV-RV gate stanno facendo il loro lavoro sull'aggressivo. "
|
||||
"Sul conservativo i cap stretti riducono troppo il P/L atteso "
|
||||
"a questo win rate."
|
||||
)
|
||||
|
||||
# === Mini-tabella: contributo marginale di ogni feature =====
|
||||
|
||||
Reference in New Issue
Block a user