บทนำ: ทำไมต้องวิเคราะห์ Sentiment จากข่าวการเงิน
การวิเคราะห์ความรู้สึก (Sentiment Analysis) จากข่าวการเงินเป็นหัวใจสำคัญของกลยุทธ์การลงทุนสมัยใหม่ ผมเคยทำงานวิจัยเกี่ยวกับการใช้ Large Language Models สำหรับวิเคราะห์ข่าวหุ้นมากว่า 2 ปี พบว่าการใช้ GPT-4o ในการวัดอารมณ์ของข่าวสามารถสร้าง alpha ได้จริงในตลาดทุน โดยเฉพาะในช่วงที่ตลาดผันผวน
บทความนี้จะสอนวิธีใช้ GPT-4o ผ่าน
HolySheep AI เพื่อสร้างระบบ Sentiment Scoring ที่พร้อมใช้งานจริง พร้อมเปรียบเทียบต้นทุน API ของแพลตฟอร์มต่างๆ ในปี 2026
ตารางเปรียบเทียบต้นทุน API ปี 2026
| โมเดล | ราคาต่อล้าน Tokens | ต้นทุน 10M Tokens/เดือน |
|-------|---------------------|-------------------------|
| GPT-4.1 | $8.00 | $80.00 |
| Claude Sonnet 4.5 | $15.00 | $150.00 |
| Gemini 2.5 Flash | $2.50 | $25.00 |
| DeepSeek V3.2 | $0.42 | $4.20 |
จากตารางจะเห็นว่า DeepSeek V3.2 มีต้นทุนต่ำที่สุดถึง 19 เท่าเมื่อเทียบกับ Claude Sonnet 4.5 แต่สำหรับงาน Sentiment Analysis ที่ต้องการความแม่นยำสูง การเลือกโมเดลต้องพิจารณาทั้งต้นทุนและคุณภาพผลลัพธ์
หลักการ Sentiment Scoring ด้วย LLM
การวัดอารมณ์ข่าวการเงินมี 3 ระดับความลึก:
- Document-level: วิเคราะห์ทั้งบทความ ให้คะแนนเดียว -5 ถึง +5
- Aspect-level: แยกวิเคราะห์แต่ละประเด็น เช่น รายได้ หนี้สิน การแข่งขัน
- Entity-level: ระบุว่าข่าวกล่าวถึงบริษัทใดบ้าง และแต่ละบริษัทมี sentiment อย่างไร
โค้ดตัวอย่าง: Sentiment Analyzer เต็มรูปแบบ
import requests
import json
from datetime import datetime
class FinancialSentimentAnalyzer:
"""
ระบบวิเคราะห์ความรู้สึกข่าวการเงินด้วย GPT-4o
ผ่าน HolySheep AI API
"""
def __init__(self, api_key: str, base_url: str = "https://api.holysheep.ai/v1"):
self.api_key = api_key
self.base_url = base_url
self.headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
def analyze_sentiment(self, news_text: str, news_date: str = None) -> dict:
"""
วิเคราะห์ความรู้สึกของข่าวการเงิน
Args:
news_text: ข้อความข่าว
news_date: วันที่ข่าว (YYYY-MM-DD)
Returns:
dict: ผลลัพธ์การวิเคราะห์
"""
if news_date is None:
news_date = datetime.now().strftime("%Y-%m-%d")
system_prompt = """คุณเป็นผู้เชี่ยวชาญวิเคราะห์ข่าวการเงิน
วิเคราะห์ความรู้สึก (sentiment) ของข่าวด้านล่าง โดยให้ผลลัพธ์เป็น JSON:
{
"overall_sentiment": float (-1.0 ถึง +1.0),
"confidence": float (0.0 ถึง 1.0),
"key_aspects": [
{
"aspect": "ชื่อประเด็น",
"sentiment": float,
"explanation": "เหตุผล"
}
],
"entities": [
{
"name": "ชื่อบริษัท/องค์กร",
"sentiment": float,
"role": "ผู้กล่าวถึง"
}
],
"market_impact": "positive|neutral|negative",
"summary": "สรุป 2-3 ประโยค"
}"""
payload = {
"model": "gpt-4.1",
"messages": [
{"role": "system", "content": system_prompt},
{"role": "user", "content": f"ข่าววันที่ {news_date}:\n{news_text}"}
],
"temperature": 0.3,
"response_format": {"type": "json_object"}
}
response = requests.post(
f"{self.base_url}/chat/completions",
headers=self.headers,
json=payload,
timeout=30
)
if response.status_code == 200:
result = response.json()
return json.loads(result["choices"][0]["message"]["content"])
else:
raise Exception(f"API Error: {response.status_code} - {response.text}")
def batch_analyze(self, news_list: list) -> list:
"""
วิเคราะห์หลายข่าวพร้อมกัน
Args:
news_list: list of dict [{"text": str, "date": str}, ...]
Returns:
list: ผลลัพธ์การวิเคราะห์ทั้งหมด
"""
results = []
for news in news_list:
try:
result = self.analyze_sentiment(
news["text"],
news.get("date")
)
result["source_text"] = news["text"][:100] + "..."
results.append(result)
except Exception as e:
results.append({
"error": str(e),
"source_text": news["text"][:100] + "..."
})
return results
ตัวอย่างการใช้งาน
if __name__ == "__main__":
analyzer = FinancialSentimentAnalyzer(
api_key="YOUR_HOLYSHEEP_API_KEY"
)
# ทดสอบกับข่าวตัวอย่าง
test_news = """Apple ประกาศผลประกอบการไตรมาส 3 รายได้เพิ่มขึ้น 12%
สูงกว่าคาดการณ์ โดยมีกำไรต่อหุ้น (EPS) ที่ $1.53 เทียบกับคาดการณ์ $1.39
ฝ่ายบริหารคาดว่าไตรมาส 4 จะเติบโตต่อเนื่องจากยอดขาย iPhone 16 ที่แข็งแกร่ง"""
result = analyzer.analyze_sentiment(test_news, "2026-06-15")
print(f"Overall Sentiment: {result['overall_sentiment']}")
print(f"Confidence: {result['confidence']}")
print(f"Market Impact: {result['market_impact']}")
การสร้าง Sentiment Factor สำหรับ Quantitative Trading
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
import requests
import time
class SentimentFactorBuilder:
"""
สร้าง Sentiment Factors สำหรับ Quantitative Trading Model
"""
def __init__(self, api_key: str):
self.api_key = api_key
self.base_url = "https://api.holysheep.ai/v1"
self.analyzer_endpoint = f"{self.base_url}/chat/completions"
self.headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
def _call_api(self, messages: list, model: str = "gpt-4.1") -> dict:
"""เรียก HolySheep API"""
payload = {
"model": model,
"messages": messages,
"temperature": 0.2,
"response_format": {"type": "json_object"}
}
response = requests.post(
self.analyzer_endpoint,
headers=self.headers,
json=payload
)
return response.json()
def compute_daily_sentiment(self, ticker: str, news_items: list) -> dict:
"""
คำนวณค่า sentiment รายวันจากข่าวหลายชิ้น
Returns:
dict: {
"date": str,
"ticker": str,
"mean_sentiment": float,
"std_sentiment": float,
"positive_ratio": float,
"negative_ratio": float,
"news_count": int,
"avg_confidence": float
}
"""
sentiments = []
confidences = []
for news in news_items:
system_prompt = """วิเคราะห์ความรู้สึกข่าวเกี่ยวกับ {ticker}
ส่งคืน JSON: {{"sentiment": float (-1 ถึง 1), "confidence": float (0 ถึง 1)}}"""
messages = [
{"role": "system", "content": system_prompt.format(ticker=ticker)},
{"role": "user", "content": news["text"]}
]
try:
result = self._call_api(messages)
content = json.loads(result["choices"][0]["message"]["content"])
sentiments.append(content["sentiment"])
confidences.append(content["confidence"])
time.sleep(0.1) # Rate limiting
except Exception as e:
print(f"Error processing news: {e}")
continue
if not sentiments:
return None
sentiments = np.array(sentiments)
confidences = np.array(confidences)
return {
"date": news_items[0].get("date", datetime.now().date().isoformat()),
"ticker": ticker,
"mean_sentiment": float(np.mean(sentiments)),
"std_sentiment": float(np.std(sentiments)),
"positive_ratio": float(np.mean(sentiments > 0)),
"negative_ratio": float(np.mean(sentiments < 0)),
"news_count": len(sentiments),
"avg_confidence": float(np.mean(confidences)),
"weighted_sentiment": float(np.average(sentiments, weights=confidences))
}
def build_factor_matrix(self, data: pd.DataFrame) -> pd.DataFrame:
"""
สร้าง Feature Matrix จาก Sentiment Data
Args:
data: DataFrame with columns [date, ticker, news_text]
Returns:
DataFrame with sentiment factors per ticker per day
"""
# Group by date and ticker
grouped = data.groupby(['date', 'ticker'])
factor_records = []
for (date, ticker), group in grouped:
news_list = group.to_dict('records')
factors = self.compute_daily_sentiment(ticker, news_list)
if factors:
factor_records.append(factors)
return pd.DataFrame(factor_records)
def calculate_sentiment_momentum(
self,
sentiment_series: pd.Series,
windows: list = [5, 10, 20]
) -> pd.DataFrame:
"""
คำนวณ Sentiment Momentum Factors
Factors ที่สร้าง:
- sentiment_ma_5: Moving Average 5 วัน
- sentiment_ma_10: Moving Average 10 วัน
- sentiment_ma_20: Moving Average 20 วัน
- sentiment_momentum_5d: การเปลี่ยนแปลง 5 วัน
- sentiment_momentum_10d: การเปลี่ยนแปลง 10 วัน
- sentiment_acceleration: ความเร่งของ sentiment
"""
result = pd.DataFrame(index=sentiment_series.index)
for window in windows:
result[f'sentiment_ma_{window}d'] = sentiment_series.rolling(window).mean()
result['sentiment_momentum_5d'] = sentiment_series.diff(5)
result['sentiment_momentum_10d'] = sentiment_series.diff(10)
# Acceleration = momentum ที่ 2
result['sentiment_acceleration'] = result['sentiment_momentum_5d'].diff()
# Normalize
for col in result.columns:
result[f'{col}_zscore'] = (result[col] - result[col].mean()) / result[col].std()
return result
ตัวอย่างการใช้งาน
if __name__ == "__main__":
builder = SentimentFactorBuilder(api_key="YOUR_HOLYSHEEP_API_KEY")
# ข้อมูลข่าวตัวอย่าง
sample_data = pd.DataFrame([
{"date": "2026-06-15", "ticker": "AAPL", "news_text": "Apple เติบโตดีกว่าคาด"},
{"date": "2026-06-15", "ticker": "AAPL", "news_text": "iPhone ขายดีมาก"},
{"date": "2026-06-15", "ticker": "AAPL", "news_text": "ราคาหุ้นขึ้น 3%"},
{"date": "2026-06-14", "ticker": "AAPL", "news_text": "นักวิเคราะห์เพิ่มเป้าหมายราคา"},
])
# สร้าง Factors
factors = builder.build_factor_matrix(sample_data)
print(factors)
Advanced: Multi-Model Ensemble สำหรับ Robust Sentiment
import concurrent.futures
แหล่งข้อมูลที่เกี่ยวข้อง
บทความที่เกี่ยวข้อง