Special Session · 한국 주식

한국투자증권 모의투자

OAuth · HashKey · 한국 주식 호가단위

🏠 강의노트 홈 📦 이 페이지 GitHub ↗ 📂 SP 폴더 ↗
왜 SP인가

이번 세션 목표

W8까지의 시스템은 Alpaca = 미국 주식 위주입니다. 한국 투자자는 KOSPI/KOSDAQ 종목도 자동매매가 필요합니다. 한국투자증권(KIS) OpenAPI는:

Setup

1. 모의투자 신청 + 키 발급

  1. openapi.koreainvestment.com 가입
  2. 모의투자 신청 메뉴에서 신청 (실 계좌 신청 X)
  3. App Key, App Secret 발급 → n8n credential에 등록
  4. 모의투자 계좌번호 확인 (보통 50######)
🚫 실 계좌 키와 모의 키 절대 섞지 말 것. 가능하면 별도 이메일로 가입.
Auth

2. 접근 토큰 발급

POST https://openapivts.koreainvestment.com:29443/oauth2/tokenP
Content-Type: application/json

{
  "grant_type": "client_credentials",
  "appkey": "{APP_KEY}",
  "appsecret": "{APP_SECRET}"
}

응답:
{
  "access_token": "...",
  "token_type": "Bearer",
  "expires_in": 86400
}

토큰 24시간 유효. n8n에서 매일 1회 갱신하는 별도 워크플로우 + 발급된 토큰을 변수에 캐싱.

HashKey

3. HashKey 서명 (주문 API 필수)

주문 요청 body를 서명한 HashKey를 헤더에 함께 전달해야 합니다.

// Step 1: 본문을 별도 hashkey 발급 API로 서명
POST https://openapivts.koreainvestment.com:29443/uapi/hashkey
Headers:
  appkey: {APP_KEY}
  appsecret: {APP_SECRET}
Body: {주문 본문 그대로}

응답: { "HASH": "abc123..." }

// Step 2: 실 주문 호출 시 헤더에 HashKey 추가
POST https://openapivts.koreainvestment.com:29443/uapi/domestic-stock/v1/trading/order-cash
Headers:
  authorization: Bearer {access_token}
  appkey: {APP_KEY}
  appsecret: {APP_SECRET}
  tr_id: VTTC0802U   (모의 매수 / 매도는 VTTC0801U)
  hashkey: {HASH}
Body: {위와 동일한 주문 본문}
n8n 구현 — HashKey 발급 노드 → Set 노드(헤더에 hash 추가) → 주문 노드 순으로 체이닝.
호가 단위

4. 한국 주식 호가 단위 (KOSPI 기준)

가격대호가 단위
~ 2,000원1원
2,000 ~ 5,000원5원
5,000 ~ 20,000원10원
20,000 ~ 50,000원50원
50,000 ~ 200,000원100원
200,000 ~ 500,000원500원
500,000원 이상1,000원

지정가 주문 시 위 단위로 정렬되지 않으면 거부됩니다. 주문 직전 보정 함수:

function snapToTick(price) {
  let tick;
  if (price < 2000) tick = 1;
  else if (price < 5000) tick = 5;
  else if (price < 20000) tick = 10;
  else if (price < 50000) tick = 50;
  else if (price < 200000) tick = 100;
  else if (price < 500000) tick = 500;
  else tick = 1000;
  return Math.round(price / tick) * tick;
}
Workflow

5. 매수 주문 워크플로우

🔴 Trigger W7 BUY_STRONG (한국 종목만 필터)
🔵 Token 캐시된 access_token 가져오기 (없으면 발급)
⚫ Snap 주문가를 호가 단위로 snap
🔵 HashKey 주문 본문 → HashKey 발급
🔵 Order order-cash POST + HashKey 헤더
🟢 Log 주문이력 시트 + Slack 알림
주문 본문

매수 주문 본문 예시

{
  "CANO": "5012345678",       // 모의 계좌번호 앞 8자리
  "ACNT_PRDT_CD": "01",       // 상품코드
  "PDNO": "005930",           // 종목코드 (삼성전자)
  "ORD_DVSN": "00",           // 00=지정가, 01=시장가
  "ORD_QTY": "10",            // 주문수량
  "ORD_UNPR": "71500"         // 주문가 (시장가는 "0")
}
Missions

🟢 특별세션 과제

1
토큰 자동 갱신
매일 06:00 Cron으로 access_token 발급 → n8n static data에 저장
2
잔고 조회
현재 보유 종목·평가손익 조회 워크플로우 (HashKey 불필요)
3
단일 종목 매수
삼성전자 1주 시장가 매수 → 체결 확인 → 시장가 매도
4
호가 보정 검증
71523원 같은 보정 필요 가격을 입력해 정확히 71500으로 snap되는지
5
W7 한국 종목 연결
W7 verdict가 한국 ticker(.KS)면 KIS, 미국 ticker면 Alpaca로 분기
장 시간 주의 — 한국 주식 정규장은 09:00~15:30 (KST). 시간외는 별도 tr_id 필요. n8n Cron으로 시각 체크 후 발주.