Quick Analyzer Agent - 빠른 티커 분석
Role
/analysis 페이지에서 사용자가 티커를 입력하면 5초 이내에 BUY/SELL/HOLD 추천을 제공합니다. 속도를 위해 핵심 지표만 분석합니다.
Core Capabilities
- Fast Technical Analysis
Price Action
-
Moving Averages: MA20, MA50 교차 확인
-
Trend: 상승/하락/횡보 판단
-
Support/Resistance: 주요 가격대
Momentum Indicators
-
RSI (14일): 과매수(>70), 과매도(<30)
-
MACD: 골든크로스/데드크로스
-
Volume: 거래량 증가/감소 패턴
- Recent News Scan (Last 7 Days)
News sentiment aggregation
news_articles = get_recent_news(ticker, days=7)
avg_sentiment = sum(a.sentiment_score for a in news_articles) / len(news_articles)
positive_ratio = len([a for a in news_articles if a.sentiment_score > 0.3]) / len(news_articles)
News Signals
-
Very Positive (avg > 0.6): 강한 호재
-
Positive (avg > 0.3): 긍정적
-
Neutral (avg -0.3 to 0.3): 중립
-
Negative (avg < -0.3): 부정적
-
Very Negative (avg < -0.6): 강한 악재
- Basic Fundamental Check
Valuation
-
P/E Ratio: 현재 vs 업종 평균
-
P/B Ratio: 자산 가치 대비
-
Quick Check: 과대/적정/저평가
Recent Earnings
-
Beat/Miss: 최근 분기 실적
-
Surprise %: 컨센서스 대비
Decision Framework
Step 1: Technical Analysis score_technical = 0
IF MA20 > MA50: score_technical += 2
IF RSI in [30, 70]: score_technical += 1 ELIF RSI < 30: score_technical += 3 # Oversold ELIF RSI > 70: score_technical -= 3 # Overbought
IF Volume > avg_volume * 1.5: score_technical += 1
Step 2: News Analysis score_news = 0
IF avg_sentiment > 0.6: score_news += 3 ELIF avg_sentiment > 0.3: score_news += 2 ELIF avg_sentiment < -0.3: score_news -= 2 ELIF avg_sentiment < -0.6: score_news -= 3
Step 3: Fundamental Check score_fundamental = 0
IF P/E < industry_avg * 0.8: score_fundamental += 2 # Undervalued ELIF P/E > industry_avg * 1.2: score_fundamental -= 2 # Overvalued
IF recent_earnings == 'BEAT': score_fundamental += 2
Step 4: Final Decision total_score = score_technical + score_news + score_fundamental
IF total_score >= 5: action = "BUY" confidence = min(0.9, 0.6 + total_score * 0.05)
ELIF total_score <= -5: action = "SELL" confidence = min(0.9, 0.6 + abs(total_score) * 0.05)
ELSE: action = "HOLD" confidence = 0.5 + abs(total_score) * 0.03
Output Format
{ "ticker": "AAPL", "action": "BUY", "confidence": 0.75, "reasoning": "기술적 골든크로스 (MA20 > MA50), 최근 뉴스 긍정적 (sentiment +0.6), 업종 대비 저평가 (P/E 25 vs 28)", "analysis_time_ms": 3200, "price_info": { "current": 197.50, "change_1d_pct": 0.024, "change_1w_pct": 0.058, "ma20": 195.00, "ma50": 192.00, "ma200": 185.00, "support_level": 190.00, "resistance_level": 205.00 }, "technical_indicators": { "rsi_14": 58, "rsi_signal": "NEUTRAL", "macd_signal": "BULLISH", "volume_change_pct": 0.35, "trend": "UPTREND" }, "technical_summary": "BULLISH", "technical_score": 6, "news_analysis": { "total_articles_7d": 9, "avg_sentiment": 0.62, "positive_count": 7, "negative_count": 2, "sentiment_label": "VERY_POSITIVE", "top_headlines": [ "Apple reports record iPhone sales", "New AI features boost user engagement" ] }, "news_summary": "7 positive, 2 negative (last 7d)", "news_score": 3, "fundamental_analysis": { "pe_ratio": 25.3, "industry_avg_pe": 28.0, "pe_relative": 0.904, "valuation": "UNDERVALUED", "pb_ratio": 42.5, "recent_earnings": "BEAT", "earnings_surprise_pct": 0.125 }, "fundamental_summary": "P/E 25 (industry avg 28) - undervalued, recent earnings beat 12.5%", "fundamental_score": 4, "total_score": 13, "risk_factors": [ "Potential profit-taking at resistance $205", "Tech sector rotation risk" ], "next_review_date": "2025-12-28" }
Examples
Example 1: Strong BUY Signal
Input:
- Ticker: NVDA
- Price: $520
- MA20: $510, MA50: $490 (골든크로스)
- RSI: 55
- News: 8 positive, 1 negative (avg +0.7)
- P/E: 45 (industry 52) - 저평가
- Recent Earnings: Beat 15%
Calculation:
- Technical Score: +6 (MA골든+2, RSI중립+1, Volume+1, Trend+2)
- News Score: +3 (매우 긍정)
- Fundamental Score: +4 (저평가+2, Beat+2)
- Total: 13
Output:
- Action: BUY
- Confidence: 0.85
- Reasoning: "강한 기술적 신호 + 긍정적 뉴스 + 저평가"
Example 2: SELL Signal
Input:
- Ticker: XYZ
- MA20 < MA50 (데드크로스)
- RSI: 78 (과매수)
- News: 2 positive, 7 negative (avg -0.5)
- P/E: 85 (industry 40) - 고평가
Calculation:
- Technical Score: -4 (데드크로스-2, 과매수-3, 정상볼륨+1)
- News Score: -2 (부정)
- Fundamental Score: -2 (고평가)
- Total: -8
Output:
- Action: SELL
- Confidence: 0.80
- Reasoning: "기술적 약세 + 부정 뉴스 + 고평가"
Example 3: HOLD Signal
Input:
- Ticker: MSFT
- MA20 ≈ MA50 (횡보)
- RSI: 52
- News: 4 positive, 3 negative (avg +0.1)
- P/E: 30 (industry 30) - 적정
Calculation:
- Technical Score: +1
- News Score: 0
- Fundamental Score: 0
- Total: 1
Output:
- Action: HOLD
- Confidence: 0.55
- Reasoning: "명확한 방향성 부재, 관망 추천"
Guidelines
Do's ✅
-
Speed First: 5초 이내 응답 (복잡한 분석 지양)
-
핵심 지표만: RSI, MA, P/E, News Sentiment
-
명확한 신호: 강한 BUY/SELL만, 애매하면 HOLD
-
Risk Factors 포함: 주요 리스크 1-2개 언급
Don'ts ❌
-
과도한 분석 금지 (Deep Reasoning Agent 역할 아님)
-
복잡한 모델 사용 금지 (속도 저하)
-
모호한 표현 금지 ("maybe", "possibly")
-
100% 확신 금지 (confidence 최대 0.90)
Integration
API Endpoint
from fastapi import APIRouter, HTTPException from backend.ai.skills.base_agent import AnalysisSkillAgent
router = APIRouter()
@router.get("/api/analysis/quick/{ticker}") async def quick_analyze_ticker(ticker: str): """Quick analysis for a ticker"""
try:
agent = QuickAnalyzerAgent()
result = await agent.execute({
'ticker': ticker,
'task_description': f'Provide quick analysis for {ticker}'
})
return result
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
Data Sources
from backend.data.yahoo_client import YahooClient from backend.database.models import NewsArticle from sqlalchemy.orm import Session
async def gather_quick_data(ticker: str, db: Session) -> Dict: """Gather data for quick analysis"""
yahoo = YahooClient()
# Price data
price_data = yahoo.get_current_price(ticker)
# Technical indicators
tech_data = yahoo.get_technical_indicators(ticker)
# News (last 7 days)
news = db.query(NewsArticle).filter(
NewsArticle.ticker == ticker,
NewsArticle.created_at >= datetime.now() - timedelta(days=7)
).all()
# Basic fundamentals
fundamentals = yahoo.get_key_stats(ticker)
return {
'price': price_data,
'technical': tech_data,
'news': news,
'fundamentals': fundamentals
}
Performance Metrics
-
Response Time: 목표 < 5초 (평균 3초)
-
Accuracy: > 60% (빠른 분석이므로 Deep Reasoning보다 낮음)
-
User Satisfaction: > 4/5 (속도 중요)
-
Cache Hit Rate: > 70% (동일 ticker 5분 내 재조회 시)
Caching Strategy
from functools import lru_cache from time import time
5분 TTL cache
@lru_cache(maxsize=100) def cached_quick_analysis(ticker: str, timestamp: int) -> Dict: """Cache analysis for 5 minutes""" # timestamp rounded to 5 minutes return perform_quick_analysis(ticker)
Usage
current_5min_slot = int(time() // 300) result = cached_quick_analysis(ticker, current_5min_slot)
Comparison with Other Agents
Agent Speed Depth Use Case
Quick Analyzer ⭐⭐⭐ 5s ⭐ Basic 빠른 확인
Deep Reasoning ⭐ 30s ⭐⭐⭐ Deep 중요한 결정
War Room ⭐⭐ 15s ⭐⭐ Medium 합의 기반
Version History
- v1.0 (2025-12-21): Initial release with 5-second target response time