LLM Alpha Mining: Cara Mengekstrak Isyarat Dagangan daripada Panggilan Pendapatan dan Dokumen Kewangan
Ada satu jenaka di Wall Street: "Maklumat paling berharga dalam panggilan pendapatan bukan apa yang dikatakan CEO, tetapi bagaimana dia mengatakannya." Apabila Tim Cook berkata "we are cautiously optimistic" berbanding tahun lalu "we are very pleased" — itu bukan permainan bahasa, itu isyarat bernilai ratusan juta dolar.
Selama beberapa dekad, dana kuantitatif telah cuba mensistematikkan pengekstrakan isyarat ini. Pertama, mereka mengira kekerapan perkataan "positif" dan "negatif" menggunakan kamus. Kemudian mereka melancarkan BERT. Dan kini kita mempunyai GPT-4o, Claude, dan LLM sumber terbuka yang mampu menghurai kehalusan bahasa korporat berganda yang bahkan menakutkan para penyelidik itu sendiri.
Mari kita kupas cara membina saluran paip penuh untuk mengekstrak isyarat dagangan daripada panggilan pendapatan — daripada mendapatkan transkrip hinggalah kepada backtesting pulangan abnormal kumulatif.
Mengapa Panggilan Pendapatan Adalah Lombong Emas untuk Alpha
Post-Earnings Announcement Drift: Anomali yang Tidak Mati
Pada tahun 1968, Ball dan Brown menemui sesuatu yang aneh: selepas keputusan suku tahunan diterbitkan, saham terus melayang ke arah "kejutan" selama 60-90 hari lagi. Mereka menamakannya Post-Earnings Announcement Drift (PEAD). Lebih separuh abad telah berlalu sejak itu, ratusan makalah telah ditulis, anomali telah dijelaskan dari pelbagai sudut — dan ia masih berfungsi.
PEAD adalah salah satu anomali pasaran yang paling berterusan dalam sejarah kewangan. Strategi portfolio "beli kejutan positif, jual kejutan negatif" secara sejarahnya memberikan pulangan berlebihan tahunan 10-25%. Mengapa pasaran tidak menghapuskannya melalui arbitraj? Beberapa sebab:
- Perhatian pelabur yang terhad — apabila 200 syarikat melaporkan dalam minggu yang sama, adalah mustahil secara fizikal untuk membaca semua transkrip
- Kerumitan kognitif — panggilan pendapatan berlangsung 45-60 minit, dan isyarat utama boleh tertimbus dalam satu ayat pada minit ke-38 sesi soal jawab
- Kekaburan bahasa — CFO berkata "we are navigating headwinds," dan tanpa konteks tidak jelas sama ada ini amaran lembut atau lindung nilai standard
Di sinilah LLM memasuki pentas. Buat pertama kalinya, kita mempunyai alat yang boleh memproses 500 transkrip dalam satu petang sambil menangkap nuansa yang bahkan penganalisis berpengalaman pun akan terlepas pandang.
PEAD.txt: Teks Lebih Penting daripada Nombor
Penyelidik dari Federal Reserve Bank of Philadelphia (Meursault, Liang, Routledge, Scanlon) menerbitkan kertas PEAD.txt, yang menjungkirbalikkan andaian tentang nilai maklumat tekstual. Mereka membina analog berasaskan teks bagi kejutan pendapatan standard — SUE.txt — yang tidak menggunakan nilai pendapatan berangka langsung.
Hasilnya? SUE.txt menjana drift yang dua kali lebih besar daripada PEAD klasik. Lebih-lebih lagi: dalam beberapa tahun kebelakangan ini, sementara PEAD klasik berasaskan kejutan berangka hampir lenyap (pasaran belajar), drift tekstual kekal signifikan. Pasaran belajar memproses nombor dengan cepat tetapi masih bergelut dengan tafsiran teks.
Ini adalah hujah asas yang memihak kepada pendekatan berasaskan NLP untuk panggilan pendapatan.
Daripada Sentimen kepada Semantik: Evolusi Pendekatan

Generasi Pertama: Bag-of-Words dan Kamus (2000-2015)
Segalanya bermula dengan kamus Loughran-McDonald (2011) — senarai perkataan berlabel "positif," "negatif," "tidak pasti," dan "litigious." Ideanya elegan dalam kesederhanaannya: kira peratusan perkataan negatif dalam pemfailan 10-K dan berdagang berdasarkannya.
Masalahnya? Perkataan "outstanding" dalam konteks kewangan lebih kerap bermaksud "hutang belum dibayar" daripada "keputusan yang cemerlang." Perkataan "risk" dalam Pengurusan Risiko bukanlah isyarat negatif — ia adalah penerangan proses. Kamus sentimen NLP standard menunjukkan prestasi yang memalukan pada teks kewangan.
Loughran dan McDonald mencipta kamus khusus, yang memperbaiki keadaan, tetapi masalah asas kekal: bag-of-words tidak memahami konteks. "We did not fail to meet expectations" — terdapat dua perkataan "negatif" di sini, tetapi maknanya adalah positif.
Generasi Kedua: FinBERT dan Transformer (2019-2023)
Pada tahun 2019, Dogu Araci menerbitkan FinBERT — BERT yang dihalus laras pada teks kewangan dari Reuters TRC2. Hasilnya mengagumkan: peningkatan 14 mata peratusan pada set data Financial PhraseBank berbanding keadaan terkini. FinBERT memahami konteks: "outstanding" berdekatan "debt" — negatif, berdekatan "performance" — positif.
Tetapi FinBERT mempunyai had: tetingkap konteks 512 token. Panggilan pendapatan mengandungi 8,000-12,000 perkataan. Membahagikan kepada kepingan dan mengambil purata sentimen bermaksud kehilangan semantik antara perenggan. CEO mungkin bermula dengan optimisme, kemudian secara santai menyebut masalah rantaian bekalan semasa soal jawab. FinBERT menganalisis setiap kepingan secara bebas dan terlepas kontras ini.
Generasi Ketiga: LLM dengan Konteks Panjang (2023-Kini)
GPT-4, Claude, Gemini dengan tetingkap konteks 128K-1M token mengubah peraturan permainan. Kini anda boleh memuatkan keseluruhan transkrip sekaligus dan mengajukan soalan yang memerlukan pemahaman dokumen penuh.
Kajian utama — Lopez-Lira & Tang (2023) "Can ChatGPT Forecast Stock Price Movements?" Pada 50,000+ tajuk berita, GPT-4 menunjukkan kadar kejayaan ~90% dalam meramal arah tindak balas pasaran awal dan secara signifikan meramal drift seterusnya, terutamanya untuk syarikat bersaiz kecil dan berita negatif. Model terdahulu (GPT-1, GPT-2, BERT) tidak menunjukkan keupayaan ini — kuasa ramalan muncul sebagai sifat emergent model besar.
BloombergGPT (2023) — model 50 bilion parameter yang dilatih pada korpus kewangan Bloomberg — menunjukkan peningkatan dalam NER kewangan, klasifikasi berita, dan analisis sentimen. FinGPT — alternatif sumber terbuka — mencapai ketepatan 89% pada tugasan sentimen kewangan menggunakan pendekatan berpusatkan data dan RAG.
MarketSenseAI, yang menggunakan GPT-4 dengan Chain-of-Thought dan In-Context Learning untuk analisis S&P 100, menunjukkan alpha berlebihan 10-30% dan pulangan kumulatif sehingga 72% dalam 15 bulan ujian. Ya, nombor-nombor ini harus diterima dengan berhati-hati (backtest ≠ dagangan langsung), tetapi trendnya jelas.
Saluran Paip Data: Di Mana Mendapatkan Data
SEC EDGAR: Sumber Rasmi
Untuk ekuiti AS, sumber utama adalah SEC EDGAR. Transkrip panggilan pendapatan biasanya tidak difailkan secara langsung, tetapi dokumen berkaitan tersedia:
- Pemfailan 8-K (Item 2.02 — Results of Operations) — siaran akhbar dengan keputusan, sering menyertakan pameran 99 dengan transkrip
- 10-Q / 10-K — laporan suku tahunan dan tahunan dengan Management Discussion & Analysis (MD&A) — juga sumber teks yang berharga
- DEF 14A — penyata proksi dengan maklumat pampasan pengurusan
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() # Teks penuh dengan pameran
print(f"{filing.filing_date}: {len(text)} chars")
Seeking Alpha dan API Komersial
Transkrip panggilan pendapatan adalah produk berasingan. Seeking Alpha secara sejarahnya adalah sumber percuma utama, tetapi kini menyekat akses. Pilihan komersial:
- Seeking Alpha Premium API — transkrip penuh dengan label penutur
- AlphaVantage Earnings API — peringkat percuma dengan batasan
- Financial Modeling Prep — transkrip + asas
- Earnings Call Edge / Motley Fool Transcripts — sumber alternatif
Kripto: Panggilan Tadbir Urus dan Cadangan DAO
Di sinilah perkara menjadi menarik. Protokol DeFi utama mengadakan padanan panggilan pendapatan mereka sendiri:
- Uniswap — panggilan tadbir urus, panggilan komuniti, rakaman di YouTube
- Aave — panggilan komuniti bulanan + cadangan forum tadbir urus
- MakerDAO — panggilan tadbir urus + perbincangan forum yang mendalam
- Compound — cadangan tadbir urus dengan perbincangan terperinci
Transkrip panggilan kripto biasanya tidak berstruktur. Penyelesaiannya — Whisper dari OpenAI untuk mentranskrip rakaman YouTube:
import openai
from yt_dlp import YoutubeDL
def transcribe_governance_call(youtube_url: str) -> str:
"""Muat turun audio dari YouTube dan transkrip melalui Whisper."""
ydl_opts = {
'format': 'bestaudio/best',
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3',
'preferredquality': '64', # Kadar bit rendah mencukupi untuk pertuturan
}],
'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
Kos transkripsi melalui Whisper API: 0.36. Untuk pilihan hos sendiri — Whisper Large-v3 Turbo mentranskrip fail 60 minit dalam ~17 saat (216x masa nyata) pada GPU moden.
Strategi Prompting LLM: Daripada Naif kepada Gred Pengeluaran

Strategi 1: Sentimen Langsung (Lemah)
Pendekatan paling naif — tanya model secara langsung:
"Adakah panggilan pendapatan ini positif atau negatif untuk harga saham?"
Adakah ini berfungsi? Ya, secara mengejutkan. Lopez-Lira & Tang menunjukkan bahawa walaupun prompt primitif seperti ini menghasilkan ramalan yang signifikan secara statistik. Tetapi terdapat masalah:
- Output binari — anda kehilangan gradasi. "Bencana" dan "kekecewaan ringan" mendapat label yang sama
- Tiada penjelasan — tidak jelas apa yang menjadi asas keputusan model
- Ketidakstabilan — larian berulang mungkin memberikan jawapan yang berbeza
Strategi 2: Pengekstrakan Berstruktur dengan Chain-of-Thought (Kuat)
Ideanya: daripada satu nombor, ekstrak set isyarat berstruktur, memaksa model menjelaskan setiap langkah.
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):
"""Penyelewengan panduan hadapan daripada jangkaan konsensus."""
revenue_guidance_vs_consensus: Optional[float] = Field(
None, description="% penyelewengan panduan hasil daripada konsensus"
)
margin_guidance_direction: Optional[str] = Field(
None, description="expanding / stable / contracting"
)
key_quote: str = Field(
description="Petikan verbatim dengan panduan"
)
reasoning: str = Field(
description="CoT: mengapa panduan ini penting"
)
class ConfidenceMetrics(BaseModel):
"""Metrik keyakinan pengurusan."""
hedge_word_count: int = Field(
description="Bilangan perkataan lindung nilai: 'approximately', 'potentially', 'subject to'"
)
forward_looking_ratio: float = Field(
description="Nisbah pernyataan pandangan hadapan kepada jumlah pernyataan"
)
q_and_a_evasion_count: int = Field(
description="Bilangan soalan di mana CEO/CFO memberikan jawapan yang mengelak"
)
ceo_vs_cfo_sentiment_delta: float = Field(
description="Perbezaan sentimen antara CEO dan CFO (-1 hingga 1). Divergensi adalah bendera merah"
)
class CompetitiveIntelligence(BaseModel):
"""Sebutan pesaing dan kedudukan pasaran."""
competitors_mentioned: list[str] = Field(
description="Senarai pesaing yang disebut"
)
market_share_claims: list[str] = Field(
description="Tuntutan bahagian pasaran"
)
new_product_signals: list[str] = Field(
description="Isyarat tentang produk/perkhidmatan baharu"
)
class ManagementSignals(BaseModel):
"""Isyarat pengurusan."""
turnover_risk: SentimentLevel = Field(
description="Risiko pertukaran pengurusan utama"
)
tone_shift_from_previous: Optional[str] = Field(
None, description="Bagaimana nada berubah berbanding suku lepas"
)
insider_language_flags: list[str] = Field(
description="Frasa penanda: 'exploring strategic alternatives', 'right-sizing', dll."
)
class EarningsCallAnalysis(BaseModel):
"""Analisis panggilan pendapatan lengkap."""
ticker: str
quarter: str
overall_sentiment: SentimentLevel
sentiment_score: float = Field(description="dari -1.0 hingga 1.0")
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:
"""
Ekstrak isyarat berstruktur daripada panggilan pendapatan.
Kos: ~$0.15-0.30 per panggilan (GPT-4o, ~10K token input).
"""
client = OpenAI()
system_prompt = """You are a senior equity research analyst with 20 years of experience.
Analyze the following earnings call transcript and extract structured trading signals.
IMPORTANT INSTRUCTIONS:
1. Use Chain-of-Thought reasoning for each field — explain WHY before giving the value
2. Focus on DEVIATIONS from expectations, not absolute statements
3. Pay special attention to Q&A section — management is less scripted there
4. Compare management's language to typical corporate hedging baseline
5. Flag any "strategic alternatives", "right-sizing", or other euphemisms
6. Score sentiment relative to market expectations, not in absolute terms
HEDGE WORDS TO COUNT: 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}\nQuarter: {quarter}\n\n{transcript}"}
],
response_format=EarningsCallAnalysis,
temperature=0.1, # Suhu rendah untuk kebolehulangan
)
return completion.choices[0].message.parsed
Perhatikan beberapa perkara utama:
Skema Pydantic — OpenAI Structured Outputs menjamin pematuhan skema 100%. Tiada lagi "sorry, I cannot parse the JSON." Setiap medan mempunyai penerangan yang bertindak sebagai mini-prompt untuk aspek analisis tertentu.
Chain-of-Thought dalam skema — medan reasoning dan key_quote memaksa model untuk "menunjukkan kerjanya." Ini bukan sahaja meningkatkan kualiti (model dipaksa mencari petikan khusus sebelum membuat penilaian) tetapi juga mencipta jejak audit untuk pengawal selia.
Suhu 0.1 — kita tidak mahu kreativiti. Kita memerlukan kebolehulangan. Pada suhu 0, model kadang-kadang "tersangkut" dalam corak; 0.1 adalah kompromi optimum.
Strategi 3: Few-Shot dengan Contoh Sejarah
Lebih berkuasa lagi — berikan model contoh panggilan pendapatan lalu dengan tindak balas pasaran sebenar:
few_shot_examples = """
EXAMPLE 1:
Transcript excerpt: "We are cautiously optimistic about the second half...
While we continue to navigate macro headwinds, our pipeline remains robust."
Actual market reaction: -3.2% (next day)
Analysis: Despite surface-level positivity, "cautiously optimistic" is a
DOWNGRADE from previous quarter's "very confident". Five hedge words in
two sentences. Market read through the hedging.
EXAMPLE 2:
Transcript excerpt: "Frankly, demand has exceeded our ability to supply.
We're expediting CapEx to address this."
Actual market reaction: +7.8% (next day)
Analysis: "Frankly" signals genuine surprise even from management.
Accelerated CapEx on demand = strong confidence. No hedging language.
"""
Contoh few-shot membantu model mengkalibrasi: ia belajar bahawa "cautiously optimistic" dalam bahasa Wall Street bukan positif — ia adalah negatif lembut. Tanpa contoh, LLM mungkin mentafsir perkataan secara literal.
Empat Jenis Isyarat
1. Kejutan Panduan (Guidance Surprise)
Isyarat paling langsung. Syarikat memberikan ramalan (panduan) untuk suku/tahun seterusnya, dan pasaran bertindak balas terhadap penyelewengan daripada konsensus. LLM boleh mengekstrak panduan walaupun apabila pengurusan menyampaikannya secara samar-samar:
- "We expect revenues in the range of..." — panduan langsung, mudah dihurai
- "We feel comfortable with current Street estimates" — pengesahan tersirat konsensus
- "There are puts and takes relative to consensus" — isyarat risiko tersirat
LLM memahami ketiga-tiga ungkapan; regex hanya memahami yang pertama.
2. Metrik Keyakinan: Ketumpatan Perkataan Lindung Nilai
Ini adalah isyarat kegemaran saya kerana ia berlawanan dengan intuisi. Intinya: pengurus adalah orang-orang dengan latihan undang-undang dan jabatan undang-undang yang paranoid. Apabila keadaan berjalan lancar, mereka membenarkan diri mereka untuk spesifik. Apabila masalah sedang membiak — mereka mula melindung nilai.
Metrik untuk dijejaki:
| Metrik | Penerangan | Isyarat Bearish |
|---|---|---|
| Ketumpatan perkataan lindung nilai | Bahagian perkataan lindung nilai per 1,000 perkataan | > 15 per 1,000 perkataan |
| Nisbah kepastian | Nisbah "will/expect" vs "may/could" | < 1.5 |
| Kadar pengelakan soal jawab | % soalan tanpa jawapan langsung | > 30% |
| Delta CEO/CFO | Divergensi nada antara CEO dan CFO | > 0.3 pada skala [-1, 1] |
Perkara terakhir amat menarik. CEO adalah pencerita — tugasnya melukis gambaran yang cantik. CFO adalah orang yang bertanggungjawab kepada juruaudit. Apabila CEO berkata "transformative growth ahead" dan CFO terus mencelah "while maintaining disciplined cost management" — divergensi ini menandakan ketegangan dalaman.
3. Perisikan Persaingan (Competitive Intelligence)
LLM boleh mengekstrak sebutan pesaing daripada transkrip, walaupun apabila pengurusan mengelakkan nama langsung. "The largest player in the market" — itu bukan misteri untuk GPT-4 jika ia mengetahui industrinya.
Isyarat dagangan: jika syarikat A menyebut pesaing B dalam konteks negatif semasa panggilan pendapatannya ("we're taking share from..."), itu adalah isyarat bukan sahaja untuk A (long) tetapi juga untuk B (short). Dagangan berpasangan.
4. Isyarat Pertukaran Pengurusan
Frasa penanda untuk perubahan pengurusan atau pivoting strategik:
- "Exploring strategic alternatives" — kemungkinan jualan syarikat
- "Right-sizing our operations" — pemberhentian beramai-ramai
- "The board has initiated a comprehensive review" — CEO akan pergi tidak lama lagi
- "We're bringing in fresh perspectives" — pasukan semasa telah gagal
Setiap frasa ini mempunyai korelasi yang signifikan secara statistik dengan dinamika harga seterusnya. LLM boleh mengesannya dengan sifar positif palsu — kerana ia memahami konteks, tidak seperti regex, yang mungkin menangkap "strategic alternatives" dalam penerangan lini produk.
Backtesting: Metodologi Kajian Peristiwa

Kita menjana isyarat — bagus. Tetapi adakah ia berfungsi? Kaedah pengesahan standard adalah Kajian Peristiwa (Event Study) dengan pengiraan Pulangan Abnormal Kumulatif (CAR).
Metodologi
- Tentukan peristiwa — tarikh panggilan pendapatan
- Tetingkap anggaran — [-250, -30] hari dagangan sebelum peristiwa untuk menganggar pulangan "normal"
- Tetingkap peristiwa — [-1, +60] hari sekitar peristiwa
- Kira pulangan normal melalui model pasaran:
- Pulangan abnormal — perbezaan antara pulangan sebenar dan "normal"
- CAR — jumlah kumulatif pulangan abnormal sepanjang tetingkap peristiwa
import numpy as np
import pandas as pd
from scipy import stats
from dataclasses import dataclass
@dataclass
class EventStudyResult:
car: np.ndarray # Pulangan abnormal kumulatif mengikut hari
t_stats: np.ndarray # t-statistik untuk setiap hari
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, # Pulangan saham harian (lajur = ticker)
market_returns: pd.Series, # Pulangan indeks pasaran harian
events: pd.DataFrame, # DataFrame dengan lajur: [ticker, date, signal_score]
estimation_window: int = 220,
gap: int = 30,
event_window: tuple = (-1, 60),
) -> EventStudyResult:
"""
Kajian peristiwa untuk menilai kuasa ramalan isyarat LLM.
Isih peristiwa mengikut signal_score, bentuk portfolio long/short,
kira CAR dan uji kepentingan statistik.
"""
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 pemerhatian
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("No valid events found")
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] # Anjak ke tarikh peristiwa
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: long isyarat kuintil atas, short kuintil bawah."""
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"Portfolio LONG (kuintil atas sentimen LLM):")
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 peristiwa: {long_result.n_events}")
print(f"\nPortfolio SHORT (kuintil bawah sentimen LLM):")
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 peristiwa: {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"\nSpread LONG-SHORT:")
print(f" CAR[0,+3]: {ls_3d:+.2%}")
print(f" CAR[0,+30]: {ls_30d:+.2%}")
Apa yang Kita Jangkakan untuk Dilihat
Berdasarkan penyelidikan sedia ada, CAR realistik untuk isyarat LLM:
| Tetingkap | Portfolio long | Portfolio short | Spread L/S |
|---|---|---|---|
| [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% |
Penunjuk utama adalah kepentingan statistik. Dengan p < 0.01 dan N > 200 peristiwa, anda boleh bercakap tentang isyarat yang kukuh. Dengan p > 0.05 — ia mungkin hanya bunyi bising.
Pelaksanaan Pengeluaran: Daripada Jupyter ke Prod
Seni Bina Saluran Paip Masa Nyata
YouTube/Audio Stream
│
▼
┌─────────────────┐ ┌──────────────────┐
│ Whisper │───▶│ Transcript │
│ Transcription │ │ Buffer │
│ (streaming) │ │ (Redis Stream) │
└─────────────────┘ └──────────────────┘
│
┌─────────┴─────────┐
▼ ▼
┌──────────────┐ ┌──────────────┐
│ Real-time │ │ Full-call │
│ Chunk Anal. │ │ Analysis │
│ (every 5min) │ │ (after call │
│ │ │ ends) │
└──────────────┘ └──────────────┘
│ │
▼ ▼
┌──────────────────────────────┐
│ Signal Aggregator │
│ (confidence-weighted merge) │
└──────────────────────────────┘
│
▼
┌──────────────────────────────┐
│ Trading Engine │
│ (position sizing, risk mgmt)│
└──────────────────────────────┘
Analisis Kos: Berapa Kos Satu Panggilan Pendapatan
Mari kita perincikan ekonomi pemprosesan satu panggilan pendapatan dalam pengeluaran:
| Komponen | Kos | Kependaman |
|---|---|---|
| Transkripsi Whisper API (60 min) | $0.36 | ~17 saat (Turbo) |
| Pengekstrakan berstruktur GPT-4o | $0.15-0.30 | ~8-15 saat |
| Analisis kepingan masa nyata GPT-4o (x12) | $1.80-3.60 | ~5 saat setiap satu |
| Penyematan untuk storan RAG | $0.01 | <1 saat |
| Jumlah (saluran paip penuh) | $2.30-4.30 | ~30 saat penuh |
Tunggu, anggaran itu adalah $30-50 per panggilan. Dari mana nombor itu? Ia bergantung pada model dan pendekatan:
- Pilihan bajet (GPT-4o-mini, satu pas): $0.50-1.00
- Pilihan standard (GPT-4o, pengekstrakan berstruktur + analisis kepingan): $2-5
- Pilihan premium (GPT-4o, pelbagai pas, pengesahan silang, perbandingan sejarah): $15-30
- Gred dana lindung nilai (pelbagai model + ulasan manusia + penstriman masa nyata): $30-50+
Untuk dana kuantitatif yang memperdagangkan 500 ticker, kos pemprosesan musim pendapatan (~2,000 panggilan dalam 6 minggu) adalah 10,000 dengan pilihan standard. Memandangkan purata alpha per kedudukan 1-3% — ROI-nya adalah luar biasa.
Kependaman: Perlumbaan untuk Milisaat
Dalam dunia HFT, kependaman adalah segalanya. Tetapi untuk strategi berasaskan pendapatan, keadaannya berbeza:
- Panggilan pendapatan berlangsung 45-60 minit — anda mempunyai masa
- PEAD merentasi 60 hari — tidak perlu masuk dalam saat pertama
- Dislokasi utama berlaku dalam 30 minit pertama selepas panggilan tamat
Strategi optimum adalah dua fasa:
- Fasa 1 (masa nyata): analisis kepingan 5 minit semasa panggilan, membentuk isyarat awal
- Fasa 2 (selepas panggilan): analisis penuh keseluruhan transkrip 2-5 minit selepas ia tamat
Fasa 1 memberikan kelebihan 5-10 minit berbanding peserta pasaran yang menunggu panggilan tamat. Untuk saham bersaiz sederhana, ini sudah memadai.
Mengembangkan ke Kripto: Tadbir Urus DeFi dan Cadangan DAO
Pasaran kripto adalah padang ujian ideal untuk perlombongan alpha LLM. Inilah sebabnya:
- Lebih sedikit pemain institusi — bermaksud lebih banyak ketidakcekapan untuk dieksploitasi
- Tadbir urus = panggilan pendapatan — keputusan DAO secara langsung mempengaruhi tokenomik
- Pasaran 24/7 — anda boleh memperdagangkan tindak balas dengan segera
- Data awam — semua cadangan dan undian adalah on-chain
Jenis Peristiwa Kripto untuk Analisis
Cadangan Tadbir Urus (Aave, Compound, Uniswap)
Cadangan mengubah parameter protokol — kadar faedah, faktor cagaran, suis fi. LLM boleh menilai impak ekonomi:
crypto_analysis_prompt = """Analyze this DeFi governance proposal.
Extract:
1. Economic impact on token holders (positive/negative/neutral)
2. TVL impact estimate (increase/decrease/stable + magnitude)
3. Competitive positioning vs other protocols
4. Risk factors introduced by the proposal
5. Historical precedent (similar proposals in other protocols)
6. Likely voting outcome based on forum discussion sentiment
Proposal: {proposal_text}
Forum discussion: {discussion_text}
"""
Pengumuman Kemas Kini Protokol
Apabila Uniswap mengumumkan v4 dengan cangkuk, atau Aave melancarkan GHO — itu setara dengan pelancaran produk dalam TradFi. LLM boleh menilai momentum naratif dan kepentingan teknikal.
Laporan Perbendaharaan
DAO besar mempunyai perbendaharaan bernilai ratusan juta. Laporan perbendaharaan suku tahunan adalah analog langsung pendapatan. Landasan pacu, kadar bakar, kepelbagaian — semua boleh dianalisis dengan LLM.
Kekhususan Isyarat Kripto
Berbeza dengan TradFi, dalam kripto:
- Data on-chain mengesahkan atau menyanggah naratif — anda boleh rujuk silang apa yang dikatakan dalam panggilan tadbir urus dengan metrik protokol sebenar (TVL, volum, pengguna aktif)
- Dompet paus sebagai dagangan orang dalam — pergerakan dompet besar selepas perbincangan tadbir urus sering mendahului undian
- Amplifikasi sentimen melalui CT (Crypto Twitter) — isyarat daripada panggilan tadbir urus boleh diperkuat atau ditekan oleh naratif Twitter
Perangkap dan Had
Halusinasi: Apabila Model Mencipta Nombor
LLM boleh "mengekstrak" panduan yang tidak terdapat dalam transkrip. Ini amat berbahaya apabila menganalisis ketumpatan perkataan lindung nilai: model mungkin mengira lebih atau kurang perkataan daripada yang sebenarnya ada.
Penyelesaian: pengesahan dua fasa. LLM mengekstrak, kod deterministik mengesahkan. Untuk perkataan lindung nilai — pengiraan regex secara selari dengan penilaian LLM. Penyelewengan > 20% — bendera untuk semakan manual.
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:
"""Pengesahan deterministik kiraan perkataan lindung nilai LLM."""
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,
}
Had Tetingkap Konteks
Walaupun 128K token mungkin tidak mencukupi jika anda ingin memasukkan:
- Transkrip semasa (~10K token)
- Transkrip sebelumnya untuk perbandingan (~10K)
- Ramalan konsensus penganalisis (~2K)
- Contoh few-shot (~3K)
- Prompt sistem (~1K)
Jumlah ~26K — kita muat. Tetapi jika anda menambah pemfailan 10-K (~80-120K token) untuk konteks — anda sudah berada di tepi. Penyelesaian: RAG untuk mendapatkan kepingan relevan daripada dokumen panjang.
Bias dan Ralat Sistematik
LLM dilatih pada data sejarah di mana frasa tertentu dikaitkan dengan hasil tertentu. Tetapi pasaran menyesuaikan diri:
- Jika semua orang mula mengira perkataan lindung nilai dengan GPT-4, pengurus akan mengubah bahasa mereka
- Model mungkin membebaskan kepentingan corak dari data latihan (bias kemandirian)
- Bahasa korporat berkembang: "synergies" pada tahun 2010 bermaksud satu perkara, pada tahun 2026 — sesuatu yang lain
Risiko Dagangan Sesak (Crowded Trade)
Jika 50 dana kuantitatif menggunakan GPT-4 yang sama untuk menganalisis transkrip yang sama — isyarat merosot. Analoginya: apabila semua orang mula memperdagangkan PEAD berdasarkan kejutan berangka, anomali itu mengecil. Perkara yang sama akan berlaku dengan isyarat tekstual, tetapi dengan kelewatan:
- Sekarang (2026) — sedikit yang menggunakan LLM secara sistematik untuk panggilan pendapatan. Alpha adalah signifikan
- Dalam 2-3 tahun — penggunaan meluas, alpha berkurang
- Dalam 5 tahun — isyarat LLM asas menjadi komoditi, kelebihan kekal hanya dalam model tersuai dan data unik
Ini adalah kitaran hayat isyarat alpha standard. Nikmati selagi ia bertahan.
Sebagai Pengganti Kesimpulan: Pelan Tindakan
Jika anda ingin mula menggunakan LLM untuk analisis panggilan pendapatan, berikut adalah pelan yang minimum berdaya maju:
- Mulakan dengan data percuma — SEC EDGAR + EdgarTools untuk pemfailan 8-K/10-Q
- Gunakan pengekstrakan berstruktur — skema Pydantic melalui OpenAI Structured Outputs
- Backtest melalui kajian peristiwa — CAR pada data sejarah, minimum 200 peristiwa
- Tambah contoh few-shot — 5-10 contoh berlabel meningkatkan kualiti secara radikal
- Sahkan secara deterministik — LLM mengekstrak, regex mengesahkan, manusia mengaudit
- Mulakan dengan saiz sederhana — lebih banyak alpha, kurang persaingan dengan dana utama
- Kembangkan ke kripto — panggilan tadbir urus dan cadangan DAO sebagai wilayah yang belum diterokai
Ingat peraturan kardinal analisis kuantitatif: jika isyarat terdengar terlalu bagus untuk menjadi kenyataan — semak semula. LLM mencipta ilusi pemahaman, tetapi di sebaliknya terdapat pemadanan corak statistik. Alat yang berkuasa — tetapi alat, bukan oracle.
Bibliografi
-
Ball, R., Brown, P. (1968). An Empirical Evaluation of Accounting Income Numbers. Journal of Accounting Research, 6(2), 159-178. — Penemuan pertama PEAD.
-
Bernard, V.L., Thomas, J.K. (1989). Post-Earnings-Announcement Drift: Delayed Price Response or Risk Premium? Journal of Accounting Research, 27, 1-36. — Kertas PEAD kanonik.
-
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. — Kamus sentimen kewangan.
-
Araci, D. (2019). FinBERT: Financial Sentiment Analysis with Pre-trained Language Models. arXiv:1908.10063. — BERT untuk NLP kewangan, +14pp berbanding SOTA.
-
Wu, S. et al. (2023). BloombergGPT: A Large Language Model for Finance. arXiv:2303.17564. — Model 50B-parameter Bloomberg.
-
Yang, H. et al. (2023). FinGPT: Open-Source Financial Large Language Models. arXiv:2306.06031. — Alternatif sumber terbuka kepada BloombergGPT, ketepatan 89%.
-
Lopez-Lira, A., Tang, Y. (2023). Can ChatGPT Forecast Stock Price Movements? Return Predictability and Large Language Models. arXiv:2304.07619. — GPT-4 meramal pulangan dengan kadar kejayaan ~90%.
-
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. — PEAD berasaskan teks adalah dua kali lebih besar daripada PEAD berangka.
-
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. — Rangka kerja GPT-4 dengan alpha berlebihan 10-30% pada S&P 100.
-
Chen, Y. et al. (2025). GPT-Signal: Generative AI for Semi-automated Feature Engineering in the Alpha Research Process. arXiv:2410.18448. — Penjanaan automatik isyarat dagangan melalui LLM.
-
Zhang, X. et al. (2025). Can LLMs Hit Moving Targets? Tracking Evolving Signals in Corporate Disclosures. arXiv:2510.03195. — Pengesanan "sasaran bergerak" dalam pendedahan korporat.
-
Chen, Z. et al. (2025). Large Language Models in Equity Markets: Applications, Techniques, and Insights. Frontiers in Artificial Intelligence. — Tinjauan 84 kajian LLM dalam kewangan.
Artikel ini bersifat pendidikan dan tidak merupakan nasihat pelaburan. Sebarang strategi dagangan yang diterangkan di sini memerlukan backtesting menyeluruh dan pengurusan risiko sebelum digunakan dengan modal sebenar.
Pengarang
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.