Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
 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)
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
0
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))
Ejemplo n.º 6
0
    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)
Ejemplo n.º 7
0
    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
Ejemplo n.º 8
0
    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
Ejemplo n.º 9
0
    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()
Ejemplo n.º 10
0
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])
Ejemplo n.º 11
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)
Ejemplo n.º 12
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)
Ejemplo n.º 13
0
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]
Ejemplo n.º 14
0
def getPykrxData():
    stock_amount = stock.get_market_cap_by_ticker("20200929")[['상장주식수']]
    return stock_amount