153 lines
6.3 KiB
Python
153 lines
6.3 KiB
Python
# 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 # 백테스트 결과 그래프 출력 여부
|