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))
Beispiel #2
0
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
Beispiel #3
0
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
Beispiel #4
0
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)
Beispiel #5
0
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)
Beispiel #6
0
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
Beispiel #7
0
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)
Beispiel #8
0
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