critical: 보유 종목이 SmartScanner 필터에 걸려 SELL 신호 미생성 → 무한 홀딩 #182

Closed
opened 2026-02-20 08:57:02 +09:00 by agentson · 1 comment
Collaborator

문제 (Critical)

BUY 후 보유한 종목이 다음 사이클에서 SmartScanner의 변동성 필터에 걸려 평가 대상에서 제외됨.
결과적으로 SELL 신호가 생성되지 않아 포지션이 영구적으로 유지됨.

관찰된 현상

  • DB 기준 BUY 체결: 933건, SELL 체결: 0건
  • 총 투자금 누적: ~$1,277,914 (실제로는 paper trading 잔고 소진)
  • 보유 최대 포지션: RXT 286,748주 @ $1.39, SNSE 14,580주 @ $26.59, JELD 149,090주 @ $2.59
  • 이 종목들은 모니터링 로그에서 완전히 사라짐 (처리 대상 목록에 없음)

근본 원인

1. SmartScanner 변동성 필터

src/analysis/smart_scanner.pyvolatility_pct < 0.8 조건으로 저변동 종목 제외:

if price <= 0 or volatility_pct < 0.8:
    continue  # 보유 중이어도 변동성 낮으면 제외

2. active_stocks 갱신 방식

src/main.py:1949 — Scanner 결과만 active_stocks에 저장:

active_stocks[market.code] = smart_scanner.get_stock_codes(candidates)
# scanner에서 필터된 보유 종목은 제외됨

3. daily 세션에서 active_stocks={} (빈 딕셔너리)

src/main.py:819:

fallback_stocks = await build_overseas_symbol_universe(
    ...
    active_stocks={},  # 보유 종목 전혀 전달 안 됨
)

영향

  • SELL 체결 불가 → 수익 실현 불가능
  • 잔고 소진 → 신규 BUY 전부 실패 ("모의투자 주문가능금액이 부족합니다.")
  • 포트폴리오 집중도 위험 → 소수 종목에 전체 잔고 잠김
  • SELL 의사결정 9건이 발생했으나 (DHX), DHX는 보유하지 않은 종목

수정 방안

보유 종목은 변동성 필터를 우회하여 항상 평가 대상에 포함:

  1. build_overseas_symbol_universe에서 가져온 holdings를 SmartScanner와 별도로 유지
  2. 매 사이클 종료 후 held_stocks를 scanning universe에 강제 추가
  3. holdings는 ScanCandidatesignal="hold_check"로 표시하여 SELL 조건 평가

관련 코드

  • src/main.py:244-283 (build_overseas_symbol_universe)
  • src/main.py:815-820 (daily session, active_stocks={})
  • src/main.py:1947-1956 (realtime session, active_stocks 갱신)
  • src/analysis/smart_scanner.py:278 (변동성 필터)

테스트 검증 포인트

  • BUY 후 해당 종목이 다음 사이클 processing 목록에 포함되는지 확인
  • 저변동 보유 종목에 대해 SELL 조건 평가가 이뤄지는지 확인
## 문제 (Critical) BUY 후 보유한 종목이 다음 사이클에서 SmartScanner의 **변동성 필터**에 걸려 평가 대상에서 제외됨. 결과적으로 SELL 신호가 생성되지 않아 포지션이 영구적으로 유지됨. ## 관찰된 현상 - DB 기준 BUY 체결: 933건, SELL 체결: **0건** - 총 투자금 누적: **~$1,277,914** (실제로는 paper trading 잔고 소진) - 보유 최대 포지션: RXT 286,748주 @ $1.39, SNSE 14,580주 @ $26.59, JELD 149,090주 @ $2.59 - 이 종목들은 모니터링 로그에서 완전히 사라짐 (처리 대상 목록에 없음) ## 근본 원인 ### 1. SmartScanner 변동성 필터 `src/analysis/smart_scanner.py` — `volatility_pct < 0.8` 조건으로 저변동 종목 제외: ```python if price <= 0 or volatility_pct < 0.8: continue # 보유 중이어도 변동성 낮으면 제외 ``` ### 2. active_stocks 갱신 방식 `src/main.py:1949` — Scanner 결과만 active_stocks에 저장: ```python active_stocks[market.code] = smart_scanner.get_stock_codes(candidates) # scanner에서 필터된 보유 종목은 제외됨 ``` ### 3. daily 세션에서 active_stocks={} (빈 딕셔너리) `src/main.py:819`: ```python fallback_stocks = await build_overseas_symbol_universe( ... active_stocks={}, # 보유 종목 전혀 전달 안 됨 ) ``` ## 영향 - **SELL 체결 불가** → 수익 실현 불가능 - **잔고 소진** → 신규 BUY 전부 실패 ("모의투자 주문가능금액이 부족합니다.") - **포트폴리오 집중도 위험** → 소수 종목에 전체 잔고 잠김 - SELL 의사결정 9건이 발생했으나 (DHX), DHX는 보유하지 않은 종목 ## 수정 방안 보유 종목은 변동성 필터를 **우회**하여 항상 평가 대상에 포함: 1. `build_overseas_symbol_universe`에서 가져온 holdings를 SmartScanner와 **별도로** 유지 2. 매 사이클 종료 후 `held_stocks`를 scanning universe에 강제 추가 3. holdings는 `ScanCandidate`에 `signal="hold_check"`로 표시하여 SELL 조건 평가 ## 관련 코드 - `src/main.py:244-283` (`build_overseas_symbol_universe`) - `src/main.py:815-820` (daily session, `active_stocks={}`) - `src/main.py:1947-1956` (realtime session, active_stocks 갱신) - `src/analysis/smart_scanner.py:278` (변동성 필터) ## 테스트 검증 포인트 - BUY 후 해당 종목이 다음 사이클 processing 목록에 포함되는지 확인 - 저변동 보유 종목에 대해 SELL 조건 평가가 이뤄지는지 확인
Owner

이건 이미 구현된 항목이고, 구현 전의 로그일 것 같아.

이건 이미 구현된 항목이고, 구현 전의 로그일 것 같아.
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: jihoson/The-Ouroboros#182