Files
auto-stock/.env.example
shuim 9063a9d01e feat: 대시보드 로그인을 아이디/비밀번호 방식으로 전환 (SECRET_KEY 직접 입력 제거)
- auth.py 신규: POST /api/v1/auth/login → JWT 세션 토큰(HS256, SECRET_KEY 서명, 24h)
  GET /api/v1/auth/me 자격 확인. IP당 5회 실패 시 300초 잠금(인메모리)
- config: ADMIN_USERNAME / ADMIN_PASSWORD / ADMIN_PASSWORD_HASH(bcrypt) /
  SESSION_TOKEN_EXPIRE_HOURS / LOGIN_MAX_FAILURES / LOGIN_LOCKOUT_SECONDS
- security: create_session_token / verify_session_token / is_valid_credential 추가.
  require_api_key·optional_api_key 는 시그니처 유지, X-API-Key 값으로 API 키 또는
  세션 토큰 모두 수용 → 프론트 api.ts·useWebSocket·MCP 서버 호출 경로 무변경
- main.py WebSocket 인증도 is_valid_credential 로 통일
- bcrypt 검증은 passlib 대신 bcrypt 직접 사용 (passlib 1.7.4 ↔ bcrypt 5.0 비호환)
- Login.tsx: 아이디/비밀번호 폼, 401/429/503 별 안내 메시지
- .env.example 에 관리자 계정 항목 추가

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 00:06:23 +09:00

256 lines
16 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ═══════════════════════════════════════════════════════════════════════════════
# 자동 주식 매매 시스템 설정 파일 (.env)
# ═══════════════════════════════════════════════════════════════════════════════
#
# 모든 설정이 .env 파일 변수로 제어 가능합니다.
# 기본값은 config.py에 정의되어 있고, 여기서 오버라이드할 수 있습니다.
#
# 참조: CLAUDE.md - 섹션 1.2 환경 변수 참고
# ═══════════════════════════════════════════════════════════════════════════════
# 기본 애플리케이션 설정
# ═══════════════════════════════════════════════════════════════════════════════
ENVIRONMENT=development
DEBUG=false
LOG_LEVEL=INFO
# 백엔드 서버
BACKEND_HOST=0.0.0.0
BACKEND_PORT=8000
SECRET_KEY=your-secret-key-here
# 대시보드 로그인 계정 (ADMIN_PASSWORD_HASH 우선, 없으면 ADMIN_PASSWORD 평문. 둘 다 비면 로그인 불가)
# 해시 생성: python -c "import bcrypt; print(bcrypt.hashpw(b'비밀번호', bcrypt.gensalt()).decode())"
ADMIN_USERNAME=admin
ADMIN_PASSWORD=
ADMIN_PASSWORD_HASH=
SESSION_TOKEN_EXPIRE_HOURS=24
# ═══════════════════════════════════════════════════════════════════════════════
# 데이터베이스 및 캐시
# ═══════════════════════════════════════════════════════════════════════════════
DATABASE_URL=postgresql://autostock:autostock_password@localhost:5432/autostock_db
REDIS_URL=redis://localhost:6379/0
RABBITMQ_URL=amqp://autostock:autostock_password@localhost:5672/
# PostgreSQL (도커 환경)
POSTGRES_USER=autostock
POSTGRES_PASSWORD=autostock_password
POSTGRES_DB=autostock
# ═══════════════════════════════════════════════════════════════════════════════
# 한국투자증권 (KIS) API 설정
# ═══════════════════════════════════════════════════════════════════════════════
# 모드 선택: "virtual" (모의투자) 또는 "real" (실전투자)
KIS_MODE=virtual
# 모의투자 (Paper Trading) 설정
KIS_VIRTUAL_APP_KEY=your_virtual_app_key
KIS_VIRTUAL_APP_SECRET=your_virtual_app_secret
KIS_VIRTUAL_ACCOUNT_NO=00000000-01
KIS_VIRTUAL_URL=https://openapivts.koreainvestment.com:29443
# 실전투자 설정
KIS_REAL_APP_KEY=your_real_app_key
KIS_REAL_APP_SECRET=your_real_app_secret
KIS_REAL_ACCOUNT_NO=00000000-01
KIS_REAL_URL=https://openapi.koreainvestment.com:9443
# WebSocket 접속키 (수동 지정 시 우선, 비어있으면 자동 발급)
KIS_WS_APPROVAL_KEY=
# WebSocket URL (커스토마이징 필요 시만 수정)
KIS_WS_REAL_URL=wss://openapi.koreainvestment.com:21000/websocket/realtime
KIS_WS_VIRTUAL_URL=wss://openapiwss.koreainvestment.com:29443/websocket/realtime
# KIS 실시간 스트림 타이밍 (초 단위)
KIS_SYNC_INTERVAL=10 # 구독 목록 동기화 주기
KIS_RECONNECT_WAIT=5 # 재연결 대기 시간
KIS_APPROVAL_KEY_TTL=82800 # approval_key 캐시 유효시간 (초, 23시간)
# 레거시 호환 (직접 지정 시 우선)
KOREA_INVESTMENT_APP_KEY=your_app_key_here
KOREA_INVESTMENT_APP_SECRET=your_app_secret_here
KOREA_INVESTMENT_ACCOUNT_NUMBER=your_account_number
KOREA_INVESTMENT_API_BASE_URL=https://openapi.koreainvestment.com:9443
# ═══════════════════════════════════════════════════════════════════════════════
# AI 프로바이더 설정
# ═══════════════════════════════════════════════════════════════════════════════
AI_PROVIDER=claude # "claude" 또는 "gemini"
ANTHROPIC_API_KEY=your_anthropic_api_key
# MCP 서버 설정
MCP_SERVER_URL=http://localhost:8001
MCP_VALIDATION_ENABLED=true # AI 검증 활성화
MCP_CONFIDENCE_THRESHOLD=0.5 # AI 신뢰도 최소값 (0.0~1.0)
# ═══════════════════════════════════════════════════════════════════════════════
# 거래 설정 (CLAUDE.md 섹션 5-8 기반)
# ═══════════════════════════════════════════════════════════════════════════════
# 기본 거래 파라미터
AUTO_TRADE_ENABLED=true # 자동매매 활성화
ANALYSIS_STOCK_COUNT=150 # 배치 분석 종목 수
AUTO_TRADE_TOP_N_PER_RULE=2 # 규칙당 자동매매 최대 종목 수
MAX_DAILY_TRADES=5
# 포지션 규칙 (섹션 5.1)
MAX_POSITION_SIZE=0.04 # 1종목당 최대 3-4% 자본
MAX_HOLDINGS_COUNT=20 # 동시 보유 최대 20종목
LEVERAGE_ETF_MAX_RATIO=0.20 # 레버리지/인버스 ETF 20% 이내
# 손절/익절 설정 (섹션 5.2)
STOP_LOSS_PERCENT=-6.0 # 저변동 종목 손절 -6%
STOP_LOSS_HIGH_VOL=-10.0 # 고변동 종목 손절 -10%
TAKE_PROFIT_PERCENT=5.0 # 익절 기본값
# ATR 기반 손절/트레일링 (섹션 5.2)
ATR_STOP_MULTIPLIER=2.5 # 2.5 × ATR 손절
ATR_TRAILING_MULTIPLIER=1.5 # 1.5 × ATR 트레일링
# MDD (최대 낙폭) 관리 (섹션 5.3)
MDD_PAUSE_THRESHOLD=-10.0 # -10% MDD: 신규진입 중단 + 30% 축소
MDD_FORCE_THRESHOLD=-20.0 # -20% MDD: 50% 강제 축소
# 가격 필터 (섹션 5.4)
MIN_PRICE_KRW=5000 # 국내 5,000원 이하 매수 금지
MIN_PRICE_USD=4.0 # 미국 $4 이하 매수 금지
# 연속 손실 관리 (섹션 7.4)
CONSECUTIVE_LOSS_BAN_COUNT=3 # 3회 연속 손실
CONSECUTIVE_LOSS_BAN_DAYS=30 # 30거래일 진입 금지
# ═══════════════════════════════════════════════════════════════════════════════
# 전략 A: RSI + 볼린저 밴드 평균회귀 (섹션 6)
# ═══════════════════════════════════════════════════════════════════════════════
MEAN_REVERSION_MAX_CAPITAL=0.30 # 전체 자본의 30% 이내 (섹션 7.5)
MEAN_REVERSION_RSI_THRESHOLD=30.0 # RSI 과매도 기준 (≤30)
MEAN_REVERSION_MULTIPLIER_STRONG=1.50 # RSI ≤ 20: 강한 신호 배수 (+50%)
MEAN_REVERSION_MULTIPLIER_NORMAL=1.25 # RSI ≤ 25: 중간 신호 배수 (+25%)
MEAN_REVERSION_MULTIPLIER_WEAK=1.00 # 기본 신호 배수 (4%)
# 시장 국면 필터 (7.5)
BEAR_MARKET_FILTER_ENABLED=true
BEAR_MARKET_MIN_SCORE=5
BEAR_MARKET_MAX_TRADES=3
BEAR_MARKET_POSITION_RATIO=0.5
# 급등 과열 필터 (섹션 5.4)
OVERHEAT_FILTER_ENABLED=true
OVERHEAT_3DAY_MAX=15.0 # 3일 최대 상승률 15%
OVERHEAT_5DAY_MAX=20.0 # 5일 최대 상승률 20%
OVERHEAT_10DAY_MAX=30.0 # 10일 최대 상승률 30%
OVERHEAT_DISPARITY_MAX=108.0 # 괴리율 최대 108%
# 트렌드 필터 (7.1)
TREND_FILTER_ENABLED=false
TREND_MA_SHORT=20 # 단기 MA 기간
TREND_MA_LONG=60 # 장기 MA 기간
TREND_TOLERANCE_PCT=0.005 # 허용 오차 0.5%
# ═══════════════════════════════════════════════════════════════════════════════
# 전략 B: 데이트레이딩 (섹션 8.2)
# ═══════════════════════════════════════════════════════════════════════════════
DAY_TRADE_ENABLED=true # 데이트레이딩 활성화
DAY_TRADE_MAX_POSITIONS=3 # 동시 최대 3종목
DAY_TRADE_CAPITAL_RATIO=0.25 # 전체 자본 대비 최대 25%
DAY_TRADE_MAX_RATIO_DT=0.25 # 전체 데이트레이딩 최대 25%
DAY_TRADE_PER_STOCK_RATIO=0.10 # 종목당 최대 10%
DAY_TRADE_MAX_CAPITAL_RATIO=0.10 # 종목당 최대 10%
# 데이트레이딩 손절/익절
DAY_TRADE_ORB_STOP_LOSS_PCT=0.02 # ORB 손절 -2%
DAY_TRADE_REVERSION_STOP_LOSS_PCT=0.025 # VWAP/RSI_BB 손절 -2.5%
DAY_TRADE_TRAILING_TRIGGER=0.015 # 트레일링 발동 +1.5%
DAY_TRADE_TRAILING_ATR_MULT=1.0 # 트레일링 ATR 배수
DAY_TRADE_ORB_BREAKOUT_MARGIN=0.002 # ORB 돌파 최소 여유 +0.2%
DAY_TRADE_COST_PCT=0.005 # 수수료+슬리피지 0.5%
# 데이트레이딩 일일/시간 제한
DAY_TRADE_DAILY_LOSS_LIMIT=-0.03 # 일일 손실 한도 -3%
DAY_TRADE_ENTRY_CUTOFF_HOUR=15 # 신규 진입 마감 시간 (15시)
DAY_TRADE_ENTRY_CUTOFF_MIN=0 # 신규 진입 마감 분
DAY_TRADE_EOD_HOUR=15 # EOD 강제 청산 시작 시간
DAY_TRADE_EOD_MIN=20 # EOD 강제 청산 시작 분
DAY_TRADE_RSI_BREAKEVEN_THRESHOLD=40.0 # RSI_BB 진입 기준 (5분봉 RSI ≤ 40)
# ═══════════════════════════════════════════════════════════════════════════════
# 단기 전략 (15분봉, 섹션 8.2)
# ═══════════════════════════════════════════════════════════════════════════════
SHORT_TERM_MIN_ATR_RATIO=0.008 # ATR/close ≥ 0.8% (거래비용 커버)
SHORT_TERM_RSI_LOOKBACK=3 # RSI 반등 확인 과거 봉 수
SHORT_TERM_VOLUME_MULTIPLIER=1.5 # 거래량 필터 배수 (1.5배)
# ═══════════════════════════════════════════════════════════════════════════════
# 감시 목록 관리 (watchlist.py)
# ═══════════════════════════════════════════════════════════════════════════════
WATCHLIST_INIT_SIZE=150 # 아침 배치 초기화 종목 수
WATCHLIST_MAX_SIZE=150 # 최대 관리 종목 수
WATCHLIST_ENTRY_SCORE=60 # 장중 신규 진입 기준 점수
WATCHLIST_EXIT_SCORE=20 # 장중 제거 기준 점수
# ═══════════════════════════════════════════════════════════════════════════════
# 기술적 지표 설정 (technical_indicators.py)
# ═══════════════════════════════════════════════════════════════════════════════
# RSI (Relative Strength Index)
RSI_PERIOD=14 # RSI 계산 기간 (14일)
RSI_OVERSOLD_LEVEL=30.0 # RSI 과매도 수준
RSI_OVERBOUGHT_LEVEL=70.0 # RSI 과매수 수준
RSI_RECOVERY_RANGE_MIN=30.0 # RSI 회복 범위 최소값 (30~45)
RSI_RECOVERY_RANGE_MAX=45.0 # RSI 회복 범위 최대값
RSI_STABLE_RANGE_MIN=45.0 # RSI 안정 범위 최소값 (45~60)
RSI_STABLE_RANGE_MAX=60.0 # RSI 안정 범위 최대값
# 볼린저 밴드
BOLLINGER_PERIOD=20 # 볼린저 밴드 기간 (20일)
BOLLINGER_STDDEV=2.0 # 표준편차 배수
# 이동평균 (Moving Average)
MA_SHORT_PERIOD=5 # 단기 MA (5일)
MA_MEDIUM_PERIOD=20 # 중기 MA (20일)
MA_LONG_PERIOD=60 # 장기 MA (60일)
# ATR (Average True Range)
ATR_PERIOD=14 # ATR 계산 기간 (14일)
# ═══════════════════════════════════════════════════════════════════════════════
# API 레이트 제한 및 안전 운영
# ═══════════════════════════════════════════════════════════════════════════════
API_MAX_RETRIES=3 # 최대 재시도 횟수
API_RETRY_DELAY=1.5 # 초기 재시도 대기 시간 (초)
API_RETRY_BACKOFF=2.0 # 지수 백오프 배율
API_MIN_REQUEST_INTERVAL=0.5 # 최소 요청 간격 (초)
API_MAX_CONCURRENT_REQUESTS=4 # 동시 최대 요청 수
API_TIMEOUT=30.0 # API 타임아웃 (초)
# API 모니터링
API_ERROR_THRESHOLD=0.3 # 오류율 임계값 (30%)
API_MONITORING_WINDOW=100 # 모니터링 윈도우 (최근 100개 요청)
# ═══════════════════════════════════════════════════════════════════════════════
# ML (머신러닝) 설정
# ═══════════════════════════════════════════════════════════════════════════════
ML_TF_ENABLED=true # ML 모델 기반 보조지표 사용
ML_ENSEMBLE_ENABLED=true # ML 앙상블 활성화
ML_ENSEMBLE_MODEL_DIR=models/ensemble
ML_ENSEMBLE_RULE_WEIGHT=0.3 # 룰베이스 스코어 비중 (30%)
ML_ENSEMBLE_ML_WEIGHT=0.7 # ML 스코어 비중 (70%)
ML_ENSEMBLE_BUY_THRESHOLD=60 # 매수 최소 앙상블 스코어 (0~100)
ML_ENSEMBLE_CONFIDENCE_MIN=0.5 # 최소 신뢰도
# ═══════════════════════════════════════════════════════════════════════════════
# 프론트엔드 (선택사항)
# ═══════════════════════════════════════════════════════════════════════════════
VITE_API_URL=http://localhost:8000
VITE_WS_URL=ws://localhost:8000/ws
# ═══════════════════════════════════════════════════════════════════════════════
# 기타 설정
# ═══════════════════════════════════════════════════════════════════════════════
TOKEN_SAVE_MODE=true # JSON 압축, 차트 데이터 30일 제한
NEWS_API_KEY=your_news_api_key