auto: 일일 백업 2026-06-11 02:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -65,6 +65,44 @@ def seed_from_sweep(n: int = 3) -> list[dict]:
|
||||
return variants
|
||||
|
||||
|
||||
def sync_label_tops(results: dict) -> dict:
|
||||
"""sweep 결과에서 세부 유형(시장적합 라벨)별 1위를 비교군과 동기화 — 수동 추가/제거 불필요.
|
||||
|
||||
파라미터가 같은 변이는 계좌 유지, 빠진 유형 대표는 추가, 더는 대표가 아닌 변이는 삭제.
|
||||
(2026-06-10 기준전략 폐지 — 메인 제외 규칙 삭제, 유형별 1위 전부 변이로.)"""
|
||||
|
||||
def _k(p):
|
||||
return json.dumps({k: float(v) for k, v in (p or {}).items()}, sort_keys=True)
|
||||
|
||||
def _sk(r):
|
||||
w = r.get('worst_ret')
|
||||
return (w if w is not None else -999,
|
||||
r['test'].get('total_return_pct', -999) or -999)
|
||||
|
||||
from .sim_web import _market_fit_summary # 함수 레벨 import (순환 회피)
|
||||
uniq = {}
|
||||
for r in results.get('results', []):
|
||||
uniq.setdefault(_k(r['params']), r)
|
||||
by_label = {}
|
||||
for r in uniq.values():
|
||||
lbl = _market_fit_summary(r['params'])
|
||||
if lbl not in by_label or _sk(r) > _sk(by_label[lbl]):
|
||||
by_label[lbl] = r
|
||||
desired = {_k(r['params']): r['params'] for r in by_label.values()}
|
||||
current = {_k(v['params']): v for v in load_variants()}
|
||||
removed = added = 0
|
||||
for k, v in current.items():
|
||||
if k not in desired:
|
||||
remove_variant(v['id'])
|
||||
removed += 1
|
||||
for k, p in desired.items():
|
||||
if k not in current:
|
||||
if add_variant(p):
|
||||
added += 1
|
||||
return {'labels': len(by_label), 'added': added, 'removed': removed,
|
||||
'kept': len(current) - removed}
|
||||
|
||||
|
||||
def add_variant(params: dict) -> dict | None:
|
||||
"""단일 params 조합을 변이로 추가 (백테스트 행 → 비교군). 이미 있으면 None."""
|
||||
variants = load_variants()
|
||||
|
||||
Reference in New Issue
Block a user