Files
crypto_news_trading/docs/superpowers/specs/2026-03-20-crypto-signal-dashboard-design.md
choijaewook f8355248b4 Add crypto signal dashboard design spec
Comprehensive spec covering: 4 analysis agents (technical, news, social, AI),
signal scoring engine, virtual $200 spot portfolio simulator with P&L tracking,
Streamlit dashboard with sidebar+detail layout, and failure handling strategy.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 17:12:39 +09:00

12 KiB

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 Process (main)]
  ├── imports agents/* (직접 호출)
  ├── imports engine/* (직접 호출)
  ├── imports data/* (직접 호출)
  ├── APScheduler (in-process, background thread)
  │   └── 15분마다 agents 실행 → engine 업데이트
  └── Binance WebSocket (background thread)
      └── 실시간 가격 업데이트 → st.session_state
  • 단일 프로세스: 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

composite_score = (technical * w1) + (news * w2) + (social * w3) + (ai * w4)
where w1 + w2 + w3 + w4 = 1.0
defaults: w1=0.6, w2=0.2, w3=0.1, w4=0.1

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)

Layout: Sidebar + Detail

Sidebar (Left)

  • 코인 목록 + 종합 점수
  • 색상 코딩: BUY(green), HOLD(yellow), SELL(red)
  • 코인 클릭 시 우측 Detail 영역 변경
  • 정렬: 점수 높은 순 (BUY 순위)
  • 하단: 가중치 슬라이더 (사용자 커스텀)

Detail Area (Right)

선택한 코인의 상세 정보를 4개 패널로 표시:

  1. Chart Panel: 캔들스틱 차트 + RSI/MACD/BB 오버레이. plotly 사용
  2. News Panel: 최근 뉴스 헤드라인 목록 + 감성 태그
  3. Social Panel: Twitter/Reddit 언급량 추세 차트 + 주요 글
  4. 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

crypto_news_trading/
├── run.py                   # Streamlit entry point (streamlit run run.py)
├── config.py                # API keys, settings, defaults
├── requirements.txt
├── .env                     # API keys (gitignored)
│
├── agents/
│   ├── __init__.py
│   ├── technical.py         # Technical analysis agent
│   ├── news.py              # News sentiment agent
│   ├── social.py            # Social media agent
│   └── ai_analyst.py        # Claude AI agent
│
├── engine/
│   ├── __init__.py
│   ├── signal.py            # Score aggregator + signal classifier
│   ├── surge.py             # Volume surge detector
│   └── portfolio.py         # Portfolio simulator + P&L tracker
│
├── data/
│   ├── __init__.py
│   ├── binance_ws.py        # Binance WebSocket client
│   ├── binance_rest.py      # Binance REST client
│   ├── news_client.py       # CryptoPanic / NewsAPI client
│   ├── social_client.py     # Twitter / Reddit client
│   └── db.py                # SQLite DB manager
│
├── dashboard/
│   ├── app.py               # Streamlit main app
│   ├── sidebar.py           # Coin list sidebar
│   ├── detail.py            # Detail panels (chart, news, social, ai)
│   └── portfolio_view.py    # Portfolio dashboard
│
├── scheduler/
│   └── jobs.py              # APScheduler job definitions
│
├── logs/                    # Log files (gitignored)
│
└── db/
    └── schema.sql            # SQLite schema

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