레디스 및 구조 수정중
This commit is contained in:
@@ -4,16 +4,11 @@
|
||||
전체 자본의 최대 25% 이내에서 운용.
|
||||
일봉 RSI ≤ 40 관심 종목에 한해 15분봉 신호를 감지한다.
|
||||
|
||||
[승률 개선 항목]
|
||||
1. 가격 하한 필터 → ATR 비율 필터 (ATR/close ≥ 0.8%)
|
||||
— 거래비용을 커버할 수 있는 변동성 종목만 선별
|
||||
2. 거래량 배수 1.3 → 1.5 (허위 신호 감소)
|
||||
3. RSI 방향 확인 — RSI가 바닥에서 반등 중인 경우만 진입
|
||||
4. 반전 캔들 확인 — 양봉 or 긴 하단 꼬리 (optional)
|
||||
5. 손절 조건 추가 — entry - 1.0×ATR (CRITICAL: 기존 코드에 누락되어 있던 것)
|
||||
6. 장 초반 30분 / 마감 15분 진입 금지 (노이즈 구간)
|
||||
|
||||
⚠️ 슬리피지 주의: 수수료 0.3% + 슬리피지 0.2% 포함 백테스트 필수
|
||||
[.env 설정]
|
||||
SHORT_TERM_MIN_ATR_RATIO (거래비용 커버용 ATR 비율 ≥ 0.8%)
|
||||
SHORT_TERM_RSI_LOOKBACK (RSI 반등 확인 과거 봉 수)
|
||||
SHORT_TERM_VOLUME_MULTIPLIER (거래량 배수)
|
||||
DAY_TRADE_ENABLED (단기 전략 활성화 여부)
|
||||
"""
|
||||
import logging
|
||||
from dataclasses import dataclass, field
|
||||
@@ -21,22 +16,17 @@ from datetime import time as dtime
|
||||
from enum import Enum
|
||||
from typing import List, Optional
|
||||
|
||||
from app.core.config import settings
|
||||
from .mean_reversion_strategy import calculate_rsi, calculate_bollinger
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# 자본 비율 상한
|
||||
MAX_CAPITAL_RATIO = 0.25
|
||||
|
||||
# 비용 가정 — 백테스트 시 왕복으로 적용
|
||||
COMMISSION_RATE = 0.003
|
||||
SLIPPAGE_RATE = 0.002
|
||||
TOTAL_COST_RATE = COMMISSION_RATE + SLIPPAGE_RATE
|
||||
|
||||
# 승률 개선 파라미터
|
||||
MIN_ATR_RATIO = 0.008 # ATR/close ≥ 0.8% : 거래비용 커버 보장
|
||||
RSI_DIRECTION_LOOKBACK = 3 # RSI 반등 확인용 과거 봉 수
|
||||
|
||||
# 장 운영 시간 필터
|
||||
_SKIP_OPEN_UNTIL = dtime(9, 30) # 장 초반 30분 제외 (개장 직후 변동성 과다)
|
||||
_SKIP_CLOSE_FROM = dtime(15, 15) # 마감 15분 전 제외 (종가 청산 압력)
|
||||
@@ -89,11 +79,10 @@ class ShortTermStrategy:
|
||||
DAILY_RSI_THRESHOLD = 40.0
|
||||
M15_RSI_ENTRY = 30.0
|
||||
M15_RSI_EXIT = 55.0
|
||||
VOLUME_MULTIPLIER = 1.5 # 1.3 → 1.5 강화
|
||||
MIN_ATR_RATIO = MIN_ATR_RATIO
|
||||
|
||||
def __init__(self, max_capital_ratio: float = MAX_CAPITAL_RATIO):
|
||||
self.max_capital_ratio = max_capital_ratio
|
||||
def __init__(self, max_capital_ratio: float = None):
|
||||
# .env에서 DAY_TRADE_CAPITAL_RATIO 읽기 (없으면 기본값 0.25)
|
||||
self.max_capital_ratio = max_capital_ratio or settings.DAY_TRADE_CAPITAL_RATIO
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# Public API
|
||||
@@ -137,7 +126,7 @@ class ShortTermStrategy:
|
||||
if not (_SKIP_OPEN_UNTIL <= trade_time < _SKIP_CLOSE_FROM):
|
||||
return None
|
||||
|
||||
min_len = 25 + RSI_DIRECTION_LOOKBACK
|
||||
min_len = 25 + settings.SHORT_TERM_RSI_LOOKBACK
|
||||
if len(m15_closes) < min_len or len(m15_volumes) < 20:
|
||||
return None
|
||||
|
||||
@@ -171,14 +160,14 @@ class ShortTermStrategy:
|
||||
|
||||
# 조건 6: 거래량 급증 (1.5배 강화)
|
||||
vol_ma20 = sum(m15_volumes[-20:]) / 20
|
||||
if vol_ma20 == 0 or current_volume <= vol_ma20 * self.VOLUME_MULTIPLIER:
|
||||
if vol_ma20 == 0 or current_volume <= vol_ma20 * settings.SHORT_TERM_VOLUME_MULTIPLIER:
|
||||
return None
|
||||
|
||||
# 조건 7: ATR 비율 필터 — 5,000원 필터 대체
|
||||
atr_ratio = 0.0
|
||||
if atr_15m is not None:
|
||||
atr_ratio = atr_15m / close if close > 0 else 0.0
|
||||
if atr_ratio < self.MIN_ATR_RATIO:
|
||||
if atr_ratio < settings.SHORT_TERM_MIN_ATR_RATIO:
|
||||
# 변동성 부족 → 1.5×ATR 익절 목표가 왕복 비용에 도달안함
|
||||
return None
|
||||
|
||||
|
||||
Reference in New Issue
Block a user