stock-data-verifier
주식/ETF 데이터 3개 출처 교차검증 프로토콜. 환각 방지 첫 번째 방어선.
Best use case
stock-data-verifier is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
주식/ETF 데이터 3개 출처 교차검증 프로토콜. 환각 방지 첫 번째 방어선.
Teams using stock-data-verifier should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/stock-data-verifier/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How stock-data-verifier Compares
| Feature / Agent | stock-data-verifier | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
주식/ETF 데이터 3개 출처 교차검증 프로토콜. 환각 방지 첫 번째 방어선.
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# 주식/ETF 데이터 교차검증 스킬
## ⚠️ CRITICAL: 스킬 사용 방법 (반드시 숙지)
> **이 스킬은 "함수"가 아닙니다. 지침 문서입니다.**
>
> - ❌ `search_stock("삼성전자")` 같은 함수 호출은 **작동하지 않습니다**
> - ✅ 에이전트가 `mcp_exa_web_search_exa` 또는 `mcp_websearch_web_search_exa` 도구를 **직접 호출**해야 합니다
> - ✅ 이 스킬은 **검색 쿼리 패턴과 검증 절차**를 안내하는 문서입니다
### 올바른 사용 방법
```
1. 이 스킬 문서를 읽고 검색 쿼리 패턴 파악
2. mcp_exa_web_search_exa 또는 mcp_websearch_web_search_exa 도구를 직접 호출
3. 검색 결과에서 데이터 추출
4. 최소 2개 출처 교차 검증 수행
5. 출력 스키마에 맞춰 결과 포장
```
### 잘못된 사용 방법 (환각 발생)
```
❌ "search_stock() 호출" (존재하지 않는 함수)
❌ "스킬이 알아서 검색해줌" (스킬은 문서일 뿐)
❌ 예시 데이터의 숫자를 그대로 사용 (하드코딩된 오래된 값)
```
---
## Overview
이 스킬은 주식/ETF 데이터(가격, PER, 배당률, 운용보수 등) 수집 시 **환각을 방지**하기 위한 표준 프로토콜입니다.
모든 수치 데이터는 **에이전트가 직접 웹검색 도구를 호출**하여 **최소 2개 이상의 독립 출처에서 교차 검증** 후에만 사용 가능합니다.
---
## 절대 규칙 (Zero Tolerance)
### 금지 사항 (NEVER)
- ❌ 웹검색 없이 숫자 생성 → 즉시 FAIL
- ❌ 단일 출처만으로 확정 → 최소 2개 필수
- ❌ 출처 URL 없이 데이터 반환 → 검증 불가
- ❌ 7일 이상 오래된 데이터 사용 (가격 데이터) → 최신성 위반
- ❌ Blocklist 출처 사용 → 신뢰도 위반
### 필수 사항 (MUST)
- ✅ 최소 2개 독립 출처에서 교차 검증
- ✅ 1차 출처(공식) 최소 1개 필수 포함
- ✅ 출처 간 ±5% 이내 일치 확인
- ✅ 모든 데이터에 [출처: URL, 날짜] 태그 포함
- ✅ 검증 실패 시 FAIL 반환 (추정값 금지)
- ✅ **원문 인용 필수** - 숫자를 포함한 검색 결과 원문을 그대로 인용
---
## ⚠️ 원문 인용 규칙 (CRITICAL)
> **환각 방지의 핵심**: 검색 결과에서 숫자를 추출할 때 반드시 **원문을 그대로 인용**해야 합니다.
> 원문과 보고 값이 일치하지 않으면 **FAIL**입니다.
### 올바른 숫자 추출 방법
```
1. 웹검색 실행
2. 검색 결과에서 숫자가 포함된 문장을 **그대로 복사**
3. 원문에서 숫자 추출
4. 추출한 숫자와 원문을 함께 보고
```
### 출력 형식 (필수)
모든 수치 데이터는 다음 형식으로 보고해야 합니다:
```json
{
"value": 58000,
"original_text": "삼성전자 종가 58,000원 (2026.01.14 기준)",
"source": "네이버 금융",
"url": "https://finance.naver.com/item/main.naver?code=005930"
}
```
### 검증 규칙
| 규칙 | 설명 | 위반 시 |
|:-----|:-----|:--------|
| **원문 필수** | `original_text` 필드 없으면 무효 | FAIL |
| **숫자 일치** | `value`가 `original_text` 내 숫자와 일치해야 함 | FAIL |
| **복사 금지** | 이전 결과나 예시 값을 복사하면 안 됨 | FAIL |
### 원문 인용 예시
**✅ 올바른 예시**:
```json
{
"stock": "삼성전자",
"per": {
"value": 12.5,
"original_text": "삼성전자 PER 12.5배 (2026.01.14 기준)",
"source": "네이버 금융",
"url": "https://finance.naver.com/item/main.naver?code=005930"
}
}
```
**❌ 잘못된 예시 (환각 위험)**:
```json
{
"stock": "삼성전자",
"per": {
"value": 12.5,
"original_text": null,
"source": "네이버 금융",
"url": "https://finance.naver.com/item/main.naver?code=005930"
}
}
```
→ 원문 없이 숫자만 보고하면 검증 불가능
---
## 검색 프로토콜
### 1. 한국 주식 데이터 검색
**데이터 유형**: 한국 상장 주식 (KOSPI, KOSDAQ)
> ⚠️ 아래는 **검색 패턴 가이드**입니다. `search_korean_stock()`라는 함수는 **존재하지 않습니다**.
> 반드시 `mcp_exa_web_search_exa` 또는 `mcp_websearch_web_search_exa`를 **직접 호출**하세요.
**지원 데이터**:
- 현재가, 시가, 고가, 저가, 거래량
- PER, PBR, ROE, EPS
- 배당률, 배당수익률
- 시가총액, 상장주식수
**검색 쿼리 패턴** (2개 병렬 실행):
| # | 패턴 | 대상 출처 |
|:-:|:-----|:---------|
| 1 | `"[종목명] 주가 site:finance.naver.com"` | 네이버 금융 (1차) |
| 2 | `"[종목명] 시세 site:data.krx.co.kr OR site:kind.krx.co.kr"` | KRX (1차) |
| 3 | `"[종목명] 주가 site:securities.miraeasset.com OR site:securities.samsung.com"` | 증권사 (2차) |
**검증 절차**:
1. 2개 이상 검색 결과에서 수치 추출
2. 날짜 일치 확인 (동일 거래일)
3. 값 일치 확인 (±5% 이내)
4. 1차 출처 포함 확인
**출력 스키마**:
```json
{
"stock_code": "005930",
"stock_name": "삼성전자",
"price": {
"value": "[SEARCH_RESULT - 웹검색 결과로 대체]",
"unit": "KRW",
"date": "[SEARCH_DATE - 검색 시점 날짜]",
"original_text": "[REQUIRED - 숫자를 포함한 검색 결과 원문]"
},
"per": {
"value": "[SEARCH_RESULT]",
"original_text": "[REQUIRED]"
},
"pbr": {
"value": "[SEARCH_RESULT]",
"original_text": "[REQUIRED]"
},
"dividend_yield": {
"value": "[SEARCH_RESULT]",
"unit": "%",
"original_text": "[REQUIRED]"
},
"verified": true,
"variance": "[CALCULATED - 출처 간 편차 계산]",
"sources": [
{
"name": "네이버 금융",
"url": "[ACTUAL_URL]",
"value": "[ACTUAL_VALUE]",
"original_text": "[EXACT_QUOTE - 이 출처에서 숫자가 포함된 문장]",
"tier": 1
},
{
"name": "KRX",
"url": "[ACTUAL_URL]",
"value": "[ACTUAL_VALUE]",
"original_text": "[EXACT_QUOTE]",
"tier": 1
}
]
}
⚠️ CRITICAL:
1. `original_text` 필드는 **필수**입니다. 없으면 FAIL.
2. `value`는 반드시 `original_text` 내의 숫자와 일치해야 합니다.
3. 예시 값을 그대로 사용하지 마세요.
```
### 2. 미국 주식 데이터 검색
**데이터 유형**: 미국 상장 주식 (NYSE, NASDAQ)
> ⚠️ 아래는 **검색 패턴 가이드**입니다. `search_us_stock()`라는 함수는 **존재하지 않습니다**.
> 반드시 `mcp_exa_web_search_exa` 또는 `mcp_websearch_web_search_exa`를 **직접 호출**하세요.
**지원 데이터**:
- Price, Open, High, Low, Volume
- P/E Ratio, P/B Ratio, ROE, EPS
- Dividend Yield, Payout Ratio
- Market Cap, Shares Outstanding
**검색 쿼리 패턴**:
| # | 패턴 | 대상 출처 |
|:-:|:-----|:---------|
| 1 | `"[ticker] stock price site:finance.yahoo.com"` | Yahoo Finance (1차) |
| 2 | `"[ticker] quote site:bloomberg.com OR site:marketwatch.com"` | Bloomberg/MarketWatch (1차) |
| 3 | `"[ticker] stock site:seekingalpha.com"` | Seeking Alpha (2차) |
**검증 절차**:
1. 2개 이상 검색 결과에서 수치 추출
2. 날짜 일치 확인 (동일 거래일)
3. 값 일치 확인 (±5% 이내)
4. 1차 출처 포함 확인
**출력 스키마**:
```json
{
"ticker": "NVDA",
"stock_name": "NVIDIA Corporation",
"price": {
"value": "[SEARCH_RESULT - 웹검색 결과로 대체]",
"unit": "USD",
"date": "[SEARCH_DATE - 검색 시점 날짜]",
"original_text": "[REQUIRED - 숫자를 포함한 검색 결과 원문]"
},
"pe_ratio": {
"value": "[SEARCH_RESULT]",
"original_text": "[REQUIRED]"
},
"pb_ratio": {
"value": "[SEARCH_RESULT]",
"original_text": "[REQUIRED]"
},
"dividend_yield": {
"value": "[SEARCH_RESULT]",
"unit": "%",
"original_text": "[REQUIRED]"
},
"verified": true,
"variance": "[CALCULATED - 출처 간 편차 계산]",
"sources": [
{
"name": "Yahoo Finance",
"url": "[ACTUAL_URL]",
"value": "[ACTUAL_VALUE]",
"original_text": "[EXACT_QUOTE - 이 출처에서 숫자가 포함된 문장]",
"tier": 1
},
{
"name": "Bloomberg",
"url": "[ACTUAL_URL]",
"value": "[ACTUAL_VALUE]",
"original_text": "[EXACT_QUOTE]",
"tier": 1
}
]
}
⚠️ CRITICAL:
1. `original_text` 필드는 **필수**입니다. 없으면 FAIL.
2. `value`는 반드시 `original_text` 내의 숫자와 일치해야 합니다.
3. 예시 값을 그대로 사용하지 마세요.
```
### 3. ETF 데이터 검색
**데이터 유형**: ETF (상장지수펀드)
> ⚠️ 아래는 **검색 패턴 가이드**입니다. `search_etf()`라는 함수는 **존재하지 않습니다**.
> 반드시 `mcp_exa_web_search_exa` 또는 `mcp_websearch_web_search_exa`를 **직접 호출**하세요.
**지원 데이터**:
- NAV (순자산가치), 시장가격
- 총보수 (Expense Ratio)
- 추적오차 (Tracking Error)
- 배당률, 배당주기
- 운용자산 (AUM)
**검색 쿼리 패턴**:
| 자산 | 1차 출처 쿼리 | 2차 출처 쿼리 |
|:-----|:-------------|:-------------|
| **한국 ETF** | `"[ETF명] site:finance.naver.com"` | `"[ETF명] site:krx.co.kr"` |
| **미국 ETF** | `"[ticker] ETF site:etf.com"` | `"[ticker] site:finance.yahoo.com"` |
**운용사 공식 페이지 (필수 확인)**:
| 운용사 | URL 패턴 | 확인 데이터 |
|:-------|:---------|:-----------|
| 삼성자산운용 | `site:samsungfund.com` | 총보수, 운용보수 |
| 미래에셋자산운용 | `site:miraeassetfund.co.kr` | 총보수, 운용보수 |
| BlackRock | `site:ishares.com` | Expense Ratio |
| Vanguard | `site:vanguard.com` | Expense Ratio |
**검증 절차**:
1. 운용사 공식 페이지에서 총보수 확인 (필수)
2. 금융 데이터 사이트에서 NAV/가격 확인
3. 값 일치 확인 (±5% 이내)
4. 총보수는 운용사 공식 값 우선
**출력 스키마**:
```json
{
"etf_code": "360750",
"etf_name": "TIGER 미국S&P500",
"nav": {
"value": "[SEARCH_RESULT - 웹검색 결과로 대체]",
"unit": "KRW",
"date": "[SEARCH_DATE - 검색 시점 날짜]",
"original_text": "[REQUIRED - 숫자를 포함한 검색 결과 원문]"
},
"expense_ratio": {
"value": "[SEARCH_RESULT]",
"unit": "%",
"original_text": "[REQUIRED - 운용사 공식 페이지 원문]",
"source": "운용사 공식"
},
"tracking_error": {
"value": "[SEARCH_RESULT]",
"unit": "%",
"original_text": "[REQUIRED]"
},
"dividend_yield": {
"value": "[SEARCH_RESULT]",
"unit": "%",
"original_text": "[REQUIRED]"
},
"aum": {
"value": "[SEARCH_RESULT]",
"unit": "KRW",
"original_text": "[REQUIRED]"
},
"verified": true,
"variance": "[CALCULATED - 출처 간 편차 계산]",
"sources": [
{
"name": "삼성자산운용",
"url": "[ACTUAL_URL]",
"value": "[ACTUAL_VALUE]",
"original_text": "[EXACT_QUOTE - 이 출처에서 숫자가 포함된 문장]",
"tier": 1,
"official": true
},
{
"name": "네이버 금융",
"url": "[ACTUAL_URL]",
"value": "[ACTUAL_VALUE]",
"original_text": "[EXACT_QUOTE]",
"tier": 1,
"official": false
}
]
}
⚠️ CRITICAL:
1. `original_text` 필드는 **필수**입니다. 없으면 FAIL.
2. `value`는 반드시 `original_text` 내의 숫자와 일치해야 합니다.
3. 총보수는 반드시 운용사 공식 페이지에서 확인해야 합니다.
4. 예시 값을 그대로 사용하지 마세요.
```
---
## 허용 출처 (Allowlist)
### Tier 1: 공식 출처 (필수 1개 이상)
#### 한국 주식/ETF
| 데이터 | 출처 | URL |
|:-------|:-----|:----|
| 주식 시세 | 네이버 금융 | finance.naver.com |
| 주식 시세 | KRX | data.krx.co.kr, kind.krx.co.kr |
| 공시 정보 | DART | dart.fss.or.kr |
| ETF 정보 | 삼성자산운용 | samsungfund.com |
| ETF 정보 | 미래에셋자산운용 | miraeassetfund.co.kr |
#### 미국 주식/ETF
| 데이터 | 출처 | URL |
|:-------|:-----|:----|
| 주식 시세 | Yahoo Finance | finance.yahoo.com |
| 주식 시세 | Bloomberg | bloomberg.com |
| 주식 분석 | MarketWatch | marketwatch.com |
| ETF 정보 | ETF.com | etf.com |
| ETF 정보 | BlackRock (iShares) | ishares.com |
| ETF 정보 | Vanguard | vanguard.com |
### Tier 2: 교차검증 출처
#### 한국 증권사
| 출처 | URL | 커버리지 |
|:-----|:----|:---------|
| 삼성증권 | securities.samsung.com | 한국 주식 |
| 미래에셋증권 | securities.miraeasset.com | 한국 주식 |
| 키움증권 | kiwoom.com | 한국 주식 |
| NH투자증권 | nhqv.com | 한국 주식 |
#### 미국 금융 데이터
| 출처 | URL | 커버리지 |
|:-----|:----|:---------|
| Seeking Alpha | seekingalpha.com | 미국 주식 분석 |
| Morningstar | morningstar.com | 펀드/ETF 분석 |
| CNBC | cnbc.com | 미국 시장 뉴스 |
### Tier 3: 보조 출처
#### 한국 언론
| 출처 | URL | 용도 |
|:-----|:----|:-----|
| 한국경제 | hankyung.com | 한국 주식 뉴스 |
| 매일경제 | mk.co.kr | 한국 주식 뉴스 |
| 연합뉴스 | yna.co.kr | 한국 경제 속보 |
#### 글로벌 언론
| 출처 | URL | 용도 |
|:-----|:----|:-----|
| Reuters | reuters.com | 글로벌 주식 뉴스 |
| Financial Times | ft.com | 글로벌 금융 분석 |
| Wall Street Journal | wsj.com | 미국 주식 뉴스 |
### Blocklist (금지)
**절대 사용 금지 출처**:
| 유형 | 이유 | 예시 |
|:-----|:-----|:-----|
| **개인 블로그** | 신뢰도 미검증 | tistory, naver blog, medium 개인 글 |
| **커뮤니티** | 비전문가 의견 | 네이버 카페, 다음 카페, Reddit r/wallstreetbets, DC인사이드 |
| **YouTube** | 검증 불가 | 개인 유튜버 주식 분석 |
| **위키피디아** | 실시간 데이터 부정확 | wikipedia.org (실시간 주가용) |
| **소셜미디어** | 확인 불가 | Twitter/X, Facebook |
---
## 교차 검증 프로토콜
### 검증 기준
| 데이터 유형 | 최소 출처 수 | 허용 오차 | 우선 출처 |
|:-----------|:----------:|:--------:|:---------|
| **주가** | 2개 | ±5% | 1차 출처 (네이버/Yahoo) |
| **PER/PBR** | 2개 | ±5% | 1차 출처 |
| **배당률** | 2개 | ±5% | 1차 출처 |
| **총보수** | 1개 (운용사) | 0% | 운용사 공식 페이지 |
| **시가총액** | 2개 | ±5% | 1차 출처 |
### 검증 절차
```
1. 최소 2개 출처에서 데이터 수집
2. 각 출처에서 original_text 추출
3. 수치 일치 확인 (±5% 이내)
4. 불일치 시:
- 5% 이내: 평균값 사용
- 5% 초과: 가장 최신 출처 우선
- 10% 초과: FAIL 반환
5. verified: true/false 설정
```
### 불일치 처리
| 편차 | 대응 |
|:----:|:-----|
| **0~5%** | 평균값 사용, verified: true |
| **5~10%** | 최신 출처 우선, verified: true, 경고 포함 |
| **10%+** | FAIL 반환, verified: false, 수동 확인 요청 |
---
## 검증 실패 처리
### 실패 유형별 대응
| 실패 유형 | 코드 | 대응 |
|:----------|:-----|:-----|
| 출처 부족 | `INSUFFICIENT_SOURCES` | 추가 검색 시도 (최대 3회) |
| 값 불일치 | `VALUE_MISMATCH` | 범위로 표현 또는 1차 출처 우선 |
| 날짜 불일치 | `DATE_MISMATCH` | 가장 최신 날짜 출처 우선 |
| 1차 출처 없음 | `NO_PRIMARY_SOURCE` | 경고 + 2차 출처로 진행 |
| 전체 실패 | `COMPLETE_FAILURE` | FAIL 반환, 수동 확인 요청 |
### 실패 출력 스키마
```json
{
"stock_code": "005930",
"stock_name": "삼성전자",
"price": null,
"verified": false,
"error": {
"code": "VALUE_MISMATCH",
"reason": "출처 간 8.2% 차이 (허용: ±5%)",
"details": {
"source1": {"name": "네이버 금융", "value": 58000},
"source2": {"name": "KRX", "value": 62800}
}
},
"recommendation": "수동 확인 필요"
}
```
---
## 사용 예시
### 에이전트에서 스킬 사용
```markdown
# stock-analyzer 에이전트
## 데이터 수집
1. stock-data-verifier 스킬 로드 확인 (검색 패턴 가이드로 참조)
2. 삼성전자 데이터 수집:
- mcp_exa_web_search_exa(query="삼성전자 주가 site:finance.naver.com") **직접 호출**
- 검색 결과에서 original_text 추출
- verified: true 확인
3. NVIDIA 데이터 수집:
- mcp_exa_web_search_exa(query="NVDA stock price site:finance.yahoo.com") **직접 호출**
- 검색 결과에서 original_text 추출
- verified: true 확인
## 검증 실패 시
verified: false인 경우:
- 해당 종목은 "데이터 수집 실패" 명시
- 추정값 생성 금지
- 에러 코드 전달
```
---
## 메타 정보
```yaml
version: "1.0"
created: "2026-01-14"
updated: "2026-01-14"
author: "Claude"
purpose: "주식/ETF 데이터 환각 방지 표준화"
dependencies:
- mcp_exa_web_search_exa
- mcp_websearch_web_search_exa
- WebFetch
consumers:
- stock-analyzer
- etf-analyzer
- portfolio-builder
changes_v1.0:
- "최초 작성"
- "한국/미국 주식, ETF 검색 프로토콜 정의"
- "original_text 필수화"
- "2개 출처 교차검증 (±5% 허용)"
```Related Skills
file-save-protocol-stock
주식/ETF 분석 결과 파일 저장 프로토콜. Write 도구 사용 규칙, 저장 경로 컨벤션, 실패 시 응답 형식을 정의합니다.
analyst-common-stock
주식/ETF 분석 에이전트 공통 규칙. 웹검색 직접 호출, 원문 인용, 교차 검증 프로토콜을 정의합니다. 환각 방지의 핵심 방어선.
data-collection-guide
Chapter 2 데이터 수집 품질 기준 및 검증 방법
web-search-verifier
3개 출처 교차검증 웹검색 프로토콜. 환각 방지 첫 번째 방어선. 모든 거시경제 데이터 수집 시 필수 사용.
data-updater
CSV에서 펀드 데이터를 추출하여 fund_data.json, fund_fees.json, fund_classification.json을 생성/업데이트하는 스킬. 예금금리 데이터(deposit_rates.json) 업데이트도 지원한다. 펀드 데이터 업데이트가 필요하거나 CSV 파일을 JSON으로 변환하고 싶을 때 사용한다.
wiki-gen
>
theme-whatif
visual-generator whatif 목적 테마(미래 비전 스냅샷). theme=whatif 또는 purpose=whatif일 때 사용. 단일 팔레트 + Future Snapshot/Hero Statement 레이아웃 가이드 + 장면 구성 5요소 + 몰입 기법 포함.
theme-seminar
visual-generator seminar 테마(세미나/발표 자료) 무드 팔레트. theme=seminar일 때 사용. 9종 무드(technical-report, clarity, tech-focus, growth, connection, innovation, knowledge, presentation, workshop) 각각 4색 팔레트 제공.
theme-pitch
visual-generator pitch 목적 테마(피치덱). theme=pitch 또는 purpose=pitch일 때 사용. Apple 다크 그래디언트 팔레트 + Z-Pattern/Single-Hero 레이아웃 가이드 + 피치덱 슬라이드 시퀀스 포함.
theme-gov
visual-generator gov 테마(정부/공공기관 PPT 슬라이드) 무드 팔레트. theme=gov일 때 사용. 9종 무드(technical-report, growth, clarity, connection, innovation, tech-focus, knowledge, presentation, workshop) 각각 4색 팔레트 제공.
theme-concept
visual-generator concept 테마(Kurzgesagt 풍 시각 스토리텔링) 무드 팔레트. theme=concept일 때 사용. 텍스트 없이 장면으로 개념을 설명하는 교육용 일러스트레이션. 9종 무드 각각 4색 팔레트 제공.
theme-comparison
visual-generator comparison 목적 테마(Before/After 비교). theme=comparison 또는 purpose=comparison일 때 사용. 단일 팔레트 + 대비 메타포(Contrast) 레이아웃 가이드 + 비교 항목 작성법 포함.