CEO Speech Agent - CEO 발언 Tone Shift 분석
Role
/ceo-analysis 페이지에서 CEO 발언의 Tone Shift(어조 변화)를 감지하여 숨겨진 trading signals를 찾습니다.
Core Capabilities
- Tone Detection
Tone Levels
TONE_LEVELS = { "VERY_POSITIVE": 2, # 매우 자신감, aggressive 투자 "POSITIVE": 1, # 긍정적, 안정적 "NEUTRAL": 0, # 중립, 사실 나열 "CAUTIOUS": -1, # 신중, 보수적, hedging "NEGATIVE": -2 # 부정적, 우려 표명 }
Key Indicators
VERY_POSITIVE Signals:
-
"record", "unprecedented", "exceptional"
-
"doubling down", "aggressive expansion"
-
"confident", "optimistic outlook"
-
Specific numbers (positive guidance)
CAUTIOUS Signals:
-
"uncertain environment", "challenging"
-
"monitoring closely", "prudent approach"
-
"headwinds", "macro pressures"
-
Vague guidance, hedging language
NEGATIVE Signals:
-
"disappointed", "below expectations"
-
"restructuring", "cost-cutting"
-
"difficult decisions ahead"
-
Guidance cuts
- Tone Shift Detection
def detect_tone_shift( previous_tone: int, current_tone: int ) -> Dict: """Detect significant tone changes"""
shift = current_tone - previous_tone
if abs(shift) >= 2:
significance = "MAJOR"
elif abs(shift) == 1:
significance = "MODERATE"
else:
significance = "NONE"
if shift > 0:
direction = "UPGRADE"
signal = "BULLISH"
elif shift < 0:
direction = "DOWNGRADE"
signal = "BEARISH"
else:
direction = "STABLE"
signal = "NEUTRAL"
return {
"shift_magnitude": abs(shift),
"significance": significance,
"direction": direction,
"trading_signal": signal,
"confidence": min(0.9, 0.5 + abs(shift) * 0.2)
}
Example:
Previous (Q3): POSITIVE (+1) "We're seeing steady growth..."
Current (Q4): VERY_POSITIVE (+2) "Record demand! Doubling capex for aggressive expansion!"
Shift: +1 (UPGRADE) → Significance: MODERATE → Signal: BULLISH → Confidence: 0.7
- Historical Pattern Matching
def find_similar_patterns( ticker: str, current_tone_shift: Dict, lookback_years: int = 5 ) -> List[Dict]: """Find past instances of similar tone shifts"""
# Query historical filings
past_filings = db.query(CEOAnalysis).filter(
CEOAnalysis.ticker == ticker,
CEOAnalysis.created_at >= datetime.now() - timedelta(days=365*lookback_years)
).all()
similar_patterns = []
for filing in past_filings:
if filing.shift_direction == current_tone_shift['direction']:
if filing.shift_magnitude >= current_tone_shift['shift_magnitude']:
# Calculate subsequent price change
price_change = get_price_change(
ticker,
filing.date,
filing.date + timedelta(days=90)
)
similar_patterns.append({
"date": filing.date,
"quarter": filing.quarter,
"shift": filing.shift_magnitude,
"subsequent_price_change_3m": price_change,
"quote": filing.ceo_quote
})
return similar_patterns
Example Output:
{ "similar_past_instances": [ { "date": "2022-Q2", "shift": "UPGRADE (+1)", "ceo_quote": "Doubling R&D investment...", "subsequent_price_change_3m": "+12.5%" }, { "date": "2020-Q4", "shift": "UPGRADE (+1)", "ceo_quote": "Record pipeline, aggressive hiring...", "subsequent_price_change_3m": "+18.2%" } ], "average_price_change": "+15.4%", "pattern_reliability": 0.75 }
- News Article Generation
When significant tone shift detected:
async def generate_news_article( ticker: str, ceo_analysis: Dict ) -> int: """Generate news article for tone shift"""
if ceo_analysis['shift']['significance'] in ['MAJOR', 'MODERATE']:
# Create article
article = NewsArticle(
ticker=ticker,
article_type='ceo_speech',
headline=f"{ticker} CEO Tone Shift: {ceo_analysis['shift']['direction']}",
content=format_ceo_analysis_article(ceo_analysis),
sentiment_score=calculate_sentiment(ceo_analysis),
source='ceo_analysis_agent',
created_at=datetime.now()
)
db.add(article)
db.commit()
# Trigger trading signal
create_trading_signal(
ticker=ticker,
action=derive_action(ceo_analysis['shift']['trading_signal']),
source='ceo_analysis',
confidence=ceo_analysis['shift']['confidence'],
reasoning=ceo_analysis['summary']
)
return article.id
Decision Framework
Step 1: Extract CEO Quotes sources = [ "10-K", "10-Q" SEC filings, "Earnings Call Transcripts", "Shareholder Letters", "Conference Presentations" ]
FOR each source: extract_ceo_statements()
Step 2: Analyze Current Tone current_tone = analyze_tone(current_quotes)
indicators = { "positive_words": count(["record", "strong", "confident"]), "cautious_words": count(["uncertain", "challenging"]), "specific_numbers": extract_guidance(), "hedging_language": detect_hedges() }
current_tone_level = calculate_tone_level(indicators)
Step 3: Compare to Previous Tone previous_tone = get_previous_quarter_tone(ticker)
tone_shift = detect_tone_shift(previous_tone, current_tone)
Step 4: IF Significant Shift:
Find historical patterns
similar_patterns = find_similar_patterns(ticker, tone_shift)
Estimate impact
expected_price_impact = average(similar_patterns.price_changes)
Generate news article
IF tone_shift.significance in ['MAJOR', 'MODERATE']: article_id = generate_news_article(ticker, analysis)
Step 5: Generate Trading Signal action = derive_action_from_shift(tone_shift)
create_trading_signal( ticker=ticker, action=action, source='ceo_analysis', confidence=tone_shift.confidence, metadata={ "tone_shift": tone_shift, "historical_patterns": similar_patterns, "article_id": article_id } )
Output Format
{ "ticker": "AAPL", "ceo_name": "Tim Cook", "filing_type": "10-Q", "filing_date": "2025-10-31", "quarter": "2025-Q3", "analysis_timestamp": "2025-12-21T13:00:00Z",
"current_quarter_analysis": { "ceo_quotes": [ { "quote": "We are doubling down on AI investments and see unprecedented demand", "source": "Earnings Call", "timestamp": "2025-11-01 16:00", "tone": "VERY_POSITIVE", "key_phrases": ["doubling down", "unprecedented demand"] }, { "quote": "iPhone sales exceeded our most optimistic projections", "source": "10-Q Filing", "tone": "VERY_POSITIVE", "key_phrases": ["exceeded", "optimistic"] } ], "aggregated_tone": "VERY_POSITIVE", "tone_level": 2, "confidence": 0.90 },
"previous_quarter_analysis": { "quarter": "2025-Q2", "aggregated_tone": "POSITIVE", "tone_level": 1 },
"tone_shift": { "shift_magnitude": 1, "significance": "MODERATE", "direction": "UPGRADE", "trading_signal": "BULLISH", "confidence": 0.70, "interpretation": "CEO 어조가 긍정에서 매우 긍정으로 상향. 공격적 투자 시사." },
"historical_pattern_analysis": { "similar_past_instances": [ { "date": "2022-02-01", "quarter": "2022-Q1", "shift": "UPGRADE", "ceo_quote": "Aggressive R&D expansion...", "subsequent_price_change_3m": "+12.5%", "subsequent_price_change_6m": "+18.2%" }, { "date": "2020-11-01", "quarter": "2020-Q4", "shift": "UPGRADE", "ceo_quote": "Record pipeline...", "subsequent_price_change_3m": "+15.8%", "subsequent_price_change_6m": "+22.1%" } ], "pattern_count": 2, "average_price_change_3m": "+14.2%", "average_price_change_6m": "+20.2%", "pattern_reliability": 0.75, "interpretation": "과거 유사 패턴에서 평균 3개월 +14% 상승" },
"trading_recommendation": { "action": "BUY", "confidence": 0.75, "reasoning": "CEO tone upgrade (POSITIVE → VERY_POSITIVE) + 과거 패턴 평균 +14% (3M)", "target_price_3m": 205.00, "expected_return_3m": 0.14, "stop_loss": 185.00 },
"news_article_generated": { "article_id": 789, "headline": "AAPL CEO Tone Shift: 공격적 AI 투자 암시", "summary": "Tim Cook CEO가 실적 발표에서 '전례 없는 수요'와 'AI 투자 배가' 언급. 과거 유사 패턴 분석 시 평균 +14% 상승.", "sentiment_score": 0.8 },
"key_risks": [ "과거 패턴이 반복되지 않을 수 있음", "거시경제 환경 변화", "경쟁사 동향" ] }
Examples
Example 1: Major Upgrade (CAUTIOUS → VERY_POSITIVE)
Previous Q: "Uncertain macro environment, prudent approach..." Tone: CAUTIOUS (-1)
Current Q: "Record demand! Doubling capex, aggressive hiring!" Tone: VERY_POSITIVE (+2)
Shift: +3 (MAJOR UPGRADE) → Signal: STRONG_BUY → Confidence: 0.90 → Expected: +20% (based on 2018 similar pattern)
Example 2: Moderate Downgrade
Previous Q: "Strong performance, confident outlook..." Tone: POSITIVE (+1)
Current Q: "Monitoring headwinds closely, cautious on guidance..." Tone: CAUTIOUS (-1)
Shift: -2 (MODERATE DOWNGRADE) → Signal: BEARISH → Confidence: 0.75 → Expected: -8% (based on 2019, 2021 patterns)
Guidelines
Do's ✅
-
Context 중시: 동일 단어도 문맥에 따라 다름
-
Historical Pattern 확인: 과거 유사 사례 필수
-
Quote 원문 보존: 해석 편향 방지
-
News Article 생성: 중요한 shift는 기사화
Don'ts ❌
-
단일 문장으로 판단 금지
-
과거 패턴 무시 금지
-
CEO 개인 성향 고려 안 함 금지 (Musk vs Cook)
-
Pattern reliability < 60% 시 과신 금지
Integration
SEC Filings Extraction
from backend.data.sec_client import SECClient
sec = SECClient()
Get latest 10-Q
filing = sec.get_latest_filing(ticker='AAPL', form_type='10-Q')
Extract MD&A section (Management Discussion & Analysis)
mda_section = sec.extract_section(filing, section='MDNA')
Extract CEO quotes
ceo_quotes = extract_ceo_statements(mda_section)
Earnings Call Transcripts
from backend.data.earnings_call_client import EarningsCallClient
earnings = EarningsCallClient()
Get latest transcript
transcript = earnings.get_latest_transcript(ticker='AAPL')
Extract CEO portion
ceo_remarks = transcript.get_executive_remarks(executive='CEO')
Performance Metrics
-
Tone Detection Accuracy: > 85%
-
Pattern Matching Recall: > 80% (주요 패턴 포착)
-
Generated Signal Accuracy: > 70%
-
News Article Usefulness: > 4/5
Version History
- v1.0 (2025-12-21): Initial release with tone shift detection and historical pattern matching