Skip to main content

TEFAS (Türkiye Elektronik Fon Alım Satım Platformu) için modern Python istemcisi - yeni resmi API'leri kullanır.

Project description

pytefas

PyPI version Python versions License: MIT tests canary

TEFAS (Türkiye Elektronik Fon Alım Satım Platformu) için modern Python istemcisi.

Yeni TEFAS sitesinin (Next.js tabanlı, 2026'da yenilendi) doğrudan resmi API endpoint'lerini kullanır. Authorization, login veya API anahtarı gerektirmez.

Neden pytefas?

TEFAS sitesi 2026'da Next.js tabanlı yeni bir altyapıya geçti. Eski HTML scraping tabanlı çözümler bu yenilemeden etkilendi. pytefas, yeni sitenin doğrudan JSON API endpoint'lerini kullanır:

  • HTML parse yerine yapısal JSON
  • Daha hızlı, daha az kırılgan
  • 50+ varlık dağılımı kolonu (eski araçlardaki kısıtlama yok)
  • Tek istekte 1 ay sınırını arka planda otomatik çözer

Özellikler

  • Yeni resmi TEFAS API endpoint'lerini doğrudan kullanır (HTML scraping yok).
  • Otomatik chunking - uzun tarih aralıklarını arka planda parçalara böler.
  • Otomatik rate-limit yönetimi (TEFAS dakikada 6 istek sınırına sahiptir).
  • 50+ varlık dağılımı kolonu (hisse, repo, eurobond, kıymetli madenler vs.).
  • YAT / EMK / BYF / GYF / GSYF fon tipleri tek DataFrame'de birleştirilebilir.
  • Custom exception'lar - hata yönetimi tipli ve kontrollü.
  • Tam type hints + NumPy stilinde docstring'ler.

API endpoints

  • https://www.tefas.gov.tr/api/funds/fonGnlBlgSiraliGetir - fund info (price / shares / size)
  • https://www.tefas.gov.tr/api/funds/dagilimSiraliGetirT - portfolio breakdown

Kurulum

pip install pytefas

Hızlı başlangıç

from pytefas import Crawler

tefas = Crawler()
df = tefas.fetch("2026-04-24", columns="info", kind="YAT")
print(df.head())
        date kind fund_code                              fund_name      price  shares_outstanding  investor_count  portfolio_size
0 2026-04-24  YAT       AAK  ATA PORTFÖY ÇOKLU VARLIK DEĞİŞKEN FON   35.46418            999934.0           769.0    35461839.75
1 2026-04-24  YAT       AAL    ATA PORTFÖY PARA PİYASASI (TL) FONU   ...

Kullanım

Tek bir gün, fiyat bilgisi

df = tefas.fetch("2026-04-24", columns="info", kind="YAT")

9 sütun döner: date, kind, fund_code, fund_name, price, shares_outstanding, investor_count, portfolio_size, exchange_bulletin_price.

exchange_bulletin_price (borsa bülten fiyatı) genellikle BYF için doludur; YAT/EMK için None olabilir.

Portföy varlık dağılımı

df = tefas.fetch("2026-04-24", columns="breakdown", kind="YAT")
# 50+ sütun: stock_pct, government_bond_pct, repo_pct, foreign_stock_pct, ...

Her satırın yüzde toplamı ~100 olur.

Tarih aralığı (otomatik chunking)

TEFAS API'si tek istekte 1 ay (yaklaşık 30 gün) sınırı uygular. pytefas bu sınırı arka planda yönetir - uzun aralıklar otomatik olarak 28 günlük parçalara bölünür ve birleştirilir.

# 1 ay
df = tefas.fetch("2026-03-24", "2026-04-24", kind="YAT")

# 1 yıl - otomatik chunklanır (~13 chunk, rate-limit ile ~3 dakika)
df = tefas.fetch("2025-04-01", "2026-04-01", kind="YAT")
print(df["date"].nunique())  # ~250 iş günü

Tüm fon tiplerini birlikte (YAT + EMK + BYF)

df = tefas.fetch_many("2026-04-24", columns="info")
print(df.groupby("kind").size())
# kind
# BYF      30
# EMK     392
# YAT    2001

Tek bir fonun geçmişi

fund_code parametresiyle sadece bir fonun verisini çekersiniz. Uzun aralıklarda tek fon için chunking devam eder ama veri hacmi çok daha küçüktür.

# AAK fonunun 1 yıllık fiyat geçmişi
df = tefas.fetch("2025-04-28", "2026-04-28", kind="YAT", fund_code="AAK")
print(df[["date", "price"]].head())

# Hangi tipte olduğunu bilmiyorsan fetch_many kullanılır
df = tefas.fetch_many("2025-04-28", "2026-04-28", fund_code="AAK")

Hata yönetimi

from pytefas import (
    Crawler,
    TefasInvalidParameterError,
    TefasAPIError,
    TefasRateLimitError,
)

tefas = Crawler()

try:
    df = tefas.fetch("2026-04-24", kind="INVALID")
except TefasInvalidParameterError as e:
    print(f"Geçersiz parametre: {e}")
except TefasRateLimitError as e:
    print(f"Rate limit aşıldı: {e}")
except TefasAPIError as e:
    print(f"API hatası: {e}")

TefasInvalidParameterError aynı zamanda ValueError'dan da türer - eski kodlar except ValueError ile yakalamaya devam edebilir.

Parametreler

Crawler(timeout=60, max_retry=5)

Parametre Açıklama
timeout HTTP istekleri için saniye cinsinden zaman aşımı.
max_retry Rate-limit veya geçici hatalarda maksimum yeniden deneme sayısı.

Crawler.fetch(start, end=None, kind="YAT", columns="info", fund_code=None)

Parametre Tip Açıklama
start str, date, datetime, pd.Timestamp Başlangıç tarihi.
end aynı, veya None Bitiş tarihi. None = start ile aynı.
kind "YAT", "EMK", "BYF", "GYF", "GSYF" Fon tipi (Yatırım / Emeklilik / Borsa Yatırım / Gayrimenkul Yatırım / Girişim Sermayesi Yatırım).
columns "info" veya "breakdown" Genel bilgi mi portföy dağılımı mı.
fund_code str veya None Belirli bir fon kodu (örn. "AAL"). None → tüm fonlar.

Crawler.fetch_many(start, end=None, kinds=("YAT","EMK","BYF"), columns="info", fund_code=None)

fetch ile aynı, ama birden fazla kind'ı tek DataFrame'de birleştirir. fund_code verirsen her tipte o kodu arar - hangi tipte olduğunu bilmiyorsan kullanışlı.

GYF ve GSYF default'ta dahil değildir (geriye uyumluluk). Dahil etmek için açıkça ver:

df = tefas.fetch_many("2026-05-12", kinds=("YAT","EMK","BYF","GYF","GSYF"))

Tarihsel veri ve süre tahmini

TEFAS rate-limit'i nedeniyle uzun aralıklar zaman alır:

Aralık Tahmini süre
1 hafta ~10 saniye
1 ay ~10 saniye (1 chunk)
3 ay ~1 dakika
1 yıl ~3 dakika
5 yıl ~15 dakika

Stabilite

TEFAS API'si halen genel kullanıma açıktır ancak resmi olarak dokümante edilmemiştir. TEFAS site değişikliği yaparsa paket güncellenmesi gerekebilir - issue açın veya PR gönderin.

Periyodik canary testi her hafta TEFAS API'sinin çalıştığını doğrular (Actions tab).

Değişiklik geçmişi

Versiyonlar arası değişiklikler için CHANGELOG.md.

Lisans

MIT - bkz. LICENSE.

Katkı

Pull request'ler memnuniyetle karşılanır. Major değişiklikler için önce issue açıp tartışalım. Detay için CONTRIBUTING.md.

Teşekkürler

TEFAS Python ekosistemine yıllardır katkı sağlayan açık kaynak geliştiricilere teşekkürler. Bu paket, topluluğun kollektif çabasının bir devamıdır.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pytefas-0.4.1.tar.gz (18.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pytefas-0.4.1-py3-none-any.whl (14.2 kB view details)

Uploaded Python 3

File details

Details for the file pytefas-0.4.1.tar.gz.

File metadata

  • Download URL: pytefas-0.4.1.tar.gz
  • Upload date:
  • Size: 18.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for pytefas-0.4.1.tar.gz
Algorithm Hash digest
SHA256 ca51f0ebcad60ca542a65480ff9cc4280dc588c2525c60ba821bf5fc207a08d3
MD5 fbcd5de7db701b9e5c6813a60c5907fb
BLAKE2b-256 b231a8101c0a3fabe1d86c1d78f137fab9bf8b2e52c00e647e54ea4d051631e6

See more details on using hashes here.

File details

Details for the file pytefas-0.4.1-py3-none-any.whl.

File metadata

  • Download URL: pytefas-0.4.1-py3-none-any.whl
  • Upload date:
  • Size: 14.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for pytefas-0.4.1-py3-none-any.whl
Algorithm Hash digest
SHA256 26805922c56e153387a6c50fd7eb838c375349b048a1799419928ef95482e5bd
MD5 a04d443d72473142cd916a4dcb75955e
BLAKE2b-256 933402b01ea8aba9c6828bf941a21459f3e0dbe778598ac00d4a496741c51f02

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page