주식 종목 분석에서 신용 거래 데이터 활용

주식 시장에서 신용 거래 데이터는 개인 투자자들의 심리와 레버리지 수준을 파악할 수 있는 핵심 보조 지표입니다. 이번 포스트에서는 신용 거래 데이터의 각 항목이 무엇을 의미하는지, 그리고 이를 종목 분석에 어떻게 활용할 수 있는지 다루겠습니다.
신용 거래란?
섹션 제목: “신용 거래란?”신용 거래는 증권사로부터 자금이나 주식을 빌려서 매매하는 방식으로, 크게 두 가지로 나뉩니다.
| 구분 | 설명 |
|---|---|
| 융자 | 증권사에서 돈을 빌려 주식을 매수 (레버리지 매수) |
| 대주 | 증권사에서 주식을 빌려 매도 (공매도의 일종) |
융자 잔고가 늘어난다는 것은 개인 투자자들이 빚을 내서까지 해당 종목을 사고 있다는 뜻이고, 대주 잔고가 늘어난다는 것은 해당 종목의 하락에 베팅하는 수요가 있다는 뜻입니다.
데이터 항목
섹션 제목: “데이터 항목”신용 거래 데이터는 일반적으로 증권사 API나 HTS에서 다음과 같은 항목들로 제공됩니다. 아래는 키움증권 API를 통해 수집할 수 있는 항목들입니다.
| 항목 | 설명 |
|---|---|
| 종목코드 | 대상 종목 |
| 일자 | 거래 기준일 |
| 조회구분 | 융자(1) 또는 대주(2) |
| 현재가 | 해당일 종가 |
| 거래량 | 해당일 거래량 |
| 신규 | 해당일 새로 발생한 신용 거래 수량 |
| 상환 | 해당일 상환(청산)된 신용 거래 수량 |
| 잔고 | 현재 미상환 신용 거래 누적 수량 |
| 금액 | 잔고의 금액 환산 (잔고 × 현재가) |
| 대비 | 전일 대비 잔고 변화량 |
| 공여율 | 증권사가 공여한 비율 |
| 잔고율 | 상장주식수 대비 신용 잔고 비율 (%) |
데이터를 DB에 저장한다면 다음과 같은 테이블 구조로 설계할 수 있습니다.
stock_credit 테이블─────────────────────────────────────────────code (PK) 종목코드 예: '005930'date (PK) 일자 예: '20260220'qry_tp (PK) 조회구분 1:융자, 2:대주close 현재가volume 거래량new 신규repayment 상환balance 잔고amount 금액balance_diff 대비supply_ratio 공여율balance_ratio 잔고율─────────────────────────────────────────────예시 데이터
섹션 제목: “예시 데이터”분석 예시를 위해 가상의 종목 A에 대한 20일간 융자 데이터를 만들어 보겠습니다.
import pandas as pd
# 종목 A의 융자(신용매수) 데이터 예시df = pd.DataFrame({ "date": [ "20260203", "20260204", "20260205", "20260206", "20260207", "20260210", "20260211", "20260212", "20260213", "20260214", "20260217", "20260218", "20260219", "20260220", "20260221", "20260224", "20260225", "20260226", "20260227", "20260228", ], "close": [ 50000, 50500, 51200, 52000, 53500, 54000, 55000, 54200, 53000, 51500, 50800, 50000, 49500, 48000, 47000, 47500, 48200, 49000, 50500, 51000, ], "volume": [ 1200000, 1350000, 1500000, 1800000, 2200000, 1900000, 2500000, 2100000, 2800000, 3200000, 2600000, 2400000, 2000000, 3500000, 3000000, 1800000, 1600000, 1400000, 1300000, 1200000, ], "new": [ 150, 200, 280, 350, 500, 420, 600, 380, 300, 250, 200, 180, 150, 120, 100, 130, 160, 140, 120, 110, ], "repayment": [ 100, 120, 130, 150, 180, 200, 220, 350, 400, 380, 350, 300, 280, 350, 320, 200, 180, 170, 150, 140, ], "balance": [ 3050, 3130, 3280, 3480, 3800, 4020, 4400, 4430, 4330, 4200, 4050, 3930, 3800, 3570, 3350, 3280, 3260, 3230, 3200, 3170, ], "amount": [ 15250, 15807, 16794, 18096, 20330, 21708, 24200, 24011, 22949, 21630, 20574, 19650, 18810, 17136, 15745, 15580, 15713, 15827, 16160, 16167, ], "balance_ratio": [ 1.02, 1.04, 1.09, 1.16, 1.27, 1.34, 1.47, 1.48, 1.44, 1.40, 1.35, 1.31, 1.27, 1.19, 1.12, 1.09, 1.09, 1.08, 1.07, 1.06, ],})위 데이터는 “상승 → 과열 → 하락 → 안정” 의 전형적인 사이클을 보여줍니다.
종목 분석 활용 방안
섹션 제목: “종목 분석 활용 방안”1. 잔고율(balance_ratio)로 과열 여부 판단
섹션 제목: “1. 잔고율(balance_ratio)로 과열 여부 판단”잔고율은 상장주식수 대비 신용 잔고의 비율입니다. 이 값이 높을수록 레버리지 매수가 과도하게 쌓여 있다는 뜻입니다.
import matplotlib.pyplot as plt
fig, ax1 = plt.subplots(figsize=(12, 5))ax2 = ax1.twinx()
ax1.plot(df["date"], df["close"], label="주가", color="black", marker="o", markersize=3)ax2.bar(df["date"], df["balance_ratio"], alpha=0.3, label="잔고율(%)", color="red")ax2.axhline(y=1.3, color="red", linestyle="--", alpha=0.5, label="주의 기준선")
ax1.set_ylabel("주가")ax2.set_ylabel("잔고율(%)")ax1.set_xticklabels(df["date"], rotation=45, ha="right")plt.title("주가 vs 융자 잔고율")fig.tight_layout()plt.show()예시 데이터를 보면 잔고율이 1.47%까지 올라간 2월 11일을 정점으로, 이후 주가가 하락하면서 잔고율도 함께 줄어드는 전형적인 패턴을 확인할 수 있습니다.
해석 기준 (종목/업종별로 기준이 다를 수 있음):
- 잔고율 평소 대비 급등: 신용 매수 과열 → 주의 필요
- 잔고율 고점 유지 + 주가 하락: 반대매매 리스크 존재
- 잔고율 급등 후 주가 하락: 반대매매 연쇄로 추가 하락 가능성
2. 신규(new) vs 상환(repayment) 추이로 수급 방향 파악
섹션 제목: “2. 신규(new) vs 상환(repayment) 추이로 수급 방향 파악”신규가 상환보다 많으면 신용 매수세가 유입되고 있다는 뜻이고, 반대면 청산이 진행 중입니다.
# 신규 - 상환 = 순신규df["net_new"] = df["new"] - df["repayment"]
# 5일 이동평균df["net_new_ma5"] = df["net_new"].rolling(5).mean()
fig, ax1 = plt.subplots(figsize=(12, 5))ax2 = ax1.twinx()
ax1.plot(df["date"], df["close"], label="주가", color="black", marker="o", markersize=3)
colors = ["blue" if v >= 0 else "red" for v in df["net_new"]]ax2.bar(df["date"], df["net_new"], alpha=0.3, color=colors)ax2.plot(df["date"], df["net_new_ma5"], label="순신규 MA5", color="orange")ax2.axhline(y=0, color="gray", linestyle="--")
ax1.set_ylabel("주가")ax2.set_ylabel("순신규 (신규 - 상환)")ax1.set_xticklabels(df["date"], rotation=45, ha="right")plt.title("순신규 융자 추이")fig.tight_layout()plt.show()예시에서 2월 첫째 주에는 순신규가 양수(파란색)로 신용 매수가 활발했지만, 2월 12일부터 순신규가 음수(빨간색)로 전환되면서 청산이 시작되었습니다. 이 시점이 주가 하락과 일치합니다.
해석:
- 순신규 양수 지속: 개인의 레버리지 매수 증가 → 단기 상승 기대감, 하지만 과열 주의
- 순신규 음수 전환: 신용 청산 시작 → 매도 압력 증가 가능
3. 잔고 변화와 주가 방향의 다이버전스
섹션 제목: “3. 잔고 변화와 주가 방향의 다이버전스”주가는 상승하는데 신용 잔고가 급증하는 경우, 또는 주가가 하락하는데 신용 잔고가 줄지 않는 경우는 위험 신호입니다.
# 주가 변화율 vs 잔고 변화율 비교df["price_change"] = df["close"].pct_change()df["balance_change"] = df["balance"].pct_change()
# 주가 하락 + 잔고 증가 = 위험 신호df["danger_signal"] = (df["price_change"] < -0.01) & (df["balance_change"] > 0)
print(df[["date", "close", "price_change", "balance", "balance_change", "danger_signal"]])예시 데이터에서 2월 12일을 보면, 주가가 54,000→54,200→53,000으로 하락하는데 잔고는 4,020→4,430→4,330으로 여전히 높은 수준을 유지합니다. 이런 구간이 반대매매 리스크가 높은 구간입니다.
| 시나리오 | 주가 | 신용 잔고 | 해석 |
|---|---|---|---|
| 건전한 상승 | ↑ | → 또는 ↓ | 자기자본 매수 → 안정적 |
| 과열 상승 | ↑ | ↑↑ | 레버리지 의존 → 조정 시 급락 위험 |
| 위험 하락 | ↓ | → 또는 ↑ | 물타기 or 미청산 → 반대매매 리스크 |
| 건전한 조정 | ↓ | ↓ | 손절 진행 → 바닥 형성 가능 |
4. 융자와 대주 데이터 결합 분석
섹션 제목: “4. 융자와 대주 데이터 결합 분석”융자(조회구분=1)와 대주(조회구분=2)를 함께 보면 시장 참여자들의 방향성에 대한 더 입체적인 분석이 가능합니다.
# 융자 잔고 (위의 df에서 가져옴)df_loan = df[["date", "balance", "balance_ratio"]].rename( columns={"balance": "loan_balance", "balance_ratio": "loan_ratio"})
# 같은 종목의 대주 잔고 예시df_borrow = pd.DataFrame({ "date": df["date"], "borrow_balance": [ 200, 210, 220, 250, 280, 300, 350, 400, 450, 500, 520, 530, 510, 480, 450, 420, 390, 370, 350, 330, ], "borrow_ratio": [ 0.07, 0.07, 0.07, 0.08, 0.09, 0.10, 0.12, 0.13, 0.15, 0.17, 0.17, 0.18, 0.17, 0.16, 0.15, 0.14, 0.13, 0.12, 0.12, 0.11, ],})
df_combined = df_loan.merge(df_borrow, on="date")df_combined["loan_borrow_ratio"] = df_combined["loan_balance"] / df_combined["borrow_balance"]
fig, ax1 = plt.subplots(figsize=(12, 5))ax1.plot(df_combined["date"], df_combined["loan_borrow_ratio"], marker="o", markersize=3)ax1.set_ylabel("융자/대주 비율")ax1.set_xticklabels(df_combined["date"], rotation=45, ha="right")plt.title("융자/대주 잔고 비율 추이")fig.tight_layout()plt.show()해석:
- 융자/대주 비율 상승: 매수 레버리지가 매도보다 우세 → 강세 심리
- 융자/대주 비율 하락: 매도(대주) 비중 증가 → 약세 심리 또는 헷지 수요
5. 신용 금액(amount)으로 레버리지 규모 파악
섹션 제목: “5. 신용 금액(amount)으로 레버리지 규모 파악”잔고율과 함께 금액 항목을 보면 실제 레버리지의 절대 규모를 파악할 수 있습니다.
fig, ax1 = plt.subplots(figsize=(12, 5))ax2 = ax1.twinx()
ax1.plot(df["date"], df["close"], label="주가", color="black", marker="o", markersize=3)ax2.fill_between(range(len(df)), df["amount"], alpha=0.2, color="green", label="신용 금액")ax2.plot(df["date"], df["amount"], color="green", alpha=0.7)
ax1.set_ylabel("주가")ax2.set_ylabel("신용 금액 (백만원)")ax1.set_xticklabels(df["date"], rotation=45, ha="right")plt.title("주가 vs 신용 잔고 금액")fig.tight_layout()plt.show()예시에서 신용 금액은 2월 11일 24,200백만원으로 최고치를 기록한 뒤, 주가 하락과 함께 15,745백만원까지 줄어들었습니다. 금액 감소가 잔고 감소보다 빠른 것은 주가 하락 효과가 더해졌기 때문입니다.
실전 활용 팁
섹션 제목: “실전 활용 팁”-
매수 전 체크리스트에 포함: 관심 종목의 잔고율이 급등하고 있다면 진입 시점을 늦추는 것이 안전합니다.
-
반대매매 임계점 인식: 잔고율이 높은 상태에서 주가가 5% 이상 하락하면 반대매매가 연쇄적으로 발생할 수 있습니다.
-
바닥 확인 신호: 신용 잔고가 충분히 줄어든 후(상환 > 신규 지속) 주가가 반등하면 건전한 바닥 형성의 신호일 수 있습니다.
-
섹터 단위 분석: 특정 섹터 전체의 신용 잔고율이 높아지면 해당 섹터의 과열을 의미할 수 있습니다.
-
시계열 피처로 활용: 머신러닝 모델의 입력 피처로 잔고율, 순신규 추이, 잔고 변화율 등을 추가하면 예측 성능 향상에 도움이 됩니다.
| 지표 | 활용 | 주의 사항 |
|---|---|---|
| 잔고율 | 과열 판단, 반대매매 리스크 | 업종별 평균 수준 고려 필요 |
| 신규/상환 | 수급 방향 파악 | 단일일 데이터보다 추세 중요 |
| 잔고 대비 | 일별 변화 모니터링 | 주가 방향과 함께 분석 |
| 금액 | 레버리지 절대 규모 | 시가총액 대비로 비교 |
| 공여율 | 증권사 리스크 관리 수준 | 증권사별 차이 존재 |
신용 거래 데이터는 단독으로 사용하기보다는 주가, 거래량, 투자자별 매매동향 등 다른 지표와 결합하여 분석할 때 훨씬 큰 인사이트를 얻을 수 있습니다. 특히 개인 투자자 중심의 한국 주식 시장에서는 융자 잔고율이 시장 과열과 조정의 선행 지표로 유용하게 활용됩니다.