본문 바로가기
Project Archive/Quant & Auto Trading

[자동매매] 실전운영 9일차 - 우리로 사건, 4개 과열 필터 도입 + 주봉 전략 착수

by 병헤는 밤 2026. 4. 17.
반응형

4월 17일 매매 일지 -- 우리로 사건, 4개 과열 필터 도입 + 주봉 전략 착수

양시장 BOTH_BULL 유지. 오전 청산 2건으로 순손익 +38,600원 기록했으나, 10:53 우리로(046970) 진입 직후 -14% 폭락하며 평가손실 -18만원. 이 건 하나로 오늘 평가금액 기준 마이너스 전환. 사후 분석 결과 "피할 수 있었던 손실"로 판정되어 과열 종목을 거르는 4개 신규 필터를 설계·검증·구현했다. 동시에 주봉 추세매매 장기 프로젝트에 착수하여 8년치 유니버스 + 705종목 OHLCV 인프라를 구축했다.

시장 환경

지수 상태
KOSPI BULL (94,050 > 20MA 84,803)
KOSDAQ BULL (19,550 > 20MA 18,893)

BOTH_BULL 유지 → 모든 매수에 ALL_BULL(예산 100%) 적용.

청산 내역 (2건)

시각 종목 진입가 청산가 PnL 사유 보유일
09:05 비츠로셀 54,900 54,600 -5,400 (-0.55%) BREAKEVEN_STOP D+1
12:36 삼성전기 632,000 676,000 +44,000 (+6.96%) TRAILING_STOP D+1

청산 손익 합계: +38,600원 (PF 8.15)

  • 비츠로셀: 어제(4/16) 13:34 진입(중복 매수 건). 오늘 장 초에 54,750 저점 터치로 BREAKEVEN_STOP(본전 상향 손절) 발동 → 진입가 55,000 근처에서 방어적으로 청산. 어제 도입한 본전 상향 로직이 기대대로 작동.
  • 삼성전기: 4/16 632,000 진입 후 4/17 장중 고점 690,000 도달(+9.2%) → 트레일링 스톱 라인(고점×0.98 = 676,200)에 걸려 +6.96% 익절. 목표 22,107 미달이지만 트레일링이 수익 보전.

매수 내역 (4건)

시각 종목 코드 진입가 수량 금액 비고
09:25 POSCO홀딩스 005490 383,000 2주 766,000 정상
09:56 삼성SDI 006400 498,500 2주 997,000 정상
10:53 우리로 046970 14,930 66주 985,380 폭락 사건
12:45 삼성전기 009150 678,000 1주 678,000 재진입 (쿨다운 즉시)

🔥 우리로(046970) 폭락 사건 분석

진입 시퀀스:

  • 10:50:46 — 돌파 감지 (현재가 15,180 > 20일고가 14,990) → 확인 대기 등록
  • 10:53:31 — 돌파 유지 확인 (165초 유지), 거래량 필터 5.61x 통과
  • 10:53:46 — 시장가 매수, 체결 14,930원 × 66주

가격 추이:

날짜 시가 고가 저가 종가 등락
3/23 2,925 3,520 2,850 3,520 +29.9% (상한)
3/24 4,575 4,575 4,015 4,575 +30.0% (상한)
3/25 5,180 5,940 5,100 5,940 +29.8% (상한)
3/26 0 0 0 5,940 거래정지
3/27 6,420 7,720 5,790 7,720 +30.0% (상한)
4/13 7,800 9,990 7,800 9,990 +29.9% (상한)
4/15 12,830 14,990 11,900 14,200 +19.7%
4/16 0 0 0 14,200 거래정지
4/17 12,000 16,200 10,210 12,170 -14.3%
  • 전일(4/16) 거래정지 → range=0 → VB trigger = 시가 + K×0 = 시가 그대로 → 돌파 필터 사실상 무력화
  • 실제 돌파는 20일고가(14,990)로 이루어짐 (vb_trigger 이슈와 별개로 정당)
  • 핵심 문제: 최근 10일 수익률 +118%, 20MA 대비 이격도 1.79배. 이미 끝물 과열 종목

기존 VB 필터 통과 경로 (놓친 지점)

  1. ✓ 종목 BULL (현재가 > 20MA)
  2. ✓ 20일 고가 돌파
  3. ✓ 거래대금 30억 이상
  4. ✓ 갭상승 3% 이내 (오히려 -15% 갭하락)
  5. ✓ 거래량 5.61x
  6. ✓ 호가 스프레드 정상
  7. ✓ 돌파 확인 대기 (165초 유지)
  8. "이미 너무 오른 종목"을 거를 수 없었음

🛡️ 4개 과열 필터 설계·검증·구현

검증 방법: 주봉 전략용으로 받아둔 705종목 × 2024~2026 OHLCV에 VB 진입 시뮬레이션 → 6,549건 진입 신호 데이터셋으로 임계값 튜닝.

기본 VB 성적 (필터 없음): 평균 수익 +1.21%, 승률 52.6%

코드 필터 상수 차단 건수 차단 승률 차단 평균
F1 거래정지 직후 차단 HALT_LOOKBACK_DAYS 5 0 - - (레어 케이스 대비)
F2 이격도 제한 MAX_DIVERGENCE_RATIO 1.5x 103 (1.6%) 34.0% -2.60%
F3 단기 급등 제한 MAX_RUNUP_10D +50% 118 (1.8%) 38.1% -1.77%
F4 고점 이탈 제한 MAX_BREAKOUT_DIST_RATIO 1.05x 171 (2.6%) 42.1% -0.63%

조합 효과: 288건 차단(4.4%). 잔존 평균 수익 +1.21% → +1.30%, 승률 52.6% → 53.1%. 큰 개선은 아니지만 확실한 손실 꼬리 방어.

기각된 F5 (슬리피지 필터)

"당일 종가 / threshold ≥ 1.03이면 스킵" 제안했으나 완전 역효과. 1,538건(23.5%) 차단 대상 중 승률 75.7%, 평균 +5.81%. 즉 "종가가 threshold 위에서 마감한 종목"은 슬리피지가 아니라 강한 돌파의 증거이며 그걸 거르면 큰 수익을 놓친다. 일봉 백테스트로는 슬리피지 측정이 불가능하다는 교훈.

우리로 적용 시뮬레이션 결과

  • F1 거래정지 이력(4/16): ❌ 차단
  • F2 이격도 1.79x: ❌ 차단
  • F3 10일 수익률 +91.9%: ❌ 차단
  • F4 고가대비 0.996x: ✓ 통과 (이 케이스는 F4 무관)

3개 필터가 독립 차단 → 같은 타입의 과열 종목은 완벽 방어

쏠리드 사후 분석 (비교용)

4/15 진입한 쏠리드(19,180)는 오늘 16,970까지 -11.5%. 같은 4개 필터 시뮬레이션:

  • F1 통과 | F2 이격도 1.31x 통과 | F3 10일 +33.7% 통과 | F4 1.038x 통과

모든 필터 통과. 즉 쏠리드는 "정상 신호에서 발생한 손실"로 판정. 회피 불가능, 기존 전략 승률 52.6%의 실패 절반에 해당. 손절선 16,784 유지 중.

📈 주봉 추세매매 프로젝트 착수

단기 스윙(VB) + 장초반 스캘프(pension) 외에 장기 추세매매 추가를 위한 인프라 작업:

  1. tools/build_weekly_universe.py 작성 → 2018-01 ~ 2026-03, 월말 시총 상위 300 스냅샷 99개월 기록. 고유 티커 1,103개 (look-ahead bias 방지).
  2. tools/download_weekly_ohlcv.py 작성 → 등장 10회 이상 705종목 × 2018~현재 일봉 다운. 59MB, 1.3M 행.
  3. 시그널 3후보 (52주 돌파 / 이평 정배열 / 상대강도) 상세 규칙 설계 완료. 백테스트 엔진 작성 이전 단계에서 중단 (다음 세션에서 재개).

환경 변경: pykrx 1.2.4 → 1.2.7 업그레이드 필요 (KRX API 변경으로 시총 스냅샷이 로그인 필수로 변경). etfSearch 프로젝트의 KRX 계정을 .env에 이식.

보유 종목 현황 (9종목, 총 778만원)

종목 진입가 진입일 보유일 현재가 평가손익
하나금융지주 120,800 4/10 D+7 - 보유 지속
현대로템 220,000 4/14 D+3 - -
쏠리드 19,180 4/15 D+2 16,970 -11.5%
산일전기 198,000 4/15 D+2 198,100 +0.1%
에이피알 411,000 4/15 D+2 419,500 +2.1%
POSCO홀딩스 383,000 4/17 D+0 - -
삼성SDI 498,500 4/17 D+0 513,000 +2.9%
우리로 14,930 4/17 D+0 12,170~12,970 -13~18%
삼성전기 678,000 4/17 D+0 - -
  • 하나금융지주 (D+7): 내일 수익 +1% 미만이면 TIME_STOP 대상
  • 쏠리드: 손절선 16,784 아슬아슬, 룰 유지 관찰
  • 우리로: 손절선 10,624 (ATR×1.5 = 약 4,300원 아래). 오늘 저가 10,210으로 손절선 근접했으나 미도달, 종가 12,170으로 반등

🔄 시스템 변경

장 마감 후 봇 재시작 완료 (PID 393766). 새 코드에 반영된 것:

  • strategy/volatility_breakout.py: 상수 4개 추가 + StockIndicatorshas_halt_in_lookback, return_10d 필드 추가
  • main.py: 갭 체크 직후 F1~F4 순차 차단 로직 삽입
  • CLAUDE.md: 파라미터 변경 이력에 5건 추가

내일 9시부터 새 필터 활성화 상태.

오늘의 교훈

배운 것

  • 일봉 프록시로 슬리피지 측정 불가: F5 기각 과정에서 확인. 돌파 후 강하게 마감한 종목이 가장 수익이 좋다는 반직관적 결과. 필터는 "승/패 경계선"에서만 의미가 있고, "더 강한 돌파"를 거르는 건 역효과.
  • "회피 가능 vs 회피 불가" 구분의 중요성: 우리로는 과열 지표로 막을 수 있었고(회피 가능), 쏠리드는 정상 신호였다(회피 불가). 두 손실을 같은 범주로 보지 않는 게 중요. 필터 추가는 회피 가능한 것만 막는다.
  • 거래정지일 데이터 취급: pykrx가 거래정지일도 volume=0/ohlc=0으로 데이터에 남겨둠. 이게 VB 트리거를 무력화할 수 있다는 걸 몰랐음. 데이터 소스의 특성을 알아야 한다.

뼈아픈 교훈

  • 우리로 진입 자체: 종목 자체의 뉴스/배경을 확인 안 하고 기술적 시그널만으로 들어간 결과. 5거래일 연속 상한가 + 거래정지 2회 이력의 종목은 딱 봐도 위험했다. 사람 눈으로는 당연히 피했을 것. 봇이 거른 건 다행이나, "그런 종목이 WATCHING에 들어와 있었다"는 게 근본 원인.
  • 수동 개입 자제: 우리로 진입 후 -14% 폭락 와중에도 룰(손절선 10,624) 대로 유지. 감정 반응으로 손절했으면 반등(10,210 → 12,170) 놓쳤을 것.

내일 체크포인트

  1. F1~F4 필터 로그 찍히는지 확인 (매수 후보에서 차단 문구 나오는지)
  2. 우리로 반등/재하락 방향 — 손절선 10,624 돌파 여부
  3. 하나금융지주 TIME_STOP 발동 여부 (D+7 돌입)
  4. 쏠리드 손절선 16,784 터치 여부
  5. 주봉 프로젝트 재개 (시그널 규칙 확정)

소감

하루 만에 "손실 사건 → 사후 분석 → 데이터 검증 → 필터 구현 → 봇 재시작"까지 사이클을 완주했다. 우리로 같은 케이스는 통계적으로 드물지만 한 번 맞으면 평가손익이 뒤집힌다. 오늘 PF 8.15 청산 실적이 우리로 평가손실 한 건으로 사실상 상쇄됐으니, 이런 꼬리 리스크를 데이터 기반으로 잡는 게 장기 수익의 열쇠라는 걸 체감. 추가로 주봉 전략이라는 장기 수익 축 구축 작업도 시작해서, 단일 전략 의존에서 다축 전략으로 가는 전환점이 된 날이었다.

 

4/17 매매일지

 

4/17 관심종목 교체 내역

 

 

반응형

댓글