Robinhood 포트폴리오 어드바이저
robinhood-mcp 서버를 통해 Robinhood 포트폴리오에 대한 읽기 전용 액세스를 제공합니다. 포지션, 시세, 펀더멘털, 뉴스, 실적, 애널리스트 평가, 배당금, 옵션에 대한 실시간 데이터를 제공합니다.
사전 요구 사항
1. Robinhood 계정
Robinhood 계정이 필요합니다 (robinhood.com에서 무료 가입).
2. MCP 서버 설치
robinhood-mcp 패키지가 MCP 서버를 제공합니다. 다음 중 하나의 방법으로 설치하세요.
# 권장 — uvx로 실행 (전역 설치 불필요, 자동 관리)
# 에이전트 설정에 추가하기만 하면 됩니다. uvx가 첫 실행 시 자동 설치합니다.
# 대안 — 전역 pip 설치
pip install robinhood-mcp
참고:
uvx는 uv Python 패키지 관리자에 포함되어 있습니다. 먼저 설치하세요:curl -LsSf https://astral.sh/uv/install.sh | sh
3. 환경 변수
에이전트의 .env 파일이나 셸 프로파일에 다음 변수를 설정하세요.
| 변수 | 필수 여부 | 설명 |
|---|---|---|
ROBINHOOD_USERNAME | 예 | Robinhood 이메일 |
ROBINHOOD_PASSWORD | 예 | Robinhood 비밀번호 |
ROBINHOOD_TOTP_SECRET | 인증 앱 사용 시에만 | 인증기 설정의 TOTP 시크릿. SMS 인증 사용 시 필요 없음 |
4. 에이전트 설정
templates/ 디렉토리에서 에이전트별 복사-붙여넣기 설정 스니펫을 확인하세요. 빠른 참조:
Hermes 에이전트 (~/.hermes/config.yaml):
mcp_servers:
robinhood:
command: uvx
args:
- robinhood-mcp
env:
ROBINHOOD_USERNAME: "${ROBINHOOD_USERNAME}"
ROBINHOOD_PASSWORD: "${ROBINHOOD_PASSWORD}"
# ROBINHOOD_TOTP_SECRET: "${ROBINHOOD_TOTP_SECRET}" # 인증 앱 사용 시 주석 해제
timeout: 60
connect_timeout: 30
기타 에이전트 — Claude Desktop, Claude Code, Codex, OpenCode, Cline, Windsurf 설정은 templates/ 디렉토리를 참조하세요.
설정을 추가한 후 에이전트를 다시 시작하세요. 다음 명령어로 확인: hermes mcp test robinhood (Hermes) 또는 에이전트의 MCP 상태를 확인하세요.
사용 가능한 MCP 도구
이 도구들은 Hermes 에이전트에서 mcp_robinhood_*로 등록됩니다 (에이전트에 따라 접두사가 다를 수 있음).
| 도구 | 설명 |
|---|---|
robinhood_get_portfolio | 포트폴리오 가치, 자기자본, 매수력, 일일 변동 |
robinhood_get_positions | 모든 보유 종목 (원가 기준, 현재 가치, 손익) |
robinhood_get_position | 티커 기준 단일 보유 종목 (단일 심볼의 경우 더 빠름) |
robinhood_get_watchlist | 관심 목록의 주식 |
robinhood_get_quote | 실시간 가격, 매수/매도 호가, 거래량 |
robinhood_get_fundamentals | PER, 시가총액, 배당 수익률, 52주 범위 |
robinhood_get_historicals | OHLCV 가격 내역 (5분, 10분, 1시간, 1일, 1주) |
robinhood_get_news | 심볼 관련 최신 뉴스 기사 |
robinhood_get_earnings | 실적 발표일, EPS 예상치, 실제치 |
robinhood_get_ratings | 애널리스트 매수/보유/매도 등급 |
robinhood_get_dividends | 배당금 지급 내역 |
robinhood_get_options_positions | 현재 옵션 포지션 |
robinhood_search_symbols | 종목명 또는 티커로 주식 검색 |
로컬 캐시
포트폴리오 데이터는 Hermes의 경우 ~/.hermes/data/robinhood/portfolio_cache.json, 기타 에이전트의 경우 ~/.robinhood-mcp/cache.json에 로컬로 캐시됩니다.
캐시 우선 전략
항상 캐시를 먼저 확인하세요. 다음 경우에만 MCP 도구를 호출하세요:
- 캐시가 15분 이상 경과했고 사용자가 실시간 데이터를 원하는 경우
- 사용자가 명시적으로 새로고침을 요청한 경우 ("포트폴리오 새로고침", "최신 가격 가져와")
- 사용자가 캐시에 없는 특정 티커에 대해 물어보는 경우
- 사용자가 빠르게 변하는 데이터(뉴스, 실시간 시세)에 대해 물어보는 경우
캐시 업데이트
# Hermes 에이전트 사용자
python3 scripts/refresh_cache.py
# 사용자 정의 경로 사용
python3 scripts/refresh_cache.py --cache-dir ~/my-data --vault-path ~/my-vault
# JSON 출력만 (Obsidian 없이)
python3 scripts/refresh_cache.py --json-only
# 캐시가 최신이어도 강제 새로고침
python3 scripts/refresh_cache.py --force
에이전트는 포트폴리오 쿼리 중 MCP 도구를 호출하고 결과를 캐시 파일에 기록하여 인라인으로 캐시를 업데이트할 수도 있습니다.
포트폴리오 쿼리 워크플로
사용자가 포트폴리오에 대해 물어볼 때:
- 캐시 읽기로 컨텍스트 확인 (포트폴리오 가치, 포지션, 할당)
- 데이터가 오래되었거나(>15분) 사용자가 실시간 데이터를 원하면 MCP 도구 호출
- MCP 가져오기 후 캐시 업데이트
- 실제 보유 종목을 기준으로 컨텍스트에 맞게 답변 — 일반적인 조언 금지
- 해당되는 경우 원가 기준, 미실현 손익, 할당 비율 참조
- 옵션 질문의 경우, 사용자의 전략(예: 0DTE 브레이크아웃)을 알고 있다면 상호 참조
사용자가 특정 티커에 대해 물어볼 때:
wiki/entities/<ticker>.md파일이 존재하는지 확인 (Obsidian 사용 시)- 기존 투자 논리 및 조사 내역 읽기
- MCP를 통해 실시간 데이터 가져오기 (시세, 펀더멘털, 뉴스, 등급)
- 위키 지식 + 실시간 데이터를 종합하여 응답
- (Obsidian 사용 시) 엔티티 페이지에 연구 노트 항목 추가
- 포트폴리오에 없는 티커는 연구 대기열에 추적
MCP vs 캐시 사용 시기
| 시나리오 | 사용 |
|---|---|
| "내 포트폴리오 가치는 얼마야?" | 캐시 (충분히 최신인 경우) |
| "내 NVDA는 어떻게 되고 있어?" | 캐시 우선, 오래되었거나 티커가 없으면 MCP |
| "전체 포트폴리오 업데이트를 해줘" | MCP (항상 실시간 데이터 확보) |
| "TSLA 관련 뉴스 있어?" | MCP (뉴스는 계속 변경됨) |
| "AAPL 애널리스트 등급은 어떻게 돼?" | MCP (연구 데이터는 항상 실시간) |
| "내 옵션 포지션을 보여줘" | 캐시 우선, 오래되었으면 MCP |
| "어떤 배당금을 받았어?" | 캐시 우선 |
| "내 데이터를 새로고침해줘" | MCP 후 캐시 업데이트 |
연구-엔티티 워크플로 (선택 사항 — Obsidian 필요)
문제: 주식에 대한 연구 쿼리가 채팅 세션에서 사라집니다. 해결책: 모든 보유 종목 또는 연구된 티커는 영구적인 엔티티 페이지를 갖게 됩니다. 연구 내용은 추가되며 잊히지 않습니다.
엔티티 페이지 구조
각 티커는 wiki/entities/<ticker>.md에 페이지를 갖습니다:
---
title: 회사명
created: YYYY-MM-DD
updated: YYYY-MM-DD
type: entity
tags: [ticker, sector, ...]
---
# 회사명 (TICKER)
간략한 개요...
## 주요 사실
...
## 투자 논리
...
## 포지션 내역
> 자동 업데이트됩니다. 수동으로 편집하지 마세요.
### 현재 포지션
| 지표 | 값 |
|------|-----|
| 수량 | 50 |
| 평균 단가 | $40.69 |
| 현재 가격 | $45.20 |
| 총 수익률 | +10.8% |
### 포지션 업데이트
- **[2026-04-24]** 50주 @ $40.69 평균
## 연구 노트
> 에이전트가 각 연구 쿼리 후 날짜가 있는 항목을 추가합니다.
### [2026-04-24] HIMS를 $30에 추가 매수해야 할까?
핵심 사항: [요약]
결정: [사용자가 명시한 경우]
엔티티 페이지 업데이트 시점
- 모든 포트폴리오 조회 시 — 각 보유 종목의 포지션 데이터 업데이트
- 모든 연구 쿼리 후 — 날짜가 있는 연구 노트 항목 추가
- 새 엔티티 생성 시 — 펀더멘털 가져오기, 페이지 생성, 위키 인덱스에 추가
연구 대기열
wiki/concepts/research-queue.md는 아직 매수하지 않았지만 평가 중인 티커를 추적합니다:
| 티커 | 출처 | 투자 논리 (1줄) | 상태 | 추가일 | 비고 |
|---|---|---|---|---|---|
| ABC | YouTube 영상 | EV 배터리 관련주 | 연구 중 | 2026-04-24 | MKBHD 언급 |
상태 값: 연구 중 → 매수 준비 완료 → (매수 시 제거) 또는 통과
Obsidian 볼트 통합 (선택 사항)
모든 포트폴리오 조회 시 Obsidian 볼트에 두 개의 파일을 쓸 수 있습니다:
| 파일 | 동작 |
|---|---|
_ephemeral/portfolio/snapshots/YYYY-MM-DD-HHMM.md | 변경 불가 — 조회당 하나, 전체 데이터 |
_ephemeral/portfolio/latest.md | 덮어쓰기 — 현재 상태 + 이전 대비 변동 |
Dataview용 프론트매터
두 파일 모두 YAML 프론트매터를 포함합니다:
---
snapshot_time: 2026-04-24T18:58:02Z
date: 2026-04-24
time: 14:58
total_equity: 42700.94
day_change: -834.73
day_change_pct: -1.92
positions_count: 16
options_count: 1
dividends_ytd: 1.68
type: portfolio-snapshot
---
이를 통해 다음과 같은 Dataview 쿼리가 가능합니다:
TABLE date, total_equity, day_change_pct
FROM "_ephemeral/portfolio/snapshots"
SORT snapshot_time DESC
변동 계산
latest.md는 가장 최근 스냅샷과 비교하여 다음을 강조합니다:
- 🆕 신규 포지션 (이전 조회 이후 매수)
- ❌ 종료된 포지션 (이전 조회 이후 매도)
- 📊 유의미한 변동 (>5% 가격 변동 또는 >1% 할당 비중 변동)
- 이전 스냅샷 대비 자기자본 변동
Obsidian 통합을 활성화하려면 refresh_cache.py 실행 시 --vault-path 인수를 설정하거나 ROBINHOOD_VAULT_PATH 환경 변수를 설정하세요.
자문 지침
- 항상 사용자의 실제 보유 종목에 대한 컨텍스트를 바탕으로 답변 — 일반적인 조언 금지
- 해당되는 경우 원가 기준, 미실현 손익, 할당 비율 참조
- 옵션 질문의 경우 사용자의 전략 이해 (예: 0DTE 브레이크아웃)
- 조치를 권장할 때는 계산을 보여줄 것 (현재 할당, 위험/보상)
- 사용자가 명시적으로 요청하지 않는 한 절대 거래를 제안하지 않음
- 단일 포지션이 포트폴리오의 20%를 초과하는 경우 집중 위험 플래그 표시
- 뉴스를 펀더멘털과 상호 참조 — 헤드라인에만 반응하지 않음
보안 및 개인정보 보호
- 스킬에 자격 증명이 저장되지 않음 — 인증은 MCP 설정의 환경 변수를 통해 이루어짐
- 읽기 전용 액세스 — MCP 서버는 거래를 실행하거나 계정 설정을 수정할 수 없음
- 로컬 처리 — 자격 증명은 로컬에서 인증에 사용됨; 세션 토큰은
~/.tokens/robinhood.pickle에 캐시됨 - 캐시는 로컬 전용 —
~/.hermes/data/robinhood/는 절대 전송되지 않음 - Obsidian 볼트 — 스냅샷은 사용자의 로컬 볼트에만 기록됨
문제 해결
| 문제 | 해결 방법 |
|---|---|
| "로그인되지 않음" | ROBINHOOD_USERNAME 및 ROBINHOOD_PASSWORD 환경 변수가 올바르게 설정되었는지 확인 |
| "Non-base32 digit found" | ROBINHOOD_TOTP_SECRET에 잘못된 문자가 포함됨 — A-Z와 숫자 2-7만 허용. SMS 인증 사용 시 이 변수 제거 |
| 속도 제한 (429 오류) | robin_stocks에는 내장 속도 제한이 없음. 몇 분간 활동을 중단하고 재시도 |
| MCP 서버가 시작되지 않음 | uvx가 설치되었는지 확인 (pip install uv 또는 `curl -LsSf https://astral.sh/uv/install.sh |
| 캐시 스크립트 실패 | robin_stocks 및 pyotp가 설치되었는지 확인: pip install robin_stocks pyotp |
| 시세가 오래됨 | Robinhood 시세는 특정 시점의 데이터이며 실시간 스트리밍이 아님. 최신 데이터를 위해 MCP를 통해 새로고침 |
관련 링크
- robinhood-mcp — 기본 MCP 서버
- robin_stocks — 비공식 Robinhood API 래퍼
portfolio-obsidian-bridge— 모든 증권사를 위한 일반 Obsidian 동기화llm-wiki— 영구 연구를 위한 Wiki 아키텍처obsidian— Obsidian 볼트 작업