Program
Büyük dil modelleri, onlara uzmanlaşmış roller, araçlar ve canlı verilere erişim verdiğimizde daha kullanışlı hale gelir. Tek bir modele güvenmek yerine, her aracının analizin farklı bir bölümüne odaklandığı küçük bir araştırma ekibi kurabiliriz.
Bu eğitimde tam olarak bunu yapacağız: GLM-5.3-Flash ve CrewAI kullanarak çoklu aracılı bir hisse senedi analisti oluşturacağız. Üç aracı temel verileri, teknik göstergeleri ve son haberleri analiz ederken, bir portföy yöneticisi bulgularını nihai AL, TUT veya SAT araştırma sinyalinde birleştirir.
Önce iş akışını bir Jupyter Notebook’ta test edeceğiz, ardından bunu hisseleri analiz edebilen ve takip sorularını yanıtlayabilen basit bir terminal arayüzüne dönüştüreceğiz.
Projede şunlar kullanılır:
- GLM-5.3-Flash akıl yürütme için
- CrewAI aracı koordinasyonu için
- Finnhub piyasa ve temel veriler için
- Yahoo Finance geçmiş fiyatlar için
- Tavily güncel haberler için
- Pandas ve NumPy teknik göstergeler için
Çerçeveye yeni misiniz? CrewAI ile Yapay Zekâ Aracıları Oluşturma kursumuz aracıları, ekipleri ve akışları sıfırdan ele alır.
Çoklu Aracılı Uygulama için Neden GLM-5.3-Flash Kullanılmalı
GLM-5.3-Flash, performans, verimlilik ve fiyat arasında etkileyici bir denge sunar. Tam bir genel bakış için GLM-5.3-Flash rehberimizi ve Qwen3.8-Flash-Next ile karşılaştırma yazımızı okuyun.
Rekabetçi performans ve verimlilik
Artificial Analysis Intelligence Index üzerinde 57 puan alır; bu da onu önde gelen modeller arasına yerleştirir ve çok daha pahalı bazı sınır modellerle rekabetçi kılar. Örneğin:
-
GPT-5.6 Sol da 57 alır (
highakıl yürütme çabasıyla) fakat giriş token’larında 25 kat, çıkış token’larında 40 kat daha pahalıdır. -
Claude Sonnet 5 ise
maxakıl yürütme çabasında 55 ile biraz daha düşük puan alır. Girdi/çıktı token’larında GLM-5.3-Flash’ten 20x/30x daha pahalıdır.
Toplam 320B parametreye sahiptir, ancak token başına yalnızca yaklaşık 18B parametre aktiftir; bu da göreli olarak hesaplama açısından verimli kalırken güçlü performans sunmasını sağlar.

Kaynak: AI Model & API Providers Analysis | Artificial Analysis
Çekici fiyatlandırma
Belirttiğim gibi, bu performans karşılaştırmalı olarak düşük API fiyatlandırmasıyla gelir. Yazım sırasında OpenRouter, GLM-5.3-Flash’i milyon giriş token’ı başına $0.075 ve milyon çıkış token’ı başına $0.25 olmak üzere %50 indirimle sunuyor.
Normal fiyatı $0.15/$0.50 iken bile, OpenAI’ın GPT-5.6 Luna modeli gibi modellere göre daha ucuz kalır; Luna $0.20/$1.20’dir (AA Intelligence Index’te max akıl yürütmeyle 52). Bu da onu yalnızca deneyler için değil, daha büyük, üretim düzeyi aracı uygulamaları için de cazip kılar.

Kaynak: GLM 5.3 Flash - API Pricing & Benchmarks | OpenRouter
Çoklu aracılı bir sistem kurarken bu daha da önemlidir; çünkü tek bir kullanıcı isteği arka planda birçok LLM çağrısını tetikleyebilir. Tek bir LLM aracısı akıl yürütme, araç seçimi, araç çıktılarının işlenmesi ve nihai yanıtını üretmek için modeli birkaç kez çağırabilir. Bir aracı yaklaşık yedi LLM çağrısı yapıyorsa ve iş akışınız beş aracı kullanıyorsa, tek bir istek kolaylıkla 35 veya daha fazla LLM çağrısı anlamına gelebilir.
Kesin sayı sisteminizin tasarımına bağlıdır, ancak çıkarım basittir: aracılı iş akışları hızla pahalı hale gelebilir. GLM-5.3-Flash gibi düşük token fiyatlandırmasına sahip yetkin bir model kullanmak, küçük bir demodan gerçek bir üretim uygulamasına geçerken önemli bir fark yaratabilir.
1. GLM-5.3-Flash için Ortamı Kurun
Çoklu aracı iş akışını oluşturmadan önce Z.ai, Finnhub ve Tavily için API anahtarları oluşturun.
API anahtarları oluşturun
Z.ai için normal API’yi kullandığınızdan emin olun, GLM Coding Plan’ı değil. Coding Plan, desteklenen yapay zekâ kodlama araçları için tasarlanmıştır ve kendi çoklu aracı uygulamanız için genel amaçlı bir API olarak kullanılmamalıdır.
Normal bir Z.ai API anahtarı oluşturun ve hesabınıza küçük bir miktar kredi ekleyin. GLM-5.3-Flash ucuz olduğu için testlere başlamak için küçük bir bakiye yeterlidir.

Kaynak: Z.ai API Platform — GLM-5.3 ile geliştirmeye başlayın
Ayrıca Finnhub ve Tavily üzerinde ücretsiz hesap oluşturabilir ve API anahtarları üretebilirsiniz. Ücretsiz katmanları bu proje için yeterlidir.
Proje dosyalarını hazırlayın
Şimdi proje klasörünüzde bir .env dosyası oluşturun ve API anahtarlarını ekleyin:
ZAI_API_KEY="your_zai_api_key"
FINNHUB_API_KEY="your_finnhub_api_key"
TAVILY_API_KEY="your_tavily_api_key"
Şimdi yeni bir Jupyter Notebook oluşturun. Önce burada tüm çoklu aracı iş akışını kurup test edeceğiz, her aracının çıktısını inceleyip hataları düzelteceğiz; ardından bunu uygun bir uygulamaya dönüştüreceğiz.
Gerekli kütüphaneleri yükleyin
Aracıları oluşturmak ve koordine etmek için CrewAI’yi, hisse senedi verileri için Finnhub&rsquoı ve gerçek zamanlı web araması için Tavily&rsquoyi kullanacağız. Gerekli Python paketlerini yükleyin:
!pip install -q crewai crewai-tools finnhub-python tavily-python pandas numpy requests python-dotenv openai
Kütüphaneleri ve API anahtarlarını içe aktarın
Şimdi gerekli kütüphaneleri içe aktarın ve API anahtarlarını yükleyin:
import os
import re
import time
import finnhub
import numpy as np
import pandas as pd
import requests
from dotenv import load_dotenv
from openai import OpenAI
from tavily import TavilyClient
from crewai import Agent, Crew, LLM, Process, Task
from crewai.tools import tool
from crewai_tools import TavilySearchTool
# Load environment variables
load_dotenv()
# Disable CrewAI tracing
os.environ.setdefault("CREWAI_TRACING_ENABLED", "false")
os.environ.setdefault("OTEL_SDK_DISABLED", "true")
Son olarak, aracıların analiz etmesini istediğiniz hisseyi seçin:
TICKER = "NVDA"
Notebook boyunca NVIDIA’yı (NVDA) kullanacağım; ancak ilginizi çeken başka bir sembolle, örneğin AAPL, MSFT veya TSLA ile değiştirmekten çekinmeyin.
2. GLM-5.3-Flash ve Veri API’lerini Yapılandırın
API anahtarları hazır olduğuna göre, proje boyunca aracıların kullanacağı hizmetleri bağlayabiliriz.
Önce hisse senedi verileri için Finnhub ve web araması için Tavily başlatın:
finnhub_client = finnhub.Client(
api_key=os.environ["FINNHUB_API_KEY"]
)
tavily_client = TavilyClient(
api_key=os.environ["TAVILY_API_KEY"]
)
Finansal aracıları oluşturmak istiyor ancak hangi veri kaynağını kullanacağınızdan emin değilseniz, doğru hisse piyasası veri API’sini seçme rehberimizi okumanızı öneririm.
Şimdi de CrewAI aracıları için ana LLM olarak GLM-5.3-Flash’i yapılandıralım. Z.ai, OpenAI ile uyumlu bir API sağlar; bu nedenle doğrudan CrewAI’nin LLM sınıfı üzerinden bağlanabiliriz:
llm = LLM(
model="openai/glm-5.3-flash",
api_key=os.environ["ZAI_API_KEY"],
base_url="https://api.z.ai/api/paas/v4/",
temperature=0.1,
)
Bu uygulama finansal araştırma ve analize odaklandığından, daha tutarlı ve odaklı yanıtlar için sıcaklığı düşük tutuyoruz.
Modeli, piyasa verilerini ve web araması API’lerini bağladığımıza göre, artık aracıların kullanacağı araçları oluşturmaya başlayabiliriz.
3. Geçmiş Piyasa Verilerini Toplayın
Sonraki adımda, aracıların hissenin zaman içindeki performansını anlayabilmesi için geçmiş fiyat verilerine ihtiyacımız var.
Bunun için, günlük açılış, en yüksek, en düşük, kapanış ve hacim verilerini toplamak üzere Yahoo Finance’ın herkese açık grafik uç noktasını kullanacağız.
Fiyat geçmişini indirin
HTTP = requests.Session()
HTTP.headers.update({"User-Agent": "glm-stock-swarm/1.0"})
def _yahoo_history(ticker: str, days: int) -> pd.DataFrame:
end = int(time.time())
start = end - days * 24 * 60 * 60
response = HTTP.get(
f"https://query1.finance.yahoo.com/v8/finance/chart/{ticker}",
params={
"period1": start,
"period2": end,
"interval": "1d",
"events": "history",
},
timeout=30,
)
response.raise_for_status()
result = response.json()["chart"]["result"][0]
values = result["indicators"]["quote"][0]
frame = pd.DataFrame({
"date": pd.to_datetime(
result["timestamp"], unit="s", utc=True
).tz_localize(None),
"open": values["open"],
"high": values["high"],
"low": values["low"],
"close": values["close"],
"volume": values["volume"],
})
frame = (
frame.dropna(subset=["close"])
.sort_values("date")
.reset_index(drop=True)
)
frame.attrs["source"] = "Yahoo public chart"
return frame
def get_price_history(ticker: str, days: int = 450) -> pd.DataFrame:
return _yahoo_history(ticker.strip().upper(), days)
Yaklaşık 450 günlük bir geçmiş toplayacağız; bu da 200 günlük hareketli ortalama gibi daha uzun vadeli göstergeleri hesaplamak için yeterli veri sağlar.
Teknik göstergeleri hesaplayın
Şimdi, yaygın olarak kullanılan birkaç göstergeyi hesaplayalım:
- Hareketli ortalamalar: son 20, 50 ve 200 günlük zaman dilimlerinin ortalaması
- Relative Strength Index (RSI): Aşırı alım (>70) ve aşırı satım (<30) durumunu gösteren 0-100 arası ölçek
- Moving Average Convergence/Divergence (MACD): uzun ve kısa vadeli Üssel Hareketli Ortalamalar (EMA) farkı
def add_indicators(frame: pd.DataFrame) -> pd.DataFrame:
if frame.empty:
return frame.copy()
result = frame.copy()
result.attrs.update(frame.attrs)
# Moving averages
result["SMA20"] = result["close"].rolling(20).mean()
result["SMA50"] = result["close"].rolling(50).mean()
result["SMA200"] = result["close"].rolling(200).mean()
# RSI
delta = result["close"].diff()
gain = delta.clip(lower=0)
loss = -delta.clip(upper=0)
avg_gain = gain.ewm(
alpha=1 / 14, min_periods=14, adjust=False
).mean()
avg_loss = loss.ewm(
alpha=1 / 14, min_periods=14, adjust=False
).mean()
result["RSI14"] = 100 - (
100 / (1 + avg_gain / avg_loss.replace(0, np.nan))
)
# MACD
result["EMA12"] = result["close"].ewm(
span=12, adjust=False
).mean()
result["EMA26"] = result["close"].ewm(
span=26, adjust=False
).mean()
result["MACD"] = result["EMA12"] - result["EMA26"]
return result
Bu göstergeler faydalıdır; çünkü teknik analiz aracısına, LLM’nin her şeyi kendisinin hesaplamasına gerek kalmadan eğilim ve momentuma hızlı bir bakış sağlar.
En son değerleri gözden geçirin
Şimdi verileri toplayın, göstergeleri hesaplayın ve son satırları görüntüleyin:
history = add_indicators(
get_price_history(TICKER)
)
if len(history) < 200:
raise RuntimeError(
f"Need at least 200 daily observations; received {len(history)}."
)
print(
f"Loaded {len(history)} rows "
f"from {history.attrs['source']}."
)
history.tail(3)[
[
"date",
"close",
"SMA20",
"SMA50",
"SMA200",
"RSI14",
"MACD",
]
]

Yukarıdakine benzer şekilde, en son hisse fiyatını hareketli ortalamaları, RSI ve MACD ile birlikte görmelisiniz.
Bu verileri daha sonra teknik analiz aracısına ileteceğiz; böylece fiyat eğilimlerini, momentumu ve yükseliş ya da düşüş sinyallerini belirleyebilir.
4. Veri Kaynaklarını CrewAI Araçlarına Dönüştürün
Artık veri kaynaklarımız çalıştığına göre, bunları CrewAI araçlarına dönüştürmemiz gerekiyor. Bu sayede aracıların, finansal, teknik veya haber bilgisine ihtiyaç duyduklarında doğrudan bu araçları çağırabilmeleri mümkün olur.
Hisse verisi araçlarını oluşturun
Önce sayısal değerleri temiz ve tutarlı tutmak için küçük bir yardımcı işlev oluşturun:
def _number(value, decimals: int = 2) -> str:
if value is None or pd.isna(value):
return "N/A"
return f"{float(value):,.{decimals}f}"
Şimdi de temel veriler aracını oluşturun. Bu araç, Finnhub’ı kullanarak en son hisse fiyatını, değerleme metriklerini, büyümeyi, kârlılığı ve diğer şirket temellerini getirir.
@tool("Get Stock Fundamentals")
def get_fundamentals(ticker: str) -> str:
"""Get current price and company fundamentals from Finnhub for one ticker."""
ticker = ticker.strip().upper()
quote = finnhub_client.quote(ticker)
metrics = finnhub_client.company_basic_financials(ticker, "all")
m = metrics.get("metric", {})
return f"""Ticker: {ticker}
Source: Finnhub
Current price: {_number(quote.get('c'))}
Previous close: {_number(quote.get('pc'))}
Daily change %: {_number(quote.get('dp'))}
Day high / low: {_number(quote.get('h'))} / {_number(quote.get('l'))}
Market cap (USD millions): {_number(m.get('marketCapitalization'))}
52-week high / low: {_number(m.get('52WeekHigh'))} / {_number(m.get('52WeekLow'))}
Normalized annual P/E: {_number(m.get('peNormalizedAnnual'))}
Annual P/B: {_number(m.get('pbAnnual'))}
Annual P/S: {_number(m.get('psAnnual'))}
ROE TTM: {_number(m.get('roeTTM'))}
Net margin TTM: {_number(m.get('netProfitMarginTTM'))}
Revenue growth TTM YoY: {_number(m.get('revenueGrowthTTMYoy'))}
EPS growth TTM YoY: {_number(m.get('epsGrowthTTMYoy'))}
Annual debt/equity: {_number(m.get('totalDebt/totalEquityAnnual'))}"""
Önceki bölümdeki geçmiş veriler ve göstergeleri kullanarak bir de teknik analiz aracı oluşturacağız.
@tool("Analyze Stock Technicals")
def get_technicals(ticker: str) -> str:
"""Calculate price trends, returns, moving averages, RSI, and MACD."""
ticker = ticker.strip().upper()
frame = add_indicators(get_price_history(ticker))
if len(frame) < 200:
return (
f"Technical data unavailable for {ticker}: "
"fewer than 200 observations."
)
latest = frame.iloc[-1]
return f"""Ticker: {ticker}
Source: {frame.attrs.get('source', 'unknown')}
Last market date: {latest['date'].date()}
Close: {_number(latest['close'])}
SMA20 / SMA50 / SMA200: {_number(latest['SMA20'])} / {_number(latest['SMA50'])} / {_number(latest['SMA200'])}
RSI14: {_number(latest['RSI14'])}
MACD: {_number(latest['MACD'])}
20-day return: {_number((latest['close'] / frame['close'].iloc[-21] - 1) * 100)}%
50-day return: {_number((latest['close'] / frame['close'].iloc[-51] - 1) * 100)}%
Price vs SMA20: {_number((latest['close'] / latest['SMA20'] - 1) * 100)}%
Price vs SMA50: {_number((latest['close'] / latest['SMA50'] - 1) * 100)}%
Price vs SMA200: {_number((latest['close'] / latest['SMA200'] - 1) * 100)}%"""
Burada önemli olan kısım @tool dekoratörüdür. Normal bir Python işlevini, CrewAI aracısının bir görev sırasında çağırmayı seçebileceği bir araca dönüştürür.
Web arama aracını ekleyin
Şirket haberleri ve yakın dönem gelişmeleri için, CrewAI’nin Tavily arama aracını kullanacağız:
web_search = TavilySearchTool(
api_key=os.environ["TAVILY_API_KEY"],
topic="news",
search_depth="advanced",
days=30,
max_results=5,
)
Aramayı son 30 günle sınırlandırıyoruz ve en fazla beş sonuç döndürüyoruz; bu da araştırma aracılarına gereksiz içerikle boğmadan yeterli güncel bilgi sağlamalıdır.
Hisse araçlarını test edin
Aracıları oluşturmadan önce, iki özel aracı doğrudan çalıştırın:
print(get_fundamentals.run(ticker=TICKER))
print()
print(get_technicals.run(ticker=TICKER))

Şimdi seçilen hisse için en son temel metrikleri, ardından teknik göstergeleri görmelisiniz.
5. Çoklu Aracılı Araştırma Ekibini Oluşturun
Araçlar hazır olduğuna göre, çoklu aracılı araştırma ekibimizi oluşturabiliriz.
Temel analiz, teknik analiz ve yakın dönem haberleri için üç uzman aracı ve bulgularını nihai değerlendirmeye dönüştüren bir portföy yöneticisi kullanacağız.
Uzman aracıları oluşturun
Önce temel analisti oluşturun:
fundamental_agent = Agent(
role="Fundamental Analyst",
goal=(
"Evaluate financial health, growth, profitability, "
"valuation, and balance-sheet risk."
),
backstory=(
"You are a careful long-term equity analyst. "
"Use the fundamentals tool and never invent a figure. "
"Treat N/A as missing, not as zero."
),
tools=[get_fundamentals],
llm=llm,
allow_delegation=False,
max_iter=4,
verbose=False,
)
Şimdi teknik analisti oluşturun:
technical_agent = Agent(
role="Technical Analyst",
goal=(
"Determine whether the current price setup is "
"bullish, bearish, or neutral."
),
backstory=(
"You interpret indicators calculated by Python. "
"Never guess market prices or indicator values."
),
tools=[get_technicals],
llm=llm,
allow_delegation=False,
max_iter=4,
verbose=False,
)
Ardından finans haberleri analistini oluşturun:
news_agent = Agent(
role="Financial News Analyst",
goal=(
"Find material recent developments and distinguish "
"confirmed reporting from speculation."
),
backstory=(
"You are a skeptical financial-news researcher. "
"Prioritize primary and reputable sources, dates, and links."
),
tools=[web_search],
llm=llm,
allow_delegation=False,
max_iter=5,
verbose=False,
)
Her uzmana yalnızca gerçekten ihtiyaç duyduğu araç verilir. Bu, iş akışını odaklı tutar ve aracıların ilgisiz araçları çağırmasını engeller.
Portföy yöneticisini oluşturun
Son olarak, üç uzman raporunu gözden geçirecek yönetici aracıyı oluşturun:
manager_agent = Agent(
role="Portfolio Manager",
goal=(
"Combine the specialist reports into a balanced, "
"evidence-based research signal."
),
backstory=(
"You lead an equity research team. "
"Weigh bullish and bearish evidence, use HOLD when evidence "
"is mixed, and never add unsupported facts."
),
llm=llm,
allow_delegation=False,
max_iter=4,
verbose=False,
)
Portföy yöneticisinin veri araçlarımıza doğrudan erişmesi gerekmez. Bunun yerine, üç uzman aracının ürettiği raporlarla çalışır.
allow_delegation=False ayarı iş akışını öngörülebilir kılar; max_iter ise her aracının gerçekleştirebileceği akıl yürütme ve araç kullanımı döngülerini sınırlar.
6. Uzmanlaşmış Araştırma Görevlerini Atayın
Aracıları oluşturmak kim olduklarını tanımlar. Şimdi her birine tam olarak ne yapması gerektiğini ve nihai çıktısının ne içermesi gerektiğini söylememiz gerekiyor.
Araştırma görevlerini tanımlayın
Temel analiz göreviyle başlayın:
fundamental_task = Task(
description=(
f"Analyze {TICKER}'s growth, profitability, valuation, "
"balance sheet, and business quality. "
"Use Get Stock Fundamentals. "
"Return a Fundamental Score from 0-100, strongest positive, "
"biggest risk, and note all material missing data."
),
expected_output=(
"A concise fundamental assessment with a 0-100 score, "
"evidence, strongest positive, biggest risk, "
"and missing-data note."
),
agent=fundamental_agent,
)
Şimdi teknik analiz görevini tanımlayın:
technical_task = Task(
description=(
f"Analyze {TICKER}'s technical setup. "
"Use Analyze Stock Technicals. "
"Consider SMA20/50/200, RSI14, MACD, recent returns, and trend. "
"Return Technical Score 0-100, Bullish/Neutral/Bearish signal, "
"trend, momentum, and main technical risk."
),
expected_output=(
"A concise technical assessment with score, signal, trend, "
"momentum, data source, and main risk."
),
agent=technical_agent,
)
Yakın dönem gelişmeler için haber araştırma görevini oluşturun:
news_task = Task(
description=(
f"Research the most important recent news for {TICKER}, "
"focusing on the last 30 days: earnings, guidance, analyst "
"revisions, products, partnerships, M&A, regulation, lawsuits, "
"management, and industry developments. "
"Use Tavily Search. "
"Return News Score 0-100, sentiment, positive and negative "
"catalysts, publication dates, and source URLs. "
"Ignore low-quality speculation."
),
expected_output=(
"A sourced recent-news assessment with score, sentiment, "
"catalysts, dates, and clickable URLs."
),
agent=news_agent,
)
Her aracıya net bir görev ve çıktı biçimi vermek önemlidir. Bu, portföy yöneticisinin raporları karşılaştırmasını kolaylaştırır; her aracıdan tamamen farklı yanıtlar almak yerine tutarlı bir yapı sağlar.
Nihai karar görevini oluşturun
Nihai görev, üç raporu bir araya getirir:
decision_task = Task(
description=(
f"Review all three specialist reports and make the final "
f"educational research assessment for {TICKER}. "
"Return exactly one signal: BUY, HOLD, or SELL. "
"Use HOLD when evidence is mixed or confidence is insufficient. "
"Base every claim only on the supplied reports."
),
expected_output=(
"Ticker; Signal; Overall Score /100; Confidence %; "
"Fundamental, Technical, and News scores; Bull Case; "
"Bear Case; Main Catalyst; Main Risk; Final Explanation; "
"Sources; and an educational-not-financial-advice disclaimer."
),
agent=manager_agent,
context=[
fundamental_task,
technical_task,
news_task,
],
)
Buradaki kilit kısım context alanıdır. Bu alan, portföy yöneticisine üç uzman görevinin çıktılarının tümüne erişim sağlar; böylece nihai AL, TUT veya SAT değerlendirmesini üretmeden önce temel, teknik ve haber sinyallerini karşılaştırabilir.
Bu noktada aracılarımız, araçlarımız ve görevlerimiz hazır. Şimdi her şeyi bir CrewAI iş akışına bağlayıp tam araştırma ekibini çalıştırabiliriz.
7. Çoklu Aracılı Araştırma Ekibini Çalıştırın
Artık her şeyi bir araya getirip tam hisse araştırma iş akışını çalıştırabiliriz.
Ekibi oluşturun
Üç uzman aracımız ve portföy yöneticisini içeren bir CrewAI ekibi oluşturun:
crew = Crew(
agents=[
fundamental_agent,
technical_agent,
news_agent,
manager_agent,
],
tasks=[
fundamental_task,
technical_task,
news_task,
decision_task,
],
process=Process.sequential,
verbose=False,
tracing=False,
)
Process.sequential kullandığımız için araştırma görevleri sırayla çalışır. Temel, teknik ve haber aracıları analizlerini önce tamamlar; ardından portföy yöneticisi bu raporları alıp nihai değerlendirmeyi üretir.
Araştırma ekibini çalıştırın
İş akışını eşzamanlı olmayan şekilde başlatın:
result = await crew.kickoff_async()
Bu adım biraz zaman alabilir; çünkü aracıların birden fazla LLM ve araç çağrısı yapması gerekir. Benim testimde, tam araştırma iş akışı yaklaşık 4 ila 5 dakika sürdü.
Tamamlandığında, nihai portföy yöneticisi raporunu görüntüleyin:
print(result.raw)

Aşağıdakileri içeren, yukarıdakine benzer ayrıntılı bir rapor almalısınız:
- AL, TUT veya SAT sinyali
- Genel skor
- Güven düzeyi
- Uzman skorları
- Yükseliş durumu
- Düşüş durumu
- Katalistler
- Riskler
- Destekleyici kaynaklar
Bu örnekte, aracıları NVIDIA’yı bağımsız olarak analiz edip bulgularını tek bir kanıta dayalı araştırma raporunda birleştirdi. Çoklu aracı yaklaşımının faydası burada görülüyor: her şeyi tek bir modelden aynı anda yapmasını istemek yerine, her aracı kendi alanına odaklanır ve portföy yöneticisi tüm araştırmayı bir araya getirir.
Yukarıdaki kodu çalıştırmada sorun yaşarsanız, kodun ve çıktıların tamamını içeren Jupyter Notebook’u da ekledim; inceleyebilir veya kendiniz çalıştırabilirsiniz: glm-stock-swarm/stock_analyst_crew.ipynb
8. Terminal Arayüzünü Oluşturun ve Çalıştırın
Her şeyi Jupyter Notebook içinde test ettikten sonra, tüm iş akışını bir terminal kullanıcı arayüzüne (TUI) dönüştürdüm. Artık her not defteri hücresini elle çalıştırmak yerine, tek bir komutla tüm çoklu aracılı hisse analistini başlatabilirsiniz.
Kod ve kurulum talimatları dahil tüm proje GitHub’da mevcuttur: glm-stock-swarm GitHub deposu.
Uygulamayı kurun ve çalıştırın
Depoyu klonlayarak başlayın:
git clone https://github.com/kingabzpro/glm-stock-swarm.git
cd glm-stock-swarm
Z.ai, Finnhub ve Tavily API anahtarlarınızı .env dosyasına ekleyin; ardından tüm bağımlılıkları uv ile kurun:
uv sync
Son olarak TUI’yi başlatın:
uv run glm-stock-swarm
Bir hisseyi analiz edin
Arayüz, analize başlamak için desteklenen herhangi bir hisse sembolünü girebileceğiniz basit bir giriş kutusu sağlar.

Bileti gönderdikten sonra, aracıların birer birer çalışmasını izleyebilirsiniz. Temel analist önce başlar, ardından teknik analist, haber analisti ve en sonunda her şeyi nihai karara dönüştüren portföy yöneticisi gelir.

Sonda TUI, terminal içinde doğrudan tam bir rapor üretir: temel skor, teknik skor, haber skoru, genel skor, güven, yükseliş/düşüş durumu, riskler, katalistler ve nihai AL, TUT veya SAT sinyali.
Takip soruları sorun
Ayrıca, her yeni sorunuz olduğunda tüm çoklu aracı hattını yeniden çalıştırmanıza gerek kalmaması için bir takip sohbeti de ekledim.

Örneğin, bir SAT önerisi aldıktan sonra tüm pozisyonu mu yoksa sadece bir kısmını mı satmam gerektiğini sordum.

Uygulama, dört aracıyı tekrar başlatmak yerine oluşturulan araştırma raporunun bağlamını kullanır ve çok daha hızlı bir takip yanıtı gönderir.
Bu da uygulamayı daha pratik kılar; çünkü maliyetli çoklu aracı araştırması bir kez çalışır, takip soruları ise mevcut analizden yararlanabilir.
Son Düşünceler
Denemelerimden raporlamaya değer nokta, araç çağırma güvenilirliği oldu. Üç uzmanın tamamı doğru aracı seçti, eksik verileri sıfır yerine N/A olarak ele alma kuralına uydu ve portföy yöneticisinin ihtiyaç duyduğu puan+kanıt biçiminde çıktı verdi. Genelde ucuz modeller bu noktada tökezler.
Taviz ise hızda. Artificial Analysis, Z.ai’ın API’sinde GLM-5.3-Flash’i saniyede yaklaşık 45 çıkış token’ı olarak ölçüyor; bu, boyutundaki açık ağırlıklı modeller için düşük sayılır ve tam ekip çalışmasının 4–5 dakika sürmesinde bunu hissediyorsunuz. Ayrıca zeka endekslerinde GLM-5.3’e karşı 60’a kıyasla 57 alıyor; yani biraz akıl yürütme kalitesinden feragat ediyorsunuz, ama ödediğiniz fiyatın yaklaşık onda biri olduğu düşünülürse bu iyi bir takas.
Bunların hiçbiri sizi kilitlemez. OpenRouter, Hugging Face Inference veya Ollama üzerinden yerel bir modele geçmek genellikle üç şeyi değiştirmek anlamına gelir: API anahtarı, model adı ve temel URL. Araçlar için de benzer şekilde, burada Finnhub ve Yahoo’nun bölüştüğü işi yfinance görebilir.
Bir sonraki adım olarak bunu bir kâğıt alım-satım API’sine bağlayıp sabah koşusu planlarım. Yine de bir demo hesapta tutun. Bu, aracı tasarımını öğretmek için inşa edildi; alım satım yapmak için değil.
Aracılı yapay zekâyı temelden öğrenmek istiyorsanız, harika bir başlangıç noktası olarak AI Agent Fundamentals yetkinlik yolumuzu öneririm.
Sertifikalı bir veri bilimcisi olarak, yenilikçi makine öğrenimi uygulamaları oluşturmak için en son teknolojileri kullanmaya büyük ilgi duyuyorum. Konuşma tanıma, veri analizi ve raporlama, MLOps, konuşma yapay zekası ve NLP alanlarında güçlü bir geçmişe sahip olarak, gerçek bir etki yaratabilecek akıllı sistemler geliştirme becerilerimi geliştirdim. Teknik uzmanlığımın yanı sıra, karmaşık kavramları açık ve özlü bir dille ifade etme yeteneğine sahip, becerikli bir iletişimciyim. Sonuç olarak, veri bilimi konusunda aranan bir blog yazarı oldum ve giderek büyüyen veri profesyonelleri topluluğuyla görüşlerimi ve deneyimlerimi paylaşıyorum. Şu anda, içerik oluşturma ve düzenlemeye odaklanıyorum. Büyük dil modelleriyle çalışarak, hem işletmelerin hem de bireylerin verilerinden en iyi şekilde yararlanmalarına yardımcı olabilecek güçlü ve ilgi çekici içerikler geliştiriyorum.
