Skip to content
Araştırma
8 dk okuma

Borsa İstanbul'un backtest'inizde olmayan yarısı

2000'den bu yana Borsa İstanbul'da 927 şirket işlem gördü, bugün işlem gören şirket sayısı 612. Hisse evrenini bugünkü listeden kurarsanız batan ya da borsadan çekilen 315 şirket testinizden sessizce siliniyor. Bu hatanın dönem dönem ne kadar büyük olduğuna ve onu ortadan kaldıran açık arşive bakıyoruz.

Hisse evreni
927 hisse, 134 endeks dönemi, 2000–2026
Test dönemi
2000–2026

2000 yılından bu yana Borsa İstanbul'da 927 şirket işlem gördü. Bugün işlem gören şirket sayısı 612.

Backtest'in hisse evrenini bugün borsada işlem gören hisselerden kurmak en kolay yol ve çoğu veri sağlayıcı size zaten bu listeyi veriyor. Ama bunu yaptığınız anda 315 şirketi farkında olmadan silmiş olursunuz: iflas edenleri, pay alım teklifiyle borsadan çekilenleri, birleşmeyle başka bir şirkete katılanları ve kottan çıkarılanları. Böyle kurulan bir backtest, hiçbir şirketin batmadığı bir piyasayı test ediyor.

Sonuç iyi görünür ama doğru olmaz.

Bu yazıda bu hatanın Borsa İstanbul'da ne kadar büyük olduğuna bakıyoruz ve onu ortadan kaldırmak için derleyip herkese açtığımız arşivi anlatıyoruz.

Hata ne kadar büyük

Yazının dayandığı veri, 2000-01-04 ile 2026-10-01 arasındaki bütün BIST endeks dönemlerinin listeleri: 134 dönem ve her dönemde her şirket için bir satır olmak üzere toplam 53,983 satır. Her satırda, o tarihte hangi şirketin borsada işlem gördüğü kayıtlı. Döneme ait bir hisse evreni kurmak için bilmeniz gereken de yalnızca bu.

O tarihte işlem gören612.00…bunlardan bugün borsada olmayan0.00
0.00200.00400.00600.00200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026
Fig. 1Her endeks döneminde borsada işlem gören şirket sayısı ve bunlardan bugün artık borsada olmayanlar. İki çizgi arasındaki fark, bugünkü hisse listesinden kurulan bir evrenin dışarıda bıraktığı şirketler.

Grafiğe soldan başlayalım. 2000 yılında borsada 329 şirket işlem görüyordu ve bunların 175 tanesi bugün borsada yok. Oran %53.2. Bugünkü hisselerle yapılmış bir "2000'den bu yana Borsa İstanbul" çalışması, aslında o dönemin yalnızca ayakta kalan yarısını inceliyor.

Turuncu çizgi bugüne yaklaştıkça aşağı iniyor ama bunu iyiye yormayın. Son yıllarda borsaya girenlerin bir kısmı da ileride kottan çıkacak, yalnızca henüz çıkmadılar. Bu yüzden bugünle biten her dönem, olabileceği en temiz hâlde görünüyor.

Dönemİşlem görebilen şirketBugün hâlâ borsadaBorsadan çıkanÇıkanların oranı
2005–2010372201171%46
2010–2015507313194%38.3
2015–2020476349127%26.7
2020–202667261260%8.9

Son sütun, her dönem için hatanın büyüklüğünü gösteriyor. 2010–2015 arasını bugünkü hisselerle test ederseniz, o dönemde işlem gören şirketlerin yaklaşık %38.3 kadarı elinizde olmaz. Üstelik eksik kalanlar rastgele seçilmiş şirketler değil, tam da batanlar.

Borsadan çıkışlar tek tek değil, dalga dalga geliyor

Tek bir ortalamaya bakınca gözden kaçan ikinci nokta şu: şirketler borsadan düzenli aralıklarla değil, toplu hâlde çıkıyor.

DönemGirenÇıkan
2001–20054651
2006–20108253
2011–201516377
2016–20205076
2021–202523152

2016–2020, çıkan şirket sayısının girenden fazla olduğu tek dönem. Arkasından gelen 2021–2025 ise halka arz dalgası. Bir backtest'in en çok doğru görmesi gereken iki dönem bunlar ve hayatta kalma yanlılığı taşıyan bir evren ikisinde de aynı yöne yanılıyor: kötü dönemde batanları siliyor, iyi dönemin kazananlarını ise olduğu gibi tutuyor.

Verideki iki tuzak

İkisi de hata değil, kaynağın yapısından geliyor. İkisi de bize epey vakit kaybettirdi.

index sütunu endeks üyeliğini değil, dilimi gösteriyor. Borsa İstanbul'un yayımladığı Excel dosyasında her şirket için her tarihte tek bir hücre var, yani her şirkete tek bir etiket düşüyor: ilk 30 için XU030, 31 ile 50. sıra arası için XU050, 51 ile 100. sıra arası için XU100. Bu üç etiket BIST 100'ü 30, 20 ve 50 hisselik üç dilime bölüyor. BIST 50'yi bulmak için ham sütunda XU050 filtrelerseniz, hiçbir yerde hata almadan elinize yirmi şirket gelir.

Dönem tarihleri, değişikliklerden önce açıklanıyor. BIST endeks dönem değişikliklerinin takvimini önceden yayımlıyor. Bu yüzden en son listede bütün şirketler yer alırken hangisinin hangi endekste olduğu henüz belli olmayabiliyor. Bu listeden BIST 100'ü isteyen basit bir uygulama boş bir liste döndürür: teknik olarak doğru ama tamamen yanıltıcı. Kütüphane bu durumda boş liste yerine hata veriyor ve gerçekten açıklanmış en son dönemin tarihini bildiriyor.

Nasıl kullanılır

from bist_constituents import constituents_on, tickers_in_range, Index

# The market as it actually stood on a given day
market = constituents_on("2014-06-30")
len(market)                                    # 446

# The BIST 30 that day: the real one, not today's
constituents_on("2014-06-30", index=Index.XU030).tickers

# A backtest universe: everything tradeable during the window
tickers_in_range("2015-01-01", "2020-01-01")   # 476 tickers

Backtest için önemli olan fonksiyon tickers_in_range. Dönem başlamadan önce borsadan çıkmış bir şirket listeye hiç girmiyor, dönemin ortasında çıkan ise giriyor. Yani fonksiyon, o dönemde gerçekten alınıp satılabilecek hisseleri veriyor, fazlasını değil.

Veri repoda hem parquet hem CSV olarak duruyor, kütüphaneyi kullanmak zorunda değilsiniz:

import pandas as pd
df = pd.read_parquet("data/bist_constituents.parquet")

Bu veride olmayanlar

  • Fiyat, hacim ya da bilanço verisi yok. Yalnızca hangi şirketin hangi tarihte işlem gördüğü var. Bir fiyat verisiyle birleştirmeniz gerekiyor; hisse kodları BIST kodları olduğu için doğrudan eşleşiyor.
  • Borsadan çıkış sebebi yok. Veride bir şirketin işlem görmeyi bıraktığı görülüyor ama bunun iflas mı, birleşme mi, yoksa gönüllü bir çıkış mı olduğu görülmüyor. Hisseyi elinde tutanın sonunda eline ne geçtiğini modelliyorsanız bu fark çok önemli.
  • Günlük değil, üç aylık. Liste yalnızca endeks dönemlerinde güncelleniyor. İki dönem arasında halka arz olup borsadan çıkan bir şirket veride hiç görünmeyebilir. Yani arşiv hayatta kalma yanlılığının tamamını değil, büyük kısmını gideriyor.
  • Şirket unvanları o tarihteki hâliyle. Şirketler unvan değiştiriyor ve aynı hisse kodu farklı dönemlerde farklı unvanlarla görünebiliyor. Döneme ait bir arşivin amacı da zaten bu. Tabloları hisse kodu yerine şirket adıyla birleştirirseniz başınız ağrır.

Ham Excel dosyalarını Borsa İstanbul yayımlıyor, biz onları repoda yeniden dağıtmıyoruz. Onları bu veri setine çeviren kod ise repoda. Böylece arşivi bize güvenmek zorunda kalmadan, doğrudan kaynağından yeniden kurabilirsiniz.

Bu sitede yayımlanan bütün BIST backtest'leri bu evrenle kuruldu. Arşivi bunun için hazırladık. Herkese açık olmasının sebebi de şu: hangi hisse evreniyle test edildiğini kimsenin kontrol edemediği bir sonucun pek bir değeri yok.

Yazan

Koray GocmenKurucu

Buradaki araştırmaların arkasındaki sistematik stratejileri kuruyor ve çalıştırıyor.

Kaynak kodun tamamı

Bu yazının arkasındaki kod, veri ve parametre dosyaları.

Tüm araştırmalar