Crypto News Signal Dashboard — Design Spec
Overview
Binance 현물(Spot) 코인을 대상으로 뉴스, 소셜미디어, 기술적 분석, AI 분석을 종합하여 매수/매도 시그널을 생성하고, 가상 $200 포트폴리오로 시뮬레이션하는 대시보드.
Tech Stack
- App: Streamlit (단일 프로세스, Sidebar + Detail 레이아웃)
- Scheduler: APScheduler (in-process background thread)
- Storage: SQLite WAL mode (시그널 이력, 포트폴리오, 거래 기록) + JSON cache (API 응답)
- Language: Python 3.11+
Application Topology
Streamlit이 메인 프로세스로 동작하며, FastAPI 없이 Python 모듈을 직접 import하여 사용한다.
- 단일 프로세스: Streamlit이 모든 모듈을 직접 import. 별도 FastAPI 서버 불필요
- Scheduler: APScheduler가 Streamlit 프로세스 내 background thread로 동작
- WebSocket: python-binance의 ThreadedWebsocketManager로 background에서 가격 수신
- Storage: SQLite WAL 모드 (concurrent read 허용, single-writer)
Architecture
Data Sources
| Source |
API |
Purpose |
Update Cycle |
| Binance |
REST + WebSocket |
가격, 거래량, OHLCV, 시가총액 순위 |
실시간 (WebSocket) |
| CryptoPanic / NewsAPI |
REST |
크립토 뉴스 헤드라인 |
15분 |
| Twitter/X API |
REST |
코인별 언급량, 감성 |
15분 |
| Reddit API |
REST |
r/cryptocurrency 등 감성 분석 |
15분 |
| Claude API |
REST |
시장 상황 종합 분석, 뉴스 영향도 판단 |
15분 |
Analysis Agents
4개의 독립적인 분석 에이전트가 각 코인에 대해 0~100 점수를 산출한다.
1. Technical Agent (기본 가중치: 60%)
- Indicators: RSI(14), MACD(12,26,9), Bollinger Bands(20,2), 이동평균(SMA 20/50/200)
- Volume Analysis: 거래량 급증 감지, OBV(On-Balance Volume)
- Candlestick Patterns: Engulfing, Doji, Hammer 등 주요 패턴
- Input: Binance OHLCV 데이터 (1h, 4h, 1d 캔들)
- Output: 0~100 기술적 점수
2. News Agent (기본 가중치: 20%)
- Sources: CryptoPanic API, NewsAPI
- Analysis: 헤드라인 감성 분석 (positive/negative/neutral)
- Scoring: 최근 24시간 뉴스의 감성 비율 + 뉴스 영향도(중요도) 가중
- Output: 0~100 뉴스 감성 점수
3. Social Agent (기본 가중치: 10%)
- Sources: Twitter/X API, Reddit API (r/cryptocurrency, r/binance)
- Metrics: 코인별 언급량 추세, 감성 분석, 인플루언서 언급 가중치
- Analysis: 24시간 언급량 변화율 + 감성 비율
- Output: 0~100 소셜 감성 점수
4. AI Agent (기본 가중치: 10%)
- Provider: Claude API (Anthropic)
- Input: 최근 뉴스 요약, 기술적 지표 요약, 소셜 감성 요약, 시장 전반 상황
- Task: 종합적 시장 컨텍스트 판단, 각 코인의 단기 전망 평가
- Output: 0~100 AI 종합 점수 + 텍스트 분석 요약
Signal Engine
Score Aggregator
Signal Classification
- BUY: composite_score >= 70
- HOLD: 40 <= composite_score < 70
- SELL: composite_score < 40
Surge Detector
- 바이낸스 전체 코인 중 거래량이 24h 평균 대비 300% 이상 급증한 코인을 자동 감지
- 감지된 코인을 모니터링 목록에 자동 추가
- Top 50에 없더라도 급등/급락 코인 포착 가능
Coin Scope
- Base: 시가총액 Top 50 (USDT 페어 기준)
- Auto-add: 거래량 급증 코인 (Surge Detector)
- User pin: 사용자가 수동으로 추가한 코인
- Pair: 모든 코인은 USDT 현물 페어 기준
Portfolio Simulator
Rules
- 초기 자본: $200 (가상)
- 거래 방식: Binance 현물(Spot)만 사용. 레버리지/마진/선물/공매도 없음
- 최대 동시 포지션: 5개
Entry (매수)
- Signal score >= 70인 코인 중 점수가 높은 순서대로 매수
- Position size: 가용 현금의 15~30% (점수가 높을수록 큰 비중)
- Score 70~79: 15% of cash
- Score 80~89: 20% of cash
- Score 90~100: 30% of cash
- 가용 현금이 없으면 매수하지 않음
- 최소 포지션: $15 미만이면 매수하지 않음 (바이낸스 최소 주문 규모 고려)
Exit (매도)
- Signal exit: 보유 코인의 score가 39 이하로 하락 시 전량 매도
- Stop-loss: 진입가 대비 -8% 하락 시 자동 손절
- Take-profit 1차: 진입가 대비 +15% 상승 시 50% 부분 익절
- Take-profit 2차: 진입가 대비 +25% 상승 시 나머지 전량 익절
Reinvestment (재투자)
- 매도 후 현금은 가용 풀로 복귀
- 다음 15분 분석 주기에 새로운 BUY 시그널 탐색
- 가장 높은 점수의 코인부터 우선 배분
P&L Tracking
- Per-trade P&L: 각 거래의 실현 손익 (진입가 vs 퇴장가)
- Per-position P&L: 보유 중인 포지션의 미실현 손익 (진입가 vs 현재가)
- Total portfolio P&L: 초기 자본 대비 총 수익률
- Win rate: 수익 거래 / 전체 거래
- Average gain/loss: 평균 수익 / 평균 손실
Dashboard (Streamlit)
- 코인 목록 + 종합 점수
- 색상 코딩: BUY(green), HOLD(yellow), SELL(red)
- 코인 클릭 시 우측 Detail 영역 변경
- 정렬: 점수 높은 순 (BUY 순위)
- 하단: 가중치 슬라이더 (사용자 커스텀)
Detail Area (Right)
선택한 코인의 상세 정보를 4개 패널로 표시:
- Chart Panel: 캔들스틱 차트 + RSI/MACD/BB 오버레이. plotly 사용
- News Panel: 최근 뉴스 헤드라인 목록 + 감성 태그
- Social Panel: Twitter/Reddit 언급량 추세 차트 + 주요 글
- AI Panel: Claude 분석 요약 텍스트 + 시그널 근거
Portfolio Tab
- Summary bar: 초기자본, 현재가치, 총 P&L, 승률, 가용 현금
- Current Holdings: 보유 포지션 테이블 (코인, 배분금액, 수량, 평균진입가, 현재가, P&L)
- Trade History: 청산 거래 이력 (날짜, 코인, 진입/퇴장가, 사이즈, P&L, 사유)
- Allocation Chart: 원형 차트 (코인별 비중 + 현금)
Update Cycle
| Component |
Cycle |
Method |
| Price data |
Realtime |
Binance WebSocket |
| Technical indicators |
On price update |
Calculated from OHLCV |
| News analysis |
Every 15 min |
APScheduler → CryptoPanic/NewsAPI |
| Social analysis |
Every 15 min |
APScheduler → Twitter/Reddit API |
| AI analysis |
Every 15 min |
APScheduler → Claude API |
| Signal scoring |
Every 15 min |
After all agents complete |
| Portfolio rebalance |
Every 15 min |
After signal scoring |
Project Structure
Database Schema (SQLite)
signals
| Column |
Type |
Description |
| id |
INTEGER PK |
Auto increment |
| coin |
TEXT |
Symbol (e.g., BTCUSDT) |
| timestamp |
DATETIME |
Signal time |
| technical_score |
REAL |
0~100 |
| news_score |
REAL |
0~100 |
| social_score |
REAL |
0~100 |
| ai_score |
REAL |
0~100 |
| composite_score |
REAL |
Weighted sum |
| signal |
TEXT |
BUY / HOLD / SELL |
trades
| Column |
Type |
Description |
| id |
INTEGER PK |
Auto increment |
| coin |
TEXT |
Symbol |
| side |
TEXT |
BUY / SELL |
| price |
REAL |
Execution price |
| quantity |
REAL |
Coin quantity |
| amount_usd |
REAL |
USD value |
| timestamp |
DATETIME |
Trade time |
| reason |
TEXT |
Signal/stop-loss/take-profit |
positions
| Column |
Type |
Description |
| id |
INTEGER PK |
Auto increment |
| coin |
TEXT |
Symbol |
| entry_price |
REAL |
Average entry price |
| quantity |
REAL |
Current quantity |
| invested_usd |
REAL |
Total USD invested |
| status |
TEXT |
OPEN / CLOSED |
| opened_at |
DATETIME |
Position open time |
| closed_at |
DATETIME |
Position close time (nullable) |
portfolio
| Column |
Type |
Description |
| id |
INTEGER PK |
Auto increment |
| timestamp |
DATETIME |
Snapshot time |
| total_value |
REAL |
Portfolio total value |
| cash |
REAL |
Available cash |
| pnl |
REAL |
Total P&L |
| pnl_pct |
REAL |
P&L percentage |
Failure Handling
| Failure |
Recovery |
| Binance WebSocket 끊김 |
자동 reconnect (python-binance 내장), 3회 실패 시 REST fallback |
| CryptoPanic/NewsAPI 실패 |
캐시된 마지막 결과 사용, 뉴스 점수를 50 (neutral)로 설정 |
| Twitter API 미사용/실패 |
Reddit만으로 소셜 점수 산출 |
| Reddit API 실패 |
소셜 점수를 50 (neutral)로 설정 |
| Claude API 타임아웃 |
AI 점수를 50으로 설정, 이전 분석 텍스트 유지 |
| Agent가 점수 미산출 |
해당 에이전트 점수 50, 나머지 에이전트로 가중 재배분 |
Rate Limit & Cost
API Call Budget (per 15-min cycle)
- Binance REST: ~5 calls (Top 50 목록 + surge scan). WebSocket은 별도
- CryptoPanic: ~1 call (전체 뉴스 조회 후 코인별 필터링)
- Reddit: ~3 calls (subreddit별 조회)
- Twitter: ~5 calls (있을 경우)
- Claude API: ~2-3 calls (코인을 배치로 묶어 분석. Top 10은 매 주기, 나머지는 1시간 간격)
Claude API 예상 비용
- 배치 분석: ~2,000 input tokens + ~500 output tokens per call
- 하루 ~150 calls → 월 ~$5-15 (Sonnet 기준)
Logging
- Python
logging 모듈, RotatingFileHandler (10MB, 5 backups)
- 로그 레벨: 시그널 결정(INFO), 거래 실행(INFO), API 에러(WARNING), 시스템 에러(ERROR)
- 로그 파일:
logs/app.log
Data Retention
- signals 테이블: 90일 보관, 이후 일별 요약으로 집계 후 삭제
- trades/positions: 영구 보관
- portfolio 스냅샷: 90일 보관
Database Schema Additions
settings
| Column |
Type |
Description |
| key |
TEXT PK |
Setting name |
| value |
TEXT |
JSON-encoded value |
사용자 가중치, surge 임계값, 포트폴리오 설정 등을 저장.
API Keys Required
| Service |
Env Variable |
Required |
| Binance |
BINANCE_API_KEY, BINANCE_SECRET |
Yes |
| CryptoPanic |
CRYPTOPANIC_API_KEY |
Yes |
| NewsAPI |
NEWS_API_KEY |
Optional (fallback) |
| Twitter/X |
TWITTER_BEARER_TOKEN |
Optional (유료 API, 없으면 Reddit만 사용) |
| Reddit |
REDDIT_CLIENT_ID, REDDIT_SECRET |
Yes |
| Anthropic (Claude) |
ANTHROPIC_API_KEY |
Yes |