Exemplo n.º 1
0
    def read_date(self, date=None, *, kind='stock', api=False):
        """
        해당 일자의 전 종목 주식 데이터를 불러온다.

        Parameters
        ----------
        date : str
            조회하고자 하는 데이터의 조회일.
            형태는 YYYY-MM-DD가 되어야 한다. 예) 2021-06-01
        kind : str, default "stock"
            조회하고자 하는 데이터의 종류.
            데이터의 종류 - krx : ["stock", "etf", "etn", "elw", "per"]
        api : bool, default False
           api_key가 설정되어 있지 않으면서 api가 True면 error가 발생한다.

        Returns
        -------
        pd.DataFrame
            data
        """

        if api and kind in KrxReader.not_service_api:
            raise ValueError(f"{kind} does not service api yet.")

        if date is None:
            warnings.warn("""date is None.
                          It would lead an error because datetime.datetime.now() is default 
                          and it could be holiday when stock marker was not held 
                          or before stock marker is opened""")

        self._date_check(date)
        date_8_digit = self._date_convert(date)
        self._kind_check(kind)
        self._api_key_check(api)

        if api:
            return krx_db.read_date(date,
                                    kind=kind,
                                    resource='krx',
                                    api_key=self.api_key)

        if kind == "stock":
            return data_reader("12001", date=date_8_digit, kind=kind)
        elif kind == "per":
            df = data_reader("12021",
                             search_type="전종목",
                             market='전체',
                             date=date_8_digit)
            # 12021 기능 호출시 종목명 <em class ="up"></em> 가 붙어서 나오는 문제를 해결하기 위함
            df.replace(' <em class ="up"></em>', '', regex=True, inplace=True)
            return df
        elif kind == "etf":
            return data_reader("13101", date=date_8_digit, kind=kind)
        elif kind == "etn":
            return data_reader("13201", date=date_8_digit, kind=kind)
        elif kind == "elw":
            return data_reader('13301', date=date_8_digit, kind=kind)
        else:
            raise ValueError(
                f"Check {kind} is not in the list of expected_kind")
Exemplo n.º 2
0
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))
Exemplo n.º 3
0
def get_stock_pack(
    stock: str,
    start: str = datetime_util.get_date_past_days_ago(),
    end: str = datetime_util.get_date_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", symbol=item, start=start, end=end)
    # [12021] PER/PBR/배당수익률(개별종목)
    df_12021 = data_reader("12021",
                           search_type="개별추이",
                           symbol=item,
                           start=start,
                           end=end)
    # [12023] 외국인보유량(개별종목)
    df_12023 = data_reader("12023",
                           search_type="개별추이",
                           symbol=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")
    df = df.loc[:, ~df.columns.duplicated()].sort_index(  # 중복되는 Columns 제외
        ascending=False)  # 최신 날짜가 위로 올라오도록 정렬
    return df
Exemplo n.º 4
0
def get_stock_info(date: str = datetime_util.get_date_today()) -> pd.DataFrame:
    """KRX(KOSPI ,KOSDAQ) 종목 정보(종목코드, 종목명, 시장구분, 업종명, 시가총액) 반환"""
    df_12025_kospi = data_reader(
        "12025", division="KOSPI",
        date=date).loc[:, ["종목코드", "종목명", "시장구분", "업종명", "시가총액"]]
    df_12025_kosdaq = data_reader(
        "12025", division="KOSDAQ",
        date=date).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
Exemplo n.º 5
0
def get_df_12009(
    item,
    start: str = datetime_util.get_date_past_days_ago(),
    end: str = datetime_util.get_date_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",
                symbol=item,
                start=start,
                end=end,
                search_type="일별추이",
                trade_index=trdvolval,
                trade_check=askbid,
            )
            df_temp = df_temp.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
Exemplo n.º 6
0
    def read(self, symbol, *, start=None, end=None, kind="stock", api=False):
        """
        해당 주식 가격 데이터를 시작일(start) 부터 종료일(end) 까지 읽어온다.

        Parameters
        ----------
        symbol : str
            조회하고자 하는 데이터의 종목코드.
            형태는 종목과 종류마다 다르다. 예) 삼성전자 : '005930', ARIRANG 200 : '152100'
        start : str
            조회하고자 하는 데이터의 시작일.
            형태는 YYYY-MM-DD가 되어야 한다. 예) 2021-06-01
        end : str
            조회하고자 하는 데이터의 종료일.
            형태는 YYYY-MM-DD가 되어야 한다. 예) 2021-06-01
        kind : str, default "stock"
            조회하고자 하는 데이터의 종류.
            데이터의 종류 - krx : ["stock", "etf", "etn", "elw", "per"]
        api : bool, default False
            api_key가 설정되어 있지 않으면서 api가 True면 error가 발생한다.
            api 이용은 주식 가격만 가능하다.

        Returns
        -------
        pd.DataFrame
            data
        """

        if start is None or end is None:
            warnings.warn("""start or end is None. 
                          It would lead an error because datetime.datetime.now() is default 
                          and it could be holiday when stock marker was not held 
                          or before stock marker is opened""")

        if api and kind in KrxReader.not_service_api:
            raise ValueError(f"{kind} does not service api yet.")

        self._date_check(start)
        self._date_check(end)
        start_8_digit = self._date_convert(start)
        end_8_digit = self._date_convert(end)
        self._kind_check(kind)
        self._api_key_check(api)

        if start_8_digit > end_8_digit:
            raise ValueError(
                f"start has to be earlier than end, but {start}, {end}")

        if api:
            return krx_db.read(symbol,
                               start,
                               end,
                               kind=kind,
                               resource='krx',
                               api_key=self.api_key)

        if kind == "stock":
            return data_reader("12003",
                               symbol=symbol,
                               start=start_8_digit,
                               end=end_8_digit,
                               kind=kind)
        elif kind == "per":
            return data_reader("12021",
                               symbol=symbol,
                               start=start_8_digit,
                               end=end_8_digit,
                               kind=kind,
                               search_type="개별추이")
        elif kind == "etf":
            return data_reader("13103",
                               symbol=symbol,
                               start=start_8_digit,
                               end=end_8_digit,
                               kind=kind)
        elif kind == "etn":
            return data_reader("13203",
                               symbol=symbol,
                               start=start_8_digit,
                               end=end_8_digit,
                               kind=kind)
        elif kind == "elw":
            return data_reader('13302',
                               symbol=symbol,
                               start=start_8_digit,
                               end=end_8_digit,
                               kind=kind)
        else:
            raise ValueError(
                f"Check {kind} is not in the list of expected_kind")