Finans dünyasında rakamlar kadar duygular da önemli. Yatırımcıların kararları, çoğu zaman haberlerdeki kelimelere ve manşetlerin tonuna göre şekilleniyor. Bu yazıda, altın piyasasına dair haberleri yapay zeka yardımıyla analiz eden bir Python sistemi kuracağız. Amacımız, haber başlıklarından piyasadaki genel hissiyatı (pozitif, negatif veya nötr) çıkarmak.
1. Haberleri Google News’ten Çekmek
İlk adımda, belirli bir konu hakkında (örneğin “gold market”) Google News üzerinden haberleri RSS formatında alıyoruz.
feedparser modülü RSS akışlarını okurken, BeautifulSoup haber sayfalarının metin içeriğini çıkarmamıza yarıyor.
import feedparser
import requests
from bs4 import BeautifulSoup
from urllib.parse import quote
def fetch_news(query, limit=10):
url = f"https://news.google.com/rss/search?q={quote(query)}"
feed = feedparser.parse(url)
articles = []
for item in feed.entries[:limit]:
title = item.title
link = item.link
published = item.published
content = extract_content(link)
articles.append({
"title": title,
"link": link,
"published": published,
"content": content
})
return articles
def extract_content(url):
try:
html = requests.get(url, timeout=10).text
soup = BeautifulSoup(html, "html.parser")
return " ".join(p.get_text() for p in soup.find_all("p"))
except Exception:
return ""
Bu fonksiyon, belirlenen anahtar kelimeye ait haberlerin başlık, bağlantı, tarih ve içerik bilgilerini bir liste olarak döndürür.
2. Hızlı Duygu Analizi – VADER
VADER (Valence Aware Dictionary and sEntiment Reasoner), kısa metinler için tasarlanmış popüler bir duygu analiz aracıdır.
Özellikle sosyal medya veya haber başlıkları gibi kısa içeriklerde oldukça başarılıdır.
from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
def vader_sentiment(text):
analyzer = SentimentIntensityAnalyzer()
score = analyzer.polarity_scores(text)['compound']
if score > 0.05:
return "Positive"
elif score < -0.05:
return "Negative"
return "Neutral"
Her haberin başlığı analiz edilerek, metindeki genel hissiyat belirlenir.
3. Finans Odaklı Duygu Analizi – FinBERT
FinBERT, finans haberleri için özel olarak eğitilmiş bir BERT modelidir.
Haberlerdeki küçük nüansları bile (örneğin “federal faiz indirimi” gibi) doğru yorumlayabilir.
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
import numpy as np
finbert = AutoModelForSequenceClassification.from_pretrained("yiyanghkust/finbert-tone")
tokenizer = AutoTokenizer.from_pretrained("yiyanghkust/finbert-tone")
LABELS = ["Positive", "Negative", "Neutral"]
def finbert_sentiment(text):
inputs = tokenizer(text, return_tensors="pt", truncation=True, max_length=512)
with torch.no_grad():
logits = finbert(**inputs).logits
probs = torch.softmax(logits, dim=1).numpy()[0]
return LABELS[np.argmax(probs)]
4. Duygu Dağılımını Hesaplamak
Artık elimizde her haberin duygu etiketi var. Şimdi bunları sayısallaştırıp genel tabloyu çıkaralım.
def summarize_sentiment(articles):
summary = {"Positive": 0, "Negative": 0, "Neutral": 0}
for art in articles:
s = finbert_sentiment(art["title"])
summary[s] += 1
total = len(articles)
for label, count in summary.items():
percent = (count / total) * 100
print(f"{label}: {count} ({percent:.1f}%)")
Örnek çıktı:
Positive: 8 (53.3%)
Negative: 5 (33.3%)
Neutral: 2 (13.3%)
5. Uygulamanın Ana Akışı
Son olarak tüm fonksiyonları bir araya getiriyoruz.
Altın piyasasıyla ilgili haberleri topluyor ve FinBERT ile analiz ediyoruz.
def main():
queries = ["gold market", "gold price", "gold news"]
all_articles = []
for q in queries:
print(f"🔎 Fetching: {q}")
all_articles.extend(fetch_news(q))
summarize_sentiment(all_articles)
if __name__ == "__main__":
main()
Bu sistem, yalnızca altın piyasasında değil; borsa, kripto, döviz gibi alanlarda da kullanılabilir.
Haber akışlarını analiz ederek piyasa psikolojisini sayısal veriye dönüştürmek, modern finans analizinin en güçlü yöntemlerinden biridir.
Kaynak Kod
Projeyi GitHub’da paylaştım:
Bir yanıt yazın