Python dili ve ta-lib kütüphanesini kullanarak Stokastik rsi değerini kolayca hesaplayabileceğini biliyor musun?
Stokastik RSI (StochRSI) Nedir?
Stokastik rsi bir göstergenin göstergesi olarak düşünmek gerekiyor. Aslında rsi göstergesinin üzerinde stokastik hesaplama yapılarak stokastik rsi bulunmuş olur.
Traderlar tarafından en çok sevilen, tercih edilen momentum indikatörlerinden bir tanesidir.
0.8 değeri ve yukarısı aşırı alım bölgesini, 0.2 aşağısı da aşırım satım bölgesini gösteriyor. Bu durum fiyatların yön değiştirebileceği konusunda bir gösterge olabilir.
Fiyatın aşırı alım bölgesinde olması her zaman fiyatın geri döneceği anlamına gelmez, tersi yani aşırı satım bölgesinde olması da fiyatın tekrar yukarı gideceği anlamına gelmez.
Formülünü vermek gerekirse:
StochRSI= (RSI - min[RSI]) / (max[RSI] - min[RSI])
Genelde periyot olarak 14 kullanılır. RSI anlık rsi değerini, min[RSI] 14 ardışık rsi değerinin minimum değerini, max[rsi] benzer şekilde 14 ardışık rsi değerlerinin maksimum değerini ifade eder.
StochRSI ilk olarak Tushar S. Chande ve Stanley Kroll tarafından 1994 yılında geliştirildi. Rsi ve stochastik göstergeleri gibi aşırı alım ve aşırı satım bölgelerini gösteriyor.
Fakat duruma göre bize daha hassas ve iyileştirilmiş sonuçlar sunabilir. Bu bakımdan stochrsi göstergesi traderlar tarafından sevilmekte ve tercih edilebilmektedir.
Dezavantajlarından bahsetmek gerekirse, hatalı sinyaller üretip çok çabuk değişmesi, volatil olabilmesi olarak değerlendirebiliriz.
Yazımda amaç tarihi ve genel anlamda ortaya çıkışı ve kullanım yöntemi konusunda detaya girmeden işin programlama tarafında nasıl yapılacağını göstermek olacaktır.
Stokastik rsi değerini, tradingview sitesi ile benzer bir şekilde hesaplayan tulip kütüphanesi var. Fakat ben yazdığım kripto uygulamalarında halihazırda zaten ta-lib kütüphanesini kullandığım için ekstra kütüphane kullanmaktan kaçınmak istiyorum.
İsteyenler tabi ki tulipindicators kütüphanesini kullanabilirler.
https://github.com/TulipCharts/tulipindicators
Ta-Lib ile Stokastik RSI Hesaplama
Ben yazımda, ta-lib ile nasıl hesaplanacağını göstereceğim.
Ta-lib kütüphanesini daha önceki yazılarımda bahsetmiştim. Ta-lib kütüphanesinde stochrsi değerini hesaplayan bir fonksiyon var.
Fakat herkes gibi ben de tradingview sitesindeki kullanımı tercih ediyorum.
Ta-lib kütüphanesindeki stochrsi metodunu direkt kullanırsak tradingview ile uyumlu olmayacaktır.
Bu yüzden bir kaç aşamadan geçirerek, istediğimiz sonuca ulaşabiliriz arkadaşlar.
# 1) ilk aşama rsi değerini hesaplıyoruz.
rsi = ta.RSI(close_array, timeperiod=14)
# 2) ikinci aşamada rsi arrayinden sıfırları kaldırıyoruz.
rsi = rsi[~np.isnan(rsi)]
# 3) üçüncü aşamada ise ta-lib stoch metodunu uyguluyoruz.
stochrsif, stochrsis = ta.STOCH(rsi, rsi, rsi, fastk_period=14, slowk_period=3, slowd_period=3)
Stochrsi göstergenin göstergesi demiştik hatırlarsan. Kodumda önce rsi değerini hesaplıyorum.
rsi arrayinden sıfırları eleyerek, kalan array üzerine stokastik uyguluyorum. Dikkat edilmesi gereken nokta ta-lib kütüphanesinin STOCHRSI metodunu değil, stoch metodunu uyguladığımız.
Örnek kodun tamamını görelim:
from binance.client import Client
import talib as ta
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime
import sys
import math
class BinanceConnection:
def __init__(self, file):
self.connect(file)
""" Creates Binance client """
def connect(self, file):
lines = [line.rstrip('\n') for line in open(file)]
key = lines[0]
secret = lines[1]
self.client = Client(key, secret)
def generateStochasticRSI(close_array, timeperiod):
# 1) ilk aşama rsi değerini hesaplıyoruz.
rsi = ta.RSI(close_array, timeperiod=timeperiod)
# 2) ikinci aşamada rsi arrayinden sıfırları kaldırıyoruz.
rsi = rsi[~np.isnan(rsi)]
# 3) üçüncü aşamada ise ta-lib stoch metodunu uyguluyoruz.
stochrsif, stochrsis = ta.STOCH(rsi, rsi, rsi, fastk_period=14, slowk_period=3, slowd_period=3)
return stochrsif, stochrsis
if __name__ == '__main__':
filename = 'credentials.txt'
connection = BinanceConnection(filename)
interval = '1d'
pair = 'BTCUSDT'
limit = 200
klines = connection.client.get_klines(symbol=pair, interval=interval, limit=limit)
open_time = [int(entry[0]) for entry in klines]
close = [float(entry[4]) for entry in klines]
close_array = np.asarray(close)
new_time = [datetime.fromtimestamp(time / 1000) for time in open_time]
new_time_x = [date.strftime("%d-%m-%y") for date in new_time]
stochasticRsiF, stochasticRsiS = generateStochasticRSI(close_array, timeperiod=14)
plt.figure(figsize=(11, 6))
plt.plot(new_time_x[114:], stochasticRsiF[100:], label='StochRSI fast')
plt.plot(new_time_x[114:], stochasticRsiS[100:], label='StochRSI slow')
plt.xticks(rotation=90, fontsize=5)
plt.title("Stochastic RSI Plot for BTC/USDT (1d)")
plt.xlabel("Open Time")
plt.ylabel("Value")
plt.legend()
plt.show()
Önceki kripto bot yazısında detaylandırarak anlattığım gibi, binance apilerini kullanmak için binance connection objesi oluşturuyorum. 1 günlük BTCUSDT mum grafiğini çekiyorum.
Grafiğin sığması için son 100 mumu alıyorum. x ekseninde zamanı ise son 86 mumu alıyorum. Rsi arrayinin ilk 14 elemanı geçersiz sayı olduğu için onları atlıyorum.
Çektiğim mum verilerine göre rsi değerlerini hesaplıyorum. rsi üzerinden tekrar stokastik arrayini oluşturuyorum.
Stokastik biri hızlı diğeri yavaş olmak üzere iki değer üretiyor. stochasticRsiF değişkenine hızlı değerleri, stochasticRsiS yavaş olan değerleri veriyorum.
Karşılaştırmak için öncelikle esas aldığımız tradingview uygulamasından stoch rsi grafiğine bakalım:
Şimdi de matplotlib’in ürettiği grafiğe bakalım:
Birbirinin aynısı olduğunu görmüş oluruz. Mission completed 🙂
Kodun içinde anlaşılmayan bir yer olursa, yorum olarak belirtebilirsin. StochRsi değerini kendi botun için kullanmak istersen, örnek kodu değiştirerek kolayca uyarlayabilirsin.
Hocam pmax i yazma ihtimaliniz var mı
pmax indikatörüne baktım.
Biraz uğraştırıcı. Vakit bulabilirsem yapacağım.
Teşekkürler ederim
Hocam birde ben bir rasberiyy 3 veya 4 alsam bu stratejileri devamlı çalıştırabilir mi , yani bulut kiralamak yerine ,evde bulut yapmak. Malum bilgisayarı devamlı açık bırakmak pek olmuyor
Ben digital ocean kullanıyorum. Aylık 5 dolarlık bir sanal makina işimi görüyor.
Bahsettiğin rasperry cihazı stabil bir çalışma ortamı sunuyorsa neden olmasın?
Teşekkürler
Hocam müsait olduğunuzda nasıl bi sistemde kullansak daha iyi sonuç alırız RAM işlemci sunucu bölgesi vs yazarmısınız
Merhaba Hocam,
Ben bu işler için raspberry pi kullanıyorum. Bir sıkıntım yok ama bu binance’ ın baglantıyı kesmesine bir çözüm üretemedim daha.
Sizde böyle bir sorun var mı?
Bağlantı kesilmesi olmaması için, periyodik olarak binance bağlantısını yeniden oluşturuyorum.
bağlantı kesmesinin çözümünü bende bulamadım.Yeniden oluşturun derken tam olarak neyi kastedityorsunuz
Binance client objesini yeniden oluşturmayı kastediyorum. python-binance kütüphanesi içerisinden kullanmış olduğumuz obje.
Bu konu hakkında bir makala yazabilirmisiniz
hocam merhaba öncelikle elinize sağlık, benim bi sorunum var yaptığınız kodu for döngüsü ile verinin bir kısmını çektikten sonra hata alıyorum. Backtest için kullanacağım bu kodu. Lütfen sorunu çözmem için yardımcı olun
döngü:
for i in range(len(close)):
if np.isnan(stochrsif[i]) or np.isnan(stochrsis[i]):
pass
else:
print(round(stochrsif[i],2), round(stochrsis[i],2) )
hata:
19.75 29.55
7.98 18.94
2.49 10.07
0.87 3.78
2.29 1.88
Traceback (most recent call last):
File “C:/Users/User/PycharmProjects/pythonProject2/venv/bot-deneme.py”, line 145, in
if np.isnan(stochrsif[i]) or np.isnan(stochrsis[i]):
IndexError: index 486 is out of bounds for axis 0 with size 486
Hata mesajda belirtiliyor aslında, 486 elemanlı arrayin 0’dan 485’e kadar erişebilirsiniz. close arrayinin uzunlugu ile stochrsif arrayinin uzunluğu aynı değil.
Kodu buna göre değiştirmeniz gerekiyor.
Hocam Merhaba,
Quantitative-Qualitative-Estimation-QQE indikatörü var yine Kıvanç hocaya ait.
Bunu koda dökme şansınız var mı?
İyi çalışmalar.
Şu an öyle bir düşüncem yok.
Merhabalar hocam,
stochasticRsiF ve stochasticRsiS’i kendi aralarında kıyaslamak istiyorum.
Yani, stochasticRsiF mavi diyelim, stochasticRsiS turuncu diyelim.
Mavi çizgi, turuncunun üstüne geldiği zaman al verdireceğim, turuncu mavinin üstüne geldiği zaman ise sat.
If döngüsü kurduğumda,
” Traceback (most recent call last):
File “C:\Users\…\mycrpytoeos.py”, line 59, in
if stochasticRsiF > stochasticRsiS:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() ” hatası alıyorum.
Bu parametreleri if döngüsü kurabilmek için nasıl tanımlamalıyım ?
İyi günler dilerim..
Hocam öncelikle elinize sağlık, türkçe içerikli harika bir çalışma olmuş.
Kodunuzu direk kullandığımda hiç bir sorun olmadan çalıştırıyorum, fakat siz interval = ‘1d’ yapmışsınız, ben 1 gün değil 5 dakikalık mumlar oluştursun istiyorum. interval = ‘5m’ yapıyorum ama düm düz bir çizgi oluşturuyor. başka hangi değerleri değiştirmem gerekir?
Zaman aralığını yani x eksenini de değiştirmeniz gerekiyor bu durumda.
O kısım günleri ifade ederken, artık 5 dakikalık zaman aralıklarını göstermesi gerekiyor.
merhaba o kısım dediğiniz yeri söyler misiniz?
Hocam merhabalar,
supertrend ve RSI birşetirmeyi denediniz mi hocam. iki kütüphane uyum arz eder mi.
mesela;
ALIM
eger:
rsı %40 ın altında ise
al sinyalide geldi ise
al
degilse
rsı %40 ın üstünde ise
al sinyalide geldi ise
alma
SATIM
eger
rsı %60 in üstünde ise
sat sinyalide geldi ise
sat
degilse
rsı %60 in altında ise
sat sinyalide geldi ise
satma
hocam merhabalar. MACD örneği yapabilir misiniz?
bir yazınızda macd ve rsi hesaplayıp koşulu sağladığı zaman al demişsiniz ama onu bayağı inceledim çözemedim.
macd, macdsignal, macdhist diye belirtmişsiniz. Değerleri print ediyorum gerçek değerleri ile uyuşmuyor. yardımcı olur musunuz?
Hocam merhabalar sitenizi yeni inceliyorum verdiğiniz bu kodu nasıl kullanabilirim yani bir eğitim yazınız varmı hangi programlar vasıtası ile nasıl bir yol izleyerek yapabilirim .
Teşekkürler.