ํ๊ตญํฌ์์ฆ๊ถ์ ํธ๋ ์ด๋ฉ OPEN API ์๋น์ค๋ฅผ ํ์ด์ฌ ํ๊ฒฝ์์ ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ ๊ฐ๋ ฅํ ์ด์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ชจ๋ ํจ์์ ํด๋์ค์ Typing์ ์ ์ฉํ์ฌ, ํ์ด์ฌ์ ๋์ ํ์ดํ์ ๋ณด์ํฉ๋๋ค. IDE์ ์๋์์ฑ ๊ธฐ๋ฅ์ ํตํด, ๊ณต์ ๋ฌธ์ ์์ด ๋์ฑ ๋น ๋ฅด๊ณ ์ ํํ ๊ฐ๋ฐ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ค์๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ํด๋ผ์ด์ธํธ๋ฅผ ๋คํธ์ํฌ ๋ฌธ์ ๋ฑ์ผ๋ก ์ธํด ์ค๋จํ์ ๋, ๋ค์ ์์ํ ์ ์๋๋ก ๋ง๋ค์ด์ก์ต๋๋ค. ๋ํ, ์ด์ ์ ๋ฑ๋ก๋ ์กฐํ๋ ์๋์ผ๋ก ์ฌ๋ฑ๋กํฉ๋๋ค.
์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ ์คํธ ํ์ผ์ธ ์์ฅ๋ณ ์ข ๋ชฉ ์ ๋ณด๋ฅผ ์๋์ผ๋ก ํ์ฑํ์ฌ, SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํฉ๋๋ค. ๋น ๋ฅธ ์กฐํ์ ๊ฒ์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๋งค์ผ ์๋์ผ๋ก ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
- ํ๊ตญํฌ์์ฆ๊ถ ๊ณ์ข์ ์์ด๋๊ฐ ํ์ํฉ๋๋ค. KIS ํธ๋ ์ด๋ฉ ์๋น์ค๋ KIS Developers ์๋น์ค๋ฅผ ํตํด ์ ์ฒญ ํ ์ ์์ต๋๋ค.
- ์๋น์ค๋ฅผ ์ ์ฒญ์ด ์๋ฃ๋๋ฉด, ์๋์ ๊ฐ์ด ์ฑ ํค๋ฅผ ๋ฐ๊ธ ๋ฐ์ ์ ์์ต๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ์ด์ฌ 3.10์ ๊ธฐ์ค์ผ๋ก ์์ฑ๋์์ต๋๋ค.
pip install python-kis
์ฌ์ฉ๋ ๋ชจ๋ ๋ณด๊ธฐ
requests>=2.28.1
SQLAlchemy>=1.4.39
websocket-client>=1.4.1
pycryptodome>=3.15.0
colorlog>=6.7.0
ํ๋ ํด๋์ค๊ฐ ๋ง์ from pykis import *
๋ก ์ํฌํธ ํ์.
ํด๋์ค ๋ค์ด๋ฐ ๊ท์น์ Kis + ๊ธฐ๋ฅ๋ช ์ด๋๊น ์ถฉ๋ ํ ์ผ ์๋ค.
from pykis import *
๋ชจ๋ KIS API๋ PyKis ๊ฐ์ฒด๋ฅผ ํตํด ์ฌ์ฉํ ์ ์๋ค.
ํ๋์ ํ์ด์ฌ ํ๋ก์ธ์ค์์ ์ฌ๋ฌ PyKis ๊ฐ์ฒด ์์ฑ์ ๊ถ์ฅํ์ง ์๋๋ค.
๋ค ์ ๋๊ฒ ํด๋จ๋ค. ํ๋๋ง ์ฐ์.
kis = PyKis(
# ์ฑ ํค ์) Pa0knAM6JLAjIa93Miajz7ykJIXXXXXXXXXX
appkey=APPKEY,
# ์ฑ ์ํฌ๋ฆฟ ์) V9J3YGPE5q2ZRG5EgqnLHn7XqbJjzwXcNpvY . . .
appsecret=APPSECRET,
# ๊ฐ์ ๊ณ์ข ์ฌ๋ถ
virtual_account=True,
)
[10/04 15:53:30] INFO MARKET: sync kospi, download https://new.real.download.dws.co.kr/common/master/kospi_code.mst.zip
[10/04 15:53:30] INFO RTC websocket connected
[10/04 15:53:31] INFO MARKET: parseing kospi data... 1967 lines
[10/04 15:53:32] INFO MARKET: sync kosdaq, download https://new.real.download.dws.co.kr/common/master/kosdaq_code.mst.zip
[10/04 15:53:33] INFO MARKET: parseing kosdaq data... 1587 lines
[10/04 15:53:34] INFO MARKET: sync sector, download https://new.real.download.dws.co.kr/common/master/idxcode.mst.zip
[10/04 15:53:35] INFO MARKET: parseing sector data... 483 lines
์ด๊ธฐ ์์ฑ์ ์์ฅ์ ๋ณด๋ฅผ ๋๊ธฐํ ํ๋ค. ์์ฅ ์ ๋ณด๋ $temp/.pykis-cache_market.{version}.db
์ ์ ์ฅ๋๋ค.
์์ฅ ์ ๋ณด๋ ๋ง์ง๋ง ๋๊ธฐํ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก 24์๊ฐ๋ง๋ค ์๋์ผ๋ก ๊ฐฑ์ ๋๋ค.
์๊ฐํ๋ฅผ ์ํด PrettyTable๋ฅผ ์ฌ์ฉํ๋ค.
๋ค์์ ๋ช ๋ น์ด๋ก PrettyTable์ ์ค์นํ ์ ์๋ค.
pip install prettytable
์๊ณ ๋ฅผ ์กฐํํด๋ณด์.
from pykis import *
from prettytable import PrettyTable
kis = PyKis(
# ์ฑ ํค ์) Pa0knAM6JLAjIa93Miajz7ykJIXXXXXXXXXX
appkey=APPKEY,
# ์ฑ ์ํฌ๋ฆฟ ์) V9J3YGPE5q2ZRG5EgqnLHn7XqbJjzwXcNpvY . . .
appsecret=APPSECRET,
# ๊ฐ์ ๊ณ์ข ์ฌ๋ถ
virtual_account=True,
)
# ๋จผ์ ๊ณ์ข ์ค์ฝํ๋ฅผ ์์ฑํ๋ค.
account = kis.account('50071022-01') # ๊ณ์ข๋ฒํธ ex) 50071022-01 ๋๋ 5007102201
# ์ด์ ์๊ณ ๋ฅผ ์กฐํํ๋ค.
balance = account.balance_all()
# ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
print(f'์์๊ธ: {balance.dnca_tot_amt:,}์ ํ๊ฐ๊ธ: {balance.tot_evlu_amt:,} ์์ต: {balance.evlu_pfls_smtl_amt:,}์')
# ํ
์ด๋ธ์ ์๊ฐํ ํ๊ธฐ ์ํด PrettyTable์ ์ฌ์ฉํ๋ค.
table = PrettyTable(field_names=[
'์ํ๋ฒํธ', '์ํ๋ช
', '๋ณด์ ์๋', '๋งค์
๊ธ์ก',
'ํ์ฌ๊ฐ', 'ํ๊ฐ์์ต์จ', 'ํ๊ฐ์์ต',
], align='r',
)
# ์๊ณ ๋ฅผ ํ
์ด๋ธ์ ์ถ๊ฐํ๋ค.
for stock in balance.stocks:
table.add_row([
stock.pdno,
stock.prdt_name,
f'{stock.hldg_qty:,}์ฃผ',
f'{stock.pchs_amt:,}์',
f'{stock.prpr:,}์',
f'{stock.evlu_pfls_rt:.2f}%',
f'{stock.evlu_pfls_amt:,}์',
])
print(table)
๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
์์๊ธ: 7,799,675์ ํ๊ฐ๊ธ: 10,071,255 ์์ต: 70,165์
+----------+----------------+----------+-----------+-----------+------------+-----------+
| ์ํ๋ฒํธ | ์ํ๋ช
| ๋ณด์ ์๋ | ๋งค์
๊ธ์ก | ํ์ฌ๊ฐ | ํ๊ฐ์์ต์จ | ํ๊ฐ์์ต |
+----------+----------------+----------+-----------+-----------+------------+-----------+
| 004370 | ๋์ฌ | 3์ฃผ | 910,500์ | 298,000์ | -1.81% | -16,500์ |
| 005305 | ๋กฏ๋ฐ์น ์ฑ์ฐ | 4์ฃผ | 274,900์ | 68,200์ | -0.76% | -2,100์ |
| 005935 | ์ผ์ฑ์ ์์ฐ | 4์ฃผ | 190,000์ | 51,000์ | 7.37% | 14,000์ |
| 034220 | LG๋์คํ๋ ์ด | 20์ฃผ | 241,000์ | 13,550์ | 12.45% | 30,000์ |
| 053260 | ๊ธ๊ฐ์ฒ ๊ฐ | 20์ฃผ | 145,800์ | 7,550์ | 3.57% | 5,200์ |
| 073240 | ๊ธํธํ์ด์ด | 3์ฃผ | 10,215์ | 3,260์ | -4.26% | -435์ |
| 373220 | LG์๋์ง์๋ฃจ์
| 1์ฃผ | 429,000์ | 469,000์ | 9.32% | 40,000์ |
+----------+----------------+----------+-----------+-----------+------------+-----------+
ํฌ์ ๊ฒฐ๊ณผ๊ฐ ๋์์ง ์์๊ฑธ?
- 1. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
- 2. ์ํฌํธ
- 3. ์์ฅ ์กฐํ
- 3.1. ์์ฅ ์ ์ข ๋ชฉ ์กฐํ
- 3.2. ์์ฅ ์ข ๋ชฉ ์กฐํ
- 3.3. ์์ฅ ๊ฒ์
- 4. ์ข ๋ชฉ ์์ธ
- 4.1. ํ์ฌ๊ฐ ์กฐํ
- 4.2. ํธ๊ฐ ์กฐํ
- 4.3. ๊ธฐ๊ฐ๋ด ์กฐํ
- 4.4. ์ด ์ธ ๊ธฐ๋ฅ
- 5. ์ค์๊ฐ ์กฐํ
- 5.1. ์ค์๊ฐ ์ฒด๊ฒฐ๊ฐ
- 5.2. ์ค์๊ฐ ํธ๊ฐ
- 5.3. ์ค์๊ฐ ์ฒด๊ฒฐ
- 5.4. ๋ฆฌ์ค๋ ํด์
- 5.5. ์ค์๊ฐ ํด์
- 5.6. ๋ชจ๋ ์ด๋ฒคํธ ์์
- 6. ๊ณ์ข
- 6.1. ์๊ณ ์กฐํ
- 6.2. ์ฃผ๋ฌธ๊ฐ๋ฅ ๊ธ์ก ์กฐํ
- 6.3. ๋งค์ ์ฃผ๋ฌธ
- 6.4. ๋งค๋ ์ฃผ๋ฌธ
- 6.5. ์ฃผ๋ฌธ ์ทจ์
- 6.6. ์ฃผ๋ฌธ ์ ์
- 6.7. ์ด ์ธ์ ๊ธฐ๋ฅ
- 7. ์ ํธ๋ฆฌํฐ
- 7.1. ์ํ๊ฐํํ๊ฐ ์กฐํ
- 7.2. ๋ฑ๋ฝ์จ ์์ ์กฐํ
- 7.3. ์์ฅ์คํ์ฌ๋ถ ์กฐํ
- ๊ณ์ข ์กฐํ
- ๊ณ์ข ์ฃผ๋ฌธ
- ์ข ๋ชฉ ์์ธ
- ์ค์๊ฐ ์ฒด๊ฒฐ๊ฐ์ฒด๊ฒฐ ์กฐํ
- ์ํ๊ฐ/ํํ๊ฐ/์์น/ํ๋ฝ/๊ฑฐ๋์์ ์ข ๋ชฉ ์กฐํ
- ์์ฅ ์คํ ์ฌ๋ถ
๊ตญ๋ด ์ฃผ์ ์์ฅ์์ ์ฌ์ฉํ ์ ์๋ API๋ฅผ ์ง์ํฉ๋๋ค. ํด์ธ, ์ ๋ฌผ, ์ต์ ๋ฑ๊ณผ ์ ์ฉ์ ์ง์ํ์ง ์์ต๋๋ค.
API | ๊ธฐ๋ฅ | ์ง์ ์ฌ๋ถ |
---|---|---|
OAuth์ธ์ฆ | Hashkey | โ |
OAuth์ธ์ฆ | ์ ๊ทผํ ํฐ๋ฐ๊ธ(P) | โ |
OAuth์ธ์ฆ | ์ ๊ทผํ ํฐํ๊ธฐ(P) | โ |
๊ตญ๋ด์ฃผ์์ฃผ๋ฌธ | ์ฃผ์์ฃผ๋ฌธ(ํ๊ธ) | โ |
๊ตญ๋ด์ฃผ์์ฃผ๋ฌธ | ์ฃผ์์ฃผ๋ฌธ(์ ์ฉ) | โ |
๊ตญ๋ด์ฃผ์์ฃผ๋ฌธ | ์ฃผ์์ฃผ๋ฌธ(์ ์ ์ทจ์) | โ |
๊ตญ๋ด์ฃผ์์ฃผ๋ฌธ | ์ฃผ์์ ์ ์ทจ์๊ฐ๋ฅ์ฃผ๋ฌธ์กฐํ | โ |
๊ตญ๋ด์ฃผ์์ฃผ๋ฌธ | ์ฃผ์์ผ๋ณ์ฃผ๋ฌธ์ฒด๊ฒฐ์กฐํ | โ |
๊ตญ๋ด์ฃผ์์ฃผ๋ฌธ | ์ฃผ์์๊ณ ์กฐํ | โ |
๊ตญ๋ด์ฃผ์์ฃผ๋ฌธ | ๋งค์๊ฐ๋ฅ์กฐํ | โ |
๊ตญ๋ด์ฃผ์์ฃผ๋ฌธ | ์ฃผ์์์ฝ์ฃผ๋ฌธ | โ |
๊ตญ๋ด์ฃผ์์ฃผ๋ฌธ | ์ฃผ์์์ฝ์ฃผ๋ฌธ์ ์ ์ทจ์ | โ |
๊ตญ๋ด์ฃผ์์ฃผ๋ฌธ | ์ฃผ์์์ฝ์ฃผ๋ฌธ์กฐํ | โ |
๊ตญ๋ด์ฃผ์์ฃผ๋ฌธ | ํด์ง์ฐ๊ธ์ข ํฉ์ฃผ๋ฌธ | โ |
๊ตญ๋ด์ฃผ์์ฃผ๋ฌธ | ์ฃผ์์๊ณ ์กฐํ_์คํ์์ต | โ |
๊ตญ๋ด์ฃผ์์์ธ | ์ฃผ์ํ์ฌ๊ฐ ์์ธ | โ |
๊ตญ๋ด์ฃผ์์์ธ | ์ฃผ์ํ์ฌ๊ฐ ์ฒด๊ฒฐ | โ |
๊ตญ๋ด์ฃผ์์์ธ | ์ฃผ์ํ์ฌ๊ฐ ์ผ์๋ณ | โ |
๊ตญ๋ด์ฃผ์์์ธ | ์ฃผ์ํ์ฌ๊ฐ ํธ๊ฐ ์์์ฒด๊ฒฐ | โ |
๊ตญ๋ด์ฃผ์์์ธ | ์ฃผ์ํ์ฌ๊ฐ ํฌ์์ | โ |
๊ตญ๋ด์ฃผ์์์ธ | ์ฃผ์ํ์ฌ๊ฐ ํ์์ฌ | โ |
๊ตญ๋ด์ฃผ์์์ธ | ELWํ์ฌ๊ฐ ์์ธ | โ |
๊ตญ๋ด์ฃผ์์์ธ | ๊ตญ๋ด์ฃผ์๊ธฐ๊ฐ๋ณ์์ธ(์ผ/์ฃผ/์/๋ ) | โ |
๊ตญ๋ด์ฃผ์์์ธ | ๊ตญ๋ด์ฃผ์์ ์ข ๊ธฐ๊ฐ๋ณ์์ธ(์ผ/์ฃผ/์/๋ ) | โ |
๊ตญ๋ด์ฃผ์์์ธ | ์ฃผ์ํ์ฌ๊ฐ ๋น์ผ์๊ฐ๋๋ณ์ฒด๊ฒฐ | โ |
๊ตญ๋ด์ฃผ์์์ธ | ์ฃผ์ํ์ฌ๊ฐ ์๊ฐ์ธ์๊ฐ๋ณ์ฒด๊ฒฐ | โ |
๊ตญ๋ด์ฃผ์์์ธ | ์ฃผ์ํ์ฌ๊ฐ ์๊ฐ์ธ์ผ์๋ณ์ฃผ๊ฐ | โ |
๊ตญ๋ด์ฃผ์์์ธ | ์ฃผ์๋น์ผ๋ถ๋ด์กฐํ | โ |
์ค์๊ฐ์์ธ | ์ฃผ์ํ์ฌ๊ฐ ์ค์๊ฐ์ฃผ์์ฒด๊ฒฐ๊ฐ | โ |
์ค์๊ฐ์์ธ | ์ฃผ์ํ์ฌ๊ฐ ์ค์๊ฐ์ฃผ์ํธ๊ฐ | โ |
์ค์๊ฐ์์ธ | ์ฃผ์ํ์ฌ๊ฐ ์ค์๊ฐ์ฃผ์์ฒด๊ฒฐํต๋ณด | โ |
์ค์๊ฐ์์ธ | ํด์ธ์ฃผ์ ์ค์๊ฐ์ง์ฐ์ฒด๊ฒฐ๊ฐ | โ |
์ค์๊ฐ์์ธ | ํด์ธ์ฃผ์ ์ค์๊ฐ์ง์ฐํธ๊ฐ | โ |
์ค์๊ฐ์์ธ | ํด์ธ์ฃผ์ ์ค์๊ฐ์ฒด๊ฒฐํต๋ณด | โ |
๊ตญ๋ด์ ๋ฌผ์ต์ ์ฃผ๋ฌธ | * | โ |
๊ตญ๋ด์ ๋ฌผ์ต์ ์์ธ | * | โ |
ํด์ธ์ฃผ์์ฃผ๋ฌธ | * | โ |
ํด์ธ์ฃผ์ํ์ฌ๊ฐ | * | โ |
ํด์ธ์ ๋ฌผ์ต์ ์ฃผ๋ฌธ | * | โ |
ํด์ธ์ ๋ฌผ์ต์ ์์ธ | * | โ |
-
RTClient
์์ ์น์์ผ ์ฐ๊ฒฐ์ด ๋์ด์ก์ ๋, ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ฐ ์๋ชป๋๋ ๋ฒ๊ทธ๋ฅผ ์์ ํ์์ต๋๋ค. -
RTClient
์์ ์ฌ์ฐ๊ฒฐ์ ์ค์๊ฐ ์กฐํ๊ฐ ๋ณต๊ตฌ๋์ง ์๋ ๋ฒ๊ทธ๋ฅผ ์์ ํ์์ต๋๋ค. -
ํด์ฅ์ผ ์กฐํ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค.
-
ํด์ธ ์ฃผ์ ์ฃผ๋ฌธ์ด ์ถ๊ฐ๋์์ต๋๋ค.
-
ํด์ธ ๋ฏธ์ฒด๊ฒฐ ์กฐํ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค.
-
์ฃผ์์๊ณ ์กฐํ_์คํ์์ต ์กฐํ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค.
-
์ค์๊ฐ ํด์ ์์ฒญ์ด ์ ์์ ์ผ๋ก ๋์ง ์์ต๋๋ค ๋ฒ๊ทธ๋ฅผ ์์ ํ์์ต๋๋ค.
RTClient
์น์์ผ ๋ณด์๊ฐํ๋ฅผ ์ํ ๊ฐ์ ์๋ด์ ๋ด์ฉ์ ๋ฐ๋ผ, ์ฑํค ๋์ ์น์์ผ ์ ์ํค๋ฅผ ๋ฐ๊ธํ์ฌ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค.
- API ์ด๋น ์์ฒญ ์ ํ์ ๋์ด๋ฒ๋ฆฌ๋ ๋ฒ๊ทธ๋ฅผ ์์ ํ์์ต๋๋ค.
period_price
์๋ต ๋ฐ์ดํฐ์stck_fcam
๊ฐfloat
์ผ๋ก ๋ณ๊ฒฝํ์์ต๋๋ค.utils.KRXMarketOpen
๊ณตํด์ผ ๋ฐ์ดํฐ๊ฐ 1๊ฐ์ธ ๊ฒฝ์ฐ ์ค๋ฅ ๋ฐ์ํ๋ ๋ฒ๊ทธ ์์ ํ์์ต๋๋ค.