Geçen hafta Powershell üzerinde yaptığım “Şirket Bilançolarını toplu indirme” güncellemesine rağmen aldığım mail ve DM’ler sonucu inat edip python kodunu yazmaya karar verdim. Eleştrilerden biri Toplu Şirket olmayışı, tek tek şirket girildiği idi. Bir diğer eleştri ise fixed yıllar olduğu için değişiklik yapılamadığıydı. Her nekadar bunları baştan belirtsem de, haftasonu üzerine biraz düşünüp, kabaca anahatlarını çizdiği python temelli uygulamayı bugün yazdım ve umarım herkes çektiğim kaynak kapanana kadar rahatça kullanabilir.
Önce çalışan “kanıt” fotoğraflarını paylaşayım ki, çalışmıyor/çalıştıramadık/script bozuk gibi mailler ve yorumlar gelmesin.
Çalıştırdığınızda aşağıdaki gibi bir ekran görüyor olacaksınız. Bu ekranda hisse senetlerinizi, yıl bazında çekilen dönemlerini, request sonuç dönüş kodunu, ne kadar sürede requestin tamamlandığını ve sonrasında excele aktarılan verilerin temel hallerini göreceksiniz. Unutmayalım ki bu sadece bilgi ekranı, belki sonuçları teyit etmek için de kullanabilirsiniz. Boş ekran görmekten iyidir.
Büyütmek için Resmin üzerine tıklayın
Bu ekran çalışmasını sonlandırdıktan sonra aynı dizinde bir excel dosyası göreceksiniz. Excel dosyası ismi, çoklu çalıştırma sonucu dosyaların karışmaması için zaman damgası ile başlıyor.
Büyütmek için Resmin üzerine tıklayın
Bu excel dosyasını açtığınızda uygulama içine girdiğiniz Hisse senetlerinizi istediğiniz dönemlerin verilerine göre aşağıdaki göreceksiniz. Verisi olmayan dönemleri boş olarak göreceksiniz.
Büyütmek için Resmin üzerine tıklayın
Peki hisse senetlerini ve dönemleri nasıl set edeceğiz. O da gayet kolay. Kod içinde 17 ve 18. satırlarda aşağıdaki gibi bir alan bulunuyor, orayı istediğiniz gibi düzenleyebilirsiniz.
Büyütmek için Resmin üzerine tıklayın
Scriptin sorunsuz çalışması için kurmamız gereken modüller şöyle; Requests, urllib3, xlsxwriter ve tqdm. PIP ile isimlerini kullanarak kurabilirsiniz.
PIP install request
gibi…
Modüllerin açıklama, kullanım ve kurulum yardımı için Python’ın sitesini kullanabilirsiniz.
request : https://pypi.org/project/requests/
urllib3 : https://pypi.org/project/urllib3/
xlsxwriter : https://pypi.org/project/XlsxWriter/
Son olarak özellikle UVY için kafa yoran arkadaşlarıma destek olmak amacıyla bu kodu hazırladığımı ve sonuçları ile ilgili her türlü sorumluluk reddimi peşinen yazmış, belirtmiş olayım. Ek olarak veriyi çekip düzenlediğim kaynak adres var oldukça kodun çalışacağını, kaynak kapandığında uygulamanın da ömrünü tamamlamış olacağını da söylemek isterim. Kod için çok özenmediğimi, çalışan ve sonuç üreten bir uygulama olmasının yeterli olacağını düşünerek yazdığımı da lütfen göz önünde tutunuz.
Fikir vermesi açısından daha önce yazdığım şu iki yazıyı da okumanızı rica edeceğim;
ve finalde de kodu paylaşayım. Umarım yatırımlarınızda güzel fikirler verebilecek çalışmalarda kullanırsınız;
# -*- coding: utf-8 -*- """ @author: Hakan Müştak @2022 #hmustak @mail: hakan[@]mustak.org @web: mustak.org @social: twitter.com/hmustak """ import requests, time, urllib3, xlsxwriter from datetime import datetime from tqdm import tqdm # AYAR YAPMANIZ GEREKEN ALAN BURASI ---------------------------- hisseler = ["EREGL", "TOASO", "BRISA", "VESBE", "TTRAK", "FROTO"] yillar = [2022, 2021, 2020, 2019, 2018] # -------------------------------------------------------------- # İhtiyaç duyulan değişkeni dizi ve sabitler yillar.sort(reverse=True) request_link = 'https://www.isyatirim.com.tr/_layouts/15/IsYatirim.Website/Common/Data.aspx/MaliTablo' request_parametreler = [] request_gelen_json = dict() start_zaman = time.time() zaman_hassasiyet = 3 # digit bekleme = 3 checksum = 147 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # --------------------------------------------------------------------------------------------------------------------- # Fonksiyonlar # --------------------------------------------------------------------------------------------------------------------- # --------------------------------------------------------------------------------------------------------------------- # Dönem Kontrolü if yillar[-1] <= 2016: print("2017 öncesi değerlerde sorun olduğu için scriptin kullanımı uygun değil...") yillar = [2022, 2021, 2020, 2019, 2018, 2017] yillar.sort(reverse=True) # Excel Workbook'u oluşturalım now = datetime.now() dosya_ismi = "{d}_Toplu_Hisse_Sonuclari.xlsx".format(d=now.strftime("%Y-%m-%d-%H-%M-%S")) workbook = xlsxwriter.Workbook(dosya_ismi) # Hisselerin isminde sheetler oluşturuyoruz for i in hisseler: worksheet = workbook.add_worksheet(i) # Request modülü için parametrelerin hazırlanması def parametre_hazirlama(): for h in hisseler: for y in yillar: if (y >= 2014): request_parametreler.append({"companyCode": h, "exchange": "TRY", "financialGroup": "XI_29", "year1": y, "period1": "12", "year2": y, "period2": "9", "year3": y, "period3": "6", "year4": y, "period4": "3"}) else: pass # --------------------------------------------------------------------------------------------------------------------- # Request'lerin uygulanması ve json nesnesinin oluşturulmasıt def req_olusturulmasi(): for p in tqdm(request_parametreler, desc="Parametreler olusturuluyor", colour="blue", bar_format="{desc:<30.30}{percentage:3.0f}%|{bar:20}{r_bar}", unit=" link"): req_talebi = requests.get(request_link, verify=False, params=p) # hata versiği için doğrulamayı kapattım indikator = "{hisse}-{yil}".format(hisse=p["companyCode"], yil=p["year1"]) # Ekranda da gösterelim ki, hareket olsun, tabi önce hazırlayalım request_gelen_json[indikator] = req_talebi.json() # Talebi işleyelim time.sleep(bekleme) # Hataya izin vermemek adınaveriyi biraz gecikmeli almakta fayda var # --------------------------------------------------------------------------------------------------------------------- # Request'le gelen verileri yazalım def geleni_goster(): now = datetime.now() # Excele zaman damgasını basmak için col = 3 # dinamik yazmanın başlayacağı kolon hisse_kontrol = "" # hissenin değiştiğini anlamak için kullandığım değişken for key in tqdm(request_gelen_json, desc="Excel dosyası oluşturuluyor", colour="#00ff00", bar_format="{desc:<30.30}{percentage:3.0f}%|{bar:20}{r_bar}", unit=" rec"): hisse = key.split("-") # Çözümleme BAŞLIK row = 2 if hisse_kontrol != hisse[0]: col = 3 # hisse değişti ise kolonu 3'e sıfırla # exceli şekillendirmeye başlıyoruz worksheet = workbook.get_worksheet_by_name(hisse[0]) worksheet.write(0, 1, now.strftime("%d/%m/%Y %H:%M:%S")) worksheet.write(0, 7, "Hakan Müştak tarafından kodlanmıştır : www.mustak.org") worksheet.write(1, 1, "HİSSE") worksheet.write(1, 2, "KOD") worksheet.write(1, 3, "KALEM") # Verileri döndürüp excele yazan döngü for i in request_gelen_json[key]["value"]: # ilk 3 kolonun verisi worksheet.write(row, 1, hisse[0]) worksheet.write(row, 2, i["itemCode"]) worksheet.write(row, 3, i["itemDescTr"]) # tarih ve dönemi içeren satır worksheet.write(1, col + 1, "{y}/12".format(y=hisse[1])) worksheet.write(1, col + 2, "{y}/9".format(y=hisse[1])) worksheet.write(1, col + 3, "{y}/6".format(y=hisse[1])) worksheet.write(1, col + 4, "{y}/3".format(y=hisse[1])) # AutoFit olmadığı için kendi fitini kendin yap worksheet.set_column(row, col + 1, 12.5) worksheet.set_column(row, col + 2, 12.5) worksheet.set_column(row, col + 3, 12.5) worksheet.set_column(row, col + 4, 12.5) # kıymetli verileri yazıyoruz worksheet.write(row, col + 1, i["value1"]) worksheet.write(row, col + 2, i["value2"]) worksheet.write(row, col + 3, i["value3"]) worksheet.write(row, col + 4, i["value4"]) row += 1 time.sleep(bekleme) hisse_kontrol = hisse[0] col += 4 # yıl dönümlerini ayarlıyoruz # --------------------------------------------------------------------------------------------------------------------- # Fonksiyonların çağrılması # --------------------------------------------------------------------------------------------------------------------- parametre_hazirlama() req_olusturulmasi() geleni_goster() # --------------------------------------------------------------------------------------------------------------------- # Exceli kapatalım workbook.close() print("## Toplam çalışma süresi : {z} sn ##".format(z=round(time.time() - start_zaman, zaman_hassasiyet)))
Gözü yormamak adına aldığım “minik” bir fikir sonrası yaptığım ufak değişiklikle çalışma zamanı ekranını şöyle görmelisiniz;
Büyütmek için Resmin üzerine tıklayın
Hakan Müştak
@2022
OLAĞAN ÜSTÜ MÜKEMMEL. 💡
ELLERİNİZE EMEKLERİNİZE SAĞLIK HAKAN HOCAM.
İYİ Kİ VARSINIZ.
ŞANS HER ZAMAN YANINIZDA OLSUN.
SEVGİLER.
Çok teşekkürler, selamlar
Elinize saglik.Deneyecegim