최초 프로젝트 업로드 (Script Auto Commit)

This commit is contained in:
2025-12-03 22:36:00 +09:00
commit 4745ab3c28
33 changed files with 4251 additions and 0 deletions

152
config.py Normal file
View File

@@ -0,0 +1,152 @@
# 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 # 백테스트 결과 그래프 출력 여부