WBS-7.3: GAS→Python 마이그레이션 4개 항목 추가 완료 (F15, F07, F14 재검증)
새로 완료된 항목: - F15: late_chase_gate 로직 포팅 * formulas/late_chase_gate_v1.py: is_late_chase_blocked() 구현 * tests/parity/test_late_chase_gate_parity_v1.py: 11 parity 테스트 (모두 PASS) * 두 가지 조건(explicit gate block OR risk score >= 70)을 정확히 포팅 - F07: score_thresholds 상수 모듈 추가 * formulas/score_thresholds_v1.py: SP_TAKE_PROFIT 등 17개 threshold 상수 * tests/parity/test_score_thresholds_parity_v1.py: 9 parity 테스트 (모두 PASS) * GAS THRESHOLDS 객체의 모든 값 정확히 재현 - F14 재검증: late_chase_risk_score는 GAS 유일 생산처 (Python canonical 없음) * migration_action: KEEP_IN_GAS로 확정, status: DONE 전체 테스트: 135/135 PASS 완료 현황 (총 15개 항목 중): ✅ DONE (9개): F01, F02, F03, F04, F06, F07, F09, F11, F14, F15 🔴 KEEP_IN_GAS (2개): F08, F14 🕐 TODO (4개): F05 (큰 함수), F10 (큰 함수), F12/F13 (아키텍처 결정 대기) 남은 작업: - F05/F10: 각각 100+줄 함수(calcExitSellAction_, routing)의 일부 → 다중 세션 포팅 필요 - F12/F13: KEEP_BOTH_SEPARATE_ROLES (아키텍처 결정 완료, 추가 코딩 불필요) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
"""
|
||||
Score calculation thresholds and constants.
|
||||
|
||||
F07 porting: Registers threshold values used in scoring logic.
|
||||
These are constants derived from GAS THRESHOLDS object.
|
||||
|
||||
Key thresholds:
|
||||
- SP_TAKE_PROFIT (10): Score for take-profit signal (profitPct >= 10%)
|
||||
- SP_HOLDINGS_ROTATE (20): Score for holdings rotation opportunity (EXIT_REVIEW)
|
||||
- SP_SELL_SIGNAL (40): Score for sell-ready signal (SELL_READY / TRIM)
|
||||
|
||||
Ported from: src/gas_adapter_parts/gdf_01_price_metrics.gs:260-304 (THRESHOLDS object)
|
||||
"""
|
||||
|
||||
# Exit scoring thresholds (익절 및 exit 신호 점수)
|
||||
SP_TAKE_PROFIT = 10 # Profit_Pct >= 10% (익절 후보)
|
||||
SP_HOLDINGS_ROTATE = 20 # EXIT_REVIEW / 보유주 교체 후보
|
||||
SP_SELL_SIGNAL = 40 # SELL_READY / TRIM 신호 확정
|
||||
|
||||
# Profit-taking tier targets (진입가 대비)
|
||||
TP_CORE_1 = 1.15 # core 1차 +15%
|
||||
TP_CORE_2 = 1.25 # core 2차 +25%
|
||||
TP_SAT_1 = 1.10 # satellite 1차 +10%
|
||||
TP_SAT_2 = 1.20 # satellite 2차 +20%
|
||||
TAKE_PROFIT_BASE = 10 # Base take-profit percentage threshold
|
||||
|
||||
# Time stop calendar days
|
||||
TIME_STOP_STAGE1 = 60
|
||||
TIME_STOP_STAGE2 = 30
|
||||
|
||||
# Value surge thresholds (%)
|
||||
VAL_SURGE_WATCH = 15
|
||||
VAL_SURGE_HOT = 35
|
||||
VAL_SURGE_EXHAUSTED = 50
|
||||
|
||||
# Liquidity thresholds (5D average trading value in millions KRW)
|
||||
LIQUIDITY_PREFERRED_M = 100
|
||||
LIQUIDITY_OK_M = 50
|
||||
|
||||
# Bid-ask spread thresholds (%)
|
||||
SPREAD_OK_PCT = 0.25
|
||||
SPREAD_WARN_PCT = 0.50
|
||||
|
||||
|
||||
def get_threshold(key: str) -> float:
|
||||
"""
|
||||
Get a threshold value by key name for compatibility with GAS THRESHOLDS access pattern.
|
||||
|
||||
Args:
|
||||
key: Threshold name (e.g., 'SP_TAKE_PROFIT', 'SP_SELL_SIGNAL')
|
||||
|
||||
Returns:
|
||||
Threshold numeric value
|
||||
"""
|
||||
thresholds = {
|
||||
'SP_TAKE_PROFIT': SP_TAKE_PROFIT,
|
||||
'SP_HOLDINGS_ROTATE': SP_HOLDINGS_ROTATE,
|
||||
'SP_SELL_SIGNAL': SP_SELL_SIGNAL,
|
||||
'TP_CORE_1': TP_CORE_1,
|
||||
'TP_CORE_2': TP_CORE_2,
|
||||
'TP_SAT_1': TP_SAT_1,
|
||||
'TP_SAT_2': TP_SAT_2,
|
||||
'TAKE_PROFIT_BASE': TAKE_PROFIT_BASE,
|
||||
'TIME_STOP_STAGE1': TIME_STOP_STAGE1,
|
||||
'TIME_STOP_STAGE2': TIME_STOP_STAGE2,
|
||||
'VAL_SURGE_WATCH': VAL_SURGE_WATCH,
|
||||
'VAL_SURGE_HOT': VAL_SURGE_HOT,
|
||||
'VAL_SURGE_EXHAUSTED': VAL_SURGE_EXHAUSTED,
|
||||
'LIQUIDITY_PREFERRED_M': LIQUIDITY_PREFERRED_M,
|
||||
'LIQUIDITY_OK_M': LIQUIDITY_OK_M,
|
||||
'SPREAD_OK_PCT': SPREAD_OK_PCT,
|
||||
'SPREAD_WARN_PCT': SPREAD_WARN_PCT,
|
||||
}
|
||||
return thresholds.get(key)
|
||||
Reference in New Issue
Block a user