![header](https://capsule-render.vercel.app/api?type=waving&color=gradient&height=260§ion=header&text=%ED%8C%8C%EC%9D%B4%EC%8D%AC%20%ED%95%9C%EA%B5%AD%ED%88%AC%EC%9E%90%EC%A6%9D%EA%B6%8C%20API&fontSize=50&animation=fadeIn&fontAlignY=38&desc=KIS%20Open%20Trading%20API%20Client&descAlignY=51&descAlign=62&customColorList=24)
## 1. 파이썬용 한국투자증권 API 소개 ✨
한국투자증권의 트레이딩 OPEN API 서비스를 파이썬 환경에서 사용할 수 있도록 만든 강력한 커뮤니티 라이브러리입니다.
**2.0.0 버전 이전의 라이브러리는 [여기](https://github.com/Soju06/python-kis/tree/v1.0.6), 문서는 [1](https://github.com/Soju06/python-kis/wiki/Home/d6aaf207dc523b92b52e734908dd6b8084cd36ff), [2](https://github.com/Soju06/python-kis/wiki/Tutorial/d6aaf207dc523b92b52e734908dd6b8084cd36ff), [3](https://github.com/Soju06/python-kis/wiki/Examples/d6aaf207dc523b92b52e734908dd6b8084cd36ff)에서 확인할 수 있습니다.**
### 1.1. 라이브러리 특징
<details>
<summary>📐 모든 객체에 대한 Type hint</summary>
<ul>
<li>모든 함수와 클래스에 대해 추상화 및 Typing을 적용하여, 파이썬의 동적 타이핑을 보완합니다.</li>
<li>IDE의 자동완성을 100% 활용할 수 있으며, 공식 문서 없이 정확하고 버그 없는 개발이 가능합니다.</li>
</ul>
</details>
<details>
<summary>🔗 복구 가능한 웹소켓 클라이언트</summary>
<ul>
<li>실시간 시세, 호가, 체결 등의 실시간 데이터를 받아오는 과정에서 네트워크 문제 등으로 인해 연결이 끊겼을 때, 완벽히 복구할 수 있도록 만들어졌습니다.</li>
<li>재연결 이전에 등록된 조회도 자동으로 다시 등록하여 유실을 방지합니다.</li>
<li>한국투자증권의 웹소켓 조회 시스템을 파이썬의 메모리 관리 시스템과 완벽히 통합하여, GC에 의해 이벤트 구독이 관리됩니다.</li>
</details>
<details>
<summary>🖋️ 표준 영어 네이밍</summary>
<ul>
<li>한국투자증권의 API의 경우, 한글 발음이나 비표준 약어를 사용하는 경우가 많습니다.</li>
<li>이 라이브러리는 모든 객체에 대해 표준 영어 네이밍을 적용하여, 이해하기 쉽도록 만들었습니다.</li>
</details>
<hr>
## 2. 사용 설명 ⚙️
<details>
<summary>OpenAPI 서비스 신청 방법</summary>
1. 한국투자증권 계좌와 아이디가 필요합니다. KIS 트레이딩 서비스는 [KIS Developers 서비스](https://apiportal.koreainvestment.com/)를 통해 신청 할 수 있습니다.
![image](https://user-images.githubusercontent.com/34199905/193738291-c9c663fd-8ab4-43da-acb6-6a2f7846a79d.png)
2. 서비스를 신청이 완료되면, 아래와 같이 앱 키를 발급 받을 수 있습니다.
![image](https://user-images.githubusercontent.com/34199905/193740291-53f282ee-c40c-40b9-874e-2df39543cb66.png)
</details>
### 2.1. 라이브러리 설치 📦
라이브러리는 파이썬 3.11을 기준으로 작성되었습니다.
```zsh
pip install python-kis
```
<details>
<summary>사용된 모듈 보기</summary>
```
requests>=2.32.3
websocket-client>=1.8.0
cryptography>=43.0.0
colorlog>=6.8.2
```
</details>
<hr>
### 2.2. 라이브러리 사용 📚
#### 2.2.1. PyKis 객체 생성
1. 시크릿 키를 파일로 관리하는 방법 (권장)
먼저 시크릿 키를 파일로 저장합니다.
```python
from pykis import KisAuth
auth = KisAuth(
# HTS 로그인 ID 예) soju06
id="YOUR_HTS_ID",
# 앱 키 예) Pa0knAM6JLAjIa93Miajz7ykJIXXXXXXXXXX
appkey="YOUR_APP_KEY",
# 앱 시크릿 키 예) V9J3YGPE5q2ZRG5EgqnLHn7XqbJjzwXcNpvY . . .
secretkey="YOUR_APP_SECRET",
# 앱 키와 연결된 계좌번호 예) 00000000-01
account="00000000-01",
# 모의투자 여부
virtual=False,
)
# 안전한 경로에 시크릿 키를 파일로 저장합니다.
auth.save("secret.json")
```
그 후, 저장된 시크릿 키를 사용하여 PyKis 객체를 생성합니다.
```python
from pykis import PyKis, KisAuth
# 실전투자용 PyKis 객체를 생성합니다.
kis = PyKis("secret.json", keep_token=True)
kis = PyKis(KisAuth.load("secret.json"), keep_token=True)
# 모의투자용 PyKis 객체를 생성합니다.
kis = PyKis("secret.json", "virtual_secret.json", keep_token=True)
kis = PyKis(KisAuth.load("secret.json"), KisAuth.load("virtual_secret.json"), keep_token=True)
```
2. 시크릿 키를 직접 입력하는 방법
```python
from pykis import PyKis
# 실전투자용 한국투자증권 API를 생성합니다.
kis = PyKis(
id="soju06", # HTS 로그인 ID
account="00000000-01", # 계좌번호
appkey="PSED321z...", # AppKey 36자리
secretkey="RR0sFMVB...", # SecretKey 180자리
keep_token=True, # API 접속 토큰 자동 저장
)
# 모의투자용 한국투자증권 API를 생성합니다.
kis = PyKis(
id="soju06", # HTS 로그인 ID
account="00000000-01", # 모의투자 계좌번호
appkey="PSED321z...", # 실전투자 AppKey 36자리
secretkey="RR0sFMVB...", # 실전투자 SecretKey 180자리
virtual_id="soju06", # 모의투자 HTS 로그인 ID
virtual_appkey="PSED321z...", # 모의투자 AppKey 36자리
virtual_secretkey="RR0sFMVB...", # 모의투자 SecretKey 180자리
keep_token=True, # API 접속 토큰 자동 저장
)
```
#### 2.2.2. 시세 조회
`stock.quote()` 함수를 이용하여 국내주식 및 해외주식의 시세를 조회할 수 있습니다.
```python
from pykis import KisQuote
# 엔비디아의 상품 객체를 가져옵니다.
stock = kis.stock("NVDA")
quote: KisQuote = stock.quote()
quote: KisQuote = stock.quote(extended=True) # 주간거래 시세
# PyKis의 모든 객체는 repr을 통해 주요 내용을 확인할 수 있습니다.
# 데이터를 확인하는 용도이므로 실제 프로퍼티 타입과 다를 수 있습니다.
print(quote)
```
```python
KisForeignQuote(
symbol='NVDA',
market='NASDAQ',
name='엔비디아',
sector_name='반도체 및 반도체장비',
volume=1506310,
amount=160791125,
market_cap=2593332000000,
indicator=KisForeignIndicator(
eps=1.71,
bps=2,
per=63.88,
pbr=54.65,
week52_high=140.76,
week52_low=39.2215,
week52_high_date='2024-06-20',
week52_low_date='2023-10-31'
),
open=109.21,
high=109.38,
low=104.37,
close=105.42,
change=-3.79,
unit=1,
tick=0.01,
risk='none',
halt=False,
overbought=False
)
```
#### 2.2.3. 잔고 조회
`account.balance()` 함수를 이용하여 예수금 및 보유 종목을 조회할 수 있습니다.
```python
from pykis import KisBalance
# 주 계좌 객체를 가져옵니다.
account = kis.account()
balance: KisBalance = account.balance()
print(repr(balance)) # repr을 통해 객체의 주요 내용을 확인할 수 있습니다.
```
```python
KisIntegrationBalance(
account_number=KisAccountNumber('50113500-01'),
deposits={
'KRW': KisDomesticDeposit(account_number=KisAccountNumber('50113500-01'), currency='KRW', amount=2447692, exchange_rate=1),
'USD': KisForeignPresentDeposit(account_number=KisAccountNumber('50113500-01'), currency='USD', amount=0, exchange_rate=1384.6),
},
stocks=[
KisDomesticBalanceStock(account_number=KisAccountNumber('50113500-01'), market='KRX', symbol='000660', qty=14, price=192600, amount=2696400, profit=22900, profit_rate=0.856555077613615111277351786),
KisDomesticBalanceStock(account_number=KisAccountNumber('50113500-01'), market='KRX', symbol='039200', qty=118, price=39600, amount=4672800, profit=-199500, profit_rate=-4.094575457176282248630010467)
],
purchase_amount=7545800,
current_amount=7369200,
profit=-176600,
profit_rate=-2.340374778022211031302181346
)
```
#### 2.2.4. 매도/매수 주문
`stock.order()`, `stock.buy()`, `stock.sell()`, `stock.modify()`, `stock.cancel()` 함수를 이용하여 매수/매도 주문 및 정정/취소를 할 수 있습니다.
```python
from pykis import KisOrder
# SK하이닉스 1주 시장가 매수 주문
order: KisOrder = hynix.buy(qty=1)
# SK하이닉스 1주 지정가 매수 주문
order: KisOrder = hynix.buy(price=194700, qty=1)
# SK하이닉스 전량 시장가 매도 주문
order: KisOrder = hynix.sell()
# SK하이닉스 전량 지정가 매도 주문
order: KisOrder = hynix.sell(price=194700)
print(order.pending) # 미체결 주문인지 여부
print(order.pending_order.pending_qty) # 미체결 수량
order: KisOrder = order.modify(price=195000) # 단가 정정
order: KisOrder = order.modify(qty=10) # 수량 정정
order.cancel() # 주문 취소
# 미체결 주문 전체 취소
for order in account.pending_orders():
order.cancel()
```
#### 2.2.4. 실시간 체결가 조회
국내주식 및 해외주식의 실시간 체결가 조회는 `stock.on("price", callback)` 함수를 이용하여 수신할 수 있습니다.
```python
from pykis import KisRealtimePrice, KisSubscriptionEventArgs, KisWebsocketClient, PyKis
def on_price(sender: KisWebsocketClient, e: KisSubscriptionEventArgs[KisRealtimePrice]):
print(e.response)
ticket = hynix.on("price", on_price)
print(kis.websocket.subscriptions) # 현재 구독중인 이벤트 목록
input("Press Enter to exit...")
ticket.unsubscribe()
```
```python
{KisWebsocketTR(id='H0STCNT0', key='000660')}
Press Enter to exit...
[08/02 13:50:42] INFO: RTC Connected to real server
[08/02 13:50:42] INFO: RTC Restoring subscriptions... H0STCNT0.000660
[08/02 13:50:42] INFO: RTC Subscribed to H0STCNT0.000660
KisDomesticRealtimePrice(market='KRX', symbol='000660', time='2024-08-02T13:50:44+09:00', price=174900, change=-18400, volume=8919304, amount=1587870362300)
KisDomesticRealtimePrice(market='KRX', symbol='000660', time='2024-08-02T13:50:44+09:00', price=174800, change=-18500, volume=8919354, amount=1587879102300)
KisDomesticRealtimePrice(market='KRX', symbol='000660', time='2024-08-02T13:50:45+09:00', price=174800, change=-18500, volume=8919358, amount=1587879801500)
KisDomesticRealtimePrice(market='KRX', symbol='000660', time='2024-08-02T13:50:45+09:00', price=174900, change=-18400, volume=8920313, amount=1588046831000)
KisDomesticRealtimePrice(market='KRX', symbol='000660', time='2024-08-02T13:50:45+09:00', price=174800, change=-18500, volume=8920319, amount=1588047879800)
[08/02 13:50:48] INFO: RTC Unsubscribed from H0STCNT0.000660
```
## 3. 튜토리얼 목록 📖
- [1. PyKis 인증 관리](https://github.com/Soju06/python-kis/wiki/Tutorial#1-pykis-인증-관리)
- [1.1. 시크릿 키 관리](https://github.com/Soju06/python-kis/wiki/Tutorial#11-시크릿-키-관리)
- [1.2. 엑세스 토큰 관리](https://github.com/Soju06/python-kis/wiki/Tutorial#12-엑세스-토큰-관리)
- [2. 종목 시세 및 차트 조회](https://github.com/Soju06/python-kis/wiki/Tutorial#2-종목-시세-및-차트-조회)
- [2.1. 시세 조회](https://github.com/Soju06/python-kis/wiki/Tutorial#21-시세-조회)
- [2.2. 차트 조회](https://github.com/Soju06/python-kis/wiki/Tutorial#22-차트-조회)
- [2.3. 호가 조회](https://github.com/Soju06/python-kis/wiki/Tutorial#23-호가-조회)
- [2.4. 장운영 시간 조회](https://github.com/Soju06/python-kis/wiki/Tutorial#24-장운영-시간-조회)
- [3. 주문 및 잔고 조회](https://github.com/Soju06/python-kis/wiki/Tutorial#3-주문-및-잔고-조회)
- [3.1. 예수금 및 보유 종목 조회](https://github.com/Soju06/python-kis/wiki/Tutorial#31-예수금-및-보유-종목-조회)
- [3.2. 기간 손익 조회](https://github.com/Soju06/python-kis/wiki/Tutorial#32-기간-손익-조회)
- [3.3. 일별 체결 내역 조회](https://github.com/Soju06/python-kis/wiki/Tutorial#33-일별-체결-내역-조회)
- [3.4. 매수 가능 금액/수량 조회](https://github.com/Soju06/python-kis/wiki/Tutorial#34-매수-가능-금액수량-조회)
- [3.5. 매도 가능 수량 조회](https://github.com/Soju06/python-kis/wiki/Tutorial#35-매도-가능-수량-조회)
- [3.6. 미체결 주문 조회](https://github.com/Soju06/python-kis/wiki/Tutorial#36-미체결-주문-조회)
- [3.7. 매도/매수 주문 및 정정/취소](https://github.com/Soju06/python-kis/wiki/Tutorial#37-매도매수-주문-및-정정취소)
- [3.7.1. 매수/매도 주문](https://github.com/Soju06/python-kis/wiki/Tutorial#371-매수매도-주문)
- [3.7.2. 주문 정정](https://github.com/Soju06/python-kis/wiki/Tutorial#372-주문-정정)
- [4. 실시간 이벤트 수신](https://github.com/Soju06/python-kis/wiki/Tutorial#4-실시간-이벤트-수신)
- [4.1. 이벤트 수신을 했는데, 바로 취소됩니다.](https://github.com/Soju06/python-kis/wiki/Tutorial#41-이벤트-수신을-했는데-바로-취소됩니다)
- [4.2. 실시간 체결가 조회](https://github.com/Soju06/python-kis/wiki/Tutorial#42-실시간-체결가-조회)
- [4.3. 실시간 호가 조회](https://github.com/Soju06/python-kis/wiki/Tutorial#43-실시간-호가-조회)
- [4.4. 실시간 체결내역 조회](https://github.com/Soju06/python-kis/wiki/Tutorial#44-실시간-체결내역-조회)
## 4. Changelog ✨
### ver 2.0.3
- [KisIntegrationBalance에서 해외주식 잔고수량이 0으로 표시됨](https://github.com/Soju06/python-kis/issues/41) 버그를 수정했습니다.
### ver 2.0.2
- `KisBalance`, `KisChart` 등 `__iter__` 메서드의 반환 타입이 누락되어있는 버그를 수정했습니다.
- 주문 수량을 입력할 때 `Decimal` 타입 이외의 `int`, `float` 타입을 입력할 수 있도록 개선했습니다.
### ver 2.0.1
- 초기 웹소켓 이벤트 구독시 클라이언트 접속 후 구독을 요청하는 코드에서 `_connected_event`가 set 되어있지 않아, 요청이 무시되는 버그를 수정했습니다.
### ver 2.0.0
- 라이브러리가 완전히 새롭게 변경되었습니다.
- 모든 객체에 대한 추상화 및 네이밍이 변경되었습니다.
- 한국투자증권의 국내, 해외 API 구분 없이 동일한 인터페이스로 사용할 수 있습니다.
- 실시간 시세 조회는 새로운 이벤트 시스템으로 변경되었습니다.
- 계좌 및 상품 Scope 활용이 극대화되었습니다.
### ver 1.0.6
- 상품기본조회가 추가되었습니다.
- 환경 변수를 분리하였습니다.
각각의 파일에 나뉘어있던 Version, 접속 URL, API Rate Limit 등의 상수 데이터를 `__env__.py`로 옮겼습니다.
- 예외구조 변경
기존 HTTP Error, RT_CD Error를 모두 `ValueError`로 처리하던 구조에서 각각의 `KisHTTPError`, `KisAPIError` 예외 객체로 나누었고, `rt_cd`, `msg_cd` 등의 변수를 예외 객체에서 참조할 수 있도록 변경하였습니다.
- 엑세스토큰 발급 Thread Safe
엑세스 토큰이 발급되어있지 않은 상태에서 멀티스레드로 `KisAccessToken.ensure()` 함수를 호출하면 Thread Lock 되지 않고 다수가 `KisAccessToken.issue()`를 호출하는 문제를 해결하였습니다.
### ver 1.0.5
- `RTClient`에서 웹소켓 연결이 끊어졌을 때, 이벤트 처리가 잘못되는 버그를 수정하였습니다.
- `RTClient`에서 재연결시 실시간 조회가 복구되지 않는 버그를 수정하였습니다.
- 휴장일 조회가 추가되었습니다.
- 해외 주식 주문이 추가되었습니다.
- 해외 미체결 조회가 추가되었습니다.
### ver 1.0.4
- 주식잔고조회_실현손익 조회가 추가되었습니다.
- [실시간 해제요청이 정상적으로 되지 않습니다](https://github.com/Soju06/python-kis/issues/1) 버그를 수정하였습니다.
### ver 1.0.3
- `RTClient` [웹소켓 보안강화를 위한 개선 안내](https://apiportal.koreainvestment.com/community/10000000-0000-0011-0000-000000000001)의 내용에 따라, 앱키 대신 웹소켓 접속키를 발급하여 사용하도록 변경되었습니다.
### ver 1.0.2
- API 초당 요청 제한을 넘어버리는 버그를 수정하였습니다.
- `period_price` 응답 데이터의 `stck_fcam`값 `float`으로 변경하였습니다.
- `utils.KRXMarketOpen` 공휴일 데이터가 1개인 경우 오류 발생하는 버그 수정하였습니다.
### License
[MIT](https://github.com/Soju06/python-kis/blob/main/LICENCE)
Raw data
{
"_id": null,
"home_page": null,
"name": "python-kis",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": null,
"keywords": "python, client, library, trading, websocket, realtime, investing, korean, investment, autotrading, koreainvestment",
"author": null,
"author_email": "Soju06 <qlskssk@gmail.com>",
"download_url": null,
"platform": null,
"description": "\r\n![header](https://capsule-render.vercel.app/api?type=waving&color=gradient&height=260§ion=header&text=%ED%8C%8C%EC%9D%B4%EC%8D%AC%20%ED%95%9C%EA%B5%AD%ED%88%AC%EC%9E%90%EC%A6%9D%EA%B6%8C%20API&fontSize=50&animation=fadeIn&fontAlignY=38&desc=KIS%20Open%20Trading%20API%20Client&descAlignY=51&descAlign=62&customColorList=24)\r\n\r\n## 1. \ud30c\uc774\uc36c\uc6a9 \ud55c\uad6d\ud22c\uc790\uc99d\uad8c API \uc18c\uac1c \u2728\r\n\r\n\ud55c\uad6d\ud22c\uc790\uc99d\uad8c\uc758 \ud2b8\ub808\uc774\ub529 OPEN API \uc11c\ube44\uc2a4\ub97c \ud30c\uc774\uc36c \ud658\uacbd\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \ub9cc\ub4e0 \uac15\ub825\ud55c \ucee4\ubba4\ub2c8\ud2f0 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc785\ub2c8\ub2e4.\r\n\r\n**2.0.0 \ubc84\uc804 \uc774\uc804\uc758 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub294 [\uc5ec\uae30](https://github.com/Soju06/python-kis/tree/v1.0.6), \ubb38\uc11c\ub294 [1](https://github.com/Soju06/python-kis/wiki/Home/d6aaf207dc523b92b52e734908dd6b8084cd36ff), [2](https://github.com/Soju06/python-kis/wiki/Tutorial/d6aaf207dc523b92b52e734908dd6b8084cd36ff), [3](https://github.com/Soju06/python-kis/wiki/Examples/d6aaf207dc523b92b52e734908dd6b8084cd36ff)\uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.**\r\n\r\n\r\n### 1.1. \ub77c\uc774\ube0c\ub7ec\ub9ac \ud2b9\uc9d5\r\n\r\n<details>\r\n<summary>\ud83d\udcd0 \ubaa8\ub4e0 \uac1d\uccb4\uc5d0 \ub300\ud55c Type hint</summary>\r\n<ul>\r\n<li>\ubaa8\ub4e0 \ud568\uc218\uc640 \ud074\ub798\uc2a4\uc5d0 \ub300\ud574 \ucd94\uc0c1\ud654 \ubc0f Typing\uc744 \uc801\uc6a9\ud558\uc5ec, \ud30c\uc774\uc36c\uc758 \ub3d9\uc801 \ud0c0\uc774\ud551\uc744 \ubcf4\uc644\ud569\ub2c8\ub2e4.</li>\r\n<li>IDE\uc758 \uc790\ub3d9\uc644\uc131\uc744 100% \ud65c\uc6a9\ud560 \uc218 \uc788\uc73c\uba70, \uacf5\uc2dd \ubb38\uc11c \uc5c6\uc774 \uc815\ud655\ud558\uace0 \ubc84\uadf8 \uc5c6\ub294 \uac1c\ubc1c\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4.</li>\r\n</ul>\r\n</details>\r\n\r\n<details>\r\n<summary>\ud83d\udd17 \ubcf5\uad6c \uac00\ub2a5\ud55c \uc6f9\uc18c\ucf13 \ud074\ub77c\uc774\uc5b8\ud2b8</summary>\r\n<ul>\r\n<li>\uc2e4\uc2dc\uac04 \uc2dc\uc138, \ud638\uac00, \uccb4\uacb0 \ub4f1\uc758 \uc2e4\uc2dc\uac04 \ub370\uc774\ud130\ub97c \ubc1b\uc544\uc624\ub294 \uacfc\uc815\uc5d0\uc11c \ub124\ud2b8\uc6cc\ud06c \ubb38\uc81c \ub4f1\uc73c\ub85c \uc778\ud574 \uc5f0\uacb0\uc774 \ub04a\uacbc\uc744 \ub54c, \uc644\ubcbd\ud788 \ubcf5\uad6c\ud560 \uc218 \uc788\ub3c4\ub85d \ub9cc\ub4e4\uc5b4\uc84c\uc2b5\ub2c8\ub2e4.</li>\r\n<li>\uc7ac\uc5f0\uacb0 \uc774\uc804\uc5d0 \ub4f1\ub85d\ub41c \uc870\ud68c\ub3c4 \uc790\ub3d9\uc73c\ub85c \ub2e4\uc2dc \ub4f1\ub85d\ud558\uc5ec \uc720\uc2e4\uc744 \ubc29\uc9c0\ud569\ub2c8\ub2e4.</li>\r\n<li>\ud55c\uad6d\ud22c\uc790\uc99d\uad8c\uc758 \uc6f9\uc18c\ucf13 \uc870\ud68c \uc2dc\uc2a4\ud15c\uc744 \ud30c\uc774\uc36c\uc758 \uba54\ubaa8\ub9ac \uad00\ub9ac \uc2dc\uc2a4\ud15c\uacfc \uc644\ubcbd\ud788 \ud1b5\ud569\ud558\uc5ec, GC\uc5d0 \uc758\ud574 \uc774\ubca4\ud2b8 \uad6c\ub3c5\uc774 \uad00\ub9ac\ub429\ub2c8\ub2e4.</li>\r\n</details>\r\n\r\n<details>\r\n<summary>\ud83d\udd8b\ufe0f \ud45c\uc900 \uc601\uc5b4 \ub124\uc774\ubc0d</summary>\r\n<ul>\r\n<li>\ud55c\uad6d\ud22c\uc790\uc99d\uad8c\uc758 API\uc758 \uacbd\uc6b0, \ud55c\uae00 \ubc1c\uc74c\uc774\ub098 \ube44\ud45c\uc900 \uc57d\uc5b4\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc2b5\ub2c8\ub2e4.</li>\r\n<li>\uc774 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub294 \ubaa8\ub4e0 \uac1d\uccb4\uc5d0 \ub300\ud574 \ud45c\uc900 \uc601\uc5b4 \ub124\uc774\ubc0d\uc744 \uc801\uc6a9\ud558\uc5ec, \uc774\ud574\ud558\uae30 \uc27d\ub3c4\ub85d \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4.</li>\r\n</details>\r\n\r\n<hr>\r\n\r\n## 2. \uc0ac\uc6a9 \uc124\uba85 \u2699\ufe0f\r\n\r\n<details>\r\n<summary>OpenAPI \uc11c\ube44\uc2a4 \uc2e0\uccad \ubc29\ubc95</summary>\r\n\r\n1. \ud55c\uad6d\ud22c\uc790\uc99d\uad8c \uacc4\uc88c\uc640 \uc544\uc774\ub514\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. KIS \ud2b8\ub808\uc774\ub529 \uc11c\ube44\uc2a4\ub294 [KIS Developers \uc11c\ube44\uc2a4](https://apiportal.koreainvestment.com/)\ub97c \ud1b5\ud574 \uc2e0\uccad \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\r\n\r\n![image](https://user-images.githubusercontent.com/34199905/193738291-c9c663fd-8ab4-43da-acb6-6a2f7846a79d.png)\r\n\r\n2. \uc11c\ube44\uc2a4\ub97c \uc2e0\uccad\uc774 \uc644\ub8cc\ub418\uba74, \uc544\ub798\uc640 \uac19\uc774 \uc571 \ud0a4\ub97c \ubc1c\uae09 \ubc1b\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\r\n\r\n![image](https://user-images.githubusercontent.com/34199905/193740291-53f282ee-c40c-40b9-874e-2df39543cb66.png)\r\n</details>\r\n\r\n### 2.1. \ub77c\uc774\ube0c\ub7ec\ub9ac \uc124\uce58 \ud83d\udce6\r\n\r\n\ub77c\uc774\ube0c\ub7ec\ub9ac\ub294 \ud30c\uc774\uc36c 3.11\uc744 \uae30\uc900\uc73c\ub85c \uc791\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\r\n\r\n```zsh\r\npip install python-kis\r\n```\r\n\r\n<details>\r\n<summary>\uc0ac\uc6a9\ub41c \ubaa8\ub4c8 \ubcf4\uae30</summary>\r\n\r\n```\r\nrequests>=2.32.3\r\nwebsocket-client>=1.8.0\r\ncryptography>=43.0.0\r\ncolorlog>=6.8.2\r\n```\r\n</details>\r\n\r\n<hr>\r\n\r\n### 2.2. \ub77c\uc774\ube0c\ub7ec\ub9ac \uc0ac\uc6a9 \ud83d\udcda\r\n\r\n#### 2.2.1. PyKis \uac1d\uccb4 \uc0dd\uc131\r\n\r\n1. \uc2dc\ud06c\ub9bf \ud0a4\ub97c \ud30c\uc77c\ub85c \uad00\ub9ac\ud558\ub294 \ubc29\ubc95 (\uad8c\uc7a5)\r\n \r\n \uba3c\uc800 \uc2dc\ud06c\ub9bf \ud0a4\ub97c \ud30c\uc77c\ub85c \uc800\uc7a5\ud569\ub2c8\ub2e4.\r\n ```python\r\n from pykis import KisAuth\r\n\r\n auth = KisAuth(\r\n # HTS \ub85c\uadf8\uc778 ID \uc608) soju06\r\n id=\"YOUR_HTS_ID\",\r\n # \uc571 \ud0a4 \uc608) Pa0knAM6JLAjIa93Miajz7ykJIXXXXXXXXXX\r\n appkey=\"YOUR_APP_KEY\",\r\n # \uc571 \uc2dc\ud06c\ub9bf \ud0a4 \uc608) V9J3YGPE5q2ZRG5EgqnLHn7XqbJjzwXcNpvY . . .\r\n secretkey=\"YOUR_APP_SECRET\",\r\n # \uc571 \ud0a4\uc640 \uc5f0\uacb0\ub41c \uacc4\uc88c\ubc88\ud638 \uc608) 00000000-01\r\n account=\"00000000-01\",\r\n # \ubaa8\uc758\ud22c\uc790 \uc5ec\ubd80\r\n virtual=False,\r\n )\r\n\r\n # \uc548\uc804\ud55c \uacbd\ub85c\uc5d0 \uc2dc\ud06c\ub9bf \ud0a4\ub97c \ud30c\uc77c\ub85c \uc800\uc7a5\ud569\ub2c8\ub2e4.\r\n auth.save(\"secret.json\")\r\n ```\r\n\r\n \uadf8 \ud6c4, \uc800\uc7a5\ub41c \uc2dc\ud06c\ub9bf \ud0a4\ub97c \uc0ac\uc6a9\ud558\uc5ec PyKis \uac1d\uccb4\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.\r\n\r\n ```python\r\n from pykis import PyKis, KisAuth\r\n\r\n # \uc2e4\uc804\ud22c\uc790\uc6a9 PyKis \uac1d\uccb4\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.\r\n kis = PyKis(\"secret.json\", keep_token=True)\r\n kis = PyKis(KisAuth.load(\"secret.json\"), keep_token=True)\r\n\r\n # \ubaa8\uc758\ud22c\uc790\uc6a9 PyKis \uac1d\uccb4\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.\r\n kis = PyKis(\"secret.json\", \"virtual_secret.json\", keep_token=True)\r\n kis = PyKis(KisAuth.load(\"secret.json\"), KisAuth.load(\"virtual_secret.json\"), keep_token=True)\r\n ```\r\n2. \uc2dc\ud06c\ub9bf \ud0a4\ub97c \uc9c1\uc811 \uc785\ub825\ud558\ub294 \ubc29\ubc95\r\n ```python\r\n from pykis import PyKis\r\n\r\n # \uc2e4\uc804\ud22c\uc790\uc6a9 \ud55c\uad6d\ud22c\uc790\uc99d\uad8c API\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.\r\n kis = PyKis(\r\n id=\"soju06\", # HTS \ub85c\uadf8\uc778 ID\r\n account=\"00000000-01\", # \uacc4\uc88c\ubc88\ud638\r\n appkey=\"PSED321z...\", # AppKey 36\uc790\ub9ac\r\n secretkey=\"RR0sFMVB...\", # SecretKey 180\uc790\ub9ac\r\n keep_token=True, # API \uc811\uc18d \ud1a0\ud070 \uc790\ub3d9 \uc800\uc7a5\r\n )\r\n\r\n # \ubaa8\uc758\ud22c\uc790\uc6a9 \ud55c\uad6d\ud22c\uc790\uc99d\uad8c API\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.\r\n kis = PyKis(\r\n id=\"soju06\", # HTS \ub85c\uadf8\uc778 ID\r\n account=\"00000000-01\", # \ubaa8\uc758\ud22c\uc790 \uacc4\uc88c\ubc88\ud638\r\n appkey=\"PSED321z...\", # \uc2e4\uc804\ud22c\uc790 AppKey 36\uc790\ub9ac\r\n secretkey=\"RR0sFMVB...\", # \uc2e4\uc804\ud22c\uc790 SecretKey 180\uc790\ub9ac\r\n virtual_id=\"soju06\", # \ubaa8\uc758\ud22c\uc790 HTS \ub85c\uadf8\uc778 ID\r\n virtual_appkey=\"PSED321z...\", # \ubaa8\uc758\ud22c\uc790 AppKey 36\uc790\ub9ac\r\n virtual_secretkey=\"RR0sFMVB...\", # \ubaa8\uc758\ud22c\uc790 SecretKey 180\uc790\ub9ac\r\n keep_token=True, # API \uc811\uc18d \ud1a0\ud070 \uc790\ub3d9 \uc800\uc7a5\r\n )\r\n ```\r\n\r\n#### 2.2.2. \uc2dc\uc138 \uc870\ud68c\r\n\r\n`stock.quote()` \ud568\uc218\ub97c \uc774\uc6a9\ud558\uc5ec \uad6d\ub0b4\uc8fc\uc2dd \ubc0f \ud574\uc678\uc8fc\uc2dd\uc758 \uc2dc\uc138\ub97c \uc870\ud68c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\r\n\r\n```python\r\nfrom pykis import KisQuote\r\n\r\n# \uc5d4\ube44\ub514\uc544\uc758 \uc0c1\ud488 \uac1d\uccb4\ub97c \uac00\uc838\uc635\ub2c8\ub2e4.\r\nstock = kis.stock(\"NVDA\")\r\n\r\nquote: KisQuote = stock.quote()\r\nquote: KisQuote = stock.quote(extended=True) # \uc8fc\uac04\uac70\ub798 \uc2dc\uc138\r\n\r\n# PyKis\uc758 \ubaa8\ub4e0 \uac1d\uccb4\ub294 repr\uc744 \ud1b5\ud574 \uc8fc\uc694 \ub0b4\uc6a9\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\r\n# \ub370\uc774\ud130\ub97c \ud655\uc778\ud558\ub294 \uc6a9\ub3c4\uc774\ubbc0\ub85c \uc2e4\uc81c \ud504\ub85c\ud37c\ud2f0 \ud0c0\uc785\uacfc \ub2e4\ub97c \uc218 \uc788\uc2b5\ub2c8\ub2e4.\r\nprint(quote)\r\n```\r\n\r\n```python\r\nKisForeignQuote(\r\n symbol='NVDA',\r\n market='NASDAQ',\r\n name='\uc5d4\ube44\ub514\uc544',\r\n sector_name='\ubc18\ub3c4\uccb4 \ubc0f \ubc18\ub3c4\uccb4\uc7a5\ube44',\r\n volume=1506310,\r\n amount=160791125,\r\n market_cap=2593332000000,\r\n indicator=KisForeignIndicator(\r\n eps=1.71,\r\n bps=2,\r\n per=63.88,\r\n pbr=54.65,\r\n week52_high=140.76,\r\n week52_low=39.2215,\r\n week52_high_date='2024-06-20',\r\n week52_low_date='2023-10-31'\r\n ),\r\n open=109.21,\r\n high=109.38,\r\n low=104.37,\r\n close=105.42,\r\n change=-3.79,\r\n unit=1,\r\n tick=0.01,\r\n risk='none',\r\n halt=False,\r\n overbought=False\r\n)\r\n```\r\n\r\n#### 2.2.3. \uc794\uace0 \uc870\ud68c\r\n\r\n`account.balance()` \ud568\uc218\ub97c \uc774\uc6a9\ud558\uc5ec \uc608\uc218\uae08 \ubc0f \ubcf4\uc720 \uc885\ubaa9\uc744 \uc870\ud68c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\r\n\r\n```python\r\nfrom pykis import KisBalance\r\n\r\n# \uc8fc \uacc4\uc88c \uac1d\uccb4\ub97c \uac00\uc838\uc635\ub2c8\ub2e4.\r\naccount = kis.account()\r\n\r\nbalance: KisBalance = account.balance()\r\n\r\nprint(repr(balance)) # repr\uc744 \ud1b5\ud574 \uac1d\uccb4\uc758 \uc8fc\uc694 \ub0b4\uc6a9\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\r\n```\r\n\r\n```python\r\nKisIntegrationBalance(\r\n account_number=KisAccountNumber('50113500-01'),\r\n deposits={\r\n 'KRW': KisDomesticDeposit(account_number=KisAccountNumber('50113500-01'), currency='KRW', amount=2447692, exchange_rate=1),\r\n 'USD': KisForeignPresentDeposit(account_number=KisAccountNumber('50113500-01'), currency='USD', amount=0, exchange_rate=1384.6),\r\n },\r\n stocks=[\r\n KisDomesticBalanceStock(account_number=KisAccountNumber('50113500-01'), market='KRX', symbol='000660', qty=14, price=192600, amount=2696400, profit=22900, profit_rate=0.856555077613615111277351786),\r\n KisDomesticBalanceStock(account_number=KisAccountNumber('50113500-01'), market='KRX', symbol='039200', qty=118, price=39600, amount=4672800, profit=-199500, profit_rate=-4.094575457176282248630010467)\r\n ],\r\n purchase_amount=7545800,\r\n current_amount=7369200,\r\n profit=-176600,\r\n profit_rate=-2.340374778022211031302181346\r\n)\r\n```\r\n\r\n#### 2.2.4. \ub9e4\ub3c4/\ub9e4\uc218 \uc8fc\ubb38\r\n\r\n`stock.order()`, `stock.buy()`, `stock.sell()`, `stock.modify()`, `stock.cancel()` \ud568\uc218\ub97c \uc774\uc6a9\ud558\uc5ec \ub9e4\uc218/\ub9e4\ub3c4 \uc8fc\ubb38 \ubc0f \uc815\uc815/\ucde8\uc18c\ub97c \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\r\n\r\n```python\r\nfrom pykis import KisOrder\r\n\r\n# SK\ud558\uc774\ub2c9\uc2a4 1\uc8fc \uc2dc\uc7a5\uac00 \ub9e4\uc218 \uc8fc\ubb38\r\norder: KisOrder = hynix.buy(qty=1)\r\n# SK\ud558\uc774\ub2c9\uc2a4 1\uc8fc \uc9c0\uc815\uac00 \ub9e4\uc218 \uc8fc\ubb38\r\norder: KisOrder = hynix.buy(price=194700, qty=1)\r\n# SK\ud558\uc774\ub2c9\uc2a4 \uc804\ub7c9 \uc2dc\uc7a5\uac00 \ub9e4\ub3c4 \uc8fc\ubb38\r\norder: KisOrder = hynix.sell()\r\n# SK\ud558\uc774\ub2c9\uc2a4 \uc804\ub7c9 \uc9c0\uc815\uac00 \ub9e4\ub3c4 \uc8fc\ubb38\r\norder: KisOrder = hynix.sell(price=194700)\r\n\r\nprint(order.pending) # \ubbf8\uccb4\uacb0 \uc8fc\ubb38\uc778\uc9c0 \uc5ec\ubd80\r\nprint(order.pending_order.pending_qty) # \ubbf8\uccb4\uacb0 \uc218\ub7c9\r\n\r\norder: KisOrder = order.modify(price=195000) # \ub2e8\uac00 \uc815\uc815\r\norder: KisOrder = order.modify(qty=10) # \uc218\ub7c9 \uc815\uc815\r\n\r\norder.cancel() # \uc8fc\ubb38 \ucde8\uc18c\r\n\r\n# \ubbf8\uccb4\uacb0 \uc8fc\ubb38 \uc804\uccb4 \ucde8\uc18c\r\nfor order in account.pending_orders():\r\n order.cancel()\r\n```\r\n\r\n\r\n#### 2.2.4. \uc2e4\uc2dc\uac04 \uccb4\uacb0\uac00 \uc870\ud68c\r\n\r\n\uad6d\ub0b4\uc8fc\uc2dd \ubc0f \ud574\uc678\uc8fc\uc2dd\uc758 \uc2e4\uc2dc\uac04 \uccb4\uacb0\uac00 \uc870\ud68c\ub294 `stock.on(\"price\", callback)` \ud568\uc218\ub97c \uc774\uc6a9\ud558\uc5ec \uc218\uc2e0\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\r\n\r\n```python\r\nfrom pykis import KisRealtimePrice, KisSubscriptionEventArgs, KisWebsocketClient, PyKis\r\n\r\ndef on_price(sender: KisWebsocketClient, e: KisSubscriptionEventArgs[KisRealtimePrice]):\r\n print(e.response)\r\n\r\nticket = hynix.on(\"price\", on_price)\r\n\r\nprint(kis.websocket.subscriptions) # \ud604\uc7ac \uad6c\ub3c5\uc911\uc778 \uc774\ubca4\ud2b8 \ubaa9\ub85d\r\n\r\ninput(\"Press Enter to exit...\")\r\n\r\nticket.unsubscribe()\r\n```\r\n\r\n```python\r\n{KisWebsocketTR(id='H0STCNT0', key='000660')}\r\nPress Enter to exit...\r\n[08/02 13:50:42] INFO: RTC Connected to real server\r\n[08/02 13:50:42] INFO: RTC Restoring subscriptions... H0STCNT0.000660\r\n[08/02 13:50:42] INFO: RTC Subscribed to H0STCNT0.000660\r\nKisDomesticRealtimePrice(market='KRX', symbol='000660', time='2024-08-02T13:50:44+09:00', price=174900, change=-18400, volume=8919304, amount=1587870362300)\r\nKisDomesticRealtimePrice(market='KRX', symbol='000660', time='2024-08-02T13:50:44+09:00', price=174800, change=-18500, volume=8919354, amount=1587879102300)\r\nKisDomesticRealtimePrice(market='KRX', symbol='000660', time='2024-08-02T13:50:45+09:00', price=174800, change=-18500, volume=8919358, amount=1587879801500)\r\nKisDomesticRealtimePrice(market='KRX', symbol='000660', time='2024-08-02T13:50:45+09:00', price=174900, change=-18400, volume=8920313, amount=1588046831000)\r\nKisDomesticRealtimePrice(market='KRX', symbol='000660', time='2024-08-02T13:50:45+09:00', price=174800, change=-18500, volume=8920319, amount=1588047879800)\r\n\r\n[08/02 13:50:48] INFO: RTC Unsubscribed from H0STCNT0.000660\r\n```\r\n\r\n## 3. \ud29c\ud1a0\ub9ac\uc5bc \ubaa9\ub85d \ud83d\udcd6\r\n \r\n- [1. PyKis \uc778\uc99d \uad00\ub9ac](https://github.com/Soju06/python-kis/wiki/Tutorial#1-pykis-\uc778\uc99d-\uad00\ub9ac)\r\n - [1.1. \uc2dc\ud06c\ub9bf \ud0a4 \uad00\ub9ac](https://github.com/Soju06/python-kis/wiki/Tutorial#11-\uc2dc\ud06c\ub9bf-\ud0a4-\uad00\ub9ac)\r\n - [1.2. \uc5d1\uc138\uc2a4 \ud1a0\ud070 \uad00\ub9ac](https://github.com/Soju06/python-kis/wiki/Tutorial#12-\uc5d1\uc138\uc2a4-\ud1a0\ud070-\uad00\ub9ac)\r\n- [2. \uc885\ubaa9 \uc2dc\uc138 \ubc0f \ucc28\ud2b8 \uc870\ud68c](https://github.com/Soju06/python-kis/wiki/Tutorial#2-\uc885\ubaa9-\uc2dc\uc138-\ubc0f-\ucc28\ud2b8-\uc870\ud68c)\r\n - [2.1. \uc2dc\uc138 \uc870\ud68c](https://github.com/Soju06/python-kis/wiki/Tutorial#21-\uc2dc\uc138-\uc870\ud68c)\r\n - [2.2. \ucc28\ud2b8 \uc870\ud68c](https://github.com/Soju06/python-kis/wiki/Tutorial#22-\ucc28\ud2b8-\uc870\ud68c)\r\n - [2.3. \ud638\uac00 \uc870\ud68c](https://github.com/Soju06/python-kis/wiki/Tutorial#23-\ud638\uac00-\uc870\ud68c)\r\n - [2.4. \uc7a5\uc6b4\uc601 \uc2dc\uac04 \uc870\ud68c](https://github.com/Soju06/python-kis/wiki/Tutorial#24-\uc7a5\uc6b4\uc601-\uc2dc\uac04-\uc870\ud68c)\r\n- [3. \uc8fc\ubb38 \ubc0f \uc794\uace0 \uc870\ud68c](https://github.com/Soju06/python-kis/wiki/Tutorial#3-\uc8fc\ubb38-\ubc0f-\uc794\uace0-\uc870\ud68c)\r\n - [3.1. \uc608\uc218\uae08 \ubc0f \ubcf4\uc720 \uc885\ubaa9 \uc870\ud68c](https://github.com/Soju06/python-kis/wiki/Tutorial#31-\uc608\uc218\uae08-\ubc0f-\ubcf4\uc720-\uc885\ubaa9-\uc870\ud68c)\r\n - [3.2. \uae30\uac04 \uc190\uc775 \uc870\ud68c](https://github.com/Soju06/python-kis/wiki/Tutorial#32-\uae30\uac04-\uc190\uc775-\uc870\ud68c)\r\n - [3.3. \uc77c\ubcc4 \uccb4\uacb0 \ub0b4\uc5ed \uc870\ud68c](https://github.com/Soju06/python-kis/wiki/Tutorial#33-\uc77c\ubcc4-\uccb4\uacb0-\ub0b4\uc5ed-\uc870\ud68c)\r\n - [3.4. \ub9e4\uc218 \uac00\ub2a5 \uae08\uc561/\uc218\ub7c9 \uc870\ud68c](https://github.com/Soju06/python-kis/wiki/Tutorial#34-\ub9e4\uc218-\uac00\ub2a5-\uae08\uc561\uc218\ub7c9-\uc870\ud68c)\r\n - [3.5. \ub9e4\ub3c4 \uac00\ub2a5 \uc218\ub7c9 \uc870\ud68c](https://github.com/Soju06/python-kis/wiki/Tutorial#35-\ub9e4\ub3c4-\uac00\ub2a5-\uc218\ub7c9-\uc870\ud68c)\r\n - [3.6. \ubbf8\uccb4\uacb0 \uc8fc\ubb38 \uc870\ud68c](https://github.com/Soju06/python-kis/wiki/Tutorial#36-\ubbf8\uccb4\uacb0-\uc8fc\ubb38-\uc870\ud68c)\r\n - [3.7. \ub9e4\ub3c4/\ub9e4\uc218 \uc8fc\ubb38 \ubc0f \uc815\uc815/\ucde8\uc18c](https://github.com/Soju06/python-kis/wiki/Tutorial#37-\ub9e4\ub3c4\ub9e4\uc218-\uc8fc\ubb38-\ubc0f-\uc815\uc815\ucde8\uc18c)\r\n - [3.7.1. \ub9e4\uc218/\ub9e4\ub3c4 \uc8fc\ubb38](https://github.com/Soju06/python-kis/wiki/Tutorial#371-\ub9e4\uc218\ub9e4\ub3c4-\uc8fc\ubb38)\r\n - [3.7.2. \uc8fc\ubb38 \uc815\uc815](https://github.com/Soju06/python-kis/wiki/Tutorial#372-\uc8fc\ubb38-\uc815\uc815)\r\n- [4. \uc2e4\uc2dc\uac04 \uc774\ubca4\ud2b8 \uc218\uc2e0](https://github.com/Soju06/python-kis/wiki/Tutorial#4-\uc2e4\uc2dc\uac04-\uc774\ubca4\ud2b8-\uc218\uc2e0)\r\n - [4.1. \uc774\ubca4\ud2b8 \uc218\uc2e0\uc744 \ud588\ub294\ub370, \ubc14\ub85c \ucde8\uc18c\ub429\ub2c8\ub2e4.](https://github.com/Soju06/python-kis/wiki/Tutorial#41-\uc774\ubca4\ud2b8-\uc218\uc2e0\uc744-\ud588\ub294\ub370-\ubc14\ub85c-\ucde8\uc18c\ub429\ub2c8\ub2e4)\r\n - [4.2. \uc2e4\uc2dc\uac04 \uccb4\uacb0\uac00 \uc870\ud68c](https://github.com/Soju06/python-kis/wiki/Tutorial#42-\uc2e4\uc2dc\uac04-\uccb4\uacb0\uac00-\uc870\ud68c)\r\n - [4.3. \uc2e4\uc2dc\uac04 \ud638\uac00 \uc870\ud68c](https://github.com/Soju06/python-kis/wiki/Tutorial#43-\uc2e4\uc2dc\uac04-\ud638\uac00-\uc870\ud68c)\r\n - [4.4. \uc2e4\uc2dc\uac04 \uccb4\uacb0\ub0b4\uc5ed \uc870\ud68c](https://github.com/Soju06/python-kis/wiki/Tutorial#44-\uc2e4\uc2dc\uac04-\uccb4\uacb0\ub0b4\uc5ed-\uc870\ud68c)\r\n\r\n\r\n## 4. Changelog \u2728\r\n\r\n### ver 2.0.3\r\n\r\n- [KisIntegrationBalance\uc5d0\uc11c \ud574\uc678\uc8fc\uc2dd \uc794\uace0\uc218\ub7c9\uc774 0\uc73c\ub85c \ud45c\uc2dc\ub428](https://github.com/Soju06/python-kis/issues/41) \ubc84\uadf8\ub97c \uc218\uc815\ud588\uc2b5\ub2c8\ub2e4.\r\n\r\n### ver 2.0.2\r\n\r\n- `KisBalance`, `KisChart` \ub4f1 `__iter__` \uba54\uc11c\ub4dc\uc758 \ubc18\ud658 \ud0c0\uc785\uc774 \ub204\ub77d\ub418\uc5b4\uc788\ub294 \ubc84\uadf8\ub97c \uc218\uc815\ud588\uc2b5\ub2c8\ub2e4.\r\n- \uc8fc\ubb38 \uc218\ub7c9\uc744 \uc785\ub825\ud560 \ub54c `Decimal` \ud0c0\uc785 \uc774\uc678\uc758 `int`, `float` \ud0c0\uc785\uc744 \uc785\ub825\ud560 \uc218 \uc788\ub3c4\ub85d \uac1c\uc120\ud588\uc2b5\ub2c8\ub2e4.\r\n\r\n### ver 2.0.1\r\n\r\n- \ucd08\uae30 \uc6f9\uc18c\ucf13 \uc774\ubca4\ud2b8 \uad6c\ub3c5\uc2dc \ud074\ub77c\uc774\uc5b8\ud2b8 \uc811\uc18d \ud6c4 \uad6c\ub3c5\uc744 \uc694\uccad\ud558\ub294 \ucf54\ub4dc\uc5d0\uc11c `_connected_event`\uac00 set \ub418\uc5b4\uc788\uc9c0 \uc54a\uc544, \uc694\uccad\uc774 \ubb34\uc2dc\ub418\ub294 \ubc84\uadf8\ub97c \uc218\uc815\ud588\uc2b5\ub2c8\ub2e4.\r\n\r\n### ver 2.0.0\r\n\r\n- \ub77c\uc774\ube0c\ub7ec\ub9ac\uac00 \uc644\uc804\ud788 \uc0c8\ub86d\uac8c \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\r\n- \ubaa8\ub4e0 \uac1d\uccb4\uc5d0 \ub300\ud55c \ucd94\uc0c1\ud654 \ubc0f \ub124\uc774\ubc0d\uc774 \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\r\n- \ud55c\uad6d\ud22c\uc790\uc99d\uad8c\uc758 \uad6d\ub0b4, \ud574\uc678 API \uad6c\ubd84 \uc5c6\uc774 \ub3d9\uc77c\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\r\n- \uc2e4\uc2dc\uac04 \uc2dc\uc138 \uc870\ud68c\ub294 \uc0c8\ub85c\uc6b4 \uc774\ubca4\ud2b8 \uc2dc\uc2a4\ud15c\uc73c\ub85c \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\r\n- \uacc4\uc88c \ubc0f \uc0c1\ud488 Scope \ud65c\uc6a9\uc774 \uadf9\ub300\ud654\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\r\n\r\n### ver 1.0.6\r\n\r\n- \uc0c1\ud488\uae30\ubcf8\uc870\ud68c\uac00 \ucd94\uac00\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\r\n\r\n- \ud658\uacbd \ubcc0\uc218\ub97c \ubd84\ub9ac\ud558\uc600\uc2b5\ub2c8\ub2e4.\r\n \uac01\uac01\uc758 \ud30c\uc77c\uc5d0 \ub098\ub258\uc5b4\uc788\ub358 Version, \uc811\uc18d URL, API Rate Limit \ub4f1\uc758 \uc0c1\uc218 \ub370\uc774\ud130\ub97c `__env__.py`\ub85c \uc62e\uacbc\uc2b5\ub2c8\ub2e4.\r\n\r\n- \uc608\uc678\uad6c\uc870 \ubcc0\uacbd\r\n \uae30\uc874 HTTP Error, RT_CD Error\ub97c \ubaa8\ub450 `ValueError`\ub85c \ucc98\ub9ac\ud558\ub358 \uad6c\uc870\uc5d0\uc11c \uac01\uac01\uc758 `KisHTTPError`, `KisAPIError` \uc608\uc678 \uac1d\uccb4\ub85c \ub098\ub204\uc5c8\uace0, `rt_cd`, `msg_cd` \ub4f1\uc758 \ubcc0\uc218\ub97c \uc608\uc678 \uac1d\uccb4\uc5d0\uc11c \ucc38\uc870\ud560 \uc218 \uc788\ub3c4\ub85d \ubcc0\uacbd\ud558\uc600\uc2b5\ub2c8\ub2e4.\r\n\r\n- \uc5d1\uc138\uc2a4\ud1a0\ud070 \ubc1c\uae09 Thread Safe\r\n \uc5d1\uc138\uc2a4 \ud1a0\ud070\uc774 \ubc1c\uae09\ub418\uc5b4\uc788\uc9c0 \uc54a\uc740 \uc0c1\ud0dc\uc5d0\uc11c \uba40\ud2f0\uc2a4\ub808\ub4dc\ub85c `KisAccessToken.ensure()` \ud568\uc218\ub97c \ud638\ucd9c\ud558\uba74 Thread Lock \ub418\uc9c0 \uc54a\uace0 \ub2e4\uc218\uac00 `KisAccessToken.issue()`\ub97c \ud638\ucd9c\ud558\ub294 \ubb38\uc81c\ub97c \ud574\uacb0\ud558\uc600\uc2b5\ub2c8\ub2e4.\r\n\r\n### ver 1.0.5\r\n\r\n- `RTClient`\uc5d0\uc11c \uc6f9\uc18c\ucf13 \uc5f0\uacb0\uc774 \ub04a\uc5b4\uc84c\uc744 \ub54c, \uc774\ubca4\ud2b8 \ucc98\ub9ac\uac00 \uc798\ubabb\ub418\ub294 \ubc84\uadf8\ub97c \uc218\uc815\ud558\uc600\uc2b5\ub2c8\ub2e4.\r\n\r\n- `RTClient`\uc5d0\uc11c \uc7ac\uc5f0\uacb0\uc2dc \uc2e4\uc2dc\uac04 \uc870\ud68c\uac00 \ubcf5\uad6c\ub418\uc9c0 \uc54a\ub294 \ubc84\uadf8\ub97c \uc218\uc815\ud558\uc600\uc2b5\ub2c8\ub2e4.\r\n\r\n- \ud734\uc7a5\uc77c \uc870\ud68c\uac00 \ucd94\uac00\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\r\n\r\n- \ud574\uc678 \uc8fc\uc2dd \uc8fc\ubb38\uc774 \ucd94\uac00\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\r\n\r\n- \ud574\uc678 \ubbf8\uccb4\uacb0 \uc870\ud68c\uac00 \ucd94\uac00\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\r\n\r\n### ver 1.0.4\r\n\r\n- \uc8fc\uc2dd\uc794\uace0\uc870\ud68c_\uc2e4\ud604\uc190\uc775 \uc870\ud68c\uac00 \ucd94\uac00\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\r\n\r\n- [\uc2e4\uc2dc\uac04 \ud574\uc81c\uc694\uccad\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4](https://github.com/Soju06/python-kis/issues/1) \ubc84\uadf8\ub97c \uc218\uc815\ud558\uc600\uc2b5\ub2c8\ub2e4.\r\n\r\n### ver 1.0.3\r\n\r\n- `RTClient` [\uc6f9\uc18c\ucf13 \ubcf4\uc548\uac15\ud654\ub97c \uc704\ud55c \uac1c\uc120 \uc548\ub0b4](https://apiportal.koreainvestment.com/community/10000000-0000-0011-0000-000000000001)\uc758 \ub0b4\uc6a9\uc5d0 \ub530\ub77c, \uc571\ud0a4 \ub300\uc2e0 \uc6f9\uc18c\ucf13 \uc811\uc18d\ud0a4\ub97c \ubc1c\uae09\ud558\uc5ec \uc0ac\uc6a9\ud558\ub3c4\ub85d \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\r\n\r\n### ver 1.0.2\r\n\r\n- API \ucd08\ub2f9 \uc694\uccad \uc81c\ud55c\uc744 \ub118\uc5b4\ubc84\ub9ac\ub294 \ubc84\uadf8\ub97c \uc218\uc815\ud558\uc600\uc2b5\ub2c8\ub2e4.\r\n- `period_price` \uc751\ub2f5 \ub370\uc774\ud130\uc758 `stck_fcam`\uac12 `float`\uc73c\ub85c \ubcc0\uacbd\ud558\uc600\uc2b5\ub2c8\ub2e4.\r\n- `utils.KRXMarketOpen` \uacf5\ud734\uc77c \ub370\uc774\ud130\uac00 1\uac1c\uc778 \uacbd\uc6b0 \uc624\ub958 \ubc1c\uc0dd\ud558\ub294 \ubc84\uadf8 \uc218\uc815\ud558\uc600\uc2b5\ub2c8\ub2e4.\r\n\r\n\r\n### License\r\n\r\n[MIT](https://github.com/Soju06/python-kis/blob/main/LICENCE)\r\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "\ud30c\uc774\uc36c \ud55c\uad6d\ud22c\uc790\uc99d\uad8c REST \uae30\ubc18 Trading API \ub77c\uc774\ube0c\ub7ec\ub9ac",
"version": "2.0.3",
"project_urls": {
"Bug Tracker": "https://github.com/Soju06/python-kis/issues",
"Documentation": "https://github.com/Soju06/python-kis/wiki/Tutorial",
"Source Code": "https://github.com/Soju06/python-kis"
},
"split_keywords": [
"python",
" client",
" library",
" trading",
" websocket",
" realtime",
" investing",
" korean",
" investment",
" autotrading",
" koreainvestment"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "98d498aaecaa0233fb840d058a269f850f8d604c3b85baa349aa4c53409f33c1",
"md5": "3247b5e22345d6f9aa6ceea44a74c274",
"sha256": "20a8db0617483a6c47f91a4a03c9163d65541449d7863f4b71e74b966ea54718"
},
"downloads": -1,
"filename": "python_kis-2.0.3-py3-none-any.whl",
"has_sig": false,
"md5_digest": "3247b5e22345d6f9aa6ceea44a74c274",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 477513,
"upload_time": "2024-08-28T00:24:06",
"upload_time_iso_8601": "2024-08-28T00:24:06.614375Z",
"url": "https://files.pythonhosted.org/packages/98/d4/98aaecaa0233fb840d058a269f850f8d604c3b85baa349aa4c53409f33c1/python_kis-2.0.3-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-08-28 00:24:06",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "Soju06",
"github_project": "python-kis",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "python-kis"
}