← Makalelere geri dön
March 20, 2026
5 dakikalık okuma

LLM Alpha Madenciliği: Kazanç Görüşmelerinden ve Finansal Belgelerden Alım Satım Sinyalleri Nasıl Çıkarılır

LLM Alpha Madenciliği: Kazanç Görüşmelerinden ve Finansal Belgelerden Alım Satım Sinyalleri Nasıl Çıkarılır
#llm
#alpha
#kazanç
#nlp
#gpt
#finansal-analiz
#algo-trading

Wall Street'te bir fıkra dolaşır: "Bir kazanç görüşmesindeki en değerli bilgi, CEO'nun ne söylediği değil, nasıl söylediğidir." Tim Cook, geçen yılki "çok memnunuz" yerine "temkinli bir şekilde iyimseriz" dediğinde — bu bir dil oyunu değil, yüzlerce milyon dolar değerinde bir sinyaldir.

On yıllar boyunca quant fonları bu sinyallerin sistematik olarak çıkarılmasını denedi. Önce sözlükler kullanarak "olumlu" ve "olumsuz" kelimelerin sıklığını saydılar. Sonra BERT'i devreye soktular. Ve şimdi kurumsal çift anlamlı konuşmanın inceliklerini araştırmacıları bile korkutan bir doğrulukla çözebilen GPT-4o, Claude ve açık kaynaklı LLM'lerimiz var.

Kazanç görüşmelerinden alım satım sinyalleri çıkaran tam teşekküllü bir pipeline'ın nasıl oluşturulacağını ele alalım — transkriptin elde edilmesinden kümülatif anormal getirilerin backtesting'ine kadar.

Neden Kazanç Görüşmeleri Alpha İçin Bir Altın Madeni?

Post-Earnings Announcement Drift: Ölmeyen Anomali

1968'de Ball ve Brown tuhaf bir şey keşfetti: üç aylık sonuçlar açıklandıktan sonra hisseler, "sürpriz" yönünde 60-90 gün daha sürüklenmeye devam ediyor. Buna Post-Earnings Announcement Drift (PEAD) adını verdiler. O günden bu yana yarım asırdan fazla zaman geçti, yüzlerce makale yazıldı, anomali düzinelerce açıdan açıklandı — ve hâlâ işliyor.

PEAD, finans tarihinin en kalıcı piyasa anomalilerinden biridir. "Olumlu sürprizi al, olumsuz sürprizi sat" portföy stratejisi tarihsel olarak yıllık %10-25 fazla getiri sağlamıştır. Peki piyasa neden bunu arbitraj ile ortadan kaldırmadı? Birkaç nedeni var:

  • Sınırlı yatırımcı dikkati — aynı haftada 200 şirket rapor açıkladığında tüm transkriptleri okumak fiziksel olarak imkânsızdır
  • Bilişsel karmaşıklık — bir kazanç görüşmesi 45-60 dakika sürer ve kilit sinyal, Soru&Cevap oturumunun 38. dakikasında tek bir cümleye gömülü olabilir
  • Dil belirsizliği — CFO "rüzgara karşı ilerliyoruz" diyor ve bağlam olmadan bunun yumuşak bir uyarı mı yoksa standart bir çit mi olduğu belli değil

İşte burada LLM'ler sahneye giriyor. İlk kez, deneyimli analistlerin bile gözden kaçıracağı nüansları yakalayarak bir akşamda 500 transkripti işleyebilen bir araca sahibiz.

PEAD.txt: Metin Sayılardan Daha Önemlidir

Philadelphia Federal Rezerv Bankası araştırmacıları (Meursault, Liang, Routledge, Scanlon), standart kazanç sürprizi hakkındaki varsayımları altüst eden PEAD.txt makalesini yayımladı. Standart kazanç sürprizinin metin tabanlı bir analogu olan SUE.txt'i oluşturdular — bu analog sayısal kazanç değerini hiç kullanmıyor.

Sonuç? SUE.txt, klasik PEAD'ın iki katı büyüklüğünde bir sürüklenme üretiyor. Üstelik: son yıllarda sayısal sürprizlere dayalı klasik PEAD neredeyse yok olurken (piyasa bunu öğrendi), metinsel sürüklenme anlamlı olmaya devam ediyor. Piyasa sayıları hızla işlemeyi öğrendi ama metin yorumlamakta hâlâ zorlanıyor.

Bu, kazanç görüşmelerine NLP tabanlı yaklaşımın lehine temel argümandır.

Duyarlılıktan Semantiğe: Yaklaşımların Evrimi

Duyarlılıktan semantiğe

Birinci Nesil: Bag-of-Words ve Sözlükler (2000-2015)

Her şey Loughran-McDonald sözlüğüyle başladı (2011) — "olumlu", "olumsuz", "belirsiz" ve "hukuki" olarak etiketlenmiş bir kelime listesi. Fikir, basitliğiyle zarifti: bir 10-K dosyasındaki olumsuz kelime yüzdesini sayın ve buna göre işlem yapın.

Sorun? "Outstanding" kelimesi finansal bağlamda çoğunlukla "ödenmemiş borç" anlamına gelir, "mükemmel sonuç" değil. Risk Yönetimi'ndeki "risk" olumsuz bir sinyal değil — bir süreç tanımıdır. Standart NLP duyarlılık sözlükleri finansal metinlerde utanç verici derecede kötü performans gösterdi.

Loughran ve McDonald durumu iyileştiren özel bir sözlük oluşturdu, ancak temel sorun kaldı: bag-of-words bağlamı anlamıyor. "Beklentileri karşılamamayı başaramadık" — burada iki "olumsuz" kelime var, ama anlam olumlu.

İkinci Nesil: FinBERT ve Transformerlar (2019-2023)

2019'da Dogu Araci, Reuters TRC2'den alınan finansal metinler üzerinde ince ayar yapılmış BERT olan FinBERT'i yayımladı. Sonuçlar etkileyiciydi: Financial PhraseBank veri setinde o zamanki en iyi sonuca göre 14 yüzde puanlık iyileşme. FinBERT bağlamı anladı: "outstanding", "debt"in yanında — olumsuz; "performance"ın yanında — olumlu.

Ancak FinBERT'in bir sınırı vardı: 512 token'lık bağlam penceresi. Bir kazanç görüşmesi 8.000-12.000 kelime çalışır. Parçalara bölmek ve duyarlılığı ortalamalamak, paragraflar arası semantiği kaybetmek anlamına gelir. CEO iyimserlikle başlayabilir, ardından Soru&Cevap sırasında tedarik zinciri sorunlarını rahatça dile getirebilir. FinBERT her parçayı bağımsız olarak analiz eder ve bu tezatı kaçırır.

Üçüncü Nesil: Uzun Bağlamlı LLM'ler (2023-Günümüz)

128K-1M token bağlam penceresine sahip GPT-4, Claude, Gemini oyunun kurallarını değiştirdi. Artık tüm bir transkripti tek seferde yükleyebilir ve tüm belgeyi anlamayı gerektiren sorular sorabilirsiniz.

Kilit çalışma — Lopez-Lira ve Tang (2023) "ChatGPT Hisse Senedi Fiyat Hareketlerini Tahmin Edebilir mi?" 50.000'den fazla başlık üzerinde GPT-4, başlangıç piyasa tepkisinin yönünü tahmin etmede ~%90 isabet oranı gösterdi ve özellikle küçük sermayeli şirketler ve olumsuz haberler için sonraki sürüklenmeyi anlamlı biçimde tahmin etti. Önceki modeller (GPT-1, GPT-2, BERT) bu yeteneği göstermedi — tahmin gücü büyük modellerin ortaya çıkan bir özelliği olarak belirdi.

BloombergGPT (2023) — Bloomberg'in finansal korpusu üzerinde eğitilmiş 50 milyar parametreli bir model — finansal NER, haber sınıflandırması ve duyarlılık analizinde iyileşmeler gösterdi. FinGPT — onun açık kaynaklı alternatifi — veri merkezli bir yaklaşım ve RAG kullanarak finansal duyarlılık görevlerinde %89 doğruluk elde ediyor.

S&P 100 analizi için Chain-of-Thought ve In-Context Learning ile GPT-4 kullanan MarketSenseAI, 15 aylık test sürecinde %10-30 fazla alpha ve %72'ye kadar kümülatif getiri gösterdi. Evet, bu sayılara dikkatli yaklaşılmalı (backtest ≠ canlı trading), ancak eğilim açık.

Veri Pipeline'ı: Veriler Nereden Alınır

SEC EDGAR: Resmi Kaynak

ABD hisseleri için birincil kaynak SEC EDGAR'dır. Kazanç görüşmeleri genellikle doğrudan dosyalanmaz, ancak ilgili belgeler mevcuttur:

  • 8-K dosyaları (Madde 2.02 — Faaliyet Sonuçları) — genellikle transkriptle birlikte ek 99 içeren sonuç basın bültenleri
  • 10-Q / 10-K — Yönetim Tartışma ve Analizi (MD&A) içeren üç aylık ve yıllık raporlar — değerli bir metin kaynağı
  • DEF 14A — yönetim ücret bilgileri içeren vekâletname beyanları
from edgar import Company

company = Company("AAPL")
filings = company.get_filings(form="8-K")

for filing in filings.latest(10):
    if "2.02" in str(filing.items):
        doc = filing.document()
        text = doc.text()  # Eklerle birlikte tam metin
        print(f"{filing.filing_date}: {len(text)} karakter")

Seeking Alpha ve Ticari API'lar

Kazanç görüşmesi transkriptleri ayrı bir üründür. Seeking Alpha tarihsel olarak ana ücretsiz kaynak olmuştur, ancak artık erişimi kısıtlamaktadır. Ticari seçenekler:

  • Seeking Alpha Premium API — konuşmacı etiketleriyle tam transkriptler
  • AlphaVantage Earnings API — sınırlamaları olan ücretsiz katman
  • Financial Modeling Prep — transkriptler + temel veriler
  • Earnings Call Edge / Motley Fool Transcripts — alternatif kaynaklar

Kripto: Governance Görüşmeleri ve DAO Teklifleri

İşte burada işler ilginçleşiyor. Büyük DeFi protokolleri kazanç görüşmelerinin eşdeğerini düzenliyor:

  • Uniswap — governance görüşmeleri, topluluk görüşmeleri, YouTube'da kayıtlar
  • Aave — aylık topluluk görüşmeleri + governance forum teklifleri
  • MakerDAO — governance görüşmeleri + kapsamlı forum tartışmaları
  • Compound — ayrıntılı tartışmalı governance teklifleri

Kripto görüşme transkriptleri genellikle yapılandırılmamıştır. Çözüm — YouTube kayıtlarını transkript etmek için OpenAI'nin Whisper'ı:

import openai
from yt_dlp import YoutubeDL

def transcribe_governance_call(youtube_url: str) -> str:
    """YouTube'dan ses indir ve Whisper aracılığıyla transkript oluştur."""
    ydl_opts = {
        'format': 'bestaudio/best',
        'postprocessors': [{
            'key': 'FFmpegExtractAudio',
            'preferredcodec': 'mp3',
            'preferredquality': '64',  # Konuşma için düşük bit hızı yeterli
        }],
        'outtmpl': '/tmp/governance_call.%(ext)s',
    }

    with YoutubeDL(ydl_opts) as ydl:
        ydl.download([youtube_url])

    client = openai.OpenAI()

    with open("/tmp/governance_call.mp3", "rb") as audio_file:
        transcript = client.audio.transcriptions.create(
            model="whisper-1",
            file=audio_file,
            response_format="verbose_json",
            timestamp_granularities=["segment"]
        )

    return transcript.text

Whisper API aracılığıyla transkripsiyon maliyeti: 0,006/dk.Birsaatlikbirgovernancego¨ru¨s\cmesi 0,36/dk. Bir saatlik bir governance görüşmesi ~0,36'a mal olur. Kendi sunucunuzda barındırma seçeneği için — Whisper Large-v3 Turbo, modern bir GPU'da 60 dakikalık bir dosyayı ~17 saniyede transkript eder (216x gerçek zamanlı).

LLM Prompting Stratejileri: Naiften Production'a

Sinyal çıkarım pipeline'ı

Strateji 1: Doğrudan Duyarlılık (Zayıf)

En naif yaklaşım — modele doğrudan sormak:

"Bu kazanç görüşmesi hisse senedi fiyatı için olumlu mu olumsuz mu?"

Bu işe yarıyor mu? Evet, şaşırtıcı biçimde. Lopez-Lira ve Tang, böylesine basit bir prompt'un bile istatistiksel olarak anlamlı tahminler ürettiğini gösterdi. Ancak sorunlar var:

  • İkili çıktı — nüansları kaybediyorsunuz. "Felaket" ve "hafif hayal kırıklığı" aynı etiketi alıyor
  • Açıklama yok — modelin kararını neye dayandırdığı belirsiz
  • Kararsızlık — tekrarlanan bir çalıştırma farklı bir yanıt verebilir

Strateji 2: Chain-of-Thought ile Yapılandırılmış Çıkarım (Güçlü)

Fikir: tek bir sayı yerine, modeli her adımı açıklamaya zorlayarak yapılandırılmış bir sinyal seti çıkarmak.

from pydantic import BaseModel, Field
from openai import OpenAI
from enum import Enum
from typing import Optional


class SentimentLevel(str, Enum):
    VERY_BEARISH = "very_bearish"
    BEARISH = "bearish"
    NEUTRAL = "neutral"
    BULLISH = "bullish"
    VERY_BULLISH = "very_bullish"


class GuidanceSurprise(BaseModel):
    """İleriye dönük yönlendirmenin konsensüs beklentilerinden sapması."""
    revenue_guidance_vs_consensus: Optional[float] = Field(
        None, description="Gelir yönlendirmesinin konsensüsten % sapması"
    )
    margin_guidance_direction: Optional[str] = Field(
        None, description="genişliyor / sabit / daralıyor"
    )
    key_quote: str = Field(
        description="Yönlendirme içeren birebir alıntı"
    )
    reasoning: str = Field(
        description="CoT: bu yönlendirme neden önemli"
    )


class ConfidenceMetrics(BaseModel):
    """Yönetim güven metrikleri."""
    hedge_word_count: int = Field(
        description="Çit kelime sayısı: 'yaklaşık', 'potansiyel olarak', 'tabi ki'"
    )
    forward_looking_ratio: float = Field(
        description="Geleceğe yönelik ifadelerin toplam ifadelere oranı"
    )
    q_and_a_evasion_count: int = Field(
        description="CEO/CFO'nun kaçamak yanıt verdiği soru sayısı"
    )
    ceo_vs_cfo_sentiment_delta: float = Field(
        description="CEO ve CFO arasındaki duyarlılık farkı (-1 ile 1 arası). Sapma bir kırmızı bayraktır"
    )


class CompetitiveIntelligence(BaseModel):
    """Rakip ve piyasa konumuna ilişkin bahisler."""
    competitors_mentioned: list[str] = Field(
        description="Bahsedilen rakiplerin listesi"
    )
    market_share_claims: list[str] = Field(
        description="Pazar payı iddiaları"
    )
    new_product_signals: list[str] = Field(
        description="Yeni ürünler/hizmetlere ilişkin sinyaller"
    )


class ManagementSignals(BaseModel):
    """Yönetim sinyalleri."""
    turnover_risk: SentimentLevel = Field(
        description="Kilit yönetim değişimi riski"
    )
    tone_shift_from_previous: Optional[str] = Field(
        None, description="Ton bir önceki çeyreğe kıyasla nasıl değişti"
    )
    insider_language_flags: list[str] = Field(
        description="İşaretçi ifadeler: 'stratejik alternatifleri araştırıyoruz', 'yeniden boyutlandırma', vb."
    )


class EarningsCallAnalysis(BaseModel):
    """Eksiksiz kazanç görüşmesi analizi."""
    ticker: str
    quarter: str
    overall_sentiment: SentimentLevel
    sentiment_score: float = Field(description="-1.0 ile 1.0 arasında")
    guidance_surprise: GuidanceSurprise
    confidence_metrics: ConfidenceMetrics
    competitive_intel: CompetitiveIntelligence
    management_signals: ManagementSignals
    key_risks: list[str]
    key_catalysts: list[str]
    one_line_summary: str


def analyze_earnings_call(transcript: str, ticker: str, quarter: str) -> EarningsCallAnalysis:
    """
    Bir kazanç görüşmesinden yapılandırılmış sinyaller çıkar.
    Maliyet: görüşme başına ~0,15-0,30$ (GPT-4o, ~10K token girdi).
    """
    client = OpenAI()

    system_prompt = """Siz 20 yıllık deneyime sahip kıdemli bir hisse senedi araştırma analistisiniz.
Aşağıdaki kazanç görüşmesi transkriptini analiz edin ve yapılandırılmış alım satım sinyalleri çıkarın.

ÖNEMLİ TALİMATLAR:
1. Her alan için Chain-of-Thought muhakemesi kullanın — değeri vermeden önce NEDEN'i açıklayın
2. Mutlak ifadelere değil, beklentilerden SAPMALARA odaklanın
3. Soru&Cevap bölümüne özellikle dikkat edin — yönetim burada daha az senaryoluş
4. Yönetimin dilini tipik kurumsal çit oluşturma temeline göre karşılaştırın
5. "Stratejik alternatifler", "yeniden boyutlandırma" veya diğer örtmeceli ifadeleri işaretleyin
6. Duyarlılığı mutlak değil, piyasa beklentilerine göreli olarak puanlayın

SAYILACAK ÇİT KELİMELER: approximately, potentially, subject to, may, might,
could, uncertain, challenging, headwinds, navigate, prudent, cautious,
evolving, dynamic, unprecedented, transitional"""

    completion = client.beta.chat.completions.parse(
        model="gpt-4o",
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": f"Ticker: {ticker}\nÇeyrek: {quarter}\n\n{transcript}"}
        ],
        response_format=EarningsCallAnalysis,
        temperature=0.1,  # Tekrarlanabilirlik için düşük sıcaklık
    )

    return completion.choices[0].message.parsed

Birkaç kilit noktaya dikkat edin:

Pydantic şeması — OpenAI Structured Outputs %100 şema uyumluluğunu garanti eder. Artık "üzgünüm, JSON'u ayrıştıramıyorum" yok. Her alanın analizin belirli bir yönü için mini-prompt görevi gören bir açıklaması var.

Şema içinde Chain-of-Thoughtreasoning ve key_quote alanları modeli "çalışmasını göstermeye" zorlar. Bu yalnızca kaliteyi iyileştirmekle kalmaz (model bir karar vermeden önce belirli bir alıntı bulmaya zorlanır) aynı zamanda düzenleyiciler için bir denetim izi oluşturur.

Sıcaklık 0.1 — yaratıcılık istemiyoruz. Tekrarlanabilirliğe ihtiyacımız var. Sıcaklık 0'da model bazen kalıplara "takılıyor"; 0.1 en uygun uzlaşıdır.

Strateji 3: Tarihsel Örneklerle Few-Shot

Daha da güçlü — modele fiili piyasa reaksiyonlarıyla birlikte geçmiş kazanç görüşmelerinin örneklerini verin:

few_shot_examples = """
ÖRNEK 1:
Transkript alıntısı: "İkinci yarı için temkinli bir şekilde iyimseriz...
Makro rüzgarlara karşı ilerlemeye devam ederken, pipeline'ımız güçlü kalıyor."
Gerçek piyasa reaksiyonu: -3,2% (ertesi gün)
Analiz: Yüzeysel olumluluğa rağmen, "temkinli iyimserlik" bir önceki
çeyreğin "çok güveniyoruz"undan bir AŞAĞI DÜŞÜRME'dir. İki cümlede
beş çit kelime. Piyasa çit oluşturmayı gördü.

ÖRNEK 2:
Transkript alıntısı: "Açıkçası talep, arzımızın çok ötesine geçti.
Bunu gidermek için CapEx'i hızlandırıyoruz."
Gerçek piyasa reaksiyonu: +7,8% (ertesi gün)
Analiz: "Açıkçası" yönetim için bile gerçek bir sürpriz sinyali veriyor.
Talep üzerine hızlandırılmış CapEx = güçlü güven. Çit dili yok.
"""

Few-shot örnekler modelin kalibre olmasına yardımcı olur: "temkinli iyimserlik"in Wall Street dilinde olumlu olmadığını — yumuşak bir olumsuz olduğunu öğrenir. Örnekler olmadan LLM kelimeleri literal olarak yorumlayabilir.

Dört Sinyal Türü

1. Guidance Sürprizi

En doğrudan sinyal. Bir şirket bir sonraki çeyrek/yıl için tahmin (guidance) sağlar ve piyasa, konsensüsten sapmaya tepki verir. LLM, yönetim belirsiz bir şekilde iletişim kursa bile yönlendirmeyi çıkarabilir:

  • "Gelirlerin şu aralıkta olmasını bekliyoruz..." — doğrudan yönlendirme, ayrıştırması kolay
  • "Mevcut Wall Street tahminlerinden memnunuz" — konsensüsün örtük onayı
  • "Konsensüse göre artılar ve eksiler var" — örtük risk sinyali

LLM üç ifadeyi de anlıyor; regex yalnızca ilkini anlıyor.

2. Güven Metrikleri: Çit Kelime Yoğunluğu

Bu benim en sevdiğim sinyal çünkü sezgiye aykırı. Özü: yöneticiler hukuki eğitim almış ve paranoyak hukuk departmanlarına sahip insanlardır. İşler iyi giderken, spesifik olmalarına izin verirler. Sorunlar baş gösterdiğinde — çit oluşturmaya başlarlar.

İzlenecek metrikler:

Metrik Açıklama Ayı Sinyali
Çit kelime yoğunluğu 1.000 kelime başına çit kelime payı 1.000 kelimede > 15
Kesinlik oranı "will/expect" ile "may/could" oranı < 1,5
Soru&Cevap kaçamak oranı Doğrudan yanıt verilmeyen soru % > %30
CEO/CFO delta CEO ve CFO arasındaki ton sapması [-1, 1] ölçeğinde > 0,3

Son nokta özellikle ilginç. CEO bir hikaye anlatıcısıdır — görevi güzel bir tablo çizmektir. CFO denetçilere karşı sorumlu olan kişidir. CEO "önümüzde dönüştürücü büyüme var" deyip CFO hemen "disiplinli maliyet yönetimini korurken" diye araya girdiğinde — bu sapma iç gerilimlere işaret eder.

3. Rekabetçi İstihbarat

LLM, yönetim doğrudan isimlerden kaçınsa bile bir transkriptten rakip bahislerini çıkarabilir. "Piyasadaki en büyük oyuncu" — sektörü biliyorsa GPT-4 için bu bir gizem değil.

Alım satım sinyali: A şirketi kazanç görüşmesinde B rakibini olumsuz bir bağlamda dile getirirse ("pazar payı alıyoruz..."), bu yalnızca A için (uzun) değil, aynı zamanda B için de (kısa) bir sinyaldir. Bir pairs trade.

4. Yönetim Değişimi Sinyalleri

Yönetim değişiklikleri veya stratejik dönüşümler için işaretçi ifadeler:

  • "Stratejik alternatifleri araştırıyoruz" — muhtemelen şirket satışı
  • "Operasyonlarımızı yeniden boyutlandırıyoruz" — toplu işten çıkarmalar
  • "Yönetim kurulu kapsamlı bir inceleme başlattı" — CEO yakında ayrılacak
  • "Taze bakış açıları getiriyoruz" — mevcut ekip başarısız oldu

Bu ifadelerin her biri, sonraki fiyat dinamikleriyle istatistiksel olarak anlamlı korelasyona sahiptir. LLM bunları sıfır yanlış pozitifle tespit edebilir — çünkü bir ürün hattı açıklamasında "stratejik alternatifleri" yakalayabilecek regex'in aksine bağlamı anlıyor.

Backtesting: Olay Çalışması Metodolojisi

Olay çalışması sonuçları

Sinyal üretiyoruz — harika. Ama işe yarıyor mu? Standart doğrulama yöntemi, Kümülatif Anormal Getiriler (CAR) hesaplamasıyla Olay Çalışması'dır.

Metodoloji

  1. Olayı tanımlayın — kazanç görüşmesi tarihi
  2. Tahmin penceresi — "normal" getirileri tahmin etmek için olaydan önce [-250, -30] işlem günü
  3. Olay penceresi — olayın etrafında [-1, +60] gün
  4. Normal getirileri hesaplayın piyasa modeli aracılığıyla: Rit=αi+βiRmt+ϵitR_{it} = \alpha_i + \beta_i R_{mt} + \epsilon_{it}
  5. Anormal getiri — gerçek ve "normal" getiriler arasındaki fark
  6. CAR — olay penceresindeki anormal getirilerin kümülatif toplamı
import numpy as np
import pandas as pd
from scipy import stats
from dataclasses import dataclass


@dataclass
class EventStudyResult:
    car: np.ndarray          # Güne göre kümülatif anormal getiriler
    t_stats: np.ndarray      # Her gün için t-istatistikleri
    avg_car_3d: float        # CAR[-1, +1]
    avg_car_30d: float       # CAR[-1, +30]
    avg_car_60d: float       # CAR[-1, +60]
    p_value_3d: float
    p_value_30d: float
    n_events: int


def run_event_study(
    returns: pd.DataFrame,       # Günlük hisse senedi getirileri (sütunlar = ticker'lar)
    market_returns: pd.Series,   # Günlük piyasa endeksi getirileri
    events: pd.DataFrame,        # Sütunları olan DataFrame: [ticker, date, signal_score]
    estimation_window: int = 220,
    gap: int = 30,
    event_window: tuple = (-1, 60),
) -> EventStudyResult:
    """
    LLM sinyallerinin tahmin gücünü değerlendirmek için olay çalışması.

    Olayları signal_score'a göre sırala, uzun/kısa portföyler oluştur,
    CAR hesapla ve istatistiksel anlamlılığı test et.
    """
    all_cars = []

    for _, event in events.iterrows():
        ticker = event['ticker']
        event_date = event['date']

        if ticker not in returns.columns:
            continue

        try:
            event_idx = returns.index.get_loc(event_date, method='ffill')
        except KeyError:
            continue

        est_start = event_idx - estimation_window - gap
        est_end = event_idx - gap

        if est_start < 0:
            continue

        y = returns.iloc[est_start:est_end][ticker].values
        x = market_returns.iloc[est_start:est_end].values

        mask = ~(np.isnan(y) | np.isnan(x))
        if mask.sum() < 60:  # Minimum 60 gözlem
            continue

        y_clean, x_clean = y[mask], x[mask]

        slope, intercept, _, _, _ = stats.linregress(x_clean, y_clean)
        residual_std = np.std(y_clean - (intercept + slope * x_clean))

        ev_start = event_idx + event_window[0]
        ev_end = event_idx + event_window[1] + 1

        if ev_end > len(returns):
            continue

        actual = returns.iloc[ev_start:ev_end][ticker].values
        market = market_returns.iloc[ev_start:ev_end].values

        expected = intercept + slope * market
        ar = actual - expected
        car = np.cumsum(ar)

        all_cars.append(car)

    if not all_cars:
        raise ValueError("Geçerli olay bulunamadı")

    min_len = min(len(c) for c in all_cars)
    all_cars = np.array([c[:min_len] for c in all_cars])

    mean_car = np.mean(all_cars, axis=0)
    std_car = np.std(all_cars, axis=0) / np.sqrt(len(all_cars))
    t_stats = mean_car / (std_car + 1e-10)

    offset = -event_window[0]  # Olay tarihine kaydırma

    car_3d = mean_car[min(offset + 1, min_len - 1)] if min_len > offset + 1 else mean_car[-1]
    car_30d = mean_car[min(offset + 30, min_len - 1)] if min_len > offset + 30 else mean_car[-1]
    car_60d = mean_car[min(offset + 60, min_len - 1)] if min_len > offset + 60 else mean_car[-1]

    n = len(all_cars)
    p_3d = 2 * (1 - stats.t.cdf(abs(car_3d / (np.std([c[min(offset+1, min_len-1)] for c in all_cars]) / np.sqrt(n) + 1e-10)), df=n-1))
    p_30d = 2 * (1 - stats.t.cdf(abs(car_30d / (np.std([c[min(offset+30, min_len-1)] for c in all_cars]) / np.sqrt(n) + 1e-10)), df=n-1))

    return EventStudyResult(
        car=mean_car,
        t_stats=t_stats,
        avg_car_3d=car_3d,
        avg_car_30d=car_30d,
        avg_car_60d=car_60d,
        p_value_3d=p_3d,
        p_value_30d=p_30d,
        n_events=n,
    )


def backtest_llm_signals(
    llm_signals: pd.DataFrame,  # [ticker, date, sentiment_score]
    returns: pd.DataFrame,
    market_returns: pd.Series,
):
    """Backtest: üst dilim sinyalleri uzun, alt dilim sinyalleri kısa."""

    llm_signals['quintile'] = pd.qcut(
        llm_signals['sentiment_score'], 5, labels=[1, 2, 3, 4, 5]
    )

    long_events = llm_signals[llm_signals['quintile'] == 5].copy()
    short_events = llm_signals[llm_signals['quintile'] == 1].copy()

    long_result = run_event_study(returns, market_returns, long_events)
    short_result = run_event_study(returns, market_returns, short_events)

    print(f"UZUN portföy (üst dilim LLM duyarlılığı):")
    print(f"  CAR[0,+3]:  {long_result.avg_car_3d:+.2%} (p={long_result.p_value_3d:.4f})")
    print(f"  CAR[0,+30]: {long_result.avg_car_30d:+.2%} (p={long_result.p_value_30d:.4f})")
    print(f"  N olay:     {long_result.n_events}")

    print(f"\nKISA portföy (alt dilim LLM duyarlılığı):")
    print(f"  CAR[0,+3]:  {short_result.avg_car_3d:+.2%} (p={short_result.p_value_3d:.4f})")
    print(f"  CAR[0,+30]: {short_result.avg_car_30d:+.2%} (p={short_result.p_value_30d:.4f})")
    print(f"  N olay:     {short_result.n_events}")

    ls_3d = long_result.avg_car_3d - short_result.avg_car_3d
    ls_30d = long_result.avg_car_30d - short_result.avg_car_30d
    print(f"\nUZUN-KISA spread:")
    print(f"  CAR[0,+3]:  {ls_3d:+.2%}")
    print(f"  CAR[0,+30]: {ls_30d:+.2%}")

Görmemiz Gerekenler

Mevcut araştırmalara dayanarak, LLM sinyalleri için gerçekçi CAR'lar:

Pencere Uzun portföy Kısa portföy U/K spread
[0, +1] +%0,8 — +%1,5 -%0,5 — -%1,2 %1,3 — %2,7
[0, +30] +%1,5 — +%3,0 -%1,0 — -%2,5 %2,5 — %5,5
[0, +60] +%2,0 — +%4,0 -%1,5 — -%3,5 %3,5 — %7,5

Kilit gösterge istatistiksel anlamlılıktır. p < 0,01 ve N > 200 olay ile güçlü bir sinyalden söz edebilirsiniz. p > 0,05 ile — gürültü olabilir.

Production Uygulaması: Jupyter'dan Production'a

Gerçek Zamanlı Pipeline Mimarisi

YouTube/Ses Akışı
       │
       ▼
┌─────────────────┐    ┌──────────────────┐
│  Whisper         │───▶│  Transkript       │
│  Transkripsiyon  │    │  Tamponu          │
│  (akış)          │    │  (Redis Stream)   │
└─────────────────┘    └──────────────────┘
                              │
                    ┌─────────┴─────────┐
                    ▼                   ▼
            ┌──────────────┐   ┌──────────────┐
            │ Gerçek       │   │ Tam görüşme  │
            │ Zamanlı Yığın│   │ Analizi      │
            │ Analizi      │   │ (görüşme     │
            │ (her 5dk)    │   │  bittikten   │
            │              │   │  sonra)      │
            └──────────────┘   └──────────────┘
                    │                   │
                    ▼                   ▼
            ┌──────────────────────────────┐
            │     Sinyal Toplayıcı         │
            │  (güven ağırlıklı birleşim)  │
            └──────────────────────────────┘
                         │
                         ▼
            ┌──────────────────────────────┐
            │     Trading Motoru           │
            │  (pozisyon boyutlandırma,    │
            │   risk yönetimi)             │
            └──────────────────────────────┘

Maliyet Analizi: Tek Bir Kazanç Görüşmesi Ne Kadar?

Production'da tek bir kazanç görüşmesini işlemenin ekonomisini inceleyelim:

Bileşen Maliyet Gecikme
Whisper API transkripsiyon (60 dk) 0,36$ ~17 sn (Turbo)
GPT-4o yapılandırılmış çıkarım 0,15-0,30$ ~8-15 sn
GPT-4o gerçek zamanlı yığın analizi (x12) 1,80-3,60$ her biri ~5 sn
RAG depolama için gömme 0,01$ <1 sn
Toplam (tam pipeline) 2,30-4,30$ ~30 sn tam

Bekleyin, tahmin görüşme başına 30-50$'dı. Bu rakamlar nereden geliyor? Modele ve yaklaşıma bağlı:

  • Bütçe seçeneği (GPT-4o-mini, tek geçiş): 0,50-1,00$
  • Standart seçenek (GPT-4o, yapılandırılmış çıkarım + yığın analizi): 2-5$
  • Premium seçenek (GPT-4o, çoklu geçiş, çapraz doğrulama, tarihsel karşılaştırma): 15-30$
  • Hedge fon düzeyi (çoklu modeller + insan incelemesi + gerçek zamanlı akış): 30-50$+

500 ticker işleyen bir quant fonu için bir kazanç sezonu işleme maliyeti (~6 haftada 2.000 görüşme) standart seçenekle 4.000-10.000$'dır. Pozisyon başına ortalama %1-3 alpha göz önünde bulundurulduğunda — ROI astronomiktir.

Gecikme: Milisaniyeler İçin Yarış

HFT dünyasında gecikme her şeydir. Ancak kazanç tabanlı stratejilerde durum farklıdır:

  1. Bir kazanç görüşmesi 45-60 dakika sürer — zamanınız var
  2. PEAD 60 günde yayılır — ilk saniyede girmenize gerek yok
  3. Ana dislokasyon görüşme bittikten sonraki ilk 30 dakikada gerçekleşir

Optimal strateji iki fazlıdır:

  • Faz 1 (gerçek zamanlı): görüşme sırasında 5 dakikalık yığınları analiz ederek ön sinyal oluşturun
  • Faz 2 (görüşme sonrası): bittikten 2-5 dakika sonra tüm transkriptin tam analizi

Faz 1, görüşmenin bitmesini bekleyen piyasa katılımcılarına karşı 5-10 dakikalık bir avantaj sağlar. Orta büyüklükteki hisseler için bu yeterlidir.

Kriptoya Genişleme: DeFi Governance ve DAO Teklifleri

Kripto piyasası, LLM alpha madenciliği için ideal bir test ortamıdır. İşte nedeni:

  1. Daha az kurumsal oyuncu — yani sömürülecek daha fazla verimsizlik
  2. Governance = kazanç görüşmesi — DAO kararları tokenomics'i doğrudan etkiler
  3. 7/24 piyasa — tepkiyi hemen işlem yapabilirsiniz
  4. Genel veri — tüm teklifler ve oylar zincir üzerindedir

Analiz İçin Kripto Olay Türleri

Governance Teklifleri (Aave, Compound, Uniswap)

Bir teklif protokol parametrelerini değiştirir — faiz oranları, teminat faktörleri, ücret anahtarları. LLM ekonomik etkiyi değerlendirebilir:

crypto_analysis_prompt = """Bu DeFi governance teklifini analiz edin.
Çıkarın:
1. Token sahipleri üzerindeki ekonomik etki (olumlu/olumsuz/tarafsız)
2. TVL etki tahmini (artış/azalış/sabit + büyüklük)
3. Diğer protokollere karşı rekabetçi konumlanma
4. Teklifin getirdiği risk faktörleri
5. Tarihsel emsal (diğer protokollerdeki benzer teklifler)
6. Forum tartışması duyarlılığına dayalı olası oylama sonucu

Teklif: {proposal_text}
Forum tartışması: {discussion_text}
"""

Protokol Güncelleme Duyuruları

Uniswap hooks'larla v4'ü duyurduğunda veya Aave GHO'yu piyasaya sürdüğünde — bu TradFi'daki ürün lansmanının eşdeğeridir. LLM, anlatı momentumunu ve teknik önemi değerlendirebilir.

Hazine Raporları

Büyük DAO'ların yüzlerce milyonluk hazineleri var. Üç aylık hazine raporları, kazançların doğrudan analogudur. Çalışma süresi, yanma oranı, çeşitlendirme — hepsi LLM analizine elverişli.

Kripto Sinyallerinin Özellikleri

TradFi'dan farklı olarak, kriptoda:

  • Zincir üzeri veriler anlatıyı doğrular veya çürütür — governance görüşmelerinde söylenenleri gerçek protokol metrikleriyle (TVL, hacim, aktif kullanıcılar) çapraz referanslayabilirsiniz
  • Balina cüzdanları içeriden öğrenilen bilgi gibi — governance tartışmalarından sonra büyük cüzdan hareketleri genellikle oylamadan önce gelir
  • CT (Kripto Twitter) aracılığıyla duyarlılık amplifikasyonu — bir governance görüşmesinden gelen bir sinyal, Twitter anlatıları tarafından amplifikasyon edilebilir veya bastırılabilir

Tuzaklar ve Sınırlamalar

Halüsinasyonlar: Model Sayıları Uydurduğunda

LLM, transkriptte bulunmayan yönlendirmeyi "çıkarabilir". Bu, özellikle çit kelime yoğunluğunu analiz ederken tehlikelidir: model, gerçekte olandan daha fazla veya daha az kelime sayabilir.

Çözüm: iki aşamalı doğrulama. LLM çıkarır, deterministik kod doğrular. Çit kelimeler için — LLM değerlendirmesiyle paralel olarak regex sayımı. %20'den fazla sapma — manuel inceleme için işaretle.

import re

HEDGE_WORDS = [
    r'\bapproximately\b', r'\bpotentially\b', r'\bsubject to\b',
    r'\bmay\b', r'\bmight\b', r'\bcould\b', r'\buncertain\b',
    r'\bchallenging\b', r'\bheadwinds\b', r'\bnavigate\b',
    r'\bprudent\b', r'\bcautious\b', r'\bevolving\b',
    r'\bdynamic\b', r'\bunprecedented\b', r'\btransitional\b',
]

def verify_hedge_count(text: str, llm_count: int) -> dict:
    """LLM çit kelime sayısının deterministik doğrulaması."""
    regex_count = sum(
        len(re.findall(pattern, text, re.IGNORECASE))
        for pattern in HEDGE_WORDS
    )

    deviation = abs(llm_count - regex_count) / (regex_count + 1)

    return {
        "llm_count": llm_count,
        "regex_count": regex_count,
        "deviation": deviation,
        "needs_review": deviation > 0.2,
    }

Bağlam Penceresi Sınırlamaları

128K token bile yeterli olmayabilir; şunları vermek istiyorsanız:

  • Mevcut transkript (~10K token)
  • Karşılaştırma için önceki transkript (~10K)
  • Analist konsensüs tahminleri (~2K)
  • Few-shot örnekler (~3K)
  • Sistem prompt'u (~1K)

Toplam ~26K — sığıyoruz. Ancak bağlam için 10-K dosyası (~80-120K token) eklerseniz — zaten sınırın üzerindesiniz. Çözüm: uzun belgelerden ilgili parçaları almak için RAG.

Önyargı ve Sistematik Hatalar

LLM'ler, belirli ifadelerin belirli sonuçlarla ilişkilendirildiği tarihsel veriler üzerinde eğitilmiştir. Ancak piyasa uyum sağlar:

  • Herkes GPT-4 ile çit kelimelerini saymaya başlarsa, yöneticiler dillerini değiştirecek
  • Model, eğitim verilerindeki kalıpların önemini fazla tahmin edebilir (hayatta kalma önyargısı)
  • Kurumsal dil gelişir: 2010'daki "sinerjiler" bir anlam taşırken, 2026'da başka bir anlam taşır

Kalabalık Trade Riski

50 quant fonu aynı transkriptleri analiz etmek için aynı GPT-4'ü kullanırsa — sinyal bozulur. Bir analoji: herkes sayısal sürprizler üzerinden PEAD'ı işlem yapmaya başladığında, anomali küçüldü. Aynı şey metinsel sinyallerde de olacak, ancak bir gecikmeyle:

  1. Şimdi (2026) — kazanç görüşmeleri için LLM kullananlar az. Alpha anlamlı
  2. 2-3 yıl içinde — yaygın benimseme, alpha azalır
  3. 5 yıl içinde — temel LLM sinyalleri bir emtiaya dönüşür, avantaj yalnızca özel modellerde ve benzersiz verilerde sürer

Bu, standart alpha sinyal yaşam döngüsüdür. Sürerken tadını çıkarın.

Sonuç Yerine: Eylem Planı

LLM'leri kazanç görüşmesi analizi için kullanmaya başlamak istiyorsanız, minimum uygulanabilir plan şöyle:

  1. Ücretsiz verilerle başlayın — 8-K/10-Q dosyaları için SEC EDGAR + EdgarTools
  2. Yapılandırılmış çıkarım kullanın — OpenAI Structured Outputs aracılığıyla Pydantic şemaları
  3. Olay çalışması ile backtest yapın — tarihsel veriler üzerinde CAR, minimum 200 olay
  4. Few-shot örnekler ekleyin — 5-10 etiketli örnek kaliteyi köklü biçimde iyileştirir
  5. Deterministik doğrulama yapın — LLM çıkarır, regex doğrular, insan denetler
  6. Orta büyüklüklü hisselerle başlayın — daha fazla alpha, büyük fonlarla daha az rekabet
  7. Kriptoya genişleyin — governance görüşmeleri ve DAO teklifleri keşfedilmemiş alan olarak

Nicel analizin temel kuralını unutmayın: bir sinyal kulağa fazla iyi geliyorsa — tekrar kontrol edin. LLM'ler bir anlama yanılsaması yaratır, ancak bunun ardında istatistiksel örüntü eşleştirmesi yatmaktadır. Güçlü bir araç — ama bir araç, kehanet değil.


Kaynakça

  1. Ball, R., Brown, P. (1968). An Empirical Evaluation of Accounting Income Numbers. Journal of Accounting Research, 6(2), 159-178. — PEAD'ın ilk keşfi.

  2. Bernard, V.L., Thomas, J.K. (1989). Post-Earnings-Announcement Drift: Delayed Price Response or Risk Premium? Journal of Accounting Research, 27, 1-36. — Kanonik PEAD makalesi.

  3. Loughran, T., McDonald, B. (2011). When Is a Liability Not a Liability? Textual Analysis, Dictionaries, and 10-Ks. Journal of Finance, 66(1), 35-65. — Finansal duyarlılık sözlüğü.

  4. Araci, D. (2019). FinBERT: Financial Sentiment Analysis with Pre-trained Language Models. arXiv:1908.10063. — Finansal NLP için BERT, SOTA üzerinde +14pp.

  5. Wu, S. et al. (2023). BloombergGPT: A Large Language Model for Finance. arXiv:2303.17564. — Bloomberg'in 50 milyar parametreli modeli.

  6. Yang, H. et al. (2023). FinGPT: Open-Source Financial Large Language Models. arXiv:2306.06031. — BloombergGPT'nin açık kaynaklı alternatifi, %89 doğruluk.

  7. Lopez-Lira, A., Tang, Y. (2023). Can ChatGPT Forecast Stock Price Movements? Return Predictability and Large Language Models. arXiv:2304.07619. — GPT-4, ~%90 isabet oranıyla getirileri tahmin ediyor.

  8. Meursault, V., Liang, P.J., Routledge, B., Scanlon, M.M. (2023). PEAD.txt: Post-Earnings-Announcement Drift Using Text. Journal of Financial and Quantitative Analysis. — Metin tabanlı PEAD, sayısal PEAD'ın iki katı büyüklüğünde.

  9. Fatouros, G. et al. (2024). Can Large Language Models Beat Wall Street? Evaluating GPT-4's Impact on Financial Decision-Making with MarketSenseAI. Neural Computing and Applications. — S&P 100'de %10-30 fazla alpha ile GPT-4 çerçevesi.

  10. Chen, Y. et al. (2025). GPT-Signal: Generative AI for Semi-automated Feature Engineering in the Alpha Research Process. arXiv:2410.18448. — LLM aracılığıyla alım satım sinyallerinin otomatik üretimi.

  11. Zhang, X. et al. (2025). Can LLMs Hit Moving Targets? Tracking Evolving Signals in Corporate Disclosures. arXiv:2510.03195. — Kurumsal açıklamalardaki "hareketli hedeflerin" tespiti.

  12. Chen, Z. et al. (2025). Large Language Models in Equity Markets: Applications, Techniques, and Insights. Frontiers in Artificial Intelligence. — Finansta 84 LLM çalışmasının derlemesi.


Bu makale eğitim amaçlıdır ve yatırım tavsiyesi niteliği taşımaz. Burada açıklanan alım satım stratejileri, gerçek sermayeyle uygulamaya konulmadan önce kapsamlı backtesting ve risk yönetimi gerektirir.

Sorumluluk Reddi: Bu makalede sağlanan bilgiler yalnızca eğitim ve bilgilendirme amaçlıdır ve finansal, yatırım veya ticaret tavsiyesi niteliği taşımaz. Kripto para ticareti önemli bir kayıp riski içerir.

Yazarlar

Eugen Soloviov
Eugen Soloviov

Trading-systems engineer

Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.

Newsletter

Piyasanın Önünde Olun

Özel yapay zeka ticaret içgörüleri, piyasa analizi ve platform güncellemeleri için bültenimize abone olun.

Gizliliğinize saygı duyuyoruz. İstediğiniz zaman abonelikten çıkabilirsiniz.