| name | ceo-speech-agent |
| description | CEO statement tone shift analyzer for /ceo-analysis page. Analyzes CEO quotes from SEC filings, earnings calls to detect tone changes (positive→cautious, cautious→aggressive) and finds historical similar patterns. Generates news articles when significant shifts detected. |
| license | Proprietary |
| compatibility | Requires SEC filings, earnings transcripts, NLP tone analysis, historical pattern database |
| metadata | [object Object] |
CEO Speech Agent - CEO 발언 Tone Shift 분석
Role
/ceo-analysis 페이지에서 CEO 발언의 Tone Shift(어조 변화)를 감지하여 숨겨진 trading signals를 찾습니다.
Core Capabilities
1. 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
2. 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
3. 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
}
4. 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