LLM Alpha Mining: daromad bo'yicha qo'ng'iroqlar va moliyaviy hujjatlardan treyding signallarini qanday olish mumkin
Uoll-stritda bir hazil bor: "Daromad bo'yicha qo'ng'iroqdagi eng qimmatli ma'lumot — bosh direktor nima deganida emas, buni qanday deganida." Tim Kuk o'tgan yilgi "biz juda mamnunmiz" o'rniga "biz ehtiyotkorlik bilan optimistmiz" desa — bu til o'yini emas, bu yuzlab million dollar turadigan signal.
O'nlab yillar davomida kvant-fondlar ushbu signallarni olishni tizimlashtirishga harakat qilishgan. Avval ular lug'atlar yordamida "ijobiy" va "salbiy" so'zlarning chastotasini sanashgan. Keyin BERT-ni ishga tushirishgan. Endi esa bizda GPT-4o, Claude va korporativ ikki xillikning nozikliklarini tadqiqotchilarning o'zlarini ham qo'rqitadigan aniqlik bilan tahlil qila oladigan ochiq manbali LLM-lar bor.
Daromad bo'yicha qo'ng'iroqlardan treyding signallarini olish uchun to'liq pайплайн qanday qurilishini tahlil qilib chiqamiz — transkript olishdan boshlab yig'indi anomal daromadlarni bektestlashgacha.
Daromad bo'yicha qo'ng'iroqlar nima uchun alfa uchun oltin kon
Post-Earnings Announcement Drift: o'lmaydigan anomaliya
1968 yilda Boll va Braun g'alati bir narsani topishdi: choraklik natijalar e'lon qilingandan keyin, aksiyalar yana 60-90 kun davomida "kutilmagan natija" yo'nalishida siljishda davom etadi. Ular buni Post-Earnings Announcement Drift (PEAD) deb atashdi. O'shandan beri yarim asrdan ko'proq vaqt o'tdi, yuzlab maqolalar yozildi, anomaliya o'nlab burchaklardan tushuntirildi — va u hali ham ishlaydi.
PEAD — moliya tarixidagi eng barqaror bozor anomaliyalaridan biri. "Ijobiy kutilmagan natijani sotib ol, salbiysini sot" portfel strategiyasi tarixiy jihatdan yiliga 10-25% ortiqcha daromad bergan. Bozor buni nega arbitraj qilmagan? Bir nechta sabab bor:
- Investorlarning cheklangan e'tibori — bir haftada 200 kompaniya hisobot bersa, barcha transkriptlarni o'qish jismonan mumkin emas
- Kognitiv murakkablik — daromad bo'yicha qo'ng'iroq 45-60 daqiqa davom etadi, va asosiy signal Q&A sessiyasining 38-daqiqasidagi bitta jumlada yashiringan bo'lishi mumkin
- Til noaniqligi — moliya direktori "biz qarshi shamolda suzib ketmoqdamiz" deydi, va kontekstsiz bu yumshoq ogohlantirishmi yoki standart hedjirlashmi noaniq
Aynan shu yerda LLM-lar sahnaga chiqadi. Birinchi marta bizda tajribali tahlilchilar ham payqamay qoladigan nuanslarni ushlab, bir kechada 500 ta transkriptni qayta ishlay oladigan vosita bor.
PEAD.txt: raqamlardan ko'ra matn muhimroq
Filadelfiya Federal zaxira bankining tadqiqotchilari (Meursault, Liang, Routledge, Scanlon) matnli ma'lumotning qiymati haqidagi taxminlarni buzgan PEAD.txt maqolasini e'lon qilishdi. Ular standart daromad kutilmagan natijasining matnli analogini yaratishdi — SUE.txt — bu daromadning raqamli qiymatidan umuman foydalanmaydi.
Natija qanday? SUE.txt klassik PEAD-dan ikki barobar katta drift yaratadi. Bundan tashqari: so'nggi yillarda raqamli kutilmagan natijalarga asoslangan klassik PEAD deyarli yo'qolib ketgan bo'lsa (bozor o'rgandi), matnli drift hali ham muhim bo'lib qolmoqda. Bozor raqamlarni tez qayta ishlashni o'rgandi, lekin matnni talqin qilishda hali ham qiynalmoqda.
Bu daromad bo'yicha qo'ng'iroqlarga NLP-ga asoslangan yondashuv foydasiga asosiy dalil.
Sentimentdan semantikaga: yondashuvlar evolyutsiyasi

Birinchi avlod: Bag-of-words va lug'atlar (2000-2015)
Hammasi Loughran-McDonald lug'atidan (2011) boshlandi — "ijobiy," "salbiy," "noaniq" va "sud jarayoniga oid" deb belgilangan so'zlar ro'yxati. G'oya o'zining soddaligi bilan nafis edi: 10-K hujjatidagi salbiy so'zlarning foizini sanab, shunga tayanib savdo qilish.
Muammo nimada? Moliyaviy kontekstda "outstanding" so'zi ko'pincha "to'lanmagan qarz" degan ma'noni bildiradi, "ajoyib natija" emas. Risk Management-dagi "xavf" so'zi salbiy signal emas — bu jarayon tavsifi. Standart NLP sentiment lug'atlari moliyaviy matnlarda sharmandali darajada yomon ishladi.
Loughran va McDonald maxsus lug'at yaratdilar, bu vaziyatni yaxshiladi, lekin asosiy muammo qoldi: bag-of-words kontekstni tushunmaydi. "Biz kutilgan natijalarga erishmay qolmadik" — bu yerda ikkita "salbiy" so'z bor, lekin ma'nosi ijobiy.
Ikkinchi avlod: FinBERT va transformerlar (2019-2023)
2019 yilda Dogu Arachi Reuters TRC2-ning moliyaviy matnlariga moslashtirilgan BERT — FinBERT-ni e'lon qildi. Natijalar ta'sirchan bo'ldi: Financial PhraseBank ma'lumotlar to'plamida eng zamonaviy yechimga nisbatan 14 foiz punktga yaxshilanish. FinBERT kontekstni tushundi: "debt" yonidagi "outstanding" — salbiy, "performance" yonidagi — ijobiy.
Ammo FinBERT-ning cheklovi bor edi: 512 tokenlik kontekst oynasi. Daromad bo'yicha qo'ng'iroq 8000-12000 so'zdan iborat. Bo'laklarga bo'lib, sentimentning o'rtachasini olish paragraflar orasidagi semantikani yo'qotishga olib keladi. Bosh direktor optimizm bilan boshlab, keyin Q&A vaqtida yetkazib berish zanjiridagi muammolarni yo'l-yo'lakay aytib o'tishi mumkin. FinBERT har bir bo'lakni mustaqil tahlil qiladi va bu qarama-qarshilikni o'tkazib yuboradi.
Uchinchi avlod: uzun kontekstli LLM-lar (2023-hozirgi kun)
128K-1M tokenlik kontekst oynasiga ega GPT-4, Claude, Gemini o'yin qoidalarini o'zgartirdi. Endi butun transkriptni bir vaqtning o'zida yuklab, butun hujjatni tushunishni talab qiladigan savollar berish mumkin.
Asosiy tadqiqot — Lopez-Lira va Tang (2023) "Can ChatGPT Forecast Stock Price Movements?" 50 000dan ortiq sarlavhada GPT-4 dastlabki bozor reaktsiyasi yo'nalishini bashorat qilishda ~90% aniqlik ko'rsatdi va keyingi driftni, ayniqsa kichik kapitalli kompaniyalar va salbiy yangiliklar uchun sezilarli darajada bashorat qildi. Oldingi modellar (GPT-1, GPT-2, BERT) bu qobiliyatni ko'rsatmadi — bashorat qilish kuchi katta modellarning paydo bo'ladigan xususiyati sifatida yuzaga keladi.
BloombergGPT (2023) — Bloomberg-ning moliyaviy korpusida o'qitilgan 50 milliard parametrli model — moliyaviy NER, yangiliklarni tasniflash va sentiment tahlilida yaxshilanishlarni ko'rsatdi. FinGPT — uning ochiq manbali muqobili — ma'lumotlarga yo'naltirilgan yondashuv va RAG yordamida moliyaviy sentiment vazifalarida 89% aniqlikka erishadi.
S&P 100 tahlili uchun Chain-of-Thought va In-Context Learning bilan GPT-4-dan foydalanadigan MarketSenseAI 15 oylik sinov davomida 10-30% ortiqcha alfa va 72% gacha yig'indi daromad ko'rsatdi. Ha, bu raqamlarni ehtiyotkorlik bilan qabul qilish kerak (bektest ≠ jonli treyding), lekin tendentsiya aniq.
Ma'lumotlar pайплайни: ma'lumotlarni qayerdan olish mumkin
SEC EDGAR: rasmiy manba
AQSh aksiyalari uchun asosiy manba SEC EDGAR hisoblanadi. Daromad bo'yicha qo'ng'iroqlar odatda to'g'ridan-to'g'ri ro'yxatdan o'tkazilmaydi, lekin bog'liq hujjatlar mavjud:
- 8-K ro'yxatga olishlar (Item 2.02 — Operatsiyalar natijalari) — natijalar bilan matbuot xabarlari, ko'pincha transkripti bo'lgan exhibit 99 bilan birga
- 10-Q / 10-K — Management Discussion & Analysis (MD&A) bilan choraklik va yillik hisobotlar — bu ham qimmatli matnli manba
- DEF 14A — boshqaruv haq to'lovi haqidagi ma'lumotlar bilan ishonchnoma bayonotlari
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 va tijorat API-lari
Daromad bo'yicha qo'ng'iroq transkriptlari alohida mahsulot hisoblanadi. Seeking Alpha tarixiy jihatdan asosiy bepul manba bo'lgan, lekin hozir kirishni cheklaydi. Tijorat variantlari:
- Seeking Alpha Premium API — spiker belgilari bilan to'liq transkriptlar
- AlphaVantage Earnings API — cheklovlar bilan bepul daraja
- Financial Modeling Prep — transkriptlar + fundamental ko'rsatkichlar
- Earnings Call Edge / Motley Fool Transcripts — muqobil manbalar
Kripto: boshqaruv qo'ng'iroqlari va DAO takliflari
Aynan shu yerda qiziq boshlanadi. Yirik DeFi protokollari daromad bo'yicha qo'ng'iroqlarning o'z analogini o'tkazadi:
- Uniswap — boshqaruv qo'ng'iroqlari, jamoat qo'ng'iroqlari, YouTube-dagi yozuvlar
- Aave — oylik jamoat qo'ng'iroqlari + boshqaruv forumidagi takliflar
- MakerDAO — boshqaruv qo'ng'iroqlari + forumdagi keng muhokamalar
- Compound — batafsil muhokamalar bilan boshqaruv takliflari
Kripto qo'ng'iroqlarining transkriptlari odatda tuzilmagan bo'ladi. Yechim — YouTube yozuvlarini transkripsiya qilish uchun OpenAI-ning 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 orqali transkripsiya qilish narxi: 0,36 turadi. O'z-o'zini joylashtirish varianti uchun — Whisper Large-v3 Turbo zamonaviy GPU-da 60 daqiqalik faylni ~17 soniyada (real vaqtdan 216 barobar tez) transkripsiya qiladi.
LLM promptlash strategiyalari: soddadan ishlab chiqarish darajasigacha

1-strategiya: to'g'ridan-to'g'ri sentiment (kuchsiz)
Eng sodda yondashuv — modeldan to'g'ridan-to'g'ri so'rash:
"Bu daromad bo'yicha qo'ng'iroq aksiya narxi uchun ijobiymi yoki salbiymi?"
Bu ishlaydimi? Ha, ajablanarli tarzda. Lopez-Lira va Tang shuni ko'rsatdiki, hatto bunday oddiy prompt ham statistik jihatdan muhim bashoratlar beradi. Lekin muammolar bor:
- Ikkilik chiqish — gradatsiyalarni yo'qotasiz. "Falokat" va "yengil hafsalasizlik" bir xil belgini oladi
- Tushuntirish yo'q — model qaroriga nimaga asoslanganini bilib bo'lmaydi
- Beqarorlik — takrorlangan ishga tushirish boshqa javob berishi mumkin
2-strategiya: Chain-of-Thought bilan tuzilgan ekstraksiya (kuchli)
G'oya: bitta raqam o'rniga, modelni har bir bosqichni tushuntirishga majbur qilib, signallarning tuzilgan to'plamini ajratib olish.
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
Bir nechta asosiy nuqtalarga e'tibor bering:
Pydantic sxemasi — OpenAI Structured Outputs sxemaga 100% mos kelishini kafolatlaydi. Endi "sorry, I cannot parse the JSON" yo'q. Har bir maydonda tahlilning ma'lum bir jihati uchun mini-prompt vazifasini bajaradigan tavsif bor.
Sxema ichidagi Chain-of-Thought — reasoning va key_quote maydonlari modelni "ishini ko'rsatishga" majbur qiladi. Bu nafaqat sifatni yaxshilaydi (model qaror qabul qilishdan oldin aniq iqtibosni topishga majbur bo'ladi), balki tartibga soluvchilar uchun audit izini ham yaratadi.
0,1 harorat — bizga ijodkorlik kerak emas. Bizga takrorlanuvchanlik kerak. 0 haroratda model ba'zan naqshlarda "qotib qoladi"; 0,1 — optimal murosaga kelish.
3-strategiya: tarixiy misollar bilan Few-Shot
Yanada kuchliroq — modelga haqiqiy bozor reaktsiyalari bilan o'tgan daromad bo'yicha qo'ng'iroqlar misollarini berish:
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 misollari modelga kalibrlashda yordam beradi: u Uoll-strit tilida "cautiously optimistic" ijobiy ma'noni bildirmasligini — bu yumshoq salbiy ekanligini o'rganadi. Misollarsiz LLM so'zlarni so'zma-so'z talqin qilishi mumkin.
Signallarning to'rt turi
1. Guidance kutilmagan natijasi
Eng to'g'ridan-to'g'ri signal. Kompaniya keyingi chorak/yil uchun bashorat (guidance) beradi, va bozor konsensusdan chetlanishga reaksiya bildiradi. LLM boshqaruv uni noaniq yetkazganda ham guidance-ni ajratib ola oladi:
- "We expect revenues in the range of..." — to'g'ridan-to'g'ri guidance, tahlil qilish oson
- "We feel comfortable with current Street estimates" — konsensusning bilvosita tasdig'i
- "There are puts and takes relative to consensus" — bilvosita xavf signali
LLM uchala iborani ham tushunadi; regex faqat birinchisini tushunadi.
2. Ishonch ko'rsatkichlari: hedjirlash so'zlari zichligi
Bu mening sevimli signalim, chunki u kontrintuitiv. Mohiyati: menejerlar — huquqiy ta'limga ega va paranoid huquq bo'limlariga ega odamlar. Ishlar yaxshi ketayotganda, ular o'zlariga aniq bo'lishga ruxsat berishadi. Muammolar pishayotganda — ular hedjirlay boshlaydilar.
Kuzatiladigan ko'rsatkichlar:
| Ko'rsatkich | Tavsif | Bearish signal |
|---|---|---|
| Hedjirlash so'zlari zichligi | 1000 so'zga hedjirlash so'zlarining ulushi | 1000 so'zga > 15 |
| Ishonch koeffitsienti | "will/expect" nisbati "may/could"-ga | < 1,5 |
| Q&A qochish darajasi | To'g'ridan-to'g'ri javobsiz savollar % | > 30% |
| CEO/CFO deltasi | CEO va CFO orasidagi ohang farqi | [-1, 1] shkalasida > 0,3 |
Oxirgi nuqta ayniqsa qiziq. CEO — hikoyachi, uning ishi — chiroyli rasm chizish. CFO — auditorlar oldida hisobot beradigan kishi. CEO "transformative growth ahead" desa, CFO darhol "while maintaining disciplined cost management" deb qo'shsa — bu farq ichki keskinliklarni bildiradi.
3. Raqobatchilik razvedkasi
LLM raqobatchilarning nomlarini transkriptdan ajratib olishi mumkin, hatto boshqaruv to'g'ridan-to'g'ri nomlardan qochganda ham. "The largest player in the market" — bu GPT-4 uchun sir emas, agar u sohani bilsa.
Treyding signali: agar A kompaniyasi o'zining daromad bo'yicha qo'ng'irog'ida B raqobatchisini salbiy kontekstda tilga olsa ("we're taking share from..."), bu nafaqat A uchun (long), balki B uchun ham (short) signal. Pairs trade.
4. Boshqaruv almashinuvi signallari
Boshqaruv o'zgarishlari yoki strategik burilishlarning marker iboralari:
- "Exploring strategic alternatives" — kompaniyani sotish ehtimoli
- "Right-sizing our operations" — ommaviy ishdan bo'shatish
- "The board has initiated a comprehensive review" — CEO tez orada ketadi
- "We're bringing in fresh perspectives" — hozirgi jamoa muvaffaqiyatsizlikka uchradi
Ushbu iboralarning har birida keyingi narx dinamikasi bilan statistik jihatdan muhim korrelyatsiya bor. LLM ularni nol yolg'on ijobiylar bilan aniqlashi mumkin — chunki u kontekstni tushunadi, mahsulot liniyasi tavsifida "strategic alternatives" iborasini ushlab olishi mumkin bo'lgan regex-dan farqli o'laroq.
Bektestlash: Event Study metodologiyasi

Biz signallar yaratmoqdamiz — ajoyib. Lekin ular ishlaydimi? Standart tekshirish usuli — yig'indi anomal daromadlarni (CAR) hisoblash bilan Event Study.
Metodologiya
- Voqeani aniqlash — daromad bo'yicha qo'ng'iroq sanasi
- Baholash oynasi — "normal" daromadlarni baholash uchun voqeadan oldingi [-250, -30] savdo kunlari
- Voqea oynasi — voqea atrofidagi [-1, +60] kun
- Normal daromadlarni hisoblash bozor modeli orqali:
- Anomal daromad — haqiqiy va "normal" daromadlar orasidagi farq
- CAR — voqea oynasidagi anomal daromadlarning yig'indi summasi
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%}")
Nimani ko'rishni kutamiz
Mavjud tadqiqotlarga asoslanib, LLM signallari uchun real CAR:
| Oyna | Long portfeli | Short portfeli | L/S spredi |
|---|---|---|---|
| [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% |
Asosiy ko'rsatkich — statistik ahamiyatlilik. p < 0,01 va N > 200 voqea bo'lganda, barqaror signal haqida gapirish mumkin. p > 0,05 bo'lganda — bu shovqin bo'lishi mumkin.
Ishlab chiqarishda amalga oshirish: Jupyter-dan prod-gacha
Real vaqt pайплайн arxitekturasi
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)│
└──────────────────────────────┘
Xarajatlar tahlili: bitta daromad bo'yicha qo'ng'iroq qancha turadi
Bitta daromad bo'yicha qo'ng'iroqni ishlab chiqarishda qayta ishlash iqtisodiyotini tahlil qilib chiqamiz:
| Komponent | Narxi | Kechikish |
|---|---|---|
| Whisper API transkripsiyasi (60 daq) | $0,36 | ~17 son (Turbo) |
| GPT-4o tuzilgan ekstraksiyasi | $0,15-0,30 | ~8-15 son |
| GPT-4o real vaqtdagi bo'lak tahlili (x12) | $1,80-3,60 | har biri ~5 son |
| RAG saqlash uchun embedding | $0,01 | <1 son |
| Jami (to'liq pайплайн) | $2,30-4,30 | ~30 son jami |
To'xtang, baho bitta qo'ng'iroq uchun $30-50 edi. Bu raqamlar qayerdan keladi? Bu model va yondashuvga bog'liq:
- Byudjet varianti (GPT-4o-mini, bitta o'tish): $0,50-1,00
- Standart variant (GPT-4o, tuzilgan ekstraksiya + bo'lak tahlili): $2-5
- Premium variant (GPT-4o, bir nechta o'tish, o'zaro tekshirish, tarixiy taqqoslash): $15-30
- Hedj-fond darajasi (bir nechta model + inson ko'rib chiqishi + real vaqtdagi striming): $30-50+
500 tikerni savdo qiladigan kvant-fond uchun, daromad mavsumini qayta ishlash (6 haftada ~2000 qo'ng'iroq) narxi standart variant bilan 10000 ni tashkil qiladi. Pozitsiya bo'yicha o'rtacha alfa 1-3% ekanligini hisobga olsak — ROI astronomik.
Kechikish: millisekundlar uchun poyga
HFT dunyosida kechikish — hamma narsa. Lekin daromadga asoslangan strategiyalar uchun vaziyat boshqacha:
- Daromad bo'yicha qo'ng'iroq 45-60 daqiqa davom etadi — vaqt bor
- PEAD 60 kunga cho'ziladi — birinchi soniyada kirish shart emas
- Asosiy siljish qo'ng'iroq tugagandan keyingi birinchi 30 daqiqada sodir bo'ladi
Optimal strategiya — ikki bosqichli:
- 1-bosqich (real vaqt): qo'ng'iroq davomida 5 daqiqalik bo'laklarni tahlil qilish, dastlabki signal shakllantirish
- 2-bosqich (qo'ng'iroqdan keyin): tugagandan keyin 2-5 daqiqa ichida butun transkriptni to'liq tahlil qilish
1-bosqich qo'ng'iroq tugashini kutayotgan bozor ishtirokchilaridan 5-10 daqiqa ustunlik beradi. O'rta kapitalli aksiyalar uchun bu yetarli.
Kriptoga kengaytirish: DeFi boshqaruvi va DAO takliflari
Kripto bozori LLM alpha mining uchun ideal sinov maydoni. Sababi:
- Institutsional ishtirokchilar kamroq — bu foydalanish mumkin bo'lgan samarasizlikning ko'proq ekanligini bildiradi
- Boshqaruv = daromad bo'yicha qo'ng'iroq — DAO qarorlari tokenomikaga to'g'ridan-to'g'ri ta'sir qiladi
- 24/7 bozor — reaktsiyani darhol savdo qilish mumkin
- Ochiq ma'lumotlar — barcha takliflar va ovoz berishlar on-chain
Tahlil uchun kripto voqealari turlari
Boshqaruv takliflari (Aave, Compound, Uniswap)
Taklif protokol parametrlarini o'zgartiradi — foiz stavkalari, garov omillari, fee switch-lar. LLM iqtisodiy ta'sirni baholay oladi:
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}
"""
Protokol yangilanishi haqidagi e'lonlar
Uniswap hooks bilan v4-ni e'lon qilganda yoki Aave GHO-ni ishga tushirganda — bu TradFi-dagi mahsulot chiqarishga teng. LLM naratsion dinamikani va texnik ahamiyatni baholay oladi.
Xazina hisobotlari
Yirik DAO-larning yuzlab million turadigan xazinalari bor. Choraklik xazina hisobotlari daromadning to'g'ridan-to'g'ri analogidir. Runway, yonish tezligi, diversifikatsiya — barchasi LLM tahliliga bo'ysunadi.
Kripto signallarining o'ziga xosligi
TradFi-dan farqli o'laroq, kriptoda:
- On-chain ma'lumotlar naratsiyani tasdiqlaydi yoki inkor etadi — boshqaruv qo'ng'iroqlarida aytilganlarni haqiqiy protokol ko'rsatkichlari (TVL, hajm, faol foydalanuvchilar) bilan o'zaro solishtirish mumkin
- Kit hamyonlar insayder savdosi sifatida — boshqaruv muhokamalaridan keyingi katta hamyon harakatlari ko'pincha ovoz berishdan oldin sodir bo'ladi
- CT (Crypto Twitter) orqali sentimentni kuchaytirish — boshqaruv qo'ng'irog'idan olingan signal Twitter naratsiyalari bilan kuchaytirilishi yoki bostirilishi mumkin
Tuzoqlar va cheklovlar
Gallyutsinatsiyalar: model raqamlarni o'ylab topganda
LLM transkriptda bo'lmagan guidance-ni "ajratib olishi" mumkin. Bu hedjirlash so'zlari zichligini tahlil qilishda ayniqsa xavflidir: model haqiqatda mavjud so'zlardan ko'proq yoki kamroq sanashi mumkin.
Yechim: ikki bosqichli tekshirish. LLM ajratib oladi, deterministik kod tekshiradi. Hedjirlash so'zlari uchun — LLM baholashiga parallel regex sanog'i. Og'ish > 20% — qo'lda ko'rib chiqish uchun belgilash.
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,
}
Kontekst oynasi cheklovlari
Agar quyidagilarni berishni istasangiz, hatto 128K token ham yetarli bo'lmasligi mumkin:
- Joriy transkript (~10K token)
- Taqqoslash uchun oldingi transkript (~10K)
- Tahlilchilar konsensus bashoratlari (~2K)
- Few-shot misollari (~3K)
- Tizim prompti (~1K)
Jami ~26K — biz sig'amiz. Lekin agar kontekst uchun 10-K ro'yxatga olishni (~80-120K token) qo'shsangiz — siz allaqachon chegarada bo'lasiz. Yechim: uzun hujjatlardan tegishli bo'laklarni olish uchun RAG.
Noaniqlik va tizimli xatolar
LLM-lar ma'lum iboralar ma'lum natijalar bilan bog'liq bo'lgan tarixiy ma'lumotlarda o'qitiladi. Lekin bozor moslashadi:
- Agar hamma GPT-4 bilan hedjirlash so'zlarini sanay boshlasa, menejerlar tilini o'zgartiradi
- Model o'qitish ma'lumotlaridagi naqshlarning ahamiyatini oshirib baholashi mumkin (survivorship bias)
- Korporativ til rivojlanadi: 2010 yilda "sinergiya" bir narsani, 2026 yilda — boshqa narsani anglatgan
Ortiqcha to'lgan savdo xavfi
Agar 50 ta kvant-fond bir xil transkriptlarni tahlil qilish uchun bir xil GPT-4-dan foydalansa — signal yomonlashadi. O'xshashlik: hamma raqamli kutilmagan natijalar bo'yicha PEAD-ni savdo qila boshlaganda, anomaliya kichraydi. Matnli signallar bilan ham xuddi shunday bo'ladi, lekin kechikish bilan:
- Hozir (2026) — kam odam daromad bo'yicha qo'ng'iroqlar uchun LLM-dan tizimli ravishda foydalanadi. Alfa sezilarli
- 2-3 yilda — keng qo'llanilishi, alfa kamayadi
- 5 yilda — asosiy LLM signallari tovarga aylanadi, edge faqat maxsus modellar va noyob ma'lumotlarda saqlanib qoladi
Bu alfa signalining standart hayot sikli. U davom etar ekan, undan zavqlaning.
Xulosa o'rniga: harakat rejasi
Agar daromad bo'yicha qo'ng'iroqlarni tahlil qilish uchun LLM-dan foydalanishni boshlashni istasangiz, mana minimal ishlaydigan reja:
- Bepul ma'lumotlardan boshlang — 8-K/10-Q ro'yxatga olishlar uchun SEC EDGAR + EdgarTools
- Tuzilgan ekstraksiyadan foydalaning — OpenAI Structured Outputs orqali Pydantic sxemalari
- Event study orqali bektest qiling — tarixiy ma'lumotlardagi CAR, kamida 200 voqea
- Few-shot misollarini qo'shing — 5-10 belgilangan misol sifatni tubdan yaxshilaydi
- Deterministik tarzda tekshiring — LLM ajratib oladi, regex tekshiradi, inson audit qiladi
- O'rta kapitaldan boshlang — ko'proq alfa, yirik fondlar bilan kamroq raqobat
- Kriptoga kengaytiring — o'rganilmagan hudud sifatida boshqaruv qo'ng'iroqlari va DAO takliflari
Miqdoriy tahlilning asosiy qoidasini eslab qoling: agar signal haqiqat bo'lish uchun juda yaxshi eshitilsa — qayta tekshiring. LLM-lar tushunish illyuziyasini yaratadi, lekin uning ortida statistik naqshlarni moslashtirish yotadi. Kuchli vosita — lekin vosita, orakul emas.
Bibliografiya
-
Ball, R., Brown, P. (1968). An Empirical Evaluation of Accounting Income Numbers. Journal of Accounting Research, 6(2), 159-178. — PEAD-ning birinchi kashf etilishi.
-
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 maqolasi.
-
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. — Moliyaviy sentiment lug'ati.
-
Araci, D. (2019). FinBERT: Financial Sentiment Analysis with Pre-trained Language Models. arXiv:1908.10063. — Moliyaviy NLP uchun BERT, SOTA-dan +14 foiz punkt.
-
Wu, S. et al. (2023). BloombergGPT: A Large Language Model for Finance. arXiv:2303.17564. — Bloomberg-ning 50B parametrli modeli.
-
Yang, H. et al. (2023). FinGPT: Open-Source Financial Large Language Models. arXiv:2306.06031. — BloombergGPT-ga ochiq manbali muqobil, 89% aniqlik.
-
Lopez-Lira, A., Tang, Y. (2023). Can ChatGPT Forecast Stock Price Movements? Return Predictability and Large Language Models. arXiv:2304.07619. — GPT-4 ~90% aniqlik bilan daromadlarni bashorat qiladi.
-
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. — Matnga asoslangan PEAD raqamli PEAD-dan ikki barobar katta.
-
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-da 10-30% ortiqcha alfaga ega GPT-4 freymvorki.
-
Chen, Y. et al. (2025). GPT-Signal: Generative AI for Semi-automated Feature Engineering in the Alpha Research Process. arXiv:2410.18448. — LLM orqali treyding signallarini avtomatik yaratish.
-
Zhang, X. et al. (2025). Can LLMs Hit Moving Targets? Tracking Evolving Signals in Corporate Disclosures. arXiv:2510.03195. — Korporativ oshkoralashtirishlarda "harakatlanuvchi nishonlar"ni aniqlash.
-
Chen, Z. et al. (2025). Large Language Models in Equity Markets: Applications, Techniques, and Insights. Frontiers in Artificial Intelligence. — Moliyadagi 84 ta LLM tadqiqotiga sharh.
Ushbu maqola ta'limiy xarakterga ega va investitsiya bo'yicha maslahat hisoblanmaydi. Bu yerda tasvirlangan har qanday treyding strategiyasi haqiqiy kapital bilan joriy etishdan oldin puxta bektestlash va xavflarni boshqarishni talab qiladi.
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.