8 계좌·잔고·손익
계좌 조회는 kis.account 에 모여 있으며, 세션이 연 계좌를 그대로 가리킵니다. kis.account 가 돌려주는 뷰는 세션 상품코드에 따라 달라집니다.
| 상품 | kis.account 뷰 |
|---|---|
| 주식(01, 위탁) | 국내 kis.account.domestic.* · 해외 kis.account.overseas.* |
| 연금저축(22) | 위탁과 같은 국내주식 계좌 뷰(주문 가능) |
| IRP(29) | 위탁과 같은 국내주식 계좌 뷰 + 퇴직연금 조회 kis.account.pension.*(조회전용) |
| 국내파생(03) | 파생 계좌 뷰 → 선물·옵션 |
| 해외파생(08) | 해외파생 계좌 뷰 → 해외주식 |
주식 세션은 국내·해외를 한 계좌에서 다루므로 시장별 뷰를 갖습니다 – 국내는 kis.account.domestic, 해외는 kis.account.overseas.
account = kis.account.domestic8.1 예수금·자산 요약
balance = account.balance()
print(balance.deposit, balance.total_evaluation, balance.unrealized_pnl)balance() 가 돌려주는 DomesticBalance 의 주요 필드:
| 필드 | 뜻 |
|---|---|
deposit |
예수금 |
settlement_cash_d1 · settlement_cash_d2 |
D+1 · D+2 정산 예정 현금 |
total_evaluation |
총 평가금액 |
net_asset |
순자산 |
purchase_amount |
매입금액 |
market_value |
평가금액 |
unrealized_pnl |
평가손익 |
account.assets() 는 대출·외화까지 포함한 계좌 자산현황.
8.2 보유 종목
for position in account.positions():
print(f"{position.security_name:10s} {position.quantity}주 "
f"평가손익 {position.unrealized_pnl:>12,} ({position.unrealized_pnl_percent}%)")Position 필드:
| 필드 | 뜻 |
|---|---|
symbol · security_name |
종목코드 · 종목명 |
quantity · sellable_quantity |
보유 · 매도가능 수량 |
average_purchase_price |
평균 매입가 |
purchase_amount |
매입금액 |
current_price |
현재가 |
market_value |
평가금액 |
unrealized_pnl |
평가손익 |
unrealized_pnl_percent |
수익률(%) |
sellable_quantity(매도가능)는 담보·대주 등으로 quantity(보유)보다 적을 수 있습니다.
보유종목 + 요약을 한 번에: account.portfolio() → .balance, .positions.
8.3 실현손익
account.trade_profits(start="20240101", end="20240630") # 종목별 실현손익
account.daily_profits(start="20240101", end="20240630") # 일별 실현손익
account.realized_profit_balance() # 실현손익 포함 잔고- 평가손익 (미실현,
unrealized_pnl) — 아직 안 판 보유종목의 장부상 손익. 현재가로 계산돼 계속 바뀌고, 팔기 전엔 확정이 아닙니다. - 실현손익 (
trade_profits/daily_profits) — 실제로 팔아서 확정된 손익.
“평가손익 +100만”이라도 팔기 전엔 내 돈이 아닙니다. 판 순간 실현손익으로 고정됩니다.
8.4 미체결·주문가능
account.open_orders() # 미체결 / 정정취소 가능 주문
stock = kis.domestic.stock("005930")
stock.buyable() # 매수 가능 수량·금액
stock.sellable() # 매도 가능 수량8.5 권리·증거금
account.rights(start="20240101", end="20240630") # 배정/신청/환불된 권리
account.integrated_margin() # 통합증거금8.6 해외 계좌
해외는 통화·시장이 얽혀 있어 살짝 다릅니다.
account = kis.account.overseas
account.positions(market=None) # None = 전체 시장 합산
account.balance(market="US") # 통화별 요약 (시장: US/HK/CN_SH/CN_SZ/JP/VN_HN/VN_HCM)
account.present_balance() # 체결기준 현재잔고
account.period_profit(start="20240101", end="20240630") # 기간 실현손익
account.transactions(start="20240101", end="20240630") # 거래내역
account.foreign_margin() # 통화별 외화 증거금
account.algo_orders() # 미국 알고(twap/vwap) 주문 목록
account.algo_executions(order_id, order_date="20240102") # 한 알고주문의 체결내역8.7 채권 계좌
장내채권은 주식과 같은 위탁(01) 계좌를 쓰며 kis.account.domestic.bonds 로 조회합니다. 보유·매수가능·미체결·체결 → 채권.
kis.account.domestic.bonds.balance() # 채권 보유 lot8.8 퇴직연금 (IRP) 계좌
개인형 퇴직연금(IRP, 상품코드 29)은 일반 국내주식 잔고엔 없는 퇴직연금 전용 조회(예수금 요약·체결기준잔고·매수가능여력)를 kis.account.pension 렌즈로 줍니다. IRP는 조회전용이라 발주 메서드는 없습니다. 상세 → 퇴직연금.
kis.account.pension.deposit() # 예수금 요약 (IRP 29 전용)
kis.account.pension.present_balance() # 체결기준 잔고 + 손익연금저축(22)은 별개 사적연금이라 주문 가능한 일반 주식계좌로 다루며 이 렌즈 대상이 아닙니다. 상품코드가 29가 아니면 .pension 접근은 오류입니다.
8.9 통합잔고
kis.account.balance() 는 국내주식·채권·해외주식 잔고를 한 뷰로 합쳐 Balance 로 돌려줍니다. 실전투자 전용입니다.
balance = kis.account.balance()
for deposit in balance.deposits:
print(f"{deposit.currency} 예수금 {deposit.cash:>15,} (환율 {deposit.exchange_rate})")
print("원화 총평가", balance.total_evaluation, " 평가손익", balance.total_unrealized_pnl)Balance 의 주요 필드:
| 필드 | 뜻 |
|---|---|
base_currency |
기준통화(“KRW”) |
deposits |
통화별 예수금(CurrencyDeposit 목록) |
domestic |
국내주식 잔고 서브(DomesticBalance) |
bonds |
채권 보유(BondPosition 목록, 매입금액 기준) |
overseas |
해외 체결기준 현재잔고 |
total_evaluation |
원화 총평가(국내·해외 보유 평가의 합) |
total_unrealized_pnl |
원화 총평가손익 |
CurrencyDeposit 은 currency(통화), cash(예수금), exchange_rate(참고용 원화 환율) 세 값입니다.
통화별 예수금(deposits)이 기준이 되는 값이고, total_evaluation 은 서로 겹치지 않는 국내·해외 보유 평가만 더한 값입니다. 현금까지 더한 단일 총자산은 두지 않습니다 — 국내 순자산과 해외 총자산이 같은 위탁계좌의 원화 예수금을 공유(이중계상)하고 net/gross 기준이 달라 신뢰 있게 합칠 수 없기 때문입니다. 채권은 시장가가 없어 매입금액 기준이라 평가 합계에 넣지 않습니다(bonds 로 따로 봅니다).