forked from FinanceData/FinanceDataReader
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdata.py
89 lines (81 loc) · 3.77 KB
/
data.py
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
from FinanceDataReader.investing.data import (InvestingDailyReader)
from FinanceDataReader.fred.data import (FredReader)
from FinanceDataReader.krx.data import (KrxDelistingReader)
from FinanceDataReader.naver.data import (NaverDailyReader)
from FinanceDataReader.nasdaq.listing import (NasdaqStockListing)
from FinanceDataReader.krx.listing import (KrxStockListing, KrxDelisting, KrxMarcapListing, KrxAdministrative)
from FinanceDataReader.wikipedia.listing import (WikipediaStockListing)
from FinanceDataReader.investing.listing import (InvestingEtfListing)
from FinanceDataReader.naver.listing import (NaverStockListing, NaverEtfListing)
from FinanceDataReader._utils import (_convert_letter_to_num, _validate_dates)
import re
import pandas as pd
from datetime import datetime, timedelta
def DataReader(symbol, start=None, end=None, exchange=None, data_source=None):
'''
read price data from various exchanges or data source
* symbol: code or ticker
* start, end: date time string
* exchange: 'KRX'(default), 'KRX-DELISTING', 'NYSE', 'NASDAQ', 'AMEX', 'SSE', 'SZSE', 'HKEX', 'TSE', 'HOSE'
* data_source: 'FRED'
'''
start, end = _validate_dates(start, end)
# FRED Reader
if data_source and data_source.upper() == 'FRED':
return FredReader(symbol, start, end, exchange, data_source).read()
# KRX and Naver Finance
if (symbol[:5].isdigit() and exchange==None) or \
(symbol[:5].isdigit() and exchange and exchange.upper() in ['KRX', '한국거래소']):
return NaverDailyReader(symbol, start, end, exchange, data_source).read()
# KRX-DELISTING
if (symbol[:5].isdigit() and exchange and exchange.upper() in ['KRX-DELISTING']):
return KrxDelistingReader(symbol, start, end, exchange, data_source).read()
# Investing
reader = InvestingDailyReader
df = reader(symbol, start, end, exchange, data_source).read()
end = min([pd.to_datetime(end), datetime.today()])
while len(df) and df.index[-1] < end: # issues/30
more = reader(symbol, df.index[-1] + timedelta(1), end, exchange, data_source).read()
if len(more) == 0:
break
df = df.append(more)
return df
def StockListing(market):
'''
read stock list of stock exchanges
* market: 'S&P500', 'NASDAQ', 'NYSE', 'AMEX', 'SSE', 'SZSE', 'HKEX', 'TSE', 'HOSE',
'KRX', 'KOSPI', 'KOSDAQ', 'KONEX'
'KRX-DELISTING', 'KRX-MARCAP', 'KRX-ADMINISTRATIVE'
'ETF/KR'
'''
market = market.upper()
if market in [ 'NASDAQ', 'NYSE', 'AMEX', 'SSE', 'SZSE', 'HKEX', 'TSE', 'HOSE']:
return NaverStockListing(market).read()
if market in [ 'KRX', 'KOSPI', 'KOSDAQ', 'KONEX']:
return KrxStockListing(market).read()
if market in [ 'KRX-DELISTING' ]:
return KrxDelisting(market).read()
if market in [ 'KRX-MARCAP' ]:
return KrxMarcapListing(market).read()
if market in [ 'KRX-ADMINISTRATIVE' ]:
return KrxAdministrative(market).read()
if market in [ 'S&P500', 'SP500']:
return WikipediaStockListing(market).read()
if market.startswith('ETF'):
toks = market.split('/')
etf, country = toks[0], toks[1]
if country.upper() == 'KR':
return NaverEtfListing().read()
return InvestingEtfListing(country).read()
else:
msg = "market='%s' is not implemented" % market
raise NotImplementedError(msg)
def EtfListing(country='KR'):
'''
'EtfListing() will deprecated. Use fdr.StockListing("ETF/KR") instead of fdr.EtfListing("KR")'
'''
# Deprecation warnings
print('EtfListing() will deprecated. Use fdr.StockListing("ETF/KR") instead of fdr.EtfListing("KR")')
if country.upper() == 'KR':
return NaverEtfListing().read()
return InvestingEtfListing(country).read()