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
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.
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)
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)
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.