개발 블로그
← 블로그 목록

키움증권 REST API로 주식 자동매매 시스템 만들기


면책 조항: 이 글은 개발 경험을 공유하는 것이 목적입니다. 특정 투자 전략을 권장하거나 수익을 보장하지 않습니다. 자동매매는 손실 위험이 있으며 모든 투자 결정은 본인 책임입니다.

직접 짠 전략으로 자동매매를 해보고 싶다는 생각은 오래전부터 있었습니다. 키움증권이 REST API를 공개하면서 드디어 시작할 수 있게 됐습니다. 기존 키움 OpenAPI+는 윈도우 32비트 전용이라 환경 구성이 까다로웠는데, REST API는 어떤 언어에서도 HTTP 요청만 할 수 있으면 됩니다.

키움 REST API 신청

키움증권 홈페이지에서 오픈 API 신청을 하면 됩니다. 실계좌가 있어야 하고, 신청 후 하루 정도 지나면 API 키가 발급됩니다. 모의투자 계좌로도 사용 가능해서 처음에 테스트하기 좋습니다.

모멘텀 전략이란?

전략은 단순합니다. 당일 상승폭이 3~15% 사이인 종목을 매수하고, 추가로 일정 % 오르면 분할 매도, 일정 % 내리면 손절하는 방식입니다.

  • 변동성 조건: 당일 변동폭 3~15%
  • 거래량 조건: 최소 10만 주 이상
  • 코스닥 지수가 하락 추세면 신규 매수 금지

세션별 매매 전략

하루를 두 세션으로 나눕니다.

// 오전 세션: 09:10 ~ 09:30
// 오후 세션: 13:00 ~ 13:30

// 오전 익절 기준
1차 익절: +2% (일부 매도)
2차 익절: +4% (나머지 매도)
손절:     -2%

// 오후 익절 기준
1차 익절: +1.5%
2차 익절: +3%
손절:     -1.5%

오후 세션이 기준이 낮은 이유는 장 마감이 다가오면서 변동성이 줄어들기 때문입니다.

리스크 관리

자동매매에서 가장 중요한 것은 리스크 관리입니다. 알고리즘이 잘못 작동했을 때 손실이 무한정 커지지 않도록 여러 장치를 넣었습니다.

  • 일일 손실 한도: 하루 30만원 이상 손실이 나면 모든 매매를 중단하고 보유 종목을 전부 청산합니다.
  • 최대 보유 종목: 세션당 최대 3종목만 보유. 집중도를 높이고 리스크를 분산합니다.
  • 손절 후 쿨다운: 손절이 발생하면 30분간 해당 세션 신규 매수를 금지합니다.
  • 장마감 강제 청산: 15:15가 되면 보유 종목을 전부 시장가로 청산합니다.
  • 1회 최대 매수금액: 5만원 (최대 10주)

핵심 코드 구조

@Scheduled(fixedDelay = 5000)  // 5초마다 실행
public void tradingLoop() {
    if (!isTradingTime()) return;
    if (isOverDailyLossLimit()) {
        liquidateAll();
        return;
    }

    // 보유 종목 관리 (익절/손절 체크)
    for (Position pos : holdings) {
        double pnlRate = calcPnlRate(pos);
        if (pnlRate >= getTargetProfit()) {
            sellPartial(pos);
        } else if (pnlRate <= -getLossCutRate()) {
            sellAll(pos);
        }
    }

    // 신규 매수 탐색
    if (holdings.size() < MAX_HOLDINGS) {
        List<Stock> candidates = findMomentumStocks();
        candidates.stream().findFirst().ifPresent(this::buy);
    }
}

API 호출 예시

// 현재가 조회 (ka10001)
POST /api/dostk/stkpc
{
    "stk_cd": "005930",  // 삼성전자
    "qry_tp": "0"
}

// 주문 (kt10000)
POST /api/dostk/ordr
{
    "dmst_stk_yn": "Y",
    "acnt_no": "계좌번호",
    "acnt_pwd": "비밀번호",
    "stk_cd": "005930",
    "ord_qty": "5",
    "ord_uv": "0",      // 시장가
    "ord_dvsn_cd": "01" // 매수
}

거래 로그

모든 매매 내역은 CSV 파일로 저장합니다. 날짜별로 파일이 생성되고, 매수/매도 시점, 가격, 수익률이 기록됩니다. 나중에 전략을 백테스팅하거나 개선할 때 유용합니다.

// logs/trades_2025-03-28.csv
timestamp,action,stock,price,quantity,pnl_rate
09:15:23,BUY,종목코드,12500,4,0
09:22:41,SELL,종목코드,12750,2,+2.0%
09:31:15,SELL,종목코드,13010,2,+4.1%

운영하면서 배운 것들

  • 모의투자로 충분히 검증한 뒤 실계좌로 전환해야 합니다. 모의투자에서 잘 되던 것도 실계좌에서는 슬리피지, 체결 지연 등으로 다르게 동작할 수 있습니다.
  • 장 초반(9시~9시 10분)은 변동성이 너무 크고 API 응답도 느려서 제외했습니다.
  • 코스닥 지수 모니터링이 생각보다 중요합니다. 지수가 크게 빠지는 날은 개별 종목도 같이 빠져서 손절이 연속으로 나올 수 있습니다.