Tag Cloud
    Sponsors
       
      Anketler

      Siteden beklentiniz nedir?

      Sonuçları görüntüle

      Yükleniyor ... Yükleniyor ...
IMKB sitesinden kapanış verilerini çeken kod (4)
Home » AR-GE » IMKB sitesinden kapanış verilerini çeken kod (4) sqlite3 ile kapanış verilerini veri tabanına aktarma
By FVolkanY | 1 CommentLeave a Comment
Last updated: Çarşamba, Eylül 23, 2009
    

Ö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.

Comments

1 comment
  1. Kaan PINAR
    02 Ekim 2009

    borsamız hakkında açıklamalı kod örnekleri bulmak çok zor. bilginizi paylaştığınız için teşekkürler :)

    Leave a reply

Leave a Comment

Add your picture!
Join Gravatar and upload your avatar. C'mon, it's free!