From bec4eb71b7a47dd07785760844a9e2e145a30885 Mon Sep 17 00:00:00 2001 From: jongjae Date: Thu, 21 May 2026 15:34:15 +0900 Subject: [PATCH] =?UTF-8?q?[2026-05-21]=20=EC=9D=BC=EC=9D=BC=20=EB=A6=AC?= =?UTF-8?q?=ED=8F=AC=ED=8A=B8=20=E2=80=94=2017=EA=B1=B4=20=EC=8A=B98?= =?UTF-8?q?=ED=8C=A89=20-147,137=EC=9B=90=20/=20=EC=9E=AC=EC=A7=84?= =?UTF-8?q?=EC=9E=85=20=EC=BF=A8=EB=8B=A4=EC=9A=B4=2030=EB=B6=84=20?= =?UTF-8?q?=EC=8B=A0=EA=B7=9C=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/config.py | 1 + app/strategy/volatility_breakout.py | 23 ++++++-- reports/daily/2026-05-21.md | 87 +++++++++++++++++++++++++++++ 3 files changed, 105 insertions(+), 6 deletions(-) create mode 100644 reports/daily/2026-05-21.md diff --git a/app/config.py b/app/config.py index 8608c49..4cab20d 100644 --- a/app/config.py +++ b/app/config.py @@ -12,6 +12,7 @@ TP1_PCT = 0.02 # 1차 익절 +2% → 50% 매도 TP2_PCT = 0.03 # 2차 익절 +3% → 전량 SL_PCT = 0.015 # 손절 -1.5% MAX_HOLD_MIN = 120 +TICKER_REENTRY_COOLDOWN_MIN = 30 # 동일 종목 재진입 금지 시간(분) # ── 리스크 ── POS_SIZE_PCT = 0.20 diff --git a/app/strategy/volatility_breakout.py b/app/strategy/volatility_breakout.py index 4132ead..e0b2fa8 100644 --- a/app/strategy/volatility_breakout.py +++ b/app/strategy/volatility_breakout.py @@ -12,7 +12,7 @@ from app.config import ( ENTRY_START, ENTRY_END, AI_CONTEXT_PATH, AI_MIN_SCORE, AI_BOOST_MULTI, MIN_TRADE_AMOUNT, - KOSPI_MIN_CHG + KOSPI_MIN_CHG, TICKER_REENTRY_COOLDOWN_MIN ) logger = logging.getLogger(__name__) @@ -40,10 +40,11 @@ class VolatilityBreakout: """ def __init__(self): - self.context = DEFAULT_CONTEXT.copy() - self.prev_data = {} # ticker → {high, low, amount} 전일 데이터 - self.today_open = {} # ticker → 당일 시가 - self.targets = {} # ticker → 목표가 + self.context = DEFAULT_CONTEXT.copy() + self.prev_data = {} # ticker → {high, low, amount} 전일 데이터 + self.today_open = {} # ticker → 당일 시가 + self.targets = {} # ticker → 목표가 + self._entry_times: dict = {} # ticker → 마지막 진입 datetime (쿨다운 추적) # ── AI 컨텍스트 로드 ── @@ -122,11 +123,20 @@ class VolatilityBreakout: result = {"signal": False, "reason": "", "boosted": False, "multiplier": 1.0} # 시간 체크 - now = datetime.now().strftime("%H:%M") + now_dt = datetime.now() + now = now_dt.strftime("%H:%M") if not (ENTRY_START <= now <= ENTRY_END): result["reason"] = f"진입 시간 외 ({now})" return result + # 동일 종목 재진입 쿨다운 체크 + last_entry = self._entry_times.get(ticker) + if last_entry is not None: + elapsed = (now_dt - last_entry).total_seconds() / 60 + if elapsed < TICKER_REENTRY_COOLDOWN_MIN: + result["reason"] = f"재진입 쿨다운 ({elapsed:.0f}분 / {TICKER_REENTRY_COOLDOWN_MIN}분)" + return result + # 목표가 확인 target = self.targets.get(ticker, 0) if target <= 0: @@ -163,6 +173,7 @@ class VolatilityBreakout: if boosted: multiplier = min(multiplier * AI_BOOST_MULTI, 1.5) + self._entry_times[ticker] = now_dt # 진입 시간 기록 result.update({ "signal" : True, "reason" : f"목표가 돌파 ({current_price:,} >= {target:,.0f})", diff --git a/reports/daily/2026-05-21.md b/reports/daily/2026-05-21.md new file mode 100644 index 0000000..15509f0 --- /dev/null +++ b/reports/daily/2026-05-21.md @@ -0,0 +1,87 @@ +# [2026-05-21] 일일 리포트 + +## 매매 결과 +- 총 매매: 17회 / 승 8 패 9 (승률 47.1%) +- 순손익: **-147,137원** +- 수수료 합계: 62,037원 + +## 매매 상세 +| 종목 | 진입 | 청산 | 사유 | 손익 | +|------|------|------|------|------| +| 코스모로보틱스(439960) | 09:05 | 09:06 | TP1 | +24,843원 | +| SK네트웍스(001740) | 09:05 | 09:06 | SL | -61,645원 | +| 녹십자엠에스(142280) | 09:06 | 09:15 | TP1 | +16,131원 | +| 이랜시스(264850) | 09:07 | 09:53 | TP1 | +26,536원 | +| 녹십자엠에스(142280) | 09:15 | 09:17 | TP1 | +31,291원 | +| **녹십자엠에스(142280)** | **09:17** | **09:17** | **SL** | **-44,265원** | +| 코칩(126730) | 09:18 | 09:23 | SL | -43,521원 | +| 티씨머티리얼즈(125020) | 09:23 | 09:24 | TP1 | +14,332원 | +| **티씨머티리얼즈(125020)** | **09:26** | **09:27** | **SL** | **-46,687원** | +| 흥아해운(003280) | 09:28 | 11:11 | TP1 | +22,359원 | +| 이랜시스(264850) | 11:21 | 11:22 | TP1 | +36,773원 | +| 흥아해운(003280) | 11:28 | 13:28 | TIME | -10,288원 | +| **이랜시스(264850)** | **12:04** | **12:10** | **SL** | **-49,041원** | +| 아이진(185490) | 12:10 | 12:12 | TP1 | +13,982원 | +| **아이진(185490)** | **12:12** | **12:13** | **SL** | **-48,384원** | +| 쎄크(081180) | 12:14 | 14:14 | TIME | -8,715원 | +| 흥아해운(003280) | 13:28 | 14:22 | SL | -20,838원 | + +*(굵게 표시: 재진입 후 즉시 손절된 거래)* + +## 분석 및 피드백 + +### 핵심 문제: TP1 달성 후 동일 종목 즉시 재진입 → 손절 반복 + +오늘 발생한 4건의 재진입 손절 패턴: +- 녹십자엠에스: 09:17 재진입 → SL -44,265원 (청산 후 2분) +- 티씨머티리얼즈: 09:26 재진입 → SL -46,687원 (청산 후 2분) +- 이랜시스: 12:04 재진입 → SL -49,041원 (점심 세션 재진입) +- 아이진: 12:12 재진입 → SL -48,384원 (TP1 직후 30초) + +**재진입 손절 합계: -188,377원** + +만약 재진입 4건이 없었다면 순손익 = -147,137 + 188,377 = **+41,240원 흑자**. + +### 기타 패턴 + +- **SK네트웍스 대형 손절(-61,645원)**: 09:05 진입 후 1분 만에 손절. 장 시작 직후 유동성 부족 구간에서 슬리피지 확대로 추정. +- **오전 연속 손절 구간**: 09:17~09:27에 녹십자엠에스 SL → 코칩 SL → 티씨머티리얼즈 SL (3연속). L3-B가 발동됐어야 하나 확인 필요. +- **AI 부스트 종목 미매매**: 오늘 boosted_tickers(삼성전자, SK하이닉스 등)는 매매 유니버스에 들어오지 않아 AI 부스트 효과 없음. +- **흥아해운 3회 반복**: TP1(+22,359) → TIME(-10,288) → SL(-20,838). 점심 이후 모멘텀 소진 상태에서 반복 진입 패턴. + +### 30일 누적 추이 (3거래일) +| 날짜 | 매매 | 승 | 패 | 승률 | 손익 | +|------|------|----|----|------|------| +| 05-19 | 8 | 5 | 3 | 62.5% | -12,914원 | +| 05-20 | 27 | 10 | 17 | 37.0% | -87,961원 | +| 05-21 | 17 | 8 | 9 | 47.1% | -147,137원 | +| **합계** | **52** | **23** | **29** | **44.2%** | **-248,012원** | + +3일 연속 손실. 매매 횟수가 많을수록 손실 심화 → 동일 종목 반복 진입이 원인. + +## 파라미터 변경 + +### 신규 추가: `TICKER_REENTRY_COOLDOWN_MIN = 30` + +**근거**: TP1/SL 후 모멘텀 소진된 종목 즉시 재진입이 오늘 손실의 128%(+188,377원)를 차지. +**효과**: 동일 종목 마지막 진입으로부터 30분간 재진입 신호 차단. +**구현**: `app/config.py` 파라미터 추가 + `app/strategy/volatility_breakout.py` 쿨다운 로직 적용. + +**시뮬레이션 (오늘 적용 시)**: +- 차단되는 재진입 4건: -188,377원 손실 방지 +- 차단되는 익절 1건 (녹십자엠에스 09:15 TP1 +31,291원) — 이건 첫 진입 09:06 기준 9분 후라 쿨다운 내에 해당되어 차단 +- **추정 결과: -147,137 + 188,377 - 31,291 ≈ +9,949원** (흑자 전환) + +## 실전 전환 조건 + +| 조건 | 기준 | 현재 | 통과 | +|------|------|------|------| +| 누적 운영 30거래일 | ≥ 30일 | 3일 | ❌ | +| 승률 | > 48% | 44.2% | ❌ | +| MDD | < -10% | 계산 오류 (점검 필요) | ❌ | +| 샤프지수 | > 1.0 | -23.89 | ❌ | +| L3 발동 | 월 2회 이하 | 0회 | ✅ | + +> MDD 수치(-24801162%)는 evening.py 계산 로직 버그로 추정. 별도 점검 필요. + +**전체 미통과. 모의투자 계속.**