kiwoompy

포트폴리오 모니터링

보유 종목의 현재 평가금액, 손익, 수익률을 조회해서 출력하는 예제입니다.

전체 코드

from kiwoompy import KiwoomClient, KiwoomApiError

client = KiwoomClient(
    env="demo",
    appkey="YOUR_APP_KEY",
    secretkey="YOUR_APP_SECRET",
)

def print_portfolio():
    # 예수금
    deposit = client.query.get_deposit()
    print("=" * 50)
    print(f"예수금:       {int(deposit.entr):>15,}원")
    print(f"출금가능:     {int(deposit.pymn_alow_amt):>15,}원")
    print(f"주문가능:     {int(deposit.ord_alow_amt):>15,}원")
    print("=" * 50)

    # 잔고
    balance = client.query.get_account_balance()
    print(f"총매입금액:   {int(balance.tot_pur_amt):>15,}원")
    print(f"총평가금액:   {int(balance.tot_evlt_amt):>15,}원")
    print(f"총평가손익:   {int(balance.tot_evlt_pl):>15,}원")
    print(f"총수익률:     {float(balance.tot_prft_rt):>14.2f}%")
    print(f"추정예탁자산: {int(balance.prsm_dpst_aset_amt):>15,}원")
    print()

    if not balance.holdings:
        print("보유 종목 없음")
        return

    # 종목별 상세
    print(f"{'종목명':<12} {'보유':>6} {'매입단가':>10} {'현재가':>10} {'평가손익':>12} {'수익률':>8}")
    print("-" * 65)
    for item in balance.holdings:
        print(
            f"{item.stk_nm:<12} "
            f"{item.rmnd_qty:>6}주 "
            f"{int(item.pur_pric):>10,}원 "
            f"{int(item.cur_prc):>10,}원 "
            f"{int(item.evltv_prft):>12,}원 "
            f"{float(item.prft_rt):>7.2f}%"
        )

print_portfolio()

실행 예시

==================================================
예수금:         5,000,000원
출금가능:       4,800,000원
주문가능:       4,800,000원
==================================================
총매입금액:     2,000,000원
총평가금액:     2,150,000원
총평가손익:       150,000원
총수익률:             7.50%
추정예탁자산:   7,150,000원

종목명           보유    매입단가      현재가      평가손익   수익률
-----------------------------------------------------------------
삼성전자          10주   70,000원   72,000원    20,000원    2.86%
SK하이닉스         5주  200,000원  226,000원   130,000원   13.00%

손익 상위 종목 정렬

balance = client.query.get_account_balance()

# 수익률 기준 내림차순 정렬
sorted_holdings = sorted(
    balance.holdings,
    key=lambda x: float(x.prft_rt),
    reverse=True,
)

print("수익률 순위")
for i, item in enumerate(sorted_holdings, 1):
    print(f"{i}. {item.stk_nm}: {float(item.prft_rt):.2f}%")

손절 대상 종목 찾기

수익률이 특정 기준 이하인 종목을 필터링합니다.

STOP_LOSS_THRESHOLD = -5.0  # -5% 이하면 손절 검토

balance = client.query.get_account_balance()

candidates = [
    item for item in balance.holdings
    if float(item.prft_rt) <= STOP_LOSS_THRESHOLD
]

if candidates:
    print(f"손절 검토 종목 ({STOP_LOSS_THRESHOLD}% 이하):")
    for item in candidates:
        print(f"  {item.stk_nm}: {float(item.prft_rt):.2f}% ({item.evltv_prft}원)")
else:
    print("손절 검토 종목 없음")

미체결 주문 포함 현황

# 잔고 + 미체결 한번에 확인
balance = client.query.get_account_balance()
unfilled = client.query.get_unfilled_orders(all_stock_type="0", trade_type="all")

print(f"보유 종목: {len(balance.holdings)}개")
print(f"미체결 주문: {len(unfilled)}건")

for order in unfilled:
    print(f"  [{order.io_tp_nm}] {order.stk_nm} {order.oso_qty}주 @ {order.ord_pric}원")

관련 가이드