Skip to content

koreainvestment/open-trading-api

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

393 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

[LLM Repository Guide]

ChatGPT, Claude ๋“ฑ LLM(Large Language Model)๊ณผ AI ์—์ด์ „ํŠธ๊ฐ€ ์ด ์ €์žฅ์†Œ๋ฅผ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก llms.txt๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

[๋‹น์‚ฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ์ƒ˜ํ”Œ์ฝ”๋“œ์— ๋Œ€ํ•œ ์œ ์˜์‚ฌํ•ญ]

  • ์ƒ˜ํ”Œ ์ฝ”๋“œ๋Š” ํ•œ๊ตญํˆฌ์ž์ฆ๊ถŒ Open API(KIS Developers)๋ฅผ ์—ฐ๋™ํ•˜๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ๊ณ ๊ฐ๋‹˜์˜ ๊ฐœ๋ฐœ ๋ถ€๋‹ด์„ ์ค„์ด๊ณ ์ž ์ฐธ๊ณ ์šฉ์œผ๋กœ ์ œ๊ณต๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ƒ˜ํ”Œ ์ฝ”๋“œ๋Š” ๋ณ„๋„์˜ ๊ณต์ง€ ์—†์ด ์ง€์†์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ƒ˜ํ”Œ ์ฝ”๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ œ์ž‘ํ•œ ๊ณ ๊ฐ๋‹˜์˜ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์ธํ•œ ์†ํ•ด์— ๋Œ€ํ•ด์„œ๋Š” ๋‹น์‚ฌ์—์„œ ์ฑ…์ž„์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

KIS Open API ์ƒ˜ํ”Œ ์ฝ”๋“œ ์ €์žฅ์†Œ (LLM ์ง€์›)

1. ์ œ์ž‘ ์˜๋„ ๋ฐ ๋Œ€์ƒ

๐ŸŽฏ ์ œ์ž‘ ์˜๋„

์ด ์ €์žฅ์†Œ๋Š” ChatGPT, Claude ๋“ฑ LLM(Large Language Model) ๊ธฐ๋ฐ˜ ์ž๋™ํ™” ํ™˜๊ฒฝ๊ณผ Python ๊ฐœ๋ฐœ์ž ๋ชจ๋‘๊ฐ€ ํ•œ๊ตญํˆฌ์ž์ฆ๊ถŒ(Korea Investment & Securities) Open API๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ณ  ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ๋œ ์ƒ˜ํ”Œ ์ฝ”๋“œ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค.

  • examples_llm/: LLM์ด ๋‹จ์ผ API ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ํƒ์ƒ‰ํ•˜๊ณ  ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ๋œ ๊ธฐ๋Šฅ ๋‹จ์œ„ ์ƒ˜ํ”Œ ์ฝ”๋“œ
  • examples_user/: ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ ํˆฌ์ž ๋ฐ ์ž๋™๋งค๋งค ๊ตฌํ˜„์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ƒํ’ˆ๋ณ„๋กœ ํ†ตํ•ฉ๋œ API ํ˜ธ์ถœ ์˜ˆ์ œ ์ฝ”๋“œ
  • strategy_builder/: ๋น„์ฃผ์–ผ UI๋กœ ๋งค๋งค ์ „๋žต์„ ์„ค๊ณ„ํ•˜๊ณ , ์ƒ์„ฑ๋œ ์‹œ๊ทธ๋„ ๋ฐ”ํƒ•์œผ๋กœ ๋งค์ˆ˜/๋งค๋„ ๊ฐ€๋Šฅ
  • backtester/: ์„ค๊ณ„ํ•œ ์ „๋žต์„ ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ๋กœ ๊ฒ€์ฆํ•˜๋Š” ๋ฐฑํ…Œ์ŠคํŒ… ์—”์ง„

AI์™€ ์‚ฌ๋žŒ์ด ๋ชจ๋‘ ํ™œ์šฉํ•˜๊ธฐ ์‰ฌ์šด ๊ตฌ์กฐ๋ฅผ ์ง€ํ–ฅํ•ฉ๋‹ˆ๋‹ค.

ํ•œ๊ตญํˆฌ์ž์ฆ๊ถŒ Open API ํฌํ„ธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ‘ค ๋Œ€์ƒ ์‚ฌ์šฉ์ž

  • ํ•œ๊ตญํˆฌ์ž์ฆ๊ถŒ Open API๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๋Š” Python ๊ฐœ๋ฐœ์ž
  • ๊ธฐ์กด Open API ์‚ฌ์šฉ์ž ์ค‘ ์ฝ”๋“œ ๊ฐœ์„  ๋ฐ ๊ตฌ์กฐ ํ•™์Šต์ด ํ•„์š”ํ•œ ์‚ฌ์šฉ์ž
  • LLM ๊ธฐ๋ฐ˜ ์ฝ”๋“œ ์—์ด์ „ํŠธ๋ฅผ ํ™œ์šฉํ•ด ์ข…๋ชฉ ๊ฒ€์ƒ‰, ์‹œ์„ธ ๋ถ„์„, ์ž๋™๋งค๋งค ๋“ฑ์„ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•˜๋Š” ์‚ฌ์šฉ์ž

2. ํด๋” ๊ตฌ์กฐ ๋ฐ ์ฃผ์š” ํŒŒ์ผ ์„ค๋ช…

2.1. ํด๋” ๊ตฌ์กฐ

# ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ
.
โ”œโ”€โ”€ README.md                    # ํ”„๋กœ์ ํŠธ ์„ค๋ช…์„œ
โ”œโ”€โ”€ strategy_builder/            # ์ „๋žต ์„ค๊ณ„ + ์‹œ๊ทธ๋„ ์ƒ์„ฑ ์—”์ง„           โ† New
โ”œโ”€โ”€ backtester/                  # ๋ฐฑํ…Œ์ŠคํŒ… ์—”์ง„ (QuantConnect Lean)   โ† New
โ”‚
โ”œโ”€โ”€ docs/
โ”‚   โ””โ”€โ”€ convention.md            # ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜ ๊ฐ€์ด๋“œ
โ”œโ”€โ”€ examples_llm/                  # LLM์šฉ ์ƒ˜ํ”Œ ์ฝ”๋“œ
โ”‚   โ”œโ”€โ”€ kis_auth.py              # ์ธ์ฆ ๊ณตํ†ต ํ•จ์ˆ˜
โ”‚   โ”œโ”€โ”€ auth                     # ์ธ์ฆ(ํ† ํฐ ๋ฐœ๊ธ‰)
โ”‚   โ”‚   โ”œโ”€โ”€ auth_token               # REST ์ ‘๊ทผํ† ํฐ ๋ฐœ๊ธ‰
โ”‚   โ”‚   โ””โ”€โ”€ auth_ws_token            # ์›น์†Œ์ผ“ ์ ‘์†ํ‚ค ๋ฐœ๊ธ‰
โ”‚   โ”œโ”€โ”€ domestic_bond            # ๊ตญ๋‚ด์ฑ„๊ถŒ
โ”‚   โ”‚   โ””โ”€โ”€ inquire_price        # API ๋‹จ์ผ ๊ธฐ๋Šฅ๋ณ„ ํด๋”
โ”‚   โ”‚       โ”œโ”€โ”€ inquire_price.py         # ํ•œ์ค„ ํ˜ธ์ถœ ํŒŒ์ผ (์˜ˆ: ์ฑ„๊ถŒ ๊ฐ€๊ฒฉ ์กฐํšŒ)
โ”‚   โ”‚       โ””โ”€โ”€ chk_inquire_price.py     # ํ…Œ์ŠคํŠธ ํŒŒ์ผ (์˜ˆ: ์ฑ„๊ถŒ ๊ฐ€๊ฒฉ ์กฐํšŒ ๊ฒฐ๊ณผ ๊ฒ€์ฆ)
โ”‚   โ”œโ”€โ”€ domestic_futureoption    # ๊ตญ๋‚ด์„ ๋ฌผ์˜ต์…˜
โ”‚   โ”œโ”€โ”€ domestic_stock           # ๊ตญ๋‚ด์ฃผ์‹
โ”‚   โ”œโ”€โ”€ elw                      # ELW
โ”‚   โ”œโ”€โ”€ etfetn                   # ETF/ETN
โ”‚   โ”œโ”€โ”€ overseas_futureoption    # ํ•ด์™ธ์„ ๋ฌผ์˜ต์…˜
โ”‚   โ””โ”€โ”€ overseas_stock           # ํ•ด์™ธ์ฃผ์‹
โ”œโ”€โ”€ examples_user/                 # user์šฉ ์‹ค์ œ ์‚ฌ์šฉ ์˜ˆ์ œ
โ”‚   โ”œโ”€โ”€ kis_auth.py              # ์ธ์ฆ ๊ณตํ†ต ํ•จ์ˆ˜
โ”‚   โ”œโ”€โ”€ auth                     # ์ธ์ฆ(ํ† ํฐ ๋ฐœ๊ธ‰)
โ”‚   โ”‚   โ”œโ”€โ”€ auth_functions.py            # ์ธ์ฆ ํ•จ์ˆ˜ ๋ชจ์Œ
โ”‚   โ”‚   โ””โ”€โ”€ auth_examples.py             # ์ธ์ฆ ์‹คํ–‰ ์˜ˆ์ œ
โ”‚   โ”œโ”€โ”€ domestic_bond            # ๊ตญ๋‚ด์ฑ„๊ถŒ
โ”‚   โ”‚   โ”œโ”€โ”€ domestic_bond_functions.py        # (REST) ํ†ตํ•ฉ ํ•จ์ˆ˜ ํŒŒ์ผ (๋ชจ๋“  API ํ•จ์ˆ˜ ๋ชจ์Œ)
โ”‚   โ”‚   โ”œโ”€โ”€ domestic_bond_examples.py         # (REST) ์‹คํ–‰ ์˜ˆ์ œ ํŒŒ์ผ (ํ•จ์ˆ˜ ์‚ฌ์šฉ๋ฒ•)
โ”‚   โ”‚   โ”œโ”€โ”€ domestic_bond_functions_ws.py     # (Websocket) ํ†ตํ•ฉ ํ•จ์ˆ˜ ํŒŒ์ผ
โ”‚   โ”‚   โ””โ”€โ”€ domestic_bond_examples_ws.py      # (Websocket) ์‹คํ–‰ ์˜ˆ์ œ ํŒŒ์ผ
โ”‚   โ”œโ”€โ”€ domestic_futureoption    # ๊ตญ๋‚ด์„ ๋ฌผ์˜ต์…˜
โ”‚   โ”œโ”€โ”€ domestic_stock           # ๊ตญ๋‚ด์ฃผ์‹
โ”‚   โ”œโ”€โ”€ elw                      # ELW
โ”‚   โ”œโ”€โ”€ etfetn                   # ETF/ETN
โ”‚   โ”œโ”€โ”€ overseas_futureoption    # ํ•ด์™ธ์„ ๋ฌผ์˜ต์…˜
โ”‚   โ””โ”€โ”€ overseas_stock           # ํ•ด์™ธ์ฃผ์‹
โ”œโ”€โ”€ legacy/                      # ๊ตฌ ์ƒ˜ํ”Œ์ฝ”๋“œ ๋ณด๊ด€
โ”œโ”€โ”€ stocks_info/                 # ์ข…๋ชฉ์ •๋ณดํŒŒ์ผ ์ฐธ๊ณ  ๋ฐ์ดํ„ฐ
โ”œโ”€โ”€ kis_devlp.yaml               # API ์„ค์ • ํŒŒ์ผ (๊ฐœ์ธ์ •๋ณด ์ž…๋ ฅ ํ•„์š”)
โ”œโ”€โ”€ pyproject.toml               # (uv)ํ”„๋กœ์ ํŠธ ์˜์กด์„ฑ ๊ด€๋ฆฌ
โ””โ”€โ”€ uv.lock                      # (uv)์˜์กด์„ฑ ๋ฝ ํŒŒ์ผ

2.2. ์ง€์›๋˜๋Š” ์ฃผ์š” API ์นดํ…Œ๊ณ ๋ฆฌ

  • ์•„๋ž˜ ์นดํ…Œ๊ณ ๋ฆฌ ๋ฐ ํด๋” ๊ตฌ์กฐ๋Š” examples_llm/, examples_user/ ํด๋” ๋ชจ๋‘ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
์นดํ…Œ๊ณ ๋ฆฌ ์„ค๋ช… ํด๋”๋ช…
์ธ์ฆ ์ ‘๊ทผํ† ํฐ ๋ฐœ๊ธ‰, ์›น์†Œ์ผ“ ์ ‘์†ํ‚ค ๋ฐœ๊ธ‰ auth
๊ตญ๋‚ด์ฃผ์‹ ๊ตญ๋‚ด ์ฃผ์‹ ์‹œ์„ธ, ์ฃผ๋ฌธ, ์ž”๊ณ  ๋“ฑ domestic_stock
๊ตญ๋‚ด์ฑ„๊ถŒ ๊ตญ๋‚ด ์ฑ„๊ถŒ ์‹œ์„ธ, ์ฃผ๋ฌธ ๋“ฑ domestic_bond
๊ตญ๋‚ด์„ ๋ฌผ์˜ต์…˜ ๊ตญ๋‚ด ํŒŒ์ƒ์ƒํ’ˆ ๊ด€๋ จ domestic_futureoption
ํ•ด์™ธ์ฃผ์‹ ํ•ด์™ธ ์ฃผ์‹ ์‹œ์„ธ, ์ฃผ๋ฌธ ๋“ฑ overseas_stock
ํ•ด์™ธ์„ ๋ฌผ์˜ต์…˜ ํ•ด์™ธ ํŒŒ์ƒ์ƒํ’ˆ ๊ด€๋ จ overseas_futureoption
ELW ELW ์‹œ์„ธ API elw
ETF/ETN ETF, ETN ์‹œ์„ธ API etfetn

2.3. ์ฃผ์š” ํŒŒ์ผ ์„ค๋ช…

examples_llm/ - llm์šฉ ๊ธฐ๋Šฅ ๋‹จ์œ„ ์ƒ˜ํ”Œ ์ฝ”๋“œ

API๋ณ„ ๊ฐœ๋ณ„ ํด๋” ๊ตฌ์กฐ: ๋‹จ์ผ API ๊ธฐ๋Šฅ์„ ๋…๋ฆฝ ํด๋”๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ, LLM์ด ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ

  • ํ•œ์ค„ ํ˜ธ์ถœ ํŒŒ์ผ: [ํ•จ์ˆ˜๋ช…].py โ€“ ๋‹จ์ผ ๊ธฐ๋Šฅ์„ ํ˜ธ์ถœํ•˜๋Š” ์ตœ์†Œ ๋‹จ์œ„ ์ฝ”๋“œ (์˜ˆ: inquire_price.py)
  • ํ…Œ์ŠคํŠธ ํŒŒ์ผ: chk_[ํ•จ์ˆ˜๋ช…].py โ€“ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์ฝ”๋“œ (์˜ˆ: chk_inquire_price.py)

examples_user/ - ์‚ฌ์šฉ์ž์šฉ ํ†ตํ•ฉ ์˜ˆ์ œ ์ฝ”๋“œ

์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ๊ฐœ๋ณ„ ํด๋” ๊ตฌ์กฐ: ์นดํ…Œ๊ณ ๋ฆฌ(์ƒํ’ˆ)๋ณ„๋กœ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ํ†ตํ•ฉํ•˜์—ฌ, ์‚ฌ์šฉ์ž๊ฐ€ ์‰ฝ๊ฒŒ ์ƒ˜ํ”Œ ์ฝ”๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ

  • ํ†ตํ•ฉ ํ•จ์ˆ˜ ํŒŒ์ผ: [์นดํ…Œ๊ณ ๋ฆฌ]_functions.py - ํ•ด๋‹น ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋ชจ๋“  API ๊ธฐ๋Šฅ์ด ํ†ตํ•ฉ๋œ ํ•จ์ˆ˜ ๋ชจ์Œ
  • ์‹คํ–‰ ์˜ˆ์ œ ํŒŒ์ผ: [์นดํ…Œ๊ณ ๋ฆฌ]_examples.py - ์‹ค์ œ ์‚ฌ์šฉ ์˜ˆ์ œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์‹คํ–‰ ์ฝ”๋“œ
  • ์›น์†Œ์ผ“ ํ†ตํ•ฉ ํ•จ์ˆ˜ ํŒŒ์ผ ๋ฐ ์‹คํ–‰ ์˜ˆ์ œ ํŒŒ์ผ: [์นดํ…Œ๊ณ ๋ฆฌ]_functions_ws.py, [์นดํ…Œ๊ณ ๋ฆฌ]_examples_ws.py

kis_auth.py - ์ธ์ฆ ๋ฐ ๊ณตํ†ต ๊ธฐ๋Šฅ

  • ์ ‘๊ทผํ† ํฐ ๋ฐœ๊ธ‰ ๋ฐ ๊ด€๋ฆฌ
  • API ํ˜ธ์ถœ ๊ณตํ†ต ํ•จ์ˆ˜
  • ์‹ค์ „ํˆฌ์ž/๋ชจ์˜ํˆฌ์ž ํ™˜๊ฒฝ ์ „ํ™˜ ์ง€์›
  • ์›น์†Œ์ผ“ ์—ฐ๊ฒฐ ์„ค์ • ๊ธฐ๋Šฅ ์ œ๊ณต

2.4. AI ํŠธ๋ ˆ์ด๋”ฉ ๋„๊ตฌ

์ƒ˜ํ”Œ ์ฝ”๋“œ ์™ธ์—, Open API๋ฅผ ํ™œ์šฉํ•œ ์ „๋žต ์„ค๊ณ„ โ†’ ๋ฐฑํ…Œ์ŠคํŒ… โ†’ ์ฃผ๋ฌธ ์‹คํ–‰ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

graph LR
    SB[strategy_builder] -->|".kis.yaml"| BT[backtester]
    BT -->|"๊ฒ€์ฆ ์™„๋ฃŒ"| SB
    SB -->|"BUY/SELL/HOLD"| KIS[KIS Open API]
Loading
๋””๋ ‰ํ† ๋ฆฌ ์—ญํ•  ์ƒ์„ธ
strategy_builder/ ์ „๋žต ์„ค๊ณ„ + ์‹œ๊ทธ๋„ ์ƒ์„ฑ 80๊ฐœ ๊ธฐ์ˆ ์ง€ํ‘œ, 10๊ฐœ ํ”„๋ฆฌ์…‹ ์ „๋žต, BUY/SELL/HOLD ์‹ ํ˜ธ (README)
backtester/ ๊ณผ๊ฑฐ ๊ฒ€์ฆ + ํŒŒ๋ผ๋ฏธํ„ฐ ์ตœ์ ํ™” Docker ๊ธฐ๋ฐ˜ QuantConnect Lean, HTML ๋ฆฌํฌํŠธ (README)
MCP/ AI ๋„๊ตฌ ์—ฐ๊ฒฐ KIS Code Assistant + Trading MCP (README)

10๊ฐœ ํ”„๋ฆฌ์…‹ ์ „๋žต

strategy_builder์™€ backtester ์–‘์ชฝ์—์„œ ๋™์ผํ•˜๊ฒŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

# ์ „๋žต๋ช… ์œ ํ˜• ํ•œ์ค„ ์„ค๋ช…
01 ๊ณจ๋“ ํฌ๋กœ์Šค ์ถ”์„ธ์ถ”์ข… ๋‹จ๊ธฐ ์ด๋™ํ‰๊ท ์ด ์žฅ๊ธฐ ์ด๋™ํ‰๊ท ์„ ์ƒํ–ฅ ๋ŒํŒŒํ•˜๋ฉด ๋งค์ˆ˜
02 ๋ชจ๋ฉ˜ํ…€ ์ถ”์„ธ์ถ”์ข… ์ตœ๊ทผ N์ผ ์ˆ˜์ต๋ฅ ์ด ๋†’์€ ์ข…๋ชฉ์„ ๋งค์ˆ˜
03 52์ฃผ ์‹ ๊ณ ๊ฐ€ ๋ŒํŒŒ๋งค๋งค ์ข…๊ฐ€๊ฐ€ 52์ฃผ ์ตœ๊ณ ๊ฐ€๋ฅผ ๊ฐฑ์‹ ํ•˜๋ฉด ๋งค์ˆ˜
04 ์—ฐ์† ์ƒ์Šน/ํ•˜๋ฝ ์ถ”์„ธ์ถ”์ข… N์ผ ์—ฐ์† ์ข…๊ฐ€ ์ƒ์Šน ์‹œ ๋งค์ˆ˜, N์ผ ์—ฐ์† ํ•˜๋ฝ ์‹œ ๋งค๋„
05 ์ด๊ฒฉ๋„ ์—ญ์ถ”์„ธ ์ข…๊ฐ€/์ด๋™ํ‰๊ท  ๋น„์œจ๋กœ ๊ณผ์—ด(๋งค๋„)ยท์นจ์ฒด(๋งค์ˆ˜) ํŒ๋‹จ
06 ๋ŒํŒŒ ์‹คํŒจ ์†์ ˆ ์ „๊ณ ์  ๋ŒํŒŒ ํ›„ ๋‹ค์‹œ ์•„๋ž˜๋กœ ๋น ์ง€๋ฉด ์†์ ˆ
07 ๊ฐ•ํ•œ ์ข…๊ฐ€ ๋ชจ๋ฉ˜ํ…€ ์ข…๊ฐ€๊ฐ€ ๋‹น์ผ ๊ณ ๊ฐ€ ๊ทผ์ฒ˜์—์„œ ๋งˆ๊ฐํ•˜๋ฉด ๋งค์ˆ˜
08 ๋ณ€๋™์„ฑ ํ™•์žฅ ๋ŒํŒŒ๋งค๋งค ๋ณ€๋™์„ฑ์ด ์ค„์–ด๋“  ๋’ค ๊ธ‰๋“ฑํ•˜๋ฉด ๋งค์ˆ˜
09 ํ‰๊ท ํšŒ๊ท€ ์—ญ์ถ”์„ธ ๊ฐ€๊ฒฉ์ด ํ‰๊ท ์—์„œ ํฌ๊ฒŒ ๋ฒ—์–ด๋‚˜๋ฉด ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ ๋งค๋งค
10 ์ถ”์„ธ ํ•„ํ„ฐ ์ถ”์„ธ์ถ”์ข… ์žฅ๊ธฐ ์ด๋™ํ‰๊ท  ์œ„์—์„œ ์ƒ์Šน ์ค‘์ด๋ฉด ๋งค์ˆ˜

.kis.yaml โ€” ๊ณต์œ  ์ „๋žต ํฌ๋งท

strategy_builder์—์„œ ์„ค๊ณ„ํ•œ ์ „๋žต์„ .kis.yaml๋กœ ๋‚ด๋ณด๋‚ด๋ฉด, backtester์—์„œ ๊ทธ๋Œ€๋กœ Importํ•˜์—ฌ ๋ฐฑํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํฌ๋งท ์ƒ์„ธ๋Š” strategy_builder/README.md ๋˜๋Š” backtester/README.md๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

3. ์‚ฌ์ „ ํ™˜๊ฒฝ์„ค์ • ์•ˆ๋‚ด

3.1. Python ํ™˜๊ฒฝ ์š”๊ตฌ์‚ฌํ•ญ

  • Python 3.11 ์ด์ƒ ํ•„์š”
  • uv ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ์‚ฌ์šฉ ๊ถŒ์žฅ (๋น ๋ฅด๊ณ  ๊ฐ„ํŽธํ•œ ์˜์กด์„ฑ ๊ด€๋ฆฌ)

3.2. uv ์„ค์น˜ ๋ฐฉ๋ฒ•

  • ๊ฐ„ํŽธ ์„ค์ •์„ ์œ„ํ•ด uv๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค
# Windows (PowerShell)
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"

# macOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh

# ์„ค์น˜ ํ™•์ธ
uv --version
# uv 0.x.x ... -> ์„ค์น˜ ์™„๋ฃŒ

3.3. ํ”„๋กœ์ ํŠธ ํด๋ก  ๋ฐ ํ™˜๊ฒฝ ์„ค์ •

# ์ €์žฅ์†Œ ํด๋ก 
git clone https://github.com/koreainvestment/open-trading-api
cd open-trading-api

# uv๋ฅผ ์‚ฌ์šฉํ•œ ์˜์กด์„ฑ ์„ค์น˜ - ํ•œ์ค„๋กœ ๋
uv sync

3.4. KIS Open API ์‹ ์ฒญ ๋ฐ ์„ค์ •

๐Ÿ€ ์„œ๋น„์Šค ์‹ ์ฒญ ์•ˆ๋‚ด ๋ฐ”๋กœ๊ฐ€๊ธฐ

  1. ํ•œ๊ตญํˆฌ์ž์ฆ๊ถŒ ๊ณ„์ขŒ ๊ฐœ์„ค ๋ฐ ID ์—ฐ๊ฒฐ
  2. ํ•œ๊ตญํˆฌ์ž์ฆ๊ถŒ ํ™ˆํŽ˜์ด์ง€ or ์•ฑ์—์„œ Open API ์„œ๋น„์Šค ์‹ ์ฒญ
  3. ์•ฑํ‚ค(App Key), ์•ฑ์‹œํฌ๋ฆฟ(App Secret) ๋ฐœ๊ธ‰
  4. ๋ชจ์˜ํˆฌ์ž ๋ฐ ์‹ค์ „ํˆฌ์ž ์•ฑํ‚ค ๊ฐ๊ฐ ์ค€๋น„

3.5. kis_devlp.yaml ์„ค์ •

  • ๋ณธ์ธ์˜ ๊ณ„์ • ์„ค์ •์„ ์œ„ํ•ด kis_devlp.yaml ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋Š” ~/KIS/config/kis_devlp.yaml์ž…๋‹ˆ๋‹ค. ํด๋”๊ฐ€ ์—†์œผ๋ฉด ์ƒ์„ฑํ•ด ์ฃผ์„ธ์š”.
  • ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์˜ kis_devlp.yaml์„ ~/KIS/config/๋กœ ๋ณต์‚ฌํ•œ ๋’ค ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด kis_auth.py์˜ config_root ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
# ์„ค์ • ํด๋” ์ƒ์„ฑ ๋ฐ ํŒŒ์ผ ๋ณต์‚ฌ
mkdir -p ~/KIS/config
cp kis_devlp.yaml ~/KIS/config/
  1. ~/KIS/config/kis_devlp.yaml ํŒŒ์ผ ์—ด๊ธฐ
  2. ์•ฑํ‚ค์™€ ์•ฑ์‹œํฌ๋ฆฟ ์ •๋ณด ์ž…๋ ฅ
  3. HTS ID ์ •๋ณด ์ž…๋ ฅ
  4. ๊ณ„์ขŒ๋ฒˆํ˜ธ ์ •๋ณด ์ž…๋ ฅ (์•ž 8์ž๋ฆฌ์™€ ๋’ค 2์ž๋ฆฌ ๊ตฌ๋ถ„)
  5. ์ €์žฅ ํ›„ ๋‹ซ๊ธฐ
# ์‹ค์ „ํˆฌ์ž
my_app: "์—ฌ๊ธฐ์— ์‹ค์ „ํˆฌ์ž ์•ฑํ‚ค ์ž…๋ ฅ"
my_sec: "์—ฌ๊ธฐ์— ์‹ค์ „ํˆฌ์ž ์•ฑ์‹œํฌ๋ฆฟ ์ž…๋ ฅ"

# ๋ชจ์˜ํˆฌ์ž
paper_app: "์—ฌ๊ธฐ์— ๋ชจ์˜ํˆฌ์ž ์•ฑํ‚ค ์ž…๋ ฅ"
paper_sec: "์—ฌ๊ธฐ์— ๋ชจ์˜ํˆฌ์ž ์•ฑ์‹œํฌ๋ฆฟ ์ž…๋ ฅ"

# HTS ID(KIS Developers ๊ณ ๊ฐ ID) - ์ฒด๊ฒฐํ†ต๋ณด, ๋‚˜์˜ ์กฐ๊ฑด ๋ชฉ๋ก ํ™•์ธ ๋“ฑ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
my_htsid: "์‚ฌ์šฉ์ž HTS ID"

# ๊ณ„์ขŒ๋ฒˆํ˜ธ ์•ž 8์ž๋ฆฌ
my_acct_stock: "์ฆ๊ถŒ๊ณ„์ขŒ 8์ž๋ฆฌ"
my_acct_future: "์„ ๋ฌผ์˜ต์…˜๊ณ„์ขŒ 8์ž๋ฆฌ"
my_paper_stock: "๋ชจ์˜ํˆฌ์ž ์ฆ๊ถŒ๊ณ„์ขŒ 8์ž๋ฆฌ"
my_paper_future: "๋ชจ์˜ํˆฌ์ž ์„ ๋ฌผ์˜ต์…˜๊ณ„์ขŒ 8์ž๋ฆฌ"

# ๊ณ„์ขŒ๋ฒˆํ˜ธ ๋’ค 2์ž๋ฆฌ
my_prod: "01" # ์ข…ํ•ฉ๊ณ„์ขŒ
# my_prod: "03" # ๊ตญ๋‚ด์„ ๋ฌผ์˜ต์…˜ ๊ณ„์ขŒ
# my_prod: "08" # ํ•ด์™ธ์„ ๋ฌผ์˜ต์…˜ ๊ณ„์ขŒ
# my_prod: "22" # ๊ฐœ์ธ์—ฐ๊ธˆ ๊ณ„์ขŒ
# my_prod: "29" # ํ‡ด์ง์—ฐ๊ธˆ ๊ณ„์ขŒ

# User-Agent(๊ธฐ๋ณธ๊ฐ’ ์‚ฌ์šฉ ๊ถŒ์žฅ, ๋ณ€๊ฒฝ ๋ถˆํ•„์š”)
my_agent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"

3.6. ์‹คํ–‰ํŒŒ์ผ ๋‚ด ์ธ์ฆ ์„ค์ • ๊ฒ€ํ† 

  • ์‹คํ–‰ํ•˜๋ ค๋Š” ํŒŒ์ผ์—์„œ ์ธ์ฆ ๊ด€๋ จ ์„ค์ •์„ ๊ฒ€ํ†  ํ˜น์€ ๋ณ€๊ฒฝํ•ด์ค๋‹ˆ๋‹ค. ๊ตญ๋‚ด์ฃผ์‹ ๊ธฐ๋Šฅ ์ „์ฒด๋ฅผ ์ด์šฉํ•˜์‹œ๋ ค๋ฉด, domestic_stock/domestic_stock_examples.py ํŒŒ์ผ์„ ํ™•์ธํ•ด์ฃผ์„ธ์š”. ka.auth() ํ•จ์ˆ˜์˜ svr, product ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•˜๋ฉด ์‹ค์ „ํ™˜๊ฒฝ(prod)์—์„œ ์œ„ํƒ๊ณ„์ขŒ(-01)๋กœ ๋งค๋งค ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
import kis_auth as ka

# ์‹ค์ „ํˆฌ์ž ์ธ์ฆ
ka.auth(svr="prod", product="01") # ๋ชจ์˜ํˆฌ์ž: svr="vps"

3.7. ์ „๋žต ๋นŒ๋” / ๋ฐฑํ…Œ์Šคํ„ฐ ํ™˜๊ฒฝ ์„ค์ • (์„ ํƒ)

์ „๋žต ์„ค๊ณ„ ๋ฐ ๋ฐฑํ…Œ์ŠคํŒ… ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ถ”๊ฐ€ ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ•ญ๋ชฉ ์„ค์น˜ ์šฉ๋„
Node.js 18+ nodejs.org strategy_builder, backtester ํ”„๋ก ํŠธ์—”๋“œ
Docker Desktop docker.com backtester (Lean ์—”์ง„)

4. ์ƒ˜ํ”Œ ์ฝ”๋“œ ์‹คํ–‰

4.1. ์ƒ˜ํ”Œ ์ฝ”๋“œ ์‹คํ–‰

  • examples_user ๊ธฐ์ค€
# ๊ตญ๋‚ด์ฃผ์‹ ์ƒ˜ํ”Œ ์ฝ”๋“œ ์‹คํ–‰ (examples_user/domestic_stock/)
uv run python domestic_stock_examples.py # REST ๋ฐฉ์‹
uv run python domestic_stock_examples_ws.py  # Websocket ๋ฐฉ์‹ 

domestic_stock_examples.py์—๋Š” ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ์‚ฌ์šฉํ•˜๋ ค๋Š” ํ•จ์ˆ˜๋งŒ ๋‚จ๊ธฐ๊ณ  ๋‚˜๋จธ์ง€๋Š” ์ฃผ์„ ์ฒ˜๋ฆฌํ•œ ํ›„, ์ž…๋ ฅ๊ฐ’์„ ์ˆ˜์ •ํ•˜์—ฌ ํ˜ธ์ถœํ•ด ์ฃผ์„ธ์š”.

  • examples_llm ๊ธฐ์ค€
# ๊ตญ๋‚ด์ฃผ์‹ > ์ฃผ์‹ํ˜„์žฌ๊ฐ€ ์‹œ์„ธ ์ƒ˜ํ”Œ ์ฝ”๋“œ ์‹คํ–‰ (examples_llm/domestic_stock/inquire_price/)
uv run python chk_inquire_price.py

examples_llm ์€ ๊ฐ ๊ธฐ๋Šฅ๋ณ„๋กœ ๊ฐœ๋ณ„ ์‹คํ–‰ ํŒŒ์ผ(chk_*.py)์ด ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์–ด, ํŠน์ • ๊ธฐ๋Šฅ๋งŒ ํ…Œ์ŠคํŠธํ•˜๊ณ ์ž ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

4.2. ์˜ˆ์ œ ์ฝ”๋“œ ์ƒ˜ํ”Œ (examples_user)

# REST API ํ˜ธ์ถœ ์˜ˆ์ œ - domestic_stock_examples.py
import sys
import logging
import pandas as pd
sys.path.extend(['..', '.'])

import kis_auth as ka
from domestic_stock_functions import *

# ๋กœ๊น… ์„ค์ •
logging.basicConfig(level=logging.INFO, format='%(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

# ์ธ์ฆ
ka.auth()
trenv = ka.getTREnv()

# ์‚ผ์„ฑ์ „์ž ํ˜„์žฌ๊ฐ€ ์‹œ์„ธ ์กฐํšŒ
result = inquire_price(env_dv="real", fid_cond_mrkt_div_code="J", fid_input_iscd="005930")
print(result)
# ์›น์†Œ์ผ“ ํ˜ธ์ถœ ์˜ˆ์ œ - domestic_stock_examples_ws.py
import sys
import logging
import pandas as pd
sys.path.extend(['..', '.'])

import kis_auth as ka
from domestic_stock_functions_ws import *

# ๋กœ๊น… ์„ค์ •
logging.basicConfig(level=logging.INFO, format='%(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

# ์ธ์ฆ
ka.auth()
ka.auth_ws()
trenv = ka.getTREnv()

# ์›น์†Œ์ผ“ ์„ ์–ธ
kws = ka.KISWebSocket(api_url="/tryitout")

# ์‚ผ์„ฑ์ „์ž, skํ•˜์ด๋‹‰์Šค ์‹ค์‹œ๊ฐ„ ํ˜ธ๊ฐ€ ๊ตฌ๋…
kws.subscribe(request=asking_price_krx, data=["005930", "000660"])

4.3. ์ „๋žต ๋นŒ๋” / ๋ฐฑํ…Œ์Šคํ„ฐ ์‹คํ–‰

# Strategy Builder (์ „๋žต ์„ค๊ณ„ + ์‹œ๊ทธ๋„)
cd strategy_builder
./start.sh

# Backtester (๋ฐฑํ…Œ์ŠคํŒ…)
cd backtester
./start.sh

์ƒ์„ธ ์‹คํ–‰ ๋ฐฉ๋ฒ•์€ ๊ฐ ๋””๋ ‰ํ† ๋ฆฌ์˜ README๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”:

5. ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ฐ€์ด๋“œ

ํ† ํฐ ์˜ค๋ฅ˜ ์‹œ

import kis_auth as ka

# ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ - 1๋ถ„๋‹น 1ํšŒ ๋ฐœ๊ธ‰๋ฉ๋‹ˆ๋‹ค.
ka.auth(svr="prod")  # ๋˜๋Š” "vps"

์„ค์ • ํŒŒ์ผ ์˜ค๋ฅ˜ ์‹œ

  • kis_devlp.yaml ํŒŒ์ผ์˜ ์•ฑํ‚ค, ์•ฑ์‹œํฌ๋ฆฟ์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธ
  • ๊ณ„์ขŒ๋ฒˆํ˜ธ ํ˜•์‹์ด ๋งž๋Š”์ง€ ํ™•์ธ (์•ž 8์ž๋ฆฌ + ๋’ค 2์ž๋ฆฌ)
  • ์‹ค์‹œ๊ฐ„ ์‹œ์„ธ(WebSocket) ์ด์šฉ ์ค‘ โ€˜No close frame receivedโ€™ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ, kis_devlp.yaml์— ์ž…๋ ฅํ•˜์‹  HTS ID๊ฐ€ ์ •ํ™•ํ•œ์ง€ ํ™•์ธ

์˜์กด์„ฑ ์˜ค๋ฅ˜ ์‹œ

# ์˜์กด์„ฑ ์žฌ์„ค์น˜
uv sync --reinstall

Docker ์˜ค๋ฅ˜ (backtester)

docker info              # Docker Desktop ์‹คํ–‰ ์ƒํƒœ ํ™•์ธ
docker images | grep lean # Lean ์ด๋ฏธ์ง€ ํ™•์ธ (์ฒซ ์‹คํ–‰ ์‹œ ์ž๋™ ๋‹ค์šด๋กœ๋“œ)

์ดˆ๋‹น ๊ฑฐ๋ž˜๊ฑด์ˆ˜ ์ดˆ๊ณผ (EGW00201)

๋ชจ์˜ํˆฌ์ž ๊ณ„์ขŒ๋Š” REST API ํ˜ธ์ถœ ์ œํ•œ์ด ๋‚ฎ์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ์กฐํšŒ์—๋Š” ๋ฌธ์ œ์—†์œผ๋‚˜, ํŒŒ๋ผ๋ฏธํ„ฐ ์ตœ์ ํ™”์ฒ˜๋Ÿผ ์—ฐ์† ํ˜ธ์ถœ์ด ๋งŽ์œผ๋ฉด ์‹ค์ „ํˆฌ์ž ๊ณ„์ขŒ๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“ง ๋ฌธ์˜์‚ฌํ•ญ