Şirket Bilançolarını toplu halde indirelim

Uzunca zamandır blogumla ilgilenmiyor oluşum uzunca zamandır beni rahatsız ediyor. Bundan sonra “elimden geldiği kadar” güncel tutmaya karar verdim. Bunun için gene uzun zamandır kod yazmamamla ilişkili ve kod yazmama (revizyon mu desek?) sebep olan konuyu ele alarak başlangıç yapacağım. Başlıkta da belirttiğim gibi Şirket Bilançolarını toplu halde indireceğiz.

Beni tanıyan bilir -ki bu konuda yazmak da istiyorum ve yakında yazamaya başlayacağım; uzun vadeli yatırım konusuna oldukça ilgiliyimdir. Zaman zaman Swing Trade & Price Action yaparak disiplinimi bozma eğiliminde olsam da ana yol belli Uzun Vadeli Yatırım ve oğlumun gelecekte hayata 1-0 başlamasını sağlayacak düzeyde bir Temettü Emekliliği sağlamak. Bunun için bloglar okuyor, videolar izliyor, sosyal medyada içi dolu grup ve kişileri takip etmeye çalışıyorum. Şurada da biraz (evet çok!)sorunlu ve tedaviye ihtiyaç bir script buldum.

Script, İş Bankasının sitesine bağlanarak, şirketlerin her üç ayda bir yayınladığı bilançoları toplu olarak tek excel üzerinde derleyerek indirmeye çalışıyor. İşbankasının XML ile Stock uygulamaları için verdiği linke belli değişkenleri gönderip dönen sonucu çıktı olarak veriyor. Link ve koddaki mantık gerçekten çok basit. Python, C# hatta PHP ile de rahatlıkla çekilebilir. Boş bir zaman bulursam challange olsun diye ben de yapabilirim.

Kod Windows üzerinde Powershell ISE ile çalışıyor. Window üzerinde win tuşuna basıp Powershell yazarsanız çalıştıracağınız platformu göreceksiniz. Aşağıdaki ekranda kodu da gösterecek şekilde ekran paylaşıyorum;

Büyütmek için üzerine tıklayabilirsiniz

Bu ekranda aşağıda kodunu paylaştığım dosyayı kendinize uygulamanın anlayacağı bir uzantı ile (örnek: *.ps1) kaydedip uygulama içinden açmalısınız.

1.Satırda hissenizin BIST kodunu girmelisiniz. Ben örnek olması için EGEEN’i girdim.

176.Satırda indirilecek dosyanın nereye kayıt edileceğini göstermelisiniz.

Kodumuz şöyle;

$code="EGEEN"

# Verilerin son yıl/çeyreğe göre konsolide olması için son yıl/çeyreği tüm URL'lerin ilk değişkenlerinde taşımalıyız. Böylece veri tipine göre doğru çekebilir, ayrıca hizalamaya gerek duymayız. İnanın bunu istemeyiz.
# Bunun için sistemli olabilmek adına tüm yılların 4.çeyreklerini yıllara koymadım. Onları en son düzeltme ile, sadece 4.çeyrekleri içerir şekilde düzenledim. Aşağıda notunu görebilirsiniz.
# Revised by: hmustak - hmustak@gmail.com @2020-05-10-16-26


#Son Dönemi Belirleyelim
$ceyrek=3

#Son yıl
$yil=2020
#Kolon isimleri ve ilk yılın (2014) artık dönemini burada şekillendiriyoruz
$URL9="https://www.isyatirim.com.tr/_layouts/15/IsYatirim.Website/Common/Data.aspx/MaliTablo?companyCode=$code&exchange=TRY&financialGroup=XI_29&year1=2020&period1=3&year2=2014&period2=12&year3=2014&period3=9&year4=2014&period4=6"
$Response9 = Invoke-WebRequest -Uri $URL9
$a9 = ConvertFrom-Json -InputObject $Response9.Content
$a8= $a9.value | Select ItemDescTr, value2,value3,value4

#2015 Yılı
sleep(1)
$yil=2015
$URL10="https://www.isyatirim.com.tr/_layouts/15/IsYatirim.Website/Common/Data.aspx/MaliTablo?companyCode=$code&exchange=TRY&financialGroup=XI_29&year1=2020&period1=3&year2=$yil&period2=9&year3=$yil&period3=6&year4=$yil&period4=3"
$Response10 = Invoke-WebRequest -Uri $URL10
$a10 = ConvertFrom-Json -InputObject $Response10.Content
$a11= $a10.value | Select value1,value2,value3,value4

#2016 Yılı
sleep(1)
$yil=2016
$URL20="https://www.isyatirim.com.tr/_layouts/15/IsYatirim.Website/Common/Data.aspx/MaliTablo?companyCode=$code&exchange=TRY&financialGroup=XI_29&year1=2020&period1=3&year2=$yil&period2=9&year3=$yil&period3=6&year4=$yil&period4=3"
$Response20 = Invoke-WebRequest -Uri $URL20
$a20 = ConvertFrom-Json -InputObject $Response20.Content
$a21= $a20.value | Select value1,value2,value3,value4

#2017 Yılı
sleep(1)
$yil=2017
$URL30="https://www.isyatirim.com.tr/_layouts/15/IsYatirim.Website/Common/Data.aspx/MaliTablo?companyCode=$code&exchange=TRY&financialGroup=XI_29&year1=2020&period1=3&year2=$yil&period2=9&year3=$yil&period3=6&year4=$yil&period4=3"
$Response30 = Invoke-WebRequest -Uri $URL30
$a30 = ConvertFrom-Json -InputObject $Response30.Content
$a31= $a30.value | Select value1,value2,value3,value4

#2018 Yılı
sleep(1)
$yil=2018
$URL40="https://www.isyatirim.com.tr/_layouts/15/IsYatirim.Website/Common/Data.aspx/MaliTablo?companyCode=$code&exchange=TRY&financialGroup=XI_29&year1=2020&period1=3&year2=$yil&period2=9&year3=$yil&period3=6&year4=$yil&period4=3"
$Response40 = Invoke-WebRequest -Uri $URL40
$a40 = ConvertFrom-Json -InputObject $Response40.Content
$a41= $a40.value | Select value1,value2,value3,value4

#2019 Yılı
sleep(1)
$yil=2019
$URL50="https://www.isyatirim.com.tr/_layouts/15/IsYatirim.Website/Common/Data.aspx/MaliTablo?companyCode=$code&exchange=TRY&financialGroup=XI_29&year1=2020&period1=3&year2=$yil&period2=9&year3=$yil&period3=6&year4=$yil&period4=3"
$Response50 = Invoke-WebRequest -Uri $URL50
$a50 = ConvertFrom-Json -InputObject $Response50.Content
$a51= $a50.value | Select value1,value2,value3,value4

#2020 Yılı
sleep(1)
$yil=2020
$URL60="https://www.isyatirim.com.tr/_layouts/15/IsYatirim.Website/Common/Data.aspx/MaliTablo?companyCode=$code&exchange=TRY&financialGroup=XI_29&year1=2020&period1=3&year2=$yil&period2=9&year3=$yil&period3=6&year4=$yil&period4=3"
$Response60 = Invoke-WebRequest -Uri $URL60
$a60 = ConvertFrom-Json -InputObject $Response60.Content
$a61= $a60.value | Select value1,value2,value3,value4



#4Ç Düzeltmesi
#Burada tüm çeyrekler 12.ay : 2020-2019-2018
sleep(1)
$URL1000="https://www.isyatirim.com.tr/_layouts/15/IsYatirim.Website/Common/Data.aspx/MaliTablo?companyCode=$code&exchange=TRY&financialGroup=XI_29&year1=2020&period1=3&year2=2020&period2=12&year3=2019&period3=12&year4=2018&period4=12"
$Response1000 = Invoke-WebRequest -Uri $URL1000
$a1000 = ConvertFrom-Json -InputObject $Response1000.Content
$a1001= $a1000.value | Select value1,value2,value3,value4

#4Ç Düzeltmesi
#Burada tüm çeyrekler 12.ay : 2017-2016-2015
sleep(1)
$URL2000="https://www.isyatirim.com.tr/_layouts/15/IsYatirim.Website/Common/Data.aspx/MaliTablo?companyCode=$code&exchange=TRY&financialGroup=XI_29&year1=2020&period1=3&year2=2017&period2=12&year3=2016&period3=12&year4=2015&period4=12"
$Response2000 = Invoke-WebRequest -Uri $URL2000
$a2000 = ConvertFrom-Json -InputObject $Response2000.Content
$a2001= $a2000.value | Select value1,value2,value3,value4



class CsvRow {
  [object] ${Kalem}

  [object] ${2020/12}
  [object] ${2020/9}
  [object] ${2020/6}
  [object] ${2020/3}

  [object] ${2019/12}
  [object] ${2019/9}
  [object] ${2019/6}
  [object] ${2019/3}

  [object] ${2018/12}
  [object] ${2018/9}
  [object] ${2018/6}
  [object] ${2018/3}

  [object] ${2017/12}
  [object] ${2017/9}
  [object] ${2017/6}
  [object] ${2017/3}

  [object] ${2016/12}
  [object] ${2016/9}
  [object] ${2016/6}
  [object] ${2016/3}

  [object] ${2015/12}
  [object] ${2015/9}
  [object] ${2015/6}
  [object] ${2015/3}

  [object] ${2014/12}
  [object] ${2014/9}
  [object] ${2014/6}

}

$count = $a8.value1.Count-1

# Dizi sınıfını oluşturalım
$arrayList = [System.Collections.ArrayList]::new()

# Loop
foreach ($ndx in 0..$count) {
  $rowObj = [CsvRow]::new()

  # Dizi değerlerini atayalım
  $rowObj.'Kalem'  = $a8.itemDescTr[$ndx]

  $rowObj.'2020/12'= $a1001.value2[$ndx]
  $rowObj.'2020/9' = $a61.value2[$ndx]
  $rowObj.'2020/6' = $a61.value3[$ndx]
  $rowObj.'2020/3' = $a61.value4[$ndx]

  $rowObj.'2019/12'= $a1001.value3[$ndx]
  $rowObj.'2019/9' = $a51.value2[$ndx]
  $rowObj.'2019/6' = $a51.value3[$ndx]
  $rowObj.'2019/3' = $a51.value4[$ndx]

  $rowObj.'2018/12'= $a1001.value4[$ndx]
  $rowObj.'2018/9' = $a41.value2[$ndx]
  $rowObj.'2018/6' = $a41.value3[$ndx]
  $rowObj.'2018/3' = $a41.value4[$ndx]

  $rowObj.'2017/12'= $a2001.value2[$ndx]
  $rowObj.'2017/9' = $a31.value2[$ndx]
  $rowObj.'2017/6' = $a31.value3[$ndx]
  $rowObj.'2017/3' = $a31.value4[$ndx]

  $rowObj.'2016/12'= $a2001.value3[$ndx]
  $rowObj.'2016/9' = $a21.value2[$ndx]
  $rowObj.'2016/6' = $a21.value3[$ndx]
  $rowObj.'2016/3' = $a21.value4[$ndx]

  $rowObj.'2015/12'= $a2001.value4[$ndx]
  $rowObj.'2015/9' = $a11.value2[$ndx]
  $rowObj.'2015/6' = $a11.value3[$ndx]
  $rowObj.'2015/3' = $a11.value4[$ndx]

  $rowObj.'2014/12'= $a8.value2[$ndx]
  $rowObj.'2014/9' = $a8.value3[$ndx]
  $rowObj.'2014/6' = $a8.value4[$ndx]

  $null = $arrayList.Add($rowObj)
}

# Dizi çıktımızı CSV olarak verelim
$arrayList | Export-Csv -NoTypeInformation -Path "D:\GDrive\finans\Stock-Down-Script\data\$code.csv" -Encoding UTF8

 

Dosyayı kaydedip, PowerShell üzerinde açtıktan sonra panel üzerinde görülen yeşil play ikonuna benzeyen RUN düğmesine basarak (yada F5’e basarak) kodu çalıştırıp bilançonuzu 176. satırda verdiğiniz adrese indirebilirsiniz.

Bazı bilgisayarlarda direk çalışabildiği gibi bazı bilgisayarlarda kod ne yaparsanız yapın çalışmıyor. Bunun için Powershell ekranını solundaki mavi shell alanına;

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

yazmalısınız. Sonrasında kodunuz sorunsuzca çalışacaktır. 2020 4.çeyreğe kadar kod çalıştıktan sonra tekrar optimize edilmesi gerekiyor. Optimizasyon gerektiği her zaman burada tekrar paylaşacağım.

Hakan Müştak@2020

 


Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

question razz sad evil exclaim smile redface biggrin surprised eek confused cool lol mad twisted rolleyes wink idea arrow neutral cry mrgreen

*

Captcha Kontrolü * Zaman aşımı, sayfayı tekrar yükleyin


Top