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 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" Fon tipi (Yatırım / Emeklilik / BYF).
columns "info" veya "breakdown" Genel bilgi mi portföy dağılımı mı.
fund_code str veya None Belirli bir fon kodu (örn. "AAK"). 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ı.

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.3.0.tar.gz (17.0 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.3.0-py3-none-any.whl (13.5 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for pytefas-0.3.0.tar.gz
Algorithm Hash digest
SHA256 1b0b46f9717510d5dad7ea553a6c225268968ec7fb176b7244c3e4f8afd9a0a1
MD5 4a0211ae71768c436e1bcabf9d166b82
BLAKE2b-256 f9fa29000efcd1cac3934adf18132b0ac6f1ad111698a381e30cd54bd17b2385

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pytefas-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 13.5 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.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f24ca19d73a3b5e825479df4b0ee090cca0f68ddcb1307770b7e9b4f7c915d8b
MD5 05977c559b68d87e0360821525ff2717
BLAKE2b-256 d2694885fba04d40f3517d2b176d8d41ddc51670580f397cbf740a29e97d2177

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