← Quay lại danh sách bài viết
March 20, 2026
5 phút đọc

LLM Alpha Mining: Cách Khai Thác Tín Hiệu Giao Dịch từ Các Cuộc Gọi Thu Nhập và Tài Liệu Tài Chính

LLM Alpha Mining: Cách Khai Thác Tín Hiệu Giao Dịch từ Các Cuộc Gọi Thu Nhập và Tài Liệu Tài Chính
#llm
#alpha
#thu nhập
#nlp
#gpt
#phân tích tài chính
#giao dịch thuật toán

Có một câu đùa trên Phố Wall: "Thông tin quý giá nhất trong một cuộc gọi thu nhập không phải là những gì CEO nói, mà là cách ông ta nói." Khi Tim Cook nói "chúng tôi thận trọng lạc quan" thay vì câu năm ngoái "chúng tôi rất hài lòng" — đó không phải là trò chơi ngôn ngữ, đó là tín hiệu trị giá hàng trăm triệu đô la.

Trong nhiều thập kỷ, các quỹ định lượng đã cố hệ thống hóa việc trích xuất các tín hiệu này. Đầu tiên, họ đếm tần suất của các từ "tích cực" và "tiêu cực" bằng từ điển. Sau đó họ dùng BERT. Và bây giờ chúng ta có GPT-4o, Claude và các LLM mã nguồn mở có khả năng phân tích sắc thái của những lời nói vòng vo của doanh nghiệp với độ chính xác khiến ngay cả các nhà nghiên cứu cũng phải e ngại.

Hãy cùng phân tích cách xây dựng một pipeline hoàn chỉnh để khai thác tín hiệu giao dịch từ các cuộc gọi thu nhập — từ việc thu thập bản ghi âm đến kiểm thử ngược lợi nhuận bất thường tích lũy.

Tại Sao Các Cuộc Gọi Thu Nhập Là Mỏ Vàng Alpha

Post-Earnings Announcement Drift: Bất Thường Không Chịu Biến Mất

Năm 1968, Ball và Brown phát hiện ra điều kỳ lạ: sau khi kết quả quý được công bố, cổ phiếu tiếp tục trôi dạt theo hướng "bất ngờ" thêm 60-90 ngày nữa. Họ gọi đó là Post-Earnings Announcement Drift (PEAD). Hơn nửa thế kỷ đã trôi qua, hàng trăm bài báo đã được viết, bất thường đã được giải thích từ hàng chục góc độ — và nó vẫn hoạt động.

PEAD là một trong những bất thường thị trường dai dẳng nhất trong lịch sử tài chính. Chiến lược danh mục "mua bất ngờ tích cực, bán bất ngờ tiêu cực" về mặt lịch sử đã mang lại lợi nhuận vượt trội hàng năm 10-25%. Tại sao thị trường không kinh doanh chênh lệch điều này? Có vài lý do:

  • Sự chú ý của nhà đầu tư bị giới hạn — khi 200 công ty báo cáo trong cùng một tuần, về mặt vật lý không thể đọc hết tất cả các bản ghi
  • Độ phức tạp nhận thức — một cuộc gọi thu nhập kéo dài 45-60 phút, và tín hiệu then chốt có thể nằm ẩn trong một câu duy nhất ở phút thứ 38 của phần hỏi đáp
  • Sự mơ hồ của ngôn ngữ — CFO nói "chúng tôi đang điều hướng những khó khăn," và nếu không có bối cảnh thì không rõ đây là cảnh báo nhẹ hay phòng ngừa tiêu chuẩn

Đây là lúc LLMs bước vào sân khấu. Lần đầu tiên, chúng ta có một công cụ có thể xử lý 500 bản ghi trong một buổi tối trong khi phát hiện các sắc thái mà ngay cả những nhà phân tích giàu kinh nghiệm cũng có thể bỏ sót.

PEAD.txt: Văn Bản Quan Trọng Hơn Con Số

Các nhà nghiên cứu từ Ngân hàng Dự trữ Liên bang Philadelphia (Meursault, Liang, Routledge, Scanlon) đã công bố bài báo PEAD.txt, bài báo này đã lật ngược các giả định về giá trị của thông tin dạng văn bản. Họ đã xây dựng một chỉ số tương tự văn bản của bất ngờ thu nhập tiêu chuẩn — SUE.txt — không sử dụng giá trị thu nhập số học nào cả.

Kết quả? SUE.txt tạo ra độ trôi gấp đôi so với PEAD cổ điển. Hơn nữa: trong những năm gần đây, trong khi PEAD cổ điển dựa trên bất ngờ số học gần như đã biến mất (thị trường đã học được), độ trôi dạng văn bản vẫn còn có ý nghĩa đáng kể. Thị trường đã học cách xử lý số nhanh chóng nhưng vẫn còn khó khăn với việc giải thích văn bản.

Đây là lập luận cơ bản ủng hộ phương pháp tiếp cận dựa trên NLP đối với các cuộc gọi thu nhập.

Từ Cảm Xúc Đến Ngữ Nghĩa: Sự Tiến Hóa Của Các Phương Pháp

Từ cảm xúc đến ngữ nghĩa

Thế Hệ Đầu Tiên: Bag-of-Words và Từ Điển (2000-2015)

Tất cả bắt đầu với từ điển Loughran-McDonald (2011) — một danh sách từ được gắn nhãn "tích cực," "tiêu cực," "không chắc chắn," và "tranh chấp." Ý tưởng thật thanh lịch trong sự đơn giản của nó: đếm tỷ lệ phần trăm các từ tiêu cực trong hồ sơ 10-K và giao dịch dựa trên đó.

Vấn đề? Từ "outstanding" trong bối cảnh tài chính thường có nghĩa là "nợ chưa thanh toán" hơn là "kết quả xuất sắc." Từ "risk" trong Risk Management không phải là tín hiệu tiêu cực — đó là mô tả quy trình. Từ điển cảm xúc NLP tiêu chuẩn hoạt động cực kỳ kém trong các văn bản tài chính.

Loughran và McDonald đã tạo ra một từ điển chuyên biệt, điều này đã cải thiện tình hình, nhưng vấn đề cơ bản vẫn còn: bag-of-words không hiểu ngữ cảnh. "We did not fail to meet expectations" — có hai từ "tiêu cực" ở đây, nhưng ý nghĩa lại tích cực.

Thế Hệ Thứ Hai: FinBERT và Transformers (2019-2023)

Năm 2019, Dogu Araci công bố FinBERT — BERT được tinh chỉnh trên các văn bản tài chính từ Reuters TRC2. Kết quả thật ấn tượng: cải thiện 14 điểm phần trăm trên tập dữ liệu Financial PhraseBank so với state-of-the-art. FinBERT hiểu ngữ cảnh: "outstanding" kề cận "debt" — tiêu cực, kề cận "performance" — tích cực.

Nhưng FinBERT có một hạn chế: cửa sổ ngữ cảnh 512 token. Một cuộc gọi thu nhập chạy 8.000-12.000 từ. Chia thành các đoạn và lấy trung bình cảm xúc có nghĩa là mất đi ngữ nghĩa giữa các đoạn. CEO có thể bắt đầu với sự lạc quan, sau đó nhẹ nhàng đề cập đến các vấn đề chuỗi cung ứng trong phần hỏi đáp. FinBERT phân tích từng đoạn độc lập và bỏ lỡ sự tương phản này.

Thế Hệ Thứ Ba: LLMs với Ngữ Cảnh Dài (2023-Hiện Tại)

GPT-4, Claude, Gemini với cửa sổ ngữ cảnh 128K-1M token đã thay đổi quy tắc của trò chơi. Bây giờ bạn có thể tải toàn bộ bản ghi cùng một lúc và đặt câu hỏi đòi hỏi hiểu toàn bộ tài liệu.

Nghiên cứu chủ chốt — Lopez-Lira & Tang (2023) "Can ChatGPT Forecast Stock Price Movements?" Trên 50.000+ tiêu đề, GPT-4 cho thấy tỷ lệ chính xác ~90% trong việc dự đoán hướng phản ứng thị trường ban đầu và dự đoán đáng kể độ trôi tiếp theo, đặc biệt đối với các công ty vốn hóa nhỏ và tin tức tiêu cực. Các mô hình trước đó (GPT-1, GPT-2, BERT) không thể hiện khả năng này — sức mạnh dự đoán xuất hiện như một đặc tính bổ sung của các mô hình lớn.

BloombergGPT (2023) — mô hình 50 tỷ tham số được huấn luyện trên corpus tài chính của Bloomberg — đã thể hiện những cải tiến trong NER tài chính, phân loại tin tức và phân tích cảm xúc. FinGPT — giải pháp thay thế mã nguồn mở của nó — đạt độ chính xác 89% trong các tác vụ cảm xúc tài chính bằng cách sử dụng phương pháp lấy dữ liệu làm trung tâm và RAG.

MarketSenseAI, sử dụng GPT-4 với Chain-of-Thought và In-Context Learning để phân tích S&P 100, đã cho thấy alpha vượt trội 10-30% và lợi nhuận tích lũy lên đến 72% trong 15 tháng kiểm thử. Vâng, những con số này cần được tiếp nhận một cách thận trọng (backtest ≠ giao dịch trực tiếp), nhưng xu hướng rất rõ ràng.

Pipeline Dữ Liệu: Lấy Dữ Liệu Từ Đâu

SEC EDGAR: Nguồn Chính Thức

Đối với cổ phiếu Mỹ, nguồn chính là SEC EDGAR. Các cuộc gọi thu nhập thường không được nộp trực tiếp, nhưng các tài liệu liên quan có sẵn:

  • Hồ sơ 8-K (Mục 2.02 — Kết Quả Hoạt Động) — thông cáo báo chí với kết quả, thường bao gồm phụ lục 99 với bản ghi
  • 10-Q / 10-K — báo cáo quý và hàng năm với Thảo luận và Phân tích Quản lý (MD&A) — cũng là nguồn văn bản có giá trị
  • DEF 14A — các bản ủy quyền với thông tin thù lao quản lý
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()  # Toàn bộ văn bản với phụ lục
        print(f"{filing.filing_date}: {len(text)} chars")

Seeking Alpha và API Thương Mại

Bản ghi cuộc gọi thu nhập là một sản phẩm riêng biệt. Seeking Alpha về mặt lịch sử là nguồn miễn phí chính, nhưng hiện đã hạn chế quyền truy cập. Các tùy chọn thương mại:

  • Seeking Alpha Premium API — bản ghi đầy đủ với nhãn người nói
  • AlphaVantage Earnings API — bậc miễn phí với các giới hạn
  • Financial Modeling Prep — bản ghi + cơ bản
  • Earnings Call Edge / Motley Fool Transcripts — các nguồn thay thế

Crypto: Các Cuộc Gọi Quản Trị và Đề Xuất DAO

Đây là nơi mọi thứ trở nên thú vị. Các giao thức DeFi lớn tổ chức những cuộc gọi tương đương với cuộc gọi thu nhập:

  • Uniswap — các cuộc gọi quản trị, cuộc gọi cộng đồng, các bản ghi trên YouTube
  • Aave — các cuộc gọi cộng đồng hàng tháng + các đề xuất diễn đàn quản trị
  • MakerDAO — các cuộc gọi quản trị + thảo luận diễn đàn rộng rãi
  • Compound — các đề xuất quản trị với thảo luận chi tiết

Bản ghi cuộc gọi Crypto thường không có cấu trúc. Giải pháp — Whisper của OpenAI để chuyển ghi các bản ghi YouTube:

import openai
from yt_dlp import YoutubeDL

def transcribe_governance_call(youtube_url: str) -> str:
    """Tải audio từ YouTube và chuyển ghi qua Whisper."""
    ydl_opts = {
        'format': 'bestaudio/best',
        'postprocessors': [{
            'key': 'FFmpegExtractAudio',
            'preferredcodec': 'mp3',
            'preferredquality': '64',  # Bitrate thấp là đủ cho lời nói
        }],
        '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

Chi phí chuyển ghi qua Whisper API: 0.006/phuˊt.Mtcucgiquntrmtgicoˊgiaˊ 0.006/phút. Một cuộc gọi quản trị một giờ có giá ~0.36. Đối với tùy chọn tự lưu trữ — Whisper Large-v3 Turbo chuyển ghi tệp 60 phút trong ~17 giây (216x thời gian thực) trên GPU hiện đại.

Chiến Lược Prompting LLM: Từ Ngây Thơ Đến Cấp Sản Xuất

Pipeline trích xuất tín hiệu

Chiến Lược 1: Cảm Xúc Trực Tiếp (Yếu)

Cách tiếp cận ngây thơ nhất — hỏi thẳng mô hình:

"Cuộc gọi thu nhập này là tích cực hay tiêu cực đối với giá cổ phiếu?"

Có hoạt động không? Có, thật ngạc nhiên. Lopez-Lira & Tang đã chỉ ra rằng ngay cả một prompt nguyên thủy như vậy cũng tạo ra dự đoán có ý nghĩa thống kê. Nhưng có những vấn đề:

  • Đầu ra nhị phân — bạn mất đi các mức độ. "Thảm họa" và "thất vọng nhẹ" nhận được cùng một nhãn
  • Không có giải thích — không rõ mô hình dựa vào gì để đưa ra quyết định
  • Không ổn định — chạy lại có thể cho ra câu trả lời khác

Chiến Lược 2: Trích Xuất Có Cấu Trúc với Chain-of-Thought (Mạnh)

Ý tưởng: thay vì một con số duy nhất, trích xuất một tập hợp tín hiệu có cấu trúc, buộc mô hình giải thích từng bước.

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):
    """Độ lệch của hướng dẫn tương lai so với kỳ vọng đồng thuận."""
    revenue_guidance_vs_consensus: Optional[float] = Field(
        None, description="% độ lệch của hướng dẫn doanh thu so với đồng thuận"
    )
    margin_guidance_direction: Optional[str] = Field(
        None, description="expanding / stable / contracting"
    )
    key_quote: str = Field(
        description="Trích dẫn nguyên văn có hướng dẫn"
    )
    reasoning: str = Field(
        description="CoT: tại sao hướng dẫn này quan trọng"
    )


class ConfidenceMetrics(BaseModel):
    """Các chỉ số tin cậy của ban quản lý."""
    hedge_word_count: int = Field(
        description="Số từ phòng ngừa: 'approximately', 'potentially', 'subject to'"
    )
    forward_looking_ratio: float = Field(
        description="Tỷ lệ các tuyên bố hướng tới tương lai so với tổng số tuyên bố"
    )
    q_and_a_evasion_count: int = Field(
        description="Số câu hỏi mà CEO/CFO đưa ra câu trả lời mơ hồ"
    )
    ceo_vs_cfo_sentiment_delta: float = Field(
        description="Sự khác biệt cảm xúc giữa CEO và CFO (-1 đến 1). Phân kỳ là dấu hiệu nguy hiểm"
    )


class CompetitiveIntelligence(BaseModel):
    """Đề cập đến các đối thủ cạnh tranh và vị thế thị trường."""
    competitors_mentioned: list[str] = Field(
        description="Danh sách các đối thủ được đề cập"
    )
    market_share_claims: list[str] = Field(
        description="Các tuyên bố về thị phần"
    )
    new_product_signals: list[str] = Field(
        description="Tín hiệu về sản phẩm/dịch vụ mới"
    )


class ManagementSignals(BaseModel):
    """Tín hiệu quản lý."""
    turnover_risk: SentimentLevel = Field(
        description="Rủi ro thay đổi nhân sự quản lý chủ chốt"
    )
    tone_shift_from_previous: Optional[str] = Field(
        None, description="Giọng điệu thay đổi như thế nào so với quý trước"
    )
    insider_language_flags: list[str] = Field(
        description="Cụm từ đánh dấu: 'exploring strategic alternatives', 'right-sizing', v.v."
    )


class EarningsCallAnalysis(BaseModel):
    """Phân tích cuộc gọi thu nhập hoàn chỉnh."""
    ticker: str
    quarter: str
    overall_sentiment: SentimentLevel
    sentiment_score: float = Field(description="từ -1.0 đến 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:
    """
    Trích xuất tín hiệu có cấu trúc từ cuộc gọi thu nhập.
    Chi phí: ~$0.15-0.30 mỗi cuộc gọi (GPT-4o, ~10K token đầu vào).
    """
    client = OpenAI()

    system_prompt = """Bạn là một nhà phân tích nghiên cứu cổ phiếu cấp cao với 20 năm kinh nghiệm.
Phân tích bản ghi cuộc gọi thu nhập sau đây và trích xuất các tín hiệu giao dịch có cấu trúc.

HƯỚNG DẪN QUAN TRỌNG:
1. Sử dụng lập luận Chain-of-Thought cho mỗi trường — giải thích TẠI SAO trước khi đưa ra giá trị
2. Tập trung vào SỰ LỆCH so với kỳ vọng, không phải các tuyên bố tuyệt đối
3. Đặc biệt chú ý đến phần Q&A — ban quản lý ít có kịch bản hơn ở đó
4. So sánh ngôn ngữ của ban quản lý với cơ sở phòng ngừa doanh nghiệp điển hình
5. Gắn cờ bất kỳ "strategic alternatives", "right-sizing", hoặc các uyển ngữ khác
6. Đánh giá cảm xúc tương đối so với kỳ vọng thị trường, không phải theo nghĩa tuyệt đối

CÁC TỪ PHÒNG NGỪA CẦN ĐẾM: 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,  # Nhiệt độ thấp để tái tạo
    )

    return completion.choices[0].message.parsed

Lưu ý một số điểm chính:

Schema Pydantic — OpenAI Structured Outputs đảm bảo tuân thủ schema 100%. Không còn "xin lỗi, tôi không thể phân tích JSON." Mỗi trường có mô tả hoạt động như một mini-prompt cho một khía cạnh cụ thể của phân tích.

Chain-of-Thought trong schema — các trường reasoningkey_quote buộc mô hình "hiển thị công việc của nó." Điều này không chỉ cải thiện chất lượng (mô hình buộc phải tìm một trích dẫn cụ thể trước khi đưa ra phán đoán) mà còn tạo ra một lộ trình kiểm toán cho các cơ quan quản lý.

Nhiệt độ 0.1 — chúng ta không muốn sự sáng tạo. Chúng ta cần khả năng tái tạo. Ở nhiệt độ 0, mô hình đôi khi bị "kẹt" trong các khuôn mẫu; 0.1 là sự thỏa hiệp tối ưu.

Chiến Lược 3: Few-Shot với Các Ví Dụ Lịch Sử

Còn mạnh mẽ hơn — cung cấp cho mô hình các ví dụ về các cuộc gọi thu nhập trong quá khứ với phản ứng thị trường thực tế:

few_shot_examples = """
VÍ DỤ 1:
Đoạn trích bản ghi: "We are cautiously optimistic about the second half...
While we continue to navigate macro headwinds, our pipeline remains robust."
Phản ứng thị trường thực tế: -3.2% (ngày hôm sau)
Phân tích: Mặc dù bề ngoài tích cực, "cautiously optimistic" là sự
GIẢM CẤP so với "very confident" của quý trước. Năm từ phòng ngừa trong
hai câu. Thị trường nhìn thấu qua sự phòng ngừa.

VÍ DỤ 2:
Đoạn trích bản ghi: "Frankly, demand has exceeded our ability to supply.
We're expediting CapEx to address this."
Phản ứng thị trường thực tế: +7.8% (ngày hôm sau)
Phân tích: "Frankly" báo hiệu sự bất ngờ thực sự ngay cả từ ban quản lý.
CapEx tăng tốc theo nhu cầu = sự tự tin mạnh mẽ. Không có ngôn ngữ phòng ngừa.
"""

Các ví dụ few-shot giúp mô hình hiệu chỉnh: nó học rằng "cautiously optimistic" trong ngôn ngữ Phố Wall không phải là tích cực — đó là một tiêu cực nhẹ. Không có ví dụ, LLM có thể diễn giải các từ theo nghĩa đen.

Bốn Loại Tín Hiệu

1. Guidance Surprise

Tín hiệu trực tiếp nhất. Một công ty cung cấp dự báo (guidance) cho quý/năm tiếp theo, và thị trường phản ứng với sự lệch so với đồng thuận. LLM có thể trích xuất guidance ngay cả khi ban quản lý truyền đạt nó một cách mơ hồ:

  • "We expect revenues in the range of..." — guidance trực tiếp, dễ phân tích
  • "We feel comfortable with current Street estimates" — xác nhận ngầm của đồng thuận
  • "There are puts and takes relative to consensus" — tín hiệu rủi ro ngầm

LLM hiểu cả ba cách diễn đạt; regex chỉ hiểu cách đầu tiên.

2. Chỉ Số Tin Cậy: Mật Độ Từ Phòng Ngừa

Đây là tín hiệu yêu thích của tôi vì nó phản trực giác. Bản chất: các nhà quản lý là những người có đào tạo pháp lý và các bộ phận pháp lý hoang mang. Khi mọi thứ diễn ra tốt, họ cho phép bản thân mình cụ thể hơn. Khi vấn đề đang nảy sinh — họ bắt đầu phòng ngừa.

Các chỉ số cần theo dõi:

Chỉ số Mô tả Tín hiệu tiêu cực
Mật độ từ phòng ngừa Tỷ lệ từ phòng ngừa trên 1.000 từ > 15 trên 1.000 từ
Tỷ lệ chắc chắn Tỷ lệ "will/expect" vs "may/could" < 1.5
Tỷ lệ né tránh Q&A % câu hỏi không có câu trả lời trực tiếp > 30%
Delta CEO/CFO Sự phân kỳ giọng điệu giữa CEO và CFO > 0.3 trên thang [-1, 1]

Điểm cuối cùng đặc biệt thú vị. CEO là người kể chuyện — công việc của ông ta là vẽ ra một bức tranh đẹp. CFO là người chịu trách nhiệm trước kiểm toán viên. Khi CEO nói "transformative growth ahead" và CFO ngay lập tức chen vào "while maintaining disciplined cost management" — sự phân kỳ này báo hiệu căng thẳng nội bộ.

3. Tình Báo Cạnh Tranh

LLM có thể trích xuất các đề cập đến đối thủ từ bản ghi, ngay cả khi ban quản lý tránh tên trực tiếp. "The largest player in the market" — điều đó không phải là bí ẩn đối với GPT-4 nếu nó biết ngành.

Tín hiệu giao dịch: nếu công ty A đề cập đến đối thủ B trong ngữ cảnh tiêu cực trong cuộc gọi thu nhập của mình ("we're taking share from..."), đó là tín hiệu không chỉ cho A (mua) mà còn cho B (bán). Một giao dịch theo cặp.

4. Tín Hiệu Thay Đổi Quản Lý

Các cụm từ đánh dấu cho những thay đổi quản lý hoặc bước ngoặt chiến lược:

  • "Exploring strategic alternatives" — có thể là việc bán công ty
  • "Right-sizing our operations" — sa thải hàng loạt
  • "The board has initiated a comprehensive review" — CEO sẽ sớm rời đi
  • "We're bringing in fresh perspectives" — nhóm hiện tại đã thất bại

Mỗi cụm từ này có tương quan có ý nghĩa thống kê với động lực giá tiếp theo. LLM có thể phát hiện chúng với tỷ lệ dương tính giả bằng không — vì nó hiểu ngữ cảnh, không giống như regex có thể bắt được "strategic alternatives" trong mô tả dòng sản phẩm.

Kiểm Thử Ngược: Phương Pháp Nghiên Cứu Sự Kiện

Kết quả nghiên cứu sự kiện

Chúng ta đang tạo ra tín hiệu — tuyệt vời. Nhưng chúng có hoạt động không? Phương pháp xác minh tiêu chuẩn là Nghiên Cứu Sự Kiện với tính toán Lợi Nhuận Bất Thường Tích Lũy (CAR).

Phương Pháp Luận

  1. Xác định sự kiện — ngày cuộc gọi thu nhập
  2. Cửa sổ ước tính — [-250, -30] ngày giao dịch trước sự kiện để ước tính lợi nhuận "bình thường"
  3. Cửa sổ sự kiện — [-1, +60] ngày xung quanh sự kiện
  4. Tính lợi nhuận bình thường qua mô hình thị trường: Rit=αi+βiRmt+ϵitR_{it} = \alpha_i + \beta_i R_{mt} + \epsilon_{it}
  5. Lợi nhuận bất thường — sự khác biệt giữa lợi nhuận thực tế và "bình thường"
  6. CAR — tổng tích lũy của lợi nhuận bất thường trong cửa sổ sự kiện
import numpy as np
import pandas as pd
from scipy import stats
from dataclasses import dataclass


@dataclass
class EventStudyResult:
    car: np.ndarray          # Lợi nhuận bất thường tích lũy theo ngày
    t_stats: np.ndarray      # Thống kê t cho mỗi ngày
    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,       # Lợi nhuận cổ phiếu hàng ngày (các cột = tickers)
    market_returns: pd.Series,   # Lợi nhuận chỉ số thị trường hàng ngày
    events: pd.DataFrame,        # DataFrame với các cột: [ticker, date, signal_score]
    estimation_window: int = 220,
    gap: int = 30,
    event_window: tuple = (-1, 60),
) -> EventStudyResult:
    """
    Nghiên cứu sự kiện để đánh giá sức mạnh dự đoán của tín hiệu LLM.

    Sắp xếp sự kiện theo signal_score, hình thành danh mục long/short,
    tính CAR và kiểm tra ý nghĩa thống kê.
    """
    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:  # Tối thiểu 60 quan sát
            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]  # Dịch chuyển đến ngày sự kiện

    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: mua phần trăm tín hiệu cao nhất, bán phần trăm thấp nhất."""

    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"Danh mục LONG (phần năm cao nhất cảm xúc 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 events:   {long_result.n_events}")

    print(f"\nDanh mục SHORT (phần năm thấp nhất cảm xúc 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 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"\nChênh lệch LONG-SHORT:")
    print(f"  CAR[0,+3]:  {ls_3d:+.2%}")
    print(f"  CAR[0,+30]: {ls_30d:+.2%}")

Những Gì Chúng Ta Kỳ Vọng Thấy

Dựa trên các nghiên cứu hiện có, CAR thực tế cho tín hiệu LLM:

Cửa sổ Danh mục Long Danh mục Short Chênh lệch 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%

Chỉ số chính là ý nghĩa thống kê. Với p < 0.01 và N > 200 sự kiện, bạn có thể nói về một tín hiệu mạnh mẽ. Với p > 0.05 — đó có thể là nhiễu.

Triển Khai Sản Xuất: Từ Jupyter Đến Prod

Kiến Trúc Pipeline Thời Gian Thực

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)│
            └──────────────────────────────┘

Phân Tích Chi Phí: Một Cuộc Gọi Thu Nhập Tốn Bao Nhiêu

Hãy phân tích kinh tế của việc xử lý một cuộc gọi thu nhập đơn lẻ trong môi trường sản xuất:

Thành phần Chi phí Độ trễ
Chuyển ghi Whisper API (60 phút) $0.36 ~17 giây (Turbo)
Trích xuất có cấu trúc GPT-4o $0.15-0.30 ~8-15 giây
Phân tích đoạn thời gian thực GPT-4o (x12) $1.80-3.60 ~5 giây mỗi cái
Embedding để lưu trữ RAG $0.01 <1 giây
Tổng cộng (pipeline đầy đủ) $2.30-4.30 ~30 giây đầy đủ

Khoan đã, ước tính là $30-50 mỗi cuộc gọi. Những con số đó đến từ đâu? Nó phụ thuộc vào mô hình và phương pháp:

  • Tùy chọn ngân sách (GPT-4o-mini, một lần chạy): $0.50-1.00
  • Tùy chọn tiêu chuẩn (GPT-4o, trích xuất có cấu trúc + phân tích đoạn): $2-5
  • Tùy chọn cao cấp (GPT-4o, nhiều lần chạy, xác thực chéo, so sánh lịch sử): $15-30
  • Cấp quỹ phòng hộ (nhiều mô hình + đánh giá con người + phát trực tiếp thời gian thực): $30-50+

Đối với một quỹ định lượng giao dịch 500 ticker, chi phí xử lý một mùa thu nhập (~2.000 cuộc gọi trong 6 tuần) là 4.0004.000-10.000 với tùy chọn tiêu chuẩn. Với alpha trung bình mỗi vị thế là 1-3% — ROI là thiên văn.

Độ Trễ: Cuộc Đua Tính Bằng Mili Giây

Trong thế giới HFT, độ trễ là tất cả. Nhưng đối với các chiến lược dựa trên thu nhập, tình huống khác nhau:

  1. Một cuộc gọi thu nhập kéo dài 45-60 phút — bạn có thời gian
  2. PEAD kéo dài hơn 60 ngày — không cần vào trong giây đầu tiên
  3. Sự dịch chuyển chính xảy ra trong 30 phút đầu tiên sau khi cuộc gọi kết thúc

Chiến lược tối ưu là hai giai đoạn:

  • Giai đoạn 1 (thời gian thực): phân tích các đoạn 5 phút trong cuộc gọi, hình thành tín hiệu sơ bộ
  • Giai đoạn 2 (sau cuộc gọi): phân tích đầy đủ toàn bộ bản ghi 2-5 phút sau khi kết thúc

Giai đoạn 1 cung cấp lợi thế 5-10 phút so với những người tham gia thị trường chờ cuộc gọi kết thúc. Đối với cổ phiếu vốn hóa trung bình, điều này là đủ.

Mở Rộng Sang Crypto: Quản Trị DeFi và Đề Xuất DAO

Thị trường crypto là một sân kiểm thử lý tưởng cho LLM alpha mining. Đây là lý do tại sao:

  1. Ít người chơi tổ chức hơn — có nghĩa là nhiều sự kém hiệu quả hơn để khai thác
  2. Quản trị = cuộc gọi thu nhập — các quyết định DAO trực tiếp ảnh hưởng đến tokenomics
  3. Thị trường 24/7 — bạn có thể giao dịch phản ứng ngay lập tức
  4. Dữ liệu công khai — tất cả các đề xuất và phiếu bầu đều trên chuỗi

Các Loại Sự Kiện Crypto Để Phân Tích

Đề Xuất Quản Trị (Aave, Compound, Uniswap)

Một đề xuất thay đổi các thông số giao thức — lãi suất, hệ số tài sản đảm bảo, chuyển đổi phí. LLM có thể đánh giá tác động kinh tế:

crypto_analysis_prompt = """Phân tích đề xuất quản trị DeFi này.
Trích xuất:
1. Tác động kinh tế đối với người nắm giữ token (tích cực/tiêu cực/trung lập)
2. Ước tính tác động TVL (tăng/giảm/ổn định + độ lớn)
3. Định vị cạnh tranh so với các giao thức khác
4. Các yếu tố rủi ro được giới thiệu bởi đề xuất
5. Tiền lệ lịch sử (các đề xuất tương tự trong các giao thức khác)
6. Kết quả bỏ phiếu có thể xảy ra dựa trên cảm xúc thảo luận diễn đàn

Đề xuất: {proposal_text}
Thảo luận diễn đàn: {discussion_text}
"""

Thông Báo Cập Nhật Giao Thức

Khi Uniswap thông báo v4 với hooks, hoặc Aave ra mắt GHO — đó là tương đương với việc ra mắt sản phẩm trong TradFi. LLM có thể đánh giá động lực câu chuyện và ý nghĩa kỹ thuật.

Báo Cáo Kho Bạc

Các DAO lớn có kho bạc trị giá hàng trăm triệu. Báo cáo kho bạc hàng quý là một mô phỏng trực tiếp của thu nhập. Đường băng, tỷ lệ đốt, đa dạng hóa — tất cả đều phù hợp với phân tích LLM.

Đặc Điểm Của Tín Hiệu Crypto

Không giống như TradFi, trong crypto:

  • Dữ liệu on-chain xác nhận hoặc mâu thuẫn với câu chuyện — bạn có thể đối chiếu những gì được nói trong các cuộc gọi quản trị với các chỉ số giao thức thực tế (TVL, khối lượng, người dùng hoạt động)
  • Ví cá voi như giao dịch nội gián — các chuyển động ví lớn sau các cuộc thảo luận quản trị thường đi trước phiếu bầu
  • Khuếch đại cảm xúc qua CT (Crypto Twitter) — tín hiệu từ cuộc gọi quản trị có thể được khuếch đại hoặc triệt tiêu bởi các câu chuyện trên Twitter

Bẫy và Hạn Chế

Ảo Giác: Khi Mô Hình Bịa Đặt Số

LLM có thể "trích xuất" guidance không có trong bản ghi. Điều này đặc biệt nguy hiểm khi phân tích mật độ từ phòng ngừa: mô hình có thể đếm nhiều hoặc ít từ hơn thực tế tồn tại.

Giải pháp: xác minh hai giai đoạn. LLM trích xuất, mã xác định xác minh. Đối với từ phòng ngừa — đếm regex song song với đánh giá LLM. Độ lệch > 20% — gắn cờ để xem xét thủ công.

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:
    """Xác minh xác định số từ phòng ngừa của 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,
    }

Hạn Chế Cửa Sổ Ngữ Cảnh

Ngay cả 128K token có thể không đủ nếu bạn muốn nạp vào:

  • Bản ghi hiện tại (~10K token)
  • Bản ghi trước để so sánh (~10K)
  • Dự báo đồng thuận nhà phân tích (~2K)
  • Các ví dụ few-shot (~3K)
  • System prompt (~1K)

Tổng cộng ~26K — chúng ta vừa vặn. Nhưng nếu bạn thêm hồ sơ 10-K (~80-120K token) để có ngữ cảnh — bạn đã ở ngưỡng giới hạn. Giải pháp: RAG để truy xuất các đoạn liên quan từ tài liệu dài.

Thiên Kiến và Lỗi Hệ Thống

LLMs được huấn luyện trên dữ liệu lịch sử nơi một số cụm từ nhất định được liên kết với một số kết quả nhất định. Nhưng thị trường thích nghi:

  • Nếu mọi người bắt đầu đếm từ phòng ngừa bằng GPT-4, các nhà quản lý sẽ thay đổi ngôn ngữ của họ
  • Mô hình có thể đánh giá quá mức tầm quan trọng của các mô hình từ dữ liệu huấn luyện (thiên kiến sống sót)
  • Ngôn ngữ doanh nghiệp phát triển: "synergies" năm 2010 có nghĩa là một thứ, năm 2026 — một thứ khác

Rủi Ro Giao Dịch Đông Đúc

Nếu 50 quỹ định lượng sử dụng cùng một GPT-4 để phân tích cùng một bản ghi — tín hiệu giảm dần. Một ví dụ tương tự: khi mọi người bắt đầu giao dịch PEAD trên các bất ngờ số học, bất thường đó đã thu hẹp lại. Điều tương tự sẽ xảy ra với các tín hiệu văn bản, nhưng với độ trễ:

  1. Hiện tại (2026) — ít người hệ thống sử dụng LLMs cho các cuộc gọi thu nhập. Alpha là đáng kể
  2. Trong 2-3 năm — áp dụng rộng rãi, alpha giảm
  3. Trong 5 năm — các tín hiệu LLM cơ bản trở thành hàng hóa, lợi thế chỉ còn ở các mô hình tùy chỉnh và dữ liệu độc đáo

Đây là vòng đời tiêu chuẩn của tín hiệu alpha. Hãy tận hưởng nó trong khi nó còn kéo dài.

Thay Vì Kết Luận: Một Kế Hoạch Hành Động

Nếu bạn muốn bắt đầu sử dụng LLMs để phân tích cuộc gọi thu nhập, đây là kế hoạch khả thi tối thiểu:

  1. Bắt đầu với dữ liệu miễn phí — SEC EDGAR + EdgarTools cho hồ sơ 8-K/10-Q
  2. Sử dụng trích xuất có cấu trúc — Schema Pydantic qua OpenAI Structured Outputs
  3. Kiểm thử ngược qua nghiên cứu sự kiện — CAR trên dữ liệu lịch sử, tối thiểu 200 sự kiện
  4. Thêm ví dụ few-shot — 5-10 ví dụ được gắn nhãn cải thiện đáng kể chất lượng
  5. Xác minh xác định — LLM trích xuất, regex xác minh, con người kiểm toán
  6. Bắt đầu với vốn hóa trung bình — nhiều alpha hơn, ít cạnh tranh hơn với các quỹ lớn
  7. Mở rộng sang crypto — các cuộc gọi quản trị và đề xuất DAO như lãnh thổ chưa được khám phá

Hãy nhớ quy tắc cơ bản của phân tích định lượng: nếu một tín hiệu nghe có vẻ quá tốt để là sự thật — hãy kiểm tra lại. LLMs tạo ra ảo giác về sự hiểu biết, nhưng đằng sau đó là việc khớp mẫu thống kê. Một công cụ mạnh mẽ — nhưng là công cụ, không phải nhà tiên tri.


Thư Mục Tài Liệu Tham Khảo

  1. Ball, R., Brown, P. (1968). An Empirical Evaluation of Accounting Income Numbers. Journal of Accounting Research, 6(2), 159-178. — Khám phá đầu tiên về PEAD.

  2. Bernard, V.L., Thomas, J.K. (1989). Post-Earnings-Announcement Drift: Delayed Price Response or Risk Premium? Journal of Accounting Research, 27, 1-36. — Bài báo PEAD kinh điển.

  3. Loughran, T., McDonald, B. (2011). When Is a Liability Not a Liability? Textual Analysis, Dictionaries, and 10-Ks. Journal of Finance, 66(1), 35-65. — Từ điển cảm xúc tài chính.

  4. Araci, D. (2019). FinBERT: Financial Sentiment Analysis with Pre-trained Language Models. arXiv:1908.10063. — BERT cho NLP tài chính, +14pp so với SOTA.

  5. Wu, S. et al. (2023). BloombergGPT: A Large Language Model for Finance. arXiv:2303.17564. — Mô hình 50B tham số của Bloomberg.

  6. Yang, H. et al. (2023). FinGPT: Open-Source Financial Large Language Models. arXiv:2306.06031. — Giải pháp thay thế mã nguồn mở của BloombergGPT, độ chính xác 89%.

  7. Lopez-Lira, A., Tang, Y. (2023). Can ChatGPT Forecast Stock Price Movements? Return Predictability and Large Language Models. arXiv:2304.07619. — GPT-4 dự đoán lợi nhuận với tỷ lệ chính xác ~90%.

  8. Meursault, V., Liang, P.J., Routledge, B., Scanlon, M.M. (2023). PEAD.txt: Post-Earnings-Announcement Drift Using Text. Journal of Financial and Quantitative Analysis. — PEAD dựa trên văn bản lớn gấp đôi so với PEAD số học.

  9. Fatouros, G. et al. (2024). Can Large Language Models Beat Wall Street? Evaluating GPT-4's Impact on Financial Decision-Making with MarketSenseAI. Neural Computing and Applications. — Framework GPT-4 với alpha vượt trội 10-30% trên S&P 100.

  10. Chen, Y. et al. (2025). GPT-Signal: Generative AI for Semi-automated Feature Engineering in the Alpha Research Process. arXiv:2410.18448. — Tạo tự động các tín hiệu giao dịch qua LLM.

  11. Zhang, X. et al. (2025). Can LLMs Hit Moving Targets? Tracking Evolving Signals in Corporate Disclosures. arXiv:2510.03195. — Phát hiện "mục tiêu di động" trong các tiết lộ doanh nghiệp.

  12. Chen, Z. et al. (2025). Large Language Models in Equity Markets: Applications, Techniques, and Insights. Frontiers in Artificial Intelligence. — Khảo sát 84 nghiên cứu LLM trong tài chính.


Bài viết này có tính chất giáo dục và không cấu thành lời khuyên đầu tư. Bất kỳ chiến lược giao dịch nào được mô tả ở đây đều cần kiểm thử ngược kỹ lưỡng và quản lý rủi ro trước khi triển khai với vốn thực.

Tuyên bố miễn trừ trách nhiệm: Thông tin được cung cấp trong bài viết này chỉ nhằm mục đích giáo dục và thông tin, không cấu thành lời khuyên về tài chính, đầu tư hoặc giao dịch. Giao dịch tiền mã hóa tiềm ẩn rủi ro thua lỗ đáng kể.

Tác Giả

Eugen Soloviov
Eugen Soloviov

Trading-systems engineer

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

Newsletter

Đi Trước Thị Trường

Đăng ký nhận bản tin của chúng tôi để có những thông tin chuyên sâu độc quyền về AI trading, phân tích thị trường và các cập nhật nền tảng.

Chúng tôi tôn trọng quyền riêng tư của bạn. Hủy đăng ký bất kỳ lúc nào.