Files
kis_bot/README_ETF.md
2026-03-17 12:33:30 +09:00

5.6 KiB

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. 환경 변수 설정

# DB 에 ETF 유니버스 등록
python update_env_etf.py

설정 예시:

  • 069500: KODEX 200
  • 114800: KODEX 은행
  • 280670: KODEX 원자력
  • 395030: KODEX 이차전지산업
  • 405840: KODEX AI 반도체

2. 백테스트 (선택)

# 과거 데이터로 전략 검증
python etf_backtest.py

결과 확인:

  • URA_etf_trade_history.json: 매매 내역
  • 최종 수익률, 매매 횟수 등 통계

3. 실전 매매

# 한투 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 값 수정:

"ETF_UNIVERSE": "069500,114800,280670,395030,405840",

매매 비율 조정

etf_ver1.py 내부 상수 수정:

# 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

주요 지표

{
  "ticker": "URA",
  "date": "2024-03-15",
  "type": "SELL (슈팅 익절)",
  "price": 25.43,
  "qty": 1000,
  "profit_loss": 125000,
  "rsi": 72.5
}

🏦 한투 API 설정

모의투자 vs 실전투자

database.pyenv_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 활성화)

📱 메신저 알림

텔레그램

# env 설정
MM_BOT_TOKEN_ = "YOUR_BOT_TOKEN"
KIS_SHORT_MM_CHANNEL = "YOUR_CHAT_ID"

매터모스트

# env 설정
MM_SERVER_URL = "https://mattermost.hoonfam.org"
MATTERMOST_CHANNEL = "stock"

⚠️ 주의사항

1. API 호출 제한

  • 한투 API 는 초당 호출 제한이 있습니다
  • etf_ver1.pyrandom.sleep(60~180)으로 부하 방지
  • 백테스트도 random.sleep(0.5~1.5) 적용

2. 슬리피지 & 수수료

  • 수수료: 0.015% (ETF 우대)
  • 슬리피지: 0.05% (호가 차이)
  • 백테스트와 실전의 차이는 슬리피지에서 발생

3. RSI 계산

  • 일봉 14 일 기준
  • 장중 RSI 가 아닌 전일 종가 기준 RSI
  • 실시간 RSI 는 WebSocket 체결가로 계산 가능 (확장 필요)

💡 전략 개선 아이디어

1. 분봉 RSI 활용

# 5 분봉 RSI 추가
prices_5m = get_5min_prices(code, days=5)
rsi_5m = calculate_rsi(prices_5m, period=14)

2. 거래량 필터

# 평균 거래량 대비 200% 이상 시 매수
if volume > volume_ma20 * 2.0:
    # 수급 유입으로 판단

3. 테마 분석

# 원자력 관련 뉴스 발생 시
if "원자력" in news and "SMR" in news:
    # 해당 ETF 우선 매수

📚 참고 문서


FAQ

Q1. ETF 가 아닌 종목에도 사용 가능한가요?

A: 네, RSI 전략은 개별 종목에도 적용 가능합니다. 다만 레버리지/인버스 ETF 는 변동성이 너무 커서 손절 라인을 넓혀야 합니다.

Q2. 3 분할이 아니라 5 분할로 하고 싶어요.

A: etf_ver1.pybuy_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 투자 되세요!