def test_io(self): df = stock.get_market_cap_by_ticker("20200101") self.assertTrue(df.empty) df = stock.get_market_cap_by_ticker("20200625") self.assertFalse(df.empty) for col in df.columns: self.assertEqual(type(df[col].iloc[0]), np.int64)
def test_with_a_businessday(self): df = stock.get_market_cap_by_ticker("20210104") # 종가 시가총액 거래량 거래대금 상장주식수 # 티커 # 005930 83000 495491951650000 38655276 3185356823460 5969782550 # 000660 126000 91728297990000 7995016 994276505704 728002365 # 051910 889000 62756592927000 858451 747929748128 70592343 # 005935 74400 61222770480000 5455139 405685236800 822886700 # 207940 829000 54850785000000 182864 149889473000 66165000 self.assertIsInstance(df, pd.DataFrame) self.assertEqual(len(df), 2531) temp = np.isclose(df.iloc[0:5, 0], [83000, 126000, 889000, 74400, 829000]) self.assertEqual(temp.sum(), 5)
def get_latest_market_cap(today=None, market="ALL"): if today == None: today = datetime.datetime.today().strftime("%Y%m%d") if DEBUG == True: print(get_latest_market_ohlcv.__name__, today) today_datetime = datetime.datetime.strptime(today, "%Y%m%d") for i in range(0, RETRY_COUNT): latest_date = (today_datetime - datetime.timedelta(i)).strftime("%Y%m%d") if DEBUG: print(latest_date) result = stock.get_market_cap_by_ticker(latest_date, market) if result.empty == False: return result return None
def __init__(self, collector_type): # maria 연결 되어있는지 확인 self.is_maria = False # dart api 연결 되어있는지 확인 self.is_dart = False # chrome driver 연결 되어있는지 확인 self.is_chrome = False # signet: 단기차입금, 장기차입금 # dart: 자본금, 무형자산 # fnguide: 나머지 # pykex: 상장주식수 self.collector_type = collector_type # 기준 종목코드 2016년 상장되어있던 기업 stock_amount_2016 = stock.get_market_cap_by_ticker("20161229 ")[['상장주식수']] self.code_list = list(stock_amount_2016.index)
def low_evaluation_list(): # 종목별 DIV/BPS/PER/EPS 조회 df = stock.get_market_fundamental_by_ticker("20200721") df = df[(df['PER'] <= 9) & (df['PBR'] <= 1)] df2 = stock.get_market_cap_by_ticker("20200721") df3 = pd.merge(df, df2, left_index=True, right_index=True, how='outer') df3 = df3[['종목명', 'DIV', 'BPS', 'PER', 'EPS', 'PBR', '시가총액', '거래량']] df3['거래량'] = df3['거래량'].apply(lambda x: format(x, ',')) df3['시가총액'] = df3['시가총액'].apply(lambda x: x / 100000000).apply(int).apply( lambda x: format(x, ',')) + ' 억' df3['PBR'] = df3['PBR'].apply(lambda x: '%.2f' % x) df3 = df3.sort_values(['EPS'], ascending=False) print(df3.head(10))
def test_not_empty_result(self): df = stock.get_market_ohlcv_by_date("20190225", "20190228", "000660") self.assertTrue(df.empty) df = stock.get_market_cap_by_date("20190101", "20190131", "005930") self.assertTrue(df.empty) df = stock.get_market_cap_by_ticker("20200625") self.assertTrue(df.empty) df = stock.get_market_price_change_by_ticker("20180301", "20180320") self.assertTrue(df.empty) df = stock.get_market_fundamental_by_ticker("20180305", "KOSPI") self.assertTrue(df.empty) df = stock.get_market_fundamental_by_date("20180301", "20180320", '005930') self.assertTrue(df.empty)
def getMarketCapByTicker(self, date=None, market="ALL"): if date is None: return None if not os.path.isdir(self.dirMarketCap): os.makedirs(self.dirMarketCap) filePath = self.dirMarketCap + '/' + \ 'marketCap_%s_%s.bin' % (market, date) if os.path.isfile(filePath): with open(filePath, 'rb') as f: marketCap = pickle.load(f) return marketCap rawMarketCap = None try: rawMarketCap = stock.get_market_cap_by_ticker( date, market) # pandas form except: print("[KRX API update 가 필요합니다] stock.get_market_cap_by_ticker") exit() if rawMarketCap.empty == True: print("[WARN] please check parameter `date`") return None resMarketCap = dict() desc = "get marketCap" for ticker in tqdm(rawMarketCap.index, desc): tmpDict = dict() corpName = stock.get_market_ticker_name(ticker) tmpDict["종목명"] = corpName for column in rawMarketCap.columns: # 종가, 시가총액, 거래량, 시가총액, 상장주식수 tmpDict[column] = str( rawMarketCap.loc[ticker][column]).replace(" ", "") resMarketCap[corpName] = tmpDict # NOTE: 데이터 백업. with open(filePath, 'wb') as f: pickle.dump(resMarketCap, f) return resMarketCap
def computeData(self, fnguide_tablename, signal_tablename, mh_tablename, jb_tablename, dg_tablename, res_tablename): self._setMaria() data = {} std_date = '20201116' today = '20210305' res_tablename = res_tablename+std_date years = ['2017', '2018', '2019', '2020'] for y in years: data['fnguide{}'.format(y)] = self.maria.showData('select * from {}{}'.format(fnguide_tablename, y)) for y in years[:-1]: data['new_signal{}'.format(y)] = self.maria.showData('select * from {}{}'.format(signal_tablename, y)) data['dart_mh'] = self.maria.showData('select * from {}'.format(mh_tablename)) data['dart_jb'] = self.maria.showData('select * from {}'.format(jb_tablename)) # 사업보고서가 발표 된다면 사용하지 않음 data['dart_dg_3q'] = self.maria.showData('select * from {}'.format(dg_tablename)) #################################### df = data['fnguide{}'.format(years[3])][['종목코드', '자산', '부채', '자본', '기말현금및현금성자산', '매출액', '영업이익발표기준', '당기순이익', 'GB']] df = df.rename(columns={'자산': '자산총계{}'.format(years[3]), '부채': '부채총계{}'.format(years[3]), '자본': '자본총계{}'.format(years[3]), '기말현금및현금성자산': '현금성자산', '매출액': '매출액{}'.format(years[3]), '영업이익발표기준': '영업이익{}'.format(years[3]), '당기순이익': '당기순이익{}'.format(years[3])}) tmp = data['fnguide{}'.format(years[0])][['종목코드', '당기순이익', '영업이익발표기준', '자산']] tmp = tmp.rename(columns={'당기순이익': '당기순이익{}'.format(years[0]), '영업이익발표기준': '영업이익{}'.format(years[0]),'자산': '자산총계{}'.format(years[0])}) df = pd.merge(df, tmp, on=['종목코드']) tmp = data['fnguide{}'.format(years[1])][['종목코드', '당기순이익', '영업이익발표기준', '자본', '자산', '부채', '유동자산', '유동부채', '매출액']] tmp = tmp.rename(columns={'당기순이익': '당기순이익{}'.format(years[1]), '영업이익발표기준': '영업이익{}'.format(years[1]), '자본': '자본총계{}'.format(years[1]), '자산': '자산총계{}'.format(years[1]), '부채': '부채총계{}'.format(years[1]), '유동자산': '유동자산{}'.format(years[1]), '유동부채': '유동부채{}'.format(years[1]), '매출액': '매출액{}'.format(years[1])}) df = pd.merge(df, tmp, on=['종목코드']) tmp = data['fnguide{}'.format(years[2])][['종목코드', '당기순이익', '영업이익발표기준', '자본', '자산', '부채', '유동자산', '유동부채', '매출액']] tmp = tmp.rename(columns={'당기순이익': '당기순이익{}'.format(years[2]), '영업이익발표기준': '영업이익{}'.format(years[2]), '자본': '자본총계{}'.format(years[2]), '자산': '자산총계{}'.format(years[2]), '부채': '부채총계{}'.format(years[2]), '유동자산': '유동자산{}'.format(years[2]), '유동부채': '유동부채{}'.format(years[2]), '매출액': '매출액{}'.format(years[2])}) df = pd.merge(df, tmp, on=['종목코드']) # 사업보고서가 발표 된다면 해당년도로 사용 tmp = data['new_signal{}'.format(years[2])][['종목코드', '단기차입금', '장기차입금']] df = pd.merge(df, tmp, on=['종목코드']) tmp = data['dart_mh'][['종목코드', 'mh{}'.format(years[2])]] tmp = tmp.rename(columns={'mh{}'.format(years[2]): '무형자산'}) df = pd.merge(df, tmp, on=['종목코드']) tmp = data['dart_jb'][['종목코드', 'jb{}'.format(years[2])]] tmp = tmp.rename(columns={'jb{}'.format(years[2]): '자본금'}) df = pd.merge(df, tmp, on=['종목코드']) ############################################# df_An = df[df['GB'] == '12'] df_3q = df[df['GB'] == '09'].rename(columns={'당기순이익{}'.format(years[3]): '당기순이익{}_3Q'.format(years[3])}) tmp = data['dart_dg_3q'][['종목코드', 'dg{}_3Q'.format(years[1]), 'dg{}_3Q'.format(years[2])]] tmp = tmp.rename(columns={'dg{}_3Q'.format(years[1]): '당기순이익{}_3Q'.format(years[1]), 'dg{}_3Q'.format(years[2]): '당기순이익{}_3Q'.format(years[2])}) df_3q = pd.merge(df_3q, tmp, on=['종목코드']) tmp = df_3q[['종목코드', '당기순이익{}_3Q'.format(years[1]), '당기순이익{}_3Q'.format(years[2]), '당기순이익{}_3Q'.format(years[3])]] tmp['rate{}'.format(years[2])] = (tmp['당기순이익{}_3Q'.format(years[2])] - tmp['당기순이익{}_3Q'.format(years[1])]) / tmp['당기순이익{}_3Q'.format(years[1])] tmp['rate{}'.format(years[3])] = (tmp['당기순이익{}_3Q'.format(years[3])] - tmp['당기순이익{}_3Q'.format(years[2])]) / tmp['당기순이익{}_3Q'.format(years[2])] tmp['당기순이익{}'.format(years[3])] = tmp['당기순이익{}_3Q'.format(years[2])] * (1 + (tmp['rate{}'.format(years[2])] + tmp['rate{}'.format(years[3])]) / 2) df_3q = pd.merge(df_3q, tmp[['종목코드', '당기순이익{}'.format(years[3])]], on=['종목코드']) df_3q = df_3q[list(df_An.columns)] df = pd.concat([df_An, df_3q]) stock_amount_dates = ['20190329', '20200327', std_date] for y in stock_amount_dates: data['stock_amount_{}'.format(y)] = stock.get_market_cap_by_ticker(y)[['상장주식수', '시가총액']] tmp = data['stock_amount_{}'.format(stock_amount_dates[0])].reset_index(drop=False) tmp.columns = ['종목코드', '상장주식수{}'.format(years[1]), '시가총액{}'.format(years[1])] tmp['상장주식수{}'.format(years[1])] = tmp['상장주식수{}'.format(years[1])] / 100000000 tmp['시가총액{}'.format(years[1])] = tmp['시가총액{}'.format(years[1])] / 100000000 df = pd.merge(df, tmp, on=['종목코드']) tmp = data['stock_amount_{}'.format(stock_amount_dates[1])].reset_index(drop=False) tmp.columns = ['종목코드', '상장주식수{}'.format(years[2]), '시가총액{}'.format(years[2])] tmp['상장주식수{}'.format(years[2])] = tmp['상장주식수{}'.format(years[2])] / 100000000 tmp['시가총액{}'.format(years[2])] = tmp['시가총액{}'.format(years[2])] / 100000000 df = pd.merge(df, tmp, on=['종목코드']) tmp = data['stock_amount_{}'.format(stock_amount_dates[2])].reset_index(drop=False) tmp.columns = ['종목코드', '상장주식수{}'.format(years[3]), '시가총액{}'.format(years[3])] tmp['상장주식수{}'.format(years[3])] = tmp['상장주식수{}'.format(years[3])] / 100000000 tmp['시가총액{}'.format(years[3])] = tmp['시가총액{}'.format(years[3])] / 100000000 #df = pd.merge(df, tmp, on=['종목코드']) df = pd.merge(df, tmp[['종목코드', '시가총액{}'.format(years[3])]], on=['종목코드']) tmp = self.maria.showData('select * from stocks_202103') tmp['상장주식수{}'.format(years[3])] = (tmp['보통주'] + tmp['우선주']) / 100000000 df = pd.merge(df, tmp[['종목코드', '상장주식수{}'.format(years[3])]], on=['종목코드']) for y in years[1:]: df['EPS{}'.format(y)] = df['당기순이익{}'.format(y)] / df['상장주식수{}'.format(y)] df1 = pd.DataFrame(stock.get_market_ohlcv_by_ticker(std_date)['종가']) df1['Size'] = [0] * df1.shape[0] df2 = pd.DataFrame(stock.get_market_ohlcv_by_ticker(std_date, market='KOSDAQ')['종가']) df2['Size'] = [1] * df2.shape[0] df3 = pd.DataFrame(stock.get_market_ohlcv_by_ticker(std_date, market='KONEX')['종가']) df3['Size'] = [2] * df3.shape[0] price = pd.concat([df1, df2, df3]) price = price.reset_index(drop=False).rename(columns={'티커': '종목코드', '종가': '주식가격'}) df = pd.merge(df, price, on='종목코드') df['순자산가치'] = (df['자본총계{}'.format(years[3])] - df['무형자산']) / df['상장주식수{}'.format(years[3])] df['순손익가치'] = ((df['EPS{}'.format(years[1])] + df['EPS{}'.format(years[2])]*2 + df['EPS{}'.format(years[3])]*3)/6)*10 df['본질가치'] = (df['순자산가치'] + (df['순손익가치']*1.5))/2.5 df['보충적가치'] = (df['순손익가치']*2 + df['순자산가치']*3) / 5 df['주당기업가치'] = (df['상장주식수{}'.format(years[3])]*df['주식가격']+df['단기차입금']+df['장기차입금']-df['현금성자산'])/df['상장주식수{}'.format(years[3])] df['주당가치분석'] = (df['본질가치'] + df['주당기업가치']) / 2 cols = list(df.columns) cols.remove('GB') df = df[cols] print(df.columns) print(len(list(df.columns))) self.maria.createTable(res_tablename, list(df.columns), ['VARCHAR(20)'] + ['FLOAT']*len(cols)) for i in range(df.shape[0]): try: self.maria.insertData(res_tablename, tuple(list(df.iloc[i]))) self.maria.commitDB() except: continue
def fnguideCollect(self): self._setMaria() cols = ['날짜', '자산', '부채', '자본', '기초현금및현금성자산', '기말현금및현금성자산', '유동자산계산에 참여한 계정 펼치기', '유동부채계산에 참여한 계정 펼치기', '매출액', '영업이익', '영업이익(발표기준)', '당기순이익'] changed_cols = [c.replace('계산에 참여한 계정 펼치기', '') for c in cols] changed_cols = [c.replace('(', '') for c in changed_cols] changed_cols = [c.replace(')', '') for c in changed_cols] fn_tablename = 'fnguide' years = ['2017', '2018', '2019', '2020'] for batch in range(20, 2500, 10): data = {} data['2017'] = [] data['2018'] = [] data['2019'] = [] data['2020'] = [] for code in self.code_list[batch:batch + 10]: df = self.getFN(code) if df is None: self.writeError('error_fnguide', code, 'No page') continue try: fs = df.columns[0] # 연결 or 개별? df = df.rename(columns={df.columns[0]: "날짜"})[cols] df['FS'] = [fs] * df.shape[0] df['GB'] = [date[-2:] for date in list(df['날짜'])] df.columns = changed_cols + ['FS', 'GB'] for i, y in enumerate(years): data[y].append([code] + list(df.iloc[i])) except: self.writeError('error_fnguide', code, 'No cols') continue stock_amount_dates = ['20171228', '20181228', '20191230', '20201230', '20200929'] for i, y in enumerate(years[:-1]): data[y] = pd.DataFrame(data[y]) data[y].columns = ['티커'] + changed_cols + ['FS', 'GB'] tmp = data[y][data[y]['GB'] == '12'] tmp = tmp.set_index('티커')[changed_cols[1:] + ['FS', 'GB']] data['stock_amount_{}'.format(y)] = stock.get_market_cap_by_ticker(stock_amount_dates[i])[['상장주식수']] tmp = pd.merge(tmp, data['stock_amount_{}'.format(y)], left_index=True, right_index=True)[changed_cols[1:] + ['상장주식수', 'FS', 'GB']].fillna(-9999999) for j in range(tmp.shape[0]): self.maria.insertData('{}{}'.format(fn_tablename, y), tuple( [tmp.index[j]] + list(map(int, list(tmp.iloc[j][tmp.columns[:-2]]))) + [ tmp['FS'].iloc[j][-3:-1]] + [tmp['GB'].iloc[j]])) self.maria.commitDB() i += 1 y = years[i] data[y] = pd.DataFrame(data[y]) data[y].columns = ['티커'] + changed_cols + ['FS', 'GB'] tmp = data[y][data[y]['GB'] == '12'] tmp = tmp.set_index('티커')[changed_cols[1:] + ['FS', 'GB']] data['stock_amount_{}'.format(y)] = stock.get_market_cap_by_ticker(stock_amount_dates[i])[['상장주식수']] tmp = pd.merge(tmp, data['stock_amount_{}'.format(y)], left_index=True, right_index=True)[changed_cols[1:] + ['상장주식수', 'FS', 'GB']].fillna(-9999999) for j in range(tmp.shape[0]): self.maria.insertData('{}{}'.format(fn_tablename, y), tuple( [tmp.index[j]] + list(map(int, list(tmp.iloc[j][tmp.columns[:-2]]))) + [ tmp['FS'].iloc[j][-3:-1]] + [tmp['GB'].iloc[j]])) self.maria.commitDB() tmp = data[y][data[y]['GB'] == '09'] tmp = tmp.set_index('티커')[changed_cols[1:] + ['FS', 'GB']] data['stock_amount_{}'.format(y)] = stock.get_market_cap_by_ticker(stock_amount_dates[i+1])[['상장주식수']] tmp = pd.merge(tmp, data['stock_amount_{}'.format(y)], left_index=True, right_index=True)[changed_cols[1:] + ['상장주식수', 'FS', 'GB']].fillna(-9999999) for j in range(tmp.shape[0]): self.maria.insertData('{}{}'.format(fn_tablename, y), tuple( [tmp.index[j]] + list(map(int, list(tmp.iloc[j][tmp.columns[:-2]]))) + [ tmp['FS'].iloc[j][-3:-1]] + [tmp['GB'].iloc[j]])) self.maria.commitDB()
from pykrx import stock import pandas as pd tickers = stock.get_market_ticker_list() # 종목별 DIV/BPS/PER/EPS 조회 df = stock.get_market_fundamental_by_ticker("20200721") df = df[(df['PER'] <= 9) & (df['PBR'] <= 1)] df2 = stock.get_market_cap_by_ticker("20200721") df3 = pd.merge(df, df2, left_index=True, right_index=True, how='outer') #df3= df3.sort_values(['EPS'], ascending=False) #df.to_csv('df.csv', encoding='utf-8') #df2.to_csv('df2.csv', encoding='utf-8') #df3.sort_index().to_csv('df3.csv', encoding='utf-8') print(df.sort_index()) print(df2.sort_index()) df3 = df3[['종목명', 'DIV', 'BPS', 'PER', 'EPS', 'PBR', '시가총액', '거래량']] for c in df3[['시가총액', '거래량']]: df3[c] = df3[c].apply(lambda x: format(x, ',')) df3 = df3.sort_values(['EPS'], ascending=False) print(df3.head(10)) ''' market_sum = [] quant = [] for ticker in df.loc[:10, '티커']: ticker_info = stock.get_market_cap_by_date("20200721", "20200721", ticker) market_sum.append(ticker_info.iloc[0, 0])
def test_with_a_holiday(self): df_0 = stock.get_market_cap_by_ticker("20210103") df_1 = stock.get_market_cap_by_ticker("20201230") # 해당 연휴에 상폐된 종목이 없기 때문에 두 index를 비교해 봄 result = set(df_0.index) - set(df_1.index) self.assertEqual(len(result), 0)
def test_with_a_holiday(self): df_0 = stock.get_market_cap_by_ticker("20210103") df_1 = stock.get_market_cap_by_ticker("20201230") same = (df_0 == df_1).all(axis=None) self.assertTrue(same)
def kospi_n_codes(at: date, n: int) -> List[str]: # noinspection PyTypeChecker return [ cap[0] for cap in stock.get_market_cap_by_ticker( date=__date_to_str(at)).iterrows() ][:n]
def getPykrxData(): stock_amount = stock.get_market_cap_by_ticker("20200929")[['상장주식수']] return stock_amount