Skip to content

NanaDad/dartlab

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

6,183 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation


DartLab

DartLab

์ข…๋ชฉ์ฝ”๋“œ ํ•˜๋‚˜. ๊ธฐ์—…์˜ ์ „์ฒด ์ด์•ผ๊ธฐ.

Korean DART + US SEC EDGAR ๊ณต์‹œ๋ฅผ ํ•œ ์ค„์˜ Python ์œผ๋กœ ์ฝ๊ณ  ๋น„๊ตํ•œ๋‹ค.

PyPI Python License CI Docs Blog

๋ฌธ์„œ ยท Skill OS ยท Skill Market ยท ๋ธ”๋กœ๊ทธ ยท Colab์—์„œ ์—ด๊ธฐ ยท Molab์—์„œ ์—ด๊ธฐ ยท English ยท ํ›„์›

HuggingFace Data Desktop Download

DartLab โ€” ๊ณต์‹œ๋ฅผ ๋น„๊ต ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๋กœ

๊ณต์‹œ ๋ทฐ์–ด ๋ฐ”๋กœ๊ฐ€๊ธฐ ย ย  dartlab ๊ณต์‹ ํŽ˜์ด์ง€

ํ„ฐ๋ฏธ๋„ โ€” ๋ธ”๋ฃธ๋ฒ„๊ทธ์‹์— ๋„์ „ํ•˜๋‹ค

DartLab ํ„ฐ๋ฏธ๋„

์ข…๋ชฉ ํ•˜๋‚˜๋กœ ์žฌ๋ฌดยท์ฃผ๊ฐ€ยท๊ณต์‹œยท์‹ ์šฉยท์‚ฐ์—…ยท๋งคํฌ๋กœ๋ฅผ ํ•œ ํ™”๋ฉด์—์„œ ์ฝ๋Š” ๋ธ”๋ฃธ๋ฒ„๊ทธ์‹ ํ„ฐ๋ฏธ๋„์— ๋„์ „ํ•˜๋Š” DartLab ํ„ฐ๋ฏธ๋„. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋งŒ๋“  ๋น„๊ต ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ํ™”๋ฉด ์œ„์— ์˜ฌ๋ ธ๋‹ค.

์ด ํ„ฐ๋ฏธ๋„์€ @youngchangjo ๋‹˜์˜ ์Šค๋ ˆ๋“œ์—์„œ ๋ฐ›์€ ์˜๊ฐ์œผ๋กœ ์‹œ์ž‘๋์Šต๋‹ˆ๋‹ค.

DartLab ๋ฌด์—‡์„ ํ•ด์ฃผ๋Š”๊ฐ€

DartLab์€ DART์™€ EDGAR ๊ณต์‹œ๋ฅผ ์ข…๋ชฉ์ฝ”๋“œ ํ•˜๋‚˜๋กœ ๋น„๊ต ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๋กœ ๋ฐ”๊พธ๋Š” Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค. ์žฌ๋ฌด์ œํ‘œ, ์‚ฌ์—…๋ณด๊ณ ์„œ ๋ณธ๋ฌธ, ๊ณต์‹œ ๋ชฉ๋ก, ๋น„์œจ, ์‹ ์šฉ์œ„ํ—˜, ์‚ฐ์—… ๋งต, ๋งคํฌ๋กœ ๋งฅ๋ฝ์„ ๊ฐ™์€ Company ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ฝ๋Š”๋‹ค.

ํ•ต์‹ฌ์€ ๋‹จ์ˆœ ์ˆ˜์ง‘์ด ์•„๋‹ˆ๋‹ค. ํšŒ์‚ฌ๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ณ„์ •๋ช…๊ณผ ๊ณต์‹œ ๋ชฉ์ฐจ๋ฅผ topic ร— period, account ร— period ํ˜•ํƒœ๋กœ ์ˆ˜ํ‰ํ™”ํ•ด์„œ ์ž‘๋…„๊ณผ ์˜ฌํ•ด, ์‚ผ์„ฑ์ „์ž์™€ ์• ํ”Œ, ํ•œ ์ข…๋ชฉ๊ณผ ์ „์ฒด ์‹œ์žฅ์„ ๊ฐ™์€ ์งˆ๋ฌธ์œผ๋กœ ๋น„๊ตํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.

Before After
์‚ฌ์—…๋ณด๊ณ ์„œ ์—ฌ๋Ÿฌ ํ•ด๋ฅผ ์—ด๊ณ  ๋ชฉ์ฐจ๋ฅผ ๋งž์ถ˜๋‹ค c.panel()
XBRL ๊ณ„์ •๋ช…๊ณผ ํ•œ๊ธ€ ํ•ญ๋ชฉ๋ช…์„ ์ง์ ‘ ๋งคํ•‘ํ•œ๋‹ค c.panel("IS")
์ „ ์ข…๋ชฉ ์žฌ๋ฌด๋น„์œจ์„ ์ง์ ‘ ์ˆ˜์ง‘ยท์ •๊ทœํ™”ํ•œ๋‹ค dartlab.scan("profitability")
AI ๋‹ต๋ณ€์˜ ์ˆซ์ž๋ฅผ ๋‹ค์‹œ ๊ฒ€์‚ฐํ•œ๋‹ค dartlab.ask(...) + ์‹คํ–‰ ๊ทผ๊ฑฐ ref

์„ธ ๊ฐ€์ง€ ์‹œ์ž‘์ 

DartLab์€ AI / Python / CLI ์„ธ ๊ธธ์„ ๊ฐ™์€ ๋ฐ์ดํ„ฐยท๊ฐ™์€ ์—”์ง„ ์œ„์— ์˜ฌ๋ ค๋†“๋Š”๋‹ค. ์ž๊ธฐ ๋งฅ๋ฝ์— ๋งž๋Š” ๊ธธ๋กœ ์ง„์ž…ํ•˜๋ฉด ๋œ๋‹ค.

์‚ฌ์šฉ ๋ฐฉ์‹ ์ฝ”๋“œ ๊ธธ์ด ์ฒซ ๊ฒฐ๊ณผ ์ด๋Ÿฐ ์‚ฌ๋žŒ์—๊ฒŒ ๋งž๋‹ค
AI๋กœ ๋ฐ”๋กœ ์‚ฌ์šฉ 1 ์ค„ ~1 ๋ถ„ ์งˆ๋ฌธ์„ ๋˜์ง€๊ณ  ๊ทผ๊ฑฐ ์žˆ๋Š” ๋‹ต๋ณ€์„ ๋ฐ›๊ณ  ์‹ถ์€ ๋ถ„์„๊ฐ€
Python ์ฝ”๋“œ๋กœ ์‚ฌ์šฉ 3-5 ์ค„ ~3 ๋ถ„ ์žฌ๋ฌด์ œํ‘œยท๊ณต์‹œยท์Šค์บ” ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋‹ค๋ฃจ๋Š” ๊ฐœ๋ฐœ์ž
CLI ๋กœ ์‚ฌ์šฉ 1 ๋ช…๋ น ~2 ๋ถ„ ๋‹จ๋ฐœ ์กฐํšŒยท์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธยท์…ธ ํŒŒ์ดํ”„๋ผ์ธ ์‚ฌ์šฉ์ž

๊ฐ ๊ฒฝ๋กœ๋Š” ๋ชจ๋‘ dartlab.Company ์™€ ๊ฐ™์€ ๋ถ„์„ ์—”์ง„์„ ํ˜ธ์ถœํ•œ๋‹ค. ์ถœ๋ฐœ์ ๋งŒ ๋‹ค๋ฅผ ๋ฟ ๊ฒฐ๊ณผ๋Š” ๊ฐ™๋‹ค.

AI๋กœ ๋ฐ”๋กœ ์‚ฌ์šฉ

๊ธฐ์—… ์ด๋ฆ„์ด๋‚˜ ์ข…๋ชฉ์ฝ”๋“œ๋ฅผ ๋„ฃ๊ณ  ์ž์—ฐ์–ด๋กœ ๋ฌผ์–ด๋ณด๋ฉด, DartLab AI๋Š” ๋‚ด๋ถ€์—์„œ Company, analysis, credit, scan, macro ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์ง์ ‘ ์‹คํ–‰ํ•œ๋‹ค. ๋‹ต๋ณ€๋งŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์–ด๋–ค ๋ฐ์ดํ„ฐ์™€ ๊ณ„์‚ฐ์„ ์ผ๋Š”์ง€ ์ถ”์  ๊ฐ€๋Šฅํ•œ ref๋ฅผ ํ•จ๊ป˜ ๋‚จ๊ธด๋‹ค.

Windows Desktop Download Skill OS

import dartlab

dartlab.ask("์‚ผ์„ฑ์ „์ž ์žฌ๋ฌด๊ฑด์ „์„ฑ ๋ถ„์„ํ•ด์ค˜")
# AI๊ฐ€ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์กฐํšŒํ•˜๊ณ , ๊ณ„์‚ฐ ๊ฒฐ๊ณผ์™€ ๊ทผ๊ฑฐ ref๋ฅผ ํ•จ๊ป˜ ๋ฐ˜ํ™˜

AI ๊ฒฝ๋กœ์˜ ์žฅ์ :

  • ๋ถ„์„ ํ๋ฆ„์„ ์ง์ ‘ ์„ค๊ณ„ โ€” ์งˆ๋ฌธ์— ๋งž์ถฐ ๊ณต์‹œ, ์žฌ๋ฌด์ œํ‘œ, ์‹ ์šฉ, ๋งคํฌ๋กœ, peer ๋น„๊ต ๋„๊ตฌ๋ฅผ ์กฐํ•ฉํ•œ๋‹ค.
  • ์ˆซ์ž ๊ฒ€์‚ฐ ๊ฐ€๋Šฅ โ€” ๋‹ต๋ณ€ ์† ์ˆซ์ž์™€ ํ‘œ๋Š” ์‹คํ–‰ ๊ฒฐ๊ณผ ref์— ์—ฐ๊ฒฐ๋œ๋‹ค.
  • ๊ณต์‹œ ๋ณธ๋ฌธ์€ ๋ฐ์ดํ„ฐ๋กœ๋งŒ ์ฒ˜๋ฆฌ โ€” DART/EDGAR/์›น ๋ณธ๋ฌธ ์•ˆ์˜ ์ง€์‹œ๋Š” ๋”ฐ๋ฅด์ง€ ์•Š๊ณ  ๋ถ„์„ ๊ทผ๊ฑฐ๋กœ๋งŒ ์“ด๋‹ค.
  • ์™ธ๋ถ€ LLM ์—ฐ๋™ ๊ฐ€๋Šฅ โ€” MCP๋กœ Claude Code, Codex CLI, Cursor ๊ฐ™์€ ๋„๊ตฌ์—์„œ ๊ฐ™์€ ํ‘œ๋ฉด์„ ํ˜ธ์ถœํ•œ๋‹ค.
claude mcp add dartlab -- dartlab mcp
codex  mcp add dartlab -- dartlab mcp

Claude Desktop ยท ์›๊ฒฉ SSE ยท ์ ˆ๋Œ€ ๊ฒฝ๋กœ ์˜ต์…˜์€ MCP ์„น์…˜ ์ฐธ์กฐ.

Python ์ฝ”๋“œ๋กœ ์‚ฌ์šฉ

์ฝ”๋“œ ๊ฒฝ๋กœ๋Š” Company๊ฐ€ ์ค‘์‹ฌ์ด๋‹ค. ์ข…๋ชฉ์ฝ”๋“œ ํ•˜๋‚˜๋กœ ์žฌ๋ฌด์ œํ‘œ, ๊ณต์‹œ ๋ณธ๋ฌธ, ์ •ํ˜• ๋ณด๊ณ ์„œ, ๋น„์œจ์„ c.panel ๋‹จ์ผ ํ‘œ๋ฉด์—์„œ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ถœํ•œ๋‹ค. c.panel ์„ ์žก๋Š” ์ˆœ๊ฐ„ ํ•ญ๋ชฉร—๊ธฐ๊ฐ„ ๊ฒฉ์ž๊ฐ€ ๋œ๋‹ค.

uv add dartlab
import dartlab

c = dartlab.Company("005930")       # ์‚ผ์„ฑ์ „์ž

c.panel()                           # ์ „์ฒด ๊ณต์‹œ ์ˆ˜ํ‰ํ™” ๊ฒฉ์ž (ํ•ญ๋ชฉ ร— ๊ธฐ๊ฐ„)
c.panel("IS")                       # ์†์ต๊ณ„์‚ฐ์„œ (finance ์ •๊ทœํ™” ์ˆซ์ž)
c.panel("is")                       # native ์†์ต โ€” ์‚ฌ์—…๋ณด๊ณ ์„œ ํ•ญ๋ชฉ ๊ทธ๋Œ€๋กœ (XBRL+์˜› ํ†ตํ•ฉ 2013~)
c.panel("ratios")                   # native ์žฌ๋ฌด๋น„์œจ (5ํ‘œ ํ•ญ๋ชฉ์œผ๋กœ ๊ณ„์‚ฐ)
c.panel("์‚ฌ์—…")                      # ์‚ฌ์—… ๊ฐœ์š” ๋“ฑ ๊ณต์‹œ ๋ณธ๋ฌธ ํ–‰ ๊ฒ€์ƒ‰
c.filings()                         # ์›๋ฌธ ๊ณต์‹œ ๋งํฌ
# ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค, ๋‹ค๋ฅธ ์‹œ์žฅ
kr = dartlab.Company("005930")
us = dartlab.Company("AAPL")

kr.panel("IS")
us.panel("IS")

Python ๊ฒฝ๋กœ์˜ ์žฅ์ :

  • API ํ‚ค ์—†์ด ์‹œ์ž‘ โ€” ์‚ฌ์ „ ๊ตฌ์ถ• ๋ฐ์ดํ„ฐ๋Š” HuggingFace์—์„œ ์ž๋™ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ๋กœ์ปฌ์— ์บ์‹œํ•œ๋‹ค.
  • ๊ธฐ๊ฐ„ ๋น„๊ต๊ฐ€ ๊ธฐ๋ณธ โ€” ๊ณต์‹œ ๋ณธ๋ฌธ๊ณผ ์žฌ๋ฌด์ œํ‘œ๋ฅผ ๊ธฐ๊ฐ„ ์ถ•์œผ๋กœ ๋งž์ถ˜๋‹ค.
  • ํ•œ๊ตญ๊ณผ ๋ฏธ๊ตญ์„ ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์กฐํšŒ โ€” DART์™€ EDGAR์˜ ์ฐจ์ด๋Š” provider๊ฐ€ ํก์ˆ˜ํ•œ๋‹ค.
  • ์—”์ง„ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ โ€” analysis, credit, macro, quant, industry, story ๊ฒฐ๊ณผ๋ฅผ ์ฝ”๋“œ์—์„œ ์ง์ ‘ ๋‹ค๋ฃฌ๋‹ค.

CLI ๋กœ ์‚ฌ์šฉ

์„ค์น˜ ํ›„ ์…ธ์—์„œ dartlab ๋ช…๋ น์œผ๋กœ ๊ฐ™์€ ์—”์ง„์„ ํ˜ธ์ถœํ•œ๋‹ค. ๋‹จ๋ฐœ ์กฐํšŒยท์…ธ ์ž๋™ํ™”ยทํŒŒ์ดํ”„๋ผ์ธ ์นœํ™”์ .

uv add dartlab

dartlab help "์™ธ์ธ ๋งค์ˆ˜"            # ๋„์›€๋ง + ๋งค์นญ capability ํƒ์ƒ‰
dartlab list scan                    # scan ์นดํ…Œ๊ณ ๋ฆฌ recipe ์ธ๋ฑ์Šค
dartlab show 005930 IS               # ์†์ต๊ณ„์‚ฐ์„œ ์ถœ๋ ฅ (Python c.panel("IS") ๋“ฑ๊ฐ€)
dartlab analyze 005930 --aspect credit
dartlab mcp                          # MCP ์„œ๋ฒ„ ์ง„์ž… (์™ธ๋ถ€ LLM ๋„๊ตฌ ๋“ฑ๋ก์šฉ)

CLI ๊ฒฝ๋กœ์˜ ์žฅ์ :

  • API ํ‚ค ์—†์ด ๋‹จ๋ฐœ ํ˜ธ์ถœ โ€” HuggingFace ์บ์‹œ ์ž๋™ ์‚ฌ์šฉ
  • ์…ธ ํŒŒ์ดํ”„๋ผ์ธ ์นœํ™” โ€” dartlab show ... --json | jq ... ์‹์œผ๋กœ ํ•ฉ์„ฑ
  • MCP ์„œ๋ฒ„ ์ง„์ž…์  ๋™์ผ โ€” dartlab mcp ํ•œ ๋ช…๋ น์œผ๋กœ ์™ธ๋ถ€ ์–ด์‹œ์Šคํ„ดํŠธ ๋„๊ตฌ ๋…ธ์ถœ

CLI ๋ช…๋ น ์ „์ฒด ๋ชฉ๋ก + ์˜ต์…˜์€ dartlab --help ๋˜๋Š” Skill OS (src/dartlab/skills/specs/operation/code.md) ์ฐธ์กฐ.

๊ฒฐ๊ณผ ์˜ˆ์‹œ

์•„๋ž˜๋Š” Python ๊ฒฝ๋กœ์—์„œ ๋ฐ”๋กœ ์–ป๋Š” ๋Œ€ํ‘œ ๊ฒฐ๊ณผ๋‹ค. ๊ณต์‹œ ๋ณธ๋ฌธ, ์žฌ๋ฌด์ œํ‘œ, ์›๋ฌธ ๋งํฌ๊ฐ€ ๊ฐ™์€ Company ๊ฐ์ฒด์—์„œ ๋‚˜์˜จ๋‹ค.

import dartlab

c = dartlab.Company("005930")       # ์‚ผ์„ฑ์ „์ž

c.panel()                           # ๋ชจ๋“  ํ•ญ๋ชฉ, ๋ชจ๋“  ๊ธฐ๊ฐ„, ๋‚˜๋ž€ํžˆ โ€” ์žก๋Š” ์ˆœ๊ฐ„ ๊ฒฉ์ž
# shape: (223, 14) โ€” ๊ณต์‹œ ํ•ญ๋ชฉ ร— ๊ธฐ๊ฐ„
#                     2026Q1  2025Q4  2025Q3  2024Q4  ...
# (ํ‘œ์ง€)                  v       v       v       v
# ์‚ฌ์—…์˜ ๋‚ด์šฉ             v       v       v       v
# ์žฌ๋ฌด์ƒํƒœํ‘œ              v       v       v       v

ํ…์ŠคํŠธ์™€ ์ˆซ์ž์˜ ์‹œ๊ณ„์—ด ์ˆ˜ํ‰ํ™” โ€” ์ „ ๊ธฐ๊ฐ„ ๋น„๊ต ๊ฐ€๋Šฅ์„ฑ์˜ ํ•ต์‹ฌ

c.panel() ์ถœ๋ ฅ ์˜ˆ์‹œ โ€” ์‚ผ์„ฑ์ „์ž ๊ณต์‹œ ํ•ญ๋ชฉ ร— ๊ธฐ๊ฐ„ ์ „์ฒด ๊ฒฉ์ž
c.panel("IS")                       # ์†์ต๊ณ„์‚ฐ์„œ โ€” finance ์ •๊ทœํ™” (๋ถ„๊ธฐ ๊ธฐ๋ณธ)
c.panel("IS", freq="year")          # freq๋กœ ์—ฐ๊ฐ„ ํ•ฉ์‚ฐ

finance ์ •๊ทœํ™” โ€” XBRL ํ‘œ์ค€๊ณ„์ •(snakeId) + ํ•œ๊ธ€ ํ•ญ๋ชฉ๋ช…, ์› ๋‹จ์œ„ ์ •๋ฐ€ ์ˆซ์ž

c.panel('IS', freq='year') โ€” ์‚ผ์„ฑ์ „์ž ์—ฐ๊ฐ„ ์†์ต๊ณ„์‚ฐ์„œ (finance ์ •๊ทœํ™”)
c.panel("is", freq="year")          # native ์†์ต โ€” ์‚ฌ์—…๋ณด๊ณ ์„œ ํ•ญ๋ชฉ ๊ทธ๋Œ€๋กœ (2013~)
c.panel("ratios")                   # native ์žฌ๋ฌด๋น„์œจ, 5ํ‘œ ํ•ญ๋ชฉ์œผ๋กœ ๊ณ„์‚ฐ

์†Œ๋ฌธ์ž=native โ€” ์‚ฌ์—…๋ณด๊ณ ์„œ ํ•ญ๋ชฉ ๊ทธ๋Œ€๋กœ, XBRL ์ด์ „๊นŒ์ง€ ๋‹ฟ๋Š” ๊นŠ์€ history (2013~)

c.panel('is', freq='year') โ€” ์‚ผ์„ฑ์ „์ž ์—ฐ๊ฐ„ ์†์ต๊ณ„์‚ฐ์„œ (native, ์‚ฌ์—…๋ณด๊ณ ์„œ ํ•ญ๋ชฉ ๊ทธ๋Œ€๋กœ)
c.panel("์‚ฌ์—…")                      # ์‚ฌ์—… ๊ฐœ์š” ๋“ฑ ๊ณต์‹œ ๋ณธ๋ฌธ ํ–‰ ๊ฒ€์ƒ‰
c.panel.search("์žฌ๊ณ ")               # ๋ณธ๋ฌธ ์ „์ฒด ๊ฒ€์ƒ‰

c.filings()                         # ๋ชจ๋“  ๋ณด๊ณ ์„œ โ€” DART ๋ทฐ์–ด๋กœ ๋ฐ”๋กœ ์—ฐ๊ฒฐ

์‚ฌ์—…๋ณด๊ณ ์„œ๋ถ€ํ„ฐ ๋ถ„๊ธฐ๋ณด๊ณ ์„œ๊นŒ์ง€, dartUrl๋กœ ์›๋ฌธ ์ฆ‰์‹œ ํ™•์ธ

c.filings() โ€” ์‚ผ์„ฑ์ „์ž ๋ณด๊ณ ์„œ ๋ชฉ๋ก + DART ๋ทฐ์–ด ๋งํฌ
# ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค, ๋‹ค๋ฅธ ๋‚˜๋ผ
us = dartlab.Company("AAPL")
us.panel("business")
us.panel("ratios")

# ์ž์—ฐ์–ด๋กœ ์งˆ๋ฌธ
dartlab.ask("์‚ผ์„ฑ์ „์ž ์žฌ๋ฌด๊ฑด์ „์„ฑ ๋ถ„์„ํ•ด์ค˜")
# โ†’ AI๊ฐ€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ ๋ถ„์„: "์˜์—…์ด์ต๋ฅ ์ด 8.6%โ†’21.4%๋กœ ๋ฐ˜๋“ฑ..."

API ํ‚ค ๋ถˆํ•„์š”. HuggingFace์—์„œ ์ž๋™ ๋‹ค์šด๋กœ๋“œ, ๋กœ์ปฌ ์บ์‹œ๋กœ ์ฆ‰์‹œ ๋กœ๋“œ.

์„ธ ๊ฒน์˜ ๋ถ„์„

Company๊ฐ€ ์ข…๋ชฉ์ฝ”๋“œ ํ•˜๋‚˜๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ค€๋น„ํ•˜๋ฉด, ์„ธ ๊ฒน์ด ๋ถ„์„ํ•œ๋‹ค.

  1. ๋ถ„์„ ์—”์ง„ โ€” ์ˆซ์ž๋ฅผ ๋งŒ๋“ ๋‹ค. ๋งˆ์ง„ ์ถ”์ด, ํ˜„๊ธˆํ๋ฆ„ ํŒจํ„ด, ๋ถ€๋„ ํ™•๋ฅ , ์—…์ข… ๋น„๊ต, ๋งคํฌ๋กœ ์‚ฌ์ดํด. ํ•ด์„ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ˆซ์ž์™€ ๊ทผ๊ฑฐ๋งŒ ์ œ๊ณตํ•œ๋‹ค.
  2. story (L3 ์กฐํ•ฉ๊ธฐ) โ€” ๋ถ„์„์—”์ง„ X. L2 5 ๋ถ„์„์—”์ง„ ๋ผ๋ฆฌ์˜ import ์ˆœํ™˜์„ ๋ง‰๊ธฐ ์œ„ํ•ด, story ๊ฐ€ ๋‹จ๋…์œผ๋กœ ๋‹ค์ค‘ ๊ฒฐํ•ฉ ์ฑ…์ž„์„ ์งŠ์–ด์ง„๋‹ค. ์—”์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ธ”๋ก ๋‹จ์œ„๋กœ ์กฐํ•ฉํ•˜์—ฌ 11๊ฐ€์ง€ ๋ณด๊ณ ์„œ ํƒ€์ž… ร— 7๊ฐ€์ง€ ๊ธฐ์—…์œ ํ˜• ํ…œํ”Œ๋ฆฟ. ํ•ด์„์€ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค โ€” ๋‹ค์–‘ํ•œ ๊ด€์ ์˜ ๊ทผ๊ฑฐ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๋ฐฐ์น˜ํ•œ๋‹ค.
  3. AI โ€” ์—”์ง„์„ ์ง์ ‘ ์“ฐ๊ณ  ํŒ๋‹จํ•œ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ ์˜์‹ฌํ•˜๊ณ , ์›๋ณธ์œผ๋กœ ๊ฒ€์ฆํ•˜๊ณ , ์ด์ƒํ•˜๋ฉด ๊ฐ€์ •์„ ๋ฐ”๊ฟ”์„œ ์žฌ๊ณ„์‚ฐํ•œ๋‹ค. dartlab์„ ๋Œ€ํ‘œํ•˜๋Š” ์ ๊ทน์  ๋ถ„์„๊ฐ€.

DartLab์€ ๋ฌด์—‡์ธ๊ฐ€

ํ•˜๋‚˜์˜ ํ˜ธ์ถœ ๊ณ„์•ฝ. dartlab.์—”์ง„() ์œผ๋กœ ๊ฐ€์ด๋“œ ๋ณด๊ณ  dartlab.์—”์ง„("์ถ•") ์œผ๋กœ ์‹คํ–‰.

์ฒ˜์Œ์ด๋ผ๋ฉด? Company โ†’ Story โ†’ Ask ์ˆœ์„œ๋กœ. ์ข…๋ชฉ์ฝ”๋“œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ณ , ๋ณด๊ณ ์„œ๋ฅผ ๋งŒ๋“ค๊ณ , AI์—๊ฒŒ ๋ฌผ์–ด๋ณธ๋‹ค.

์—”์ง„ ์ด๋ฆ„์„ ํด๋ฆญํ•˜๋ฉด ์‚ฌ์šฉ๋ฒ• 4 ์„น์…˜ (๊ณต๊ฐœ ํ˜ธ์ถœ ๋ฐฉ์‹ ยท ํ˜ธ์ถœ ๋™์ž‘ ยท ๋Œ€ํ‘œ ๋ฐ˜ํ™˜ ํ˜•ํƒœ ยท ๊ธฐ๋ณธ ๊ฒ€์ฆ) ์œผ๋กœ ์ง„์ž…ํ•œ๋‹ค. ๋ชจ๋“  ์—”์ง„์ด ๊ฐ™์€ 4 ์„น์…˜์„ ๊ฐ–๋Š”๋‹ค.

๋ ˆ์ด์–ด ์—”์ง„ ํ•˜๋Š” ์ผ ์ง„์ž…์  ๋…ธํŠธ๋ถ
Data Data HuggingFace ์‚ฌ์ „ ๊ตฌ์ถ•, ์ž๋™ ๋‹ค์šด๋กœ๋“œ Company("005930") โ€”
L1 Company provider facade โ€” ๊ณต์‹œ + ์žฌ๋ฌด์ œํ‘œ + ์ •ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์ข…๋ชฉ์ฝ”๋“œ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉ c.panel() Colab ยท marimo
L1 Gather ์™ธ๋ถ€ ์‹œ์žฅ ๋ฐ์ดํ„ฐ (์ฃผ๊ฐ€/์ˆ˜๊ธ‰/๋งคํฌ๋กœ/๋‰ด์Šค) dartlab.gather() Colab ยท marimo
L1.5 Scan ์ „ ์ข…๋ชฉ ์‚ฌ์ „ ๋นŒ๋“œ (๊ฑฐ๋ฒ„๋„Œ์Šค/๋น„์œจ/ํ˜„๊ธˆํ๋ฆ„ ๋“ฑ parquet) dartlab.scan() Colab ยท marimo
L2 Analysis ์žฌ๋ฌด ์‹ฌ์ธต ๋ถ„์„ (์ˆ˜์ต์„ฑ/์•ˆ์ •์„ฑ/ํ˜„๊ธˆํ๋ฆ„) + ๊ฐ€์น˜ํ‰๊ฐ€ + ์ „๋ง c.analysis("financial", "์ˆ˜์ต์„ฑ") Colab ยท marimo
L2 Quant ๊ฐ€๊ฒฉ ๊ธฐ๋ฐ˜ ์ •๋Ÿ‰ ์‹ ํ˜ธ (๊ธฐ์ˆ /๋ฆฌ์Šคํฌ/ํŒฉํ„ฐ/๋ฐฑํ…Œ์ŠคํŠธ) c.quant() Colab ยท marimo
L2 Credit ๋…๋ฆฝ ์‹ ์šฉํ‰๊ฐ€ (dCR ๋“ฑ๊ธ‰, ๋ถ€๋„ํ™•๋ฅ , ๊ฑด์ „๋„) c.credit("๋“ฑ๊ธ‰") Colab ยท marimo
L2 Macro ์‹œ์žฅ ๋ ˆ๋ฒจ ๋งคํฌ๋กœ (์‚ฌ์ดํด/๊ธˆ๋ฆฌ/์œ ๋™์„ฑ/์‹ฌ๋ฆฌ/์ž์‚ฐ + ์‹œ๋‚˜๋ฆฌ์˜ค 110) dartlab.macro("์‚ฌ์ดํด") Colab ยท marimo
L2 Industry ์‚ฐ์—… ๋งคํผ โ€” ์ „ ์ƒ์žฅ์‚ฌ ร— ๊ณต์ •ยท์—ญํ• ยท์ŠคํŠธ๋ฆผ + ๊ณต๊ธ‰๋ง ์—ฃ์ง€ (์‚ฐ์—…์ง€๋„ /map) c.industry(), dartlab.industry("semiconductor") โ€”
L3 Story ์กฐํ•ฉ๊ธฐ (๋ถ„์„์—”์ง„ X) โ€” L2 5์—”์ง„ (analysis ยท credit ยท macro ยท quant ยท industry) + L1.5 scan ๋ธ”๋ก ์กฐํ•ฉ. ์ˆœํ™˜์ฐธ์กฐ ๋ฐฉ์ง€ ์ฑ…์ž„์ž. 11 ํƒ€์ž… ร— 7 ํ…œํ”Œ๋ฆฟ (ํ•ด์„ ์•ˆ ํ•จ) c.story("์ˆ˜์ต์„ฑ") Colab ยท marimo
L4 AI/Skills skills ๊ฒ€์ƒ‰ + DartLab ์‹คํ–‰ + ref ๊ฒ€์‚ฐ์„ ์“ฐ๋Š” ๋ถ„์„ ์ž‘์—…๋Œ€ (์‚ฌ๋žŒ๋„ L4) dartlab.ask() Colab ยท marimo
L4 Channel ์™ธ๋ถ€ ๊ณต์œ  โ€” dartlab channel ํ•œ ์ค„๋กœ ํฐ์—์„œ PC dartlab ์‚ฌ์šฉ dartlab channel โ€”
core Search ๊ณต์‹œ ์‹œ๋งจํ‹ฑ ๊ฒ€์ƒ‰ (beta โ€” ์ธ๋ฑ์Šค ์‹ ์„ ๋„ ๋ถ€์กฑ) dartlab.search() Colab ยท marimo
facade Listing ์ข…๋ชฉ/๊ณต์‹œ/topic ์นดํƒˆ๋กœ๊ทธ API dartlab.listing() Colab ยท marimo
viz Viz ์ฐจํŠธ/๋‹ค์ด์–ด๊ทธ๋žจ (emit_chart) emit_chart({...}) โ€”

๋ชจ๋“  ๋…ธํŠธ๋ถ: marimo ยท colab ยท Open in marimo

Company

์„ค๊ณ„: engines.company

์„ธ ๊ฐ€์ง€ ๋ฐ์ดํ„ฐ ์†Œ์Šค โ€” docs(์ „๋ฌธ ๊ณต์‹œ), finance(XBRL ์žฌ๋ฌด์ œํ‘œ), report(DART API ์ •ํ˜• ๋ฐ์ดํ„ฐ) โ€” ๋ฅผ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ํ†ตํ•ฉ. HuggingFace์—์„œ ์ž๋™ ๋‹ค์šด๋กœ๋“œ, ์„ค์ • ๋ถˆํ•„์š”.

c = dartlab.Company("005930")

c.panel()                       # ์žก๋Š” ์ˆœ๊ฐ„ ๊ฒฉ์ž -- ๊ณต์‹œ ํ•ญ๋ชฉ ร— ๊ธฐ๊ฐ„ ์ „์ฒด
c.panel("BS")                   # ์žฌ๋ฌด์ƒํƒœํ‘œ -- finance ์ •๊ทœํ™” ์ˆซ์ž
c.panel("bs")                   # native ์žฌ๋ฌด์ƒํƒœํ‘œ -- ์‚ฌ์—…๋ณด๊ณ ์„œ ํ•ญ๋ชฉ ๊ทธ๋Œ€๋กœ (2013~)
c.panel("ratios")               # native ์žฌ๋ฌด๋น„์œจ -- 5ํ‘œ ํ•ญ๋ชฉ์œผ๋กœ ๊ณ„์‚ฐ
c.panel("๋งค์ถœ")                  # ํ•ญ๋ชฉ๋ช… ํ–‰ ๊ฒ€์ƒ‰ (raw ๊ณต์‹œ)

์ฃผ์„(Notes) โ€” BS/IS ์ด์•ก ์ด๋ฉด์˜ ํ•ญ๋ชฉ๋ณ„ ๋ถ„ํ•ด. c.panel("topic")์œผ๋กœ ์žฌ๋ฌด์ œํ‘œ์™€ ๊ฐ™์€ ํŒจํ„ด์œผ๋กœ ์ ‘๊ทผ. DART(K-IFRS HTML ํŒŒ์‹ฑ)์™€ EDGAR(US-GAAP XBRL ํƒœ๊ทธ) ๋™์ผ ์ธํ„ฐํŽ˜์ด์Šค.

c.panel(...) ๋‚ด์šฉ DART EDGAR
"inventory" ์›์žฌ๋ฃŒ/์žฌ๊ณตํ’ˆ/์ œํ’ˆ ๋ถ„ํ•ด โœ… โœ…
"borrowings" ๋‹จ๊ธฐ/์žฅ๊ธฐ ์ฐจ์ž…๊ธˆ ๋ถ„ํ•ด โœ… โœ…
"tangibleAsset" ์œ ํ˜•์ž์‚ฐ ์ทจ๋“์›๊ฐ€/๊ฐ๊ฐ€์ƒ๊ฐ/์žฅ๋ถ€๊ฐ€ โœ… โœ…
"intangibleAsset" ์˜์—…๊ถŒ/๊ฐœ๋ฐœ๋น„ ๋“ฑ โœ… โœ…
"receivables" ๋งค์ถœ์ฑ„๊ถŒ + ๋Œ€์†์ถฉ๋‹น๊ธˆ โœ… โœ…
"provisions" ๋ณด์ฆ/์†Œ์†ก/๊ตฌ์กฐ์กฐ์ • ์ถฉ๋‹น๋ถ€์ฑ„ โœ… โœ…
"eps" ๊ธฐ๋ณธ/ํฌ์„ ์ฃผ๋‹น์ด์ต โœ… โœ…
"segments" ๋ถ€๋ฌธ๋ณ„ ๋งค์ถœ/์ด์ต โœ… โœ…
"costByNature" ์›์žฌ๋ฃŒ/๊ธ‰์—ฌ/๊ฐ๊ฐ€์ƒ๊ฐ ์„ฑ๊ฒฉ๋ณ„ ๋น„์šฉ โœ… โœ…
"lease" ์‚ฌ์šฉ๊ถŒ์ž์‚ฐ/๋ฆฌ์Šค๋ถ€์ฑ„ โœ… โœ…
"affiliates" ๊ด€๊ณ„๊ธฐ์—… ์ง€๋ถ„๋ฒ• ํˆฌ์ž โœ… โœ…
"investmentProperty" ํˆฌ์ž๋ถ€๋™์‚ฐ ๊ณต์ •๊ฐ€์น˜/์žฅ๋ถ€๊ฐ€ โœ… โœ…

marimo Colab

Scan โ€” ์ „ ์ข…๋ชฉ ํšก๋‹จ ๋น„๊ต

์„ค๊ณ„: engines.scan

์ „ ์ข…๋ชฉ ๋Œ€์ƒ ํšก๋‹จ ๋ถ„์„. ๊ฑฐ๋ฒ„๋„Œ์Šค, ์ธ๋ ฅ, ์ฃผ์ฃผํ™˜์›, ๋ถ€์ฑ„, ํ˜„๊ธˆํ๋ฆ„, ๊ฐ์‚ฌ, ๋‚ด๋ถ€์ž, ์ด์ต์˜ ์งˆ, ์œ ๋™์„ฑ, ๋„คํŠธ์›Œํฌ, ๊ณ„์ •/๋น„์œจ ๋น„๊ต ๋“ฑ.

dartlab.scan("governance")            # ์ „์ข…๋ชฉ ์ง€๋ฐฐ๊ตฌ์กฐ
dartlab.scan("ratio", "roe")          # ์ „์ข…๋ชฉ ROE
dartlab.scan("account", "๋งค์ถœ์•ก")      # ์ „์ข…๋ชฉ ๋งค์ถœ์•ก ์‹œ๊ณ„์—ด

2,500+ ์ข…๋ชฉ์˜ ๋งค์ถœ์•ก์„ ํ•œ ๋ฒˆ์— โ€” ๋ถ„๊ธฐ๋ณ„ ์‹œ๊ณ„์—ด๋กœ ์ฆ‰์‹œ ๋น„๊ต

dartlab.scan('account', '๋งค์ถœ์•ก') โ€” ์ „์ข…๋ชฉ ๋งค์ถœ์•ก ํšก๋‹จ ๋น„๊ต

Compare โ€” ํšŒ์‚ฌ ๊ฐ„ N์‚ฌ ๋น„๊ต

์„ค๊ณ„: engines.panel

Company.panel์ด ํ•œ ํšŒ์‚ฌ๋ฅผ ํ•ญ๋ชฉร—๊ธฐ๊ฐ„์œผ๋กœ ์ˆ˜ํ‰ํ™”ํ•œ๋‹ค๋ฉด, dartlab.compare๋Š” 2~6๊ฐœ ํšŒ์‚ฌ๋ฅผ ๊ฐ™์€ ํ† ํ”ฝยท์‹œ์  ๊ฒฉ์ž๋กœ ์ •๋ ฌํ•œ๋‹ค. scan์ฒ˜๋Ÿผ ๋‹จ์–ด ํ•˜๋‚˜๋กœ ๋ถ€๋ฅด๋Š” ํ†ฑ๋ ˆ๋ฒจ verb โ€” ํšŒ์‚ฌ ๊ฐ„ ๋น„๊ต์˜ ๊ณต์‹ ํ‘œ๋ฉด์ด๋‹ค.

import dartlab

# ์ฃผ์„ยท์„œ์ˆ  ๋น„๊ต โ€” disclosureKeyยทscopeยทleafType ์ •๋ ฌํ‚ค๋กœ ํšŒ์‚ฌ ๊ฐ„ ํ•œ ํ–‰ ์ •๋ ฌ
dartlab.compare(["005930", "000660"], topic="์žฌ๊ณ ")

# ์žฌ๋ฌด์ œํ‘œ ์…€ ๋น„๊ต โ€” acode ๋‹จ์œ„, ๊ฐ’์€ ์› ํ™˜์‚ฐ (๋‹จ์œ„ยท๋ผ๋ฒจ ์ฐฉ์‹œ ์ œ๊ฑฐ)
dartlab.compare(["005930", "000660"], topic="is", freq="year")

# ๋‹ค๊ธฐ๊ฐ„ โ€” ์…€ ์ปฌ๋Ÿผ์ด {code}โŸ{period} ๋กœ ํšŒ์‚ฌยท์‹œ์  namespace
dartlab.compare(["005930", "000660"], topic="์œ ํ˜•์ž์‚ฐ", period=["2025Q4", "2024Q4"])
  • label-drift ์ž๋™ ํ•ด์†Œ โ€” ๊ฐ™์€ ํ•ญ๋ชฉ์ด ํšŒ์‚ฌ๋งˆ๋‹ค ๋‹ค๋ฅธ ์ ˆ ๋ฒˆํ˜ธ(์‚ผ์„ฑ "7. ์œ ํ˜•์ž์‚ฐ" โ†” SK "11. ์œ ํ˜•์ž์‚ฐ")์—ฌ๋„ ํ•œ ํ–‰์— ์ •๋ ฌํ•œ๋‹ค.
  • ํ™•์‹  ์˜ค์ •๋ ฌ ์ฐจ๋‹จ โ€” ์—ฐ๊ฒฐโ†”๋ณ„๋„(scope)ยทํ‘œโ†”์„œ์ˆ (leafType)์ด ๋‹ค๋ฅด๋ฉด ๊ฐ™์€ ํ–‰์— ๋ณ‘์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๊ฒฐ์†์€ NaN ์œ ์ง€ โ€” 0 ์ฑ„์›€ยทforward-fill ์—†์ด ๋นˆ ์นธ์„ ๊ทธ๋Œ€๋กœ ๋‘”๋‹ค(honest-gap, ์ถ”์„ธ ์™œ๊ณก ๋ฐฉ์ง€).
  • ์‹œ์žฅ ๊ฒฝ๊ณ„ โ€” KOโ†”US ํ˜ผํ•ฉ์€ ๋ง‰๋Š”๋‹ค. US(EDGAR)๋Š” ํ˜„์žฌ row ๋น„๊ต๋งŒ, ์žฌ๋ฌด ์…€ ๋น„๊ต๋Š” DART(์› ํ™˜์‚ฐ)๋งŒ ์—ด๋ ค ์žˆ๋‹ค.

Gather โ€” ์™ธ๋ถ€ ์‹œ์žฅ ๋ฐ์ดํ„ฐ

์„ค๊ณ„: engines.gather

์ฃผ๊ฐ€, ์ˆ˜๊ธ‰, ๊ฑฐ์‹œ์ง€ํ‘œ, ๋‰ด์Šค โ€” Polars DataFrame์œผ๋กœ.

dartlab.gather("price", "005930")             # KR OHLCV
dartlab.gather("price", "AAPL", market="US")  # US ์ฃผ๊ฐ€
dartlab.gather("macro", "FEDFUNDS")           # ์ž๋™ US ๊ฐ์ง€
dartlab.gather("news", "์‚ผ์„ฑ์ „์ž")             # Google News RSS

๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ batch ์ˆœํšŒ โ€” ์ธ์‚ฌ์ด๋” ๊ฑฐ๋ž˜ยท์ง€๋ถ„ยท๋‰ด์Šค๋ฅผ generator ๋กœ ๋ถ„ํ•  yield (๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „, ์ „ ์ข…๋ชฉ ์Šค์บ”์šฉ):

from dartlab.gather.accessors import DefaultFinanceAccessor
a = DefaultFinanceAccessor()
for batch in a.iterNews("์‚ผ์„ฑ์ „์ž", days=30, batchSize=100):
    process(batch)
# ๋™ํ–‰: a.iterInsiderTrades("005930") ยท a.iterOwnership("005930")
# ์ผ๊ด„: a.fetchInsiderTrades / fetchOwnership / fetchNews

getDefaultGather() ์‹ฑ๊ธ€ํ„ด์€ thread-safe (๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค ๋ณด์žฅ). ์บ์‹œ ํ†ต๊ณ„ยทsource fallback ์‹ ํ˜ธ๋Š” getCacheStatsSnapshot() ยท DARTLAB_TELEMETRY=stdout ์œผ๋กœ ์ถ”์ .

Analysis โ€” ์žฌ๋ฌด ์ธ๊ณผ ๋ถ„์„

์„ค๊ณ„: engines.analysis

์ˆ˜์ต๊ตฌ์กฐ โ†’ ์ˆ˜์ต์„ฑ โ†’ ์„ฑ์žฅ์„ฑ โ†’ ์•ˆ์ •์„ฑ โ†’ ํ˜„๊ธˆํ๋ฆ„ โ†’ ์ž๋ณธ๋ฐฐ๋ถ„ โ†’ ๊ฐ€์น˜ํ‰๊ฐ€ โ†’ ์ „๋ง. ์›๋ณธ ์žฌ๋ฌด์ œํ‘œ๋ฅผ ์ธ๊ณผ ์„œ์‚ฌ๋กœ ๊ฐ€๊ณตํ•œ๋‹ค.

c.analysis("financial", "์ˆ˜์ต์„ฑ")       # ์ˆ˜์ต์„ฑ ๋ถ„์„
c.analysis("์ˆ˜์ต์„ฑ")                     # ๋‹จ์ถ•ํ˜• (financial ์ž๋™)

print(c.credit())                            # ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ถ• ๊ฐ€์ด๋“œ DataFrame (self-discovery)
c.credit("๋“ฑ๊ธ‰")                             # dCR-AA, ๊ฑด์ „๋„ 93/100
c.credit("๋“ฑ๊ธ‰", detail=True)                # ๋“ฑ๊ธ‰ + ์„œ์‚ฌ + ์ง€ํ‘œ ์‹œ๊ณ„์—ด

Credit โ€” ๋…๋ฆฝ ์‹ ์šฉ๋ถ„์„

์„ค๊ณ„: engines.credit | ๋ณด๊ณ ์„œ: eddmpython.github.io/dartlab/blog/credit-reports

3-Track ๋ชจ๋ธ(์ผ๋ฐ˜/๊ธˆ์œต/์ง€์ฃผ) + Notch Adjustment + CHS ์‹œ์žฅ ๋ณด์ • + ๋ณ„๋„์žฌ๋ฌด ๋ธ”๋ Œ๋”ฉ.

79๊ฐœ์‚ฌ ๊ฒ€์ฆ: ๋Œ€๊ธฐ์—… 87% (26/30), ์ค‘๋Œ€ํ˜• 82% (41/50), ์ „์ฒด 70% (55/79, v5.0 ๊ณผ๋Œ€ํ‰๊ฐ€ ์ˆ˜์ • ํ›„ ์žฌ์ธก์ • ์˜ˆ์ •). ์‚ผ์„ฑ์ „์ž AA+ ์ •ํ™• ์ผ์น˜. ๊ฒ€์ฆ ๋ฐฉ๋ฒ•๋ก ์€ methodology ์ฐธ์กฐ.

print(c.credit())            # self-discovery โ€” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ถ• + ์ข…ํ•ฉ ๋“ฑ๊ธ‰

cr = c.credit("๋“ฑ๊ธ‰")        # ์ข…ํ•ฉ ๋“ฑ๊ธ‰
print(cr["grade"])          # dCR-AA+
print(cr["healthScore"])    # 96 (0-100, ๋†’์„์ˆ˜๋ก ๊ฑด์ „)
print(cr["pdEstimate"])     # 0.01% ๋ถ€๋„ํ™•๋ฅ 

cr = c.credit("๋“ฑ๊ธ‰", detail=True)  # ๋“ฑ๊ธ‰ + ์„œ์‚ฌ + ์ง€ํ‘œ + ๊ดด๋ฆฌ ์„ค๋ช…
print(cr["divergenceExplanation"])  # ์‹ ํ‰์‚ฌ์™€ ์™œ ๋‹ค๋ฅธ์ง€

์‹ ์šฉ๋ถ„์„ ๋ณด๊ณ ์„œ ๋ฐœ๊ฐ„ (credit ์„œ์‚ฌ + ์‹ ํ‰์‚ฌ ๋Œ€์กฐ๊ฐ€ story 5๋ง‰์— ์ž๋™ ํ†ตํ•ฉ):

from dartlab.story.publisher import publishReport
publishReport("005930")               # 6๋ง‰ ๋ณด๊ณ ์„œ (credit narrative + audit ํฌํ•จ)

Macro โ€” ์ข…๋ชฉ์ฝ”๋“œ ์—†์ด ๊ฒฝ์ œ๋ฅผ ์ฝ๋‹ค

์„ค๊ณ„: engines.macro

Company ์—†์ด ๊ฒฝ์ œ ํ™˜๊ฒฝ์„ ๋ถ„์„ํ•œ๋‹ค. import dartlab ํ•˜๋‚˜๋กœ.

dartlab.macro("์‚ฌ์ดํด")          # ๊ฒฝ๊ธฐ 4๊ตญ๋ฉด ํŒ๋ณ„
dartlab.macro("๊ธˆ๋ฆฌ")            # ๊ธˆ๋ฆฌ + Nelson-Siegel ์ˆ˜์ต๋ฅ ๊ณก์„ 
dartlab.macro("์˜ˆ์ธก")            # LEI + ์นจ์ฒดํ™•๋ฅ  + Hamilton RS + GDP Nowcast
dartlab.macro("์ข…ํ•ฉ")            # ๋งคํฌ๋กœ ์ข…ํ•ฉ + ํˆฌ์ž์ „๋žต + ํฌํŠธํด๋ฆฌ์˜ค ๋งคํ•‘

์‹œ์žฅ ์‚ฌ์ดํดยท๊ธˆ๋ฆฌยท์œ ๋™์„ฑยท์‹ฌ๋ฆฌยท์ž์‚ฐ ์‹ ํ˜ธ์™€ ๊ธ€๋กœ๋ฒŒ ๊ฑฐ์‹œ ๋ถ„์„ ๋ฐฉ๋ฒ•๋ก (Hamilton EM, Kalman DFM, Nelson-Siegel, Cleveland Fed ํ”„๋กœ๋น—, Sahm Rule, BIS Credit-to-GDP)์„ numpy๋งŒ์œผ๋กœ ์ง์ ‘ ๊ตฌํ˜„.

๋ฐฑํ…Œ์ŠคํŠธ ์‹ค์ฆ (2000-2024, FRED): Cleveland Fed ํ”„๋กœ๋น—์ด ๋ฏธ๊ตญ 3/3 ์นจ์ฒด๋ฅผ 2-16๊ฐœ์›” ์ „์— ์‚ฌ์ „ ๊ฐ์ง€, recall 90%.

Story โ€” ๋ถ„์„์„ ๋ณด๊ณ ์„œ๋กœ

์„ค๊ณ„: engines.story

analysis๋ฅผ ๊ตฌ์กฐํ™” ๋ณด๊ณ ์„œ๋กœ ์กฐ๋ฆฝ. 4๊ฐœ ์ถœ๋ ฅ ํ˜•์‹: rich(ํ„ฐ๋ฏธ๋„), html, markdown, json.

c.story()              # ์ „์ฒด ๋ณด๊ณ ์„œ
dartlab.ask()            # ๋ณด๊ณ ์„œ + AI ์ข…ํ•ฉ์˜๊ฒฌ

์‚ผ์„ฑ์ „์ž ๋ณด๊ณ ์„œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ: "๋งค์ถœ +23.8% ์„ฑ์žฅ, ์˜์—…์ด์ต๋ฅ  8.6%โ†’21.4% ๋ฐ˜๋“ฑ. FCF ์–‘์ˆ˜ ์ „ํ™˜, ROIC > WACC โ€” ์žฌํˆฌ์ž๊ฐ€ ๊ฐ€์น˜๋ฅผ ์ฐฝ์ถœํ•˜๋Š” ๊ตฌ๊ฐ„."

์ด์•ผ๊ธฐ๊พผ โ€” ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ผ ์ด์•ผ๊ธฐ๋‹ค

์„ค๊ณ„: engines.story ยท ์‹œ๋ฆฌ์ฆˆ: ๊ธฐ์—…์ด์•ผ๊ธฐ

๊ธฐ์—…๋ถ„์„์€ ๋น„์œจ ๋‚˜์—ด์ด ์•„๋‹ˆ๋‹ค. DartLab์€ 5๊ฐœ ์—”์ง„(analysis, credit, scan, quant, macro)์˜ ๊ฒฐ๊ณผ๋ฅผ 6๋ง‰ ์Šคํ† ๋ฆฌํ…”๋ง ๊ตฌ์กฐ๋กœ ์กฐํ•ฉํ•ด ๋ธ”๋กœ๊ทธ์— ๋ฐœ๊ฐ„ ๊ฐ€๋Šฅํ•œ ๊ธฐ์—…์ด์•ผ๊ธฐ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•œ๋‹ค.

from dartlab.story.publisher import publishReport
publishReport("068270")    # ์…€ํŠธ๋ฆฌ์˜จ โ€” 6๋ง‰ ๊ธฐ์—…์ด์•ผ๊ธฐ ์ž๋™ ๋ฐœ๊ฐ„

๋ฐœ๊ฐ„๋œ ๊ธฐ์—…์ด์•ผ๊ธฐ:

๊ธฐ์—… ์ด์•ผ๊ธฐ
SKํ•˜์ด๋‹‰์Šค ํ•œ๊ตญ ๋ฐ˜๋„์ฒด 30๋…„์˜ ๋ฏธ์Šคํ„ฐ๋ฆฌ, ์˜์—…์ด์ต๋ฅ  58%
์‚ผ์–‘์‹ํ’ˆ ๋ผ๋ฉด ๋น…3 ๊ผด๋“ฑ์ด ๋งค์ถœ 2.3์กฐ ๊ธ€๋กœ๋ฒŒ ์‹ํ’ˆ ๊ฑฐ์ธ์ด ๋˜๊ธฐ๊นŒ์ง€
๋‘์‚ฐ์—๋„ˆ๋นŒ๋ฆฌํ‹ฐ ๋ถ€์ฑ„๋น„์œจ 305%์—์„œ 129%๊นŒ์ง€, 9๋…„ ๋‹ค์ด์–ดํŠธ์˜ ์ง„์งœ ๋ชจ์Šต
์•Œํ…Œ์˜ค์   9๋…„ ์ ์ž ๋ฐ”์ด์˜คํ…์ด ํ•œ ๊ฑด์˜ ๋ผ์ด์„ ์Šค๋กœ ์˜์—…์ด์ต +1,069์–ต
HMM ์‹œ์žฅ์ด ์•„๋‹ˆ๋ผ ์‚ฌ์ดํด์ด ์ฃผ๊ฐ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ํšŒ์‚ฌ
์…€ํŠธ๋ฆฌ์˜จ IMF๋กœ ์ง์žฅ ์žƒ์€ 41์„ธ, 5์ฒœ๋งŒ์›์œผ๋กœ ์‹œ์ž‘ํ•ด 25๋…„ ํ›„ ๋ฌดํ˜•์ž์‚ฐ 13.78์กฐ
ํ•œํ™”์—์–ด๋กœ์ŠคํŽ˜์ด์Šค ์‚ผ์„ฑ์ด 8,400์–ต์— ๋ฒ„๋ฆฐ ๋ฌด๊ธฐ๊ฐ€ ์ˆ˜์ฃผ์ž”๊ณ  37์กฐ๊ฐ€ ๋๋‹ค
HDํ˜„๋Œ€์ผ๋ ‰ํŠธ๋ฆญ 7๋…„ ์ „ ์ ์ž 1,006์–ต์ด ์˜ฌํ•ด 1์กฐ๊ฐ€ ๋๋‹ค, ๋ณ€์••๊ธฐ ํ•˜๋‚˜๋กœ
๊ณ ๋ ค์•„์—ฐ 50๋…„ ๋งŒ์— ์ฒซ ์ˆœ์†์‹ค 2,457์–ต, ๊ทธ๋Ÿฐ๋ฐ ์˜์—…์ด์ต์€ ์‚ฌ์ƒ ์ตœ๋Œ€
์—์ดํ”ผ์•Œ ํ™”์žฅํ’ˆ ํšŒ์‚ฌ๊ฐ€ ๊ฐ€์ „์„ 4,070์–ต ํŒ”์•˜๋‹ค, ๊ทธ๊ฒŒ ์‹œ์ž‘์ด์—ˆ๋‹ค

Search โ€” ๊ณต์‹œยท๋‰ด์Šค๋ฅผ ์˜๋ฏธ๋กœ ๊ฒ€์ƒ‰

์„ค๊ณ„: engines.search

HuggingFace current search artifact ๋ฅผ ์ž๋™ ์‚ฌ์šฉํ•œ๋‹ค. Search Index Delta ์™€ Data Prebuild ๊ฐ€ source manifest ๊ธฐ์ค€์œผ๋กœ ์ฆ๋ถ„ ๋ฐ˜์˜ํ•˜๋ฉฐ, source๋ณ„ ์ตœ์‹ ์„ฑ์€ ๊ฒฐ๊ณผ์˜ dataAsOf/sourceRef ๋กœ ํ™•์ธํ•œ๋‹ค. ๋‹น์ผ ๋ฏธ๋Ÿฌ ์ „ ๋‹จ์ผ ์ข…๋ชฉ ๊ณต์‹œ ํ™•์ธ์€ Company.disclosure / Company.liveFilings ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค.

๋ชจ๋ธ ์—†์Œ, GPU ์—†์Œ, cold start ์—†์Œ. 400๋งŒ ๋ฌธ์„œ 95% ์ •๋ฐ€๋„ โ€” ์ž„๋ฒ ๋”ฉ๋ณด๋‹ค ์ •ํ™•, 1/100 ๋น„์šฉ. ๋ฒค์น˜๋งˆํฌ ์ƒ์„ธ๋Š” methodology ์ฐธ์กฐ.

dartlab.search("์œ ์ƒ์ฆ์ž ๊ฒฐ์ •")                     # ์œ ์ƒ์ฆ์ž ๊ณต์‹œ ์ฐพ๊ธฐ
dartlab.search("๋Œ€ํ‘œ์ด์‚ฌ ๋ณ€๊ฒฝ", corp="005930")       # ์ข…๋ชฉ ํ•„ํ„ฐ
dartlab.search("ํšŒ์‚ฌ๊ฐ€ ๋ˆ์„ ๋นŒ๋ ธ๋‹ค")                 # ์ž์—ฐ์–ด๋„ ๋™์ž‘

AI โ€” skills ๊ธฐ๋ฐ˜ ๋ถ„์„ ์ž‘์—…๋Œ€

์„ค๊ณ„: operation.opsAsSkills ยท ๋ฃจํ”„ ๊ฐœ์š”: ์ƒ๋‹จ ํ†ตํ•ฉ ์•„ํ‚คํ…์ฒ˜

dartlab.ask("์‚ผ์„ฑ์ „์ž ์žฌ๋ฌด๊ฑด์ „์„ฑ ๋ถ„์„ํ•ด์ค˜")
dartlab.ask("์‚ผ์„ฑ์ „์ž ๋ถ„์„", provider="gemini")  # ๋ฌด๋ฃŒ provider ์‚ฌ์šฉ ๊ฐ€๋Šฅ

Provider: gemini(๋ฌด๋ฃŒ), groq(๋ฌด๋ฃŒ), cerebras(๋ฌด๋ฃŒ), oauth-codex(ChatGPT ๊ตฌ๋…), openai, ollama(๋กœ์ปฌ) ๋“ฑ. Rate limit ์‹œ ์ž๋™ ๋Œ€์ฒด.

Channel โ€” ์™ธ๋ถ€์—์„œ ๋‚ด PC dartlab ์ ‘๊ทผ

์„ค๊ณ„: runtime.channel

PC์—์„œ ํ•œ ์ค„์ด๋ฉด ํฐ์—์„œ dartlab UI ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ. Microsoft DevTunnels ์ž๋™ ์…‹์—….

dartlab channel

ํ๋ฆ„:

  1. winget์œผ๋กœ devtunnel CLI ์ž๋™ ์„ค์น˜ (์ตœ์ดˆ 1ํšŒ)
  2. GitHub OAuth 1ํšŒ ์ธ์ฆ (๋ธŒ๋ผ์šฐ์ € ์ž๋™ ์˜คํ”ˆ)
  3. ์˜๊ตฌ URL + QR ๋ฐœ๊ธ‰ (https://<id>-8400.<region>.devtunnels.ms)
  4. ํฐ Chrome์— URL/QR ์ž…๋ ฅ โ†’ dartlab UI ๊ทธ๋Œ€๋กœ ๋™์ž‘

๋„๋ฉ”์ธ 0๊ฐœ, ํ† ํฐ ํŠธ๋ฆญ 0๊ฐœ. VS Code Remote Tunnels์™€ ๋™์ผ ์ธํ”„๋ผ๋ผ ๋ชจ๋ฐ”์ผ ํ˜ธํ™˜์„ฑ ๊ฒ€์ฆ๋จ. ๋ฉ”์‹œ์ง• ๋ด‡ ์˜ต์…˜ (--telegram/slack/discord) ๋„ ์ง€์›.

EDGAR (๋ฏธ๊ตญ)

๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค, ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ์†Œ์Šค. SEC API์—์„œ ์ž๋™ ์ˆ˜์ง‘, ์‚ฌ์ „ ๋‹ค์šด๋กœ๋“œ ๋ถˆํ•„์š”.

# Korea (DART)                          # US (EDGAR)
c = dartlab.Company("005930")           c = dartlab.Company("AAPL")
c.panel()                               c.panel()
c.panel("์‚ฌ์—…")                          c.panel("business")
c.panel("BS")                           c.panel("BS")
c.panel("ratios")                       c.panel("ratios")
c.panel("๋งค์ถœ")                          c.panel("revenue")

MCP โ€” AI ์–ด์‹œ์Šคํ„ดํŠธ ์—ฐ๋™

๋ฃจํ”„ยท๋„๊ตฌ ํ‘œ๋ฉด ๊ฐœ์š”: ์ƒ๋‹จ ํ†ตํ•ฉ ์•„ํ‚คํ…์ฒ˜

MCP ์„œ๋ฒ„ ๋‚ด์žฅ. canonical 6 ๋„๊ตฌ + ask ๋ฉ”ํƒ€๋กœ ์™ธ๋ถ€ LLM ์ด dartlab ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ RunPython ์•ˆ์—์„œ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ํŒจํ„ด (๋„๊ตฌ ํ‘œ๋ฉด์„ ์ขํ˜€ ํ† ํฐ ๋น„์šฉ โ†“, ๋„๊ตฌ ์„ ํƒ ์ •ํ™•๋„ โ†‘).

Claude Desktop / Claude Code / Cursor (stdio, ๊ถŒ์žฅ)

uvx dartlab mcp ์˜ cold start ๊ฐ€ Claude Desktop attach timeout ์•ˆ์— ๋“ค์–ด๊ฐ€์ง€ ๋ชปํ•˜๋ฏ€๋กœ ์‚ฌ์ „ ์„ค์น˜ + entry point ์ง์ ‘ ํ˜ธ์ถœ ์ด ์ •๋ณธ์ž…๋‹ˆ๋‹ค. command: "python" ์€ Microsoft Store Python ํ™˜๊ฒฝ์—์„œ spawn ENOENT ๋กœ ์‹คํŒจํ•  ์ˆ˜ ์žˆ์–ด (์ด์Šˆ #28), command: "dartlab" ์œผ๋กœ entry point ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๊ฒŒ ๊ฐ€์žฅ ๊ฒฌ๊ณ ํ•ฉ๋‹ˆ๋‹ค.

# 1. ์‚ฌ์ „ ์„ค์น˜ (ํ•œ ๋ฒˆ๋งŒ) โ€” .local/bin/dartlab(.exe) entry point ์ƒ์„ฑ
uv tool install dartlab        # ๋˜๋Š”: pipx install dartlab
// 2-A. Claude Desktop โ€” %APPDATA%\Claude\claude_desktop_config.json
{
  "mcpServers": {
    "dartlab": {
      "command": "dartlab",
      "args": ["mcp"],
      "env": { "PYTHONUNBUFFERED": "1", "PYTHONUTF8": "1" }
    }
  }
}
# 2-B. Claude Code ํ•œ ์ค„ ์„ค์ •
claude mcp add dartlab -- dartlab mcp

# 2-C. Codex CLI
codex mcp add dartlab -- dartlab mcp

dartlab ๋ช…๋ น์ด PATH ์— ์žกํžˆ์ง€ ์•Š๋Š” ํ™˜๊ฒฝ (ํ•œ์ •์ ) ์ด๋ผ๋ฉด ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ ์ ์–ด์ฃผ์„ธ์š”:

{
  "mcpServers": {
    "dartlab": {
      "command": "C:\\Users\\<user>\\.local\\bin\\dartlab.exe",   // Windows
      // "command": "/Users/<user>/.local/bin/dartlab",              // macOS / Linux
      "args": ["mcp"],
      "env": { "PYTHONUNBUFFERED": "1", "PYTHONUTF8": "1" }
    }
  }
}

๊ฐ™์€ ์ถœ๋ ฅ์€ dartlab mcp --config claude-desktop / dartlab mcp --config claude-code ๋กœ๋„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ .mcp.json ์ž๋™ ์ƒ์„ฑ: dartlab mcp --install.

์›๊ฒฉ MCP (Claude Code ยท Cursor ๋“ฑ SSE ์ง€์› ํด๋ผ์ด์–ธํŠธ๋งŒ)

{
  "mcpServers": {
    "dartlab": {
      "url": "https://eddmpython-dartlab.hf.space/mcp/sse"
    }
  }
}

HuggingFace Spaces ํ˜ธ์ŠคํŒ…. DART API ํ‚ค ๋ถˆํ•„์š”. Claude Desktop ๋ฐ์Šคํฌํ†ฑ ์•ฑ์€ stdio ๋งŒ ๋ฐ›์œผ๋ฏ€๋กœ ์ด URL ๋ฐฉ์‹์„ reject ํ•ฉ๋‹ˆ๋‹ค โ€” ์œ„ stdio ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋„๊ตฌ ํ‘œ๋ฉด

์‹ค์ œ tools/list ํ‘œ๋ฉด์€ ์•„๋ž˜ 11 ๊ฐœ์ž…๋‹ˆ๋‹ค. Skill ๋ณธ๋ฌธ ์ „์ฒด ์กฐํšŒ๋Š” ๋ณ„๋„ advertised tool ์ด ์•„๋‹ˆ๋ผ ReadSkill ๊ฒฐ๊ณผ์™€ dartlab://skills/{id} resource ๊ฒฝ๋กœ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋„๊ตฌ ์—ญํ• 
ask dartlab chat-native ๋ฃจํ”„ โ€” LLM ์ž์œจ ๋„๊ตฌ ํ˜ธ์ถœ + Ref ๊ฒ€์‚ฐ ์ผ๊ด„
ReadSkill ๊ณต์‹ Skill OS ๊ฒ€์ƒ‰ + frontmatter + ๋ณธ๋ฌธ preview
ReadCapability dartlab ๊ณต๊ฐœ API/docstring ๊ฒ€์ƒ‰
RunPython dartlab + Polars ์ฝ”๋“œ ์‹คํ–‰ โ†’ executionRef/valueRef/tableRef
WebSearch ์™ธ๋ถ€ ์ตœ์‹  ์ •๋ณด โ†’ webRef (untrusted ๋งˆ์ปค ์ž๋™ ์ ์šฉ)
SaveArtifact ํฐ ํ‘œยท์ฐจํŠธ ๋ณ„๋„ ์ €์žฅ โ†’ artifactRef
CompileVisual ์ฐจํŠธ spec codegen โ†’ visualRef
LookAheadGuard ๋‹ต๋ณ€ ์ „ ๋ˆ„๋ฝ๋œ ๋‹ค์Œ ์งˆ๋ฌธยท๊ฒ€์‚ฐ ํฌ์ธํŠธ ์ ๊ฒ€
GroundingCheck ์ˆซ์žยท๋‚ ์งœยท์ถœ์ฒ˜ grounding ๊ฒ€์‚ฐ
RequestUserInput MCP elicit ์ง€์› ํด๋ผ์ด์–ธํŠธ์—์„œ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์š”์ฒญ

์˜› 33 generated ๋„๊ตฌ (companyAnalysis/companyStory/marketScan ๋“ฑ) ๋Š” 0.10 ๋ถ€ํ„ฐ ํ๊ธฐ โ€” ๋ชจ๋‘ RunPython ์•ˆ์—์„œ dartlab.Company / dartlab.scan / dartlab.macro ์ง์ ‘ ํ˜ธ์ถœ. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ CHANGELOG ์ฐธ์กฐ.

Skill OS ์™€ Skill Market

DartLab ์—๋Š” ๋‘ ๊ฐ€์ง€ ์Šคํ‚ฌ ์ธต์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ธต ์œ„์น˜ ์—ญํ• 
builtin Skill OS src/dartlab/skills/specs/** ยท /skills ๊ณต์‹ ์šด์˜ยท์—”์ง„ยท๋ถ„์„ ์ ˆ์ฐจ์ž…๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€์™€ ํ•จ๊ป˜ ๋ฐฐํฌ๋˜๋ฉฐ AI ๊ฐ€ ๋จผ์ € ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
community Skill Market GitHub Discussions ยท /skills/market ยท ์ •์  marketIndex.json ์‚ฌ์šฉ์ž๊ฐ€ ๊ณต์œ ํ•œ ๋ถ„์„ ์งˆ๋ฌธ์„ Forge ๊ฐ€ ๊ตฌ์กฐํ™”ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ ์Šคํ‚ฌ์ž…๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ builtin ์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์šด์˜ ํ๋ฆ„์€ ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ GitHub Discussions ์— ๋ถ„์„ ์งˆ๋ฌธ์„ ์”๋‹ˆ๋‹ค. DartLab Forge ๊ฐ€ ์›๋ฌธ๊ณผ ๋Œ“๊ธ€์„ ์ฝ๊ณ  intent, inputs, dataSources, procedure, executionPlan, outputs, outputSchema, criteria, forbidden, completionCriteria ๋ฅผ ๊ตฌ์กฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ดˆ์•ˆ๊ณผ ๋ณด์™„ ์ค‘์ธ ํ•ญ๋ชฉ์€ marketIndex.json ์—๋งŒ ๋‚จ๊ณ  ์ตœ์ข… ์Šคํ‚ฌ snapshot ์„ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Maintainer ๊ฐ€ ์™„์„ฑ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•œ๋‹ค๊ณ  ๊ฒ€ํ† ํ•ด /market runnable, /market curated, /market builtin-candidate ๋กœ ํ˜„์žฌ revision ์„ ํ™•์ •ํ•  ๋•Œ๋งŒ GitHub Action ์ด items/{id}.json accepted snapshot ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋žœ๋”ฉ์˜ Skill Market ๊ณผ AI ๋„๊ตฌ ReadSkillMarket ์ด ์ด ์ •์  artifact ๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์Šคํ‚ฌ์€ ์นด๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ๋ถ„์„ ํ–‰์œ„์˜ ๊ณ„์•ฝ์ž…๋‹ˆ๋‹ค. ์ตœ์ข… ๊ณต์œ ์Šคํ‚ฌ์€ ์–ด๋–ค DartLab ์—”์ง„์ด๋‚˜ recipe ๋ฅผ ์–ด๋–ค ์ˆœ์„œ๋กœ ํ˜ธ์ถœํ•˜๋Š”์ง€ executionPlan ์— ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. mappedBuiltinSkills ๋Š” ์ฐธ๊ณ  ์—ฐ๊ฒฐ์ผ ๋ฟ์ด๋ฉฐ, executionPlan ์ด ์—†์œผ๋ฉด marketCurated ๋Œ“๊ธ€์ด ์žˆ์–ด๋„ ์ตœ์ข… snapshot ์„ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

marketCurated ๋Š” Skill Market ์•ˆ์—์„œ ์™„์„ฑ๋œ ๊ณต์œ ์Šคํ‚ฌ์ž…๋‹ˆ๋‹ค. builtin ํŽธ์ž…์„ ๋œปํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™„์„ฑ๋œ ๊ณต์œ ์Šคํ‚ฌ์€ Discussion ๊ณผ accepted item snapshot ์— ๋‚จ๊ณ , AI ๋Š” sourceUrl ๊ณผ trustTier ๋ฅผ ํ‘œ์‹œํ•œ ๋’ค ๋ณด์กฐ ์ ˆ์ฐจ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. builtinCandidate ๋Š” ์˜ˆ์™ธ์ ์ธ ์žฅ๊ธฐ ๊ฒ€ํ†  ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์šด์˜ ๊ฒฝ๋กœ๋Š” ํ† ๋ก ์—์„œ ์™„์„ฑํ•œ ๊ณต์œ ์Šคํ‚ฌ์„ Skill Market ์— ๋‚จ๊ธฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ตœ์ข… ์Šคํ‚ฌ์€ Discussion ์˜ ๋งˆ์ง€๋ง‰ ๋Œ“๊ธ€์ด๋‚˜ body ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์Šน์ธ๋œ items/{id}.json snapshot ์ž…๋‹ˆ๋‹ค. items/{id}.json ์ด ์—†์œผ๋ฉด ์•„์ง ์ตœ์ข… ์Šคํ‚ฌ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋Œ“๊ธ€์€ ํ† ๋ก ๊ณผ ๊ธฐ์—ฌ ๊ธฐ๋ก์ž…๋‹ˆ๋‹ค. ์™„์„ฑ ๋’ค ์ƒˆ ๋Œ“๊ธ€์ด ๋‹ฌ๋ฆฌ๋ฉด ๊ธฐ์กด ์ตœ์ข… ์Šคํ‚ฌ์€ ์ฆ‰์‹œ ๋ฐ”๋€Œ์ง€ ์•Š๊ณ  revisionStatus: pendingReview ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. Maintainer ๊ฐ€ revision draft ๋ฅผ ๊ฒ€ํ† ํ•˜๊ณ  ๋‹ค์‹œ ์Šน๊ฒฉํ•˜๋ฉด ๊ทธ๋•Œ item snapshot, marketIndex.json, ๋žœ๋”ฉ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐฑ์‹ ๋ฉ๋‹ˆ๋‹ค.

Discussion ์šด์˜์€ ์•„์ด๋””์–ด โ†’ Caller Audit โ†’ executionPlan ์ดˆ์•ˆ โ†’ ์˜ˆ์‹œ ์ž…๋ ฅ/๊ธฐ๋Œ€ ์ถœ๋ ฅ โ†’ ์šด์˜์ž ํ™•์ • โ†’ accepted snapshot ์ˆœ์„œ์ž…๋‹ˆ๋‹ค. ๋Œ“๊ธ€์ด ์ถ”๊ฐ€๋˜๋ฉด ๊ธฐ์กด snapshot ์€ ์œ ์ง€๋˜๊ณ  ์ƒˆ ๋Œ“๊ธ€์€ pending revision ์œผ๋กœ๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ํ† ๋ก ํ•ด์„œ ์šด์˜์ž๊ฐ€ ํ™•์ •ํ•˜๋ฉด items/{id}.json ์ด vN+1 ๋กœ ๊ฐฑ์‹ ๋ฉ๋‹ˆ๋‹ค.

dartlab-lite โ€” ๋ธŒ๋ผ์šฐ์ €ยท์—‘์…€์—์„œ ์„ค์น˜ ์—†์ด (Pyodide)

์ƒ์„ธ: ๋ธ”๋กœ๊ทธ โ€” ์—‘์…€ยท๋ธŒ๋ผ์šฐ์ €ยท๋…ธํŠธ๋ถ์—์„œ ์„ค์น˜ ์—†์ด dartlab ์“ฐ๊ธฐ (Pyodide)

Pyodide๊ฐ€ CPython์„ WebAssembly๋กœ ํฌํŒ…ํ•œ ๋•์— ํŒŒ์ด์ฌ์ด ์„ค์น˜๋˜์ง€ ์•Š์€ ํ™˜๊ฒฝ์—์„œ๋„ dartlab์ด ๊ทธ๋Œ€๋กœ ๋ˆ๋‹ค. ๊ฐ™์€ API, ๊ฐ™์€ ๋ฐ์ดํ„ฐ.

์ง€์› ํ™˜๊ฒฝ: xlwings Lite (Excel) ยท Anaconda Code (Excel) ยท JupyterLite ยท Google Colab WASM ๋Ÿฐํƒ€์ž„ ยท marimo (pyodide) ยท ์ˆœ์ˆ˜ HTML ์ž„๋ฒ ๋“œ.

๐Ÿ‘‰ ์›น ์—‘์…€์—์„œ ๋ฐ”๋กœ ์—ด์–ด๋ณด๊ธฐ โ€” OneDrive ๊ณต์œ  ์›Œํฌ๋ถ โ€” xlwings Lite + dartlab ์„ธํŒ… ์™„๋ฃŒ. ๋ฒ„ํŠผ๋งŒ ๋ˆ„๋ฅด๋ฉด ์‹œํŠธ์— ์žฌ๋ฌด์ œํ‘œ๊ฐ€ ์ฐํžŒ๋‹ค.

๋‘ ๊ฐ€์ง€ ์‚ฌ์šฉ ๋ฐฉ์‹ โ€” scriptํ˜• vs funcํ˜•

xlwings Lite๋Š” ๋‘ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. @script๋Š” ๋ฒ„ํŠผํ˜•(๋ช…๋ นํ˜•), @func๋Š” ์ˆ˜์‹ํ˜•(์„ ์–ธํ˜•). dartlab์€ ๋‘˜ ๋‹ค ์ง€์›ํ•˜๋ฉฐ, ํ•จ์ˆ˜ํ˜•์ด dartlab์„ ์—‘์…€๋‹ต๊ฒŒ ์“ฐ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

1. @script โ€” ์‚ฌ์ด๋“œ๋ฐ” ๋ฒ„ํŠผ โ†’ ์‹œํŠธ์— ์ฑ„์šฐ๊ธฐ

import dartlab
import xlwings as xw
from xlwings import arg, func, script

@script(name="isTest")
def finance(book: xw.Book):
    c = dartlab.Company('000020')
    df = c.panel('IS')
    data = [list(df.columns)] + [list(r) for r in df.iter_rows()]
    sheet = book.sheets.active
    sheet["A3"].value = data

xlwings Lite โ€” @script ๋ชจ๋“œ, ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด ์‹œํŠธ์— IS๊ฐ€ ์ฑ„์›Œ์ง„๋‹ค

2. @func โ€” ์—‘์…€ ์…€์— ์ˆ˜์‹์ฒ˜๋Ÿผ =GETFINANCE("005930")

@func
def getFinance(code: str):
    c = dartlab.Company(code)
    df = c.panel('IS')
    data = [list(df.columns)] + [list(r) for r in df.iter_rows()]
    return data

<img src=".github/assets/xlwings-lite-func.webp" alt="xlwings Lite โ€” @func ๋ชจ๋“œ, ์…€์— =GETFINANCE("005930")๋งŒ ์ณ๋„ 5๋ถ„๊ธฐ IS๊ฐ€ ์ž๋™ ์Šคํ•„" width="720">

VLOOKUP๊ณผ ๋‚˜๋ž€ํžˆ =GETFINANCE๊ฐ€ ์—‘์…€ ๋„ค์ดํ‹ฐ๋ธŒ ํ•จ์ˆ˜๋กœ ๋™์ž‘ํ•œ๋‹ค. ์ข…๋ชฉ์ฝ”๋“œ๋ฅผ ๋ฐ”๊พธ๋ฉด ์…€ ์žฌ๊ณ„์‚ฐ์œผ๋กœ ์ „๋ถ€ ๊ฐฑ์‹ ๋œ๋‹ค.

์„ค์น˜ (xlwings Lite ยท ํ•œ ์ค„)

import micropip
await micropip.install(["diff-match-patch", "openpyxl"])
await micropip.install(
    "https://huggingface.co/eddmpython/dartlab-data/resolve/main/pyodide/dartlab-latest-py3-none-any.whl",
    deps=False,
)

import dartlab
c = dartlab.Company("005930")
c.panel("IS")

๋˜๋Š” xlwings Lite ์‚ฌ์ด๋“œ๋ฐ”์˜ requirements.txt์— dartlab ํ•œ ์ค„ โ€” ๊ทธ๊ฒƒ๋งŒ์œผ๋กœ ๋. ๋กœ์ปฌ ํŒŒ์ด์ฌ 0์ค„, uv 0์ค„, venv 0์ค„.

์ œ์•ฝ (๋ธŒ๋ผ์šฐ์ € ๋Ÿฐํƒ€์ž„์˜ ํ•œ๊ณ„)

๊ธฐ๋Šฅ Pyodide ๋น„๊ณ 
Company() ยท c.panel() ยท analysis ยท story ยท credit โœ… HF parquet ์ž๋™ ๋‹ค์šด๋กœ๋“œ
dartlab.ask() โœ… API ํ‚ค ์„ค์ • ํ•„์š” (geminiยทopenai CORS OK)
dartlab.scan() โŒ ์‚ฌ์ „ ๋นŒ๋“œ parquet 271MB (๋ธŒ๋ผ์šฐ์ € ๋น„ํ˜„์‹ค์ )
dartlab.gather() โŒ NaverยทYahooยทGoogle News CORS ์ฐจ๋‹จ

์Šค๋ ˆ๋“œ ์—†์Œ ยท MEMFS ํœ˜๋ฐœ ยท CORS ๋ฏธํ—ˆ์šฉ API ๋ถˆ๊ฐ€ โ€” ์ด ์„ธ ์ œ์•ฝ์ด ๊ทผ๋ณธ์ด๋‹ค. ์ƒ์„ธ์™€ ๋นŒ๋“œ ํŒŒ์ดํ”„๋ผ์ธ์€ pyodide/README.md, ์„ค์น˜ 5๋‹จ๊ณ„ ์Šคํฌ๋ฆฐ์ƒท์€ ๋ธ”๋กœ๊ทธ ๊ธ€์„ ๋ณธ๋‹ค.

OpenAPI โ€” ์›๋ณธ ๊ณต๊ณต API

from dartlab import OpenDart, OpenEdgar

# ํ•œ๊ตญ (opendart.fss.or.kr ๋ฌด๋ฃŒ API ํ‚ค ํ•„์š”)
d = OpenDart()
d.filings("์‚ผ์„ฑ์ „์ž", "2024")
d.finstate("์‚ผ์„ฑ์ „์ž", 2024)

# ๋ฏธ๊ตญ (API ํ‚ค ๋ถˆํ•„์š”)
e = OpenEdgar()
e.filings("AAPL", forms=["10-K", "10-Q"])

๋ฐ์ดํ„ฐ

๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” HuggingFace์— ์‚ฌ์ „ ๊ตฌ์ถ• โ€” ์ž๋™ ๋‹ค์šด๋กœ๋“œ. EDGAR๋Š” SEC API ์ง์ ‘ ์ˆ˜์ง‘. ์‚ฌ์šฉ์ž๋Š” ๋ฐ์ดํ„ฐ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๋ณด๊ณ  ์ƒˆ Skill Market ์•„์ด๋””์–ด์˜ ์ž…๋ ฅ์œผ๋กœ ์‚ผ์„ ์ˆ˜ ์žˆ๋‹ค.

์นดํ…Œ๊ณ ๋ฆฌ ํฌํ•จ ๋ฐ์ดํ„ฐ ๋Œ€ํ‘œ ์‚ฌ์šฉ
DART docs ์‚ฌ์—…๋ณด๊ณ ์„œยท๋ถ„๊ธฐ๋ณด๊ณ ์„œ ์›๋ฌธ ์„น์…˜, ์ฃผ์„, ํ…์ŠคํŠธ ํ† ํ”ฝ ๊ณต์‹œ ๋ณ€ํ™”, ๋ฆฌ์Šคํฌ, ์‚ฌ์—… ์„ค๋ช…
DART finance K-IFRS XBRL ์žฌ๋ฌด์ œํ‘œ, ํ‘œ์ค€ ๊ณ„์ •, ๊ธฐ๊ฐ„ ๋น„๊ต Company.show, analysis, credit
DART report OpenDART ์ •ํ˜• ํ•ญ๋ชฉ, ์ž„์›ยท์ง์›ยท๋ฐฐ๋‹นยท์ง€๋ถ„ ๋“ฑ ์ง€๋ฐฐ๊ตฌ์กฐ, ๋ฐฐ๋‹น, ์ธ๋ ฅ, ์ž๋ณธ์ •์ฑ…
DART scan ์ „์ข…๋ชฉ ํšก๋‹จ ์Šค์บ”์šฉ ํ”„๋ฆฌ๋นŒ๋“œ ์ง€ํ‘œ peer ๋น„๊ต, ๋žญํ‚น, ์ด์ƒ์น˜ ํƒ์ƒ‰
EDGAR SEC filing, US-GAAP XBRL, 10-K/10-Q/8-K ๋ฏธ๊ตญ ๊ธฐ์—… ๋ถ„์„, ํ•œ๋ฏธ ๋น„๊ต
Gather ๊ฐ€๊ฒฉ, ์ˆ˜๊ธ‰, ๋‰ด์Šค, ๊ฑฐ์‹œ์ง€ํ‘œ(FREDยทECOS), ์™ธ๋ถ€ ๋ณด์กฐ ๋ฐ์ดํ„ฐ ์‹œ์žฅ ๋ฐ˜์‘, ์ด๋ฒคํŠธ, macro recipe
Reference ์‚ฐ์—… ๋งต, capability, ๋ Œ๋”๋งยท๋งคํ•‘ ๊ธฐ์ค€ Skill OS, ์ฐจํŠธ, ๋ณด๊ณ ์„œ ์กฐ๋ฆฝ

ํŒŒ์ดํ”„๋ผ์ธ: ๋กœ์ปฌ ์บ์‹œ(์ฆ‰์‹œ) โ†’ HuggingFace(์ž๋™ ๋‹ค์šด๋กœ๋“œ) โ†’ DART API(ํ‚ค ํ•„์š”). ๋Œ€๋ถ€๋ถ„ ์ฒ˜์Œ ๋‘ ๋‹จ๊ณ„๋กœ ์ถฉ๋ถ„.

๋ฐ”๋กœ ์‹œ์ž‘ํ•˜๊ธฐ

๋…ธํŠธ๋ถ (Colab): Company ยท Gather ยท Scan ยท Quant ยท Analysis ยท Macro ยท Credit ยท Story ยท AI

๋…ธํŠธ๋ถ (marimo): ์ „์ฒด ๋ชฉ๋ก โ€” import ๋ฐ˜๋ณต ์—†๋Š” ๋‹จ์ผ ์ง„์ž…, ์…€๋งˆ๋‹ค ์ฃผ์„ ์„ค๋ช…, ๋งˆํฌ๋‹ค์šด ์…€ ๋ฏธ์‚ฌ์šฉ

๋ฌธ์„œ

๋ฌธ์„œ ยท ๋น ๋ฅธ ์‹œ์ž‘ ยท Skills

๋ธ”๋กœ๊ทธ (120+ ๊ธ€): ์ „์ฒด ยท ๊ธฐ์—…์ด์•ผ๊ธฐ ยท ์‹ ์šฉํ‰๊ฐ€ ๋ณด๊ณ ์„œ

์•ˆ์ •์„ฑ

Tier ๋ฒ”์œ„
Stable DART Company (panel, show, trace, diff, BS/IS/CF, CIS, index, filings, profile), EDGAR Company core, valuation, forecast, simulation
Beta EDGAR ํŒŒ์›Œ์œ ์ € (SCE, notes, freq, coverage), credit, insights, distress, ratios, timeseries, network, governance, workforce, capital, debt, chart/table/text ๋„๊ตฌ, ask/chat, OpenDart, OpenEdgar, Server API, MCP
Experimental AI ๋„๊ตฌ ํ˜ธ์ถœ, export, viz (์ฐจํŠธ)

์ž์„ธํ•œ ๊ธฐ์ค€์€ operation.stability ๋ฅผ ๋ณธ๋‹ค.

์„ค๊ณ„ ์„ ํƒ

๋‹ค๋ฅธ ์žฌ๋ฌด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋‹ค๋ฅธ ์˜์‹์  ๊ฒฐ์ • โ€” ์‚ฌ์šฉ์ž๊ฐ€ ์„ค์น˜ ํ›„ ๋งˆ์ฃผ์น  ์ฐจ์ด๋ฅผ ๋ฏธ๋ฆฌ ๋ช…์‹œํ•œ๋‹ค.

๊ฒฐ์ • ์˜๋ฏธ ์ด์œ 
๋‹จ์ผ base install โ€” [extras] ๋ถ„๋ฆฌ ์—†์Œ pip install dartlab ํ•œ ๋ฒˆ์— ๋ถ„์„ยท์„œ๋ฒ„ยทMCPยทvizยทAI provider ๊ฐ€ ํ•จ๊ป˜ ๋“ค์–ด์˜จ๋‹ค ๋ถ„์„ ๋„๊ตฌ์— "์ด๊ฒƒ๋„ ์„ค์น˜ํ•˜์„ธ์š”" ๊ฐ€ ๋ˆ„์ ๋˜๋ฉด ์ฒซ ์‚ฌ์šฉ๊นŒ์ง€ ๋งˆ์ฐฐ์ด ๋Š˜์–ด๋‚œ๋‹ค. ๋‹จ์ผ ์ง„์ž… SSOT ๊ฐ€ ์šฐ์„ . wheel ํฌ๊ธฐยทcold start ๋น„์šฉ์€ PEP 562 lazy load ์™€ pyodide ๋ถ„๊ธฐ๋กœ ํก์ˆ˜ํ•œ๋‹ค.
์‚ฌ์ „ ๊ตฌ์ถ• ๋ฐ์ดํ„ฐ, API ํ‚ค 0 ์œผ๋กœ ์‹œ์ž‘ Company("005930") ํ˜ธ์ถœ ์‹œ HuggingFace ์—์„œ ์ž๋™ ๋‹ค์šด๋กœ๋“œ โ†’ ๋กœ์ปฌ ์บ์‹œ. DART API ํ‚ค๋Š” ์žฌ์ˆ˜์ง‘ ๋งŒ ํ•„์š” "ํ‚ค ๋งŒ๋“ค๊ณ  ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ธํŒ…" ๋‹จ๊ณ„๋ฅผ 1์ˆœ์œ„ ์‚ฌ์šฉ ๊ฒฝ๋กœ์—์„œ ์ œ๊ฑฐ. ํ‚ค ๋ฐœ๊ธ‰์€ dartlab collect ๊ฐ™์€ raw ์žฌ์ˆ˜์ง‘ ํ๋ฆ„์—์„œ๋งŒ ๋“ฑ์žฅ.
๊ณต์‹œ ๋ณธ๋ฌธ์€ ๋ฐ์ดํ„ฐ, ์ง€์‹œ ์•„๋‹˜ ์™ธ๋ถ€ ๋ณธ๋ฌธ์€ ์ง๋ ฌํ™” ์‹œ [EXTERNAL CONTENT START โ€” untrusted ...] ๋งˆ์ปค๋กœ ์ž๋™ ๊ฐ์Œˆ DART/EDGAR/๋‰ด์Šค ๋ณธ๋ฌธ ์•ˆ์˜ "์ด์ „ ์ง€์‹œ ๋ฌด์‹œ" ๊ฐ™์€ ํŒจํ„ด์ด AI ๋™์ž‘์„ ๋ฐ”๊พธ์ง€ ๋ชปํ•˜๋„๋ก ์ง๋ ฌํ™” ๋‹จ์—์„œ ๊ฐ•์ œ. ๋งˆ์ปค ์•ˆ ์ˆซ์žยท๋‚ ์งœยท๊ณ ์œ ๋ช…์‚ฌ๋Š” 1์ฐจ ์ถœ์ฒ˜ ์žฌ๊ฒ€์ฆ ํ›„ ์ธ์šฉ.
AI ์—”์ง„ = chat-native + LLM ์ž์œจ tool calling BRIEF/WORK/CRITIQUE/COMPOSE/GATE/HARVEST ์‹ ๊ณ ์ • ๋…ธ๋“œ ๊ทธ๋ž˜ํ”„ ์—†์Œ. ๋ณธ์ฒด๋Š” ai/agent.py, ๋Šฅ๋ ฅ์€ ai/tools/ 0.7.15 ์—์„œ 15,420 ์ค„ ์‚ญ์ œ๋กœ ํšŒ๊ท€ ์ฐจ๋‹จ. graph ์‹ ๊ฐ•๋ฐ•์€ verify ๊ฐ•์ œยทworkbench ๋ณธ์ฒดํ™” ํšŒ๊ท€๋ฅผ ๋ถ€๋ฅด๊ณ  LLM ์ž์œจ์„ฑ์„ ์ž ๊ทผ๋‹ค.
L0~L4 ๋‹จ๋ฐฉํ–ฅ import (4 ํ˜•์ œ cross ๊ธˆ์ง€) core โ† gather/providers โ† scan/frame/synth/reference โ† analysis 5์ข… โ† story โ† ai/mcp import-linter + dartlabGuard.py strict --scope l0-l15 ๊ฐ€ PR ๊ฒŒ์ดํŠธ. ์™ธ๋ถ€ ๊ธฐ์—ฌ์ž๊ฐ€ ์–ด๋””์— ์ฝ”๋“œ๋ฅผ ๋”ํ• ์ง€ ํ•œ ๊ทธ๋ฆผ์œผ๋กœ ํŒ๋‹จ ๊ฐ€๋Šฅ.
ํ…Œ์ŠคํŠธ ์ง๋ ฌํ™” ๊ฐ•์ œ (Polars OOM ๊ฐ€๋“œ) pytest -v ์ „์ฒด ํ˜ธ์ถœ ๊ธˆ์ง€. tests/test-lock.sh tests/ -m "<marker>" ๊ฒฝ์œ  Company 1๊ฐœ โ‰ˆ 200~500 MB Rust ํž™์€ gc.collect() ํšŒ์ˆ˜ ๋ถˆ๊ฐ€. CI ์™€ ๋กœ์ปฌ์„ ๊ฐ™์€ lock wrapper ๋ช…๋ น์œผ๋กœ ํ†ต์ผ.
๋ฉ”์‹œ์ง€ ํ•œ๊ตญ์–ด ์šฐ์„ , API ์˜์–ด Company, pastInsight, analysis ๋“ฑ symbol ์€ ์˜์–ด. CLI ์—๋Ÿฌยท์ง„ํ–‰ ๋ฉ”์‹œ์ง€๋Š” ํ•œ๊ตญ์–ด classifier ์— Natural Language :: Korean / English ๋‘˜ ๋‹ค ์„ ์–ธ. PyPI ์˜์–ด ์‚ฌ์šฉ์ž ๋Œ€์ƒ ์˜๋ฌธ ์ง„์ž…์€ README_EN.md ์™€ ์˜๋ฌธ docstring ์œผ๋กœ ๋ณ„๋„ ํŠธ๋ž™.
๋‹จ์ผ SSOT โ€” Skill OS ์™ธ๋ถ€ LLMยท์‚ฌ์šฉ์ž๊ฐ€ capabilities() ํ•œ ์ค„๋กœ 304 specs ์นดํƒˆ๋กœ๊ทธ ์งˆ์˜ ์ฝ”๋“œยท๋ฌธ์„œยท๊ณ„์•ฝ์„ ๊ฐ™์€ ํŒŒ์ผ (src/dartlab/skills/specs/**) ๋กœ ์šด์˜. README โ†” docs โ†” ์ฝ”๋“œ drift ๋ฅผ SSOT ํ•œ ๊ณณ์—์„œ ๋ฐฉ์ง€.
๋ถ€์ฑ„ ์‹œ๊ณ„์—ด ๊ณต๊ฐœ uv run python -X utf8 src/dartlab/skills/measureProgress.py ๋กœ baseline ยท docstring backlog ยท pytest marker ๋ถ„ํฌ 3 ์ถ• ์ถ”์„ธ ์ธก์ •. master push ๋งˆ๋‹ค _progress/measureHistory.jsonl ํ•œ ์ค„ ์ ์žฌ "์‹ ๊ทœ ํšŒ๊ท€ 0" ๊ฐ€๋“œ ์™ธ์— ์ƒํ™˜ ๋„ ์ •๋Ÿ‰์œผ๋กœ ๋ณธ๋‹ค. ์™ธ๋ถ€ ๊ธฐ์—ฌ์ž๊ฐ€ "๋ถ€์ฑ„๋ฅผ ์ค„์ด๊ณ  ์žˆ๋Š”๊ฐ€" ๋ฅผ ์‹œ๊ณ„์—ด ํ•œ ํŒŒ์ผ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅ.

30์ดˆ ์•ˆ์— ์ฒซ ๊ฒฐ๊ณผ

pip install dartlab
import dartlab
c = dartlab.Company("005930")   # HuggingFace ์ž๋™ ๋‹ค์šด๋กœ๋“œ (์ตœ์ดˆ ~์ˆ˜์‹ญ MB, ๋กœ์ปฌ ์บ์‹œ)
c.panel("IS")                   # ์†์ต๊ณ„์‚ฐ์„œ, ๋ถ„๊ธฐ ๊ธฐ๋ณธ

์„ธ ์ค„ โ€” API ํ‚ค 0, ํ™˜๊ฒฝ๋ณ€์ˆ˜ 0. ์˜๋ฌธ ์‚ฌ์šฉ์ž๋Š” README_EN.md, ๋‹ค๋ฅธ ์ง„์ž… ๊ฒฝ๋กœ (CLI ยท AI ยท MCP) ๋Š” ์œ„ "๋‘ ๊ฐ€์ง€ ์‹œ์ž‘์ " ์ฐธ์กฐ.

๊ธฐ์—ฌ

๊ธฐ์—ฌ๋Š” ๋ฌด์—‡์ด๋“  ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„๊ทธ ๋ฆฌํฌํŠธ, ๊ธฐ๋Šฅ ์ œ์•ˆ, ๋ฌธ์„œ ๊ฐœ์„ , ์˜ˆ์ œ ์ถ”๊ฐ€, ๋ฐ์ดํ„ฐ ๋งคํ•‘ ์ˆ˜์ •์ฒ˜๋Ÿผ ์ž‘์€ ๋ณ€๊ฒฝ๋„ dartlab์„ ๋” ์ข‹๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

ํ•œ๊ตญ์–ด์™€ ์˜์–ด ์ด์ŠˆยทPR ๋ชจ๋‘ ํŽธํ•˜๊ฒŒ ์—ด์–ด์ฃผ์„ธ์š”. ์–ด๋””์„œ ์‹œ์ž‘ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด ์ด์Šˆ๋กœ ๋จผ์ € ์ด์•ผ๊ธฐํ•ด๋„ ์ข‹์Šต๋‹ˆ๋‹ค.

๋ผ์ด์„ ์Šค

Apache License 2.0 โ€” ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•˜๋˜, NOTICE ํŒŒ์ผ์˜ ์ถœ์ฒ˜ ํ‘œ๊ธฐ๋ฅผ ํฌํ•จํ•ด์ฃผ์„ธ์š”.

About

Korean DART + SEC EDGAR filings as structured Python data for company analysis

Resources

License

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors

Languages

  • Python 79.8%
  • Svelte 9.9%
  • TypeScript 9.2%
  • CSS 0.6%
  • JavaScript 0.3%
  • Jupyter Notebook 0.1%
  • Other 0.1%