14522262e6
Reset del progetto su fondamenta verificate dopo la scoperta che l'intera libreria "validata OOS" era artefatto di feed contaminato (print fantasma del feed Cerbero TESTNET + storico Binance/USDT). - Storico ricostruito da Deribit MAINNET (ccxt pubblico, tokenless) e CERTIFICATO (certify_feed.py): BTC/ETH puliti su TUTTA la storia (mediana 2-6 bps vs Coinbase USD), integrita' OHLC + coerenza resample (maxΔ 0.00) + cross-venue OK. Alt esclusi (illiquidi/divergenti: LTC/DOGE 50-82% barre flat; XRP/BNB non certificabili). - Verdetto sul feed pulito: FADE / PAIRS / XS01 / TSM01 morti (ogni portafoglio Sharpe -2.3..-3.0, DD ~40%); solo SH01 e frammenti HONEST con segnale residuo, da ri-validare in isolamento. - Cleanup "restart pulito": strategie, stack live (src/live, src/portfolio, runner/executor, yml, docker), ~100 script ricerca/gate, waste/games/ portfolios, dati non certificati + cache e 60+ diari -> archiviati in Old/ (preservati, non cancellati). Diario consolidato in un unico documento. - Skeleton ricerca tenuto: Strategy ABC + indicatori + src/fractal + src/backtest/engine + load_data; tool dati certificati (rebuild_history, certify_feed, audit_feed, multi_source_check). - Universo dati ATTIVO: solo BTC/ETH (5m/15m/1h); guardrail fisico (load_data su alt -> FileNotFoundError). Esecuzione DISABILITATA, conto flat. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
51 lines
1.8 KiB
Python
51 lines
1.8 KiB
Python
"""TR01 — EMA Trend Following (long-only), timeframe 4h.
|
|
|
|
Cavalca i trend rialzisti, si mette in cash nei downtrend. Niente short
|
|
(shortare cripto perde OOS nel campione 2018-2026). Complementare a DIP01:
|
|
DIP01 guadagna nei regimi di reversione, TR01 nei regimi di trend.
|
|
|
|
Logica:
|
|
1. EMA fast (20) e EMA slow (100) sul close
|
|
2. LONG quando EMA_fast > EMA_slow (uptrend), altrimenti CASH
|
|
3. posizione continua, decisione a close[i] (no look-ahead);
|
|
fee solo sui cambi di stato (poche operazioni = fee non letali)
|
|
|
|
Validazione (netto, fee 0.10% RT, leva 3x, pos 15%, OOS = ultimo 30%):
|
|
robusto FULL+OOS su 5/8 asset: BNB(+14), BTC(+27), DOGE(+53), SOL(+7), XRP(+29) OOS.
|
|
ETH ~flat, ADA/LTC negativi OOS -> preferire BNB/BTC/DOGE/SOL/XRP.
|
|
Dettagli in scripts/analysis/honest_final.py / honest_trend.py.
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
PROJECT_ROOT = Path(__file__).resolve().parents[2]
|
|
sys.path.insert(0, str(PROJECT_ROOT))
|
|
|
|
from scripts.analysis.honest_trend import ( # noqa: E402
|
|
simulate_position, ema_dual_signal, oos as trend_oos,
|
|
)
|
|
from scripts.analysis.honest_lab import get_df
|
|
|
|
ASSETS = ["BNB", "BTC", "DOGE", "SOL", "XRP"]
|
|
FAST, SLOW, TF = 20, 100, "4h"
|
|
|
|
|
|
def run():
|
|
print("=" * 90)
|
|
print(f" TR01 EMA TREND {FAST}/{SLOW} long-only | {TF} | netto fee 0.10% RT leva 3x pos 15%")
|
|
print("=" * 90)
|
|
print(f" {'Asset':<6s}{'Flip':>6s}{'FULL%':>9s}{'OOS%':>9s}{'DD%':>6s}{'Exp%':>6s}{'AnniPos':>9s}")
|
|
for a in ASSETS:
|
|
df = get_df(a, TF)
|
|
sig = ema_dual_signal(df, FAST, SLOW, long_only=True)
|
|
f = simulate_position(sig, df)
|
|
o = trend_oos(sig, df)
|
|
print(f" {a:<6s}{f['flips']:>6d}{f['ret']:>+9.0f}{o['ret']:>+9.0f}"
|
|
f"{f['dd']:>6.0f}{f['exposure']:>6.0f}{str(f['pos_years'])+'/'+str(f['n_years']):>9s}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
run()
|