AlgoLab Blog · 키움증권 REST · 수급 데이터 · 2026

키움 ka10064 장중투자자별매매차트 — 개인 칸이 없다

키움 REST · 차트 2026-10-27 · 약 7분 읽기 · 알고랩 AlgoLab
한 줄 요약

ka10064(장중투자자별매매차트요청)는 종목 1개의 "오늘 장중" 투자자별 매매를 시각(tm)별로 주는 TR인데, 응답 투자자 필드가 8개뿐이라 개인·금융투자·기타금융·사모펀드가 없습니다. 같은 종목 투자자 데이터인 일자 단위 ka10060은 13개를 줍니다. trde_tp는 "0"이 순매수(1 매수·2 매도)로, 짝 TR ka10065(1이 순매수)와 반대입니다. 요청에 날짜가 없어 지난 장중 흐름은 받을 수 없고, 종목코드를 넣는데도 mrkt_tp가 필수입니다. 기관계 orgn은 응답에 있는 투신·보험·은행·연기금등을 더해도 맞지 않으므로 그대로 써야 합니다. (키움 공식 명세·공식 GitHub 예제 기준, 2026-10-27 확인)

목차

  1. ka10064는 무엇을 주나 — 비슷한 TR 4개와 비교
  2. 요청·응답 실물
  3. 함정 5가지
  4. 안전하게 받는 코드
  5. 자주 묻는 질문

1. ka10064는 무엇을 주나 — 비슷한 TR 4개와 비교

"외국인이 오늘 장중에 이 종목을 사고 있나"를 봇이 보려면 장중 투자자 데이터가 필요합니다. 키움 REST API에는 이름이 비슷한 투자자 TR이 여럿 있고, 메뉴 위치도 시세·차트·순위정보·종목정보로 흩어져 있습니다. ka10064는 차트 메뉴(POST /api/dostk/chart)에 있으며, 종목 하나를 넣으면 그 종목의 장중 투자자별 값을 시각 순서로 돌려줍니다. 여러 종목 중 상위를 뽑아 주는 ka10065(장중투자자별매매상위)와 짝입니다.

TRURL단위날짜 지정투자자 필드개인
ka10064 장중투자자별매매차트chart종목 1개 · 장중 시각없음8개✗
ka10060 종목별투자자기관별차트chart종목 1개 · 일자dt13개○ ind_invsr
ka10059 종목별투자자기관별stkinfo종목 1개 · 일자dt13개○
ka10063 장중투자자별매매mrkcond시장 전체 · 종목 목록없음투자자 1개 선택✗
ka10066 장마감후투자자별매매mrkcond시장 전체 · 종목 목록없음12개○

정리하면 ka10064는 "한 종목 + 장중 + 시계열"을 주는 유일한 TR이지만, 그 대가로 투자자 구분이 가장 적습니다. 장중에 개인 흐름까지 보려는 설계라면 ka10064로는 안 되고, 장 마감 후 ka10066이나 다음 날 ka10059·ka10060으로 확정값을 받아야 합니다.

2. 요청·응답 실물

요청 헤더는 다른 키움 REST TR과 같습니다 — api-id: ka10064, authorization: Bearer ..., 연속조회 시 cont-yn·next-key. 요청 body는 4개 필드가 모두 필수(required: Y)입니다.

POST https://api.kiwoom.com/api/dostk/chart
api-id: ka10064
Content-Type: application/json;charset=UTF-8

{
    "mrkt_tp": "000",
    "amt_qty_tp": "1",
    "trde_tp": "0",
    "stk_cd": "005930"
}
필드한글명값
mrkt_tp시장구분000 전체 · 001 코스피 · 101 코스닥
amt_qty_tp금액수량구분1 금액(백만원) · 2 수량(1주)
trde_tp매매구분0 순매수 · 1 매수 · 2 매도
stk_cd종목코드KRX 039490 · NXT 039490_NX · SOR 039490_AL

명세에 실린 응답 예시는 이렇습니다(리스트 키 opmr_invsr_trde_chart).

{
    "opmr_invsr_trde_chart": [
        {"tm": "090000", "frgnr_invsr": "0", "orgn": "0", "invtrt": "0", "insrnc": "0",
         "bank": "0", "penfnd_etc": "0", "etc_corp": "0", "natn": "0"},
        {"tm": "092200", "frgnr_invsr": "3", "orgn": "0", ...},
        {"tm": "095200", "frgnr_invsr": "-68", "orgn": "0", ...}
    ],
    "return_code": 0,
    "return_msg": "정상적으로 처리되었습니다"
}

응답 필드는 tm(HHmmss)과 투자자 8개 — frgnr_invsr 외국인투자자, orgn 기관계, invtrt 투신, insrnc 보험, bank 은행, penfnd_etc 연기금등, etc_corp 기타법인, natn 국가 — 가 전부입니다. 현재가 cur_prc도 없어서 가격과 같이 보려면 분봉(ka10080 분봉 차트)을 따로 받아 시각으로 붙여야 합니다.

3. 함정 5가지

① 개인이 없다 — 그리고 "나머지로 계산"도 위험하다

ka10060·ka10059의 응답에는 ind_invsr(개인)·fnnc_invt(금융투자)·etc_fnnc(기타금융)·samo_fund(사모펀드)·natfor(내외국인)가 있지만 ka10064에는 다섯 개 모두 없습니다. 투자자별 순매수의 합이 0이라는 성질로 "개인 = −(외국인 + 기관계 + 기타법인 + 국가)"를 계산하고 싶어지는데, 이 식은 외국인에 기타외국인이 들어가는지, 국가가 기관계와 겹치는지 같은 분류 기준에 따라 어긋날 수 있고 키움 명세는 그 기준을 적어 두지 않았습니다. 추정치로 쓰더라도 장 마감 후 ka10066의 ind_invsr와 비교해 오차를 먼저 재 보는 게 맞습니다.

② 기관계 ≠ 하위 항목의 합

응답에 있는 기관 하위 항목은 invtrt·insrnc·bank·penfnd_etc 네 개뿐입니다. 기관계에는 보통 금융투자·기타금융·사모펀드가 같이 들어가는데 그 셋이 응답에 없으니, 네 개를 더한 값은 orgn과 같지 않습니다. 봇에서 "기관 합계"를 직접 계산하지 말고 orgn을 그대로 쓰세요. 금융투자(증권사 자기매매)가 큰 날일수록 차이가 벌어집니다.

③ trde_tp 0이 순매수 — ka10065와 반대

ka10064·ka10059·ka10060·ka10066은 "0"이 순매수, "1"이 매수입니다. 반면 ka10065는 "1"이 순매수, ka10058은 "1"이 순매도입니다. 상위 종목을 ka10065로 고르고 그 종목의 흐름을 ka10064로 받는 봇이 상수 하나("1")를 같이 쓰면, ka10064에서는 순매수가 아니라 총매수 시계열이 오고 오류는 나지 않습니다. 번호 체계 전체는 ka10065 글의 trde_tp 표에 정리했습니다. 비슷한 장중 TR ka10063은 투자자를 invsr로 고르는데 여기서는 6이 외국인, 7이 기관계라서 ka10065의 9000(외국인)과도 또 다릅니다.

④ 날짜가 없다 — 오늘 것만, 쌓는 건 봇의 몫

요청 body에 dt나 base_dt가 없고, 응답 tm도 날짜 없는 HHmmss입니다. 명세상 지난 날짜의 장중 흐름은 요청할 방법이 없습니다. 장중 수급으로 백테스트를 하고 싶다면 오늘부터 봇이 직접 받아 날짜를 붙여 저장하는 수밖에 없습니다. 또 예시의 시각 간격은 09:00 → 09:22 → 09:52로 22분·30분이라 일정하지 않습니다. 행 하나를 "1분봉 1개"로 가정해 이동평균을 내면 틀립니다. 값이 그 시각까지의 누적인지 구간 값인지도 명세에 적혀 있지 않습니다 — 첫 행이 전부 0인 모양은 누적과 맞아 보이지만, 실계좌 응답을 두 번 이상 받아 비교해 확인하고 쓰세요.

⑤ 종목코드를 넣어도 mrkt_tp가 필수

종목 하나를 지정하는 TR인데도 mrkt_tp가 필수입니다. 337개 TR 중 요청에 mrkt_tp와 stk_cd를 함께 받는 것은 ka10064·ka10052·ka10054·kt00009 네 개뿐입니다. 코스닥 종목에 001(코스피)을 넣었을 때의 동작은 명세에 없으므로, 공식 예제처럼 "000"(전체)으로 두는 것이 안전합니다. 또 거래소 구분 stex_tp 파라미터가 없고, NXT·SOR은 종목코드 뒤 _NX·_AL로 고릅니다.

ka10060 (일자) · 13개 ka10064 (장중) · 8개 개인 외국인 기관계 금융투자 보험 투신 기타금융 은행 연기금 사모 국가 기타법인 내외국 외국인 기관계 보험 투신 은행 연기금 국가 기타법인 ka10064 응답에 없는 투자자 5개
투자자 필드 비교 · 키움 REST 공식 명세(kiwoom-rest-api main 953e5db) 기준

4. 안전하게 받는 코드

키움 공식 GitHub의 예제(examples/국내주식/차트/get_domestic_intraday_investor_trade_chart.py)는 cont-yn이 Y인 동안 최대 10페이지, 0.2초 간격으로 연속조회를 하고 pandas DataFrame으로 바꿔 줍니다. 다만 값을 문자열 그대로 두므로 봇에서 계산하려면 숫자로 바꿔야 하고, 날짜도 직접 붙여야 합니다. 부호 처리는 형제 TR을 보면 조심할 이유가 있습니다 — ka10063 명세 예시에는 "sell_qty": "--30000"처럼 마이너스가 두 번 붙은 값이 실려 있습니다.

import pandas as pd

FIELDS = ["frgnr_invsr", "orgn", "invtrt", "insrnc", "bank",
          "penfnd_etc", "etc_corp", "natn"]          # ka10064 응답 전부 — 개인 없음
NET_BUY = "0"                                        # ka10064 전용 (ka10065는 "1")

def to_num(v: str) -> float:
    s = str(v).strip().replace(",", "")
    neg = s.startswith("-")
    s = s.lstrip("+-")                               # '+3', '-68', '--30000' 모두 처리
    return -float(s or 0) if neg else float(s or 0)

def parse_ka10064(body: dict, today: str) -> pd.DataFrame:
    """today = 'YYYYMMDD' — 응답 tm에 날짜가 없으므로 받은 날짜를 붙인다."""
    df = pd.DataFrame(body.get("opmr_invsr_trde_chart", []))
    if df.empty:
        return df
    df["ts"] = pd.to_datetime(today + df["tm"], format="%Y%m%d%H%M%S")
    for c in FIELDS:
        df[c] = df[c].map(to_num)
    return df.set_index("ts").sort_index()[FIELDS]

body = {"mrkt_tp": "000", "amt_qty_tp": "1", "trde_tp": NET_BUY, "stk_cd": "005930"}

명세의 응답 예시를 그대로 넣어 돌린 출력입니다.

                     frgnr_invsr  orgn  etc_corp
ts
2026-10-27 09:00:00          0.0   0.0       0.0
2026-10-27 09:22:00          3.0   0.0       0.0
2026-10-27 09:52:00        -68.0   0.0       0.0
[Timedelta('0 days 00:22:00'), Timedelta('0 days 00:30:00')]

amt_qty_tp="1"이면 단위가 백만원이므로 −68은 외국인 약 6,800만원 순매도입니다. 행 간격이 고정이 아니라는 것도 출력에서 바로 보입니다. 이 결과를 그날 날짜 파일(예: ka10064_005930_20261027.csv)로 저장해 두면 몇 달 뒤 장중 수급 백테스트 재료가 됩니다.

5. 자주 묻는 질문

ka10064로 장중 개인 순매수를 받을 수 있나요?

받을 수 없습니다. ka10064 응답 필드는 시간 tm과 외국인·기관계·투신·보험·은행·연기금등·기타법인·국가 8개 투자자뿐이고 개인(ind_invsr)이 없습니다. 개인 값이 필요하면 일자 단위인 ka10059·ka10060이나 장 마감 후 ka10066을 써야 합니다.

ka10064의 trde_tp는 어떤 값을 넣어야 순매수인가요?

0이 순매수, 1이 매수, 2가 매도입니다. 같은 장중 투자자 데이터인 ka10065는 1이 순매수라서, 한 상수를 두 TR에 같이 쓰면 ka10064에서는 순매수가 아니라 총매수 시계열이 옵니다.

ka10064로 지난 날짜의 장중 흐름을 볼 수 있나요?

공식 명세상으로는 볼 수 없습니다. 요청 body가 mrkt_tp·amt_qty_tp·trde_tp·stk_cd 4개뿐이고 날짜 파라미터가 없으며, 응답 시각 tm도 HHmmss로 날짜가 빠져 있습니다. 장중 흐름을 쌓으려면 봇이 그날그날 받아 날짜를 붙여 저장해야 합니다.

ka10064의 기관계는 투신·보험·은행·연기금을 더한 값인가요?

그렇게 계산하면 맞지 않습니다. 기관계 orgn에는 ka10064 응답에 없는 금융투자·기타금융·사모펀드가 포함되는 것이 일반적인 분류이므로, 응답에 있는 하위 4개를 더해도 orgn과 같지 않습니다. 기관 전체는 orgn 값을 그대로 쓰는 것이 안전합니다.

장중 수급을 보는 봇, 만들어 드립니다

ka10064·ka10065로 외국인·기관 장중 흐름을 받아 쌓고, 필터로 쓰는 키움 REST 봇을 맞춤 제작합니다. 24시간 빠른 답변 가능합니다.

무료 상담 시작하기