ceo-speech-agent

psh355q-ui's avatarfrom psh355q-ui

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.

⭐0stars🔀0forks📁View on GitHub🕐Updated Dec 27, 2025

When & Why to Use This Skill

The CEO Speech Agent is a specialized financial sentiment analysis tool that monitors and interprets 'Tone Shifts' in executive communications. By analyzing SEC filings and earnings call transcripts, it identifies subtle changes in management confidence—such as transitioning from a cautious to an aggressive stance. It leverages historical pattern matching to correlate these shifts with past stock performance, providing high-value trading signals and automated news generation for financial analysts and investors.

Use Cases

  • Investment Strategy & Alpha Generation: Use tone shift detection to identify bullish or bearish signals from CEO remarks that traditional quantitative data might miss.
  • Earnings Season Automation: Automatically process hundreds of quarterly earnings transcripts to flag significant management sentiment changes and generate summary reports.
  • Historical Trend Analysis: Compare current executive 어조 (tone) with 5-year historical data to predict potential 3-month and 6-month price impacts based on similar past instances.
  • Financial News Reporting: Rapidly generate news drafts and headlines when a 'Major' or 'Moderate' tone shift is detected in new 10-K or 10-Q filings.
  • Risk Mitigation: Detect early warning signs of corporate distress by identifying 'Cautious' or 'Negative' linguistic indicators and hedging language in management discussion sections (MD&A).
nameceo-speech-agent
descriptionCEO 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.
licenseProprietary
compatibilityRequires SEC filings, earnings transcripts, NLP tone analysis, historical pattern database
authorai-trading-system
version"1.0"
categoryanalysis
agent_roleceo_analyst

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