Merge branch 'main' into codex/review-function-consolidation-across-files-rhuc38
This commit is contained in:
@@ -75,6 +75,10 @@ DB_CONFIG = require_section(CONFIG, "db")
|
|||||||
PATTERN_CONFIG = require_section(CONFIG, "pattern")
|
PATTERN_CONFIG = require_section(CONFIG, "pattern")
|
||||||
TAGGING_CONFIG = require_section(CONFIG, "tagging")
|
TAGGING_CONFIG = require_section(CONFIG, "tagging")
|
||||||
RANKING_CONFIG = require_section(CONFIG, "ranking")
|
RANKING_CONFIG = require_section(CONFIG, "ranking")
|
||||||
|
DB_CONFIG = CONFIG.get("db", {})
|
||||||
|
PATTERN_CONFIG = CONFIG.get("pattern", {})
|
||||||
|
TAGGING_CONFIG = CONFIG.get("tagging", {})
|
||||||
|
RANKING_CONFIG = CONFIG.get("ranking", {})
|
||||||
|
|
||||||
UNIVERSO_XLSX = "Universo per Trading System.xlsx"
|
UNIVERSO_XLSX = "Universo per Trading System.xlsx"
|
||||||
|
|
||||||
@@ -112,6 +116,26 @@ if RP_MAX_WEIGHT is None:
|
|||||||
RP_MAX_WEIGHT = 2 / max(TOP_N_MAX, 1)
|
RP_MAX_WEIGHT = 2 / max(TOP_N_MAX, 1)
|
||||||
else:
|
else:
|
||||||
RP_MAX_WEIGHT = float(RP_MAX_WEIGHT)
|
RP_MAX_WEIGHT = float(RP_MAX_WEIGHT)
|
||||||
|
STORED_PROC = DB_CONFIG.get("stored_proc", "opt_RendimentoGiornaliero1_ALL")
|
||||||
|
N_BARS = DB_CONFIG.get("n_bars", 1305)
|
||||||
|
PTF_CURR = DB_CONFIG.get("ptf_curr", "EUR")
|
||||||
|
|
||||||
|
# Pattern-matching (iper-parametri)
|
||||||
|
WP = PATTERN_CONFIG.get("wp", 60) # lunghezza finestra pattern (barre)
|
||||||
|
HA = PATTERN_CONFIG.get("ha", 10) # orizzonte outcome (barre)
|
||||||
|
KNN_K = PATTERN_CONFIG.get("knn_k", 25) # numero di vicini
|
||||||
|
THETA = PATTERN_CONFIG.get("theta", 0.005) # soglia su outcome per generare segnale
|
||||||
|
EMBARGO = PATTERN_CONFIG.get("embargo", WP + HA)
|
||||||
|
|
||||||
|
# Tagging rule-based (soglie)
|
||||||
|
Z_REV = TAGGING_CONFIG.get("z_rev", 2.0)
|
||||||
|
Z_VOL = TAGGING_CONFIG.get("z_vol", 2.0)
|
||||||
|
STD_COMP_PCT = TAGGING_CONFIG.get("std_comp_pct", 0.15)
|
||||||
|
|
||||||
|
DAYS_PER_YEAR = 252
|
||||||
|
|
||||||
|
TOP_N_MAX = RANKING_CONFIG.get("top_n_max", 15) # numero massimo di asset ammessi
|
||||||
|
RP_MAX_WEIGHT = RANKING_CONFIG.get("rp_max_weight", 2 / max(TOP_N_MAX, 1)) # 2 x 1/15 ≈ 0.1333 = 13,33%
|
||||||
|
|
||||||
# =========================================
|
# =========================================
|
||||||
# UTILS GENERALI
|
# UTILS GENERALI
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ from __future__ import annotations
|
|||||||
import json
|
import json
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Any, Dict, List, Optional, Sequence, Tuple
|
from typing import Any, Dict, List, Optional, Sequence, Tuple
|
||||||
|
from typing import Dict, List, Optional, Sequence, Tuple
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
|
|||||||
@@ -62,6 +62,11 @@ PATTERN_CONFIG = require_section(CONFIG, "pattern")
|
|||||||
TAGGING_CONFIG = require_section(CONFIG, "tagging")
|
TAGGING_CONFIG = require_section(CONFIG, "tagging")
|
||||||
RANKING_CONFIG = require_section(CONFIG, "ranking")
|
RANKING_CONFIG = require_section(CONFIG, "ranking")
|
||||||
SIGNALS_CONFIG = require_section(CONFIG, "signals")
|
SIGNALS_CONFIG = require_section(CONFIG, "signals")
|
||||||
|
DB_CONFIG = CONFIG.get("db", {})
|
||||||
|
PATTERN_CONFIG = CONFIG.get("pattern", {})
|
||||||
|
TAGGING_CONFIG = CONFIG.get("tagging", {})
|
||||||
|
RANKING_CONFIG = CONFIG.get("ranking", {})
|
||||||
|
SIGNALS_CONFIG = CONFIG.get("signals", {})
|
||||||
|
|
||||||
BASE_DIR = Path(".")
|
BASE_DIR = Path(".")
|
||||||
UNIVERSO_XLSX = BASE_DIR / "Universo per Trading System.xlsx"
|
UNIVERSO_XLSX = BASE_DIR / "Universo per Trading System.xlsx"
|
||||||
@@ -111,6 +116,38 @@ else:
|
|||||||
BASE_CAPITAL_PER_STRATEGY = float(require_value(SIGNALS_CONFIG, "base_capital_per_strategy", "signals"))
|
BASE_CAPITAL_PER_STRATEGY = float(require_value(SIGNALS_CONFIG, "base_capital_per_strategy", "signals"))
|
||||||
MIN_TRADE_NOTIONAL = float(require_value(SIGNALS_CONFIG, "min_trade_notional", "signals"))
|
MIN_TRADE_NOTIONAL = float(require_value(SIGNALS_CONFIG, "min_trade_notional", "signals"))
|
||||||
RISK_PARITY_LOOKBACK = int(require_value(SIGNALS_CONFIG, "risk_parity_lookback", "signals"))
|
RISK_PARITY_LOOKBACK = int(require_value(SIGNALS_CONFIG, "risk_parity_lookback", "signals"))
|
||||||
|
SP_NAME_DEFAULT = DB_CONFIG.get("stored_proc", "opt_RendimentoGiornaliero1_ALL")
|
||||||
|
SP_N_DEFAULT = DB_CONFIG.get("n_bars", 1305)
|
||||||
|
PTF_CURR_DEFAULT = DB_CONFIG.get("ptf_curr", "EUR")
|
||||||
|
|
||||||
|
# Pattern recognition (come backtest)
|
||||||
|
WP = PATTERN_CONFIG.get("wp", 60)
|
||||||
|
HA = PATTERN_CONFIG.get("ha", 10)
|
||||||
|
KNN_K = PATTERN_CONFIG.get("knn_k", 25)
|
||||||
|
THETA = PATTERN_CONFIG.get("theta", 0.005) # 0,005% in decimali (identico al backtest)
|
||||||
|
Z_REV = TAGGING_CONFIG.get("z_rev", 2.0)
|
||||||
|
Z_VOL = TAGGING_CONFIG.get("z_vol", 2.0)
|
||||||
|
STD_COMP_PCT = TAGGING_CONFIG.get("std_comp_pct", 0.15)
|
||||||
|
|
||||||
|
# Exit rules (identiche al backtest)
|
||||||
|
SL_BPS = SIGNALS_CONFIG.get("sl_bps", 300.0)
|
||||||
|
TP_BPS = SIGNALS_CONFIG.get("tp_bps", 800.0)
|
||||||
|
TRAIL_BPS = SIGNALS_CONFIG.get("trail_bps", 300.0)
|
||||||
|
TIME_STOP_BARS = SIGNALS_CONFIG.get("time_stop_bars", 20)
|
||||||
|
THETA_EXIT = SIGNALS_CONFIG.get("theta_exit", 0.0) # soglia debolezza
|
||||||
|
WEAK_DAYS_EXIT = SIGNALS_CONFIG.get("weak_days_exit") # uscita IMMEDIATA in caso di debolezza (come backtest)
|
||||||
|
|
||||||
|
# Ranking e selezione Top-N per APERTURE
|
||||||
|
MAX_OPEN = SIGNALS_CONFIG.get("max_open", 15) # cap strumenti aperti oggi (come backtest)
|
||||||
|
|
||||||
|
# Allineamento al backtest v3.1.5 per il cap del Risk Parity
|
||||||
|
TOP_N_MAX = RANKING_CONFIG.get("top_n_max", MAX_OPEN)
|
||||||
|
RP_MAX_WEIGHT = RANKING_CONFIG.get("rp_max_weight", 2 / max(TOP_N_MAX, 1)) # ≈ 0.1333 = 13,33% per singolo asset
|
||||||
|
|
||||||
|
# Sizing
|
||||||
|
BASE_CAPITAL_PER_STRATEGY = SIGNALS_CONFIG.get("base_capital_per_strategy", 100.0)
|
||||||
|
MIN_TRADE_NOTIONAL = SIGNALS_CONFIG.get("min_trade_notional", 0.01)
|
||||||
|
RISK_PARITY_LOOKBACK = SIGNALS_CONFIG.get("risk_parity_lookback", 60)
|
||||||
|
|
||||||
# Calendario
|
# Calendario
|
||||||
BUSINESS_DAYS_ONLY = True
|
BUSINESS_DAYS_ONLY = True
|
||||||
|
|||||||
Reference in New Issue
Block a user