Files
Stock-trading-programming/reports/daily/2026-05-18.md
T

6.5 KiB

[2026-05-18] 일일 리포트 — 첫 본격 운영일

모드: 모의투자 (KIS_MOCK=true, DRY_RUN=true)
비고: 오전 봇(price=0 버그) / 오후 봇(버그 수정) 두 구간으로 나뉨


매매 결과 요약

구분 건수 내용
전체 체결 26건 오전 22건 + 오후 6건
유효 데이터 (price>0) 5건 오후 봇 이후 (삼성전자 pnl=None 제외)
실현손익 (계산 가능분) -30,746원 아래 상세 참조
14:50 강제청산 정상 대한광통신·한화생명 2종목 청산
15:10 결산 미실행 봇이 14:50:05에 종료됨 → 수정 완료

구간 1 — 오전 봇 (09:00~13:11) ⚠️ 데이터 신뢰 불가

entry_price / exit_price 모두 0.0 → pnl 계산 불가.
ETF 필터 미적용 상태라 인버스/레버리지 ETF가 다수 포함됨.

시간 종목 수량 사유 비고
09:00:29 252670 (KODEX 인버스2X) 13,333 TP1 ETF — 필터 필요
09:00:36 122630 (KODEX 레버리지) 10 SL ETF — 필터 필요
09:01:33 034220 (LG디스플레이) 117 SL
09:02:32 047040 (대우건설) 56 SL
09:03:41 252670 12,903 TP1 ETF
09:06:12 047040 57 SL
09:12:23 271050 (TIGER 인버스2X) 868 SL ETF
09:14:36 252670 12,500 SL ETF
09:21:23 348340 25 SL
09:22:36 122630 10 TP1 ETF
09:43:01 036540 204 TP1
09:53:45 252670 13,008 SL ETF
09:56:32 122630 10 TP1 ETF
10:05:38 252670 13,114 SL ETF
10:06:28 252670 13,333 TP1 ETF
10:31:39 252670 13,445 SL ETF
10:42:46 036540 199 TP1
10:43:01 252670 13,675 SL ETF
10:57:08 252670 13,793 SL ETF
11:12:02 271050 882 미청산 ETF — 포지션 유실
11:15:05 252670 13,913 SL ETF
11:23:00 252670 14,159 TP1 ETF
  • TP1: 7건 / SL: 12건 / 미청산: 1건 (가격 없어 손익 계산 불가)
  • ETF 포함 건수: 16건 이상 (252670, 122630, 271050)

구간 2 — 오후 봇 (13:18~14:50) 수정 후 신뢰 가능

버그 수정 후 재시작: entry_price/exit_price 정상 기록, ETF 14종목 필터 적용.

시간 종목 수량 매수가 매도가 사유 손익
13:19:50 삼성전자(005930) 4주 284,750원 282,000원 SL pnl=None (버그)
13:19:58 대한광통신(010170) 60주 23,100원 positions 불일치로 추적 못함
14:02:31 한화생명(088350) 242주 5,770원 5,710원 SL -17,215원
14:19:22 대한광통신(010170) 60주 23,100원 22,850원 SL -17,673원
14:23:03 대한광통신(010170) 60주 23,050원 23,250원 FORCE +9,280원
14:25:39 한화생명(088350) 242주 5,770원 5,760원 FORCE -5,138원

14:50 강제청산: 14:50:00~14:50:05 사이 대한광통신·한화생명 2종목 정상 청산
실현손익 합계: -17,215 + (-17,673) + 9,280 + (-5,138) = -30,746원
(삼성전자 pnl=None 포함 시 추정 -44,116원)


오늘 발견 및 수정한 버그

# 버그 수정 내용
1 DRY_RUN 매수/매도 시 price=0 저장 order_buy/sell에서 get_price() 호출해 실제 현재가 반환
2 ETF/인버스/레버리지 종목 유니버스 포함 _is_etf() 필터 — 키워드 + Q prefix 차단
3 종목명 ticker 코드로 저장 get_volume_rank() 캐시로 이름 저장
4 rate limit 초과 모의투자 1req/s, 실거래 5req/s로 고정
5 봇 재시작 시 포지션 유실 _restore_positions_from_db() 추가
6 매수/매도 시 positions DB 미기록 _db_save_position / _db_delete_position 추가
7 pnl 컬럼에 None 저장 _update_trade_exit에서 pnl 계산 후 저장
8 중복 봇 프로세스 미종료 PID 파일 + Get-CimInstance 이중 종료
9 daily_summary DB 미저장 daily_summary() 에서 테이블 INSERT 추가
10 장중 재시작 시 15:10 결산 미실행 trading_loop() 후 15:10까지 대기 루프 추가

분석

오전 신호 패턴

  • 09:00~11:23 사이에 22건 집중 → 변동성 돌파 전략 정상 동작
  • 252670(인버스ETF) 반복 진입 8회 — ETF 필터 없어서 발생, 수정 완료
  • SL 비율이 높음 (약 55%) — 약세장(sentiment 42점) 대비 포지션 잡은 것이 원인일 수 있음

오후 신호 (수정 후)

  • 유니버스 30 → 14종목으로 축소 (ETF 제외 효과)
  • 삼성전자 13:19 진입 → SL (-0.97%), 대한광통신·한화생명 오후 2회씩 반복 진입
  • 오후 진입은 변동성 돌파 특성상 신뢰도 낮음 → 14:00 이후 신규 진입 제한 검토 필요
  • 강제청산 정상 작동: 14:50:00~05 사이 2종목 5초 내 완료

15:10 결산 미실행

  • 원인: 장중 재시작 경로에서 trading_loop() 종료 후 즉시 return → 결산 코드 미도달
  • 수정: trading_loop() 후 15:10까지 대기 → 결산 실행 후 종료 (내일부터 적용)

L3 (3연속 손절) 점검

  • 오전 봇: 034220 SL → 047040 SL → 271050 SL → L3 조건 충족됐으나 차단 미작동
  • price=0 데이터라 risk.record_trade(0)이 호출됐을 가능성 → L3 pnl 합산이 0이라 감지 못함
  • 내일 확인 필요: 실제 pnl 기록 후 L3 차단 정상 작동하는지 검증

파라미터 변경

변경 없음. 오늘은 데이터 정합성 복구가 우선이었고, 의미있는 pnl 데이터가 삼성전자 1건뿐이라 전략 파라미터 판단 불가.


실전 전환 조건

조건 기준 현재 통과
누적 운영 30거래일 이상 2일
승률 > 48% 데이터 부족
MDD < -10% 데이터 부족
샤프지수 > 1.0 데이터 부족
L3 발동 월 2회 이하 미검증

실전 전환: 미충족


내일 확인사항

  1. 포지션 DB 복원 정상 동작 확인 (_restore_positions_from_db)
  2. pnl 저장 정상 동작 확인 (_update_trade_exit)
  3. ETF 필터 후 유니버스 종목 품질 확인
  4. L3 (3연속 손절) 차단 로직 실제 동작 여부
  5. morning 스케줄러 (08:15) 자동 실행 여부 확인
  6. 15:10 결산 정상 실행 및 daily_summary 테이블 저장 확인
  7. 14:00 이후 신규 진입 제한 검토 (오후 반복 진입 → 손실 패턴)