ํ๊ตญํฌ์์ฆ๊ถ Open API Python SDK
๊ฐ๊ฒฐํ ํจ์ ๊ธฐ๋ฐ API
๊ตญ๋ด/ํด์ธ์ฃผ์ ์ง์
์ค์๊ฐ WebSocket
๋ชจ์ํฌ์/์ค์ ํ๊ฒฝ ์ ํ
์๋ ํ ํฐ ๊ด๋ฆฌ
๋๋ ๊ฐ๋ฐ ํ๊ฒฝ:
git clone https://github.com/your-repo/kis-wrapper
cd kis-wrapper
uv sync
# .env
KIS_APP_KEY=your_app_key
KIS_APP_SECRET=your_app_secret
KIS_ACCOUNT=12345678-01
import os
from kis import KIS , domestic
kis = KIS (
app_key = os .environ ["KIS_APP_KEY" ],
app_secret = os .environ ["KIS_APP_SECRET" ],
account = os .environ ["KIS_ACCOUNT" ],
env = "paper" , # ๋ชจ์ํฌ์
)
# ์ผ์ฑ์ ์ ํ์ฌ๊ฐ
p = domestic .price (kis , "005930" )
print (f"ํ์ฌ๊ฐ: { p ['stck_prpr' ]} ์" )
# ํธ๊ฐ
ob = domestic .orderbook (kis , "005930" )
# ์ผ๋ด (์ต๊ทผ 30์ผ)
candles = domestic .daily (kis , "005930" )
# ๋งค์ (์ง์ ๊ฐ)
order = domestic .buy (kis , "005930" , qty = 10 , price = 70000 )
print (f"์ฃผ๋ฌธ๋ฒํธ: { order ['ODNO' ]} " )
# ๋งค์ (์์ฅ๊ฐ)
order = domestic .buy (kis , "005930" , qty = 10 )
# ๋งค๋
order = domestic .sell (kis , "005930" , qty = 5 , price = 72000 )
# ์ฃผ๋ฌธ ์ทจ์
domestic .cancel (kis , order_no = "0001234567" , qty = 5 )
# ์ฃผ๋ฌธ ์ ์
domestic .modify (kis , order_no = "0001234567" , qty = 10 , price = 71000 )
# ์๊ณ (์์๊ธ + ๋ณด์ ์ข
๋ชฉ)
bal = domestic .balance (kis )
# ๋ณด์ ์ข
๋ชฉ๋ง
positions = domestic .positions (kis )
for p in positions :
print (f"{ p ['prdt_name' ]} : { p ['hldg_qty' ]} ์ฃผ" )
# ํน์ ์ข
๋ชฉ ํฌ์ง์
pos = domestic .position (kis , "005930" )
if pos :
print (f"์์ต๋ฅ : { pos ['profit_rate' ]:.2f} %" )
# ๋ฏธ์ฒด๊ฒฐ ์ฃผ๋ฌธ
pending = domestic .pending_orders (kis )
from kis import overseas
# ์ ํ ํ์ฌ๊ฐ
p = overseas .price (kis , "AAPL" , "NAS" )
print (f"AAPL: ${ p ['last' ]} " )
# ๋งค์ (์ง์ ๊ฐ)
order = overseas .buy (kis , "AAPL" , "NAS" , qty = 1 , price = 150.00 )
# ๋งค์ (์์ฅ๊ฐ - ๋ฏธ๊ตญ๋ง ์ง์)
order = overseas .buy (kis , "AAPL" , "NAS" , qty = 1 )
# ์๊ณ ์กฐํ
bal = overseas .balance (kis ) # ์ ์ฒด
bal = overseas .balance (kis , "NAS" ) # ๋์ค๋ฅ๋ง
# ํ์จ
rate = overseas .exchange_rate (kis )
์ฝ๋
๊ฑฐ๋์
NYS
๋ด์ (NYSE)
NAS
๋์ค๋ฅ (NASDAQ)
AMS
์๋ฉ์ค (AMEX)
HKS
ํ์ฝฉ
SHS
์ํด
SZS
์ฌ์ฒ
TSE
๋์ฟ
HNX
ํ๋
ธ์ด
HSX
ํธ์น๋ฏผ
์ค์๊ฐ ๋ฐ์ดํฐ (WebSocket)
import asyncio
from kis import KIS , WSClient
async def main ():
kis = KIS (app_key , app_secret , account , env = "paper" )
ws = WSClient (kis )
async def on_price (data ):
print (f"{ data ['symbol' ]} : { data ['price' ]:,} ์ (๊ฑฐ๋๋: { data ['volume' ]} )" )
await ws .subscribe ("H0STCNT0" , ["005930" , "000660" ], on_price )
try :
await ws .run ()
except KeyboardInterrupt :
await ws .close ()
asyncio .run (main ())
TR ID
์ค๋ช
H0STCNT0
๊ตญ๋ด์ฃผ์ ์ค์๊ฐ์ฒด๊ฒฐ
H0STASP0
๊ตญ๋ด์ฃผ์ ์ค์๊ฐํธ๊ฐ
H0STCNI0
์ฒด๊ฒฐํต๋ณด
HDFSCNT0
ํด์ธ์ฃผ์ ์ค์๊ฐ์ฒด๊ฒฐ
# ๋ชจ์ํฌ์ -> ์ค์
kis_prod = kis .switch ("prod" )
# ๋๋ ์ฒ์๋ถํฐ ์ค์
kis = KIS (app_key , app_secret , account , env = "prod" )
from kis import calc
# ์์ต๋ฅ
rate = calc .profit_rate (buy_price = 70000 , current_price = 75000 )
print (f"์์ต๋ฅ : { float (rate ) * 100 :.2f} %" )
# ์์ต๊ธ
profit = calc .profit_amount (70000 , 75000 , qty = 10 )
# ํ๊ท ๋จ๊ฐ
orders = [{"price" : 70000 , "qty" : 10 }, {"price" : 72000 , "qty" : 5 }]
avg = calc .avg_price (orders )
from kis import snapshot
# ํ์ฌ ์ํ ์ ์ฅ
data = snapshot .snapshot (kis , "005930" )
snapshot .save (data , "snapshots/005930.json" )
# ๋ก๋ ๋ฐ ๊ฒ์ฆ
loaded = snapshot .load ("snapshots/005930.json" )
assert snapshot .verify (loaded )
KIS (app_key : str , app_secret : str , account : str , env : Env = "paper" )
์์ฑ/๋ฉ์๋
์ค๋ช
is_paper
๋ชจ์ํฌ์ ์ฌ๋ถ
switch(env)
ํ๊ฒฝ ์ ํ
close()
์ฐ๊ฒฐ ์ข
๋ฃ
ํจ์
์ค๋ช
price(kis, symbol)
ํ์ฌ๊ฐ ์กฐํ
orderbook(kis, symbol)
ํธ๊ฐ ์กฐํ
daily(kis, symbol, period="D")
์ผ/์ฃผ/์๋ด
buy(kis, symbol, qty, price=None)
๋งค์
sell(kis, symbol, qty, price=None)
๋งค๋
cancel(kis, order_no, qty)
์ทจ์
modify(kis, order_no, qty, price)
์ ์
balance(kis)
์๊ณ ์กฐํ
positions(kis)
๋ณด์ ์ข
๋ชฉ
orders(kis, start_date, end_date)
์ฃผ๋ฌธ๋ด์ญ
pending_orders(kis)
๋ฏธ์ฒด๊ฒฐ
position(kis, symbol)
์ข
๋ชฉ๋ณ ํฌ์ง์
sell_all(kis, symbol)
์ ๋ ๋งค๋
cancel_remaining(kis, order_no)
๋ฏธ์ฒด๊ฒฐ ์ ๋ ์ทจ์
ํจ์
์ค๋ช
price(kis, symbol, exchange)
ํ์ฌ๊ฐ ์กฐํ
daily(kis, symbol, exchange, period="D")
๊ธฐ๊ฐ๋ณ ์์ธ
buy(kis, symbol, exchange, qty, price=None)
๋งค์
sell(kis, symbol, exchange, qty, price=None)
๋งค๋
cancel(kis, exchange, order_no, qty)
์ทจ์
balance(kis, exchange=None)
์๊ณ ์กฐํ
exchange_rate(kis)
ํ์จ ์กฐํ
WSClient (kis : KIS , max_retries : int = 5 , retry_delay : float = 1.0 )
๋ฉ์๋
์ค๋ช
connect()
WebSocket ์ฐ๊ฒฐ
subscribe(tr_id, symbols, callback)
๊ตฌ๋
unsubscribe(tr_id, symbols)
๊ตฌ๋
ํด์
run()
๋ฉ์์ง ์์ ๋ฃจํ
close()
์ฐ๊ฒฐ ์ข
๋ฃ
# ํ
์คํธ
uv run pytest
# ์ปค๋ฒ๋ฆฌ์ง
uv run pytest --cov=kis
# ๋ฆฐํธ
uv run ruff check kis/
# ํฌ๋งท
uv run ruff format kis/
MIT License