def test_get_stock_pack(): col_12003 = set(data_reader("12003", item="삼성전자").columns) col_12021 = set( data_reader("12021", item="삼성전자", search_type="개별추이").columns) col_12023 = set( data_reader("12023", item="삼성전자", search_type="개별추이").columns) col_12029 = set(get_df_12009("삼성전자").columns) col_union = col_12003 | col_12021 | col_12023 | col_12029 assert col_union.intersection(set(get_stock_pack("삼성전자").columns))
def get_stock_pack( stock: str, start: str = get_past_days_ago(), end: str = get_today() ) -> pd.DataFrame: """주어진 기간의 일자별 개별종목의 정보들을 합쳐 하나의 데이터프레임으로 가져온다. Parameters ---------- stock : str 종목번호(ticker) 또는 종목명 start : str, default : 오늘 날짜의 60일 전 날짜 데이터 검색 시작 일자 (예: '20210324') end : str, default : 오늘 날짜 데이터 검색 끝 일자 (예: '20210407') Returns ------- pd.DataFrame KRX 정보데이터시스템의 개별종목 정보들을 합쳐놓은 DataFrame 반환 """ stock_list = get_stock_info().loc[:, ["종목코드", "종목명"]] if stock in stock_list["종목코드"].array: item = convert_stock_ticker2name(stock) item_code = stock elif stock in stock_list["종목명"].array: item = stock item_code = convert_stock_name2ticker(stock) else: raise Exception(f"Not in stock list : {stock}") # [12003] 개별종목 시세 추이 df_12003 = data_reader("12003", item=item, start=start, end=end) # [12021] PER/PBR/배당수익률(개별종목) df_12021 = data_reader("12021", search_type="개별추이", item=item, start=start, end=end) # [12023] 외국인보유량(개별종목) df_12023 = data_reader("12023", search_type="개별추이", item=item, start=start, end=end) # [12009] 투자자별 거래실적(개별종목) df_12009 = get_df_12009(item=item, start=start, end=end) print("< 일자별 개별종목 종합정보 조회 >") print(f"종목명: {item} // 종목코드: {item_code} // 조회기간: {start}~{end}") df = pd.concat([df_12003, df_12021, df_12023, df_12009], axis="columns") # DataFrame을 Columns 기준으로 합침 df = df.loc[:, ~df.columns.duplicated()].sort_index( # 중복되는 Columns 제외 ascending=False) # 최신 날짜가 위로 올라오도록 정렬 return df
def get_stock_info() -> pd.DataFrame: """KRX(KOSPI ,KOSDAQ) 종목 정보(종목코드, 종목명, 시장구분, 업종명, 시가총액) 반환""" df_12025_kospi = data_reader( "12025", division="KOSPI").loc[:, ["종목코드", "종목명", "시장구분", "업종명", "시가총액"]] df_12025_kosdaq = data_reader( "12025", division="KOSDAQ").loc[:, ["종목코드", "종목명", "시장구분", "업종명", "시가총액"]] df_12025 = (pd.concat([df_12025_kospi, df_12025_kosdaq]).astype({ "시장구분": "category", "시가총액": "int64" }).sort_values(by=["시가총액"], ascending=False).reset_index(drop=True)) return df_12025
def etn(item="all", start=None, end=None): """ Parameters ---------- item : str ETN 종목명 또는 ETN 종목코드를 입력. default 값은 "all"이며 전종목 시세를 반환한다. start : int, str 검색 시작일, default 값은 오늘로부터 60일 이전 end : int, str 검색 종료일, default 값은 오늘 Returns -------- ETN data : DataFrame """ _utils.start_end_validation(start, end) if item == "all": return data_reader("13201") else: if _utils.classifier(item) == "item code": return data_reader("13203", item_code=item, start=start, end=end) else: return data_reader("13203", item=item, start=start, end=end)
def get(stock="all", start=None, end=None): """ Parameters ---------- stock : str 종목명 또는 종목코드를 입력. default 값은 "all"이며 전종목 시세를 반환한다. start : int, str 검색 시작일, default 값은 오늘로부터 60일 이전 end : int, str 검색 종료일, default 값은 오늘 Returns -------- Stock prices data in Kospi, Kosdaq, Konex : DataFrame """ _utils.start_end_validation(start, end) if stock == "all": return data_reader("12001", market="전체", day=start) else: if _utils.classifier(stock) == "item code": return data_reader("12003", start=start, end=end, item_code=stock) else: return data_reader("12003", start=start, end=end, item=stock)
def bond(item="all", start=None, end=None): """ Parameters ---------- item : str 채권 종목명 또는 채권 종목코드를 입력. default 값은 "all"이며 국채전문유통시장, 일반채권시장, 소액채권시장의 종목들을 모두 보여준다. start : int, str 검색 시작일, default 값은 오늘로부터 60일 이전 end : int, str 검색 종료일, default 값은 오늘 Returns ------- DataFrame """ _utils.start_end_validation(start, end) if item == "all": data1 = data_reader("14001", market="국채전문유통시장") data2 = data_reader("14001", market="일반채권시장") data3 = data_reader("14001", market="소액채권시장") return pd.concat([data1, data2, data3], ignore_index=True) else: pass
def per(stock="all", start=None, end=None): """ Parameters ---------- stock : str 종목명 또는 종목코드를 입력. default 값은 "all"이며 전종목 시세를 반환한다. start : int, str 검색 시작일, default 값은 오늘로부터 60일 이전 end : int, str 검색 종료일, default 값은 오늘 Returns -------- PER, EPS, PBS, BPS, 주당배당금, 배당수익률 data in Kospi, Kosdaq, Konex : DataFrame """ _utils.start_end_validation(start, end) if stock == "all": data = data_reader("12021", search_type="전종목", market="전체", day=start) # 12021 종목명 데이터에 아래와 같은 문자열이 함께 출력됨. data["종목명"] = [ name.replace('<em class ="up"></em>', "") for name in data["종목명"] ] return data else: if _utils.classifier(stock) == "item code": return data_reader("12021", search_type="개별추이", item_code=stock, start=start, end=end) else: return data_reader("12021", search_type="개별추이", item=stock, start=start, end=end)
def get_df_12009( item, start: str = get_past_days_ago(), end: str = get_today() ) -> pd.DataFrame: """[12009] 투자자별 거래실적(개별종목) 조회 기능에서 2개 표(거래량-순매수, 거래대금-순매수)를 하나의 DataFrame으로 합쳐서 반환 Parameters ---------- item : str pack() 함수의 parameter인 stock이 종목명일 때 종목명을 가져옴 item_code : str pack() 함수의 parameter인 stock이 종목코드일 때 종목코드를 가져옴 start : str pack() 함수의 parameter인 start 일자를 가져옴 end : str pack() 함수의 parameter인 end 일자를 가져옴 Returns ------- pd.DataFrame 개별종목의 투자자별 거래실적 상세 항목을 모두 포함한 DataFrame 반환 """ trdvolval_list = ["거래량", "거래대금"] # trdVolVal {1: '거래량', 2: '거래대금'} askbid_list = ["순매수"] # askBid {1: '매도', 2: '매수', 3: '순매수'} df_list = [] for trdvolval in trdvolval_list: for askbid in askbid_list: df_temp = data_reader( "12009", item=item, start=start, end=end, search_type="일별추이", trade_index=trdvolval, trade_check=askbid, ) df_temp = df_temp.drop( ["종목명"], axis="columns").add_prefix( # 매 번 반복되는 종목명 column 제거 f"{trdvolval}_") df_temp.columns = df_temp.columns.str.replace(" 합계", "") df_list.append(df_temp) df = pd.concat(df_list, axis="columns") return df