Skip to content

Latest commit

 

History

75 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

DantaDanta (단타단타)

KIS(한국투자증권) Open API 기반 자동 주식 트레이딩 시스템. 국내/미국 주식 자동 매매, 실시간 웹 대시보드, 텔레그램 알림을 제공한다.


주요 기능

  • 자동 매매 — EMA 골든크로스 + MACD + RSI 필터 기반 15분 주기 매매
  • 국장/미장 분리 — KRX(09:05-15:20), 미국(23:05-05:50) 별도 사이클
  • 스캘핑 — BB+RSI 기반 1분봉 단기 전략 (옵션)
  • 뉴스 감성 분석 — Claude API로 매수 전 뉴스 감성 필터링
  • 실시간 대시보드 — Next.js 웹 UI (차트, 보유종목, 주문내역, 스크리너)
  • 텔레그램 봇 — 매수/매도/조회/설정 커맨드 지원
  • 실시간 손절·익절 — WebSocket 기반 실시간 가격 모니터링

시스템 구성

DantaDanta/
├── dantadanta/              # 트레이딩 봇 코어
│   ├── api/                 # KIS REST + WebSocket 클라이언트
│   │   ├── auth.py          # 토큰 발급/캐시 (1분 rate limit 대응)
│   │   ├── market.py        # 시세/차트 조회 (국내/해외)
│   │   ├── order.py         # 주문 실행 및 계좌 조회
│   │   ├── rest.py          # HTTP 클라이언트 (rate limit 방어)
│   │   └── websocket.py     # 실시간 체결가 구독
│   ├── analysis/
│   │   ├── screener.py      # 유니버스 종목 스코어링
│   │   ├── indicators.py    # 기술적 지표 계산
│   │   └── news.py          # 뉴스 감성 분석 (Claude API)
│   ├── engine/
│   │   ├── trader.py        # 메인 매매 사이클
│   │   ├── scalper.py       # 스캘핑 엔진 (60초 루프)
│   │   ├── budget.py        # 예산 관리 (실잔고 기반)
│   │   ├── realtime.py      # 실시간 손절·익절 모니터
│   │   ├── price_cache.py   # 실시간 가격 캐시
│   │   └── order_recorder.py# 주문 DB 기록
│   ├── strategy/
│   │   ├── ma_cross.py      # EMA(3/10) + MACD + RSI 전략
│   │   └── bb_rsi_scalp.py  # BB + RSI 스캘핑 전략
│   ├── notify/
│   │   └── telegram.py      # 텔레그램 알림 + 커맨드 폴링
│   ├── universe.py          # 국내/미국 종목 유니버스 (각 40종목)
│   └── __main__.py          # 진입점 + APScheduler 설정
│
├── web/
│   ├── api/                 # FastAPI 백엔드
│   │   ├── main.py          # 앱 진입점 + lifespan
│   │   ├── models.py        # SQLModel DB 모델
│   │   ├── routers/         # REST 엔드포인트
│   │   │   ├── account.py   # 계좌/보유종목
│   │   │   ├── chart.py     # 일봉/분봉 차트
│   │   │   ├── orders.py    # 주문 내역
│   │   │   ├── screener.py  # 종목 스크리닝
│   │   │   ├── universe.py  # 유니버스 관리
│   │   │   └── config.py    # 설정 CRUD
│   │   └── ws.py            # WebSocket 가격 브로드캐스트
│   └── frontend/            # Next.js 대시보드
│       └── src/app/
│           ├── page.tsx         # 대시보드 (잔고/수익)
│           ├── positions/       # 보유 종목
│           ├── chart/           # 캔들차트 + 지표
│           ├── orders/          # 주문 내역
│           ├── screener/        # 종목 스크리너
│           ├── universe/        # 종목 관리
│           └── config/          # 설정 페이지
│
├── run.sh                   # 봇 + API + 프론트 일괄 실행
├── pyproject.toml
└── .env.example

매매 전략

전체 사이클 흐름

[15분마다]
  1. 계좌 조회 → 실잔고로 예산 동기화
  2. 보유 종목 손절/익절 체크
     - 수익률 <= 손절선 → 즉시 매도 + 텔레그램 알림
     - 수익률 >= 익절선 → 즉시 매도 + 텔레그램 알림
  3. 유니버스 전 종목 스캔
     - 기술적 지표 계산 (EMA / MACD / RSI)
     - 매수 신호 없으면 다음 종목으로
     - 이미 보유 중이면 재매수 스킵
     - 뉴스 감성 필터 통과 확인 (활성화 시)
     - 예산 확인 후 매수 실행 + 텔레그램 알림

스윙 전략 (기본, 15분 주기)

1시간봉 데이터 기준으로 추세 전환 시점에 진입한다. 세 가지 지표가 모두 맞아야 매수한다.

  • KRX: 봇 시작 시 yfinance에서 60일치 시간봉을 즉시 적재하고, 이후 매 15분마다 KIS 분봉을 수집해 시간봉으로 리샘플링하여 DB에 누적한다.
  • 해외: 일봉 데이터 사용 (KIS 해외 분봉 미지원).

사용 지표 설명

  • EMA (지수이동평균): 최근 주가의 평균선. 단기선(3시간)이 장기선(10시간)을 아래에서 위로 뚫고 올라가면 상승 추세 전환 신호 → 골든크로스. 반대로 위에서 아래로 내려가면 하락 신호 → 데드크로스.
  • RSI (상대강도지수): 현재 주가가 얼마나 과열/과매도 상태인지를 0-100으로 표현. 30 이하면 너무 많이 떨어진 상태(반등 가능), 70 이상이면 너무 많이 오른 상태(조정 가능).
  • MACD: 단기/장기 이동평균의 차이로 추세 방향과 강도를 측정. 히스토그램이 음수에서 양수로 바뀌면 상승 모멘텀이 살아나는 신호.

매매 조건

조건 내용
매수 골든크로스 발생 + RSI가 30-65 구간 (과매도 반등 or 중립) + MACD 히스토그램 상승 중 (음수여도 방향이 위면 OK)
매도 데드크로스 발생 또는 RSI > 75 (과열 구간 진입)
손절 매수가 대비 -3% 이하로 떨어지면 즉시 매도 (손실 제한)
익절 매수가 대비 +7% 이상 오르면 즉시 매도 (수익 확정)

MACD 히스토그램 음→양 전환: 신뢰도 0.9 / 양수: 0.8 / 음수지만 상승 중: 0.65 / 음수+하락 중: 매수 보류

뉴스 감성 필터 (매수 전 적용)

기술적 지표가 매수 신호를 보내더라도, 해당 종목에 악재성 뉴스가 있으면 매수하지 않는다. Claude API로 최신 뉴스를 분석해 감성 점수(-1.0: 매우 부정 / +1.0: 매우 긍정)를 산출하고, 기준값(기본 -0.3) 미만이면 매수를 보류한다. 웹 설정 페이지 또는 텔레그램에서 활성화/비활성화 가능.

스캘핑 전략 (옵션, 60초 루프)

단기 급락 후 빠른 반등을 노리는 전략. 1분봉 기준으로 60초마다 체크한다. 설정에서 활성화해야 동작한다.

  • BB (볼린저밴드): 주가가 통계적으로 움직이는 범위를 나타내는 상·중·하 3개의 선. 하단을 이탈하면 비정상적으로 많이 떨어진 상태로 반등 가능성이 높다.
조건 내용
매수 주가가 BB 하단 아래로 이탈 AND RSI < 30 (단기 과매도)
매도 주가가 BB 중심선 회복 또는 RSI > 65 또는 최대 보유 시간 초과
손절 -0.5%
익절 +1.0%

스케줄

사이클 시간 (KST) 대상
국장 매매 평일 09:05 - 15:20, 매 15분 KRX 종목
미장 매매 평일 23:05 - 05:50, 매 15분 NASD/NYSE 종목
일간 요약 평일 15:35 텔레그램 알림
국장 스크리너 평일 08:30, 08:50 (장전) + 09:00 - 15:00 매 30분 KRX 종목 캐시 갱신
미장 스크리너 평일 22:30, 22:50 (장전) + 23:00 - 05:00 매 30분 해외 종목 캐시 갱신
KRX 시간봉 수집 평일 09:05 - 15:50, 매 15분 yfinance 초기 적재 후 KIS 분봉으로 갱신

스크리너는 백그라운드에서 미리 계산해 캐시에 저장하므로 웹 대시보드에서 즉시 조회된다 (캐시 유효 35분).


설치 및 실행

요구사항

  • Python 3.12+
  • uv 패키지 매니저
  • Node.js 18+
  • 한국투자증권 Open API 앱키 (발급)

설치

# Python 의존성
uv sync

# 프론트엔드 의존성
cd web/frontend && npm install && cd ../..

# 환경 변수 설정
cp .env.example .env
# .env 열어서 API 키 입력

환경 변수

# KIS API (필수)
KIS_APP_KEY=your_app_key
KIS_APP_SECRET=your_app_secret
KIS_ACCOUNT_NO=12345678-01
KIS_IS_MOCK=true              # 모의투자: true / 실거래: false

# KIS 실거래 앱키 — 해외 시세 조회 전용 (필수)
# KIS 모의투자 서버는 해외 주식 시세 API를 지원하지 않는다.
# 해외 종목(NASD/NYSE 등) 스크리닝·매매 시 실거래 앱키로 실서버에 직접 요청한다.
# KIS API 포털에서 실거래용 앱을 별도 등록 후 발급.
KIS_REAL_APP_KEY=your_real_app_key
KIS_REAL_APP_SECRET=your_real_app_secret

# Anthropic (뉴스 감성 분석, 선택)
ANTHROPIC_API_KEY=your_key

# 텔레그램 알림 (선택)
TELEGRAM_TOKEN=your_bot_token
TELEGRAM_CHAT_ID=your_chat_id

# 예산 초기값 (DB에 저장된 후엔 웹 UI에서 변경)
BUDGET_LIMIT=1000000
MAX_POSITION_RATIO=0.2

실행

# 전체 실행 (봇 + API + 프론트)
./run.sh

# 개별 실행
uv run python -m dantadanta          # 트레이딩 봇
uv run uvicorn web.api.main:app --port 8000  # API 서버
cd web/frontend && npm run dev        # 프론트엔드

대시보드: http://localhost:3000
API: http://localhost:8000


웹 대시보드

페이지 내용
대시보드 예수금, 총평가, 수익률, 최근 주문
보유 종목 수익률 바차트, 포트폴리오 비중, 상세 테이블
차트 일봉/분봉 캔들차트 + EMA/BB/RSI 지표
주문내역 전체 주문 기록 (자동/수동 통합)
스크리너 유니버스 종목 스코어 실시간 조회
종목관리 유니버스 종목 추가/삭제/스크리닝 활성화
설정 예산, 손절/익절, 뉴스 필터, 스캘핑 옵션

텔레그램 커맨드

커맨드 설명
/status 현재 계좌 요약 및 수익률
/holdings 보유 종목 목록
/search 종목명 종목코드 검색
/buy 종목코드 수량 [지정가] 수동 매수
/sell 종목코드 [수량] [지정가] 수동 매도
/sellall 전 종목 전량 매도
/scalp on|off 스캘핑 활성화/비활성화
/stop 자동매매 일시정지
/resume 자동매매 재개

외부 접속 (Tailscale)

포트포워딩 없이 외부에서 안전하게 접속하려면 Tailscale 사용을 권장한다.

  1. 서버 맥과 접속 기기에 Tailscale 설치 후 같은 계정 로그인
  2. tailscale ip 로 서버 IP 확인
  3. http://<tailscale-ip>:3000 으로 접속

주의사항

  • 모의투자 모드(KIS_IS_MOCK=true)로 충분히 검증 후 실거래 전환
  • KIS 모의투자 서버는 해외 주식 시세 API 미지원 — KIS_REAL_APP_KEY를 설정하면 해외 시세 요청만 실거래 서버로 자동 우회
  • 해외 시세 API는 초당 1건 제한 (EGW00201) — 자동 딜레이 적용
  • 토큰 발급은 분당 1회 제한 (자동 대기 후 재시도)
  • .env 파일은 절대 커밋하지 말 것

기술 스택

영역 스택
봇 코어 Python 3.12, httpx, websockets, APScheduler
지표 분석 pandas, pandas-ta
AI Anthropic Claude API (뉴스 감성)
백엔드 FastAPI, SQLModel, SQLite
프론트엔드 Next.js 15, Tailwind CSS, lightweight-charts
알림 Telegram Bot API

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages