Önceki yazılarda hazırladığımız kodlarla xls dosyanın içinden veri çekebiliyorduk. Şimdi de, bu verileri daha sonra yazacağımız programlarda kullanmak üzere bir veritabanına kaydedecek kodu hazırlıyoruz. Fakat elimizde bir veritabanı bulunmadığı için, önce borsa.db isimli bir veritabanı oluşturmamız gerekiyor.
İlk program borsa.db oluşturmak için. Sadece bir kez kullanacağız. Sütun oluşturma örneği olarak bu sayfada yer alıyor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | # -*- coding: utf-8 -*- # +-----------------------------------------------------------------------------------+ # # Sqlite3 ile veri tabanı oluşturan kod # # Hazırlayan : FVolkanY // www.globalekonomi.com # +-----------------------------------------------------------------------------------+ import sqlite3 as sqlite # bir kez olusturup hep kullanacağımız borsa.db isimli veri tabanımız def vt_olustur(veritabani = "borsa.db"): # tablolarımızı hazırlayalım con = sqlite.connect(veritabani) # sadece hisse kodu ve kapanış verilerini tutacağız. # kendi kendine artan bir indexsimiz ve iki sütunumuz var. con.execute('CREATE TABLE Borsa(borsaID INTEGER PRIMARY KEY AUTOINCREMENT, vttarih VARCHAR(10), vthisse VARCHAR(10), vtkapanis real)') con.execute('CREATE INDEX Borsaidx on Borsa(borsaID)') con.commit() con.close() # bu satırda veri tabanını olusturuyoruz # vt_olustur() print "Veri tabanı olusturulda. Artık bu dosyaya ihtiyacımız yok." |
Sıra geldi veritabanına nasıl giriş yapılacağını gösteren kodlara. Bu programı ne kadar çok çalıştırırsanız, veritabanınıza o kadar kayıt ekleyecektir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | # -*- coding: utf-8 -*- # +-----------------------------------------------------------------------------------+ # # Sqlite3 ile veri tabanına yapılan girişler gösteren kod örneği # # Hazırlayan : FVolkanY // www.globalekonomi.com # +-----------------------------------------------------------------------------------+ import sqlite3 as sqlite connection = sqlite.connect('borsa.db') cursor = connection.cursor() print "veritabanı bağlantısı yapıldı" # veri girelim # 2009yılının 1. ayının 2.gününün 1.seansı tarih = "200901021" hisse = "YKBNK" kapanis = 51.1 cursor.execute('INSERT INTO Borsa VALUES (null, ?, ?, ?)',(tarih,hisse, kapanis)) connection.commit() # bir kayıt daha yapalım tarih = "200901021" hisse = "TKFEN" kapanis = 28.5 cursor.execute('INSERT INTO Borsa VALUES (null, ?, ?, ?)',(tarih,hisse, kapanis)) connection.commit() print "Kayıtlar yapıldı" |
Şimdi de veritabanında yer alan kayıtları görmek için bir kod hazırlayalım
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | # -*- coding: utf-8 -*- # +-----------------------------------------------------------------------------------+ # # Sqlite3 ile veritabanı kayıtlarını gösteren kod örneği # # Hazırlayan : FVolkanY // www.globalekonomi.com # +-----------------------------------------------------------------------------------+ import sqlite3 as sqlite connection = sqlite.connect('borsa.db') cursor = connection.cursor() print "Kayıtlar görüntüleniyor." cursor.execute('SELECT * FROM Borsa') # topla değişkeninin burada olma sebebi # unikod veriyi int veya floata çevirmek için örnek olması # hem de ortalama fiyatı hesaplıyor topla=0 for row in cursor: print '-'*20 print 'Kayıt no', row[0] toplamkayit=int(row[0]) print 'Tarih:', row[1] print 'Hisse kodu:', row[2] print 'Kapanış', row[3] topla=topla+float(row[3]) print '-'*20 print "Ortalama fiyat : ",topla/toplamkayit |
Bu kadar örnekten sonra, artık gerçek verilerle çalışabiliriz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | # -*- coding: utf-8 -*- # +-----------------------------------------------------------------------------------+ # IMKB sitesinden belirli tarihler arasındaki... # günlük kapanış bültenlerini indiren ve # zip dosyaları ve içindeki xls dosyaları açarak klasörleyen # istenen hisseyi tarih, hisse kodu ve kapanış bilgisi ile # veritabanına ekleyen kod örneği. # # Hazırlayan : FVolkanY // www.globalekonomi.com # +-----------------------------------------------------------------------------------+ import sys import urllib import zipfile import os import xlrd import sqlite3 as sqlite # Önce indirme adresimizin kodlarını hazırlıyoruz # .zip dosyalar için for döngüsü # 2000 yılından başla, 2010 yılına kadar devam et (2010 hariç) for yil in range(2009, 2010): # 1. aydan başla, 13.aya kadar devam et (13.ay hariç) for ay in range(1,13): # 1. günden başla, 32. güne kadar devam et (32.gün hariç) for gun in range(1,32): # 1.seansdan başla, 3.seansa kadar devam et (3.seans hariç) for seans in range(1,3): # yıl ismini string yapalım ki adres satırına yazabilelim yilx=str(yil) # eğer ay 10dan küçükse başına 0 koyalım ve ayı stringe çevirelim if ay < 10: ayx="0"+str(ay) if ay>=10: ayx=str(ay) # eğer gün 10dan küçükse başına 0 koyup günü stringe çevirelim if gun< 10: gunx="0"+str(gun) if gun>=10: gunx=str(gun) # seans bilgisini de stringe çeviriyoruz seansx=str(seans) # elimizde döngü içinde değişen yıl, ay,gün ve seans bilgisi var # veri çekeceğimiz adresi belirtelim adres="http://www.imkb.gov.tr/data/thb/"+yilx+"/"+ayx+"/thb"+yilx+ayx+gunx+seansx+".zip" # artık verileri çekmeyi deneyebiliriz try: # deniyoruz indir=urllib.urlopen(adres) oku=indir.read() # durumdan haberdar olalım print "Dosya okunuyor" # belirtilen adresde karşınmıza ne çıkacak? # galiba .zip yerine <html> ile başlayan gibi bir sayfaya gittik, belki tatil günü olabilir if oku.startswith("< "): print "Belirtilen adres üzerinde bu isimde bir dosya yok. Bir sonraki dosya ile işlem devam edecek." # 404 not found ile de karşılaşabiliriz elif oku.startswith("4"): print "Belirtilen adres üzerinde bu isimde bir dosya yok. Bir sonraki dosya ile işlem devam edecek." # herşey yolunda ise else: # çektiğimiz dosyayı klasörümüze kaydedelim dosya=open("./veriler/"+yilx+ayx+gunx+seansx+".zip","wb") dosya.write(oku) dosya.close() # .zip dosyayı açalım zdosya = open("./veriler/"+yilx+ayx+gunx+seansx+".zip", "rb") z = zipfile.ZipFile(zdosya) # içinde neler var for name in z.namelist(): # ismini de değiştirelim namez = yilx+ayx+gunx+seansx+".xls" outfile = open("./ciktilar/"+namez, "wb") outfile.write(z.read(name)) # açtığımız dosyaları kapatalım outfile.close() zdosya.close() # .xls dosyadan veri ve veritabanımıza kaydedelim # .xls dosyamızı açalım kitap = xlrd.open_workbook("./ciktilar/"+yilx+ayx+gunx+seansx+".xls") print "dosyayı açtım" # bize 11 ve 12 ve 13. tablolar lazım # hisse bilgileri bu tablolarda for tabloindeks in range(10,14): xlstablo = kitap.sheet_by_index(tabloindeks) print "tablo indeksi:",tabloindeks # bu tabloda kaç satır var öğrenelim # eğer döngüyü satır sayısından fazla tutarsak # program hata verir xlstablo_satir_adedi=xlstablo.nrows print "bu tablodaki satır adedi : ",xlstablo_satir_adedi # şimdi her tabloda B sütununu tarıyor ve # DOAS.E kodlu hisseyi arıyoruz # bu kodun özelliği 2009 başında 11 indeksli sayfada # daha sonra da 12 indeksli sayfada bulunması # yani tablolar içinde arama yapmak için güzel bir örnek # kapanış verisini de 1. seans için H, 2. seans için G sütunundan alacağız for satirindeks in range(0,xlstablo_satir_adedi): # eğer aktif hücre DGGYO ise if kitap.sheet_by_index(tabloindeks).cell_value(rowx=satirindeks, colx=1)=="DOAS.E": # ve 1. seans ise if seans == 1: # işlemimizi yapıyoruz tarih=yilx+ayx+gunx+seansx hisse = kitap.sheet_by_index(tabloindeks).cell_value(rowx=satirindeks, colx=1) kapanis = kitap.sheet_by_index(tabloindeks).cell_value(rowx=satirindeks, colx=7) # 2. seans da olabilir elif seans == 2: # o zaman sütun değişir tarih=yilx+ayx+gunx+seansx hisse = kitap.sheet_by_index(tabloindeks).cell_value(rowx=satirindeks, colx=1) kapanis = kitap.sheet_by_index(tabloindeks).cell_value(rowx=satirindeks, colx=6) # veriler elimizde hisse ve kapanis değiskenlerinde duruyor # veritabanımıza ekliyoruz connection = sqlite.connect('borsa.db') cursor = connection.cursor() cursor.execute('INSERT INTO Borsa VALUES (null, ?, ?, ?)',(tarih,hisse, kapanis)) connection.commit() # veritabanına ekleme işlemi tamamlandı print "İşlem tamamlandı. Bir sonraki dosya ile işleme devam ediliyor." # tahmin edemediğimiz bir hata oluştuğunda except: print "Dosya Okuma/Yazma hatası!!!" # for döngüsü sona erdiğinde haberimiz olsun print "Tüm dosyalar indirildi." |
Tüm veriler depolandı. Artık Python, C, Cpp üzerinden sqlite bağlantısı yaparak bu verilere ulaşabilirsiniz. Mevcut kayıtları görmek için yukarıda hazırladığımız kodu da kullanabilirsiniz.
Bundan sonraki adım, elimizdeki verileri kullanarak teknik analiz indikatörleri oluşturmak. Hatta bir adım daha ilerisi; Bu veriler ile yapay zeka kullanarak tahminler yapmak.
Bu kodlar ile bir program hazırlayıp IMKB sitesinden veri çekmek istediğinizde Telif Hakkı ve Çekince İhbarında bulunan şartları kabul etmelisiniz.
Kullanım izni ve şartları
Kullanıcılar bilgi ve dokümanları, sadece bilgi edinme amacıyla kullanabilir. Burada mevcut bulunan bilgiler, İMKB’nin önceden yazılı olarak izni alınmadan kısmen veya tamamen kopya edilemez, uygulamaya konulamaz, dağıtılamaz, kiralanamaz, çoğaltılamaz, alt lisansla kullandırılamaz, değiştirilemez, ileride kullanılmak üzere saklanamaz. Bilgi sayfalarındaki tüm görüntüler İMKB adına tescilli olup, İMKB’nin önceden yazılı izni alınmadan ticari amaçlı olarak kullanılamaz.Bu web sitesinde yer alan bütün ürün ve hizmetler önceden bildirimde bulunmaksızın değiştirilebilir.
Çekinceler
İMKB’nin bu bilgilerin doğruluğu ve tamlığı hususlarına açık veya zımni şekilde kefil veya garantör olduğu yolunda hiçbir taahhüdü bulunmamaktadır. İMKB tarafindan yayınlanan bilgilerin kullanıcıları sarih bir şekilde kabul ederler ki, bu bilgiler kim tarafindan kullanılırsa kullanılsın, kullanım neticesi doğrudan, dolaylı veya netice olarak bir kayıp veya zarar doğması halinde bu durum İMKB’ye hiçbir borç, sorumluluk veya mükellefiyet yüklemez.İnsan hataları, teknik nedenler veya diğer faktörler nedeniyle her tür hata veya bilgi eksikliğinin vuku bulabileceği gerçeğinden hareketle, İMKB kendi yayınladığı veya bilgi sağladığı kaynaklardan temin edilen bilgilerdeki hata ve eksikliklerden sorumlu bulunmamaktadır.








