feat: 세션 전환 시 리스크 파라미터 동적 재로딩 (#327) #344

Merged
jihoson merged 2 commits from feature/issue-327-session-risk-reload into feature/v3-session-policy-stream 2026-03-01 09:31:14 +09:00
Collaborator

Summary

  • 세션 경계에서 리스크 설정을 재로딩하는 훅 추가 (_session_risk_overrides)
  • 세션별 리스크 프로파일 JSON 설정 추가
    • SESSION_RISK_RELOAD_ENABLED
    • SESSION_RISK_PROFILES_JSON
  • 런타임 리스크 파라미터를 세션 오버라이드로 해석하도록 주요 경로 연결
    • CONFIDENCE_THRESHOLD, US_MIN_PRICE, USD_BUFFER_MIN
    • STOPLOSS_REENTRY_COOLDOWN_MINUTES, OVERNIGHT_EXCEPTION_ENABLED
    • KR_ATR_STOP_*, STAGED_EXIT_BE_ARM_PCT, STAGED_EXIT_ARM_PCT
  • 세션 전환/초기화 로그를 남기고, 파싱 실패 시 기본 설정으로 안전 폴백

Test

  • pytest -q tests/test_main.py -k "resolve_market_setting_uses_session_profile_override or stoploss_cooldown_minutes_uses_session_override or should_force_exit_for_overnight or compute_kr_dynamic_stop_loss_pct or apply_staged_exit_uses_independent_arm_threshold_settings or run_daily_session_applies_staged_exit_override_on_hold"
  • python3 -m py_compile src/main.py src/config.py tests/test_main.py

Refs: #327

## Summary - 세션 경계에서 리스크 설정을 재로딩하는 훅 추가 (`_session_risk_overrides`) - 세션별 리스크 프로파일 JSON 설정 추가 - `SESSION_RISK_RELOAD_ENABLED` - `SESSION_RISK_PROFILES_JSON` - 런타임 리스크 파라미터를 세션 오버라이드로 해석하도록 주요 경로 연결 - `CONFIDENCE_THRESHOLD`, `US_MIN_PRICE`, `USD_BUFFER_MIN` - `STOPLOSS_REENTRY_COOLDOWN_MINUTES`, `OVERNIGHT_EXCEPTION_ENABLED` - `KR_ATR_STOP_*`, `STAGED_EXIT_BE_ARM_PCT`, `STAGED_EXIT_ARM_PCT` - 세션 전환/초기화 로그를 남기고, 파싱 실패 시 기본 설정으로 안전 폴백 ## Test - `pytest -q tests/test_main.py -k "resolve_market_setting_uses_session_profile_override or stoploss_cooldown_minutes_uses_session_override or should_force_exit_for_overnight or compute_kr_dynamic_stop_loss_pct or apply_staged_exit_uses_independent_arm_threshold_settings or run_daily_session_applies_staged_exit_override_on_hold"` - `python3 -m py_compile src/main.py src/config.py tests/test_main.py` Refs: #327
agentson added 1 commit 2026-02-28 21:04:18 +09:00
feat: reload session risk profile on session transitions (#327)
Some checks failed
Gitea CI / test (pull_request) Waiting to run
Gitea CI / test (push) Has been cancelled
5facd22ef9
agentson reviewed 2026-02-28 21:16:10 +09:00
agentson left a comment
Author
Collaborator

Review: PR #344 — feat: 세션 전환 시 리스크 파라미터 동적 재로딩 (#327)

플랜 일치: ACT-10 정확히 일치

  • 세션 경계 변경 시 리스크 파라미터 재로딩
  • 세션별 프로파일 지원 (JSON 설정)
  • 재로딩 실패 시 기본 설정 유지 (안전 폴백)
  • 초기화/전환 로그 기록

아키텍처: 잘 설계됨

  • _resolve_market_setting() — 핵심 추상화. 모든 설정값 조회를 이 함수로 통일하여 세션 오버라이드를 투명하게 적용. 기존 코드 수정이 기계적으로 가능한 구조.
  • 계층적 병합: default 프로파일 + 세션별 프로파일 병합 (세션 우선) — 공통 설정과 세션별 설정을 분리할 수 있어 유연함.
  • 세션 변경 감지: _SESSION_RISK_LAST_BY_MARKET 비교로 변경 시에만 재계산 — 불필요한 반복 계산 방지.
  • JSON 파싱 캐싱: raw string 비교로 재파싱 방지 — 효율적.

코드 품질: 양호

  • _coerce_setting_value(): bool/int/float/str 타입별 안전한 변환. bool이 int의 서브클래스인 Python 특성을 고려한 순서(isinstance(default, bool) 먼저 체크) — 올바름.
  • 폴백 체인: settings 없음 → default, override 없음 → settings fallback, 파싱 실패 → 빈 dict — 3중 안전장치.
  • 적용 범위: CONFIDENCE_THRESHOLD, US_MIN_PRICE, USD_BUFFER_MIN, STOPLOSS_REENTRY_COOLDOWN_MINUTES, OVERNIGHT_EXCEPTION_ENABLED, KR_ATR_STOP_, STAGED_EXIT_ — 주요 리스크 파라미터 모두 커버.
  • 호출 위치: trading_cycle/run_daily_session/run 진입점에서 _session_risk_overrides() 호출 — 세션 전환 감지 올바름.

테스트: ⚠️ 핵심 경로는 커버되나, 엣지 케이스 부족

  • test_resolve_market_setting_uses_session_profile_override: US_PRE에서 US_MIN_PRICE=7.5 오버라이드 확인
  • test_stoploss_cooldown_minutes_uses_session_override: NXT_AFTER에서 cooldown=45분 오버라이드 확인
  • fixture cleanup: _SESSION_RISK_LAST_BY_MARKET, _SESSION_RISK_OVERRIDES_BY_MARKET clear
  • 누락: SESSION_RISK_RELOAD_ENABLED=False → 오버라이드 비활성화 테스트
  • 누락: 잘못된 JSON 파싱 실패 → 기본값 폴백 테스트
  • 누락: _coerce_setting_value 타입 변환 엣지 케이스 (bool 문자열 "true"/"false", 잘못된 int 등)

우려사항 (minor)

  • _SESSION_RISK_PROFILES_RAW/_SESSION_RISK_PROFILES_MAP 글로벌 변수가 fixture에서 초기화되지 않음. 현재 테스트에서는 각각 다른 JSON을 사용하므로 캐시 미스가 발생하여 문제없으나, 동일 JSON을 사용하는 테스트가 추가되면 상태 누출 가능. 방어적으로 fixture에 추가 권장.

결론: LGTM — 누락 테스트는 nit 수준, 핵심 기능 동작은 검증됨. 머지 후 엣지 케이스 테스트 보강 권장.

## Review: PR #344 — feat: 세션 전환 시 리스크 파라미터 동적 재로딩 (#327) ### 플랜 일치: ✅ ACT-10 정확히 일치 - 세션 경계 변경 시 리스크 파라미터 재로딩 - 세션별 프로파일 지원 (JSON 설정) - 재로딩 실패 시 기본 설정 유지 (안전 폴백) - 초기화/전환 로그 기록 ### 아키텍처: ✅ 잘 설계됨 - **`_resolve_market_setting()`** — 핵심 추상화. 모든 설정값 조회를 이 함수로 통일하여 세션 오버라이드를 투명하게 적용. 기존 코드 수정이 기계적으로 가능한 구조. - **계층적 병합**: `default` 프로파일 + 세션별 프로파일 병합 (세션 우선) — 공통 설정과 세션별 설정을 분리할 수 있어 유연함. - **세션 변경 감지**: `_SESSION_RISK_LAST_BY_MARKET` 비교로 변경 시에만 재계산 — 불필요한 반복 계산 방지. - **JSON 파싱 캐싱**: raw string 비교로 재파싱 방지 — 효율적. ### 코드 품질: ✅ 양호 - **`_coerce_setting_value()`**: bool/int/float/str 타입별 안전한 변환. bool이 int의 서브클래스인 Python 특성을 고려한 순서(`isinstance(default, bool)` 먼저 체크) — 올바름. - **폴백 체인**: settings 없음 → default, override 없음 → settings fallback, 파싱 실패 → 빈 dict — 3중 안전장치. - **적용 범위**: CONFIDENCE_THRESHOLD, US_MIN_PRICE, USD_BUFFER_MIN, STOPLOSS_REENTRY_COOLDOWN_MINUTES, OVERNIGHT_EXCEPTION_ENABLED, KR_ATR_STOP_*, STAGED_EXIT_* — 주요 리스크 파라미터 모두 커버. - **호출 위치**: trading_cycle/run_daily_session/run 진입점에서 `_session_risk_overrides()` 호출 — 세션 전환 감지 올바름. ### 테스트: ⚠️ 핵심 경로는 커버되나, 엣지 케이스 부족 - ✅ `test_resolve_market_setting_uses_session_profile_override`: US_PRE에서 US_MIN_PRICE=7.5 오버라이드 확인 - ✅ `test_stoploss_cooldown_minutes_uses_session_override`: NXT_AFTER에서 cooldown=45분 오버라이드 확인 - ✅ fixture cleanup: `_SESSION_RISK_LAST_BY_MARKET`, `_SESSION_RISK_OVERRIDES_BY_MARKET` clear - ❌ 누락: `SESSION_RISK_RELOAD_ENABLED=False` → 오버라이드 비활성화 테스트 - ❌ 누락: 잘못된 JSON 파싱 실패 → 기본값 폴백 테스트 - ❌ 누락: `_coerce_setting_value` 타입 변환 엣지 케이스 (bool 문자열 "true"/"false", 잘못된 int 등) ### 우려사항 (minor) - `_SESSION_RISK_PROFILES_RAW`/`_SESSION_RISK_PROFILES_MAP` 글로벌 변수가 fixture에서 초기화되지 않음. 현재 테스트에서는 각각 다른 JSON을 사용하므로 캐시 미스가 발생하여 문제없으나, 동일 JSON을 사용하는 테스트가 추가되면 상태 누출 가능. 방어적으로 fixture에 추가 권장. ### 결론: **LGTM** ✅ — 누락 테스트는 nit 수준, 핵심 기능 동작은 검증됨. 머지 후 엣지 케이스 테스트 보강 권장.
agentson added 1 commit 2026-02-28 22:21:01 +09:00
test: add session-risk reload edge-case coverage (#327)
Some checks are pending
Gitea CI / test (push) Waiting to run
Gitea CI / test (pull_request) Waiting to run
42c06929ea
Author
Collaborator

리뷰 확인했고 권장 테스트 항목 반영했습니다.

추가 반영:

  • SESSION_RISK_RELOAD_ENABLED=False 시 오버라이드 미적용 테스트
  • 잘못된 SESSION_RISK_PROFILES_JSON 파싱 실패 시 기본값 폴백 테스트
  • bool 문자열("false") 오버라이드 coercion 테스트
  • fixture에 세션 리스크 캐시 상태(_SESSION_RISK_PROFILES_MAP, _SESSION_RISK_PROFILES_RAW) 초기화 추가

검증:

  • pytest -q tests/test_main.py -k "resolve_market_setting_uses_session_profile_override or stoploss_cooldown_minutes_uses_session_override or ignores_profile_when_reload_disabled or falls_back_on_invalid_profile_json or coerces_bool_string_override" (5 passed)
  • python3 -m py_compile tests/test_main.py src/main.py src/config.py

반영 커밋: 42c0692

리뷰 확인했고 권장 테스트 항목 반영했습니다. 추가 반영: - `SESSION_RISK_RELOAD_ENABLED=False` 시 오버라이드 미적용 테스트 - 잘못된 `SESSION_RISK_PROFILES_JSON` 파싱 실패 시 기본값 폴백 테스트 - bool 문자열("false") 오버라이드 coercion 테스트 - fixture에 세션 리스크 캐시 상태(`_SESSION_RISK_PROFILES_MAP`, `_SESSION_RISK_PROFILES_RAW`) 초기화 추가 검증: - `pytest -q tests/test_main.py -k "resolve_market_setting_uses_session_profile_override or stoploss_cooldown_minutes_uses_session_override or ignores_profile_when_reload_disabled or falls_back_on_invalid_profile_json or coerces_bool_string_override"` (5 passed) - `python3 -m py_compile tests/test_main.py src/main.py src/config.py` 반영 커밋: `42c0692`
agentson reviewed 2026-02-28 22:28:03 +09:00
agentson left a comment
Author
Collaborator

Re-review: PR #344 — feat: 세션 전환 시 리스크 파라미터 동적 재로딩 (#327)

이전 리뷰 지적사항 반영 확인

  1. SESSION_RISK_RELOAD_ENABLED=False 테스트: 추가됨

    • test_resolve_market_setting_ignores_profile_when_reload_disabled: 프로파일 JSON에 오버라이드가 있어도 RELOAD_ENABLED=False면 기본값(5.0) 반환 확인
  2. 잘못된 JSON 폴백 테스트: 추가됨

    • test_resolve_market_setting_falls_back_on_invalid_profile_json: {invalid-json 파싱 실패 시 기본값(5.0) 반환 확인
  3. _coerce_setting_value 타입 변환 엣지 케이스 테스트: 추가됨

    • test_resolve_market_setting_coerces_bool_string_override: JSON에서 "false" 문자열이 bool False로 변환 확인
  4. 글로벌 캐시 상태 누출 방지: 해결

    • fixture에 _SESSION_RISK_PROFILES_MAP.clear() + _SESSION_RISK_PROFILES_RAW = "__reset__" 추가 — 캐시 무효화로 테스트 간 격리 보장

결론: LGTM — 모든 지적사항 반영 완료

## Re-review: PR #344 — feat: 세션 전환 시 리스크 파라미터 동적 재로딩 (#327) ### 이전 리뷰 지적사항 반영 확인 1. **SESSION_RISK_RELOAD_ENABLED=False 테스트**: ✅ 추가됨 - `test_resolve_market_setting_ignores_profile_when_reload_disabled`: 프로파일 JSON에 오버라이드가 있어도 RELOAD_ENABLED=False면 기본값(5.0) 반환 확인 2. **잘못된 JSON 폴백 테스트**: ✅ 추가됨 - `test_resolve_market_setting_falls_back_on_invalid_profile_json`: `{invalid-json` 파싱 실패 시 기본값(5.0) 반환 확인 3. **_coerce_setting_value 타입 변환 엣지 케이스 테스트**: ✅ 추가됨 - `test_resolve_market_setting_coerces_bool_string_override`: JSON에서 `"false"` 문자열이 bool `False`로 변환 확인 4. **글로벌 캐시 상태 누출 방지**: ✅ 해결 - fixture에 `_SESSION_RISK_PROFILES_MAP.clear()` + `_SESSION_RISK_PROFILES_RAW = "__reset__"` 추가 — 캐시 무효화로 테스트 간 격리 보장 ### 결론: **LGTM** ✅ — 모든 지적사항 반영 완료
jihoson merged commit 89347ee525 into feature/v3-session-policy-stream 2026-03-01 09:31:14 +09:00
jihoson deleted branch feature/issue-327-session-risk-reload 2026-03-01 09:31:14 +09:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: jihoson/The-Ouroboros#344