Step 3 y 4 medio preparados. Ha habido una decision es separar en dos step distintos la eleccion de estrategias y luego su optimizacion. A partir de aqui vamos a hacer una refactorizacion quirurgica de los Steps 3 y 4.

Prompt para Char GPT:
Estamos trabajando en un Trading Bot con arquitectura backend/frontend separada.

Stack:
- Backend: FastAPI (Python 3.12)
- Frontend: HTML + Vanilla JS + Tabler UI
- DB: PostgreSQL
- Cache opcional: Redis
- Proyecto estructurado bajo /src
- Carpeta /reports fuera de src

Wizard actual:

Step 1 · Data
Step 2 · Risk & Stops
Step 3 · Strategies (actualmente mezcla validación y optimización)
Step 4 · Optimization (renombrado pero no 100% ajustado aún)

Decisión arquitectónica ya tomada:
- Step 3 será Strategy Validation (parámetros fijos, sin grid)
- Step 4 será Parameter Optimization (grid min/max/step)

Importante:
- Ya he duplicado los archivos para separar Step 3 y Step 4.
- No queremos rehacer desde cero.
- Queremos hacer una refactorización quirúrgica.
- Queremos eliminar lógica de grid del Step 3.
- Queremos mantener infraestructura WF, async jobs, ranking y reporting.

Objetivo de esta sesión:
Refactorizar Step 3 (Validation) de forma limpia y profesional partiendo del código actual.

Reglas:
- No romper Step 4.
- No reescribir todo desde cero.
- Simplificar quirúrgicamente.
- Mantener coherencia de arquitectura.
- Mantener compatibilidad con Step 2 (risk snapshot heredado).
- Mantener generación de PDF.
- Mantener botón Promote to Optimization.

Te adjunto el zip completo de la carpeta src.

Analiza la estructura primero.
No escribas código todavía.
Primero dame:
1. Un diagnóstico estructural.
2. Qué archivos tocar.
3. Qué eliminar.
4. Qué simplificar.
5. Qué mantener.
6. Orden de refactorización seguro.

Después empezaremos la refactorización paso a paso.
Despues empezaremos la refactorizacion paso a paso.
This commit is contained in:
DaM
2026-02-15 17:01:00 +01:00
parent 4365366e7d
commit 547a909965
13 changed files with 2852 additions and 93 deletions

View File

@@ -94,6 +94,27 @@ def _accumulate_equity(initial: float, returns_pct: List[float]) -> List[float]:
return eq
def _build_param_values(min_v: float, max_v: float, step: float) -> List[float]:
min_v = float(min_v)
max_v = float(max_v)
step = float(step)
# Valor único si min == max
if min_v == max_v:
return [min_v]
# Valor único si step <= 1
if step <= 1:
return [min_v]
values = []
v = min_v
while v <= max_v:
values.append(v)
v += step
return values
# --------------------------------------------------
# Main
# --------------------------------------------------
@@ -166,11 +187,13 @@ def inspect_strategies_config(
strategy_class = entry["class"]
valid_params = set(entry["params"])
grid_params = set(sel.param_grid.keys())
range_params = set(sel.parameters.keys())
# 🔒 Validación estricta de parámetros
if grid_params != valid_params:
msg = f"Param grid keys {grid_params} do not match expected {valid_params}"
if range_params != valid_params:
msg = f"Parameter keys {range_params} do not match expected {valid_params}"
results.append({
"strategy_id": sid,
"status": "fail",
@@ -185,6 +208,19 @@ def inspect_strategies_config(
overall_status = "fail"
continue
# --------------------------------------------------
# Convert ranges -> param_grid real
# --------------------------------------------------
param_grid = {}
for pname, prange in sel.parameters.items():
values = _build_param_values(
min_v=prange.min,
max_v=prange.max,
step=prange.step,
)
param_grid[pname] = values
# Wrapper sizer
class _CappedSizer(type(base_sizer)):
def __init__(self, inner):
@@ -212,7 +248,7 @@ def inspect_strategies_config(
try:
wf = WalkForwardValidator(
strategy_class=strategy_class,
param_grid=sel.param_grid,
param_grid=param_grid,
data=df,
train_window=train_td,
test_window=test_td,