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 필터 통과 경로 (놓친 지점)
- ✓ 종목 BULL (현재가 > 20MA)
- ✓ 20일 고가 돌파
- ✓ 거래대금 30억 이상
- ✓ 갭상승 3% 이내 (오히려 -15% 갭하락)
- ✓ 거래량 5.61x
- ✓ 호가 스프레드 정상
- ✓ 돌파 확인 대기 (165초 유지)
- ❌ "이미 너무 오른 종목"을 거를 수 없었음
🛡️ 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) 외에 장기 추세매매 추가를 위한 인프라 작업:
tools/build_weekly_universe.py작성 → 2018-01 ~ 2026-03, 월말 시총 상위 300 스냅샷 99개월 기록. 고유 티커 1,103개 (look-ahead bias 방지).tools/download_weekly_ohlcv.py작성 → 등장 10회 이상 705종목 × 2018~현재 일봉 다운. 59MB, 1.3M 행.- 시그널 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개 추가 +StockIndicators에has_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) 놓쳤을 것.
내일 체크포인트
- F1~F4 필터 로그 찍히는지 확인 (매수 후보에서 차단 문구 나오는지)
- 우리로 반등/재하락 방향 — 손절선 10,624 돌파 여부
- 하나금융지주 TIME_STOP 발동 여부 (D+7 돌입)
- 쏠리드 손절선 16,784 터치 여부
- 주봉 프로젝트 재개 (시그널 규칙 확정)
소감
하루 만에 "손실 사건 → 사후 분석 → 데이터 검증 → 필터 구현 → 봇 재시작"까지 사이클을 완주했다. 우리로 같은 케이스는 통계적으로 드물지만 한 번 맞으면 평가손익이 뒤집힌다. 오늘 PF 8.15 청산 실적이 우리로 평가손실 한 건으로 사실상 상쇄됐으니, 이런 꼬리 리스크를 데이터 기반으로 잡는 게 장기 수익의 열쇠라는 걸 체감. 추가로 주봉 전략이라는 장기 수익 축 구축 작업도 시작해서, 단일 전략 의존에서 다축 전략으로 가는 전환점이 된 날이었다.


'Project Archive > Quant & Auto Trading' 카테고리의 다른 글
| [자동매매] 실전운영 8일차 - 시스템 대개편, 5단계 전략 고도화 (0) | 2026.04.16 |
|---|---|
| [자동매매] 실전운영 7일차 - 매수 6건, 매도 4건, 회전율 최고치 (0) | 2026.04.15 |
| [자동매매] 실전운영 6일차 - 거래량 필터 첫 실전 작동, 신규 매수 2건 (0) | 2026.04.14 |
| [자동매매] 실전운영 5일차 - 거래 없음, 거래량 필터 첫 실전 가동 (1) | 2026.04.13 |
| [자동매매] 실전운영 4일차 - ISC 청산 + 금융주 3종목 신규 매수 (0) | 2026.04.13 |
댓글