DEV Community

Cover image for Borsa Veri Analizi ve Otomasyonunda Ustalaşmak İçin 8 Kritik Python Paketi
Serdar Tavukçu for Serdar Tavukçu

Posted on

Borsa Veri Analizi ve Otomasyonunda Ustalaşmak İçin 8 Kritik Python Paketi

Borsa verileriyle uğraşmaya başladığımda karşıma çıkan karmaşa beni çok yormuştu. Her şey birbirine giriyor, hangi kütüphanenin ne işe yaradığını anlamak zaman alıyordu. Bu paketleri gerçek işlerde kullandım, sırasıyla anlatıyorum. Borsa verilerini temizlemekten model kurmaya kadar ihtiyacım olan her şeyi bu sekizli ile çözdüm.

1. pandas

Pandas, veri analizi, zaman serileri ve istatistiksel işlemler için güçlü veri yapıları sunar. BIST verilerini temizlemek, zaman serilerini hizalamak ve teknik göstergeleri hesaplamak için temel kütüphanedir. Ben bunu her sabah gelen ham fiyat verilerini düzene sokmak için kullanıyorum. Veri setimdeki eksik günleri tespit edip onları doldurmak veya farklı zaman dilimlerindeki verileri birleştirmek için kullanıyorum.

Gerçek bir senaryoda, 5 yıllık BIST 100 verisini çekerken bazı günlerin tatil nedeniyle eksik olduğunu fark ettim. Pandas içindeki reindex metodunu kullanarak tüm takvim günlerini eşitledim ve eksik değerleri ffill yöntemiyle bir önceki günün kapanış fiyatıyla doldurdum. Bu işlem, teknik göstergelerin hesaplanırken hata vermesini engelledi.

Tuzağı ise büyük veri setlerinde bellek yönetiminin zayıf olmasıdır. Yanlış yapılandırılmış copy işlemleri performansı ciddi oranda düşürür. Bir keresinde tüm veriyi bellekte kopyalamaya çalıştığım için bilgisayarım tamamen donmuştu. Veriyle çalışırken her zaman view mi yoksa copy mi üzerinde işlem yaptığını kontrol etmelisin. Bellek kullanımını düşürmek için veri tiplerini optimize etmeyi, örneğin float64 yerine float32 kullanmayı alışkanlık haline getirdim.

2. yfinance

Yahoo Finance üzerinden güncel BIST ve küresel piyasa verilerini hızlı çekmek için kullanılır. Borsa verilerini analiz etmeden önce o veriyi bir yerden almam gerekiyordu ve bu kütüphane en hızlı yol oldu. Tüm geçmiş veriyi tek bir fonksiyonla çekebilmek çok büyük rahatlık sağlıyor.

Tuzağı veri kalitesinin bazen hatalı olabilmesidir. API sınırlamaları nedeniyle yoğun isteklerde engellenebilirsin. Bir gün arka arkaya çok fazla hisse verisi çekmeye çalıştığımda sistem beni birkaç saatliğine kara listeye aldı. Bu yüzden isteklerini zamana yayman ve gelen veriyi her zaman kontrol etmen gerekiyor. Veri bütünlüğünü sağlamak için çektiğim verideki boş satırları mutlaka kontrol eden bir doğrulama fonksiyonu ekledim.

3. scikit-learn

Fiyat tahminleme ve trend analizi için basit makine öğrenmesi modellerini eğitmekte kullanılır. Verilerimi temizledikten sonra bir sonraki günün fiyat hareketini tahmin etmek için bu kütüphanedeki regresyon modellerini kullanıyorum. Kurulumu kolay ve dokümantasyonu çok açık.

Tuzağı zaman serisi verilerinde look-ahead bias yani gelecekteki veriyi geçmişe sızdırma hatasına düşmenin çok kolay olmasıdır. Modelimi eğitirken test verisini eğitim verisinin içine yanlışlıkla dahil ettim ve modelim harika sonuçlar veriyormuş gibi göründü. Gerçek hayata geçtiğimde ise tüm tahminler çöp oldu. Bu hatayı gidermek için veriyi karıştırmadan, sadece geçmişe dayalı zaman pencereleriyle train ve test setlerine ayırdım.

4. ta

Technical Analysis Library in Python, RSI, MACD, Bollinger Bantları gibi yüzlerce teknik analiz indikatörünü tek satırda hesaplamanızı sağlar. Kendi indikatörlerimi sıfırdan yazmak yerine bu kütüphaneyi kullanmak bana saatler kazandırdı.

gorsel

import ta
import pandas as pd

df = pd.read_csv('hisse_verisi.csv')
df['rsi'] = ta.momentum.rsi(df['close'], window=14)
Enter fullscreen mode Exit fullscreen mode

Bu kod parçası, pandas veri çerçevesindeki kapanış fiyatlarını kullanarak 14 günlük RSI değerini hesaplıyor. Satır satır açıklamak gerekirse, önce ta kütüphanesini çağırıyoruz, ardından momentum altındaki rsi fonksiyonuna fiyatları veriyoruz ve 14 günlük bir pencere belirliyoruz. Sonuçları doğrudan veri çerçevesine ekliyoruz.

Tuzağı hesaplama metodolojilerinin her platformda aynı olmayabilmesidir. Bu yüzden strateji sonuçlarınız aracı kurumunuzla uyuşmayabilir. Ben kendi hesapladığım RSI değeri ile aracı kurumun ekranındaki değerin farklı olduğunu gördüğümde çok şaşırmıştım. Hangi formülü kullandıklarını iyice araştırman şart. Özellikle hareketli ortalama hesaplamalarında kullanılan ağırlıklandırma yöntemleri sonuçları ciddi oranda değiştirebiliyor.

5. backtrader

Yazdığınız trading stratejilerini geçmiş verilerle test edip performansını ölçmek için kullanılır. Bir strateji kurduktan sonra onu hemen canlı piyasaya sürmek yerine bu kütüphane ile geçmiş verilerde nasıl çalıştığını görüyorum.

Backtrader kullanırken en büyük zorluğum, strateji sınıfını tanımlarken gereken standart yapıydı. Stratejimi test etmek için önce bir Cerebro motoru oluşturdum, veriyi sisteme yükledim ve ardından buy/sell sinyallerini belirleyen bir sınıf yazdım. Bu yapı, stratejinin her adımda ne yapacağını net bir şekilde tanımlamamı sağladı.

Tuzağı dokümantasyonunun yetersiz olmasıdır. Karmaşık stratejilerde çok fazla boilerplate kod yazmanızı gerektirir. Basit bir stratejiyi test etmek için bile onlarca satır kod yazmak zorunda kaldığımda çok zorlanmıştım. Yine de sistemin sağladığı disiplin, yazdığım kodun hatalarını görmek açısından çok değerliydi. Karmaşık stratejilerde hata ayıklamak için strateji sınıfının içine print komutları yerleştirerek her bir bar kapanışında sistemin verdiği sinyalleri log dosyasına kaydettim.

6. xgboost

Borsa verilerindeki karmaşık ve doğrusal olmayan paternleri yakalamak için en güçlü gradyan artırma modelidir. Scikit-learn ile basit modelleri kurduktan sonra daha derin analizler yapmak istediğimde bu kütüphaneye geçtim.

Tuzağı aşırı öğrenmeye yani overfitting durumuna çok yatkın olmasıdır. Hiperparametre ayarı yapılmazsa yanıltıcı sonuçlar verir. Modelim geçmiş veride yüzde yüz başarı gösterirken gerçek piyasada hiçbir tahmin tutmuyordu. Parametreleri ince ince ayarlamadan modele güvenmemen gerekiyor. Özellikle öğrenme oranını ve ağaç derinliğini kısıtlayarak modelin genelleme yeteneğini artırdım.

7. SQLAlchemy

Analiz ettiğiniz verileri veya oluşturduğunuz modellerin sonuçlarını bir veritabanında saklamak için kullanılır. Çektiğim verileri sürekli dosyada tutmak yerine bir veritabanına yazmak çok daha düzenli.

Tuzağı ORM katmanının çok yüksek frekanslı verilerde ham SQL sorgularına göre oldukça yavaş kalmasıdır. Veri akışı çok hızlı olduğunda veritabanına yazma işlemi birikmeye başladı ve sistem yavaşladı. Eğer saniyede binlerce işlem yapmıyorsan sorun yok ama hızı önemseyen biriysen dikkatli olmalısın. Performans kaybını önlemek için toplu veri ekleme yani bulk insert yöntemlerini kullanarak veritabanı bağlantı sayısını minimize ettim.

8. schedule

Belirli saatlerde borsa verilerini çekmek veya analiz raporlarını otomatik çalıştırmak için basit bir zamanlayıcıdır. Her sabah piyasa açılmadan önce verileri otomatik çekip raporlamam gerektiğinde bu kütüphaneyi kullanıyorum.

Tuzağı sadece tek bir iş parçacığında çalışmasıdır. Uzun süren bir işlem diğer görevlerin zamanlamasını aksatır. Bir keresinde veri çekme işlemi çok uzadığı için raporlama görevi vaktinde başlayamadı. Görevlerinin süresini iyi hesaplaman lazım. Zamanlama çakışmalarını önlemek için her görevin kendi süresini ölçen bir sayaç mekanizması kurdum ve uzun süren işlemleri ayrı iş parçacıklarına taşıdım.

gorsel

Toparlarsak

Araç seçimi zeka değil tekrar meselesi. Aynı işi yaparken aynı aracı kullanmak sana zaman kazandırıyor. Önce bu paketleri kendi bilgisayarında küçük veri setleriyle dene. Hemen büyük modeller kurmaya çalışma. Önce veriyi pandas ile düzenle, yfinance ile çek, ta ile indikatör ekle ve schedule ile otomatiğe bağla. Sonra makine öğrenmesi kısmına geçersin. Bir sonraki adım olarak kendi basit stratejini yazıp backtrader üzerinden test etmeyi dene. Hatalar yapacaksın, ben de yaptım ama bu şekilde öğreniliyor. Kodunu yaz, çalıştır, hata al, düzelt ve tekrar dene. Borsa verisi sabır ister, kod yazmak da öyle. Başarıya giden yol, araçların sınırlarını bilmekten ve onları doğru senaryolarda kullanmaktan geçiyor. Bugün bir kütüphaneyi öğrenip basit bir veri çekme betiği yazarak başlayabilirsin. Yarın ise bu veriyi analiz edip stratejini test etmeye odaklanmalısın. Adım adım ilerlediğinde karmaşık sistemlerin aslında basit parçaların birleşimi olduğunu göreceksin.

Top comments (0)