Sistem geliştirme borsa mı dolar mı?

Adnan Salih 24 Kasım 2016, 10:14

 

Sistem geliştirme konusunda geçtiğimiz haftadan bu yana çeşitli konuları aldık.

Sistem geliştirirken çok çeşitli araçlar kullanılabilir: Matriks/Metastock en yaygın kullanılan araç. Metatrader ise foreks tarafında bir başka çok kullanılan program. Excel fiyat/performans ve görsellik alanlarında ön plana çıkıyor, kullanımı nispeten kolay. Matlab, R, Python, C, C++ gibi diller de alım satım sistemi tasarlamada kullanılabiliyor.

Programlama dilleri ile yapılan uygulamalar daha çok performansa dönük ve Excel /Metastock türevlerine göre daha esnek olabiliyorlar.

Sistem tasarlarken öncelikle bir gözlemimiz olması gerekir. Daha önce bu köşede dolar mı borsa mı konulu bir sistem geliştirip kullanmıştım. Bugün bu konuyu daha detaylandırıp aynı zamanda güncelleyeceğim.

Yurtdışı bloglar yatırım sitelerinde en popüler yatırım şekillerinden biri 60/40 portföy olarak nitelenen usuldür.

60/40 nasıl çalışır?

Birbiri ile ters hareket eden birinden para çıktığında diğerine para giden iki varlık sınıfı kullanılır. Amerikan örneklerinde bu SPY ve TLT olur. SPY, SP500 endeksinin borsa yatırım fonu, TLT ise 20 yıl ve üstü Amerikan bonolarına yatırım yapan borsa yatırım fonudur. Amerika’da para bono ve borsa arasında hareket eder.

60/40 sisteminde belirli bir süreye göre fiyat değişimlerine bakılır, hangi varlık sınıfı daha iyi getiri sağlamış ise yine belirlenen süre kadar o varlık sınıfı portföyde %60 oranında taşınır. Diğeri ise %40 olur.

Örnekleyelim.

Sistem son 3 ayın getirisine bakıp bir ay pozisyon taşısın.

SPY: %10

TLT %1

Bu durumda bir ay boyunca portföyde %60 SPY, %40 da TLT olacaktır.

Bu örneği Türkiye’ye uygulayabilir miyiz sorusu ile başlayabiliriz.

Uygulayabiliriz ama Türkiye’de söyle bir sorun var: Uzun vadeli bonolar ile borsa birbirine çok benzer hareket ediyor. Daha açık söylemek gerekirse bonolar güvenli liman olarak algılanmıyor.

Güvenli liman olarak neyi kabul edebiliriz? Doğal seçim mevduat olarak görünüyor. Bir diğer seçim ise dolar olabilir.

Mevduat seçiminde veri toplamak çok zor, ilave olarak mevduat fiyatları çok sıklıkla değişmiyor. Mevduat kullansak o zaman borsa getirisi mevduatı aştığında yatırım yapacağız demek gerekir. Bu da iyi bir sistem olabilir, denenmesi gerekir. Sistem borsa mı mevduat mı olabilir.

USD konusu ise biraz daha makul. Veri elimizde mevcut, borsa ile ters hareket ediyor.

Sistemi tasarlamaya geçebiliriz.

Bugün Matlab kullanacağım.

Matlab çoğu yatırımcımıza zor gelecektir bunun bilincindeyim. Bununla birlikte biraz çalışma ve alıştırma ile öğrenilmeyecek bir uygulama yok.

Veri USDTL ve XU100 kapanış değerlerini içerecek. (27/1/10-23/11/16)

USD tuttuğumuzda faiz getirisi yazmayacağız.

Öncelikle dağılıma kara vermemiz gerekiyor: 60/40 mı yoksa 100/0 mı olsun?

100/0 olarak seçelim:

clear

clc

load('bonoborsa22');

maxBorsa=1;

Kaç günlük fiyat değişimine bakmak gerekiyor sorusunun cevabı 10 olsun:

momentumDay=10;

Günlük getirileri hesaplayalım:

dailyRetBorsa=calcRet(XU100,1);

dailyRetBono=calcRet(dirtyPx,1);%1501 getiri

dailyRetUSD=calcRet(USD,1);%usd getiri

Getirileri hesaplarken calcRet isimli bir fonksiyon ürettim.

Detayına bakalım:

function ret=calcRet(data,ndays)

ret=data./lag(data,ndays)-1;

ret(isinf(ret))=0;

end

Fonksiyonda yer alan lag ibaresi vektörde geriye gidip değerleri almamızı sağlıyor.

İşlemleri kontrol etmek için aşağıdaki satırları yazdım:

dailyReturn=bonoBorsaTrade(XU100,dirtyPx,Date,momentumDay,maxBorsa); %Bono-Borsa Günlük Getiri

dailyReturn2=bonoBorsaTrade(XU100,USD,Date,momentumDay,maxBorsa); %Borsa-USD Günlük Getiri

Yukarıdaki satırlarda da bonoBorsaTrade isimli bir fonksiyon kullandım. Detayına bakalım:

function dailyPortRet=bonoBorsaTrade(asset1px,asset2px,date,nMomentum,maxAsset1)

date=eomdate(date);

asset1Ret=calcRet(asset1px,nMomentum);

asset2Ret=calcRet(asset2px,nMomentum);

asset1daily=calcRet(asset1px,1);

asset2daily=calcRet(asset2px,1);

asset1Long=(asset1Ret>asset2Ret)&datenum(date)>lag(datenum(date));

asset1LongExit=(asset1Ret<asset2Ret)&datenum(date)>lag(datenum(date));

asset1Pay=NaN(length(asset1Long), 1);

asset1Pay(asset1Long)=maxAsset1;

asset1Pay(asset1LongExit)=1-maxAsset1;

asset1Longs=fillMissingData(asset1Pay);

asset2Longs=1-asset1Longs;

asset1Longs(isnan(asset1Longs))=0;

asset2Longs(isnan(asset2Longs))=0;

dailyPortRet=lag(asset1Longs).*(asset1daily)+ lag(asset2Longs).*(asset2daily);%günlük portföy getirisi

dailyPortRet(isnan(dailyPortRet))=0;

end

Fonksiyon 1’nci ve ikinci varlık fiyat serisini alıyor, gerekli tüm hesaplamaları yapıyor. Çıkışta sadece portföy getirisi olan bir vektör getiriyor.

Portföy getirilerini elde ettikten sonra portföy metriklerini elde etmek gerekir. Borsa-dolar ikilisi için aşağıdaki satırları kullandım:

[borsaUsdY,borsaUsdSharpe,maxDD,maxDDD,drawdown]=portMetrics(dailyReturn2);

5 adet çıktı üreten bir fonksiyon kullandım, portMetrics. Detayları:

function [apr,sharpe,maxDD,maxDDD,drawdown]=portMetrics(portRet)

apr=prod(1+portRet).^(252/length(portRet))-1;

sharpe=sqrt(252)*mean(portRet)/std(portRet);

%Max DD Hesaplama - USDBORSA için

cumulpoints=cumsum(portRet);

drawdown=zeros(size(cumulpoints)); % initialize drawdowns to zero.

drawdownduration=zeros(size(cumulpoints)); % initialize drawdown duration to zero.

highwatermark=zeros(size(cumulpoints)); % initialize high watermarks to zero.

for t=2:length(cumulpoints)

      highwatermark(t)=max(highwatermark(t-1), cumulpoints(t));

    drawdown(t)=(cumulpoints(t))-(highwatermark(t)); % drawdown on each day

    if (drawdown(t)==0)

        drawdownduration(t)=0;

    else

        drawdownduration(t)=drawdownduration(t-1)+1;

    end

end

maxDD=min(drawdown); % maximum drawdown

maxDDD=max(drawdownduration); % maximum drawdown duration

end

Portföyün en iyi yerinden en kötü yerine olan düşüşünü, bu düşüşten kaç günde çıktığını, yıllık ortalama getirisini, sharpe rasyosunu hesapladık. Grafikte kullanmak üzere drawdown değerlerini de ürettik.

Sistem bu haliyle tamam.

Tüm işlemleri doğru olarak gerçekleştiriyor. Fakat yeterli değil.

Sistemin ne ürettiğini grafik olarak göstermeliyiz

Sistemin metriklerini ekranda göstermeliyiz.

Bunun için de kod satırları ilave etmek gerekiyor. Kalabalık olmaması ve teknik olduğu için göstermeyeceğim. Onun yerine grafiklere bakalım:

Sonuçlara bakalım:

Başlangıç Tarihi: 27/01/2010      Bitiş Tarihi: 23/11/16

Yıllık Portföy Getirileri: BorsaUSD=20.79 USD=13.12 Borsa=5.03 BorsaBono=-0.98

Yıllık Sharpe Rasyoları: BorsaUSD=1.22 USD=1.23 Borsa=0.33 BorsaBono=0.04

En yüksek kayıp (Yüzde): -20.37              Kaybın geri alınması ne kadar sürdü: 178 gün

Sistemi geliştirdikten sonra istediğimiz gibi oynayıp sonuçlara bakabiliriz. 100/0 yerine 120/-20 yapıp sonuçlarına bakalım:

Başlangıç Tarihi: 27/01/2010      Bitiş Tarihi: 23/11/16

Yıllık Portföy Getirileri: BorsaUSD=24.52 USD=13.12 Borsa=5.03 BorsaBono=-3.11

Yıllık Sharpe Rasyoları: BorsaUSD=1.13 USD=1.23 Borsa=0.33 BorsaBono=-0.04

En yüksek kayıp (Yüzde): -25.85              Kaybın geri alınması ne kadar sürdü: 222 gün

Sistem son 3-4 aydır dolar yükselişine pozisyonlanmış durumda borsada yatırım ikincil seviyede.

Kodları incelemek isteyenler bu bağlantıdan indirebilirler

Bol kazançlar.

Sayfada yer alan bilgiler tavsiye niteliği taşımayıp yatırım danışmanlığı kapsamında değildir. Yatırımcı profilinize uymayabilir.

Yorumlar

  • yorumcu25 Kasım 2016 18:19Keşke sistemin tersini (çok getirende yüksek pozisyon almak yerine az getirende pozisyonu artırmak) da deneyip karşılaştırsaydınız.

    (%0) (%0)
  • vatandaş24 Kasım 2016 17:12Ya hacı, matlap 4000 tl...Kağıt kalem 5 tl ve 30 dk...excel zaten var yani beleş süre 15 dk...Hafıza bedava..

    (%0,00) (%100,00)
  • ali24 Kasım 2016 12:46bencede bugüm dolar ve borsa için milat olur. dolar düşer borsa çıkar

    (%100,00) (%0,00)
  • mali24 Kasım 2016 12:29Bu kadar karışık analize gerek sıradan insanlar dolardan yana ve kazandıkça kazanıyorlar....

    (%0,00) (%100,00)
  • ralli24 Kasım 2016 11:48bugünden sonra borsa doları ezip geçecek.

    (%80,00) (%20,00)

Diğer Yazıları