Skip to content
ย 
ย 

Latest commit

ย 

History

701 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

FinGPT ๋กœ์ปฌ ๋ฆฌ์„œ์น˜ ์–ด์‹œ์Šคํ„ดํŠธ

FinGPT์™€ RAG(Retrieval-Augmented Generation)๋ฅผ ๊ฒฐํ•ฉํ•œ ๋กœ์ปฌ ์‹คํ–‰ํ˜• ๊ธˆ์œต ๋ฆฌ์„œ์น˜ ์–ด์‹œ์Šคํ„ดํŠธ์ž…๋‹ˆ๋‹ค. ์™ธ๋ถ€ API์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ์œ ์ง€ํ•œ ์ฑ„๋กœ, ์ข…๋ชฉ ํ•˜๋‚˜์— ๋Œ€ํ•œ ์‹ฌ์ธต ๋ถ„์„์„ ํ•œ ๋ฒˆ์˜ ๋ช…๋ น์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘ ๋ฐฉ๋ฒ•

์ตœ๋‹จ ๊ฒฝ๋กœ (ํ•œ ์ค„ ์‹คํ–‰)

Windows์—์„œ ์›ํด๋ฆญ ์Šคํฌ๋ฆฝํŠธ ํ•œ ๊ฐœ๋กœ ํ™˜๊ฒฝ ์ค€๋น„๋ถ€ํ„ฐ ์ƒ˜ํ”Œ ๋ถ„์„๊นŒ์ง€ ๋๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

cd FinGPT
powershell -ExecutionPolicy Bypass -File scripts/quickstart.ps1

์›ํ•˜๋Š” ์ข…๋ชฉ๊ณผ ์งˆ๋ฌธ์œผ๋กœ ์‹คํ–‰ํ•˜๋ ค๋ฉด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜์„ธ์š”.

powershell -ExecutionPolicy Bypass -File scripts/quickstart.ps1 -Ticker NVDA -Question "๋‹ค์Œ ๋ถ„๊ธฐ ํ•ต์‹ฌ ์ƒ๋ฐฉ/ํ•˜๋ฐฉ ์ด‰๋งค๋Š”?"

์ด ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค์Œ ์ž‘์—…์„ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • venv311 ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ ๋ฐ ํ™œ์„ฑํ™”
  • requirements.txt ์˜์กด์„ฑ ์„ค์น˜
  • .env ํŒŒ์ผ ์ค€๋น„ (์—†์œผ๋ฉด .env.example์—์„œ ๋ณต์‚ฌ)
  • Qdrant/Ollama ์—ฐ๊ฒฐ ์ƒํƒœ ์ ๊ฒ€
  • ์ง€์ •ํ•œ ์ข…๋ชฉ์œผ๋กœ ์ƒ˜ํ”Œ ๋ฆฌ์„œ์น˜ ์‹คํ–‰

์‚ฌ์ „ ์ค€๋น„

์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์ „์— ์•„๋ž˜ ๋„๊ตฌ๊ฐ€ ์„ค์น˜ ๋ฐ ์‹คํ–‰ ์ƒํƒœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. Python 3.11 โ€” ํ”„๋กœ์ ํŠธ ํ‘œ์ค€ ๋Ÿฐํƒ€์ž„ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.
  2. Docker Desktop โ€” ๋ฒกํ„ฐ DB์ธ Qdrant๋ฅผ ๋„์šฐ๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•˜๋ฉฐ, ์‹คํ–‰ ์ค‘ ์ƒํƒœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  3. Ollama โ€” ๋กœ์ปฌ LLM ์ถ”๋ก ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ollama.com์—์„œ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
    • ์„ค์น˜ ํ›„ ollama serve๋กœ ๋ฐ๋ชฌ์„ ๋„์›๋‹ˆ๋‹ค (ํŠธ๋ ˆ์ด์—์„œ ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ด๋ฉด "port in use" ์˜ค๋ฅ˜๊ฐ€ ๋œจ์ง€๋งŒ ๋ฌด์‹œํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค).
    • ๊ธฐ๋ณธ ๋ชจ๋ธ์„ ๋‚ด๋ ค๋ฐ›์Šต๋‹ˆ๋‹ค: ollama pull qwen2.5:7b.

๋‹จ๊ณ„๋ณ„ ์ˆ˜๋™ ์‹คํ–‰ (์Šคํฌ๋ฆฝํŠธ๋ฅผ ์“ฐ์ง€ ์•Š์„ ๋•Œ)

์›ํด๋ฆญ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋งž์ง€ ์•Š๊ฑฐ๋‚˜ ๊ฐ ๋‹จ๊ณ„๋ฅผ ์ง์ ‘ ํ™•์ธํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

cd FinGPT

py -3.11 -m venv venv311
.\venv311\Scripts\Activate.ps1
pip install -r requirements.txt

copy .env.example .env

powershell -ExecutionPolicy Bypass -File scripts/bootstrap_local.ps1

# OpenBB Workspace custom agent๋ฅผ ์‹ค์ œ๋กœ ์—ฐ๊ฒฐํ•  ๋•Œ๋งŒ ์„ ํƒ ์‹คํ–‰
powershell -ExecutionPolicy Bypass -File scripts/bootstrap_local.ps1 -WithOpenBBAgent

python app/cli/main.py --ticker AAPL --question "์ตœ๊ทผ ์‹ค์  ๋ฐœํ‘œ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋‹จ๊ธฐ ๋ฆฌ์Šคํฌ๋Š” ๋ฌด์—‡์ธ๊ฐ€?"

์›น UI ์‹คํ–‰ (์„ ํƒ)

๋ธŒ๋ผ์šฐ์ €์—์„œ ์ข…๋ชฉ, ์งˆ๋ฌธ, ์†Œ์Šค, ์กฐํšŒ ๊ธฐ๊ฐ„, top-k, ๋ชจ๋ธ ๋ผ์šฐํŠธ๋ฅผ ๋ฐ”๊ฟ”๊ฐ€๋ฉฐ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์›น UI๋ฅผ ๋„์šฐ์„ธ์š”. ์š”์•ฝยท์ƒ์Šน/ํ•˜๋ฝ ํ…Œ์ œยท์ธ์šฉยท์ฆ๊ฑฐ ๋ฌธ์„œยท์›๋ณธ JSON๊นŒ์ง€ ํ•œ ํ™”๋ฉด์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

powershell -ExecutionPolicy Bypass -File scripts/run_web.ps1
  • UI: http://127.0.0.1:8000/ui/
  • API ๋ฌธ์„œ: http://127.0.0.1:8000/docs

Local Data Mart Update

Structured financial data is stored separately from Qdrant in data/research_mart.db. Use this for daily prices, macro observations, news metadata, SEC filing metadata, provider status, and data quality checks:

python scripts/daily_update.py --market us --json
python scripts/daily_update.py --market kr --skip-macro --json

Use --skip-news, --skip-macro, or --skip-filings when a provider is intentionally unavailable during a recovery run.

For Windows Task Scheduler, use:

powershell -ExecutionPolicy Bypass -File scripts/run_daily_update.ps1 -Market us

Qdrant remains the document evidence store for news, filings, transcripts, and current-run RAG chunks. data/runs.db remains the research-run history database.

์ˆ˜๋™์œผ๋กœ ๋„์šธ ๋•Œ๋Š” ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

python -m uvicorn app.api.server:app --host 127.0.0.1 --port 8000 --reload

๋™์ž‘ ๋ฐฉ์‹

์ž…๋ ฅ์€ ์ข…๋ชฉ ์ฝ”๋“œ(ticker) ์™€ ์งˆ๋ฌธ(question) ๋‘ ๊ฐ€์ง€๋ฟ์ž…๋‹ˆ๋‹ค. ์–ด์‹œ์Šคํ„ดํŠธ๋Š” ์•„๋ž˜ 6๋‹จ๊ณ„๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. Collect (์ˆ˜์ง‘): ์†Œ์Šค๋ณ„ ํƒ€์ž„์•„์›ƒ์— ๋”ฐ๋ผ ์›๋ฌธ ๋ฌธ์„œ๋ฅผ ๋ชจ์๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์†Œ์Šค๋Š” news์ด๊ณ , transcript๋Š” ๋ณด์กฐ, report๋Š” ์šด์˜ ๊ฒฝ๋กœ์—์„œ ์˜๋„์ ์œผ๋กœ ๊บผ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. Ingest (์ ์žฌ): ์ด๋ฒˆ ์‹คํ–‰์—์„œ ๋ชจ์€ ๋ฌธ์„œ๋ฅผ ์ •๊ทœํ™”ํ•ด ๋ฒกํ„ฐ DB(Qdrant)์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
  3. Retrieve (๊ฒ€์ƒ‰): ์‹œ๋งจํ‹ฑ ๊ฒ€์ƒ‰์œผ๋กœ ๊ด€๋ จ ์ปจํ…์ŠคํŠธ๋ฅผ ๋ฝ‘์€ ๋’ค, ์ด๋ฒˆ ์‹คํ–‰์—์„œ ์ˆ˜์ง‘๋œ ๋ฌธ์„œ ID๋งŒ ๋‚จ๊ฒจ ๊ณผ๊ฑฐ ๋ฌธ์„œ๊ฐ€ ๊ฒฐ๊ณผ์— ์„ž์ด์ง€ ์•Š๋„๋ก ๊ฒฉ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  4. Infer (์ถ”๋ก ): ํ”„๋กฌํ”„ํŠธ์™€ ์ปจํ…์ŠคํŠธ๋ฅผ Ollama์˜ ๊ตฌ์กฐํ™” ์ถœ๋ ฅ ๊ฒฝ๋กœ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. JSON์ด ๊นจ์ง€๊ฑฐ๋‚˜ ์ž˜๋ฆฌ๋ฉด ์ œํ•œ๋œ ํšŸ์ˆ˜๋งŒํผ ์ž๋™ ์žฌ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.
  5. Analyze (๋ถ„์„): ๋ชจ๋ธ ์ถœ๋ ฅ JSON์„ ํŒŒ์‹ฑํ•ด ๊ฐ์„ฑ(sentiment), ์ƒ์Šน/ํ•˜๋ฝ ์ด‰๋งค, ํ•ต์‹ฌ ์ˆ˜์น˜, ํƒ€์ž„๋ผ์ธ ๊ฐ™์€ ์†์„ฑ์œผ๋กœ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.
  6. Report (๋ณด๊ณ ): ์ตœ์ข… Markdown/HTML ๋ณด๊ณ ์„œ๋ฅผ ์ƒ์„ฑํ•ด data/outputs/์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๋” ์ž์„ธํ•œ ์„ค๊ณ„๋Š” docs/PROJECT_MAP.md, docs/ARCHITECTURE.md๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๊ธฐ์ˆ  ์Šคํƒ ์š”์•ฝ

  • ๋‰ด์Šค ์ˆ˜์ง‘: Yahoo Finance๋ฅผ 1์ฐจ๋กœ ์‹œ๋„ํ•˜๊ณ , ๊ฒฐ๊ณผ๊ฐ€ ๋ถ€์กฑํ•˜๋ฉด SEC EDGAR ์ตœ๊ทผ ๊ณต์‹œ โ†’ Google News RSS โ†’ OpenBB(ํ˜ธํ™˜์„ฑ ํ†ต๊ณผ/์˜ต์…˜) โ†’ Alpha Vantage(์˜ต์…˜) โ†’ FMP(์˜ต์…˜) ์ˆœ์„œ๋กœ ๋ณด๊ฐ•ํ•ฉ๋‹ˆ๋‹ค.
  • ํŠธ๋žœ์Šคํฌ๋ฆฝํŠธ: ๊ธฐ๋ณธ๊ฐ’์€ ๋น„ํ™œ์„ฑํ™”์ž…๋‹ˆ๋‹ค. FMP_ENABLED=true์™€ FMP_API_KEY๋ฅผ ์„ค์ •ํ•œ ๊ฒฝ์šฐ์—๋งŒ FMP ํŠธ๋žœ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ณด์กฐ ์†Œ์Šค๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฒกํ„ฐ DB: Qdrant (Docker Desktop ๊ธฐ๋ฐ˜, ์ €์žฅ์†Œ์˜ Compose ์Šคํƒ์ด ์ž๋™์œผ๋กœ ๋„์›€).
  • LLM: ๋กœ์ปฌ Ollama. ์šด์˜ ๊ธฐ๋ณธ ๋ชจ๋ธ์€ qwen2.5:7b์ด๋ฉฐ, gemma4:e4b๋Š” ์‹คํ—˜์šฉ ์˜ต์…˜์œผ๋กœ๋งŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ ํ•ด๊ฒฐ

Error: listen tcp 127.0.0.1:11434: bind: Only one usage of each socket address...

Ollama๊ฐ€ ์ด๋ฏธ ํŠธ๋ ˆ์ด์—์„œ ๋Œ๊ณ  ์žˆ๋‹ค๋Š” ์‹ ํ˜ธ์ž…๋‹ˆ๋‹ค. ollama serve๋ฅผ ๋‹ค์‹œ ๋„์šธ ํ•„์š” ์—†์ด ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ€๋ฉด ๋ฉ๋‹ˆ๋‹ค.

docker: command not found ๋˜๋Š” Docker daemon not reachable

Docker Desktop์ด ์„ค์น˜๋˜์–ด ์žˆ๊ณ  ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•˜์„ธ์š”. ๋ฐฉ๊ธˆ ์„ค์น˜ํ–ˆ๋‹ค๋ฉด ํ„ฐ๋ฏธ๋„์ด๋‚˜ PC๋ฅผ ํ•œ ๋ฒˆ ์žฌ์‹œ์ž‘ํ•˜๋ฉด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

app/cli/main.py ์‹คํ–‰ ์‹œ No such file or directory

ํ˜„์žฌ ๊ฒฝ๋กœ๊ฐ€ FinGPT ๋ฃจํŠธ๊ฐ€ ์•„๋‹ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. pwd๋กœ ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•˜๊ณ  ls๋กœ app/ ํด๋”๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

๊ธฐํƒ€ ๋ช…๋ น์–ด

  • ๋ฒค์น˜๋งˆํฌ ์Šค์œ•: python quality_review.py --suite all
  • ํ† ํ”ฝ ์ง€์—ฐ์‹œ๊ฐ„ ํ”„๋กœํŒŒ์ผ: python quality_review.py --suite topic --measure-latency
  • ์ง€์—ฐ์‹œ๊ฐ„ ํ”„๋กœํŒŒ์ผ ์•„ํ‹ฐํŒฉํŠธ ์ƒ์„ฑ: python scripts/profile_topic_latency.py
  • ๋น ๋ฅธ ํ†ตํ•ฉ ๊ฒ€์ฆ ๊ฒŒ์ดํŠธ: powershell -ExecutionPolicy Bypass -File scripts/verify_production_path.ps1
  • UI/API ๊ณ„์•ฝ ์Šค๋ชจํฌ: python scripts/check_ui_contract.py
  • ๋ฆด๋ฆฌ์Šค ํ›„๋ณด live ๊ฒ€์ฆ: powershell -ExecutionPolicy Bypass -File scripts/verify_production_path.ps1 -ReleaseCandidate
  • OpenBB Workspace agent ํฌํ•จ ๊ฒ€์ฆ: powershell -ExecutionPolicy Bypass -File scripts/verify_production_path.ps1 -WithOpenBBAgent

์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” data/outputs/ ํด๋”์— ๊ตฌ์กฐํ™” JSON, Markdown ๋ณด๊ณ ์„œ, ๋ Œ๋”๋ง๋œ HTML ํ˜•ํƒœ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

์ถœ๋ ฅ ๊ธฐ์ค€์ผ / Topic ์ •๋Ÿ‰ ๋ณด๊ฐ•

  • ๋ชจ๋“  key_metrics ๊ฐ’์€ as_of ๊ธฐ์ค€์ผ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ธ์ด ๋ˆ„๋ฝํ•˜๋ฉด ๊ทผ๊ฑฐ ๋ฌธ์„œ ๋‚ ์งœ๋กœ ๋ณด๊ฐ•ํ•˜๊ณ , ๊ทธ๋ž˜๋„ ์—†์œผ๋ฉด unknown์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  • UI์™€ ๋ณด๊ณ ์„œ๋Š” ํ•ต์‹ฌ ์ง€ํ‘œ๋ฅผ ์ง€ํ‘œ / ๊ฐ’ / ๋‹จ์œ„ / ๊ธฐ์ค€์ผ / ์ถœ์ฒ˜ / freshness / ๋งฅ๋ฝ / ๊ทผ๊ฑฐ ํ‘œ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ทผ๊ฑฐ doc id๋Š” Evidence ํƒญ์˜ ์›๋ฌธ์œผ๋กœ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
  • Topic quant snapshot์€ rates/bonds(TLT), credit, FX, commodity, crypto, sector/theme ํ”„๋ก์‹œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. TLT๋Š” 10Y/30Y ๊ธˆ๋ฆฌ, 10Y-2Y ๊ณก์„ , ์‹ค์งˆ๊ธˆ๋ฆฌ proxy, TLT ๊ฐ€๊ฒฉ ํ๋ฆ„, duration proxy, ๊ธˆ๋ฆฌ ์ถฉ๊ฒฉ ๋ฏผ๊ฐ๋„๋ฅผ deterministicํ•˜๊ฒŒ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ์Šค๋ƒ…์ƒท์€ execution_meta.extras.quant_snapshot๊ณผ key_metrics์— ๋“ค์–ด๊ฐ€๋ฉฐ, LLM์€ ์ˆซ์ž๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ํ•ด์„๋งŒ ํ•ฉ๋‹ˆ๋‹ค.
  • FRED/FMP entitlement ๋˜๋Š” ๋‰ด์Šค ๋ถ€์กฑ์€ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ partial + actionable uncertainty๋กœ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค. parser/LLM JSON ์˜ค๋ฅ˜์™€ evidence ๋ถ€์กฑ์€ UI diagnostics์—์„œ ๋ถ„๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

๋ชจ๋ธ ์šด์šฉ ์ •์ฑ…

  • qwen2.5:7b๊ฐ€ ์ตœ์ข… JSON/report ์ƒ์„ฑ์˜ production baseline์ž…๋‹ˆ๋‹ค.
  • fingpt route๋Š” final structured report ์ƒ์„ฑ๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ณด์กฐ capability๋กœ ๋ถ„๋ฅ˜ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ adapter policy๋Š” FinGPT๋ฅผ event extraction, sentiment/risk tagging, financial tone classification ๊ฐ™์€ ๋ณด์กฐ ์ž‘์—… ํ›„๋ณด๋กœ ์ œํ•œํ•˜๊ณ , final JSON์€ qwen production path๋กœ ๋ผ์šฐํŒ…ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋ธ๋ณ„ capability(json_reliability, korean_reliability, structured_output_support, finance_reasoning, gpu_required)๋Š” execution_meta.extras.model_capabilities์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

์ˆ˜์ง‘ ๋™์ž‘ ์ƒ์„ธ

  • ์ง€์›๋˜๋Š” ์†Œ์Šค๋Š” news, transcript, macro, ๊ทธ๋ฆฌ๊ณ  ๋น„ํ™œ์„ฑ ์ƒํƒœ์ธ report์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’(CLI/UI)์€ news transcript์ž…๋‹ˆ๋‹ค.
  • report๋Š” ๋“ฑ๋ก๋งŒ ๋˜์–ด ์žˆ๊ณ  ํ˜„์žฌ๋Š” ์ˆ˜์ง‘์ด ๊บผ์ง„ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. report๋งŒ ๋‹จ๋… ์š”์ฒญํ•˜๋ฉด ์‚ฌ์ „ ๊ฒ€์ฆ์—์„œ ๋ง‰ํžˆ๊ณ , ๋‹ค๋ฅธ ์†Œ์Šค์™€ ์„ž์—ฌ ์žˆ์„ ๋•Œ๋Š” report=disabled๋กœ ๋กœ๊ทธ์— ๋‚จ์Šต๋‹ˆ๋‹ค.
  • news๋Š” ์ฃผ์‹ ์ข…๋ชฉ์˜ ๊ธฐ๋ณธ ์†Œ์Šค์ž…๋‹ˆ๋‹ค. Yahoo Finance๋ฅผ ๋จผ์ € ์‹œ๋„ํ•˜๊ณ , ์ตœ์‹  ๋ฌธ์„œ๊ฐ€ 3๊ฐœ ๋ฏธ๋งŒ์ด๋ฉด ๊ธฐ๋ณธ ์ •์ฑ…์ƒ SEC EDGAR ์ตœ๊ทผ ๊ณต์‹œ โ†’ Google News RSS โ†’ OpenBB news(์˜ต์…˜) โ†’ Alpha Vantage(์˜ต์…˜) โ†’ FMP ์ข…๋ชฉ ๋‰ด์Šค(์˜ต์…˜) ์ˆœ์œผ๋กœ ๋ณด๊ฐ•ํ•ฉ๋‹ˆ๋‹ค.
  • transcript๋Š” ๊ธฐ๋ณธ hot path์—์„œ ๊บผ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. FMP_ENABLED=true, TRANSCRIPT_PROVIDER=fmp_optional, FMP_API_KEY๋ฅผ ๋ชจ๋‘ ์„ค์ •ํ•œ ๊ฒฝ์šฐ์—๋งŒ FMP ์•ˆ์ •(stable) ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋ณด์กฐ ์†Œ์Šค๋กœ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  • macro๋Š” ์ฑ„๊ถŒ ETF, ์›์ž์žฌ ETF, FX(EURUSD=X), ์„ ๋ฌผ(GC=F), ์•”ํ˜ธํ™”ํ(BTC-USD) ๊ฐ™์€ ๋น„์ฃผ์‹ ์ž์‚ฐ์˜ ๊ธฐ๋ณธ ์†Œ์Šค์ž…๋‹ˆ๋‹ค. FRED(๊ธˆ๋ฆฌ/CPI/๋‹ฌ๋Ÿฌ ์ธ๋ฑ์Šค), yfinance ๊ฐ€๊ฒฉ ์ด๋ ฅ, Google News RSS๋ฅผ ํ•จ๊ป˜ ๋ฌถ์–ด ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋น„์ฃผ์‹ ์ข…๋ชฉ์— ๊ธฐ๋ณธ ์†Œ์Šค(news transcript)๋ฅผ ๊ทธ๋Œ€๋กœ ์“ฐ๋ฉด news๋Š” ์ž๋™์œผ๋กœ macro ๋ฒˆ๋“ค๋กœ ์ „ํ™˜๋˜๊ณ  transcript๋Š” skipped๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฒˆ ์‹คํ–‰์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” 1์ฐจ ๋ฌธ์„œ๊ฐ€ ํ•˜๋‚˜๋„ ์—†์œผ๋ฉด Retrieve/Infer ๋‹จ๊ณ„๋Š” ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์˜ค๋ž˜๋œ Qdrant ๋ฌธ์„œ๋กœ ๋‹ตํ•˜๋Š” ๋Œ€์‹  partial ์ƒํƒœ์™€ ํ•จ๊ป˜ "์ปจํ…์ŠคํŠธ ์—†์Œ" ๊ฐ€์„ค์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • data/outputs/latest_collection.json ํŒŒ์ผ์—๋Š” ์†Œ์Šค/ํ”„๋กœ๋ฐ”์ด๋” ์ƒํƒœ, ์ˆ˜์ง‘๋œ ๋ฌธ์„œ ID, ์ตœ์‹ ์„ฑ ๊ธฐ์ค€ ์‹œ์ , ๊ทธ๋ฆฌ๊ณ  current_run_only ๊ฒ€์ƒ‰ ์ •์ฑ…์ด ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.
  • SEC EDGAR๋ฅผ ๊พธ์ค€ํžˆ ์“ฐ๋ ค๋ฉด .env์— SEC_USER_AGENT(์กฐ์ง/์—ฐ๋ฝ์ฒ˜ ํ˜•ํƒœ ๋ฌธ์ž์—ด)๋ฅผ ์„ค์ •ํ•˜์„ธ์š”. macro ๋ฒˆ๋“ค์˜ FRED ๊ฒฝ๋กœ๋ฅผ ์“ฐ๋ ค๋ฉด FRED_API_KEY๋ฅผ ์„ค์ •ํ•˜์„ธ์š”(fred.stlouisfed.org์—์„œ ๋ฐœ๊ธ‰).

์ง€์› ์ž์‚ฐ ๋ฒ”์œ„

์ž์‚ฐ๊ตฐ ์˜ˆ์‹œ ์ข…๋ชฉ ๊ธฐ๋ณธ ์†Œ์Šค ํŠธ๋žœ์Šคํฌ๋ฆฝํŠธ
๋ฏธ๊ตญ ๊ฐœ๋ณ„ ์ฃผ์‹ AAPL, MSFT, NVDA yfinance + SEC + Google RSS + optional OpenBB/Alpha Vantage/FMP optional FMP ์‹ค์  ์ฝœ
๋ฏธ๊ตญ ETF (์ผ๋ฐ˜) SPY, QQQ, XLK yfinance + issuer profile + Google RSS + optional OpenBB/Alpha Vantage/FMP โ€”
๋ฏธ๊ตญ ์ฑ„๊ถŒ ETF TLT, IEF, AGG, HYG yfinance + issuer profile + macro(FRED/Yahoo) + optional OpenBB/Alpha Vantage/FMP โ€”
๋ฏธ๊ตญ ์›์ž์žฌ ETF GLD, SLV, USO, DBC yfinance + issuer profile + macro + optional OpenBB/Alpha Vantage/FMP โ€”
ํ•ด์™ธ ์ƒ์žฅ ์ฃผ์‹ 005930.KS, 9988.HK yfinance + Google News โ€”
FX ํŽ˜์–ด (Yahoo) EURUSD=X, USDJPY=X macro ๋ฒˆ๋“ค โ€”
์„ ๋ฌผ (Yahoo) GC=F(๊ธˆ), CL=F(WTI), ZN=F(10Y) macro ๋ฒˆ๋“ค โ€”
์•”ํ˜ธํ™”ํ (Yahoo) BTC-USD, ETH-USD macro ๋ฒˆ๋“ค โ€”

์ข…๋ชฉ ์ฝ”๋“œ ์‚ฌ์ „ ๊ฒ€์ฆ ์ •๊ทœ์‹์€ [A-Z0-9.\-=]{1,12} ์ด๋ฏ€๋กœ Yahoo ํ˜•์‹์˜ FX/์„ ๋ฌผ ์‹ฌ๋ณผ๋„ ๊ทธ๋Œ€๋กœ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

ETF ๋ฐœํ–‰์‚ฌ ํ”„๋กœํ•„ ์ž๋™ ์ˆ˜์ง‘

iShares, SPDR, Vanguard, Invesco, ARK, Schwab, J.P. Morgan, Global X, USCF ๋“ฑ ETF๋กœ ์ธ์‹๋˜๋Š” ์ข…๋ชฉ์€ ์š”์ฒญ ์†Œ์Šค์™€ ์ƒ๊ด€์—†์ด ๋ฐœํ–‰์‚ฌ ์ƒํ’ˆ ํŽ˜์ด์ง€๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ€์ ธ์™€ etf_profile ๋ฌธ์„œ๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์•ˆ์ •์„ฑ์„ ์œ„ํ•ด 3๋‹จ๊ณ„ ๋Œ€์ฒด ๊ฒฝ๋กœ๋ฅผ ์”๋‹ˆ๋‹ค.

  1. ํ๋ ˆ์ด์…˜๋œ ๋ฐœํ–‰์‚ฌ URL (์˜ˆ: https://www.ishares.com/us/products/239454/...)์„ trafilatura๋กœ ํŒŒ์‹ฑ
  2. Yahoo Finance /profile ํŽ˜์ด์ง€๋ฅผ trafilatura๋กœ ํŒŒ์‹ฑ
  3. yfinance ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(longBusinessSummary, ์นดํ…Œ๊ณ ๋ฆฌ, expense ratio, AUM, inception)๋ฅผ ์ž์—ฐ์–ด ๋‹จ๋ฝ์œผ๋กœ ํ•ฉ์„ฑ (SPDR/Vanguard/Schwab ๊ฐ™์€ JS ๊ธฐ๋ฐ˜ SPA ํŽ˜์ด์ง€์ผ ๋•Œ ์‚ฌ์šฉ)

ETF๊ฐ€ ์•„๋‹Œ ์ข…๋ชฉ์€ ์กฐ์šฉํžˆ ๊ฑด๋„ˆ๋›ฐ๋ฉฐ, ์ถ”๊ฐ€ API ํ‚ค๋Š” ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.

Research upgrades: rerank, chunk, hybrid, topic mode

Recent retrieval and routing improvements are controlled by feature flags so the legacy ticker workflow can be restored without code changes.

CLI examples:

python app/cli/main.py --ticker AAPL --question "recent catalysts?"
python app/cli/main.py --ticker TLT --question "scenario risks?" --simulate
python app/cli/main.py --question "Fed์˜ 2026๋…„ ๊ธˆ๋ฆฌ ๊ฒฝ๋กœ๊ฐ€ ์„ฑ์žฅ์ฃผ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์€?"
python app/cli/main.py --topic "AI semiconductors" --question "short-term risks?"

API:

  • Existing ticker endpoint remains unchanged: POST /api/v1/research.
  • Universal auto-routing endpoint: POST /api/v1/research/universal.
  • Universal responses include a top-level mode so clients can distinguish ticker, compare, sector/macro, and concept reports.
  • Ticker, universal, compare, and topic request bodies can set scenario_simulation_enabled: true|false to override the environment flag for that request.

Operational flags:

RERANKER_ENABLED=true
FUNDAMENTALS_CARD_ENABLED=true
INGEST_CHUNKING_ENABLED=true
HYBRID_SEARCH_ENABLED=true
TOPIC_MODE_ENABLED=true
SCENARIO_SIMULATION_ENABLED=false

Rollback is flag-based for Phase 1, 2, 4, and 5:

RERANKER_ENABLED=false
FUNDAMENTALS_CARD_ENABLED=false
HYBRID_SEARCH_ENABLED=false
TOPIC_MODE_ENABLED=false
SCENARIO_SIMULATION_ENABLED=false

Chunking can also be disabled with INGEST_CHUNKING_ENABLED=false, but data already stored as chunks remains in Qdrant until the collection is recreated. When enabling chunking and hybrid BM25 for an existing collection, recreate the collection once and re-ingest:

powershell -ExecutionPolicy Bypass -File scripts/migrate_collection.ps1
python app/cli/main.py --ticker AAPL --question "smoke test"

The new chunked payload stores doc_id as the chunk id and parent_doc_id as the source document id. Readers accept both fields for backward compatibility.

Scenario Simulation Layer

This optional layer adds evidence-grounded base/bull/bear/tail scenarios, market participant personas, agent-style views, risk triggers, deterministic scenario scores, and a decision checklist.

It is disabled by default:

SCENARIO_SIMULATION_ENABLED=false

It does not replace the existing RAG/research pipeline and does not perform deterministic price prediction. Results are stored under:

response.execution_meta.extras["scenario_simulation"]

Rollback is done by setting:

SCENARIO_SIMULATION_ENABLED=false

For one-off CLI runs, --simulate enables the layer and --no-simulate disables it for that process only.

๋ฌธ์„œ

์ฐธ๊ณ : ๊ณผ๊ฑฐ ๋ฒค์น˜๋งˆํฌ, ์•„์นด์ด๋ธŒ๋œ ์Šคํƒ ๋ฒ„์ „, ํ”„๋กœํ† ํƒ€์ž… ์ฝ”๋“œ๋Š” legacy/ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋”ฐ๋กœ ๋ชจ์•„๋‘์—ˆ์œผ๋ฉฐ ๋ฉ”์ธ ์‹คํ–‰ ๊ฒฝ๋กœ์—์„œ๋Š” ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค.

About

FinGPT: Open-Source Financial Large Language Models! Revolutionize ๐Ÿ”ฅ We release the trained model on HuggingFace.

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages