From 79ee7ecc9079384bc87e75c39f0389b792511efd Mon Sep 17 00:00:00 2001 From: "jonghun.yoo" Date: Thu, 28 May 2020 01:02:33 +0900 Subject: [PATCH] =?UTF-8?q?=EC=9D=BC=EC=9E=90=EB=B3=84=20=EA=B1=B0?= =?UTF-8?q?=EB=9E=98=EC=8B=A4=EC=A0=81=20=EC=B6=94=EC=9D=B4API=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit get_market_trading_volume_by_date 일자별 시장의 거래량을 조회한다. get_market_trading_value_by_date 일자별 시장의 거래대금을 조회한다. --- pykrx/stock/api.py | 21 +++++++- pykrx/version.py | 2 +- pykrx/website/krx/market/core.py | 58 ++++++++++++++++++--- pykrx/website/krx/market/wrap.py | 86 ++++++++++++++++++++++++++------ readme.MD | 35 ++++++++++++- 5 files changed, 175 insertions(+), 27 deletions(-) diff --git a/pykrx/stock/api.py b/pykrx/stock/api.py index 4d5cb83..b948981 100644 --- a/pykrx/stock/api.py +++ b/pykrx/stock/api.py @@ -139,6 +139,22 @@ def get_market_fundamental_by_ticker(date, market="ALL"): return df +def get_market_trading_volume_by_date(fromdate, todate, market="KOSPI"): + if isinstance(fromdate, datetime.datetime): + fromdate = _datetime2string(fromdate) + if isinstance(todate, datetime.datetime): + todate = _datetime2string(todate) + return krx.get_market_trading_volume_by_date(fromdate, todate, market) + + +def get_market_trading_value_by_date(fromdate, todate, market="KOSPI"): + if isinstance(fromdate, datetime.datetime): + fromdate = _datetime2string(fromdate) + if isinstance(todate, datetime.datetime): + todate = _datetime2string(todate) + return krx.get_market_trading_value_by_date(fromdate, todate, market) + + # ----------------------------------------------------------------------------- # 지수(INDEX) API # ----------------------------------------------------------------------------- @@ -193,6 +209,7 @@ def get_index_price_change_by_name(fromdate, todate, market="KOSPI"): todate = _datetime2string(todate) return krx.get_index_price_change_by_name(fromdate, todate, market) + # ----------------------------------------------------------------------------- # 공매도(SHORTING) API # ----------------------------------------------------------------------------- @@ -273,6 +290,8 @@ def get_etf_tracking_error(fromdate, todate, ticker): # df = get_market_ticker_name("000660") # df = get_market_fundamental_by_date("20180301", "20180320", '005930') # df = get_market_fundamental_by_date("20180301", "20180320", '005930') + # df = get_market_trading_volume_by_date("20200519", "20200526", 'KOSPI') + # df = get_market_trading_value_by_date("20200519", "20200526", 'KOSPI') # tickers = get_index_ticker_list("20190225", "KOSDAQ") # print(tickers) # df = get_shorting_status_by_date("20181210", "20181212", "005930") @@ -280,7 +299,7 @@ def get_etf_tracking_error(fromdate, todate, ticker): # df = get_index_ohlcv_by_date("20190101", "20190228", "코스피") # df = get_index_ohlcv_by_date("20190101", "20190228", "코스닥") # df = get_index_ohlcv_by_date("20000101", "20180630", "코스피 200", "m") - df = get_index_price_change_by_name("20200520", "20200527", "KOSDAQ") + # df = get_index_price_change_by_name("20200520", "20200527", "KOSDAQ") # df = get_index_portfolio_deposit_file("20190412", "코스피 소형주") # df = krx.IndexTicker().get_id("코스피 200", "20000201") # df = get_index_portfolio_deposit_file("20000201", "코스피 소형주") diff --git a/pykrx/version.py b/pykrx/version.py index fb7b270..ce8e92b 100644 --- a/pykrx/version.py +++ b/pykrx/version.py @@ -1,2 +1,2 @@ -__version__ = '0.1.19' \ No newline at end of file +__version__ = '0.1.20' \ No newline at end of file diff --git a/pykrx/website/krx/market/core.py b/pykrx/website/krx/market/core.py index ece0023..195d46d 100644 --- a/pykrx/website/krx/market/core.py +++ b/pykrx/website/krx/market/core.py @@ -213,8 +213,8 @@ def read(self, fromdate, todate, market): """전체지수 등락률 :param fromdate : 조회 시작 일자 (YYMMDD) :param todate : 조회 마지막 일자 (YYMMDD) - :param market: KRX (2) / KOSPI (3) / KOSDAQ (4) - :return : PDF DataFrame + :param market: 2(KRX) / 3(KOSPI) / 4 (KOSDAQ) + :return : 지수 등락률 DataFrame group_code group_name kor_indx_ind_nm indx prv_dd_indx prv_dd_cmpr fluc_tp prv_dd_cmpr_chart updn_rate updn_flag tr_vl tr_amt 0 3 KRX KRX 300 1,207.80 1,236.27 28.47 1 28.47 2.36 3 1,439,933,029 55,545,303,395,341 1 3 KRX KRX 100 4,234.80 4,335.24 100.44 1 100.44 2.37 3 500,776,865 32,360,209,330,383 @@ -227,6 +227,51 @@ def read(self, fromdate, todate, market): return DataFrame(result['block1']) +class MDK80033_0(KrxWebIo): + @property + def bld(self): + return "MKD/13/1302/13020301/mkd13020301_01" + + def read(self, fromdate, todate, market): + """거래실적 추이 (거래량) + :param fromdate : 조회 시작 일자 (YYMMDD) + :param todate : 조회 마지막 일자 (YYMMDD) + :param market : kospi / kosdaq / konex + :return : 거래실적 추이 DataFrame + dt tot stk sect reit fm rpt_mass mktd_mass mktd_bsk mktd_dkpl tme_end_pr tme_mass tme_bsk tme_unit tme_dkpl bz_termnl_ask cable_termnl_ask wrls_termnl_ask hts_ask etc_ask bz_termnl_bid cable_termnl_bid wrls_termnl_bid hts_bid etc_bid + 0 2020/05/27 1,178,847,686 1,156,800,749 19,567,184 1,181,347 1,159,323,745 0 421,116 0 0 3,271,098 855,312 0 14,976,415 0 71,353,441 2,112,812 567,158,607 453,973,325 84,249,501 72,550,845 1,870,205 563,795,722 451,021,048 89,609,866 + 1 2020/05/26 1,017,804,023 1,008,972,681 6,436,255 1,438,271 999,126,798 0 15,406 249,637 0 2,885,337 1,164,620 0 14,362,225 0 64,446,407 1,521,342 481,103,100 408,886,368 61,846,806 64,630,912 1,302,029 472,185,427 406,662,217 73,023,438 + 2 2020/05/25 641,458,990 612,379,841 27,522,107 1,021,316 629,592,119 0 9,539 0 0 2,069,182 393,961 0 9,394,189 0 46,899,361 1,141,784 306,793,497 235,845,426 50,778,922 44,817,143 1,167,310 306,395,061 234,893,243 54,186,233 + 3 2020/05/22 847,467,288 830,997,456 13,472,156 2,173,679 832,046,355 0 245,749 0 0 3,101,995 3,094,402 382,092 8,596,695 0 63,527,104 1,580,861 382,694,417 312,464,634 87,200,272 54,102,924 1,552,136 413,978,629 315,154,794 62,678,805 + 4 2020/05/21 601,199,346 596,327,758 2,325,716 1,780,149 588,696,773 0 426,864 0 0 2,359,680 368,345 0 9,347,684 0 60,969,199 1,050,550 283,828,511 192,808,025 62,543,061 52,553,279 1,177,388 293,822,455 194,186,529 59,459,695 + + """ + result = self.post(ind_tp=market, fr_work_dt=fromdate, to_work_dt=todate) + return DataFrame(result['block1']) + +class MDK80033_1(KrxWebIo): + @property + def bld(self): + return "MKD/13/1302/13020301/mkd13020301_02" + + def read(self, fromdate, todate, market): + """거래실적 추이 (거래대금) + :param fromdate : 조회 시작 일자 (YYMMDD) + :param todate : 조회 마지막 일자 (YYMMDD) + :param market : kospi / kosdaq / konex + :return : 거래실적 추이 DataFrame + dt tot stk sect reit fm rpt_mass mktd_mass mktd_bsk mktd_dkpl tme_end_pr tme_mass tme_bsk tme_unit tme_dkpl bz_termnl_ask cable_termnl_ask wrls_termnl_ask hts_ask etc_ask bz_termnl_bid cable_termnl_bid wrls_termnl_bid hts_bid etc_bid + 0 2020/05/27 1,178,847,686 1,156,800,749 19,567,184 1,181,347 1,159,323,745 0 421,116 0 0 3,271,098 855,312 0 14,976,415 0 71,353,441 2,112,812 567,158,607 453,973,325 84,249,501 72,550,845 1,870,205 563,795,722 451,021,048 89,609,866 + 1 2020/05/26 1,017,804,023 1,008,972,681 6,436,255 1,438,271 999,126,798 0 15,406 249,637 0 2,885,337 1,164,620 0 14,362,225 0 64,446,407 1,521,342 481,103,100 408,886,368 61,846,806 64,630,912 1,302,029 472,185,427 406,662,217 73,023,438 + 2 2020/05/25 641,458,990 612,379,841 27,522,107 1,021,316 629,592,119 0 9,539 0 0 2,069,182 393,961 0 9,394,189 0 46,899,361 1,141,784 306,793,497 235,845,426 50,778,922 44,817,143 1,167,310 306,395,061 234,893,243 54,186,233 + 3 2020/05/22 847,467,288 830,997,456 13,472,156 2,173,679 832,046,355 0 245,749 0 0 3,101,995 3,094,402 382,092 8,596,695 0 63,527,104 1,580,861 382,694,417 312,464,634 87,200,272 54,102,924 1,552,136 413,978,629 315,154,794 62,678,805 + 4 2020/05/21 601,199,346 596,327,758 2,325,716 1,780,149 588,696,773 0 426,864 0 0 2,359,680 368,345 0 9,347,684 0 60,969,199 1,050,550 283,828,511 192,808,025 62,543,061 52,553,279 1,177,388 293,822,455 194,186,529 59,459,695 + + """ + result = self.post(ind_tp=market, fr_work_dt=fromdate, to_work_dt=todate) + return DataFrame(result['block1']) + + ################################################################################ # Sorting class ShortHttp(KrxWebIo): @@ -402,30 +447,27 @@ def read(date, market=1): if __name__ == "__main__": import pandas as pd - pd.set_option('display.width', None) # stock # df = MKD80037().read("ALL", "20180501", "20180801") # df = MKD80037().read("ALL", "20180501", "20180515") - # index # df = MKD20011_PDF().read("20190412", "001", 2) # df = MKD20011().read("20190413", "03") # df = MKD20011_SUB().read("20190408", "20190412", "001", 1) # df = MKD20011_SUB().read("20190408", "20190412", "001", 2) # print(MKD30009_1().read('20190322', '20190329', 'ALL', 'KR7005930003')) - df = MKD80002().read("20200520", "20200527", 2) + # df = MKD80002().read("20200520", "20200527", 2) + # df = MDK80033_0().read("20200519", "20200526", 'kospi') + # df = MDK80033_1().read("20200519", "20200526", 'kospi') # shorting # print(SRT02010100.read("KR7005930003", "20181205", "20181207")) # print(SRT02020100.read("20190402", "20190402", market=1)) # print(SRT02020100.read("20181207", "20181212", "코스피", "KR7005930003")) # print(SRT02020300.read("20181207", "20181212", "코스피", "거래대금")) # print(SRT02020400.read("20181212", "코스피")) - # print(SRT02030100.read("20181212", "20181212", 1, "KR7210980009")) # print(SRT02030100.read("20181207", "20181212", "코스피", "KR7210980009")) - # print(SRT02030400.read("20181214", 1)) - print(df.head()) \ No newline at end of file diff --git a/pykrx/website/krx/market/wrap.py b/pykrx/website/krx/market/wrap.py index 7ba0723..c2a790f 100644 --- a/pykrx/website/krx/market/wrap.py +++ b/pykrx/website/krx/market/wrap.py @@ -3,7 +3,7 @@ from pykrx.website.krx.market.core import (MKD30040, MKD80037, MKD30009_0, MKD30009_1, MKD20011, MKD20011_SUB, MKD20011_PDF, SRT02010100, MKD80002, - SRT02020100, SRT02020300, + SRT02020100, SRT02020300, MDK80033_0, MDK80033_1, SRT02020400, SRT02030100, SRT02030400 ) import numpy as np @@ -134,6 +134,47 @@ def get_market_fundamental_by_date(fromdate, todate, isin, market="ALL"): return df.sort_index() +@dataframe_empty_handler +def get_market_trading_volume_by_date(fromdate, todate, market): + """거래실적 추이(거래량) + :param fromdate: 조회 시작 일자 (YYYYMMDD) + :param todate : 조회 종료 일자 (YYYYMMDD) + :param market : KRX / KOSPI / KOSDQA + :return : 거래실적 추이 DataFrame + 전체 주권 투자회사 부동산투자회사 + 2020-05-26 1017804023 1008972681 6436255 1438271 + 2020-05-25 641458990 612379841 27522107 1021316 + 2020-05-22 847467288 830997456 13472156 2173679 + 2020-05-21 601199346 596327758 2325716 1780149 + 2020-05-20 699446970 694915934 2694839 750944 + 2020-05-19 773414630 768223852 2757578 1388145 + """ + market = {"KOSPI": 'kospi', "KOSDAQ": 'kosdaq', 'KONEX': 'konex'}.get(market, 'kospi') + df = MDK80033_0().read(fromdate, todate, market) + return _get_index_volume_by_date(df) + + +@dataframe_empty_handler +def get_market_trading_value_by_date(fromdate, todate, market): + """거래실적 추이 (거래대금) + :param fromdate: 조회 시작 일자 (YYYYMMDD) + :param todate : 조회 종료 일자 (YYYYMMDD) + :param market : KRX / KOSPI / KOSDQA + :return : 거래실적 추이 DataFrame (단위:원) + 전체 주권 투자회사 부동산투자회사 + 2020-05-26 12545313579 12524370281 3260524 7982490 + 2020-05-25 7960324756 7936195529 14000492 5674769 + 2020-05-22 9509771760 9484894049 6685432 12007486 + 2020-05-21 8636997699 8619674049 1535003 9285644 + 2020-05-20 8248632036 8233849994 1333854 3746196 + 2020-05-19 11918300290 11900636354 1651565 6939447 + """ + market = {"KOSPI": 'kospi', "KOSDAQ": 'kosdaq', 'KONEX': 'konex'}.get(market, 'kospi') + df = MDK80033_1().read(fromdate, todate, market) + df = _get_index_volume_by_date(df) + return df * 1000 + + ################################################################################ # index @dataframe_empty_handler @@ -206,18 +247,17 @@ def get_index_status_by_group(date, market): @dataframe_empty_handler def get_index_price_change_by_name(fromdate, todate, market): """전체지수 등락률 - :param fromdate: 조회 시작 일자 (YYYYMMDD) - :param todate : 조회 종료 일자 (YYYYMMDD) - :param market : KRX / KOSPI / KOSDQA - :return : 전체지수 등락률 DataFrame - 기준시점 발표시점 기준지수 현재지수 시가총액 - 코스피 1983.01.04 1980.01.04 100.0 2486.35 1617634318 - 코스피 벤치마크 2015.09.14 2010.01.04 1696.0 2506.92 1554948117 - 코스피 비중제한 8% 지수 2017.12.18 2015.01.02 1000.0 1272.93 1559869409 - 코스피 200 1994.06.15 1990.01.03 100.0 327.13 1407647304 - 코스피 100 2000.03.02 2000.01.04 1000.0 2489.34 1277592989 - 코스피 50 2000.03.02 2000.01.04 1000.0 2205.53 1102490712 - """ + :param fromdate: 조회 시작 일자 (YYYYMMDD) + :param todate : 조회 종료 일자 (YYYYMMDD) + :param market : KRX / KOSPI / KOSDQA + :return : 전체지수 등락률 DataFrame + 시가 종가 등락률 거래량 거래대금 + 코스닥지수 696.36 724.59 4.05 10488319776 62986196230829 + 코스닥 150 1065.42 1102.57 3.49 729479528 18619100922088 + 제조 2266.76 2371.51 4.62 4855249693 27936884984652 + 음식료·담배 9253.67 9477.11 2.41 156868081 1171238893745 + 섬유·의류 141.03 147.24 4.40 107124162 449845448978 + """ market = {"KRX": 2, "KOSPI": 3, "KOSDAQ": 4}.get(market, 3) df = MKD80002().read(fromdate, todate, market) df = df[['kor_indx_ind_nm', 'indx', 'prv_dd_indx', 'updn_rate', 'tr_vl', 'tr_amt']] @@ -229,6 +269,19 @@ def get_index_price_change_by_name(fromdate, todate, market): return df +def _get_index_volume_by_date(df): + df = df[['dt', 'tot', 'stk', 'sect', 'reit']] + df.columns = ['날짜', '전체', '주권', '투자회사', '부동산투자회사'] + df = df.set_index('날짜') + # df.columns = pd.MultiIndex.from_arrays([['전체', '종류별', '종류별', '종류별'], ['', '주권', '투자회사', + # '부동산투자회사']]) + df = df.replace(',', '', regex=True) + df = df.replace('', 0) + df = df.astype({"전체": np.int64, "주권": np.int64, "투자회사": np.int64, "부동산투자회사": np.int64}) + df.index = pd.to_datetime(df.index, format='%Y/%m/%d') + return df + + @dataframe_empty_handler def get_index_portfolio_deposit_file(date, id, market): market = {"KOSPI": 1, "KOSDAQ": 2}.get(market, 1) @@ -439,8 +492,9 @@ def get_shorting_balance_top50(date, market="KOSPI"): # df = get_index_portfolio_deposit_file("20190410", "001", "KOSDAQ") # df = get_index_portfolio_deposit_file("20190410", "028", "KOSPI") # df = get_index_status_by_group("20190410", "KOSPI") - df = get_index_price_change_by_name("20200520", "20200527", "KOSDAQ") - print(df) + # df = get_index_price_change_by_name("20200520", "20200527", "KOSDAQ") + # df = get_market_trading_volume_by_date("20200519", "20200526", 'kospi') + df = get_market_trading_value_by_date("20200519", "20200526", 'kospi') # shoring # df = get_shorting_status_by_date("20190401", "20190405", "KR7005930003") @@ -450,4 +504,4 @@ def get_shorting_balance_top50(date, market="KOSPI"): # df = get_shorting_volume_top50("20190211") # df = get_shorting_balance_by_ticker("20190211", "20190215", "KR7005930003") # df = get_shorting_balance_top50("20190401") - # print(df) + print(df) diff --git a/readme.MD b/readme.MD index 92db6cf..d34bf89 100644 --- a/readme.MD +++ b/readme.MD @@ -169,6 +169,36 @@ print(df.head(2)) 201809 1.79 28126 7.91 5997 ``` + + +#### 2.1.1.6 일자별 거래실적 추이 (거래량) +일자별 시장의 거래량을 반환하며, KOSPI / KOSDAQ / KONEX 세 개의 시장을 지원합니다. +거래량/거래대금 합계 항목은 주식(외국주,DR포함), 증권투자회사, REITs, 선박투자회사, 사회간접자본투융자회사가 포함되어 있습니다. +```python +df = stock.get_market_trading_volume_by_date(("20200519", "20200526", "KOSPI") +print(df.head()) +``` + + +#### 2.1.1.7 일자별 거래실적 추이 (거래대금) +일자별 시장의 거래 대금을 원 단위로 반환하며 KOSPI / KOSDAQ / KONEX 세 개의 시장을 지원한다. +거래량/거래대금 합계 항목은 주식(외국주,DR포함), 증권투자회사, REITs, 선박투자회사, 사회간접자본투융자회사가 포함되어 있습니다. +```python +df = stock.get_market_trading_value_by_date(("20200519", "20200526", "KOSPI") +print(df.head()) +``` + +```text + 전체 주권 투자회사 부동산투자회사 +2020-05-26 12545313579000 12524370281000 3260524000 7982490000 +2020-05-25 7960324756000 7936195529000 14000492000 5674769000 +2020-05-22 9509771760000 9484894049000 6685432000 12007486000 +2020-05-21 8636997699000 8619674049000 1535003000 9285644000 +2020-05-20 8248632036000 8233849994000 1333854000 3746196000 +2020-05-19 11918300290000 11900636354000 1651565000 6939447000 +``` + + ### 2.1.2 인덱스 조회 API 코스피 인덱스를 조회합니다. @@ -226,8 +256,11 @@ print(df.head()) 코스피 50 2000.03.02 2000.01.04 1000.0 1884.17 960728527 코스피 200 중소형주 2015.07.13 2010.01.04 1000.0 1011.56 118938839 ``` + #### 2.1.2.4 인덱스 등락률 조회 -get_index_price_change_by_name() 함수는 지수의 등락률/거래량/거래대금을 반환합니다. +get_index_price_change_by_name() 함수는 지수의 등락률/거래량/거래대금을 반환하며, KRX / KOSPI / KOSDAQ 세 개의 지수를 +지원합니다. +코스피, 코스닥 지수의 통계(거래량, 거래대금 등)는 외국주 등까지 포함한 시장 전체 통계입니다. ```python df = stock.get_index_price_change_by_name("20200520", "20200527", "KOSDAQ") print(df.head())