Kazık ETF mi?

Kazık ETF mi?#

The Economist’in yakın tarihli bir yazısı daha başlığında “Yatırımcılar yeni nesil kazık ETF’lerden kaçınmalı” diyor. ETF, bir varlık koleksiyonu tutan ve tek hisse gibi borsada işlem gören fondur. Örneğin SPDR S&P 500 ETF Trust (SPY), S&P 500 endeksini izler; geleneksel endeks fonlarından farklı olarak payları dakikalar içinde alıp satabilirsiniz.

Bunda açıkça yanlış bir şey yoktur. Ancak yazı “kazık ETF” örneği olarak, yatırımcılara “hisse tutarken düşen fiyatlara karşı korunma; bunun karşılığında çoğu zaman %10 civarındaki düzeyin üzerindeki yıllık getiriden vazgeçme” fırsatı sunan tanımlı sonuç fonlarını ya da tampon ETF’leri anlatır.

İyi gelebilir; ancak yazıya göre uzun vadede korkunç bir anlaşmadır, çünkü hisse sahipliğinin bileşik getirisinin büyük bölümü yükseliş dönemlerinden gelir.

1980’den beri S&P 500’ü örnek verir: Getirisi %10 ile sınırlandırılıp kayıplardan korunan yatırımcı dönemde reel %403, yalnızca S&P 500’ü alıp tutan yatırımcı %3155 getiri elde ederdi.

Kötü görünüyor; ancak 1980’den günümüze getiriler tarihsel olarak sıra dışıdır. Tampon ETF’lerin genel olarak kötü olup olmadığını anlamak için daha geniş bakalım.

Bu notebook’u Colab’da çalıştırmak için buraya tıklayın

Kod hücresi içeriğini gizle

from os.path import basename, exists


def download(url):
    filename = basename(url)
    if not exists(filename):
        from urllib.request import urlretrieve

        local, _ = urlretrieve(url, filename)
        print("İndirildi: " + local)


download("https://github.com/TerekliTahaBerk/thinkstatstr/raw/v3/nb/thinkstats.py")

Kod hücresi içeriğini gizle

try:
    import empiricaldist
except ImportError:
    !pip install empiricaldist

Kod hücresi içeriğini gizle

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

from thinkstats import decorate

Dow Jones#

MeasuringWorth Foundation, 16 Şubat 1885’ten bugüne Dow Jones Sanayi Ortalamasının gün sonu değerini, karşılaştırılabilirlik için çeşitli düzeltmelerle derlemiştir. Topladığım seri 16 Şubat 1885–30 Ağustos 2024 arasındadır. Aşağıdaki hücreler verileri indirip okur.

Kod hücresi içeriğini gizle

# Kaynak: Samuel H. Williamson, 'Daily Closing Value of the Dow Jones Average, 1885 to Present,'
# MeasuringWorth.

# Resmî veri kümesi: https://www.measuringworth.com/datasets/DJA/
data_url = (
    "https://www.measuringworth.com/datasets/DJA/export.php?"
    "monthStartD=2&dayStartD=16&yearStartD=1885&"
    "monthEndD=8&dayEndD=30&yearEndD=2024"
)
filename = "DJA.csv"

if not exists(filename):
    from urllib.request import urlretrieve

    urlretrieve(data_url, filename)
    print("İndirildi: " + filename)
djia = pd.read_csv(filename, skiprows=4, parse_dates=[0], index_col=0)
djia.head()
DJIA
Date
1885-02-16 30.9226
1885-02-17 31.3365
1885-02-18 31.4744
1885-02-19 31.6765
1885-02-20 31.4252

Yıllık getiriler için her yılın son işlem günündeki kapanış fiyatını seçeceğiz (tam yıl olmadığı için 2024’ü çıkarıyoruz).

annual = djia.groupby(djia.index.year).last().drop(2024)
annual
DJIA
Date
1885 39.4859
1886 41.2391
1887 37.7693
1888 39.5866
1889 42.0394
... ...
2019 28538.4400
2020 30606.4800
2021 36338.3000
2022 33147.2500
2023 37689.5400

139 rows × 1 columns

Ardından ardışık yıl sonu kapanışlarının oranı olan yıllık fiyat getirisini hesaplayacağız.

annual['Ratio'] = annual['DJIA'] / annual['DJIA'].shift(1)
annual
DJIA Ratio
Date
1885 39.4859 NaN
1886 41.2391 1.044401
1887 37.7693 0.915861
1888 39.5866 1.048116
1889 42.0394 1.061960
... ... ...
2019 28538.4400 1.223384
2020 30606.4800 1.072465
2021 36338.3000 1.187275
2022 33147.2500 0.912185
2023 37689.5400 1.137034

139 rows × 2 columns

Yüzde olarak göreli getiri de şöyledir.

annual['Return'] = (annual['Ratio'] - 1) * 100

En büyük kayıp ve kazanç yıllarında, 2008 mali krizi dışında uçların çoğunun 1960’lardan önce olduğunu görürüz.

annual.dropna().sort_values(by='Return')
DJIA Ratio Return
Date
1931 77.9000 0.473326 -52.667396
1907 43.0382 0.622683 -37.731743
2008 8776.3900 0.661629 -33.837097
1930 164.5800 0.662347 -33.765293
1920 71.9500 0.670988 -32.901240
... ... ... ...
1954 404.3900 1.439623 43.962264
1908 63.1104 1.466381 46.638103
1928 300.0000 1.482213 48.221344
1933 99.9000 1.666945 66.694477
1915 99.1500 1.816599 81.659949

138 rows × 3 columns

Yıllık getiri dağılımı şöyledir.

from empiricaldist import Cdf

cdf_return = Cdf.from_seq(annual['Return'])
cdf_return.plot()

decorate(xlabel='Yıllık getiri (yüzde)', ylabel='CDF')
plt.savefig('ripoff_etf1.png', dpi=300)
_images/69a0ad8ef435b50ff35d7ace9ab51799738c693ba9fd17eeb93920d6f8c9903c.png

Getiriyi %10’da sınırlamanın neden kötü olabileceği hemen görünür: sınır zamanın yaklaşık %45’inde, bazen büyük ölçüde aşılır.

1 - cdf_return(10)
np.float64(0.4492753623188406)

Uzun dönemli getiriler#

Aşağıdaki işlev başlangıç tarihi ve süre alıp iki oran hesaplar:

  • Gerçek yıllık getirilere dayalı toplam fiyat getirisi.

  • Yıllık getiriler 0 ile 10 arasında kırpıldığında toplam fiyat getirisi; negatifler 0, 10 üzeri 10 yapılır.

def compute_ratios(start=1993, duration=30):
    end = start + duration
    interval = annual.loc[start: end]
    ratio = interval['Ratio'].prod()
    low, high = 1.0, 1.10
    clipped = interval['Ratio'].clip(low, high)
    ratio_clipped = clipped.prod()
    return start, end, ratio, ratio_clipped

Bu işlevle The Economist’in S&P 500 analizini yineleyebiliriz. DJIA için 1980 başından 2023 sonuna sonuçlar şöyledir.

compute_ratios(1980, 43)
(1980, 2023, np.float64(44.93751117788029), np.float64(15.356490985533199))

Bu dönemde tampon ETF nominal dolar cinsinden 15 kattan fazla büyür, kayıp riski olmazdı. Endeks fonu ise yaklaşık 45 kat büyürdü; ETF kötü bir anlaşma olurdu.

Ancak kötü eski günlere gidersek 1900’de 43 yıllık yatırımcı tampon ETF ile 7,2 kat, endeks fonuyla 2,8 kat büyüyerek çok daha iyi durumda olurdu.

compute_ratios(1900, 43)
(1900, 1943, np.float64(2.8071864303140583), np.float64(7.225624631784611))

Karşılaştırmayı iki yönde göstermek için veri seçebiliyor gibiyiz; daha genel bakalım. 1886’dan başlayarak 1993–2023 aralığına kadar tüm 30 yıllık dönemlerin fiyat getirilerini hesaplayacağız.

duration = 30
ratios = [compute_ratios(start, duration) for start in range(1886, 2024-duration)]
ratios = pd.DataFrame(ratios, columns=['Başlangıç', 'Bitiş', 'Endeks Fonu', 'Tampon ETF'])
ratios.index = ratios['Başlangıç']
ratios.tail()
Başlangıç Bitiş Endeks Fonu Tampon ETF
Başlangıç
1989 1989 2019 13.160027 6.532125
1990 1990 2020 11.116693 6.368615
1991 1991 2021 13.797643 7.005476
1992 1992 2022 10.460407 6.368615
1993 1993 2023 11.417232 6.724757

Endeks fonu ile tampon ETF getirileri şöyledir.

ratios['Endeks Fonu'].plot()
ratios['Tampon ETF'].plot()

decorate(xlabel='Başlangıç yılı', ylabel='30 yıllık fiyat getirisi')
plt.savefig('ripoff_etf2.png', dpi=300)
_images/996b903c1c92b9423716a5bad5eb8d6232e5483ac5169d2042f68f81cb07cc63.png

Tampon ETF vaat edildiği gibi oynaklığı belirgin azaltır. Ancak yalnızca ara sıra iyi bir anlaşma olmuştur; benim ömrümde hiç olmamıştır.

ChatGPT’ye göre 1960’lardan beri hisse fiyatlarındaki güçlü büyümenin başlıca nedenleri “teknolojik gelişmeler, küreselleşme, finans piyasası yenilikleri ve elverişli para politikalarıdır”. Bunların gelecek 30 yılda süreceğini düşünüyorsanız tampon ETF’lerden kaçınabilirsiniz.