์ข ๋ชฉ์ฝ๋ ํ๋. ๊ธฐ์ ์ ์ ์ฒด ์ด์ผ๊ธฐ.
Korean DART + US SEC EDGAR ๊ณต์๋ฅผ ํ ์ค์ Python ์ผ๋ก ์ฝ๊ณ ๋น๊ตํ๋ค.
๋ฌธ์ ยท Skill OS ยท Skill Market ยท ๋ธ๋ก๊ทธ ยท Colab์์ ์ด๊ธฐ ยท Molab์์ ์ด๊ธฐ ยท English ยท ํ์
์ข ๋ชฉ ํ๋๋ก ์ฌ๋ฌดยท์ฃผ๊ฐยท๊ณต์ยท์ ์ฉยท์ฐ์ ยท๋งคํฌ๋ก๋ฅผ ํ ํ๋ฉด์์ ์ฝ๋ ๋ธ๋ฃธ๋ฒ๊ทธ์ ํฐ๋ฏธ๋์ ๋์ ํ๋ DartLab ํฐ๋ฏธ๋. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ง๋ ๋น๊ต ๊ฐ๋ฅํ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ํ๋ฉด ์์ ์ฌ๋ ธ๋ค.
์ด ํฐ๋ฏธ๋์ @youngchangjo ๋์ ์ค๋ ๋์์ ๋ฐ์ ์๊ฐ์ผ๋ก ์์๋์ต๋๋ค.
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 ์ ๊ฐ์ ๋ถ์ ์์ง์ ํธ์ถํ๋ค. ์ถ๋ฐ์ ๋ง ๋ค๋ฅผ ๋ฟ ๊ฒฐ๊ณผ๋ ๊ฐ๋ค.
๊ธฐ์
์ด๋ฆ์ด๋ ์ข
๋ชฉ์ฝ๋๋ฅผ ๋ฃ๊ณ ์์ฐ์ด๋ก ๋ฌผ์ด๋ณด๋ฉด, PC์ ์ค์น๋ Codex CLI, Claude Code, Cline ์ค ํ๋๊ฐ DartLab MCP์ Company, analysis, credit, scan, macro ๋๊ตฌ๋ฅผ ์คํํ๋ค. ๋ก๊ทธ์ธยท๋ชจ๋ธยท๋ํ ์๋ฌธ์ ํด๋น agent CLI๊ฐ ์์ ํ๊ณ DartLab์ ๊ณ์ฐ ๊ฒฐ๊ณผ์ ์ถ์ ๊ฐ๋ฅํ ref๋ง ์ฐ๊ฒฐํ๋ค.
import dartlab
dartlab.ask("์ผ์ฑ์ ์ ์ฌ๋ฌด๊ฑด์ ์ฑ ๋ถ์ํด์ค")
# ์ค์น๋ agent๊ฐ DartLab MCP๋ก ๊ณ์ฐํ๊ณ ๊ทผ๊ฑฐ ref๋ฅผ ํจ๊ป ๋ฐํ# ์
์ค ์ด๋ฏธ ์ฐ๋ agent ํ๋๋ฅผ ์ค์นํ๊ณ ํด๋น CLI์์ ๋ก๊ทธ์ธ
npm install -g @openai/codex
codex login
# DartLab์ด ์ค์นยท๋ฒ์ ยทMCP ์ํ๋ฅผ ํ์ธ
dartlab agent status --refresh
# ๋ช
๋ น์ ๋จผ์ ๊ฒํ ํ๊ณ , ์ถ๋ ฅ๋ digest๋ฅผ ๋ถ์์ ๋๋ง MCP ์ค์ ์คํ
dartlab agent connect codex
dartlab agent connect codex --approve-digest <์ถ๋ ฅ๋-digest>AI ๊ฒฝ๋ก์ ์ฅ์ :
- ๋ถ์ ํ๋ฆ์ ์ง์ ์ค๊ณ: ์ง๋ฌธ์ ๋ง์ถฐ ๊ณต์, ์ฌ๋ฌด์ ํ, ์ ์ฉ, ๋งคํฌ๋ก, peer ๋น๊ต ๋๊ตฌ๋ฅผ ์กฐํฉํ๋ค.
- ์ซ์ ๊ฒ์ฐ ๊ฐ๋ฅ: ๋ต๋ณ ์ ์ซ์์ ํ๋ ์คํ ๊ฒฐ๊ณผ ref์ ์ฐ๊ฒฐ๋๋ค.
- ๊ณต์ ๋ณธ๋ฌธ์ ๋ฐ์ดํฐ๋ก๋ง ์ฒ๋ฆฌ: DART/EDGAR/์น ๋ณธ๋ฌธ ์์ ์ง์๋ ๋ฐ๋ฅด์ง ์๊ณ ๋ถ์ ๊ทผ๊ฑฐ๋ก๋ง ์ด๋ค.
- ๋ด ๊ณ์ ๊ทธ๋๋ก ์ฌ์ฉ: DartLab์ ๋ชจ๋ธ API key๋ OAuth token์ ์ ๋ ฅํ์ง ์๋๋ค.
- ๋ณต๊ตฌ ๋์์ด ํ๊ณณ์ ์์: ๋ก์ปฌ UI์ Runtime Center๊ฐ ํ์ง, ์ค์น ๊ณํ, MCP ์ฐ๊ฒฐ, runtime ์ ํ์ ๋ด๋นํ๋ค.
claude mcp add dartlab -- dartlab mcp
codex mcp add dartlab -- dartlab mcpClaude Desktop ยท ์๊ฒฉ SSE ยท ์ ๋ ๊ฒฝ๋ก ์ต์ ์ MCP ์น์ ์ฐธ์กฐ.
์ฝ๋ ๊ฒฝ๋ก๋ Company๊ฐ ์ค์ฌ์ด๋ค. ์ข
๋ชฉ์ฝ๋ ํ๋๋ก ์ฌ๋ฌด์ ํ, ๊ณต์ ๋ณธ๋ฌธ, ์ ํ ๋ณด๊ณ ์, ๋น์จ์ c.panel ๋จ์ผ ํ๋ฉด์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ํธ์ถํ๋ค. c.panel ์ ์ก๋ ์๊ฐ ํญ๋ชฉร๊ธฐ๊ฐ ๊ฒฉ์๊ฐ ๋๋ค.
uv add dartlabimport 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 ๊ฒฐ๊ณผ๋ฅผ ์ฝ๋์์ ์ง์ ๋ค๋ฃฌ๋ค.
์ค์น ํ ์
ธ์์ 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("IS") # ์์ต๊ณ์ฐ์ - finance ์ ๊ทํ (๋ถ๊ธฐ ๊ธฐ๋ณธ)
c.panel("IS", freq="year") # freq๋ก ์ฐ๊ฐ ํฉ์ฐfinance ์ ๊ทํ: XBRL ํ์ค๊ณ์ (snakeId) + ํ๊ธ ํญ๋ชฉ๋ช , ์ ๋จ์ ์ ๋ฐ ์ซ์
![]()
c.panel("is", freq="year") # native ์์ต - ์ฌ์
๋ณด๊ณ ์ ํญ๋ชฉ ๊ทธ๋๋ก (2013~)
c.panel("ratios") # native ์ฌ๋ฌด๋น์จ, 5ํ ํญ๋ชฉ์ผ๋ก ๊ณ์ฐ์๋ฌธ์=native: ์ฌ์ ๋ณด๊ณ ์ ํญ๋ชฉ ๊ทธ๋๋ก, XBRL ์ด์ ๊น์ง ๋ฟ๋ ๊น์ history (2013~)
![]()
c.panel("์ฌ์
") # ์ฌ์
๊ฐ์ ๋ฑ ๊ณต์ ๋ณธ๋ฌธ ํ ๊ฒ์
c.panel.search("์ฌ๊ณ ") # ๋ณธ๋ฌธ ์ ์ฒด ๊ฒ์
c.filings() # ๋ชจ๋ ๋ณด๊ณ ์ - DART ๋ทฐ์ด๋ก ๋ฐ๋ก ์ฐ๊ฒฐ์ฌ์ ๋ณด๊ณ ์๋ถํฐ ๋ถ๊ธฐ๋ณด๊ณ ์๊น์ง, dartUrl๋ก ์๋ฌธ ์ฆ์ ํ์ธ
![]()
# ๊ฐ์ ์ธํฐํ์ด์ค, ๋ค๋ฅธ ๋๋ผ
us = dartlab.Company("AAPL")
us.panel("business")
us.panel("ratios")
# ์์ฐ์ด๋ก ์ง๋ฌธ
dartlab.ask("์ผ์ฑ์ ์ ์ฌ๋ฌด๊ฑด์ ์ฑ ๋ถ์ํด์ค")
# โ AI๊ฐ ์ฝ๋๋ฅผ ์คํํ๋ฉฐ ๋ถ์: "์์
์ด์ต๋ฅ ์ด 8.6%โ21.4%๋ก ๋ฐ๋ฑ..."API ํค ๋ถํ์. HuggingFace์์ ์๋ ๋ค์ด๋ก๋, ๋ก์ปฌ ์บ์๋ก ์ฆ์ ๋ก๋.
dartlab.dataHub๋ ํน์ ์ค์บ๋๋ AI ์ ์ฉ ๋๊ตฌ๊ฐ ์๋๋ค. L1 ์์ฒ, L1.5 ํก๋จ ๋ฐ์ดํฐ,
L2 ๋ถ์ ์์ฐ์ ํ๋์ catalog์ query ๊ณ์ฝ์ผ๋ก ๋ฐ๊ฒฌํ๊ณ ์ธ๋ถ Python, HTTP,
์๋ฎฌ๋ ์ดํฐ๊ฐ ํจ๊ป ์ฐ๋ ๋
๋ฆฝ ๋ฐ์ดํฐ ํ๋ซํผ ์์ง์ด๋ค. Factor store๋ ๋ณ๋ ์ ํ์ด
์๋๋ผ ์ด ์์
๋์ factor projection๊ณผ immutable materialization์ ์กฐํฉํ ์ฌ์ฉ
๋ฐฉ์์ด๋ค.
import dartlab
catalog = dartlab.dataHub(
"catalog",
query={"layers": ["L1", "L1.5", "L2"], "search": "financialFeatures"},
)
first = dartlab.dataHub(
"query",
query={
"requests": [
{
"assetId": "analysis.dartFinancialFeatures",
"requestId": "krListed",
"universe": {"markets": ["KR"], "membership": "listed"},
"projection": {
"kind": "factor",
"measures": [
"financial.revenue",
"financial.operatingMargin",
],
},
"time": {"knownAt": "20260723"},
},
{
"assetId": "analysis.edgarFinancialFeatures",
"requestId": "usListed",
"universe": {"markets": ["US"], "membership": "listed"},
"projection": {
"kind": "factor",
"measures": [
"financial.revenue",
"financial.operatingMargin",
],
},
"time": {"knownAt": "20260723"},
},
],
"budget": {
"maxRows": 100000,
"maxBytes": 64 * 1024 * 1024,
"timeoutMs": 120000,
"maxAssets": 4,
"maxSubjects": 20000,
"maxConcurrency": 2,
},
"materialization": {"mode": "refresh"},
},
)
for page in first.iterPages():
consume(page)์ด ํธ์ถ ํ๋๊ฐ ํ์ฌ ์์ฅ KR 2,661๊ฐ์ US 7,669๊ฐ์ ์์ ์ ๋ฑ๋กํ๋ค. ์ข ๋ชฉ๋ณ API๋ฅผ ํธ์ถ์๊ฐ ๋ฐ๋ณตํ๊ฑฐ๋ ์ ๋ฐ์ดํฐ๋ฅผ ์ฒซ ์๋ต RAM์ ์ฌ๋ฆฌ๋ ๋ฐฉ์์ด ์๋๋ค. ์์ ๋๊ฐ row, byte, time ์ํ ์์์ opaque continuation์ ์๋นํ๊ณ , ์ฑ๊ณตํ์ง ๋ชปํ ์ข ๋ชฉ๋ ๊ตฌ์กฐํ gap๊ณผ coverage์ ๋จ๊ธด๋ค.
Cold refresh๋ terminal generation์ ๋๊ธฐ์ ์ผ๋ก ์์ฑํ๋ฏ๋ก ์ฆ์ ๋ฐํ ๊ฒฝ๋ก๊ฐ ์๋๋ค.
๊ฐ์ DARTLAB_HOME์ ๋ณด๋ ๋ค๋ฅธ ํ๋ก์ธ์ค์ warm reuse์ receipt ๊ธฐ๋ฐ offline์
์ ์ฅ๋ Arrow page๋ฅผ owner์ source ์ฌํธ์ถ ์์ด ์ฝ๋๋ค. ์ธ๋ถ ํ๋ก์ธ์ค๋
DataHubClient ๋๋ AsyncDataHubClient๋ก /api/dataHub/v1 ๊ณ์ฝ์ ํธ์ถํ๊ณ ,
๋ถ์ฐ ๋
ธ๋๋ pull worker๋ก ๊ฐ์ job ledger๋ฅผ ์๋นํ๋ค. ์์ธํ ๊ณ์ฝ์
engines.dataHub์
๋ฐ์ดํฐ ์์
๋ ๊ณ์ฝ์ ์๋ค.
DartLab์ DART์ EDGAR ๊ณต์๋ฅผ ๋น๊ต ๊ฐ๋ฅํ ๊ธฐ์ ๋ฐ์ดํฐ๋ก ๋ฐ๊พธ๊ณ , ๋ค์ฏ ๊ฐ์ ๋ถ์ ๋ ์ฆ๋ก ๊ทผ๊ฑฐ ์๋ ๊ธฐ์ ํ๋จ์ ๋ง๋๋ ์คํ์์ค ๋ฆฌ์์น ์์คํ ์ด๋ค.
๊ณต์ ์๋ฌธ โ Company์ Panel โ ๋ค์ฏ ๋ถ์ ๋ ์ฆ โ Story, Simulate, Ask
โ Scan๊ณผ Screener
- Company์ Panel์ ํ์ฌ๋ง๋ค ๋ค๋ฅธ ๊ณต์ ๋ชฉ์ฐจ์ ๊ณ์ ์ ํญ๋ชฉ๊ณผ ๊ธฐ๊ฐ์ ๊ฒฉ์๋ก ๋ง์ถ๋ค.
- Scan๊ณผ Screener๋ ๊ฐ์ ์กฐ๊ฑด์ ์ ์ฒด ์์ฅ์ฌ์ ์ ์ฉํ๊ณ , ํต๊ณผ์ ํ๋ฝ ์ด์ ๋ฅผ ํจ๊ป ๋จ๊ธด๋ค.
- ๋ค์ฏ ๋ถ์ ๋ ์ฆ๋ ์๋ก ๋ค๋ฅธ ์ง๋ฌธ์ ๋ ๋ฆฝ์ ์ผ๋ก ๋ตํ๋ค. ํ๋์ ์ข ํฉ์ ์๋ก ํฉ์น์ง ์๋๋ค.
- Story, Simulate, Ask๋ ๋ ์ฆ๊ฐ ๋ง๋ ๊ฒฐ๋ก ๊ณผ ๊ทผ๊ฑฐ๋ฅผ ์ฌ๊ณ์ฐํ์ง ์๊ณ ์กฐ์ฌ ๋ชฉ์ ์ ๋ง๊ฒ ์กฐํฉํ๋ค.
๊ฐ ๋ ์ฆ์ ๋ํ ๊ฒฐ๊ณผ์๋ conclusion, drivers, evidence, confidence, gaps, falsifiers, asOf, dataAsOf๊ฐ ๊ฐ์ ๋ฌธ๋ฒ์ผ๋ก ๋ค์ด๊ฐ๋ค. confidence.score๋ ์์ต๋ฅ ์์ธก ํ๋ฅ ์ด ์๋๋ผ ํด๋น ํ๋จ์ ํ์ํ ๊ทผ๊ฑฐ ์ถฉ์กฑ๋๋ค. ์ธ๋ถ ์ถ์ ๊ทธ๋๋ก ๊ณต๊ฐ๋๋ฉฐ, ๋ํ ํธ์ถ์์ ์์ํด ํ์ํ ๊ทผ๊ฑฐ๊น์ง ๋ด๋ ค๊ฐ ์ ์๋ค.
| ๋ ์ฆ | ๋ตํ๋ ์ง๋ฌธ | ๋ํ ํธ์ถ |
|---|---|---|
| Analysis | ์ด ํ์ฌ์ ์ฌ์ , ์ด์ต, ํ๊ธ, ์๋ณธ๋ฐฐ๋ถ๊ณผ ๊ฐ์น๋ ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋๋๊ฐ? | c.analysis("์ข
ํฉํ๊ฐ") |
| Credit | ์ด ํ์ฌ๋ ๋น์ ๊ฐ๋นํ ์ ์๊ณ , ๋ฌด์์ด ๋ฑ๊ธ์ ๊นจ๋๊ฐ? | c.credit("๋ฑ๊ธ", detail=True) |
| Industry | ์ด ํ์ฌ๋ ๊ฐ์น์ฌ์ฌ ์ด๋์ ์๊ณ , ์ด์ต ํ๊ณผ ๋น๊ต๊ธฐ์ ์ ๋๊ตฌ์ธ๊ฐ? | c.industry() |
| Quant | ๊ณต์ ํ๋๋ฉํธ ๋ณํ์ ์์ฅ ๊ธฐ๋, ๊ฐ๊ฒฉ ๋ฐ์ ์ฌ์ด์ ๊ดด๋ฆฌ๊ฐ ์๋๊ฐ? | c.quant("๊ดด๋ฆฌ") |
| Macro | ๊ฑฐ์ ๋ณํ๊ฐ ์ด๋ค ๊ฒฝ๋ก๋ก ์ด ํ์ฌ์ ์ฌ๋ฌด์ ๊ฐ์น์ ์ ๋ฌ๋๋๊ฐ? | c.macro("์ ํ") |
Industry์ Company ๋ํ ํธ์ถ์ ํ์ฌ ๊ฒ์ฆ๋ DART ๊ฐ์น์ฌ์ฌ taxonomy๊ฐ ์๋ ํ๊ตญ ๊ธฐ์
์ ๋์์ผ๋ก ํ๋ค. EDGAR ๊ธฐ์
์ Story์ ๊ณต๊ฐ ๋ ์ฆ bundle์์ ๊ฐ์ง ์ฐ์
๋งคํ ๋์ blocked ๊ฒฐ์๊ณผ ์ฌ์ ๋ฅผ ๋ฐํํ๋ค.
analysis = c.analysis("์ข
ํฉํ๊ฐ")
credit = c.credit("๋ฑ๊ธ", detail=True)
industry = c.industry()
quant = c.quant("๊ดด๋ฆฌ")
macro = c.macro("์ ํ")
print(analysis["product"]["conclusion"])
print(credit["product"]["gaps"])
print(macro["product"]["time"])product๋ ๊ธฐ์กด ์์ง ๊ฒฐ๊ณผ์ ์ถ๊ฐ๋๋ ๊ณตํต ์ธํผ๋ค. ๊ธฐ์กด ๋ฑ๊ธ, ๋น์จ, ๊ฐ์น์ฌ์ฌ, ๊ธฐ์ ์งํ์ ์ ํ ๊ฒฝ๋ก๋ ๊ทธ๋๋ก ์ ์ง๋๋ฏ๋ก ์ธ๋ถ ๋ถ์ ๋ฅ๋ ฅ์ ์จ๊ธฐ์ง ์๋๋ค.
| ์์ | ํ๋ ์ผ | ๋ํ ํธ์ถ |
|---|---|---|
| Story์ Report | ํ์ํ ๋ ์ฆ์ ๋ ๋ฆฝ ๊ฒฐ๋ก , ๊ทผ๊ฑฐ, ํ๊ณ๋ฅผ ํ ๋ณด๊ณ ์์ ๋ฐฐ์น | c.story(type="full") |
| Simulate | ๊ฒฐ์ ๋ก ์๋๋ฆฌ์ค์ ๋ ์ฆ ๊ฐ์ ์ ํ๋์ ๊ฐ์ ์์ฅ์ผ๋ก ์ถ์ | c.simulate(scenario="adverse") |
| Ask | ๋ ์ฆ ๊ฒฐ๋ก ๊ณผ ๊ธฐ์ค์์ ์ valueRef, dateRef๋ก ์ธ์ฉํด ์ค๋ช
|
dartlab.ask("์ผ์ฑ์ ์ ํ๋ฐฉ ์ํ์ ๊ทผ๊ฑฐ์ ํจ๊ป ๋ถ์ํด์ค") |
| Scan๊ณผ Screener | ์ ์ฒด ์์ฅ์ฌ์ ๊ฐ์ ์กฐ๊ฑด์ ์ ์ฉํ๊ณ ์ ์ธ ์ด์ ๋ฅผ ์ค๋ช | dartlab.scan("screen", "resilientCompounders", explain=True) |
Story JSON๊ณผ ReportModel์ ๋ ์ฆ๋ณ ์๋ฌธ์ lensProducts์ ๋ณด์กดํ๋ค. ๋ ์ฆ ๊ฐ ๋จ์ผ ๋ฑ๊ธ์ ๋ง๋ค์ง ์์ผ๋ฉฐ, usable, partial, blocked ์ํ์ ๋ฐ์ดํฐ ๊ฒฐ์์ ๊ทธ๋๋ก ๋
ธ์ถํ๋ค.
์ค๊ณ: 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" |
ํฌ์๋ถ๋์ฐ ๊ณต์ ๊ฐ์น/์ฅ๋ถ๊ฐ | โ | โ |
์ค๊ณ: engines.scan
์ ์ข ๋ชฉ ๋์ ํก๋จ ๋ถ์. ๊ฑฐ๋ฒ๋์ค, ์ธ๋ ฅ, ์ฃผ์ฃผํ์, ๋ถ์ฑ, ํ๊ธํ๋ฆ, ๊ฐ์ฌ, ๋ด๋ถ์, ์ด์ต์ ์ง, ์ ๋์ฑ, ๋คํธ์ํฌ, ๊ณ์ /๋น์จ ๋น๊ต ๋ฑ.
dartlab.scan("governance") # ์ ์ข
๋ชฉ ์ง๋ฐฐ๊ตฌ์กฐ
dartlab.scan("ratio", "roe") # ์ ์ข
๋ชฉ ROE
dartlab.scan("account", "๋งค์ถ์ก") # ์ ์ข
๋ชฉ ๋งค์ถ์ก ์๊ณ์ด2,500+ ์ข ๋ชฉ์ ๋งค์ถ์ก์ ํ ๋ฒ์: ๋ถ๊ธฐ๋ณ ์๊ณ์ด๋ก ์ฆ์ ๋น๊ต
![]()
์ค๊ณ: 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(์ ํ์ฐ)๋ง ์ด๋ ค ์๋ค.
์ค๊ณ: 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 / fetchNewsgetDefaultGather() ์ฑ๊ธํด์ thread-safe (๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ ๋จ์ผ ์ธ์คํด์ค ๋ณด์ฅ). ์บ์ ํต๊ณยทsource fallback ์ ํธ๋ getCacheStatsSnapshot() ยท DARTLAB_TELEMETRY=stdout ์ผ๋ก ์ถ์ .
์ค๊ณ: engines.analysis
์ด ํ์ฌ์ ์ฌ์ , ์ด์ต, ํ๊ธ, ์๋ณธ๋ฐฐ๋ถ๊ณผ ๊ฐ์น๋ ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋๋๊ฐ?
๋ํ ๊ฒฐ๊ณผ๋ ์ฌ์
, ์ด์ต, ํ๊ธ, ํ๋ณต๋ ฅ, ์๋ณธ๋ฐฐ๋ถ, ๊ฐ์น, ์ํ์ ์ง์ ๊ณ์ฐ์ ํ ํ๋ฆ์ผ๋ก ๋ฌถ๋๋ค. ํ์ ์์ญ์ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ํ๋จ์ ๋ง๊ฑฐ๋ partial๋ก ๋ฎ์ถ๋ฉฐ, ์ธ๋ถ 22์ถ์ ๊ทธ๋๋ก drilldownํ ์ ์๋ค.
result = c.analysis("์ข
ํฉํ๊ฐ")
print(result["product"]["conclusion"])
print(result["product"]["drivers"])
print(result["product"]["gaps"])
c.analysis("์์ต์ฑ") # ์ธ๋ถ ์ถ
c.analysis("ํ๊ธํ๋ฆ") # ์ธ๋ถ ์ถ
c.analysis("๊ฐ์นํ๊ฐ") # ์ธ๋ถ ์ถ์ค๊ณ: engines.credit | ๋ณด๊ณ ์: eddmpython.github.io/dartlab/blog/credit-reports
์ด ํ์ฌ๋ ๋น์ ๊ฐ๋นํ ์ ์๊ณ , ๋ฌด์์ด ๋ฑ๊ธ์ ๊นจ๋๊ฐ?
3-Track ๋ชจ๋ธ(์ผ๋ฐ/๊ธ์ต/์ง์ฃผ), Notch Adjustment, CHS ์์ฅ ๋ณด์ ๊ณผ ๋ณ๋์ฌ๋ฌด ๋ธ๋ ๋ฉ์ผ๋ก dCR ๋ฑ๊ธ์ ๋ง๋ ๋ค. ๋ํ ์ ํ์ ๋ฑ๊ธ๊ณผ ๋ถ๋ํ๋ฅ ๋ฟ ์๋๋ผ ๋์ธ, ๋ช ์์ ๊ฐ์ , ํ๋ฐฉ ์คํธ๋ ์ค์ tripwire๋ฅผ ํจ๊ป ๋ฐํํ๋ค.
79๊ฐ์ฌ ๊ฒ์ฆ: ๋๊ธฐ์ 87% (26/30), ์ค๋ํ 82% (41/50), ์ ์ฒด 70% (55/79, v5.0 ๊ณผ๋ํ๊ฐ ์์ ํ ์ฌ์ธก์ ์์ ). ์ผ์ฑ์ ์ AA+ ์ ํ ์ผ์น. ๊ฒ์ฆ ๋ฐฉ๋ฒ๋ก ์ methodology ์ฐธ์กฐ.
print(c.credit()) # ์ธ๋ถ ์ถ ๊ฐ์ด๋
cr = c.credit("๋ฑ๊ธ", detail=True)
print(cr["grade"]) # dCR-AA+
print(cr["product"]["conclusion"])
print(cr["product"]["scenarios"])
print(cr["product"]["falsifiers"])์ ์ฉ๋ถ์ ๋ณด๊ณ ์ ๋ฐ๊ฐ (credit ์์ฌ + ์ ํ์ฌ ๋์กฐ๊ฐ story 5๋ง์ ์๋ ํตํฉ):
from dartlab.story.publisher import publishReport
publishReport("005930")์ค๊ณ: engines.industry
์ด ํ์ฌ๋ ๊ฐ์น์ฌ์ฌ ์ด๋์ ์๊ณ , ์ด์ต ํ๊ณผ ๋น๊ต๊ธฐ์ ์ ๋๊ตฌ์ธ๊ฐ?
์ฐ์
์ด๋ฆ๋ง ๋ถ์ด๋ ๋ถ๋ฅ๊ธฐ๊ฐ ์๋๋ค. ๊ณต์ ๊ณผ ์ญํ , upstream๊ณผ downstream ๊ด๊ณ, ๋์ข
stage, profit pool๊ณผ ๊ด๊ณ ๊ทผ๊ฑฐ๋ฅผ ํ ์ ํ์ผ๋ก ๋ฐํํ๋ค. ์ง์ ๊ด๊ณ๋ ์ต์ ์ฑ์ด ๋ถ์กฑํ๋ฉด ๊ทธ ๋ฒ์๋ฅผ gaps์ ๋จ๊ธด๋ค.
position = c.industry()
print(position["product"]["conclusion"])
print(position["peers"])
print(position["relationships"])์ค๊ณ: engines.quant
๊ณต์ ํ๋๋ฉํธ ๋ณํ์ ์์ฅ ๊ธฐ๋, ๊ฐ๊ฒฉ ๋ฐ์ ์ฌ์ด์ ๊ดด๋ฆฌ๊ฐ ์๋๊ฐ?
๋ํ ์ ํ์ ๊ณต์ ์ด์ต ๋ณํ, ํก๋จ๋ฉด ์ด์ต ์ํ๋ผ์ด์ฆ ํ๋ก์, ์ค์ ๊ฐ๊ฒฉ ๋ฐ์์ ๋น๊ตํด ๋ฏธ๋ฐ์, ํ์ธ, ๊ณผ์ด, ์ ํ ๋ฐ์ ๋๋ ํ๋จ ๋ณด๋ฅ๋ก ๋ถ๋ฅํ๋ค. ์ค์ ์ ๋๋ฆฌ์คํธ ์ปจ์ผ์์ค๊ฐ ์๋ ๊ฒฝ์ฐ ํ๋ก์๋ฅผ ์ปจ์ผ์์ค๋ก ๊ฐ์ฅํ์ง ์๋๋ค.
gap = c.quant("๊ดด๋ฆฌ")
print(gap["classification"])
print(gap["product"]["conclusion"])
print(gap["product"]["gaps"])
c.quant("ํ๋จ") # ์ธ๋ถ ๊ฐ๊ฒฉ ํ๋จ
c.quant("๋ฒ ํ", benchmarkMode="sector")์ค๊ณ: engines.macro
๊ฑฐ์ ๋ณํ๊ฐ ์ด๋ค ๊ฒฝ๋ก๋ก ์ด ํ์ฌ์ ์ฌ๋ฌด์ ๊ฐ์น์ ์ ๋ฌ๋๋๊ฐ?
๋ํ ์ ํ์ ์ต์ ๊ฑฐ์ ๊ด์ธก์์ ์ฐ์ ๋ ธ์ถ, ํ์ฌ ์ฌ๋ฌด ๊ทผ๊ฑฐ, ๊ฐ์น ๋ ๋ฒ๊น์ง ์ด์ด์ง๋ edge๋ฅผ ๋ณด์ฌ์ค๋ค. ๊ธฐ์ ์ง์ ๊ทผ๊ฑฐ๊ฐ ์์ผ๋ฉด sector prior ๋๋ template ์ํ๋ก ๋จ๊ฒจ ์์ฅ ํด์๊ณผ ๊ธฐ์ ํด์์ ๊ตฌ๋ถํ๋ค. ์์ฅ ์์ฒด๋ฅผ ์ฝ๋ ์ธ๋ถ ์ถ๋ ๊ทธ๋๋ก ์ ๊ณตํ๋ค.
transmission = c.macro("์ ํ")
print(transmission["product"]["conclusion"])
print(transmission["edges"])
print(transmission["product"]["gaps"])
dartlab.macro("์ฌ์ดํด") # ์์ฅ ๊ตญ๋ฉด
dartlab.macro("๊ธ๋ฆฌ") # ๊ธ๋ฆฌ์ ์์ต๋ฅ ๊ณก์
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%.
์ค๊ณ: engines.story
ํ์ํ ๋ ์ฆ์ ์ ํ ๊ฒฐ๊ณผ๋ฅผ ์ฌ๊ณ์ฐ ์์ด ๊ตฌ์กฐํ ๋ณด๊ณ ์๋ก ์กฐ๋ฆฝํ๋ค. ๊ฐ ๋ ์ฆ์ ๊ฒฐ๋ก , ๊ทผ๊ฑฐ ์ถฉ์กฑ๋, ์์ ๊ณผ ๊ฒฐ์์ ๋ ๋ฆฝ์ ์ผ๋ก ์ ์งํ๋ฉฐ ๋จ์ผ ์ข ํฉ์ ์๋ ๋ง๋ค์ง ์๋๋ค. ์ถ๋ ฅ ํ์์ rich, html, markdown, json ๋ค ๊ฐ์ง๋ค.
story = c.story(type="full")
print(story.lensProducts["analysis"]["conclusion"])
print(story.toMarkdown())
simulation = c.simulate(scenario="adverse")
print(simulation.assumptionLedger)
dartlab.ask("์ผ์ฑ์ ์ ํ๋ฐฉ ์ํ์ ๊ทผ๊ฑฐ์ ํจ๊ป ๋ถ์ํด์ค")์ผ์ฑ์ ์ ๋ณด๊ณ ์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ: "๋งค์ถ +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์ต ํ์๋ค, ๊ทธ๊ฒ ์์์ด์๋ค |
์ ํธ๋ฆฌ์จ ์ด์ผ๊ธฐ ๋ณด๊ธฐ ยท DartLab 30์ด ๋ฐ๋ชจ ยท ์ ํ๋ธ ์ฑ๋ ยท ํ์บ์คํธ (YouTube Music)
์ค๊ณ: 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("ํ์ฌ๊ฐ ๋์ ๋น๋ ธ๋ค") # ์์ฐ์ด๋ ๋์์ค๊ณ: operation.opsAsSkills ยท ๋ฃจํ ๊ฐ์: ์๋จ ํตํฉ ์ํคํ ์ฒ
dartlab.ask("์ผ์ฑ์ ์ ์ฌ๋ฌด๊ฑด์ ์ฑ ๋ถ์ํด์ค")
dartlab.ask("์ผ์ฑ์ ์ ๋ถ์", runtimeId="claude")dartlab setup codex --yes
dartlab invest 005930 --runtime codex์ง์ runtime์ codex, claude, cline์ด๋ค. dartlab setup์ ์ค์น, ๊ณต์ ๋ก๊ทธ์ธ, DartLab MCP ์ฐ๊ฒฐ, ๊ธฐ๋ณธ runtime ์ ํ์ ํ ๋ฒ์ ์น์ธ ํ๋ฆ์ผ๋ก ์๋ฃํ๋ฉฐ ์ด๋ฏธ ๋๋ ๋จ๊ณ๋ ๋ฐ๋ณตํ์ง ์๋๋ค. DartLab์ provider API key, OAuth token, ๋ชจ๋ธ ๋ค์ด๋ก๋๋ฅผ ๊ด๋ฆฌํ์ง ์๋๋ค. CLI ์ค์น์ DartLab MCP ์ฐ๊ฒฐ์ด ๋ชจ๋ ํ์ธ๋ groundedReady runtime๋ง ์คํ๋๋ฉฐ, ๋ฏธ์ฐ๊ฒฐ runtime์ ๋น๊ทผ๊ฑฐ ๋ต๋ณ์ ๋ง๋ค์ง ์๊ณ ์ฐ๊ฒฐ ๊ณํ์ ์๋ดํ๋ค. ํฌ์๋ถ์ ์ ์ฉ dartlab invest๋ ์ค์ฌ๋
ผ์ง, ๋ฐ๋๋
ผ์ง, ๋ฐธ๋ฅ์์ด์
, ์๋๋ฆฌ์ค, ์ด๋งค, ๋ฆฌ์คํฌ์ ๋ค์ ์ ๊ฒ ์์ ์ ๊ฐ์ ๊ทผ๊ฑฐ ๊ณ์ฝ์ผ๋ก ๋ถ์ํ๋ค.
์ง๋ฌธ์ Skill OS์ 241๊ฐ ๊ณต๊ฐ capability๋ฅผ ์ง๋ฌธ๋ณ informationCoverage๋ก ์ขํ๋ค. ์คํ ๊ฐ๋ฅํ 182๊ฐ๋ ๊ตฌ์กฐํ๋ ์คํ ๊ณ์ฝ์ ์ฌ์ฉํ๊ณ reference-only ๊ฒฝ๋ก๋ canonical replacement๋ก ์ฐ๊ฒฐํ๋ค. ๋ต๋ณ์ ํยท๋ฌธ์ยท๊ฐยท๊ธฐ์ค์ผ์ exact ref payload์ ๊ฐยท๊ธฐ๊ฐยท๋์ยท๋ฌธ์ ์ฃผ์ฅ์ด ์ผ์นํ ๋๋ง ๊ณต๊ฐ๋๋ค. ๋ก์ปฌ GUI๋ ๋ต๋ณ์ด ์ค์ ์ฌ์ฉํ ๊ทผ๊ฑฐ, ๋ณด์กฐ ๊ทผ๊ฑฐ, ๋ฏธ์ถฉ์กฑ ๊ทผ๊ฑฐ, artifact์ ์คํ ์์์ฆ์ ๋ถ๋ฆฌํด์ ๋ณด์ฌ ์ค๋ค.
์ค๊ณ: runtime.channel
PC์์ ํ ์ค์ด๋ฉด ํฐ์์ dartlab UI ๊ทธ๋๋ก ์ฌ์ฉ. Microsoft DevTunnels ์๋ ์ ์ .
dartlab channelํ๋ฆ:
- winget์ผ๋ก devtunnel CLI ์๋ ์ค์น (์ต์ด 1ํ)
- GitHub OAuth 1ํ ์ธ์ฆ (๋ธ๋ผ์ฐ์ ์๋ ์คํ)
- ์๊ตฌ URL + QR ๋ฐ๊ธ (
https://<id>-8400.<region>.devtunnels.ms) - ํฐ Chrome์ URL/QR ์ ๋ ฅ โ dartlab UI ๊ทธ๋๋ก ๋์
๋๋ฉ์ธ 0๊ฐ, ํ ํฐ ํธ๋ฆญ 0๊ฐ. VS Code Remote Tunnels์ ๋์ผ ์ธํ๋ผ๋ผ ๋ชจ๋ฐ์ผ ํธํ์ฑ ๊ฒ์ฆ๋จ. ๋ฉ์์ง ๋ด ์ต์
(--telegram/slack/discord) ๋ ์ง์.
๊ฐ์ ์ธํฐํ์ด์ค, ๋ค๋ฅธ ๋ฐ์ดํฐ ์์ค. 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 ์๋ฒ ๋ด์ฅ. ์ธ๋ถ LLM์ tools/list๊ฐ ๊ด๊ณ ํ๋ canonical ๋๊ตฌ๋ง ํธ์ถํ๋ฉฐ, ๋จ์ผ ๊ณต๊ฐ API๋ EngineCall, ์ฌ๋ฌ ๊ฒฐ๊ณผ์ ๊ฒฐํฉยท๊ฐ๊ณต๋ง RunPython์ ์ฌ์ฉํฉ๋๋ค.
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-B. Claude Code ํ ์ค ์ค์
claude mcp add dartlab -- dartlab mcp
# 2-C. Codex CLI
codex mcp add dartlab -- dartlab mcpdartlab ๋ช
๋ น์ด 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.
{
"mcpServers": {
"dartlab": {
"url": "https://eddmpython-dartlab.hf.space/mcp/sse"
}
}
}HuggingFace Spaces ํธ์คํ . DART API ํค ๋ถํ์. Claude Desktop ๋ฐ์คํฌํฑ ์ฑ์ stdio ๋ง ๋ฐ์ผ๋ฏ๋ก ์ด URL ๋ฐฉ์์ reject ํฉ๋๋ค. ์ stdio ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ์ธ์.
์ค์ ์ด๋ฆยท์คํค๋งยท์คํ ๊ถํ์ ์ ๋ณธ์ ์๋ฒ์ tools/list์
๋๋ค. ์๋๋ ์ญํ ๋ณ ์์ฝ์ด๋ฉฐ, ๋ชฉ๋ก์ ์๋ legacy alias๋ AI ๋ด๋ถ ๋๊ตฌ๋ ์ง์ ํธ์ถํด๋ tool_not_advertised๋ก ๊ฑฐ๋ถ๋ฉ๋๋ค.
| ๋๊ตฌ | ์ญํ |
|---|---|
| ask | dartlab chat-native ๋ฃจํ: LLM ์์จ ๋๊ตฌ ํธ์ถ + Ref ๊ฒ์ฐ ์ผ๊ด |
| ReadSkill / GetSkillBody / ReadSkillMarket | ๊ณต์ Skill OS ๊ฒ์ยท๋ณธ๋ฌธ ์กฐํยท์ธ๋ถ ๋ง์ผ ๋ณด์ |
| ReadCapability | dartlab ๊ณต๊ฐ API/docstring ๊ฒ์ |
| EngineCall | capability ๊ฒฐ๊ณผ ์ค engineCallable=true์ธ ๋จ์ผ ๊ณต๊ฐ API ํธ์ถ |
| RunPython | dartlab + Polars ์ฝ๋ ์คํ โ executionRef/valueRef/tableRef |
| Read / WebSearch / ExternalReachDoctor | ๋ก์ปฌ ๋ฌธ์ยท์ธ๋ถ ์ต์ ์ ๋ณดยท์ฐ๊ฒฐ ์ํ ํ์ธ |
| SaveArtifact / CompileVisual / CreateUserSkill | ์ฐ์ถ๋ฌผยท์๊ฐํยท์ฌ์ฉ์ ์คํฌ ์์ฑ |
| PeerCompareN / DCFValuation / CompileFinancialDashboard | ๋น๊ตยท๊ฐ์นํ๊ฐยท์ฌ๋ฌด ๋์๋ณด๋ |
| RegressionForecast / SensitivityAnalysis / CreditScorecard | ์์ธกยท๋ฏผ๊ฐ๋ยท์ ์ฉ ๋ถ์ |
| ScenarioCompareN / ScenarioOverlay / SearchPastSessions | ์๋๋ฆฌ์คยท๊ณผ๊ฑฐ ์ธ์ ์กฐํ |
์ generated ๋๊ตฌ(
companyAnalysis/companyStory/marketScan๋ฑ)๋ 0.10๋ถํฐ ํ๊ธฐ๋์ต๋๋ค. ๋จ์ผ ํธ์ถ์EngineCall({"apiRef": ..., "args": {...}}), ๋ค๋จ ๊ฒฐํฉยท๊ฐ๊ณต๋งRunPython์ผ๋ก ์ฎ๊ธฐ์ธ์. ๋ง์ด๊ทธ๋ ์ด์ ์ CHANGELOG ์ฐธ์กฐ.
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 ์ฐ๊ธฐ (Pyodide)
Pyodide๊ฐ CPython์ WebAssembly๋ก ํฌํ ํ ๋์ ํ์ด์ฌ์ด ์ค์น๋์ง ์์ ํ๊ฒฝ์์๋ dartlab์ด ๊ทธ๋๋ก ๋๋ค. ๊ฐ์ API, ๊ฐ์ ๋ฐ์ดํฐ.
์ง์ ํ๊ฒฝ: xlwings Lite (Excel) ยท Anaconda Code (Excel) ยท JupyterLite ยท Google Colab WASM ๋ฐํ์ ยท marimo (pyodide) ยท ์์ HTML ์๋ฒ ๋.
๐ ์น ์์ ์์ ๋ฐ๋ก ์ด์ด๋ณด๊ธฐ: OneDrive ๊ณต์ ์ํฌ๋ถ: xlwings Lite + dartlab ์ธํ ์๋ฃ. ๋ฒํผ๋ง ๋๋ฅด๋ฉด ์ํธ์ ์ฌ๋ฌด์ ํ๊ฐ ์ฐํ๋ค.
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 = data2. @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๊ฐ ์์
๋ค์ดํฐ๋ธ ํจ์๋ก ๋์ํ๋ค. ์ข
๋ชฉ์ฝ๋๋ฅผ ๋ฐ๊พธ๋ฉด ์
์ฌ๊ณ์ฐ์ผ๋ก ์ ๋ถ ๊ฐฑ์ ๋๋ค.
import micropip
# ํ ์ค์ด๋ฉด ๋. deps(diff-match-patchยทopenpyxl ๋ฑ)์ ๋นํธ์ธ C ํ์ฅ์ wheel ๋ฉํ๋ฐ์ดํฐ ๋ง์ปค๋ก ์๋ ํด์.
await micropip.install("dartlab")
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() |
โ | ์ค์นํ agent CLI์ ๋ก์ปฌ process๊ฐ ํ์ |
dartlab.scan() |
โ | ์ฌ์ ๋น๋ parquet 271MB (๋ธ๋ผ์ฐ์ ๋นํ์ค์ ) |
dartlab.gather() |
โ | NaverยทYahooยทGoogle News CORS ์ฐจ๋จ |
์ค๋ ๋ ์์ ยท MEMFS ํ๋ฐ ยท CORS ๋ฏธํ์ฉ API ๋ถ๊ฐ: ์ด ์ธ ์ ์ฝ์ด ๊ทผ๋ณธ์ด๋ค. ์์ธ์ ๋น๋ ํ์ดํ๋ผ์ธ์ pyodide/README.md, ์ค์น 5๋จ๊ณ ์คํฌ๋ฆฐ์ท์ ๋ธ๋ก๊ทธ ๊ธ์ ๋ณธ๋ค.
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ยทAgent Runtime ํธ์คํธ๊ฐ ํจ๊ป ๋ค์ด์จ๋ค |
๋ถ์ ๋๊ตฌ์ "์ด๊ฒ๋ ์ค์นํ์ธ์" ๊ฐ ๋์ ๋๋ฉด ์ฒซ ์ฌ์ฉ๊น์ง ๋ง์ฐฐ์ด ๋์ด๋๋ค. ๋ชจ๋ธ ์คํ์ ์ฌ์ฉ์์ ์ค์นํ agent๊ฐ ๋งก๊ณ DartLab wheel์ runtime adapter์ ๊ธ์ต ๋ฅ๋ ฅ๋ง ์ ๊ณตํ๋ค. |
| ์ฌ์ ๊ตฌ์ถ ๋ฐ์ดํฐ, API ํค 0 ์ผ๋ก ์์ | Company("005930") ํธ์ถ ์ HuggingFace ์์ ์๋ ๋ค์ด๋ก๋ โ ๋ก์ปฌ ์บ์. DART API ํค๋ ์ฌ์์ง ๋ง ํ์ |
"ํค ๋ง๋ค๊ณ ํ๊ฒฝ๋ณ์ ์ธํ
" ๋จ๊ณ๋ฅผ 1์์ ์ฌ์ฉ ๊ฒฝ๋ก์์ ์ ๊ฑฐ. ํค ๋ฐ๊ธ์ dartlab collect ๊ฐ์ raw ์ฌ์์ง ํ๋ฆ์์๋ง ๋ฑ์ฅ. |
| ๊ณต์ ๋ณธ๋ฌธ์ ๋ฐ์ดํฐ, ์ง์ ์๋ | ์ธ๋ถ ๋ณธ๋ฌธ์ ์ง๋ ฌํ ์ [EXTERNAL CONTENT START - untrusted ...] ๋ง์ปค๋ก ์๋ ๊ฐ์ |
DART/EDGAR/๋ด์ค ๋ณธ๋ฌธ ์์ "์ด์ ์ง์ ๋ฌด์" ๊ฐ์ ํจํด์ด AI ๋์์ ๋ฐ๊พธ์ง ๋ชปํ๋๋ก ์ง๋ ฌํ ๋จ์์ ๊ฐ์ . ๋ง์ปค ์ ์ซ์ยท๋ ์งยท๊ณ ์ ๋ช ์ฌ๋ 1์ฐจ ์ถ์ฒ ์ฌ๊ฒ์ฆ ํ ์ธ์ฉ. |
| AI ์์ง = Bring Your Agent Runtime | Codex app-server, Claude stream-json, ACP๋ฅผ provider-neutral AgentEvent๋ก ์ ๊ทํํ๋ค. ๊ณ ์ graph ์์ด agent๊ฐ Skill OS์ MCP ๋๊ตฌ๋ฅผ ์์จ ์ฌ์ฉํ๋ค. |
์ธ์ฆยท๋ชจ๋ธยทnative session์ CLI์ ๋๊ณ DartLab์ ๊ธ์ต capability, ๊ทผ๊ฑฐ, ๊ถํยทprocess ๊ฒฝ๊ณ์ ์ง์คํ๋ค. |
| ๋ด๋ถ ๋จ๋ฐฉํฅ import | ์ ํ ์ค๋ช ๊ณผ ๋ณ๊ฐ๋ก ์ฝ๋ ํด๋๋ ๋จ๋ฐฉํฅ ์์กด์ ์ ์งํ๋ค | ์์ธํ ๋ ์ด์ด์ ๊ธฐ์ฌ ๊ท์จ์ ARCHITECTURE.md์ ๋๋ค. 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" ๊ฐ๋ ์ธ์ ์ํ ๋ ์ ๋์ผ๋ก ๋ณธ๋ค. ์ธ๋ถ ๊ธฐ์ฌ์๊ฐ "๋ถ์ฑ๋ฅผ ์ค์ด๊ณ ์๋๊ฐ" ๋ฅผ ์๊ณ์ด ํ ํ์ผ์์ ํ์ธ ๊ฐ๋ฅ. |
pip install dartlabimport dartlab
c = dartlab.Company("005930") # HuggingFace ์๋ ๋ค์ด๋ก๋ (์ต์ด ~์์ญ MB, ๋ก์ปฌ ์บ์)
c.panel("IS") # ์์ต๊ณ์ฐ์, ๋ถ๊ธฐ ๊ธฐ๋ณธ์ธ ์ค: API ํค 0, ํ๊ฒฝ๋ณ์ 0. ์๋ฌธ ์ฌ์ฉ์๋ README_EN.md, ๋ค๋ฅธ ์ง์ ๊ฒฝ๋ก (CLI ยท AI ยท MCP) ๋ ์ ์ธ ๊ฐ์ง ์์์ ์ฐธ์กฐ.
๊ธฐ์ฌ๋ ๋ฌด์์ด๋ ํ์ํฉ๋๋ค. ๋ฒ๊ทธ ๋ฆฌํฌํธ, ๊ธฐ๋ฅ ์ ์, ๋ฌธ์ ๊ฐ์ , ์์ ์ถ๊ฐ, ๋ฐ์ดํฐ ๋งคํ ์์ ์ฒ๋ผ ์์ ๋ณ๊ฒฝ๋ dartlab์ ๋ ์ข๊ฒ ๋ง๋ญ๋๋ค.
ํ๊ตญ์ด์ ์์ด ์ด์ยทPR ๋ชจ๋ ํธํ๊ฒ ์ด์ด์ฃผ์ธ์. ์ด๋์ ์์ํ ์ง ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด ์ด์๋ก ๋จผ์ ์ด์ผ๊ธฐํด๋ ์ข์ต๋๋ค.
์ด ์น์ ์ ์ฌ์ฉ๋ฒ์ด ์๋๋ผ ๊ฐ๋ฐ ์ด์ ๊ธฐ๋ก์ด๋ค. DartLab์ ์ฐ๋ ๋ฐ๋ ํ์ ์๊ณ , ๋ฌด์์ ์ฐ์ ๋ง๋ค๊ณ ์ด๋๊ฐ ์ฝํ์ง ํ๋จํ๋ ๊ธฐ์ค์ด๋ค.
DartLab์ ์ค์ ๊ธฐ์ ยท์์ฅยท๊ณต์ ์ง๋ฌธ์ ๊ฐ์ง ์ฌ์ฉ์๊ฐ ์ ์ ์์ง์ ๊ณ์ฐ๊ณผ ์ถ์ฒ๋ฅผ ๊ฑฐ์ณ, ์ค์ค๋ก ๊ทผ๊ฑฐ๋ฅผ ํ์ธํ ์ ์๋ ๋ถ์ ๊ฒฐ๊ณผ์ ๋๋ฌํ๋๋ก ๋๋๋ค.
๋ถ๊ทน์ฑ์ ์ฃผ๊ฐ ๊ฒ์ฆ ์๋ฃ ๋ถ์ ๋ฃจํ(weeklyVerifiedAnalysisLoops) ํ๋๋ง ์ผ๋ค. ์ค์ ์ง๋ฌธ์ด DartLab ์ ์ ์์ง์ ๊ฑฐ์ณ ๊ทผ๊ฑฐ ์๋ ๊ฒฐ๊ณผ๊ฐ ๋๊ณ , ์ฌ์ฉ์๊ฐ ๊ทธ ๊ฒฐ๊ณผ์ ์ ํํ evidence ๋๋ artifact๋ฅผ ์ง์ ํ์ธํ์ ๋๋ง ํ ๊ฑด์ด๋ค. ๋ชจ๋ธ ์๋ต, tool call ์, ํ์ด์ง๋ทฐ, ํ
์คํธ ํต๊ณผ ์๋ ์ธ์ง ์๋๋ค. ํ์ฌ ์ ์ญ ๊ฐ์ ๋ฏธ์ธก์ ์ด๋ฉฐ, ๊ถ์ ์๋ ์ธก์ ์ด ์๊ธฐ ์ ์๋ ์ฑ์ฅ ๋ชฉํ๋ฅผ ๋ง๋ค์ง ์๋๋ค.
์ ์๋ ์ถ๋ณ ์ฑ์๋์ด๋ฉฐ, ์ฌ๋ ๋ฅ๋ ฅ ์ฐจ์ ์ ์์ ์ฐ์ ํ๊ท ์ด๋ค. ๊ฐ ์ฐจ์ 10์ ์ ์ค์ฌ์ฉ ํ๊ฒฝ์์ ๊ทธ ๋ฅ๋ ฅ์ด ๋ฐ๋ณต ๊ฒ์ฆ๋ ์ํ๋ค. ์ ์์ ๊ทผ๊ฑฐ๋ ์ค์ ๋ก ๋๋ ๊ฒ์ดํธ์ ์ค์ธก ์ฌ์ ์ด๋ฉฐ, ์๋์ผ๋ก ์คํ๋์ง ์๋ ๊ฒฝ๋ก๋ ๊ตฌํ๋ผ ์์ด๋ ์ ์๋ก ์ธ์ง ์๋๋ค. ์ฐจ์ ์ ์์ ์๋ฃ ํ์ ์ ์ ๋ณธ์ ๋ถ๊ทน์ฑ skill์ด๋ค. ํ์ฌ ์ด์ ์ 72.0/120, ํ๊ท 6.0/10์ด๋ค.
| ์ฐจ์ | 10์ ์ ์๋ฏธ |
|---|---|
| ๊ทผ๊ฑฐ | ๋ชจ๋ ๊ฒฐ๊ณผ๊ฐ ์ถ์ฒ์ ๊ธฐ์ค์์ ์ ๋ฌ๊ณ , ๊ฒ์ฐ ์ฌ์ ์ด ๋ฐ๋ณต ๊ฒ์ฆ๋๋ค |
| ์ปค๋ฒ๋ฆฌ์ง | ๋ชฉํ ์ ๋๋ฒ์ค(์ ์์ฅ์ฌยท์ ๊ธฐ๊ฐยท์ ํ๋ฉด)๋ฅผ ๋น ์ง์์ด ์ปค๋ฒํ๋ค |
| ๊ฒ์ฆ๊ฐ๋ | ํต์ฌ ํ๋ ์ ๋ถ๊ฐ ์คํจ ๊ฐ๋ฅํ ์๋ ๊ฒ์ดํธ๋ก ๋จ์ธ๋๋ค |
| ์ง๊ด์ฑ | ๋ฐฐ์ธ ๊ฒ ์์ด ์ฒซ ๊ฒฐ๊ณผ๊น์ง ํ ์ค, ์ด๋ฆ๊ณผ ๋ฌธ๋ฒ์ด ์๋ช ํ๋ค |
| ์๋ | ์ฒซ ๊ฒฐ๊ณผ์ ์ฌํธ์ถ์ด ์ฒด๊ฐ ์ฆ์์ด๊ณ ์ค์ธก์น๊ฐ ์๋ค |
| ํจ์จ์ฑ | ์ค๋ณต ๋น๋ 0, ์ฌ๋ณธ 0, ์์ ์์ฐ ์ค์๋ก ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ ์ธ๊ฒ ๋ธ๋ค |
| ์์ ์ฑ | ํ๊ท ๊ฐ๋๊ฐ ์์ฃผํ๊ณ ์คํจ๋ ์ ์งํ ์ํ๋ก ๊ฐ๋ฑ๋๋ค |
| ํ์ ์ฑ | ๊ธฐ์กด ๋์์ด ์ฃผ์ง ๋ชปํ๋ ๋ฅ๋ ฅ์ ์ค์ธก์ผ๋ก ์ฆ๋ช ํ๋ค |
| ์ถ | ๊ทผ๊ฑฐ | ์ปค๋ฒ๋ฆฌ์ง | ๊ฒ์ฆ๊ฐ๋ | ์ง๊ด์ฑ | ์๋ | ํจ์จ์ฑ | ์์ ์ฑ | ํ์ ์ฑ | ์ข ํฉ |
|---|---|---|---|---|---|---|---|---|---|
| Python ๊ณต๊ฐ ๊ณ์ฝ | 8.5 | 8.0 | 8.5 | 8.0 | 7.0 | 7.0 | 8.0 | 8.5 | 7.9 |
| ๋ฐ์ดํฐ ์ธํ๋ผ (HF SSOT) | 8.5 | 8.0 | 8.0 | 8.5 | 7.5 | 8.5 | 8.0 | 7.5 | 8.1 |
| ๋ฏธ๊ตญ (EDGAR) | 7.0 | 4.5 | 5.0 | 7.0 | 5.5 | 6.0 | 5.5 | 6.5 | 5.9 |
| ๋ค์ฏ ๋ถ์ ๋ ์ฆ | 8.0 | 7.0 | 6.5 | 7.5 | 6.5 | 7.0 | 7.0 | 8.0 | 7.2 |
| ๋ฆฌํฌํธยท์คํ ๋ฆฌ | 7.5 | 6.0 | 6.0 | 7.0 | 6.0 | 6.5 | 6.5 | 7.5 | 6.6 |
| ์๋ฎฌ๋ ์ด์ | 6.0 | 4.5 | 5.5 | 5.0 | 5.5 | 5.5 | 5.0 | 6.0 | 5.4 |
| AI ์ํฌ๋ฒค์น (ask) | 8.0 | 7.0 | 6.5 | 8.0 | 6.0 | 6.5 | 7.0 | 8.0 | 7.1 |
| MCP ์๋ฒ | 7.5 | 7.0 | 7.5 | 7.0 | 6.0 | 7.0 | 7.0 | 7.0 | 7.0 |
| Agent Runtime (Bring Your Agent) | 2.0 | 1.5 | 1.0 | 1.5 | 1.0 | 1.5 | 1.0 | 2.5 | 1.5 |
| ํฐ๋ฏธ๋ | 7.0 | 7.5 | 6.5 | 7.0 | 6.5 | 7.5 | 6.5 | 7.0 | 6.9 |
| ๋ ธํธ๋ถยท๋ธ๋ผ์ฐ์ (Pyodide) | 6.5 | 5.5 | 6.0 | 7.5 | 5.5 | 6.5 | 6.0 | 7.5 | 6.4 |
| ๋ถ๊ทน์ฑ ์ธก์ (productOutcome) | 3.0 | 1.5 | 1.0 | 2.0 | 2.0 | 2.5 | 1.5 | 2.5 | 2.0 |
| ์ถ | ํ ์ํ | ๋๋ฌํ ์ํ |
|---|---|---|
| Python ๊ณต๊ฐ ๊ณ์ฝ | 9๊ฐ ๊ณ์ฝ ์์ง(gatherยทscanยทanalysisยทmacroยทquantยทindustryยทcreditยทdataHubยทsimulate)๊ณผ Companyยทstory ํ์ฌ๋๊ฐ dartlab.{engine}("{axis}", ...) ํ ๋ฌธ๋ฒ์ผ๋ก ๋๊ณ , L0~L4 ์ ๊ณ์ธต ์์ ํ ํ์ ์ด ๋๋ฌ๋ค. ๋
ธํธ๋ถยท๋ธ๋ก๊ทธยทSkill OS ์ฝ๋ํ์ค์ ๊ณ์ฝ ์๋ฐ์ AST ๊ฐ๋๊ฐ ๊ธฐ๊ณ ์ฐจ๋จํ๊ณ , ๊ณต๊ฐ API manifest ๋์กฐ์ product smoke๊ฐ CI์์ ๋๋ค. ์ค์ฌ์ฉ์ ์ฌ์ ์ ๋ฐ๋ณต ๊ณ์ธก์ ๋จ์๋ค. |
์ด๋ค ์ง์ ํ๋ฉด์์๋ ๊ฐ์ ๋ฌธ๋ฒ๊ณผ ๊ฐ์ ๊ทผ๊ฑฐ ๋ฌธ๋ฒ์ผ๋ก ๊ณต๊ฐ ๊ณ์ฝ์ด ํธ์ถ๋๋ค. |
| ๋ฐ์ดํฐ ์ธํ๋ผ (HF SSOT) | DART ๊ณต์ ์๋ฌธ ์น์ ยทXBRL ์ฌ๋ฌดยท์ ํ ํญ๋ชฉยท์ ์ข ๋ชฉ ์ค์บ ํ๋ฆฌ๋น๋ยท๊ฐ๊ฒฉยท๊ฑฐ์๊ฐ HuggingFace ๊ณต๊ฐ ๋ฐ์ดํฐ์ ์ผ๋ก ์๊ณ , ๋ฐํ์์ ๋ณ๋ ๋น๋ ์์ด SSOT๋ฅผ ์ง๋ ํด ๋ก์ปฌ ์บ์๋ก ๋๋ค. API ํค 0์ผ๋ก ์ฒซ ๊ฒฐ๊ณผ๊ฐ ๋๋ค. ์์ง์ ์จ๋ผ์ธ, ํ๋ฆฌ๋น๋๋ ์คํ๋ผ์ธ ์ ์ฉ์ผ๋ก ๋ถ๋ฆฌ๋๊ณ offline ๊ฐ๋ 3์ข ์ด CI์์ ๊ฐ์ ๋๋ค. ์ ์ฒด ๊ณต์ ๋ชฉ๋ก์ ์๋ณ parquet๋ก ๋ฐฑํ๋๋ค. ์ ์ ๋ ์๊ฒฐ ์ฌ์ ์ ์๋ ๊ณ์ธก์ ๋จ์๋ค. | ์ ์์ฅ์ฌยท์ ๊ธฐ๊ฐ์ด ๊ณต๊ฐ SSOT์์ ์ฌํ ๊ฐ๋ฅํ๊ฒ ์ด๋ฆฌ๊ณ ์ ์ ๋๊ฐ ๊ณ์ธก๋๋ค. |
| ๋ฏธ๊ตญ (EDGAR) | Company("AAPL")๊ฐ SEC ์๋ณธ ์ ์ถ๋ฌผ์ XBRL์ ์๊ธ ํ์ฑํด ํ๊ตญ๊ณผ ๊ฐ์ ์ธํฐํ์ด์ค(panelยท์ฃผ์ 12ํ ํฝยทratiosยทfilings)๋ก ์ด๋ฆฐ๋ค. ๊ฐ์น์ฌ์ฌ taxonomy๋ ํ๊ตญ ํ์ ์ด๋ผ EDGAR industry๋ ๊ฐ์ง ๋งคํ ๋์ blocked ๊ฒฐ์์ ๋ฐํํ๋ค. ํฐ๋ฏธ๋ ๋๋ฌ ๋ฐฐ์ ์ ์ฌ์ ๋ ฌ ์ค์ด๊ณ ๊ฐ๊ฒฉยท์ง์ ๊ตฌ์กฐ๋ง ํ์ ๋๋ค. |
๋ฏธ๊ตญ ์ข ๋ชฉ์ด ํ๊ตญ๊ณผ ๊ฐ์ ํฐ๋ฏธ๋ยท๋ ์ฆ ์ฌ์ ์ผ๋ก ์ด๋ฆฐ๋ค. |
| ๋ค์ฏ ๋ถ์ ๋ ์ฆ | analysisยทcreditยทindustryยทquantยทmacro๊ฐ conclusionยทdriversยทevidenceยทconfidenceยทgapsยทfalsifiersยทasOf ๊ณตํต ๋ฌธ๋ฒ์ product ์ธํผ๋ก ๋๊ณ , ๋จ์ผ ์ข ํฉ์ ์๋ฅผ ๋ง๋ค์ง ์์ผ๋ฉฐ ๊ฒฐ์์ usableยทpartialยทblocked๋ก ๊ทธ๋๋ก ๋ ธ์ถํ๋ค. credit์ 79๊ฐ์ฌ ์ค์ธก ๊ฒ์ฆ(๋๊ธฐ์ 87%, ์ ์ฒด 70%)์ด ์๋ค. ๋ ์ฆ ๊ฒฐ๋ก ์ ์ค์ฌ์ฉ ๋ฐ๋ณต ๊ฒ์ฆ๊ณผ v5.0 ์ฌ์ธก์ ์ ๋จ์๋ค. | ๊ฐ ๋ ์ฆ๊ฐ ์ค์ ์ง๋ฌธ์์ ๋ฐ๋ณต ๊ฒ์ฆ๋ ๊ทผ๊ฑฐ ์ถฉ์กฑ๋๋ก ๋ตํ๋ค. |
| ๋ฆฌํฌํธยท์คํ ๋ฆฌ | c.story() 6๋ง ์์ฌ์ Company.reportModel ๊ณต๊ฐ ๊ณ์ฝ, ํ๋ก ๋ฆฌํฌํธ emitter๊น์ง ์๊ฒฐ๋๊ณ ๋ฐ๊ฐ ํ์ดํ๋ผ์ธ์ผ๋ก ๊ธฐ์
์ด์ผ๊ธฐ 10ํธ์ด ๋ธ๋ก๊ทธ์ ์ค๋ฐ๊ฐ๋๋ค. ๋๋ฉ์ด ๊ฐ์ ๋ชจ๋ธ์ ์๋นํ๋ ๋จ๊ณ๋ ์ด์์ ๊ฒฐ์ ๋๊ธฐ๋ค. |
ํ์ฌ ํ๋์ ์ ์ฒด ์ด์ผ๊ธฐ๊ฐ ๋ฆฌํฌํธ๋ก ๋์ค๊ณ ๋ชจ๋ ํ๋ฉด์ด ๊ฐ์ ๋ชจ๋ธ์ ์๋นํ๋ค. |
| ์๋ฎฌ๋ ์ด์ | dartlab.simulate ๊ฒฐ์ ๋ก ๋๋ผ์ด๋ฒ DAG ์ฝ์ด๊ฐ ๊ณ์ฝ ์์ง์ผ๋ก ๋๊ณ ๊ฐ์ ์์ฅ์ ๋จ๊ธด๋ค. ๊ฑฐ์ ์๋ฎฌ๋ ์ด์
์์ง์ ์๊ฒฐ๋๋ค(ํ์ฌ๋จ ๊ฑฐ์ ์ฌ๋ฌด ๋ธ๋ฆฌ์ง๋ ๋ฐ์ดํฐ ๋ฒฝ์ผ๋ก ๋ฏธ๋น๋ ํ์ ). Play UIยทfan ์ฐจํธ์ ์๋๋ฆฌ์ค ์ค์ฌ์ฉ ์ฌ์ ์ ๋ฏธ์์ด๋ค. |
์๋๋ฆฌ์ค๊ฐ ์ฌํ ๊ฐ๋ฅํ๊ฒ ๋๊ณ ๊ฒฐ๊ณผ๋ฅผ ํฐ๋ฏธ๋์์ ๋ง์ง๋ค. |
| AI ์ํฌ๋ฒค์น (ask) | dartlab.ask๊ฐ chat-native ์์จ tool calling์ผ๋ก ๋๊ณ , 241๊ฐ capability์ ์ง๋ฌธ๋ณ coverage์ 182๊ฐ ์คํ ๊ณ์ฝ์ ์ฌ์ฉํ๋ค. ์ซ์ยท๊ธฐ๊ฐยท๋น๊ต์ถยท๊ฐ์ฌ ์ฃผ์ฅ์ exact ref payload๋ก ๊ฒ์ฐ๋๊ณ ๋ถ์ผ์น๋ ๊ณต๊ฐ ์ ์ ์คํจํ๋ค. GUI๋ ์ฌ์ฉ ๊ทผ๊ฑฐ์ ๋ณด์กฐ ๊ทผ๊ฑฐ, ๊ฒฐ์, artifact, ์ฌ์ฉ์ exact ํ์ธ์ ๋ถ๋ฆฌํ๋ค. ์ ์ญ ์ฃผ๊ฐ ๋ถ๊ทน์ฑ ๋ถ์๋ ์์ง ๋ฏธ์ธก์ ์ด๋ค. |
์ง๋ฌธ ํ๋๊ฐ ๊ฒ์ฆ ์๋ฃ ๋ถ์ ๋ฃจํ ํ ๊ฑด์ผ๋ก ๋๋๋ค. |
| MCP ์๋ฒ | tools/list๊ฐ ๊ด๊ณ ํ๋ canonical ๋๊ตฌ๋ง ์คํ๋๊ณ , ๋จ์ผ ํธ์ถ์ EngineCall allowlist, ๋ค๋จ ๊ฐ๊ณต๋ง RunPython์ผ๋ก ๋ถ๋ฆฌ๋๋ค. ์ generated ๋๊ตฌ 33์ข
์ 0.10์์ ํ๊ธฐ๋๊ณ agent์ MCP์ ๋๊ตฌ ๋ชฉ๋ก ๋๋ฆฌํํธ๋ ๋จ์ผ SSOT๋ก ๊ธฐ๊ณ ๋์กฐ๋๋ค. stdio์ ์๊ฒฉ SSE ๋ ๋ค ์ฐ๋ค. ์ธ๋ถ LLM ์ค์ฌ์ฉ์ ๋ฐ๋ณต ๊ฒ์ฆ์ ๋จ์๋ค. |
์ธ๋ถ LLM์ด ๊ฐ์ ๊ณ์ฝยท๊ฐ์ ๊ทผ๊ฑฐ ๋ฌธ๋ฒ์ผ๋ก DartLab์ ์ด๋ค. |
| Agent Runtime (Bring Your Agent) | ์ค์น๋ CLI๋ฅผ ์ฐ๋ runtime์ด ๊ตฌํ๋๋ค. Claude์ Codex ์ค์ ask๊ฐ ReadSkillยทEngineCall์ ํธ์ถํด ์ ๋ยท๊ธฐ์
๋น๊ตยท๊ฐ์ฌ ๋ฌธ์ ์ง๋ฌธ์ exact ref ๋ต๋ณ์ ๋ฐํํ๊ณ , local GUI SSE๋ ๊ฐ์ ๊ณ์ฝ์ ์์ฃผํ๋ค. ์ญ์ฌ ์์ ์
๋ ฅ์ด ๋ถ์กฑํ ๊ธฐ์
์๋ฎฌ๋ ์ด์
์ ์ซ์๋ฅผ ๋ง๋ค์ง ์๊ณ partial๊ณผ ๊ฒฐ์์ ๋ฐํํ๋ค. Cline embedded๋ ํ์ฌ ACP๊ฐ session MCP๋ฅผ ๋
ธ์ถํ์ง ์์ fail-closed๋ค. ์ ์๋ ์ฃผ๊ฐ review ์ ๊น์ง ์ ์งํ๋ค. |
์ฌ์ฉ์์ ์ค์น๋ agent๊ฐ DartLab ์์ ๋์์ ๊ฒ์ฆ ๋ฃจํ๋ฅผ ๋ฐ๋ณต ์์ฃผํ๋ค. |
| ํฐ๋ฏธ๋ | ๊ณต๊ฐ ํฐ๋ฏธ๋์ด ์ ์์ฅ์ฌ๋ฅผ ์ปค๋ฒํ๊ณ ์ฌ๋ฌดยท์ฃผ๊ฐยท๊ณต์ยท์ ์ฉยท์ฐ์ ยท๋งคํฌ๋ก๋ฅผ ํ ํ๋ฉด์ ์ฌ๋ฆฐ๋ค. ๋ชจ๋ ๋ฐ์ดํฐ ํธ์ถ์ ๋จ์ผ ์ง์ ์ ๊ณตํต๋ฐฐ์ ์ผ๋ก ์ ๊ฒจ ์๊ณ ๊ฐ๋๊ฐ ์์ฃผํ๋ค. ๋ก์ปฌ ์ฑ์ ๊ณต๊ฐ ๋ฐ๋ฅ์ ์์์งํฉ์ด๋ค. ์คํฌ๋ฆฌ๋ ์ฌ๊ตฌ์ถ์ ๊ตฌํ ์๋ฃ ํ ๋๊ฒ์ ๋๊ธฐ๋ค. ํ๋ฉด ์ ๊ทผ๊ฑฐ ํ์ธ ์ฌ์ ์ ๋ฐ๋ณต ๊ฒ์ฆ์ ๋จ์๋ค. | ์ ๋ฌธ๊ฐ ๊ณ๊ธฐํ์์ ์ง๋ฌธ๊ณผ ๊ทผ๊ฑฐ ํ์ธ์ด ํ๋ฉด ์์์ ๋๋๋ค. |
| ๋ ธํธ๋ถยท๋ธ๋ผ์ฐ์ (Pyodide) | ์ค์น ์์ด xlwings LiteยทJupyterLiteยทmarimoยทColab WASM์์ Companyยทpanelยทanalysisยทcreditยทstoryยทmacro๊ฐ ์คํ๋๊ณ ์์ ์์์ผ๋ก๋ ๋ฟ๋๋ค. scan ํ๋ฆฌ๋น๋ ์ฉ๋๊ณผ gather CORS๋ ๋ธ๋ผ์ฐ์ ๊ฒฝ๊ณ๋ก ๋จ๋๋ค. Colabยทmarimo ๋ ธํธ๋ถ 9์ข ์ด ๊ณ์ฝ ๋ฌธ๋ฒ์ผ๋ก ์ฐ๋ค. ๊ต์ก SSOT๋ ๋ธ๋ก๊ทธ ์ฐ์ฌ๋ค. | ์ค๋ฐ์ดํฐ ์ค์ต์ด ์ค์น ์์ด ๊ต์ก ์์ฌ์ ์ด์ด์ง๋ค. |
| ๋ถ๊ทน์ฑ ์ธก์ (productOutcome) | ๋ก์ปฌ ์ํ ์์ฅ, bounded evidence resolve, exact ref hash ๊ฒ์ฆ์ด ๊ตฌํ๋๋ค. ์ค์ local GUI operator journey์์ 2026Q1 ์ผ์ฑ์ ์ ๋งค์ถ ๊ฐ ๊ทผ๊ฑฐ๋ฅผ ์ด์ด verified=1 ์ ์ด๋ฅผ ํ์ธํ๋ค. ์ด๋ ๋ก์ปฌ ์ค์ฆ์ด๋ฉฐ ์ฃผ๊ฐ cohort๊ฐ ์์ด ์ ์ญ ๊ฐ์ ๊ณ์ ๋ฏธ์ธก์ ์ด๋ค. ์ ์๋ ์ฃผ๊ฐ review ์ ๊น์ง ์ ์งํ๋ค. |
verified ๋ฃจํ๊ฐ ์๋ ๊ณ์๋๊ณ ์ฃผ๊ฐ ๋ฆฌ๋ทฐ๊ฐ ์ด ํ๋ฅผ ์ฌํ์ ํ๋ค. |
๊ฒฐ๊ณผ ์๋ช ์ฃผ๊ธฐ์ ์ฃผ๊ฐ ์ด์ ์ฃผ๊ธฐ์ ํ์ฌ ๊ณ์ฝ์ ๋ถ๊ทน์ฑ skill๊ณผ operation.productCycle์ ์๋ค. ์ ์ ์ฌํ์ ์ ์ฃผ๊ฐ outcome review์์๋ง ํ๋ฉฐ, ๊ทผ๊ฑฐ ์๋ ์ํฅ์ ๋ฌดํจ๋ค. ์ค์ธก๊ณผ ๊ฒ์ดํธ์ ์ฐ๊ฒฐ๋์ง ์์ ์ฐจ์ ์ ์๋ ์ฌํ์ ์์ ์ฐ์ ํํฅ ๋์์ด๋ค.
2026-08-03 Agent Runtime ์ค์ง Ask์์ ์ผ์ฑ์ ์ ์ต๊ทผ 5๊ฐ๋ ๋งค์ถ๊ณผ ์์ ์ด์ต์ 10๊ฐ claim cell์ ๋ชจ๋ ๋ฎ๊ณ ๊ทผ๊ฑฐ commit์ ํ์ธํ๋ค. ์ด ๋จ์ผ ๋ก์ปฌ ์คํ๋ง์ผ๋ก ์ฃผ๊ฐ ์ ์๋ฅผ ์ฌ๋ฆฌ์ง๋ ์๋๋ค. ํ์ฌ ๋์๊ณผ ์ฌ๊ฒ์ฆ ์ ์ฐจ๋ Agent Runtime ์ด์์ ๊ธฐ๋กํ๋ค.
์ฝ๋๋ Apache License 2.0, ๋ฐ์ดํฐ์ ์ CC BY 4.0 ์ ๋๋ค. ์ฌ์ฉยท์์ ยทํฌํฌยท์ฌ๋ฐฐํฌยท์ธ์ฉ ๋ชจ๋ ์์ ๋กญ๊ฒ ํ์ธ์.
ํ ๊ฐ์ง๋ง ๋ถํํฉ๋๋ค. ์ถ์ฒ๋ฅผ ๋จ๊ฒจ์ฃผ์ธ์. dartlab ์ ์ด ํ๋ก์ ํธ์๋ NOTICE ์ Built with dartlab (https://github.com/eddmpython/dartlab) ํ ์ค์, ๊ธ์ด๋ ๋
ผ๋ฌธ์์ ์ธ์ฉํ๋ค๋ฉด CITATION.cff ๋ฅผ ๊ทธ๋๋ก ๋ฌ์์ฃผ๋ฉด ๋ฉ๋๋ค. ๊ทธ๊ฑฐ๋ฉด ์ถฉ๋ถํฉ๋๋ค.







