LLM Alpha Mining: пайда туралы қоңыраулар мен қаржылық құжаттардан трейдинг сигналдарын қалай алуға болады
Уолл-стриттте бір әзіл бар: "Пайда туралы қоңыраудағы ең құнды ақпарат — бас директордың не айтқаны емес, оны қалай айтқаны." Тим Кук өткен жылғы "біз өте қуаныштымыз" дегеннің орнына "біз сақтықпен оптимистпіз" десе — бұл тілдік ойын емес, жүздеген миллион доллар тұратын сигнал.
Ондаған жылдар бойы квант-қорлар осы сигналдарды алуды жүйелеуге тырысты. Алдымен олар сөздіктер көмегімен "оң" және "теріс" сөздердің жиілігін санады. Содан кейін BERT-ті іске қосты. Ал қазір бізде GPT-4o, Claude және корпоративтік екіұштылықтың нәзіктіктерін зерттеушілердің өздерін де қорқытатын дәлдікпен талдай алатын ашық бастапқы кодты LLM-дер бар.
Пайда туралы қоңыраулардан трейдинг сигналдарын алуға арналған толыққанды пайплайнды қалай құруға болатынын талдап көрейік — транскриптті алудан бастап жиынтық аномальды кірістерді бэктестингтеуге дейін.
Пайда туралы қоңыраулар неге альфа үшін алтын кен
Post-Earnings Announcement Drift: өлмейтін аномалия
1968 жылы Болл мен Браун біраз оғаш нәрсені тапты: тоқсандық нәтижелер жарияланғаннан кейін акциялар тағы 60-90 күн бойы "тосын сый" бағытында жылжуын жалғастырады. Олар мұны Post-Earnings Announcement Drift (PEAD) деп атады. Содан бері жарты ғасырдан астам уақыт өтті, жүздеген мақала жазылды, аномалия ондаған қырынан түсіндірілді — және ол әлі де жұмыс істейді.
PEAD — қаржы тарихындағы ең тұрақты нарықтық аномалиялардың бірі. "Оң тосын сыйды сатып ал, теріс тосын сыйды сат" портфельдік стратегиясы тарихи тұрғыдан 10-25% жылдық артық кіріс берген. Нарық мұны неге арбитраждамады? Бірнеше себеп бар:
- Инвесторлардың шектеулі назары — бір аптада 200 компания есеп берсе, барлық транскрипттерді оқу физикалық тұрғыдан мүмкін емес
- Когнитивтік күрделілік — пайда туралы қоңырау 45-60 минутқа созылады, ал негізгі сигнал Q&A сессиясының 38-минутындағы бір сөйлемде жасырынуы мүмкін
- Тіл екіұштылығы — қаржы директоры "біз қарсы желмен жүзіп келеміз" дейді, контекстсіз мұның жұмсақ ескерту ме әлде стандартты хеджирлеу ме екені түсініксіз
Міне осы жерде LLM-дер сахнаға шығады. Алғаш рет бізде тәжірибелі талдаушылар да байқамай қалатын нюанстарды ұстай отырып, бір кеште 500 транскриптті өңдей алатын құрал бар.
PEAD.txt: сандардан гөрі мәтін маңызды
Филадельфия Федералды резервтік банкінің зерттеушілері (Meursault, Liang, Routledge, Scanlon) мәтіндік ақпараттың құндылығы туралы болжамдарды теріске шығарған PEAD.txt мақаласын жариялады. Олар стандартты пайда тосын сыйының мәтіндік аналогын құрды — SUE.txt — ол пайданың сандық мәнін мүлдем пайдаланбайды.
Нәтиже қандай? SUE.txt классикалық PEAD-тен екі есе үлкен дрифт тудырады. Сонымен қатар: соңғы жылдары сандық тосын сыйларға негізделген классикалық PEAD іс жүзінде жоғалып кеткенде (нарық үйренді), мәтіндік дрифт әлі де маңызды болып қалуда. Нарық сандарды тез өңдеуді үйренді, бірақ мәтінді түсіндіруде әлі де қиналуда.
Бұл пайда туралы қоңырауларға NLP негізделген тәсілдің пайдасына негізгі дәлел.
Сентименттен семантикаға: тәсілдердің эволюциясы

Бірінші буын: Bag-of-words және сөздіктер (2000-2015)
Барлығы Loughran-McDonald сөздігінен (2011) басталды — "оң", "теріс", "белгісіз" және "сотқа қатысты" деп белгіленген сөздер тізімі. Идея өзінің қарапайымдылығымен әдемі болды: 10-K құжатындағы теріс сөздердің пайызын санап, соған сүйеніп сауда жасау.
Мәселе неде? Қаржылық контексте "outstanding" сөзі көбіне "төленбеген қарыз" дегенді білдіреді, "тамаша нәтиже" емес. Risk Management-тегі "тәуекел" сөзі теріс сигнал емес — бұл процесс сипаттамасы. Стандартты NLP сентимент сөздіктері қаржылық мәтіндерде ұятты дәрежеде нашар жұмыс істеді.
Loughran мен McDonald арнайы сөздік жасады, бұл жағдайды жақсартты, бірақ негізгі мәселе қалды: bag-of-words контекстті түсінбейді. "Біз күтулерді орындамай қалмадық" — мұнда екі "теріс" сөз бар, бірақ мағынасы оң.
Екінші буын: FinBERT және трансформерлер (2019-2023)
2019 жылы Догу Арачи Reuters TRC2-нің қаржылық мәтіндеріне бейімделген BERT — FinBERT-ті жариялады. Нәтижелер әсерлі болды: Financial PhraseBank датасетінде state-of-the-art-пен салыстырғанда 14 пайыздық тармаққа жақсарту. FinBERT контекстті түсінді: "debt"-тің жанындағы "outstanding" — теріс, "performance"-тің жанындағы — оң.
Бірақ FinBERT-тің шектеуі болды: 512 токендік контекст терезесі. Пайда туралы қоңырау 8000-12000 сөзге созылады. Бөліктерге бөліп, сентименттің орташасын алу абзацтар арасындағы семантиканы жоғалтуға әкеледі. Бас директор оптимизммен бастап, содан кейін Q&A кезінде жеткізу тізбегіндегі мәселелерді өтіп бара жатып айтуы мүмкін. FinBERT әр бөлікті тәуелсіз талдайды және осы қайшылықты жіберіп алады.
Үшінші буын: ұзақ контекстті LLM-дер (2023-қазіргі уақыт)
128K-1M токендік контекст терезесі бар GPT-4, Claude, Gemini ойын ережелерін өзгертті. Енді бүкіл транскриптті бір уақытта жүктеп, толық құжатты түсінуді талап ететін сұрақтар қоюға болады.
Негізгі зерттеу — Lopez-Lira & Tang (2023) "Can ChatGPT Forecast Stock Price Movements?" 50 000-нан астам тақырыпта GPT-4 бастапқы нарықтық реакцияның бағытын болжауда ~90% дәлдік көрсетті және кейінгі дрифтті, әсіресе шағын капиталды компаниялар мен теріс жаңалықтар үшін айтарлықтай болжады. Бұрынғы модельдер (GPT-1, GPT-2, BERT) бұл қабілетті көрсеткен жоқ — болжамдық күш ірі модельдердің пайда болатын қасиеті ретінде туындайды.
BloombergGPT (2023) — Bloomberg-тің қаржылық корпусында үйретілген 50 миллиард параметрлі модель — қаржылық NER, жаңалықтарды жіктеу және сентимент талдауында жақсарулар көрсетті. FinGPT — оның ашық бастапқы коды баламасы — деректерге бағытталған тәсіл мен RAG көмегімен қаржылық сентимент тапсырмаларында 89% дәлдікке жетеді.
S&P 100 талдауы үшін Chain-of-Thought пен In-Context Learning-пен GPT-4-ті пайдаланатын MarketSenseAI 15 айлық тестілеу барысында 10-30% артық альфа және 72%-ға дейінгі жиынтық кіріс көрсетті. Ия, бұл сандарды сақтықпен қабылдау керек (бэктест ≠ тірі трейдинг), бірақ тенденция анық.
Деректер пайплайны: деректерді қайдан алуға болады
SEC EDGAR: ресми дереккөз
АҚШ акциялары үшін негізгі дереккөз — SEC EDGAR. Пайда туралы қоңыраулар әдетте тікелей тіркелмейді, бірақ байланысты құжаттар қолжетімді:
- 8-K тіркеулері (Item 2.02 — операциялар нәтижелері) — нәтижелермен баспасөз хабарламалары, көбінесе транскрипті бар exhibit 99-ды қоса алғанда
- 10-Q / 10-K — Management Discussion & Analysis (MD&A) бар тоқсандық және жылдық есептер — сонымен қатар құнды мәтіндік дереккөз
- DEF 14A — басшылықтың сыйақысы туралы ақпараты бар доверенность туралы мәлімдемелер
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() # Full text with exhibits
print(f"{filing.filing_date}: {len(text)} chars")
Seeking Alpha және коммерциялық API-лар
Пайда туралы қоңыраулардың транскрипттері бөлек өнім. Seeking Alpha тарихи түрде негізгі тегін дереккөз болды, бірақ қазір қол жетімділікті шектейді. Коммерциялық опциялар:
- Seeking Alpha Premium API — спикер белгілері бар толық транскрипттер
- AlphaVantage Earnings API — шектеулері бар тегін деңгей
- Financial Modeling Prep — транскрипттер + фундаментал көрсеткіштер
- Earnings Call Edge / Motley Fool Transcripts — балама дереккөздер
Крипто: басқару қоңыраулары мен DAO ұсыныстары
Міне осы жерде қызық басталады. Ірі DeFi хаттамалары пайда туралы қоңыраулардың өз баламасын өткізеді:
- Uniswap — басқару қоңыраулары, қауымдастық қоңыраулары, YouTube-тегі жазбалар
- Aave — айлық қауымдастық қоңыраулары + басқару форумындағы ұсыныстар
- MakerDAO — басқару қоңыраулары + форумдағы кең талқылаулар
- Compound — толық талқылаулары бар басқару ұсыныстары
Крипто қоңырауларының транскрипттері әдетте құрылымдалмаған. Шешім — YouTube жазбаларын транскрипциялауға арналған OpenAI-дың Whisper:
import openai
from yt_dlp import YoutubeDL
def transcribe_governance_call(youtube_url: str) -> str:
"""Download audio from YouTube and transcribe via Whisper."""
ydl_opts = {
'format': 'bestaudio/best',
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3',
'preferredquality': '64', # Low bitrate is sufficient for speech
}],
'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 арқылы транскрипциялау құны: 0,36 тұрады. Өзіндік орналастыру опциясы үшін — Whisper Large-v3 Turbo заманауи GPU-да 60 минуттық файлды ~17 секундта (нақты уақыттан 216 есе тез) транскрипциялайды.
LLM промптау стратегиялары: аңғалдан өндірістік деңгейге дейін

1-стратегия: тікелей сентимент (әлсіз)
Ең аңғал тәсіл — модельден тікелей сұрау:
"Бұл пайда туралы қоңырау акция бағасы үшін оң ба, теріс пе?"
Бұл жұмыс істей ме? Иә, таңғаларлықтай. Lopez-Lira & Tang мұндай қарапайым промпт та статистикалық маңызды болжамдар беретінін көрсетті. Бірақ мәселелер бар:
- Бинарлы шығыс — градацияларды жоғалтасыз. "Апат" пен "жеңіл көңіл қалдыру" бірдей белгі алады
- Түсініктеме жоқ — модель шешімін неге негіздегені түсініксіз
- Тұрақсыздық — қайталанған іске қосу басқа жауап беруі мүмкін
2-стратегия: Chain-of-Thought көмегімен құрылымдық экстракция (күшті)
Идея: жалғыз сан орнына, модельді әр қадамды түсіндіруге мәжбүрлей отырып, сигналдардың құрылымдық жиынтығын алу.
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):
"""Deviation of forward guidance from consensus expectations."""
revenue_guidance_vs_consensus: Optional[float] = Field(
None, description="% deviation of revenue guidance from consensus"
)
margin_guidance_direction: Optional[str] = Field(
None, description="expanding / stable / contracting"
)
key_quote: str = Field(
description="Verbatim quote with guidance"
)
reasoning: str = Field(
description="CoT: why this guidance matters"
)
class ConfidenceMetrics(BaseModel):
"""Management confidence metrics."""
hedge_word_count: int = Field(
description="Number of hedge words: 'approximately', 'potentially', 'subject to'"
)
forward_looking_ratio: float = Field(
description="Ratio of forward-looking statements to total statements"
)
q_and_a_evasion_count: int = Field(
description="Number of questions where CEO/CFO gave an evasive answer"
)
ceo_vs_cfo_sentiment_delta: float = Field(
description="Sentiment difference between CEO and CFO (-1 to 1). Divergence is a red flag"
)
class CompetitiveIntelligence(BaseModel):
"""Mentions of competitors and market position."""
competitors_mentioned: list[str] = Field(
description="List of mentioned competitors"
)
market_share_claims: list[str] = Field(
description="Market share claims"
)
new_product_signals: list[str] = Field(
description="Signals about new products/services"
)
class ManagementSignals(BaseModel):
"""Management signals."""
turnover_risk: SentimentLevel = Field(
description="Risk of key management turnover"
)
tone_shift_from_previous: Optional[str] = Field(
None, description="How tone changed compared to last quarter"
)
insider_language_flags: list[str] = Field(
description="Marker phrases: 'exploring strategic alternatives', 'right-sizing', etc."
)
class EarningsCallAnalysis(BaseModel):
"""Complete earnings call analysis."""
ticker: str
quarter: str
overall_sentiment: SentimentLevel
sentiment_score: float = Field(description="from -1.0 to 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:
"""
Extract structured signals from an earnings call.
Cost: ~$0.15-0.30 per call (GPT-4o, ~10K tokens 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, # Low temperature for reproducibility
)
return completion.choices[0].message.parsed
Бірнеше негізгі тармаққа назар аударыңыз:
Pydantic схемасы — OpenAI Structured Outputs схемаға 100% сәйкестікті кепілдендіреді. Енді "sorry, I cannot parse the JSON" жоқ. Әр өрісте талдаудың нақты аспектісі үшін мини-промпт ретінде әрекет ететін сипаттама бар.
Схема ішіндегі Chain-of-Thought — reasoning және key_quote өрістері модельді "жұмысын көрсетуге" мәжбүрлейді. Бұл тек сапаны жақсартып қана қоймайды (модель шешім қабылдамас бұрын нақты дәйексөзді табуға мәжбүр болады), сонымен қатар реттеушілер үшін аудит ізін де жасайды.
0,1 температура — бізге шығармашылық керек емес. Бізге қайталанушылық керек. 0 температурада модель кейде үлгілерде "тұрып қалады"; 0,1 — оңтайлы ымыраласу.
3-стратегия: тарихи мысалдармен Few-Shot
Тіпті қуаттырақ — модельге нақты нарықтық реакциялары бар өткен пайда туралы қоңыраулардың мысалдарын беру:
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.
"""
Few-shot мысалдары модельге калибрлеуге көмектеседі: ол Уолл-стрит тілінде "cautiously optimistic" оң мағына бермейтінін — бұл жұмсақ теріс екенін үйренеді. Мысалдарсыз LLM сөздерді сөзбе-сөз түсіндіруі мүмкін.
Сигналдардың төрт түрі
1. Guidance тосын сыйы
Ең тікелей сигнал. Компания келесі тоқсанға/жылға болжам (guidance) береді, ал нарық консенсустан ауытқуға әрекет етеді. LLM басшылық оны бұлыңғыр жеткізсе де, guidance-ты ала алады:
- "We expect revenues in the range of..." — тікелей guidance, талдау оңай
- "We feel comfortable with current Street estimates" — консенсусты жанама растау
- "There are puts and takes relative to consensus" — жанама тәуекел сигналы
LLM үш тұжырымды да түсінеді; regex тек біріншісін ғана түсінеді.
2. Сенімділік көрсеткіштері: хеджирлеу сөздерінің тығыздығы
Бұл менің сүйікті сигналым, себебі ол контринтуитивті. Мәні: менеджерлер — заңгерлік білімі бар және параноидтық заң бөлімдері бар адамдар. Іс жақсы жүргенде, олар нақты болуға рұқсат береді. Мәселелер пісіп жатқанда — олар хеджирлей бастайды.
Бақыланатын көрсеткіштер:
| Көрсеткіш | Сипаттама | Bearish сигнал |
|---|---|---|
| Хеджирлеу сөздерінің тығыздығы | 1000 сөзге хеджирлеу сөздерінің үлесі | 1000 сөзге > 15 |
| Сенімділік коэффициенті | "will/expect" қатынасы "may/could"-қа | < 1,5 |
| Q&A жалтару деңгейі | Тікелей жауапсыз сұрақтардың % | > 30% |
| CEO/CFO дельтасы | CEO мен CFO арасындағы тон айырмашылығы | [-1, 1] шкаласында > 0,3 |
Соңғы тармақ ерекше қызықты. CEO — әңгімеші, оның жұмысы — әдемі сурет салу. CFO — аудиторлар алдында есеп беретін адам. CEO "transformative growth ahead" десе, ал CFO бірден "while maintaining disciplined cost management" деп қосса — бұл алшақтық ішкі шиеленісті білдіреді.
3. Бәсекелестік барлау
LLM бәсекелестердің аттарын транскрипттен ала алады, тіпті басшылық тікелей атауларды айналып өткен кезде де. "The largest player in the market" — бұл GPT-4 үшін жұмбақ емес, егер ол саланы білсе.
Трейдинг сигналы: А компаниясы өзінің пайда туралы қоңырауы кезінде В бәсекелесін теріс контексте атаса ("we're taking share from..."), бұл тек А үшін (long) ғана емес, В үшін де (short) сигнал. Pairs trade.
4. Басшылықтың ауысу сигналдары
Басшылықтың өзгеруі немесе стратегиялық бетбұрыстардың маркер тіркестері:
- "Exploring strategic alternatives" — компанияны сату мүмкін
- "Right-sizing our operations" — жаппай жұмыстан босату
- "The board has initiated a comprehensive review" — CEO жақында кетеді
- "We're bringing in fresh perspectives" — қазіргі команда сәтсіздікке ұшырады
Осы тіркестердің әрқайсысында кейінгі баға динамикасымен статистикалық маңызды корреляция бар. LLM оларды нөлдік жалған позитивтермен анықтай алады — себебі ол контекстті түсінеді, өнім желісі сипаттамасында "strategic alternatives" деген сөзді ұстап алуы мүмкін regex-тен айырмашылығы.
Бэктестинг: Event Study әдіснамасы

Біз сигналдар жасап жатырмыз — керемет. Бірақ олар жұмыс істей ме? Стандартты тексеру әдісі — жиынтық аномальды кірістерді (CAR) есептеу арқылы Event Study.
Әдіснама
- Оқиғаны анықтау — пайда туралы қоңырау күні
- Бағалау терезесі — "қалыпты" кірістерді бағалау үшін оқиғаға дейінгі [-250, -30] сауда күндері
- Оқиға терезесі — оқиға айналасындағы [-1, +60] күн
- Қалыпты кірістерді есептеу нарық моделі арқылы:
- Аномальды кіріс — нақты және "қалыпты" кірістер арасындағы айырмашылық
- CAR — оқиға терезесіндегі аномальды кірістердің жиынтық сомасы
import numpy as np
import pandas as pd
from scipy import stats
from dataclasses import dataclass
@dataclass
class EventStudyResult:
car: np.ndarray # Cumulative abnormal returns by day
t_stats: np.ndarray # t-statistics for each day
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, # Daily stock returns (columns = tickers)
market_returns: pd.Series, # Daily market index returns
events: pd.DataFrame, # DataFrame with columns: [ticker, date, signal_score]
estimation_window: int = 220,
gap: int = 30,
event_window: tuple = (-1, 60),
) -> EventStudyResult:
"""
Event study to evaluate the predictive power of LLM signals.
Sort events by signal_score, form long/short portfolios,
calculate CAR and test statistical significance.
"""
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 observations
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] # Shift to event date
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 top-quintile signals, short bottom-quintile."""
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"LONG portfolio (top quintile LLM sentiment):")
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 events: {long_result.n_events}")
print(f"\nSHORT portfolio (bottom quintile LLM sentiment):")
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 events: {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"\nLONG-SHORT spread:")
print(f" CAR[0,+3]: {ls_3d:+.2%}")
print(f" CAR[0,+30]: {ls_30d:+.2%}")
Не көруді күтеміз
Қолданыстағы зерттеулерге сүйене отырып, LLM сигналдары үшін нақты CAR:
| Терезе | Long портфелі | Short портфелі | 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% |
Негізгі көрсеткіш — статистикалық маңыздылық. p < 0,01 және N > 200 оқиға кезінде тұрақты сигнал туралы айтуға болады. p > 0,05 кезінде — бұл шу болуы мүмкін.
Өндірістік іске асыру: Jupyter-ден Prod-қа дейін
Нақты уақыттағы пайплайн архитектурасы
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)│
└──────────────────────────────┘
Шығындарды талдау: бір пайда туралы қоңырау қанша тұрады
Бір пайда туралы қоңырауды өндірісте өңдеу экономикасын талдап көрейік:
| Компонент | Құны | Кідіріс |
|---|---|---|
| Whisper API транскрипциясы (60 мин) | $0,36 | ~17 сек (Turbo) |
| GPT-4o құрылымдық экстракциясы | $0,15-0,30 | ~8-15 сек |
| GPT-4o нақты уақыттағы бөлік талдауы (x12) | $1,80-3,60 | әрқайсысы ~5 сек |
| RAG сақтауға арналған embedding | $0,01 | <1 сек |
| Барлығы (толық пайплайн) | $2,30-4,30 | ~30 сек толығымен |
Тоқтаңыз, баға бір қоңырауға $30-50 болды. Бұл сандар қайдан келеді? Бұл модель мен тәсілге байланысты:
- Бюджеттік опция (GPT-4o-mini, бір өту): $0,50-1,00
- Стандартты опция (GPT-4o, құрылымдық экстракция + бөлік талдауы): $2-5
- Премиум опция (GPT-4o, бірнеше өту, кросс-валидация, тарихи салыстыру): $15-30
- Хедж-қор деңгейі (бірнеше модель + адам шолуы + нақты уақыттағы стриминг): $30-50+
500 тикерді сауда жасайтын квант-қор үшін, пайда сезонын өңдеу (6 апта ішінде ~2000 қоңырау) стандартты опциямен 10000 тұрады. Позиция бойынша орташа альфа 1-3% болғанда — ROI астрономиялық.
Кідіріс: миллисекундтарға жарыс
HFT әлемінде кідіріс — бәрі. Бірақ пайдаға негізделген стратегиялар үшін жағдай басқаша:
- Пайда туралы қоңырау 45-60 минутқа созылады — уақыт бар
- PEAD 60 күнге созылады — бірінші секундта кіру қажет емес
- Негізгі ығысу қоңырау аяқталғаннан кейінгі алғашқы 30 минутта болады
Оңтайлы стратегия — екі кезеңдік:
- 1-кезең (нақты уақыт): қоңырау кезінде 5 минуттық бөліктерді талдау, алдын ала сигнал қалыптастыру
- 2-кезең (қоңыраудан кейін): аяқталғаннан кейін 2-5 минут ішінде бүкіл транскриптті толық талдау
1-кезең қоңыраудың аяқталуын күтетін нарық қатысушыларынан 5-10 минут артықшылық береді. Орташа капиталды акциялар үшін бұл жеткілікті.
Криптоға кеңею: DeFi басқаруы және DAO ұсыныстары
Крипто нарығы LLM alpha mining үшін тамаша полигон. Себебі мынада:
- Институционалды ойыншылар аз — бұл пайдалануға болатын тиімсіздіктің көбірек екенін білдіреді
- Басқару = пайда туралы қоңырау — DAO шешімдері токеномикаға тікелей әсер етеді
- 24/7 нарық — реакцияны бірден сауда жасауға болады
- Ашық деректер — барлық ұсыныстар мен дауыс берулер on-chain
Талдауға арналған крипто оқиғаларының түрлері
Басқару ұсыныстары (Aave, Compound, Uniswap)
Ұсыныс хаттама параметрлерін өзгертеді — пайыздық мөлшерлемелер, кепілдік факторлары, fee switch-тер. LLM экономикалық әсерді бағалай алады:
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}
"""
Хаттама жаңартулары туралы хабарландырулар
Uniswap hooks-пен v4-ті жариялағанда немесе Aave GHO-ны іске қосқанда — бұл TradFi-дегі өнімді шығарумен пара-пар. LLM баяндау серпінін және техникалық маңыздылықты бағалай алады.
Қазынашылық есептер
Ірі DAO-лардың жүздеген миллион тұратын қазынашылығы бар. Тоқсандық қазынашылық есептер пайданың тікелей аналогы. Runway, burn rate, әртараптандыру — барлығы LLM талдауына бағынышты.
Крипто сигналдарының ерекшеліктері
TradFi-ден айырмашылығы, криптода:
- On-chain деректер баяндауды растайды немесе жоққа шығарады — басқару қоңырауларында айтылғанды нақты хаттама көрсеткіштерімен (TVL, көлем, белсенді пайдаланушылар) кросс-сілтеме жасауға болады
- Кит әмияндары инсайдерлік сауда ретінде — басқару талқылауларынан кейінгі ірі әмиян қозғалыстары көбінесе дауыс беруден бұрын болады
- CT (Crypto Twitter) арқылы сентиментті күшейту — басқару қоңырауынан алынған сигнал Twitter баяндауларымен күшейтілуі немесе басылуы мүмкін
Тұзақтар мен шектеулер
Галлюцинациялар: модель сандарды ойлап тапқанда
LLM транскриптте болмаған guidance-ты "алуы" мүмкін. Бұл хеджирлеу сөздерінің тығыздығын талдау кезінде әсіресе қауіпті: модель нақты бар сөздерден көп немесе аз санауы мүмкін.
Шешім: екі кезеңдік тексеру. LLM алады, детерминистік код тексереді. Хеджирлеу сөздері үшін — LLM бағалауымен қатарлас regex санауы. Ауытқу > 20% — қолмен тексеруге белгілеу.
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:
"""Deterministic verification of LLM hedge word count."""
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,
}
Контекст терезесінің шектеулері
Мыналарды беруге тырыссаңыз, тіпті 128K токен де жеткіліксіз болуы мүмкін:
- Ағымдағы транскрипт (~10K токен)
- Салыстыру үшін алдыңғы транскрипт (~10K)
- Талдаушылардың консенсус болжамдары (~2K)
- Few-shot мысалдары (~3K)
- Жүйелік промпт (~1K)
Барлығы ~26K — біз сыямыз. Бірақ контекст үшін 10-K тіркеуін (~80-120K токен) қоссаңыз — сіз шектің шетінде боласыз. Шешім: ұзақ құжаттардан тиісті бөліктерді алу үшін RAG.
Ауытқушылық пен жүйелік қателер
LLM белгілі бір тіркестер белгілі бір нәтижелермен байланысты болған тарихи деректерде оқытылады. Бірақ нарық бейімделеді:
- Егер барлығы GPT-4-пен хеджирлеу сөздерін санай бастаса, менеджерлер тілін өзгертеді
- Модель оқыту деректеріндегі үлгілердің маңыздылығын шамадан тыс бағалауы мүмкін (survivorship bias)
- Корпоративтік тіл дамиды: 2010 жылы "синергия" бір нәрсені білдірді, 2026 жылы — басқа нәрсені
Тым көп трейд тәуекелі
Егер 50 квант-қор бірдей транскрипттерді талдау үшін бірдей GPT-4-ті пайдаланса — сигнал нашарлайды. Ұқсастық: барлығы сандық тосын сыйлар бойынша PEAD-ты сауда жасай бастағанда, аномалия кішірейді. Мәтіндік сигналдармен де солай болады, бірақ кідіріспен:
- Қазір (2026) — аз ғана адам пайда туралы қоңыраулар үшін LLM-ді жүйелі түрде пайдаланады. Альфа айтарлықтай
- 2-3 жылда — кең таралу, альфа азаяды
- 5 жылда — негізгі LLM сигналдары тауарға айналады, edge тек пайдаланушылық модельдер мен бірегей деректерде сақталады
Бұл альфа сигналының стандартты өмірлік циклі. Ол созылғанша ләззат алыңыз.
Қорытынды орнына: іс-қимыл жоспары
Пайда туралы қоңырауларды талдау үшін LLM-ді пайдалануды бастағыңыз келсе, міне минималды жарамды жоспар:
- Тегін деректерден бастаңыз — 8-K/10-Q тіркеулері үшін SEC EDGAR + EdgarTools
- Құрылымдық экстракцияны пайдаланыңыз — OpenAI Structured Outputs арқылы Pydantic схемалары
- Event study арқылы бэктест жасаңыз — тарихи деректердегі CAR, кемінде 200 оқиға
- Few-shot мысалдарын қосыңыз — 5-10 белгіленген мысал сапаны түбегейлі жақсартады
- Детерминистік түрде тексеріңіз — LLM алады, regex тексереді, адам аудит жасайды
- Орташа капиталдан бастаңыз — көбірек альфа, ірі қорлармен азырақ бәсекелестік
- Криптоға кеңейтіңіз — зерттелмеген аумақ ретінде басқару қоңыраулары мен DAO ұсыныстары
Сандық талдаудың негізгі ережесін есте сақтаңыз: егер сигнал шындыққа сай болу үшін тым жақсы естілсе — қайта тексеріңіз. LLM-дер түсіну елесін жасайды, бірақ оның артында статистикалық үлгі сәйкестендіру жатыр. Қуатты құрал — бірақ құрал, оракул емес.
Библиография
-
Ball, R., Brown, P. (1968). An Empirical Evaluation of Accounting Income Numbers. Journal of Accounting Research, 6(2), 159-178. — 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. — Канондық PEAD мақаласы.
-
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. — Қаржылық сентимент сөздігі.
-
Araci, D. (2019). FinBERT: Financial Sentiment Analysis with Pre-trained Language Models. arXiv:1908.10063. — Қаржылық NLP үшін BERT, SOTA-дан +14 пайыздық тармақ.
-
Wu, S. et al. (2023). BloombergGPT: A Large Language Model for Finance. arXiv:2303.17564. — Bloomberg-тің 50B параметрлі моделі.
-
Yang, H. et al. (2023). FinGPT: Open-Source Financial Large Language Models. arXiv:2306.06031. — BloombergGPT-ке ашық бастапқы код баламасы, 89% дәлдік.
-
Lopez-Lira, A., Tang, Y. (2023). Can ChatGPT Forecast Stock Price Movements? Return Predictability and Large Language Models. arXiv:2304.07619. — GPT-4 ~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 сандық PEAD-тен екі есе үлкен.
-
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-де 10-30% артық альфасы бар GPT-4 фреймворкі.
-
Chen, Y. et al. (2025). GPT-Signal: Generative AI for Semi-automated Feature Engineering in the Alpha Research Process. arXiv:2410.18448. — LLM арқылы трейдинг сигналдарын автоматты жасау.
-
Zhang, X. et al. (2025). Can LLMs Hit Moving Targets? Tracking Evolving Signals in Corporate Disclosures. arXiv:2510.03195. — Корпоративтік ашылымдардағы "қозғалмалы нысаналарды" анықтау.
-
Chen, Z. et al. (2025). Large Language Models in Equity Markets: Applications, Techniques, and Insights. Frontiers in Artificial Intelligence. — Қаржыдағы 84 LLM зерттеуіне шолу.
Бұл мақала білім беру сипатында және инвестициялық кеңес болып табылмайды. Мұнда сипатталған кез келген трейдинг стратегиясы нақты капиталмен енгізу алдында мұқият бэктестингтеуді және тәуекелдерді басқаруды талап етеді.
Authors
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.