Zaman Serileri Analizi 1-Ek: Finansal ve İktisadi Zaman Serilerine Erişim

Zaman serileri
Author

Murat Öztürkmen

Published

December 17, 2021

Ek 1: Finansal ve İktisadi Zaman Serilerine Erişim

Zaman serileri ile çalışırken, eğer elinizde uygun bir veri kümesi yok ise, gerçek hayat verilerine ulaşmak için oldukça fazla yol ve yöntem var. Bunun en basit yolu, kullandığınız programlama dili üzerinden, hiç dışarıya çıkmadan çalışma ortamınıza veri aktarmaktır.

Burada Python ile finansal, iktisadi ve diğer açık verilere erişim için birkaç çerçeve paylaşacağız.

E.1.1. Finansal Verilere Erişim-1: yfinance

yfinance, Yahoo Finance’ın tarihsel verilerine erişmek için oluşturulmuş bir çerçevedir. yfinance ile yalnızca hisse senedi fiyat verilerini indirmekle kalmaz, aynı zamanda bir şirketin borsada listelenmesinden bu yana tüm finansal verilerini indirmenize de izin verir. Kullanımı kolaydır ve inanılmaz derecede hızlıdır. Bu çerçeve finansal veri analizi için oldukça popülerdir.

Burada örnek bir hisse senedi olarak Google fiyatlarını ve Google finansal verilerinin nasıl çalışma ortamına aktarılacağına odaklanacağız.

İlk olarak yfinance çerçevesinin yüklü olması gerekiyor. Bunu şu işlemle kolaylıkla yapabilirsiniz:

pip install yfinance

Şimdi yüklü olan çerçeveyi, çalışma ortmanına alalım:

# gereksiz uyarıları gizlemek için
import warnings
warnings.filterwarnings("ignore")

# yfinance çerçevesinin çalışma ortamına alınması
import yfinance as yf

İlgili hisse senedi verisinin bilgilerine ulaşmak için Ticker metodunu, hisse senedinin sembolünü argüman olarak alacak şekilde kullanıyoruz. Google için sembol GOOGL olarak belirlenmiş:

google = yf.Ticker("GOOGL")

Şimdi, info metoduyla hisse senedini çıkaran şirket hakkında paylaşılan bilgilere bakalım:

google.info
{'zip': '94043',
 'sector': 'Communication Services',
 'fullTimeEmployees': 150028,
 'longBusinessSummary': 'Alphabet Inc. provides online advertising services in the United States, Europe, the Middle East, Africa, the Asia-Pacific, Canada, and Latin America. The company offers performance and brand advertising services. It operates through Google Services, Google Cloud, and Other Bets segments. The Google Services segment provides products and services, such as ads, Android, Chrome, hardware, Google Maps, Google Play, Search, and YouTube, as well as technical infrastructure; and digital content. The Google Cloud segment offers infrastructure and data analytics platforms, collaboration tools, and other services for enterprise customers. The Other Bets segment sells internet and TV services, as well as licensing and research and development services. The company was founded in 1998 and is headquartered in Mountain View, California.',
 'city': 'Mountain View',
 'phone': '650-253-0000',
 'state': 'CA',
 'country': 'United States',
 'companyOfficers': [],
 'website': 'https://www.abc.xyz',
 'maxAge': 1,
 'address1': '1600 Amphitheatre Parkway',
 'industry': 'Internet Content & Information',
 'ebitdaMargins': 0.35616,
 'profitMargins': 0.29521,
 'grossMargins': 0.56511,
 'operatingCashflow': 89395003392,
 'revenueGrowth': 0.41,
 'operatingMargins': 0.303,
 'ebitda': 85196996608,
 'targetLowPrice': 1850,
 'recommendationKey': 'buy',
 'grossProfits': 97795000000,
 'freeCashflow': 52658749440,
 'targetMedianPrice': 3350,
 'currentPrice': 2840.03,
 'earningsGrowth': 0.707,
 'currentRatio': 2.98,
 'returnOnAssets': 0.14011,
 'numberOfAnalystOpinions': 44,
 'targetMeanPrice': 3286.11,
 'debtToEquity': 11.493,
 'returnOnEquity': 0.30872,
 'targetHighPrice': 3925,
 'totalCash': 142002995200,
 'totalDebt': 28109000704,
 'totalRevenue': 239210004480,
 'totalCashPerShare': 213.936,
 'financialCurrency': 'USD',
 'revenuePerShare': 356.562,
 'quickRatio': 2.862,
 'recommendationMean': 1.7,
 'exchange': 'NMS',
 'shortName': 'Alphabet Inc.',
 'longName': 'Alphabet Inc.',
 'exchangeTimezoneName': 'America/New_York',
 'exchangeTimezoneShortName': 'EST',
 'isEsgPopulated': False,
 'gmtOffSetMilliseconds': '-18000000',
 'quoteType': 'EQUITY',
 'symbol': 'GOOGL',
 'messageBoardId': 'finmb_29096',
 'market': 'us_market',
 'annualHoldingsTurnover': None,
 'enterpriseToRevenue': 7.404,
 'beta3Year': None,
 'enterpriseToEbitda': 20.79,
 '52WeekChange': 0.56300664,
 'morningStarRiskRating': None,
 'forwardEps': 112.07,
 'revenueQuarterlyGrowth': None,
 'sharesOutstanding': 300809984,
 'fundInceptionDate': None,
 'annualReportExpenseRatio': None,
 'totalAssets': None,
 'bookValue': 367.946,
 'sharesShort': 2555428,
 'sharesPercentSharesOut': 0.0039,
 'fundFamily': None,
 'lastFiscalYearEnd': 1609372800,
 'heldPercentInstitutions': 0.79713,
 'netIncomeToCommon': 70617997312,
 'trailingEps': 103.805,
 'lastDividendValue': None,
 'SandP52WeekChange': 0.22927392,
 'priceToBook': 7.718605,
 'heldPercentInsiders': 0.00151,
 'nextFiscalYearEnd': 1672444800,
 'yield': None,
 'mostRecentQuarter': 1632960000,
 'shortRatio': 1.52,
 'sharesShortPreviousMonthDate': 1634256000,
 'floatShares': 578297742,
 'beta': 1.043636,
 'enterpriseValue': 1771215650816,
 'priceHint': 2,
 'threeYearAverageReturn': None,
 'lastSplitDate': 1396483200,
 'lastSplitFactor': '1998:1000',
 'legalType': None,
 'lastDividendDate': None,
 'morningStarOverallRating': None,
 'earningsQuarterlyGrowth': 0.684,
 'priceToSalesTrailing12Months': 7.8943477,
 'dateShortInterest': 1636934400,
 'pegRatio': 1.25,
 'ytdReturn': None,
 'forwardPE': 25.341572,
 'lastCapGain': None,
 'shortPercentOfFloat': 0.0085,
 'sharesShortPriorMonth': 2790225,
 'impliedSharesOutstanding': 663763968,
 'category': None,
 'fiveYearAverageReturn': None,
 'previousClose': 2859.32,
 'regularMarketOpen': 2873.62,
 'twoHundredDayAverage': 2538.3796,
 'trailingAnnualDividendYield': None,
 'payoutRatio': 0,
 'volume24Hr': None,
 'regularMarketDayHigh': 2888,
 'navPrice': None,
 'averageDailyVolume10Day': 1595490,
 'regularMarketPreviousClose': 2859.32,
 'fiftyDayAverage': 2854.9697,
 'trailingAnnualDividendRate': None,
 'open': 2873.62,
 'toCurrency': None,
 'averageVolume10days': 1595490,
 'expireDate': None,
 'algorithm': None,
 'dividendRate': None,
 'exDividendDate': None,
 'circulatingSupply': None,
 'startDate': None,
 'regularMarketDayLow': 2806.02,
 'currency': 'USD',
 'trailingPE': 27.35928,
 'regularMarketVolume': 2057050,
 'lastMarket': None,
 'maxSupply': None,
 'openInterest': None,
 'marketCap': 1888406994944,
 'volumeAllCurrencies': None,
 'strikePrice': None,
 'averageVolume': 1547741,
 'dayLow': 2806.02,
 'ask': 2843.99,
 'askSize': 800,
 'volume': 2057050,
 'fiftyTwoWeekHigh': 3019.33,
 'fromCurrency': None,
 'fiveYearAvgDividendYield': None,
 'fiftyTwoWeekLow': 1694,
 'bid': 2837.05,
 'tradeable': False,
 'dividendYield': None,
 'bidSize': 1100,
 'dayHigh': 2888,
 'regularMarketPrice': 2840.03,
 'preMarketPrice': None,
 'logo_url': 'https://logo.clearbit.com/abc.xyz'}

Bu metodla şirketin sektörü, çalışan sayısı, iş özeti vb. dahil olmak üzere şirketle ilgili tüm bilgileri görülebilir.

Hisse senedi tarihsel fiyat verisi için history metodunu kullanacağız. Başlangıç (start) ve bitiş (end) gibi argümanlar ile alınacak zaman dönemi belirlenebilir ya da zaman dönemi max olarak ayarlanarak, hisse senedinin başlangıçtan günümüze tüm fiyat bilgilerine ulaşılabilir.

# tüm veri için
# google_fiyatlar = google.history(period="max")
google_fiyatlar = google.history(start="2005-01-01", end="2021-06-01")
google_fiyatlar.head()
Open High Low Close Volume Dividends Stock Splits
Date
2004-12-31 99.714714 100.040039 96.376373 96.491493 15321663 0 0.0
2005-01-03 98.798798 101.921921 97.827827 101.456459 31656712 0 0.0
2005-01-04 100.800804 101.566566 96.836838 97.347343 27484288 0 0.0
2005-01-05 96.821823 98.548546 96.211212 96.851852 16456727 0 0.0
2005-01-06 97.637634 98.048050 93.953957 94.369370 20753426 0 0.0

Tarihsel veri içerisinde günlük açılış(open), en yüksek(high), en düşük(low), kapanış(close), kar payı(dividend) ve hisse bölünmesi(stock split) değişkenleri tarihsel olarak çalışma ortamına aktarılmış oldu.

Finansal veri analistleri, şirketin hissedarlarına vermiş olduğu temettüler ve bölünmeler ile ilgili detayları talep edebilirler. Bunu actions metoduyla elde edebiliriz:

google.actions
Dividends Stock Splits
Date
2014-04-03 0.0 1.998

Hisse senedinin sürdürülebilirliği hakkında bilgi edinmek için sustainability metodu kullanılır:

google.sustainability
Value
2021-9
palmOil False
controversialWeapons False
gambling False
socialScore 10.79
nuclear False
furLeather False
alcoholic False
gmo False
catholic False
socialPercentile None
peerCount 99
governanceScore 11.62
environmentPercentile None
animalTesting False
tobacco False
totalEsg 22.89
highestControversy 4
esgPerformance AVG_PERF
coal False
pesticides False
adult False
percentile 32.95
peerGroup Software & Services
smallArms False
environmentScore 0.48
governancePercentile None
militaryContract False

Bir şirketin hisse senedini almak veya satmak için öneriler, farklı Finans Firmaları tarafından sağlanır. Hisse senedi fiyatını analiz edebilmek için bu firmaların ne önerdiğini bilmeliyiz. Önerileri analiz etmek için recommendations metodunu kullanabiliriz.

google.recommendations
Firm To Grade From Grade Action
Date
2014-12-17 00:00:00 Pivotal Research Buy up
2015-01-08 06:03:07 Stifel Hold Buy down
2015-01-14 09:00:00 Credit Suisse Outperform main
2015-01-30 09:00:00 Citigroup Buy main
2015-03-02 14:04:06 Bank of America Buy Neutral up
... ... ... ... ...
2021-10-27 14:48:23 Wells Fargo Overweight main
2021-10-27 14:50:22 Monness, Crespi, Hardt Buy main
2021-10-27 15:32:10 Truist Securities Buy main
2021-10-28 14:49:56 Citigroup Neutral main
2021-11-02 13:05:22 Morgan Stanley Overweight main

262 rows × 4 columns

calendar metodu, şirketin kazanç ve gelirlerini bilmek için kullanılabilir.

google.calendar
0 1
Earnings Date 2022-01-31 21:00:00 2022-02-04 21:00:00
Earnings Average 27.16 27.16
Earnings Low 22.98 22.98
Earnings High 31 31
Revenue Average 72024500000 72024500000
Revenue Low 68682000000 68682000000
Revenue High 75049000000 75049000000

Borsada işlem gören her şirket için benzersiz bir ISIN (Uluslararası Menkul Kıymet Kimlik Numarası) bulunur. Bu numarayı isin metoduyla alabiliriz.

google.isin
'US02079K3059'

Opsiyon alım-satımı sırasında opsiyonun bitiş tarihini bilmeliyiz. options metodunu kullanarak o hisse senedinin Opsiyon Bitiş Tarihini alabiliriz.

google.options
('2021-12-10',
 '2021-12-17',
 '2021-12-23',
 '2021-12-31',
 '2022-01-07',
 '2022-01-21',
 '2022-02-18',
 '2022-03-18',
 '2022-04-14',
 '2022-06-17',
 '2022-09-16',
 '2023-01-20',
 '2023-03-17',
 '2023-06-16',
 '2024-01-19')

E.1.2. Makro İktisadi Verilere Erişim: evds

Türkiye’de makro ekonomik veriler TÜİK, Merkez Bankası gibi kurumlar tarafından tarihsel olarak yayınlanmakta. Merkez Bankası, verileri Elektronik Veri Dağıtım Sistemi (evds) isminde bir ortamdan dağıtıyor. Gidip siteden veriler çekilebileceği gibi, artık Python ve R için yazılmış çerçevelerle, ücretsiz API anahtarı alarak da buradaki verilere siteye gitmeden erişebilirsiniz.

evds çerçevesini de yüklemek oldukça kolay:

pip install evds
# evdsAPI modülünün içeri aktarılması
from evds import evdsAPI

# Merkez Bankasından alınan ücretsiz API anahtarının tanımlanması
evds = evdsAPI('<API anahtarı>')

Eğer, aranacak özel bir makro iktisadi değişken yok ise, üst kategorilerden alt kategorilere kadar giderek ilgili değişkenler çalışma ortamına aktarılabilir.

Üst kategorilere main_categories metodula erişilebilir:

evds.main_categories
CATEGORY_ID TOPIC_TITLE_TR
0 1 PİYASA VERİLERİ
1 2 KURLAR
2 3 FAİZ İSTATİSTİKLERİ
3 4 PARA VE BANKA İSTATİSTİKLERİ
4 5 MENKUL KIYMET İSTATİSTİKLERİ
5 12 FİNANSAL İSTATİSTİKLER
6 13 TCMB BİLANÇO VERİLERİ
7 14 FİYAT ENDEKSLERİ
8 15 ANKETLER
10 18 ÖDEMELER DENGESİ, ULUSLARARASI YATIRIM POZİSYONU
11 19 DIŞ TİCARET İSTATİSTİKLERİ
12 20 KAMU MALİYESİ
13 21 ÜRETİM
14 22 ÖDEME SİSTEMLERİ VE EMİSYON
15 23 İSTİHDAM
16 6 DIŞ BORÇLAR
17 7 ZORUNLU KARŞILIĞA TABİ MEVDUAT VE KATILIM FONLARI
18 24 BIS KARŞILAŞTIRMALI ÜLKE İSTATİSTİKLERİ
19 25 ALTIN VERİLERİ
20 26 KONUT VE İNŞAAT İSTATİSTİKLERİ
21 27 FİNANSAL HESAPLAR
22 28 TURİZM İSTATİSTİKLERİ
23 95 EVDS KULLANIM İSTATİSTİKLERİ

Bir alt kategoriye, CATEGORY_ID argğmanıyla get_sub_categories metoduyla erişilebilir:

evds.get_sub_categories(2)
CATEGORY_ID DATAGROUP_CODE DATAGROUP_NAME
0 2 bie_dkdovytl Kurlar-Döviz Kurları
1 2 bie_dkefkytl Kurlar-Efektif Kurlar
2 2 bie_dkkurbil Kurlar-TCMB Tarafından Alım Satıma Konu Olmaya...
3 2 bie_rktufey Kurlar-Reel Efektif Döviz Kuru-TÜFE Bazlı (200...
4 2 bie_rkufey Kurlar-Reel Efektif Döviz Kuru-Yİ-ÜFE Bazlı (2...
5 2 bie_redkurigm Kurlar-Reel Efektif Döviz Kuru-Birim İş Gücü M...

Alt kategorilerdeki veri gruplarına DATAGROUP_CODE argümanıyla get_series metordu ile erişilebilir:

evds.get_series('bie_dkdovytl')
SERIE_CODE SERIE_NAME START_DATE
0 TP.DK.USD.A.YTL (USD) ABD Doları (Döviz Alış) 02-01-1950
1 TP.DK.USD.S.YTL (USD) ABD Doları (Döviz Satış) 02-01-1950
2 TP.DK.EUR.A.YTL (EUR) Euro (Döviz Alış) 04-01-1999
3 TP.DK.EUR.S.YTL (EUR) Euro (Döviz Satış) 04-01-1999
4 TP.DK.ATS.A.YTL (ATS) Avusturya Şilini (Döviz Alış) 03-07-1961
... ... ... ...
84 TP.DK.SEK.C.YTL (SEK) İsveç Kronu (Çapraz) 02-01-2002
85 TP.DK.XDR.C.YTL (XDR) Özel Çekme Hakkı (SDR) (Çapraz) 18-04-1988
86 TP.DK.KRW.A.YTL (KRW) Güney Kore Wonu (Döviz Alış) 23-08-2021
87 TP.DK.KRW.C.YTL (KRW) Güney Kore Wonu (Çapraz) 23-08-2021
88 TP.DK.KRW.S.YTL (KRW) Güney Kore Wonu (Döviz Satış) 23-08-2021

89 rows × 3 columns

İlgilenilen değişkene SERIE_CODE argümanıyla get_data metoduyla erişilebilir. Burada da startdate ve enddate argümanları ile ilgilenilen periyot belirlenebilir.

dolar_kuru = evds.get_data(['TP.DK.USD.A.YTL'], startdate='01-01-2000', enddate='01-12-2021')
dolar_kuru.head()
Tarih TP_DK_USD_A_YTL
0 01-01-2000 NaN
1 02-01-2000 NaN
2 03-01-2000 0.540098
3 04-01-2000 0.540793
4 05-01-2000 0.535815

E.1.3. Makro İktisadi Verilere Erişim: pandas_datareader

Makro iktisadi ve finansal verilere çalışma ortamından erişmenin bir diğer yolu, pandas_datareader çerçevesidir. pandas_datareader, Econdb, Quandl, FRED, Dünya Bankası, OECD ve Eurostat gibi birçok kaynaktan veri aktarmak için oldukça güzel bir çerçeve.

pandas_datareader çerçevesini de yüklemek oldukça kolay:

pip install pandas_datareader

Dünya Bankası’ndan Türkiye için sabit dolar bazında kişi başına Gayri Safi Yurtiçi Hasıla (Gross Domestic Product per capita in constant dollars), verisini çalışma ortmanına almak için search metodunu kullanabiliriz:

# wb modülünün içeri aktarılması
from pandas_datareader import wb

# eşleşen veri isimleri
eşleşmeler = wb.search('gdp.*capita.*const')
eşleşmeler
id name unit source sourceNote sourceOrganization topics
716 6.0.GDPpc_constant GDP per capita, PPP (constant 2011 internation... LAC Equity Lab GDP per capita based on purchasing power parit... b'World Development Indicators (World Bank)' Economy & Growth
10384 NY.GDP.PCAP.KD GDP per capita (constant 2015 US$) World Development Indicators GDP per capita is gross domestic product divid... b'World Bank national accounts data, and OECD ... Economy & Growth
10386 NY.GDP.PCAP.KN GDP per capita (constant LCU) World Development Indicators GDP per capita is gross domestic product divid... b'World Bank national accounts data, and OECD ... Economy & Growth
10388 NY.GDP.PCAP.PP.KD GDP per capita, PPP (constant 2017 internation... World Development Indicators GDP per capita based on purchasing power parit... b'International Comparison Program, World Bank... Economy & Growth
10389 NY.GDP.PCAP.PP.KD.87 GDP per capita, PPP (constant 1987 internation... WDI Database Archives b''

İlgileneceğimiz veri kimliği NY.GDP.PCAP.KD olarak belirlenmiş. download metoduyla country, start ve end argümanlarıyla ilgili veriler çalışma ortamına aktarılabilir:

gsyh = wb.download(indicator='NY.GDP.PCAP.KD', country=['TR'], start=2000, end=2020)
gsyh.head()
NY.GDP.PCAP.KD
country year
Turkey 2020 12035.033448
2019 11956.197821
2018 12004.376912
2017 11835.261106
2016 11187.053638

E.1.4. İBB Trafik İndeksi Verileri

Finans ve makro iktisat verileri dışında zaman bazlı hava durumu, trafik, cihaz verileri gibi veri kümeleri de zaman serisi olarak çalışılabilir.

Burada bir örnek olarak İstanbul Trafik İndeksi verisini çalışma ortamına aktarmak için yazmış olduğumuz fonksiyon ile trafik indeksi verilerini alacağız.

import requests
import pandas as pd

def trafik_indeksini_al(periyot=1, frekans='D'):
    
    """
    Trafik indeksi veri çerçevesini döndürür.
    
    Args:
        peryot (int): periyot sayısı.
        frekans (str): zaman frekansı. Y:year, M:month, D:day, H:hour, 5M:5 minutes. default:D
    
    Returns:
        veri (pandas.DataFrame): trafik indeksi veri çerçevesi
    """
    
    # url
    url = "https://api.ibb.gov.tr/tkmservices/api/TrafficData/v1/TrafficIndexHistory/" + str(periyot) + "/" + frekans
    
    # api adresinden verinin alınması
    istenen_veri = requests.get(url)
    
    # verinin json biçimine dönüştürülmesi
    istenen_veri_json = istenen_veri.json()
    
    # istenen verinin pandas.DataFrame biçimine dönüştürülmesi
    veri = pd.DataFrame.from_dict(istenen_veri_json)
    
    return veri

720 günlük, 1 saatlik trafik indeks verisinin çalışma ortmanına alınması:

trafik_indeksi_verisi = trafik_indeksini_al(periyot=720, frekans='H')
trafik_indeksi_verisi.head()
TrafficIndex TrafficIndexDate
0 43 2021-12-06T10:00:00
1 53 2021-12-06T09:00:00
2 62 2021-12-06T08:00:00
3 49 2021-12-06T07:00:00
4 18 2021-12-06T06:00:00