Dartlab
Turn DART & EDGAR filings into one structured company map โ financials, text, reports aligned across every period. ์ ์๊ณต์ ๋ถ์ Python ๋ผ์ด๋ธ๋ฌ๋ฆฌ
Ask AI about Dartlab
Powered by Claude ยท Grounded in docs
I know everything about Dartlab. Ask me about installation, configuration, usage, or troubleshooting.
0/500
Reviews
Documentation
DartLab
์ข ๋ชฉ์ฝ๋ ํ๋. ๊ธฐ์ ์ ์ ์ฒด ์ด์ผ๊ธฐ.
Korean DART + US SEC EDGAR ๊ณต์๋ฅผ ํ ์ค์ Python ์ผ๋ก ์ฝ๊ณ ๋น๊ตํ๋ค.
๋ฌธ์ ยท ๋ธ๋ก๊ทธ ยท Colab์์ ์ด๊ธฐ ยท Molab์์ ์ด๊ธฐ ยท English ยท ํ์
ํ์ฌ์๋ ์ด์ผ๊ธฐ๊ฐ ์๋ค
์ซ์๋ฅผ ๋์ดํ๋ฉด ๋์๋ณด๋๊ฐ ๋์ง๋ง, ์ซ์์ ์ธ๊ณผ๋ฅผ ์ฐ๊ฒฐํ๋ฉด ์คํ ๋ฆฌ๊ฐ ๋๋ค. DartLab์ ๊ทธ ์คํ ๋ฆฌ๋ฅผ ์ฝ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
์ฌ๋์ด ์ง์ ์ฝ๋๋ค โ ์ข ๋ชฉ์ฝ๋ ํ๋๋ก ์ฌ๋ฌด์ ํ, ๊ณต์, ๋น์จ์ ๊บผ๋ด๊ณ , 6๋ง ์ธ๊ณผ ๊ตฌ์กฐ๋ก "์ ์ด ํ์ฌ์ ๋ง์ง์ด ์ด ์์ค์ธ๊ฐ"๋ฅผ ์ถ์ ํ๋ค. ์ฝ๋ ํ ์ค์ด๋ฉด ๋ฐ์ดํฐ๊ฐ ๋์ค๊ณ , ๊ทธ ๋ฐ์ดํฐ๊ฐ ์ด์ผ๊ธฐ๋ฅผ ๋ง๋ ๋ค.
AI๊ฐ ์ฝ์ด์ค๋ค โ ๊ฐ์ ๋๊ตฌ๋ฅผ AI๊ฐ ์กฐํฉํด์ ์ง๋ฌธ์ ๋ง๋ ๋ถ์ ํ๋ฆ์ ์ค์ค๋ก ์ค๊ณํ๊ณ , ์ฝ๋์ ๊ฒฐ๊ณผ๋ฅผ ํฌ๋ช ํ๊ฒ ๋ณด์ฌ์ค๋ค. ์ฌ์ฉ์๋ ๋ต๋ง ์ป๋ ๊ฒ ์๋๋ผ ๋ถ์ ๋ฐฉ๋ฒ์ ๋ฐฐ์ด๋ค.
๋ ๊ฒฝ๋ก ๋ชจ๋ ๊ฐ์ ์์ง ์์์ ๋์ํ๋ค. ์์ง์ด ๋ค๋ฆฌ๋ค โ ์ฌ๋์ด ๋ง๋ ์์งยท๋ธ๋ก๊ทธ๊ฐ ์๋์ผ๋ก AI ์ skill ์ด ๋๊ณ , AI ๊ฐ ์คํ ์ค ๋ฐ๊ฒฌํ ๊ฐ์ ์ด ์์ง docstringยท๋ธ๋ก๊ทธ๋ก ์ฌ๋ ์์ฐ์ ํ๋ฅํ๋ค (operation.philosophy).
ํฌํฑ ์ง์ ์ :
dartlab.ask("...")โ AI ์ ์ ๊ตฌ. ์์ฐ์ด ํ ์ค.dartlab.Company(code)โ ์ฌ๋์ ์ ๊ตฌ. ์ข ๋ชฉ ํ์ฌ๋ ํ๋๋กc.story()ยทc.analysis(...)ยทc.credit()ยทc.quant()๋ฑ ์ ์์ง ์ ๊ทผ.
๋ฌธ์
์ผ์ฑ์ ์์ "๋งค์ถ์ก"์ 5๋ ๊ฐ ๋น๊ตํ๋ ค๊ณ ํ ์ ์๋๊ฐ?
DART์์ ์ฌ์
๋ณด๊ณ ์๋ฅผ ์ด๋ฉด ๊ฐ์ ์ซ์๊ฐ ifrs-full_Revenue, dart_Revenue, ๋งค์ถ์ก, ์์
์์ต ๋ค ๊ฐ์ง ์ด๋ฆ์ผ๋ก ๋์จ๋ค. ์๋
๊ณผ ์ฌํด์ ๋ชฉ์ฐจ ๊ตฌ์กฐ๊ฐ ๋ค๋ฅด๋ค. SKํ์ด๋์ค์ ๋น๊ตํ๋ ค๋ฉด ๊ฐ์ ์์
์ ์ฒ์๋ถํฐ ๋ค์ ํด์ผ ํ๋ค.
์ง์ง ๋ฌธ์ ๋ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒ ์๋๋ค. ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ๋๋ฌด ๋ง์ ์ด๋ฆ์ผ๋ก ์กด์ฌํ๋ ๊ฒ์ด๋ค.
DartLab์ ํ๋์ ์ ์ ์์ ์ ์๋ค: ๋ชจ๋ ๊ธฐ๊ฐ์ ๋น๊ต ๊ฐ๋ฅํด์ผ ํ๊ณ , ๋ชจ๋ ํ์ฌ๋ ๋น๊ต ๊ฐ๋ฅํด์ผ ํ๋ค. ๊ณต์ ์น์ ์ ํ ํฝ-๊ธฐ๊ฐ ๊ทธ๋ฆฌ๋๋ก ์ ๊ทํํ๊ณ (~95% ๋งคํ์จ), XBRL ๊ณ์ ์ ํ์ค ์ด๋ฆ์ผ๋ก ํต์ผํ๋ค(~97% ๋งคํ์จ) โ ์์์ด ์๋๋ผ ๊ธฐ์ ์ ๋น๊ตํ๋ค.
๋น ๋ฅธ ์์
uv add dartlab
import dartlab
c = dartlab.Company("005930") # ์ผ์ฑ์ ์
c.sections # ๋ชจ๋ topic, ๋ชจ๋ ๊ธฐ๊ฐ, ๋๋ํ
# shape: (41, 12) โ 41๊ฐ ํ ํฝ ร 12๊ฐ ๊ธฐ๊ฐ
# 2025Q4 2024Q4 2024Q3 2023Q4 ...
# companyOverview v v v v
# businessOverview v v v v
# riskManagement v v v v
ํ ์คํธ์ ์ซ์์ ์๊ณ์ด ์ํํ โ ์ ๊ธฐ๊ฐ ๋น๊ต ๊ฐ๋ฅ์ฑ์ ํต์ฌ
![]()
c.show("IS") # ์์ต๊ณ์ฐ์ โ ๋ถ๊ธฐ๊ฐ ๊ธฐ๋ณธ
๋ถ๊ธฐ๋ณ ์ฌ๋ฌด์ ํ๊ฐ ๊ธฐ๋ณธ โ snakeId + ํ๊ธ ํญ๋ชฉ๋ช ๋์ ์ ๊ณต
![]()
c.show("IS", freq="Y") # freq="Y"๋ก ์ฐ๊ฐ ํฉ์ฐ
๊ฐ์ ๋ฐ์ดํฐ, ์ฐ๊ฐ์ผ๋ก โ 4๋ถ๊ธฐ ํฉ์ฐ ์๋ ์ฒ๋ฆฌ
![]()
c.show("businessOverview") # ์ด ํ์ฌ๊ฐ ์ค์ ๋ก ๋ญ ํ๋์ง
c.diff("businessOverview") # ์๋
๋๋น ๋ญ๊ฐ ๋ฐ๋์๋์ง
c.show("ratios") # ์ฌ๋ฌด๋น์จ, ์ด๋ฏธ ๊ณ์ฐ๋จ
c.filings() # ๋ชจ๋ ๋ณด๊ณ ์ โ DART ๋ทฐ์ด๋ก ๋ฐ๋ก ์ฐ๊ฒฐ
์ฌ์ ๋ณด๊ณ ์๋ถํฐ ๋ถ๊ธฐ๋ณด๊ณ ์๊น์ง, dartUrl๋ก ์๋ฌธ ์ฆ์ ํ์ธ
![]()
# ๊ฐ์ ์ธํฐํ์ด์ค, ๋ค๋ฅธ ๋๋ผ
us = dartlab.Company("AAPL")
us.show("business")
us.show("ratios")
# ์์ฐ์ด๋ก ์ง๋ฌธ
dartlab.ask("์ผ์ฑ์ ์ ์ฌ๋ฌด๊ฑด์ ์ฑ ๋ถ์ํด์ค")
# โ AI๊ฐ ์ฝ๋๋ฅผ ์คํํ๋ฉฐ ๋ถ์: "์์
์ด์ต๋ฅ ์ด 8.6%โ21.4%๋ก ๋ฐ๋ฑ..."
API ํค ๋ถํ์. HuggingFace์์ ์๋ ๋ค์ด๋ก๋, ๋ก์ปฌ ์บ์๋ก ์ฆ์ ๋ก๋.
์ธ ๊ฒน์ ๋ถ์
Company๊ฐ ์ข ๋ชฉ์ฝ๋ ํ๋๋ก ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ๋ฉด, ์ธ ๊ฒน์ด ๋ถ์ํ๋ค.
- ๋ถ์ ์์ง โ ์ซ์๋ฅผ ๋ง๋ ๋ค. ๋ง์ง ์ถ์ด, ํ๊ธํ๋ฆ ํจํด, ๋ถ๋ ํ๋ฅ , ์ ์ข ๋น๊ต, ๋งคํฌ๋ก ์ฌ์ดํด. ํด์ํ์ง ์๋๋ค. ์ซ์์ ๊ทผ๊ฑฐ๋ง ์ ๊ณตํ๋ค.
- story โ ์์ง ๋ฐ์ดํฐ๋ฅผ ๋ธ๋ก ๋จ์๋ก ์กฐํฉํ์ฌ ๋ณด๊ณ ์๋ฅผ ๋ง๋ ๋ค. 11๊ฐ์ง ๋ณด๊ณ ์ ํ์ ร 7๊ฐ์ง ๊ธฐ์ ์ ํ ํ ํ๋ฆฟ. ํด์์ ์ ๊ณตํ์ง ์๋๋ค. ๋ค์ํ ๊ด์ ์ ๊ทผ๊ฑฐ๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ๋ฐฐ์นํ๋ค.
- AI โ ์์ง์ ์ง์ ์ฐ๊ณ ํ๋จํ๋ค. ๊ฒฐ๊ณผ๋ฅผ ์์ฌํ๊ณ , ์๋ณธ์ผ๋ก ๊ฒ์ฆํ๊ณ , ์ด์ํ๋ฉด ๊ฐ์ ์ ๋ฐ๊ฟ์ ์ฌ๊ณ์ฐํ๋ค. dartlab์ ๋ํํ๋ ์ ๊ทน์ ๋ถ์๊ฐ.
DartLab์ ๋ฌด์์ธ๊ฐ
ํ๋์ ํธ์ถ ๊ณ์ฝ. dartlab.์์ง() ์ผ๋ก ๊ฐ์ด๋ ๋ณด๊ณ dartlab.์์ง("์ถ") ์ผ๋ก ์คํ.
์ฒ์์ด๋ผ๋ฉด?
CompanyโStoryโAsk์์๋ก. ์ข ๋ชฉ์ฝ๋๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ณ , ๋ณด๊ณ ์๋ฅผ ๋ง๋ค๊ณ , AI์๊ฒ ๋ฌผ์ด๋ณธ๋ค.
| ๋ ์ด์ด | ์์ง | ํ๋ ์ผ | ์ง์ ์ | ๋ ธํธ๋ถ |
|---|---|---|---|---|
| Data | Data | HuggingFace ์ฌ์ ๊ตฌ์ถ, ์๋ ๋ค์ด๋ก๋ | Company("005930") | โ |
| L0/L1 | Company | ๊ณต์ + ์ฌ๋ฌด์ ํ + ์ ํ ๋ฐ์ดํฐ๋ฅผ ์ข ๋ชฉ์ฝ๋ ํ๋๋ก ํตํฉ | c.show(), c.select() | 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 | ๋ณด๊ณ ์ ๋น๋ โ 6์์ง ๋ธ๋ก ์กฐํฉ (analysis/quant/credit/macro/scan/industry), 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({...}) | โ |
Company
์ค๊ณ: engines.company
์ธ ๊ฐ์ง ๋ฐ์ดํฐ ์์ค โ docs(์ ๋ฌธ ๊ณต์), finance(XBRL ์ฌ๋ฌด์ ํ), report(DART API ์ ํ ๋ฐ์ดํฐ) โ ๋ฅผ ํ๋์ ๊ฐ์ฒด๋ก ํตํฉ. HuggingFace์์ ์๋ ๋ค์ด๋ก๋, ์ค์ ๋ถํ์.
c = dartlab.Company("005930")
c.index # ๋ญ๊ฐ ์๋์ง -- topic ๋ชฉ๋ก + ๊ฐ์ฉ ๊ธฐ๊ฐ
c.show("BS") # ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ ค๋ฉด -- topic๋ณ DataFrame
c.select("IS", ["๋งค์ถ์ก"]) # ๋ฐ์ดํฐ๋ฅผ ๋ฝ์ผ๋ ค๋ฉด -- finance๋ docs๋ ๊ฐ์ ํจํด
c.trace("BS") # ์ด๋์ ์๋์ง -- source provenance
c.diff() # ๋ญ๊ฐ ๋ฐ๋์๋์ง -- ๊ธฐ๊ฐ ๊ฐ ํ
์คํธ ๋ณํ
์ฃผ์(Notes) โ BS/IS ์ด์ก ์ด๋ฉด์ ํญ๋ชฉ๋ณ ๋ถํด. c.show("topic")์ผ๋ก ์ฌ๋ฌด์ ํ์ ๊ฐ์ ํจํด์ผ๋ก ์ ๊ทผ. DART(K-IFRS HTML ํ์ฑ)์ EDGAR(US-GAAP XBRL ํ๊ทธ) ๋์ผ ์ธํฐํ์ด์ค.
c.show(...) | ๋ด์ฉ | DART | EDGAR |
|---|---|---|---|
"inventory" | ์์ฌ๋ฃ/์ฌ๊ณตํ/์ ํ ๋ถํด | โ | โ |
"borrowings" | ๋จ๊ธฐ/์ฅ๊ธฐ ์ฐจ์ ๊ธ ๋ถํด | โ | โ |
"tangibleAsset" | ์ ํ์์ฐ ์ทจ๋์๊ฐ/๊ฐ๊ฐ์๊ฐ/์ฅ๋ถ๊ฐ | โ | โ |
"intangibleAsset" | ์์ ๊ถ/๊ฐ๋ฐ๋น ๋ฑ | โ | โ |
"receivables" | ๋งค์ถ์ฑ๊ถ + ๋์์ถฉ๋น๊ธ | โ | โ |
"provisions" | ๋ณด์ฆ/์์ก/๊ตฌ์กฐ์กฐ์ ์ถฉ๋น๋ถ์ฑ | โ | โ |
"eps" | ๊ธฐ๋ณธ/ํฌ์ ์ฃผ๋น์ด์ต | โ | โ |
"segments" | ๋ถ๋ฌธ๋ณ ๋งค์ถ/์ด์ต | โ | โ |
"costByNature" | ์์ฌ๋ฃ/๊ธ์ฌ/๊ฐ๊ฐ์๊ฐ ์ฑ๊ฒฉ๋ณ ๋น์ฉ | โ | โ |
"lease" | ์ฌ์ฉ๊ถ์์ฐ/๋ฆฌ์ค๋ถ์ฑ | โ | โ |
"affiliates" | ๊ด๊ณ๊ธฐ์ ์ง๋ถ๋ฒ ํฌ์ | โ | โ |
"investmentProperty" | ํฌ์๋ถ๋์ฐ ๊ณต์ ๊ฐ์น/์ฅ๋ถ๊ฐ | โ | โ |
Scan โ ์ ์ข ๋ชฉ ํก๋จ ๋น๊ต
์ค๊ณ: engines.scan
์ ์ข ๋ชฉ ๋์ ํก๋จ ๋ถ์. ๊ฑฐ๋ฒ๋์ค, ์ธ๋ ฅ, ์ฃผ์ฃผํ์, ๋ถ์ฑ, ํ๊ธํ๋ฆ, ๊ฐ์ฌ, ๋ด๋ถ์, ์ด์ต์ ์ง, ์ ๋์ฑ, ๋คํธ์ํฌ, ๊ณ์ /๋น์จ ๋น๊ต ๋ฑ.
dartlab.scan("governance") # ์ ์ข
๋ชฉ ์ง๋ฐฐ๊ตฌ์กฐ
dartlab.scan("ratio", "roe") # ์ ์ข
๋ชฉ ROE
dartlab.scan("account", "๋งค์ถ์ก") # ์ ์ข
๋ชฉ ๋งค์ถ์ก ์๊ณ์ด
2,500+ ์ข ๋ชฉ์ ๋งค์ถ์ก์ ํ ๋ฒ์ โ ๋ถ๊ธฐ๋ณ ์๊ณ์ด๋ก ์ฆ์ ๋น๊ต
![]()
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
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 | ๋ณด๊ณ ์: dartlab.pages.dev/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 โ ๊ณต์๋ฅผ ์๋ฏธ๋ก ๊ฒ์ (beta โ ์ธ๋ฑ์ค ์ ์ ๋ ํ๊ณ)
์ค๊ณ: engines.search
โ ํ์ฌ ์ธ๋ฑ์ค๊ฐ ์ผ์ ์์ ๊น์ง๋ง ๋น๋๋จ (๋งค์ผ ์ฆ๋ถ ์๋ํ ๋ฏธ์์ฑ). ๋จ์ผ ์ข ๋ชฉ ๊ณต์ ์กฐํ๋
Company.disclosure/Company.liveFilings๊ถ์ฅ. ์ธํ๋ผ(CI cron + HF push) ๊ตฌ์ถ ํ stable ์น๊ฒฉ ์์ .
๋ชจ๋ธ ์์, GPU ์์, cold start ์์. 400๋ง ๋ฌธ์ 95% ์ ๋ฐ๋ โ ์๋ฒ ๋ฉ๋ณด๋ค ์ ํ, 1/100 ๋น์ฉ. ๋ฒค์น๋งํฌ ์์ธ๋ methodology ์ฐธ์กฐ.
dartlab.search("์ ์์ฆ์ ๊ฒฐ์ ") # ์ ์์ฆ์ ๊ณต์ ์ฐพ๊ธฐ
dartlab.search("๋ํ์ด์ฌ ๋ณ๊ฒฝ", corp="005930") # ์ข
๋ชฉ ํํฐ
dartlab.search("ํ์ฌ๊ฐ ๋์ ๋น๋ ธ๋ค") # ์์ฐ์ด๋ ๋์
AI โ skills ๊ธฐ๋ฐ ๋ถ์ ์์ ๋
์ค๊ณ: operation.opsAsSkills
AI๊ฐ skills์ capabilities๋ฅผ ๊ฒ์ํ๊ณ , DartLab API๋ฅผ ์คํํ ๊ฒฐ๊ณผ ref๋ก ๋ต๋ณ์ ๊ฒ์ฐํ๋ค. ํ์ง ๊ฒฐ๋ก ์ ์๋ฒ ๊ฒฝ์ ์ง์ audit๋ก ํ์ ํ๋ค.
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
ํ๋ฆ:
- 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) ๋ ์ง์.
์ํคํ ์ฒ
"์์ง = ๋๊ตฌ (์ซ์๋ง), story = ์ด์ผ๊ธฐ๊พผ, AI/์ฌ๋ = ์๋น์" โ 1.0.0 ์ ๊ทผ๋ณธ ๊ตฌ์กฐ.
L0 core/ SSOT ์ธํ๋ผ (protocols, finance, memory, docs, search)
๊ณต์ฉ ํฌํผ: toDictBySnakeId, memoized_calc, parseNumStr, safeDiv, fmtBig
L1 providers/ ๊ตญ๊ฐ๋ณ ๊ณต์ ๋ฐ์ดํฐ (DART, EDGAR, EDINET)
gather/ ์ธ๋ถ ์์ฅ ๋ฐ์ดํฐ (Naver, Yahoo, FRED, ECOS)
L1.5 scan/ ์ ์ข
๋ชฉ ์ฌ์ ๋น๋ (parquet) โ ๋ฐ์ดํฐ ๋น๋, ๋ถ์ ์๋
L2 analysis/ ์ฌ๋ฌด ์ฌ์ธต (14์ถ + forecast + valuation)
quant/ ๊ฐ๊ฒฉ ๊ธฐ๋ฐ ์ ๋ ์ ํธ (๊ธฐ์ /๋ฆฌ์คํฌ/ํฉํฐ/๋ฐฑํ
์คํธ)
credit/ ๋
๋ฆฝ ์ ์ฉ๋ฑ๊ธ (dCR 20๋จ๊ณ, 7์ถ)
macro/ ๊ฑฐ์ ์งํ (11์ถ + scenarios 110 + historicalContext)
โ 4๊ฐ ์์ง ๋๋ฑ, ์ํธ import ๊ธ์ง. dict/์ซ์๋ง ๋ฐํ.
L3 story/ ์ด์ผ๊ธฐ๊พผ โ L2 4์์ง + scan ์๋น, ๋ณด๊ณ ์ ์กฐ๋ฆฝ
narrate (๋ฌธ์ฅ) + builders (๋ธ๋ก) + templates (๊ด์ /์ฑ๊ฒฉ)
L4 ai/ + ์ฌ๋ ์๋น์ โ story ๋ณด๊ณ ์๋ฅผ ํด์ํ๊ณ ํ๋จ
vscode/ VSCode ํ์ฅ (dartlab chat --stdio)
ui/web/ Svelte SPA ์น ์ธํฐํ์ด์ค
import ๋ฐฉํฅ: L0 โ L1 โ L1.5 โ L2 โ L3 โ L4 (CI ๊ฐ์ , ์ญ๋ฐฉํฅ 0๊ฑด).
๋ ์ด์ด ๊ฐ ์๋น ํ๋ฆ
flowchart TB
subgraph L4["L4 ยท ์๋น์ (ํด์๊ณผ ํ๋จ)"]
direction LR
HUMAN["๐ง ์ฌ๋<br/>ํฌ์์/๋ถ์๊ฐ"]
AI["ai<br/>dartlab.ask()"]
UI["vscode / CLI / web"]
end
subgraph L3["L3 ยท ์ด์ผ๊ธฐ๊พผ"]
REV["story<br/>narrate + builders + templates<br/>๋ณด๊ณ ์ ์กฐ๋ฆฝ (6๋ง ์์ฌ)"]
end
subgraph L2["L2 ยท ๋ถ์ ์์ง (dict๋ง ๋ฐํ, ์ํธ ๋
๋ฆฝ)"]
ANA["analysis<br/>์ฌ๋ฌด 14์ถ + forecast + valuation"]
QNT["quant<br/>๊ธฐ์ /๋ฆฌ์คํฌ/ํฉํฐ/๋ฐฑํ
์คํธ"]
CRD["credit<br/>dCR 20๋จ๊ณ ยท 7์ถ"]
MAC["macro<br/>11์ถ + scenarios 110"]
end
subgraph L15["L1.5 ยท ๋ฐ์ดํฐ ๋น๋"]
SCN["scan<br/>์ ์ข
๋ชฉ parquet ์ฌ์ ๋น๋"]
end
subgraph L1["L1 ยท ๋ฐ์ดํฐ ์์ง"]
PRV["providers<br/>DART / EDGAR / EDINET"]
GAT["gather<br/>FRED / ECOS / Naver / Yahoo"]
end
subgraph L0["L0 ยท ์ธํ๋ผ (SSOT)"]
CORE["core<br/>finance.helpers ยท memory ยท docs ยท search"]
end
HUMAN --> UI
UI --> AI
UI --> REV
AI --> REV
AI --> ANA
AI --> QNT
AI --> MAC
REV --> ANA
REV --> QNT
REV --> CRD
REV --> MAC
REV --> SCN
ANA --> SCN
ANA --> PRV
ANA --> GAT
QNT --> SCN
QNT --> GAT
CRD --> SCN
CRD --> PRV
MAC --> GAT
SCN --> PRV
SCN --> CORE
PRV --> CORE
GAT --> CORE
ANA --> CORE
QNT --> CORE
CRD --> CORE
MAC --> CORE
classDef l0 fill:#f5f5f5,stroke:#999
classDef l1 fill:#e8f4ff,stroke:#4a90e2
classDef l15 fill:#dbeafe,stroke:#3b82f6
classDef l2 fill:#fff4e6,stroke:#e67e22
classDef l3 fill:#f0e6ff,stroke:#8e44ad
classDef l4 fill:#e6ffe6,stroke:#27ae60
class CORE l0
class PRV,GAT l1
class SCN l15
class ANA,QNT,CRD,MAC l2
class REV l3
class AI,UI,HUMAN l4
ํต์ฌ ๊ท์น:
- L2 ์์ง ์ํธ import ๊ธ์ง โ analysisโquant, macroโcredit ๋ฑ (0๊ฑด ์ ์ง, CI ๊ฒ์ฆ)
- L2 โ L3 ์ญ๋ฐฉํฅ ๊ธ์ง โ ์์ง์ dict๋ง, ํด์/๋ธ๋ก/๋ณด๊ณ ์ ์์ฑ์ story์ ์ฑ ์ (0๊ฑด ์ ์ง)
- L2 โ L1.5(scan) ํํฅ ์ฐธ์กฐ ํ์ฉ โ scan์ ์์ ๋ฐ์ดํฐ ๋น๋
- ์ ๊ตญ๊ฐ ์ถ๊ฐ = providers/ ํจํค์ง ํ๋, core ์์ 0์ค
EDGAR (๋ฏธ๊ตญ)
๊ฐ์ ์ธํฐํ์ด์ค, ๋ค๋ฅธ ๋ฐ์ดํฐ ์์ค. SEC API์์ ์๋ ์์ง, ์ฌ์ ๋ค์ด๋ก๋ ๋ถํ์.
# Korea (DART) # US (EDGAR)
c = dartlab.Company("005930") c = dartlab.Company("AAPL")
c.sections c.sections
c.show("businessOverview") c.show("business")
c.show("BS") c.show("BS")
c.show("ratios") c.show("ratios")
c.diff("businessOverview") c.diff("10-K::item7Mdna")
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 ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ์ธ์.
7 ๋๊ตฌ ํ๋ฉด
| ๋๊ตฌ | ์ญํ |
|---|---|
| ask | DartLab Workbench 5 ํจ์ค (BRIEFโWORKโCRITIQUEโCOMPOSEโGATEโHARVEST) ์ผ๊ด |
| ReadSkill | Skill OS ๊ฒ์ + frontmatter + ๋ณธ๋ฌธ |
| ReadCapability | dartlab ๊ณต๊ฐ API/docstring ๊ฒ์ |
| RunPython | dartlab + Polars ์ฝ๋ ์คํ โ executionRef/valueRef/tableRef |
| WebSearch | ์ธ๋ถ ์ต์ ์ ๋ณด โ webRef |
| SaveArtifact | ํฐ ํยท์ฐจํธ ๋ณ๋ ์ ์ฅ โ artifactRef |
| CompileVisual | ์ฐจํธ spec codegen โ visualRef |
์ 33 generated ๋๊ตฌ (
companyAnalysis/companyStory/marketScan๋ฑ) ๋ 0.10 ๋ถํฐ ํ๊ธฐ โ ๋ชจ๋RunPython์์์dartlab.Company / dartlab.scan / dartlab.macro์ง์ ํธ์ถ. ๋ง์ด๊ทธ๋ ์ด์ ์ CHANGELOG ์ฐธ์กฐ.
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.show('IS')
data = [list(df.columns)] + [list(r) for r in df.iter_rows()]
sheet = book.sheets.active
sheet["A3"].value = data
2. @func โ ์์
์
์ ์์์ฒ๋ผ =GETFINANCE("005930")
@func
def getFinance(code: str):
c = dartlab.Company(code)
df = c.show('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.show("IS")
๋๋ xlwings Lite ์ฌ์ด๋๋ฐ์ requirements.txt์ dartlab ํ ์ค โ ๊ทธ๊ฒ๋ง์ผ๋ก ๋. ๋ก์ปฌ ํ์ด์ฌ 0์ค, uv 0์ค, venv 0์ค.
์ ์ฝ (๋ธ๋ผ์ฐ์ ๋ฐํ์์ ํ๊ณ)
| ๊ธฐ๋ฅ | Pyodide | ๋น๊ณ |
|---|---|---|
Company() ยท c.show() ยท 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๋จ๊ณ ์คํฌ๋ฆฐ์ท์ ๋ธ๋ก๊ทธ ๊ธ์ ๋ณธ๋ค.
REST API โ ํค ์์ด ๊ณต์ ์กฐํ
HuggingFace Spaces์์ DART API ํ๋ก์ ์ ๊ณต. API ํค ์์ด ์ค์๊ฐ ๊ณต์ ๋ฐ์ดํฐ ์ ๊ทผ:
# ๊ณต์ ๋ชฉ๋ก
curl "https://eddmpython-dartlab.hf.space/api/dart/filings?corp=005930&start=20260101"
# ๊ธฐ์
์ ๋ณด
curl "https://eddmpython-dartlab.hf.space/api/dart/company/005930"
# ์ฌ๋ฌด์ ํ
curl "https://eddmpython-dartlab.hf.space/api/dart/finance/005930?year=2024"
# ๋ณด๊ณ ์ (๋ฐฐ๋น, ์ง์, ์์ ๋ฑ 56๊ฐ ์นดํ
๊ณ ๋ฆฌ)
curl "https://eddmpython-dartlab.hf.space/api/dart/report/005930/๋ฐฐ๋น?year=2023"
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 ์ง์ ์์ง.
| ๋ฐ์ดํฐ์ | ์ฉ๋ |
|---|---|
| DART docs | ~8 GB |
| DART finance | ~600 MB |
| DART report | ~320 MB |
| EDGAR | SEC API (์ฃผ๋ฌธํ) |
ํ์ดํ๋ผ์ธ: ๋ก์ปฌ ์บ์(์ฆ์) โ HuggingFace(์๋ ๋ค์ด๋ก๋) โ DART API(ํค ํ์). ๋๋ถ๋ถ ์ฒ์ ๋ ๋จ๊ณ๋ก ์ถฉ๋ถ.
๋ฐ๋ก ์์ํ๊ธฐ
๋ ธํธ๋ถ (Colab): Company ยท Gather ยท Scan ยท Quant ยท Analysis ยท Macro ยท Credit ยท Story ยท AI
๋
ธํธ๋ถ (marimo): ์ ์ฒด ๋ชฉ๋ก โ import ๋ฐ๋ณต ์๋ ๋จ์ผ ์ง์
, ์
๋ง๋ค ์ฃผ์ ์ค๋ช
, ๋งํฌ๋ค์ด ์
๋ฏธ์ฌ์ฉ
๋ฌธ์
๋ฌธ์ ยท ๋น ๋ฅธ ์์ ยท Skills
๋ธ๋ก๊ทธ (120+ ๊ธ): ์ ์ฒด ยท ๊ธฐ์ ์ด์ผ๊ธฐ ยท ์ ์ฉํ๊ฐ ๋ณด๊ณ ์ ยท ๋งคํฌ๋ก ๋ณด๊ณ ์
์์ ์ฑ
| Tier | ๋ฒ์ |
|---|---|
| Stable | DART Company (sections, 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 ๋ฅผ ๋ณธ๋ค.
๊ธฐ์ฌ
๊ธฐ์ฌ๋ ๋ฌด์์ด๋ ํ์ํฉ๋๋ค. ๋ฒ๊ทธ ๋ฆฌํฌํธ, ๊ธฐ๋ฅ ์ ์, ๋ฌธ์ ๊ฐ์ , ์์ ์ถ๊ฐ, ๋ฐ์ดํฐ ๋งคํ ์์ ์ฒ๋ผ ์์ ๋ณ๊ฒฝ๋ dartlab์ ๋ ์ข๊ฒ ๋ง๋ญ๋๋ค.
ํ๊ตญ์ด์ ์์ด ์ด์ยทPR ๋ชจ๋ ํธํ๊ฒ ์ด์ด์ฃผ์ธ์. ์ด๋์ ์์ํ ์ง ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด ์ด์๋ก ๋จผ์ ์ด์ผ๊ธฐํด๋ ์ข์ต๋๋ค.
๋ผ์ด์ ์ค
Apache License 2.0 โ ์์ ๋กญ๊ฒ ์ฌ์ฉํ๋, NOTICE ํ์ผ์ ์ถ์ฒ ํ๊ธฐ๋ฅผ ํฌํจํด์ฃผ์ธ์.


