# config.py # ----------------------------------------------------------------------------- # Finder - Configuration File # ----------------------------------------------------------------------------- # --- 0. 환경 변수 로드 (보안) --- from dotenv import load_dotenv import os load_dotenv() # .env 파일에서 환경 변수 로드 # API Keys (향후 유료 API 사용 대비) YFINANCE_API_KEY = os.getenv("YFINANCE_API_KEY", "") ALPHA_VANTAGE_API_KEY = os.getenv("ALPHA_VANTAGE_API_KEY", "") # --- 1. 대상 시장 및 종목 설정 --- TARGET_MARKET = "BOTH" # "KR", "US", "BOTH" KR_MARKET_CAP_START = 1 KR_MARKET_CAP_END = 300 US_MARKET_CAP_START = 1 US_MARKET_CAP_END = 300 # --- 2. 데이터 관리 설정 --- LOAD_FROM_LOCAL = True # True: 로컬 캐시 데이터 사용, False: API로 새로 다운로드 SAVE_TO_LOCAL = True # True: 새로 다운로드한 데이터 로컬에 저장 DATA_CACHE_DIR = "data_cache" # 데이터 저장 폴더 API_REQUEST_DELAY = 1.0 # 서버 차단 방지를 위한 API 요청 간 대기 시간 (초) # --- 3. 분석 기간 설정 --- # 백테스트 시 이평선 계산을 위해 필요한 '추가' 기간 # 예: 448일 이평선 계산을 위해 최소 448일 + 버퍼(약 1.5배) 필요 # 2년 분석(약 500거래일) + 448 이평선 -> 약 3~4년치 데이터 필요 DATA_HISTORY_YEARS = 4 # 이평선 계산 포함 총 4년치 데이터 로드 # --- 4. 백테스트 설정 --- BACKTEST_START_DATE = "2022-01-01" BACKTEST_END_DATE = "2023-12-31" BACKTEST_CAPITAL = 100_000_000 # 1억 원 MAX_PORTFOLIO_SIZE = 10 INVESTMENT_PER_STOCK_PCT = 0.1 # 종목당 투자 비중 (총 자본의 10%) TRANSACTION_FEE_PCT = 0.0015 # 거래 수수료 + 슬리피지 (왕복 0.15% 가정) # --- 5. 핵심 매매 전략: 이동평균선 --- MA_SHORT = [5, 20] MA_LONG = [60, 112, 224, 448] ALL_MA_LIST = sorted(list(set(MA_SHORT + MA_LONG))) # --- 6. 핵심 매매 전략: 매수 조건 (Buy Strategy) --- # 6-1. 역배열 조건 (AND/OR 로직은 strategy.py에서 구현) REVERSE_ARRAY_CONDITION = { '5_vs_20' : False, # 5 < 20 '5_vs_60' : False, # 5 < 60 '5_vs_112' : False, # 5 < 112 '5_vs_224' : False, # 5 < 224 '5_vs_448' : False, # 5 < 448 '20_vs_60' : True, # 20 < 60 '20_vs_112' : False, # 20 < 112 '20_vs_224' : False, # 20 < 224 '20_vs_448' : False, # 20 < 448 '60_vs_112' : True, # 60 < 112 '60_vs_224' : False, # 60 < 224 '60_vs_448' : False, # 60 < 448 '112_vs_224': True, # 112 < 224 '112_vs_448': False, # 112 < 448 '224_vs_448': False # 224 < 448 } # 6-2. 골든 크로스 조건 (AND/OR 로직은 strategy.py에서 구현) GOLDEN_CROSS_CONDITION = { '5_vs_20' : False, # 5 > 20 '5_vs_60' : False, # 5 > 60 '5_vs_112' : True, # 5 > 112 '5_vs_224' : False, # 5 > 224 '5_vs_448' : False, # 5 > 448 '20_vs_60' : False, # 20 > 60 '20_vs_112' : False, # 20 > 112 '20_vs_224' : False, # 20 > 224 '20_vs_448' : False, # 20 > 448 '60_vs_112' : False, # 60 > 112 '60_vs_224' : False, # 60 > 224 '60_vs_448' : False, # 60 > 448 '112_vs_224': False, # 112 > 224 '112_vs_448': False, # 112 > 448 '224_vs_448': False, # 224 > 448 } # 참고: 향후 개선 고려 사항 # - 골든 크로스 시 돌파하는 이동평균선의 기울기 적용 # - 448일 이평선 계산을 위한 충분한 과거 데이터 확보 검증 # - 추세선 계산 로직 구현 # 6-3. 이격도 필터 (Disparity Filter) USE_DISPARITY_FILTER = False # Phase 2 실패: 좋은 기회까지 차단 (23.71%→7.05%) DISPARITY_MA_BASE = 224 # 기준 이평선 (e.g., 224일선) DISPARITY_MA_TARGET = 60 # 비교 이평선 (e.g., 60일선) MIN_DISPARITY_PCT = 6.0 # 최소 이격도 6% # 6-4. 강한 상승 돌파 필터 (Strong Breakthrough) USE_STRONG_BREAKTHROUGH_FILTER = False STRONG_BREAKTHROUGH_CONDITIONS = { "check_candle_body": True, "min_candle_body_pct": 3.0, # 최소 양봉 몸통 3% "check_volume": True, "volume_avg_period": 20, "volume_multiplier": 1.5, # 20일 평균 거래량의 1.5배 } # --- 7. 핵심 매매 전략: 매도 조건 (Sell Strategy) --- # 7-1. 익절 (Profit Take) - 27.65% 성공 설정: 전체 매도! PROFIT_TAKE_PCT = 0.10 # 10% 수익 시 PROFIT_TAKE_SELL_RATIO = 1.0 # 100% (전체) 매도 ← 27.65% 핵심! # 7-2. 손절 (Stop Loss) - 27.65% 성공 설정 USE_TECHNICAL_STOPLOSS = True # v2.0: '직전 언덕(피크)' 이탈 시 손절 (27.65% 핵심!) USE_FIXED_PCT_STOPLOSS = True # v1.0: 매수가 대비 N% 하락 시 손절 # (두 옵션 모두 True로 설정하면, 둘 중 하나라도 먼저 도달하면 손절합니다) FIXED_STOPLOSS_PCT = 10.0 # 고정 손절 비율 (예: 10%) STOPLOSS_PEAK_FIND_PERIOD = 30 # (v2.0) 매수일 직전 60일 내 피크 탐색 # 7-3. 추세 이탈 (나머지 절반 익절) USE_TREND_EXIT_STRATEGY = True # 'MA_DEAD_CROSS' 또는 'TRAILING_STOP' 또는 'FIXED_PROFIT_HIGH' 중 선택 TREND_EXIT_TYPE = 'TRAILING_STOP' # 7-3-1. MA 데드 크로스 설정 (TREND_EXIT_TYPE = 'MA_DEAD_CROSS'일 때 사용) TREND_EXIT_MA_SHORT = 20 TREND_EXIT_MA_LONG = 60 # 7-3-2. 트레일링 스톱 설정 (TREND_EXIT_TYPE = 'TRAILING_STOP'일 때 사용) # (매수 이후 기록된 '최고가' 대비 하락률) TRAILING_STOP_PCT = 15.0 # 15% 하락 시 매도 # --- 8. 매도 전략 상수 (최적화 Phase 1: 트레일링 스톱 완화 + 익절 상향) --- SELL_STOP_LOSS_PCT = 0.07 # 매수가 대비 7% 손절 SELL_PROFIT_TAKE_PCT = 0.20 # 20% 수익 시 익절 (15→20% 상향) SELL_PROFIT_TAKE_RATIO = 1.0 # 익절 시 100% 전체 매도 SELL_TRAILING_STOP_LOW_PCT = 0.12 # 수익률 10% 이하: 최고점 대비 12% 하락 (10→12% 완화) SELL_TRAILING_STOP_MID_PCT = 0.12 # 수익률 10~30%: 최고점 대비 12% 하락 (10→12% 완화) SELL_TRAILING_STOP_HIGH_PCT = 0.18 # 수익률 30% 초과: 최고점 대비 18% 하락 (15→18% 완화) SELL_PROFIT_THRESHOLD_MID = 0.10 # 중간 수익률 기준 SELL_PROFIT_THRESHOLD_HIGH = 0.30 # 높은 수익률 기준 # --- 9. 기술적 분석 파라미터 --- PEAK_DETECTION_MIN_DISTANCE = 5 # 피크 감지 시 최소 간격 (일 단위) # --- 10. 백테스트 특수 설정 --- TRADING_BLACKOUT_DATES = ["2023-12-29"] # 매매 금지일 (예: 연말 매수 금지) ENABLE_PLOT = False # 백테스트 결과 그래프 출력 여부