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

주식 시장에서 신용 거래 데이터는 개인 투자자들의 심리와 레버리지 수준을 파악할 수 있는 핵심 보조 지표입니다. 이번 포스트에서는 신용 거래 데이터의 각 항목이 무엇을 의미하는지, 그리고 이를 종목 분석에 어떻게 활용할 수 있는지 다루겠습니다.
신용 거래란?
Section titled “신용 거래란?”신용 거래는 증권사로부터 자금이나 주식을 빌려서 매매하는 방식으로, 크게 두 가지로 나뉩니다.
| 구분 | 설명 |
|---|---|
| 융자 | 증권사에서 돈을 빌려 주식을 매수 (레버리지 매수) |
| 대주 | 증권사에서 주식을 빌려 매도 (공매도의 일종) |
융자 잔고가 늘어난다는 것은 개인 투자자들이 빚을 내서까지 해당 종목을 사고 있다는 뜻이고, 대주 잔고가 늘어난다는 것은 해당 종목의 하락에 베팅하는 수요가 있다는 뜻입니다.
데이터 항목
Section titled “데이터 항목”신용 거래 데이터는 일반적으로 증권사 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 잔고율─────────────────────────────────────────────예시 데이터
Section titled “예시 데이터”분석 예시를 위해 가상의 종목 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, ],})위 데이터는 “상승 → 과열 → 하락 → 안정” 의 전형적인 사이클을 보여줍니다.
종목 분석 활용 방안
Section titled “종목 분석 활용 방안”1. 잔고율(balance_ratio)로 과열 여부 판단
Section titled “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) 추이로 수급 방향 파악
Section titled “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. 잔고 변화와 주가 방향의 다이버전스
Section titled “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. 융자와 대주 데이터 결합 분석
Section titled “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)으로 레버리지 규모 파악
Section titled “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백만원까지 줄어들었습니다. 금액 감소가 잔고 감소보다 빠른 것은 주가 하락 효과가 더해졌기 때문입니다.
실전 활용 팁
Section titled “실전 활용 팁”-
매수 전 체크리스트에 포함: 관심 종목의 잔고율이 급등하고 있다면 진입 시점을 늦추는 것이 안전합니다.
-
반대매매 임계점 인식: 잔고율이 높은 상태에서 주가가 5% 이상 하락하면 반대매매가 연쇄적으로 발생할 수 있습니다.
-
바닥 확인 신호: 신용 잔고가 충분히 줄어든 후(상환 > 신규 지속) 주가가 반등하면 건전한 바닥 형성의 신호일 수 있습니다.
-
섹터 단위 분석: 특정 섹터 전체의 신용 잔고율이 높아지면 해당 섹터의 과열을 의미할 수 있습니다.
-
시계열 피처로 활용: 머신러닝 모델의 입력 피처로 잔고율, 순신규 추이, 잔고 변화율 등을 추가하면 예측 성능 향상에 도움이 됩니다.
| 지표 | 활용 | 주의 사항 |
|---|---|---|
| 잔고율 | 과열 판단, 반대매매 리스크 | 업종별 평균 수준 고려 필요 |
| 신규/상환 | 수급 방향 파악 | 단일일 데이터보다 추세 중요 |
| 잔고 대비 | 일별 변화 모니터링 | 주가 방향과 함께 분석 |
| 금액 | 레버리지 절대 규모 | 시가총액 대비로 비교 |
| 공여율 | 증권사 리스크 관리 수준 | 증권사별 차이 존재 |
신용 거래 데이터는 단독으로 사용하기보다는 주가, 거래량, 투자자별 매매동향 등 다른 지표와 결합하여 분석할 때 훨씬 큰 인사이트를 얻을 수 있습니다. 특히 개인 투자자 중심의 한국 주식 시장에서는 융자 잔고율이 시장 과열과 조정의 선행 지표로 유용하게 활용됩니다.