MCP Stock Agent-多代理AI股票分析系统
5个专家AI代理分析韩国股票,并将收购信号发送到Slack的自动化系统。 基于模型上下文协议(MCP)的工具层,Gemini 2.5 Flash LLM,Slack Socket Mode, SQLite分析历史数据库、运行时监视列表管理等产品组合项目。
______________________________________________________________________
演示
项目分析
사용자: @봇 삼성전자
봇: 🔍 `005930` 분석 중... (5개 전문가 Agent 실행)
⚠️ 삼성전자 (005930) 멀티에이전트 분석
─────────────────────────────────────
현재가: 74,200 KRW 전일 대비: -0.93%
S&P500: 소폭 하락 (-0.43%) VIX: ✅ 안정 (VIX 19.9)
─────────────────────────────────────
📊 Final Score: 58.7/100 — 관망
`█████░░░░░` 58.7점
↑ *전 분석(1일 전) 대비 +12.5점* `관망 유지`
📈 기술적 분석 (×30%) 📋 펀더멘털 분석 (×35%)
`████████ ` 75점 `██░░░░░░` 25점
🌐 매크로 분석 (×20%) 📰 감성 분석 (×15%)
`████░░░░` 55점 `████░░░░` 60점
─────────────────────────────────────
🏦 PM 종합 의견
기술적 분석상 박스권 돌파를 시도하며 MACD 상승 모멘텀이
긍정적이나, 펀더멘털 고평가(PER 15배 이상)와 Stress Zone
환율(1,441원)이 외국인 이탈 리스크를 높이고 있습니다.
전일 대비 기술적 점수가 +18점 상향된 주요 원인은 거래량
급증과 함께 20일선 상향 돌파가 확인됐기 때문입니다...
💰 ⏳ 관망 중 — 진입 시나리오
진입가: 70,000원 이하 보유기간: 중기 3~6개월
1차 목표가: 82,000원 (+17%) 2차 목표가: 92,000원 (+31%)
🛑 손절기준: 67,000원 (-4%, 120일선 하방 이탈 시)管理手表列表
사용자: @봇 워치리스트
봇: 📋 워치리스트 (3개)
• `005930`
• `000660`
• `035420`
사용자: @봇 추가 035720
봇: ✅ `035720` 워치리스트에 추가됐습니다.
사용자: @봇 히스토리 005930
봇: [ 005930 분석 히스토리 ]
─────────────────────────────
`03-01 21:00` *58.7점* 관망 Tech:75 Fund:25 Macro:55 Sent:60
`03-01 10:00` *46.2점* 관망 Tech:57 Fund:15 Macro:55 Sent:50
`02-28 15:00` *71.5점* ★매수 Tech:75 Fund:70 Macro:65 Sent:74
사용자: @봇 제거 035720
봇: 🗑️ `035720` 워치리스트에서 제거됐습니다.______________________________________________________________________
完整体系结构
┌──────────────────────────────────────────────────────────────────────┐
│ Slack Bot (Socket Mode) │
│ │
│ @봇 삼성전자 → 종목 파싱 → 분석 트리거 │
│ @봇 추가/제거/워치리스트 → 워치리스트 → DB CRUD │
│ @봇 히스토리 005930 → 히스토리 → DB 조회 후 포맷 │
│ 결과: Block Kit 카드 (↑↓ Memory 델타 배지 포함) │
└────────────────────────┬─────────────────────────────────────────────┘
│ 분석 요청
▼
┌──────────────────────────────────────────────────────────────────────┐
│ PM Agent (종합 판단) │
│ │
│ ① 분석 시작 전 → 이전 기록 조회 (Memory Layer) │
│ ② 4개 에이전트 실행 후 → Delta 계산 (점수 변화량·신호 전환) │
│ ③ Gemini 프롬프트에 Delta 컨텍스트 주입 │
│ ④ 분석 완료 후 → 결과를 analysis_history에 자동 저장 │
│ │
│ Final_Score = Tech×0.30 + Fund×0.35 + Macro×0.20 + Sent×0.15 │
│ │
│ Safety Brake: USD/KRW ≥ 1,450 AND 3일 ROC > 1% │
│ → buy_signal 강제 False, Final Score 상한 35점 │
└──────┬───────────┬──────────────┬──────────────┬────────────────────┘
│ │ │ │
▼ ▼ ▼ ▼
Technical Fundamental Macro Sentiment
Agent Agent Agent Agent
─────────── ─────────── ────────── ──────────
RSI·MACD PER·EPS·PBR USD/KRW 기업 뉴스
볼린저밴드 BPS·배당 VIX·S&P500 감성 분석
차트 패턴 Naver스크래핑 외국인수급 (매크로 제외)
│ │ │ │
└───────────┴──────────────┴──────────────┘
│
▼
┌─────────────────────────────────────────────┐
│ MCP Tool 레이어 (6개 도구) │
│ price │ technical │ pattern │ fundamental │
│ sentiment │ macro │
└──────────────────┬──────────────────────────┘
│
┌─────────────┴─────────────┐
▼ ▼
데이터 소스 Gemini 2.5 Flash
────────────── ──────────────────
pykrx (KRX OHLCV) 에이전트당 1회 호출
Naver Finance API thinking_budget=0
Frankfurter (환율) temperature=0.3
yfinance (미국 시장) max_output_tokens=1024
┌──────────────────────────────────────────────────────────────────────┐
│ SQLite DB (aiosqlite) │
│ │
│ watchlist analysis_history │
│ ─────────────── ──────────────────────────────────── │
│ ticker (PK) id, ticker, analyzed_at (UTC ISO) │
│ added_at final_score, buy_signal, signal_text │
│ score_tech/fund/macro/sent │
│ │
│ ← Slack Bot 읽기/쓰기 (워치리스트 CRUD) │
│ ← APScheduler 읽기 (매 스캔마다 최신 목록 조회) │
│ ← PM Agent 읽기/쓰기 (Memory Layer + 분석 결과 저장) │
│ Docker named volume (stock_agent_data) → 재시작 후에도 보존 │
└──────────────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────────────┐
│ APScheduler (장중 자동 스캔) │
│ 평일 09:00 ~ 15:00 KST, 매 시간 정각 │
│ DB에서 워치리스트 실시간 조회 → 전 종목 분석 │
│ Final Score ≥ 70 → Slack 채널 자동 알림 (매수 신호) │
└──────────────────────────────────────────────────────────────────────┘______________________________________________________________________
代理设计
为什么分成5个代理?
如果在一个提示下放入所有分析 波斯纳冲突发生。 “把握买入时机的图表分析师”和“现金流保守主义价值投资者”对同一个项目有冲突意见。 分离Agent时,将独立于各自的区域进行判断,PM Agent将明确地综合共识和不一致。
| 代理 | Persona | 权重 | 主要指标 |
|---|
Technical 20年工作经验图表分析师×30%RSI(14)、MACD(12/26/9)、Bolinser Band(20,2)σ),成交量比率,双底、逆头和单肩图案 |基础|保守价值投资者|×35%| PER、EPS、PBR、BPS、股息收益率(Naver Finance Scraping)| | Macro |全球宏观策略师|×20%| USD/KRW速度,VIX,S&P500,NASDAQ,KOSPI,外国人供求| Sentiment市场心理专家×15%企业新闻感性(不包括宏观新闻,只关注企业话题) | 项目经理 |对冲基金投资组合经理|综合|综合4个报告→最终意见+具体投资策略|
权重设计依据
Fundamental 35% — 기업 내재가치가 장기 수익의 핵심
Technical 30% — 매수 타이밍과 단기 모멘텀
Macro 20% — 환율·외국인 수급이 한국 증시 방향의 핵심 변수
Sentiment 15% — 노이즈가 많아 의도적으로 낮은 비중收购信号阈值
Final Score ≥ 70 → 🚨 매수 신호 (Slack 알림 발송)
Final Score 55–69 → ⚠️ 관망 (진입 조건 시나리오 제공)
Final Score str:
if Path("/app/data").exists(): # Docker 환경
return "/app/data/stock_agent.db"
Path("./data").mkdir(exist_ok=True) # 로컬 개발
return "./data/stock_agent.db"自动种子首次运行
启动应用程序时 init_db() 呼叫→ watchlist 如果表格为空 WATCHLIST_KR 解析并自动插入环境变量。以后通过Slack命令添加/删除也不会在重新启动时初始化。
Docker数据持久性
# docker-compose.yml
volumes:
- stock_agent_data:/app/data # named volume
volumes:
stock_agent_data:
driver: localdocker compose down --volumes 在容器重新启动和重新构建时也会保留数据库,除非明确运行。
______________________________________________________________________
管理Slack手表列表
命令完整列表
@봇 삼성전자 회사명으로 종목 분석
@봇 005930 종목코드로 분석
@봇 하이닉스 분석해줘 자연어 입력 가능
@봇 카카오 사도 돼? 자연어 입력 가능
@봇 워치리스트 현재 워치리스트 목록 조회
@봇 추가 005930 종목 추가
@봇 추가 카카오 회사명으로도 추가 가능
@봇 제거 005930 종목 제거 (삭제도 동의어)
@봇 삭제 035420 동의어 지원
@봇 히스토리 005930 최근 5회 분석 기록 조회
@봇 도움 전체 사용법 안내运行时反映
APScheduler在每次扫描运行时都会在DB中查看新的手表列表。因此 使用Slack添加和删除项目后,将立即反映在下一次正点扫描中可以,无需重新启动应用程序。
# scheduler/cron.py — 모듈 레벨 상수 대신 매번 DB 조회
async def _run_watchlist_scan() -> None:
watchlist = await get_watchlist() # 실시간 반영
for ticker in watchlist:
result = await run_full_analysis(ticker)
...______________________________________________________________________
确定关键设计
1.将模型上下文协议(MCP)作为工具层
데이터 수집 책임 (MCP Tools) ≠ 분석·판단 책임 (Agents)我们将所有数据域分离为MCP Tool,而不是将数据收集代码放在代理内部。 数据源替换(例如pykrx→其他API)可以不触碰代理代码。 共享同一个Python运行时,因此可以直接调用它,而无需网络开销。
2.汇率速度(Velocity)优先分析
不是单纯的“1400韩元以上=危险”, 结合速度和级别的非线性风险模型已成功应用。
[환율 위험 구간]
1,380 ~ 1,399원 → New Normal Zone (위험 가중치 ×1.0)
1,400 ~ 1,449원 → Stress Zone (위험 가중치 ×2.5)
1,450원 이상 → Panic Zone (위험 가중치 ×5.0)
[속도 경보 — Velocity Alert]
3일 ROC > 1% → 패닉 셀링 전조 경보
5일 MA 대비 3% 이상 이격 → 단기 급등 경보
[Safety Brake — 매수 강제 차단]
USD/KRW ≥ 1,450 AND 3일 ROC > 1%
→ buy_signal = False 강제
→ Final Score 상한 35점判别韩元单独弱势:USD/KRW上升+JPY/USD下降(日元走强)同时发生时 不是全球美元走强 韩国固有内部风险判断为。
3.宏与感性域分离
常见错误:如果在新闻感性分析中包括汇率和美联储新闻,宏信号将被双重统计。
# Sentiment Agent 시스템 프롬프트
"환율, 금리, 글로벌 증시, 지정학적 리스크 등 매크로 이슈는
분석하지 마세요. 기업 고유의 사건·제품·실적에만 집중하세요."4.结构化LLM输出解析
PM Agent在自由格式报告的末尾 可解析的战略块输出。
STRATEGY_START
진입가: 73,000~75,000원 (분할매수 권장)
목표가1: 85,000원 (+15%)
목표가2: 95,000원 (+27%)
손절기준: 69,000원 (-8%, 60일선 하방 이탈 시)
보유기간: 중기 3~6개월
STRATEGY_END之所以选择Regex解析而不是JSON,是因为LLM经常在令牌压力的情况下生成JSON语法错误。
5.VIX恐惧指数联动
VIX None:
try:
... # DB 저장
except Exception as e:
logger.warning(f"히스토리 저장 실패 (무시됨): {e}")
# 절대 예외 전파 안 함 — DB 오류가 분석 응답을 막아선 안 됨隔离数据库层故障,以避免影响主分析管道。
______________________________________________________________________
项目结构
mcp-stock-agent/
│
├── agents/ # AI 에이전트 레이어
│ ├── gemini_client.py # Gemini 2.5 Flash 공유 클라이언트
│ ├── technical_agent.py # RSI · MACD · BB · 차트 패턴 분석
│ ├── fundamental_agent.py # PER · EPS · PBR · BPS 가치 분석
│ ├── macro_agent.py # 환율 · VIX · KOSPI · 외국인 수급 분석
│ ├── sentiment_agent.py # 기업 뉴스 감성 분석 (매크로 제외)
│ └── pm_agent.py # 종합 판단 · Safety Brake · Memory Layer · 투자 전략
│
├── db/ # DB 레이어 (SQLite + aiosqlite)
│ ├── __init__.py
│ └── database.py # init_db · watchlist CRUD · 분석 히스토리 저장/조회
│
├── mcp_server/ # MCP Tool 레이어
│ ├── server.py # MCP 서버 (6개 도구, stdio transport)
│ └── tools/
│ ├── price.py # OHLCV 데이터 (pykrx)
│ ├── technical.py # 기술적 지표 (pandas-ta)
│ ├── pattern.py # 차트 패턴 감지 (numpy 선형회귀)
│ ├── fundamental.py # 재무 지표 (Naver Finance 스크래핑)
│ ├── sentiment.py # 뉴스 감성 (Naver 모바일 JSON API)
│ └── macro.py # 매크로 지표 (Frankfurter · Naver · yfinance)
│
├── slack/
│ └── bot.py # Socket Mode 봇 · Block Kit UI · 워치리스트 명령 · Memory 델타 표시
│
├── scheduler/
│ └── cron.py # APScheduler · 워치리스트 DB 조회 · 매수 신호 알림
│
├── data/ # 런타임 DB (gitignore, Docker named volume 사용)
│ └── stock_agent.db # 자동 생성 — 커밋하지 않음
│
├── main.py # 진입점 (init_db → 스케줄러 → Slack Bot)
├── requirements.txt
├── Dockerfile # 멀티스테이지 빌드 (builder + runtime)
├── docker-compose.yml # named volume · 환경변수 주입 · 로그 순환
├── .env.example # 환경변수 템플릿
└── .gitignore______________________________________________________________________
技术堆栈
| 区域 | 技术 | 选择原因 |
|---|---|---|
| AI/LLM | Gemini 2.5 Flash | 免费套餐,100万代币上下文,快速 |
| 代理协议 | MCP(Anthropic) | 工具模式标准化,代理-工具分离 |
| Slack联动 | slack-bolt(Socket Mode) | 无需公开URL,基于WebSocket |
调度程序APScheduler asyncio本机,cron语法支持 |DB|SQLite+aiosqlite|无服务器、asyncio非阻塞I/O、无外部依赖性| |汇率数据| Frankfurter API |免费,ECB标准,无需API密钥 |美国市场yfinance免费收集S&P500、NASDAQ、VIX |韩国市场| pykrx+Naver Finance | OHLCV+财务指标(由pykrx财务API不稳定→Naver剪裁取代)| 使用异步HTTP aiohttp asyncio.gather并行收集数据 技术指标pandas-ta RSI、MACD、博林杰乐队 |模式检测| numpy |双底、反导肩、三角收敛(基于线性回归)| |容器| docker+docker-compose | ARM/AMD64多阶段构建|
______________________________________________________________________
数据源和限制
数据源免费限制 |-------|------|------|------| |韩国股票OHLCVpykrx(KRX)| T+1延迟 |韩国财务指标| Naver Finance(描述)| pykrx财务API服务器故障取代 |新闻感性| Naver Mobile JSON API |仅限韩语新闻 |USD/KRW,JPY/USD|Frankfurter(ECB)| ECB公告标准,每日延迟 |标准普尔500、纳斯达克、VIX/yfinance(Yahoo Finance)|非正式API,可间歇性限制 |KOSPI,KOSDAQ|Naver Mobile API|实时(延迟15分钟)| |外国人供求Naver Finance(Scraping)|只提供每日统计
______________________________________________________________________
安装和运行
设置环境变量(通用)
cp .env.example .env
# .env 파일을 열어 실제 키 입력GEMINI_API_KEY=AIza...
SLACK_BOT_TOKEN=xoxb-...
SLACK_APP_TOKEN=xapp-...
SLACK_CHANNEL_ID=C...
WATCHLIST_KR=005930,000660,035420 # 첫 실행 시 DB 시드로 사용
SIGNAL_THRESHOLD_STRONG=70方法1-Docker(建议)
git clone https://github.com/YongjunJeong/mcp-stock-agent.git
cd mcp-stock-agent
cp .env.example .env # 실제 키 입력
docker compose up -d # 백그라운드 실행
docker compose logs -f # 실시간 로그
docker compose down # 종료 (DB 데이터 보존)
docker compose down --volumes # 종료 + DB 완전 삭제方法2-直接运行Python(用于本地开发)
git clone https://github.com/YongjunJeong/mcp-stock-agent.git
cd mcp-stock-agent
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env # 실제 키 입력
python main.py
# → data/stock_agent.db 자동 생성
# → Slack Bot (Socket Mode) + APScheduler 동시 시작______________________________________________________________________
计分示例
삼성전자 (005930) — 2026-03-01 기준
기술적 분석: 75/100 × 0.30 = 22.5점 (MACD 상승, 박스권 돌파 시도)
펀더멘털: 15/100 × 0.35 = 5.3점 (PER 15배↑, 배당수익률 낮음)
매크로: 55/100 × 0.20 = 11.0점 (Stress Zone 환율 1,441원, VIX 안정)
감성: 50/100 × 0.15 = 7.5점 (중립적 뉴스 흐름)
──────
Final Score: 46.2점 → 관망 (임계값: 70점)