Python ile Finans Verileri
Yahoo Finance
Alttaki yöntemle YF arayüze özel URL oluşturarak bağlanıyoruz. Bu
bağlantı yöntemi arka planda finance.yahoo.com
sitesinin girdi
mantığını takip ediyor, senetler için direk onların kodu girilebilir,
AAPL, MSFT gibi, indisler ve özel göstergeler başında ^
vardır,
indis verisi, mesela Nasdaq için ^IXIC
,
import pandas as pd, datetime, time
import urllib.request as urllib2
from io import BytesIO
end = datetime.datetime.now()
start=end-datetime.timedelta(days=90)
start = int(time.mktime(start.timetuple()))
end = int(time.mktime(end.timetuple()))
url = "https://query1.finance.yahoo.com/v7/finance/download/^IXIC?period1=" + str(start) + "&period2=" + str(end) + "&interval=1d&events=history&includeAdjustedClose=true"
r = urllib2.urlopen(url).read()
file = BytesIO(r)
df = pd.read_csv(file,index_col='Date')
Not: Yahoo Finans'ın üstteki bağlantı yöntemi 2024 Eylül'de aksaklığa uğradı, tamamen kapatıldı mı bilinmiyor, bir alternatif yöntem altadır. Bu yöntem biraz farklı, sonuç JSON olarak geliyor,
import pandas as pd, datetime, requests
import urllib.request as urllib2
d1 = datetime.datetime.strptime("2015-09-01", "%Y-%m-%d").timestamp()
d2 = datetime.datetime.strptime("2024-09-17", "%Y-%m-%d").timestamp()
print (int(d1))
print (int(d2))
1441054800
1726520400
ticker = "AAPL"
url = "https://query2.finance.yahoo.com/v8/finance/chart/%s?period1=%d&period2=%d&interval=1d&events=history&includeAdjustedClose=true"
url = url % (ticker,int(d1),int(d2))
r = urllib2.urlopen(url).read()
import json
res = json.loads(r)
ts = res['chart']['result'][0]['timestamp']
adjclose = res['chart']['result'][0]['indicators']['adjclose'][0]['adjclose']
ts = [datetime.datetime.fromtimestamp(x).strftime("%Y-%m-%d") for x in ts]
df = pd.DataFrame(adjclose,index=pd.to_datetime(ts),columns=[ticker])
print (df)
AAPL
2015-08-31 25.457985
2015-09-01 24.320099
2015-09-02 25.363161
2015-09-03 24.918392
2015-09-04 24.670042
... ...
2024-09-10 220.110001
2024-09-11 222.660004
2024-09-12 222.770004
2024-09-13 222.500000
2024-09-16 216.320007
[2276 rows x 1 columns]
Polygon.io
Ticari bir servis olsa da bedava olan seviyesi hala işe yarıyor, fakat bedava serviste bazı kısıtlamalar var, mesela tarihi verilerde iki sene öncesinde daha fazlası verilmiyor. Gene de faydalı olabilir, servise üye olduktan sonra API anahtar kelimesi / şifresi alınır, biz alttaki gibi bir kod kullanıyoruz,
poly_url = "https://api.polygon.io/v2/aggs/ticker/%s/range/1/day/%s/%s?apiKey=%s"
KEY = "[anahtar buraya]"
d1 = "2018-01-01"
ticker = "AAPL"
conf = json.loads(open(fname).read())
today = datetime.datetime.now().strftime("%Y-%m-%d")
url = poly_url % (ticker, d1, today, KEY)
r = urllib2.urlopen(url).read()
data = json.loads(r)
res = data['results']
res = [[ datetime.datetime.fromtimestamp(float(x['t']) / 1000.).strftime("%Y-%m-%d"), x['c']] for x in res]
df = pd.DataFrame(res)
df.columns = ['Date',ticker]
df = df.set_index('Date')
FRED
FRED, tam açılımıyla "Federal Reserve Economic Data" servisi ile ABD merkez bankası (federal reserve) tabanından veri indirilebiliyor. ABD gayrı safi milli hasıla verisi için mesela,
import pandas as pd, datetime
from pandas_datareader import data
import quandl
today = datetime.datetime.now()
start=datetime.datetime(1992, 1, 1)
end=datetime.datetime(today.year, today.month, today.day)
cols = ['GDPC1']
df = data.DataReader(cols, 'fred', start, end)
print (df.tail(4))
GDPC1
DATE
2021-01-01 19055.655
2021-04-01 19368.310
2021-07-01 19478.893
2021-10-01 19806.290
Opsiyonlar, Nasdaq
Alttaki url kazınabilir
https://www.nasdaq.com/symbol/aapl/option-chain
Quandl
Alttaki örnek ABD/Avro döviz kuru için; işsizlik, enflasyon, vs. gibi
pek çok veri mümkün. Yanlız Quandl verisi için üye olup bir APİ
anahtarı almak lazım, o anahtarı alıp auth
içine yazınca herşey
işler. Örnek İngiliz pound ile ABD doları arasında,
import pandas_datareader.data as web
import quandl, os
auth = '[QUANDL KODU]'
df1 = quandl.get("CURRFX/GBPUSD",
returns="pandas",
start_date='2010-01-01',
end_date='2018-01-01',
authtoken=auth)
Yahoo Finance (Temel Veriler)
Bilanço, kâr, zarar gibi şirket temel verileri için Yahoo Finance
sitesinin bilançolar kısmına bağlanan yahoo_fin
paketi faydalıdır,
mesela Amazon şirketinin brüt karı (gross profit) ve toplam hasılat
(total revenue) verisi için,
from yahoo_fin.stock_info import get_income_statement
ticker = 'AMZN'
res = get_income_statement(ticker,yearly=False).T
df = res.sort_index()
print (df[['grossProfit','totalRevenue']])
res = get_income_statement(ticker,yearly=True).T
df = res.sort_index()
print (df[['grossProfit','totalRevenue']])
Breakdown grossProfit totalRevenue
endDate
2021-03-31 46115000000 108518000000
2021-06-30 48904000000 113080000000
2021-09-30 47882000000 110812000000
2021-12-31 54577000000 137412000000
Breakdown grossProfit totalRevenue
endDate
2018-12-31 93731000000 232887000000
2019-12-31 114986000000 280522000000
2020-12-31 152757000000 386064000000
2021-12-31 197478000000 469822000000
Hisse Başına Kâr (Earnings Per Share)
Şirketlerin hisse başına karlılık oranları borsacılar tarafından yakından takip edilir, her şirket her çeyrekte belli günlerde bu rakamı açıklar ve buna göre senet fiyatları yükselip düşebilir. Karlılık o kadar kritiktir ki önceden hakkında bir konsensüs tahmini bile yapılır ve bu açıkça bilinir, bu tahmine yaklaşıp yaklaşılmaması da senet fiyatını etkiler. Bu veriyi almak için, mesela Walmart şirketi için,
from yahoo_fin.stock_info import get_earnings_history
import pandas as pd
res = get_earnings_history('WMT')
df = pd.DataFrame.from_dict(res)
pd.set_option('display.max_columns', None)
df.head(4)[['startdatetime','epsestimate','epsactual']]
Out[1]:
startdatetime epsestimate epsactual
0 2022-08-16T07:00:00.000Z 1.83 NaN
1 2022-05-17T07:02:00.000Z 1.48 1.30
2 2022-02-17T07:11:00.000Z 1.50 1.53
3 2021-11-16T07:01:00.000Z 1.40 1.45
Görüldüğü gibi analist tahmini 1.48 ama birinci çeyrekte karlılık 1.30. Tahmine eriselemedi ve Walmart senetleri bunu yazdığımız Mayıs 2022'de ağır bir darbe yedi. Ayrıca bir sonraki çeyrek için tahminin yapılmış olduğunu görüyoruz, 1.83 diyor. Bakalım ne olacak.
Yukarı