# ETF 액티브 매매 봇 (RSI 기반 분할 매수 & 슈팅 익절) ## 📊 전략 개요 테마성 ETF (원자력, 전력망, 이차전지 등) 의 **눌림목 분할 매수**와 **슈팅 익절** 전략 ### 매매 로직 | 구분 | 조건 | 실행 | |------|------|------| | **1 차 매수** | RSI < 35 | 자본금의 30% 매수 | | **2 차 매수** | RSI < 30 | 자본금의 30% 추가 매수 (물타기) | | **3 차 매수** | RSI < 25 | 자본금의 40% 풀매수 | | **익절** | 수익률 ≥ +4% 또는 RSI ≥ 70 | 전량 매도 | | **손절** | 수익률 ≤ -10% | 전량 매도 (리스크 관리) | ### 왜 이 전략이 효과적인가? - **눌림목 매수**: 테마 ETF 가 며칠간 -2~-3% 눌릴 때 RSI 가 하락 → 3 분할로 평단가 낮춤 - **슈팅 익절**: 호재로 +3~5% 슈팅 시 RSI 과열 (70 이상) → 전량 익절 - **리스크 관리**: -10% 손절로 테마 소멸 시 즉시 손절 --- ## 🚀 빠른 시작 ### 1. 환경 변수 설정 ```bash # DB 에 ETF 유니버스 등록 python update_env_etf.py ``` **설정 예시:** - `069500`: KODEX 200 - `114800`: KODEX 은행 - `280670`: KODEX 원자력 - `395030`: KODEX 이차전지산업 - `405840`: KODEX AI 반도체 ### 2. 백테스트 (선택) ```bash # 과거 데이터로 전략 검증 python etf_backtest.py ``` **결과 확인:** - `URA_etf_trade_history.json`: 매매 내역 - 최종 수익률, 매매 횟수 등 통계 ### 3. 실전 매매 ```bash # 한투 API 연동 실전 매매 python etf_ver1.py ``` --- ## 📁 파일 구성 | 파일 | 역할 | |------|------| | `etf_backtest.py` | 백테스트 프로그램 (야후 파이낸스 데이터) | | `etf_ver1.py` | 실전 매매 봇 (한투 API 연동) | | `update_env_etf.py` | ETF 유니버스 설정 스크립트 | | `kis_ws.py` | WebSocket 실시간 가격 수신 (기존) | | `database.py` | DB 관리 (기존) | --- ## 🔧 설정 (DB/env) ### ETF 유니버스 변경 `update_env_etf.py` 파일의 `ETF_UNIVERSE` 값 수정: ```python "ETF_UNIVERSE": "069500,114800,280670,395030,405840", ``` ### 매매 비율 조정 `etf_ver1.py` 내부 상수 수정: ```python # 3 분할 비율 (현재: 30% / 30% / 40%) target_amount = cash * 0.3 # 1 차 # 익절/손절 기준 if profit_rate >= 0.04: # +4% 익절 if profit_rate <= -0.10: # -10% 손절 ``` --- ## 📊 백테스트 결과 분석 ### 결과 파일 - `{TICKER}_etf_trade_history.json`: 전체 매매 내역 - 예: `URA_etf_trade_history.json` ### 주요 지표 ```json { "ticker": "URA", "date": "2024-03-15", "type": "SELL (슈팅 익절)", "price": 25.43, "qty": 1000, "profit_loss": 125000, "rsi": 72.5 } ``` --- ## 🏦 한투 API 설정 ### 모의투자 vs 실전투자 `database.py` 의 `env_config` 테이블에서 설정: | 키 | 모의투자 | 실전투자 | |----|---------|---------| | `KIS_APP_KEY` | `KIS_APP_KEY_MOCK` | `KIS_APP_KEY_REAL` | | `KIS_SECRET` | `KIS_APP_SECRET_MOCK` | `KIS_APP_SECRET_REAL` | | `KIS_ACCOUNT` | `KIS_ACCOUNT_NO_MOCK` | `KIS_ACCOUNT_NO_REAL` | | `KIS_MOCK` | `true` | `false` | ### WebSocket 설정 - `KIS_WS_URL_REAL`: `ws://ops.koreainvestment.com:21000` - `KIS_WS_URL_MOCK`: `ws://ops.koreainvestment.com:31000` - `KIS_WS_MOCK_ENABLED`: `true` (모의투자 WebSocket 활성화) --- ## 📱 메신저 알림 ### 텔레그램 ```python # env 설정 MM_BOT_TOKEN_ = "YOUR_BOT_TOKEN" KIS_SHORT_MM_CHANNEL = "YOUR_CHAT_ID" ``` ### 매터모스트 ```python # env 설정 MM_SERVER_URL = "https://mattermost.hoonfam.org" MATTERMOST_CHANNEL = "stock" ``` --- ## ⚠️ 주의사항 ### 1. API 호출 제한 - 한투 API 는 초당 호출 제한이 있습니다 - `etf_ver1.py` 는 `random.sleep(60~180)`으로 부하 방지 - 백테스트도 `random.sleep(0.5~1.5)` 적용 ### 2. 슬리피지 & 수수료 - 수수료: 0.015% (ETF 우대) - 슬리피지: 0.05% (호가 차이) - 백테스트와 실전의 차이는 슬리피지에서 발생 ### 3. RSI 계산 - 일봉 14 일 기준 - 장중 RSI 가 아닌 **전일 종가 기준 RSI** - 실시간 RSI 는 WebSocket 체결가로 계산 가능 (확장 필요) --- ## 💡 전략 개선 아이디어 ### 1. 분봉 RSI 활용 ```python # 5 분봉 RSI 추가 prices_5m = get_5min_prices(code, days=5) rsi_5m = calculate_rsi(prices_5m, period=14) ``` ### 2. 거래량 필터 ```python # 평균 거래량 대비 200% 이상 시 매수 if volume > volume_ma20 * 2.0: # 수급 유입으로 판단 ``` ### 3. 테마 분석 ```python # 원자력 관련 뉴스 발생 시 if "원자력" in news and "SMR" in news: # 해당 ETF 우선 매수 ``` --- ## 📚 참고 문서 - [한투 API 문서](./한투 GIT) - [한투 WebSocket 문서](./한투 API) - [기존 단타 봇](./kis_short_ver2.py) - [WebSocket 실시간 가격](./kis_ws.py) --- ## ❓ FAQ ### Q1. ETF 가 아닌 종목에도 사용 가능한가요? A: 네, RSI 전략은 개별 종목에도 적용 가능합니다. 다만 레버리지/인버스 ETF 는 변동성이 너무 커서 손절 라인을 넓혀야 합니다. ### Q2. 3 분할이 아니라 5 분할로 하고 싶어요. A: `etf_ver1.py` 의 `buy_step` 변수를 0~4 로 확장하고 비율을 20% 씩으로 조정하세요. ### Q3. 백테스트 결과가 실전과 달라요. A: 슬리피지와 호가 공백을 고려하지 않았을 수 있습니다. `slippage_rate` 를 0.1% 로 높여서 테스트해보세요. --- ## 🎯 다음 단계 1. **백테스트 돌리기**: `python etf_backtest.py` 2. **모의투자 테스트**: `KIS_MOCK=true` 로 설정 후 `python etf_ver1.py` 3. **실전 투자**: `KIS_MOCK=false` 로 설정 후 소액으로 시작 --- **📈 행복한 ETF 투자 되세요!**