KIS 신용주문 TTTC0052U — 신용유형 8종·대출일자 함정
한국투자증권 KIS API의 국내주식 신용주문은 POST /uapi/domestic-stock/v1/trading/order-credit 하나로, 신용매수 TTTC0052U · 신용매도 TTTC0051U입니다(공식 저장소 신규 예제 기준 — Postman v2.6에는 TTTC0852U/TTTC0851U로 남아 있음). 현금주문과 다른 필수값은 CRDT_TYPE(신용유형 8종)과 LOAN_DT(대출일자) 둘이고, 신용매수 때 산 주식을 갚는 것은 매도 TR TTTC0051U + CRDT_TYPE=25/27입니다. LOAN_DT는 신용매수면 오늘 날짜, 상환 매도면 잔고조회(TTTC8434R) 응답의 loan_dt를 넣습니다. 모의투자는 지원되지 않습니다.
현금주문(TTTC0012U)으로 잘 돌던 봇에 "신용으로도 사게 해 주세요"라는 요구가 붙으면, 대부분 tr_id만 바꾸면 될 거라고 생각합니다. 실제로는 주문 방향과 신용유형의 짝, 대출일자를 어디서 가져오는지, 그리고 모의투자로 검증할 수 없다는 점까지 세 가지가 함께 바뀝니다. 이 글은 공식 저장소 koreainvestment/open-trading-api(2026-10-06 내려받은 main 브랜치)의 examples_llm/domestic_stock/order_credit/, MCP/KIS Code Assistant MCP/data.csv, legacy/postman/실전계좌_POSTMAN_샘플코드_v2.6.json을 대조해 정리했습니다. 시장 전체의 신용잔고(융자·대주 잔고 추이) 데이터는 허브 글 KIS 신용잔고 API — 융자·대주·대차 구분에서 다룹니다. 이 글은 내 계좌의 신용주문입니다.
1. 신용주문 API 한눈에
| 항목 | 값 | 출처 |
|---|---|---|
| API 이름 | 주식주문(신용) [v1_국내주식-002] | order_credit.py |
| URL | /uapi/domestic-stock/v1/trading/order-credit (POST) | 같은 파일 API_URL |
| tr_id (신규 예제) | 매수 TTTC0052U · 매도 TTTC0051U | order_credit.py·domestic_stock_functions.py |
| tr_id (Postman v2.6) | 매수 TTTC0852U · 매도 TTTC0851U | 실전계좌 Postman 헤더 설명 |
| 모의투자 | 사용 불가 | 독스트링 "※ 모의투자는 사용 불가합니다." · Postman "* 모의투자 사용 불가" |
| 필수 BODY | CANO ACNT_PRDT_CD PDNO CRDT_TYPE LOAN_DT ORD_DVSN ORD_QTY ORD_UNPR | 필수 파라미터 검증부 |
| 응답 output | krx_fwdg_ord_orgno(한국거래소전송주문조직번호) · odno(주문번호) · ord_tmd(주문시간) | chk_order_credit.py COLUMN_MAPPING |
BODY 키는 대문자로 보내야 합니다. 독스트링에 "POST API의 경우 BODY값의 key값들을 대문자로 작성하셔야 합니다"라고 명시돼 있습니다. Postman 컬렉션 헤더에는 hashkey도 들어 있는데, 이것이 필수인지 아닌지는 KIS hashkey 정리에 따로 실측해 두었습니다.
2. CRDT_TYPE 8종 — 방향과 짝이 정해져 있다
CRDT_TYPE 설명은 공식 예제에 이렇게 한 줄로 적혀 있습니다.
crdt_type (str): [필수] 신용유형 (ex. [매도] 22:유통대주신규, 24:자기대주신규, 25:자기융자상환, 27:유통융자상환 / [매수] 21:자기융자신규, 23:유통융자신규 , 26:유통대주상환, 28:자기대주상환)
한 줄로 읽으면 헷갈리지만, 표로 펴면 규칙이 보입니다. 융자(돈을 빌려 산 것)는 매수로 열고 매도로 닫고, 대주(주식을 빌려 판 것)는 매도로 열고 매수로 닫습니다.
| 무엇을 | 열기(신규) | 닫기(상환) |
|---|---|---|
| 자기융자 | 매수 TTTC0052U + 21 | 매도 TTTC0051U + 25 |
| 유통융자 | 매수 TTTC0052U + 23 | 매도 TTTC0051U + 27 |
| 자기대주 | 매도 TTTC0051U + 24 | 매수 TTTC0052U + 28 |
| 유통대주 | 매도 TTTC0051U + 22 | 매수 TTTC0052U + 26 |
'자기'는 증권사 자체 자금·주식으로, '유통'은 증권금융을 거친 자금·주식으로 빌려 주는 방식을 가리키는 업계 용어입니다. 내 계좌에 어떤 유형이 약정돼 있는지는 계좌마다 다르니 한국투자증권 신용거래 약정 내용을 확인하십시오. 봇 입장에서 중요한 건 하나입니다. 상환할 때는 신규 때 쓴 유형의 짝을 넣어야 합니다(21로 샀으면 25로 판다).
3. LOAN_DT — 오늘이냐, 그 종목의 대출일이냐
loan_dt (str): [필수] 대출일자 (ex. [신용매수] 오늘날짜(yyyyMMdd), [신용매도] 매도할 종목의 대출일자(yyyyMMdd))
신규 매수는 오늘 날짜라 간단합니다. 문제는 상환 매도입니다. "매도할 종목의 대출일자"는 봇이 기억하고 있어야 하는 값이 아니라 잔고조회 응답에서 읽어 오는 값입니다. 주식잔고조회(TTTC8434R) 예제의 COLUMN_MAPPING에 신용 관련 필드가 들어 있습니다.
# examples_llm/domestic_stock/inquire_balance/chk_inquire_balance.py (발췌)
'loan_dt': '대출일자',
'loan_amt': '대출금액',
'stln_slng_chgs': '대주매각대금',
'stck_loan_unpr': '주식대출단가',
...
'tot_loan_amt': '총대출금액',
'tot_stln_slng_chgs': '총대주매각대금',
같은 종목을 여러 날에 걸쳐 신용으로 샀다면 대출일자가 여러 개일 수 있습니다. 봇이 "종목코드만 보고 전량 상환"하도록 짜면 대출일자 하나만 맞고 나머지는 남습니다. 잔고 응답의 행을 pdno와 loan_dt 두 키로 묶어서 상환 주문을 행마다 따로 내는 것이 안전합니다. 잔고 응답의 연속조회 처리는 실현손익 잔고조회 TTTC8494R 글의 코드를 그대로 쓰면 됩니다.
4. 주문 전에 부를 API 2개
| API | tr_id · URL | 봇이 쓰는 값 |
|---|---|---|
| 국내주식 당사 신용가능종목 [국내주식-111] | FHPST04770000 · /uapi/domestic-stock/v1/quotations/credit-by-company | fid_slct_yn(0:신용주문가능, 1:신용주문불가)로 걸러 받은 stck_shrn_iscd·crdt_rate(신용 비율) |
| 신용매수가능조회 | TTTC8909R · /uapi/domestic-stock/v1/trading/inquire-credit-psamount | max_buy_qty(최대매수수량) · max_buy_amt · ord_psbl_cash · nrcvb_buy_qty(미수없는매수수량) |
신용가능종목은 증권사가 정하는 목록이라 장중에도 바뀔 수 있다고 보고, 주문 직전에 한 번 더 확인하는 쪽을 권합니다. 신용매수가능조회의 ord_unpr 설명에는 "장전/장후 시간외, 시장가의 경우 "0" 입력 권고"라고 적혀 있어, 시장가 신용주문이라면 가능수량 조회도 단가 0으로 맞춰 부르는 것이 공식 예제와 같은 방식입니다.
5. 함정 5가지
① tr_id가 두 계열로 돌아다닌다
신규 예제(examples_llm·examples_user)는 TTTC0052U/TTTC0051U, Postman v2.6과 우리 사이트의 모의투자 한계 글이 인용한 옛 표기는 TTTC0852U/TTTC0851U입니다. 현금주문도 같은 모양입니다 — Postman은 TTTC0802U, 신규 예제는 TTTC0012U. 블로그나 깃허브에서 복사한 코드가 08로 시작하는 코드를 쓰고 있다면 KIS Developers 포털의 현재 문서와 공지를 확인하고 신규 계열로 맞추십시오. 옛 코드가 지금도 받아지는지는 공식 공지로만 판단할 일이라 여기서 단정하지 않습니다.
② 모의투자로 검증할 수 없다
공식 kis_auth.py는 모의 모드에서 tr_id 첫 글자를 V로 바꿉니다(TTTC0052U → VTTC0052U). 신용주문은 모의 서버에 대응 TR이 없어 이 치환이 일어나도 주문이 되지 않습니다. 그래서 신용 로직은 실계좌에서 최소 수량으로 확인해야 하고, 봇에 "모의 모드에서는 신용 주문 함수를 호출하지 않고 로그만 남긴다"는 분기를 넣어 두는 것이 좋습니다.
③ 예제의 LOAN_DT "20220810"을 그대로 복사
chk_order_credit.py, data.csv example, Postman 요청 본문 모두 "LOAN_DT": "20220810"으로 고정돼 있습니다. 2022년 날짜로 신용매수를 보내는 셈이라, 신규 매수에서는 반드시 실행일 날짜로 바꿔야 합니다. 아래 코드처럼 datetime.now().strftime("%Y%m%d")로 만들되, 서버 시간대가 한국시간(KST)인지도 확인하십시오. 해외 VPS에서 UTC로 돌면 오전 9시 이전에는 날짜가 하루 전으로 나옵니다.
④ 상환을 매수 TR로 보낸다
"신용으로 산 걸 정리한다"를 코드로 옮길 때 가장 흔한 실수입니다. 융자 상환은 매도(ord_dv="sell" → TTTC0051U)에 CRDT_TYPE=25 또는 27입니다. 반대로 대주 상환은 매수입니다. 2절의 표를 코드의 딕셔너리로 박아 두고 문자열을 손으로 조합하지 않는 것이 안전합니다.
⑤ 응답은 주문번호뿐 — 체결은 따로 확인
응답 output은 krx_fwdg_ord_orgno·odno·ord_tmd 세 필드입니다. rt_cd == "0"은 주문 접수이지 체결이 아닙니다. 체결 여부는 주문체결조회 TTTC0081R로 확인하고, 정정·취소에는 이 odno와 krx_fwdg_ord_orgno를 그대로 씁니다(KIS 정정·취소 주문). 거래소를 고르는 EXCG_ID_DVSN_CD(KRX·NXT·SOR)는 선택값인데, 넥스트레이드 시간대에 주문한다면 NXT·KRX 주문 라우팅을 먼저 보십시오.
6. 동작하는 코드 — 신규 매수와 행 단위 상환
from datetime import datetime
import kis_auth as ka # 공식 저장소 examples_user/kis_auth.py
API_URL = "/uapi/domestic-stock/v1/trading/order-credit"
# (방향, CRDT_TYPE) — 2절 표를 그대로 옮긴 것
CRDT = {
("open", "self_loan"): ("buy", "21"), # 자기융자신규
("open", "dist_loan"): ("buy", "23"), # 유통융자신규
("close", "self_loan"): ("sell", "25"), # 자기융자상환
("close", "dist_loan"): ("sell", "27"), # 유통융자상환
}
TR = {"buy": "TTTC0052U", "sell": "TTTC0051U"}
def credit_order(trenv, pdno, action, kind, qty, price, loan_dt=None, ord_dvsn="00"):
if ka.isPaperTrading():
print("[SKIP] 신용주문은 모의투자 미지원:", pdno, action, kind, qty)
return None
side, crdt_type = CRDT[(action, kind)]
if action == "open":
loan_dt = datetime.now().strftime("%Y%m%d") # 서버 시간대 KST 확인
elif not loan_dt:
raise ValueError("상환 매도는 잔고(TTTC8434R)의 loan_dt가 필요합니다")
body = {
"CANO": trenv.my_acct, "ACNT_PRDT_CD": trenv.my_prod,
"PDNO": pdno, "CRDT_TYPE": crdt_type, "LOAN_DT": loan_dt,
"ORD_DVSN": ord_dvsn, "ORD_QTY": str(qty), "ORD_UNPR": str(price),
}
res = ka._url_fetch(API_URL, TR[side], "", body, postFlag=True)
if not res.isOK():
res.printError(url=API_URL)
return None
return res.getBody().output # krx_fwdg_ord_orgno, odno, ord_tmd
# 상환: 잔고 행마다 (pdno, loan_dt) 단위로 따로 낸다
def repay_all(trenv, balance_rows, kind="self_loan"):
for r in balance_rows:
if r.get("loan_dt") and int(r.get("hldg_qty", "0")) > 0:
credit_order(trenv, r["pdno"], "close", kind,
r["hldg_qty"], "0", loan_dt=r["loan_dt"], ord_dvsn="01")
마지막 줄의 ORD_DVSN="01"(시장가)·ORD_UNPR="0"은 예시입니다. 시장가 주문 가능 여부와 주문구분 코드 목록(00 지정가 · 01 시장가 · 05 장전 시간외 등)은 신용매수가능조회 독스트링의 ord_dvsn 설명과 포털 문서를 확인하고 정하십시오. 오류 응답의 msg_cd·msg1 읽는 법은 KIS API 에러코드 11가지에 있습니다.
7. 자주 묻는 질문
KIS API 신용주문 tr_id는 TTTC0852U인가요, TTTC0052U인가요?
2026-10-06 기준 공식 저장소의 신규 예제(examples_llm·examples_user)는 신용매수 TTTC0052U, 신용매도 TTTC0051U를 씁니다. Postman 컬렉션 v2.6에는 옛 표기인 TTTC0852U·TTTC0851U가 남아 있습니다. 새로 만드는 코드는 신규 계열로 쓰고, KIS Developers 포털의 현재 문서와 공지로 확인하십시오.
신용으로 산 주식은 어떤 주문으로 갚나요?
매도 TR인 TTTC0051U에 CRDT_TYPE을 자기융자면 25, 유통융자면 27로 넣고, LOAN_DT에는 잔고조회 응답의 loan_dt(그 종목의 대출일자)를 넣습니다. 대주로 판 주식을 갚을 때는 반대로 매수 TR TTTC0052U에 26 또는 28입니다.
KIS 모의투자에서 신용주문을 테스트할 수 있나요?
없습니다. 공식 예제 독스트링과 Postman 설명 모두 모의투자 사용 불가로 적혀 있습니다. 모의 모드에서는 신용주문 함수를 건너뛰고 로그만 남기도록 분기한 뒤, 실계좌에서 최소 수량으로 확인하십시오.
어떤 종목이 신용 가능한지 API로 알 수 있나요?
국내주식 당사 신용가능종목 API(FHPST04770000, /quotations/credit-by-company)에서 fid_slct_yn=0(신용주문가능)으로 조회하면 종목코드와 신용 비율(crdt_rate)을 받을 수 있습니다. 주문 가능 수량은 신용매수가능조회(TTTC8909R)의 max_buy_qty로 확인합니다.
고지. 이 글은 공개된 한국투자증권 API 명세를 기술적으로 설명한 것이며 신용거래를 권유하지 않습니다. 신용거래는 빌린 자금·주식으로 하는 거래로 손실이 원금을 넘을 수 있고 담보 부족 시 반대매매가 일어날 수 있으니, 약정 조건과 위험 고지를 증권사에서 직접 확인하십시오. tr_id·파라미터·응답 필드는 공식 저장소(koreainvestment/open-trading-api, 2026-10-06 main)에서 확인했으며 변경될 수 있으므로 KIS Developers 포털의 현재 문서를 확인하십시오. 알고랩(퀀트웍스)은 투자자문업·투자일임업을 영위하지 않으며, 고객이 지정한 규칙을 프로그램으로 구현해 드리는 도구 제공자입니다.