Source code for pyqqq.data.snapshot

from typing import Optional
from pyqqq.utils.api_client import raise_for_status, send_request
from pyqqq.utils.logger import get_logger
import datetime as dtm
import pandas as pd
import numpy as np
import pyqqq.config as c


logger = get_logger(__name__)


[docs] def get_all_snapshot_for_date(date: dtm.date) -> pd.DataFrame: """ 전 종목 데이터를 반환합니다. 2018년 1월 1일 데이터 부터 조회 가능합니다. Args: date (dtm.date): 조회 일자. Returns: pd.DataFrame: 전 종목의 snapshot 데이터가 포함된 pandas DataFrame. DataFrame의 열은 다음과 같습니다. - date (dtm.date): 거래일자. - market (str): 거래소. - code (str): 종목코드. - name (str): 종목명. - type (str): 종목유형. - change (int): 대비. - change_percent (float): 등락률. - open (int): 시가. - high (int): 고가. - low (int): 저가. - close (int): 종가. - volume (int): 거래량. - value (int): 거래대금. - market_cap (int): 시가총액. - shares (int): 상장주식수. - listing_date (dtm.datetime) 상장일. - days_since_listing (int): 상장 이후 경과한 일수. - administrative_issue (bool): 관리종목 여부. - alert_issue (str): 투자경고 구분. - fiscal_quarter_end (str): 회계분기. - sales_account (int): 매출액. - cumulative_sales_account (int): 누적 매출액. - operating_profit (int): 영업이익. - cumulative_operating_profit (int): 누적 영업이익. - net_income (int): 순이익. - cumulative_net_income (int): 누적 순이익. - current_assets (int): 유동자산. - fixed_assets (int): 고정자산. - total_assets (int): 자산총계. - flow_liabilities (int): 유동부채. - fixed_liabilities (int): 고정부채. - total_liabilities (int): 부채총계. - capital_stock (int): 자본금. - shareholders_equity (int): 자본총계. - retention_ratio (float): 유보율. - debt_ratio (float): 부채율. - roa (float): ROA. - roe (float): ROE. - eps (int): EPS. - sps (int): SPS. - per (float): PER. - pbr (float): PBR. Examples: >>> df = get_all_snapshot_for_date(dtm.datet(2020, 2, 4)) >>> print(df.head()) date market name type change ... roe eps sps per pbr code ... 000020 2020-02-04 KOSPI 동화약품 EQUITY 70 ... 0.65 52.0 10684.0 21.97 0.74 000040 2020-02-04 KOSPI KR모터스 EQUITY 0 ... -39.20 -721.0 6670.0 -0.27 0.24 000050 2020-02-04 KOSPI 경방 EQUITY 50 ... 0.88 171.0 12260.0 13.30 0.37 000060 2020-02-04 KOSPI 메리츠화재 EQUITY 0 ... NaN NaN NaN NaN NaN 000070 2020-02-04 KOSPI 삼양홀딩스 EQUITY -200 ... 4.85 5877.0 279735.0 7.60 0.36 ... ... ... ... ... ... ... ... ... ... ... ... 950130 2020-02-04 KOSDAQ 엑세스바이오 EQUITY 95 ... -57.13 -577.0 1594.0 -13.25 1.63 950140 2020-02-04 KOSDAQ 잉글우드랩 EQUITY 200 ... 3.37 76.0 6511.0 -17.88 1.69 950160 2020-02-04 KOSDAQ 코오롱티슈진 EQUITY 0 ... NaN NaN NaN NaN NaN 950170 2020-02-04 KOSDAQ JTC EQUITY 410 ... NaN NaN NaN NaN NaN 950180 2020-02-04 KOSDAQ SNK EQUITY -50 ... NaN NaN NaN NaN NaN """ url = f"{c.PYQQQ_API_URL}/snapshot/daily/all/{date}" r = send_request("GET", url) raise_for_status(r) rows = r.json() for data in rows: for iso_date in ["date", "listing_date"]: value = data[iso_date] data[iso_date] = dtm.date.fromisoformat(value) df = pd.DataFrame(rows) return _to_snapshot(df)
[docs] def get_snapshot_by_code_for_period( code: str, start_date: dtm.date, end_date: Optional[dtm.date] = None, ) -> pd.DataFrame: """ 지정된 종목과 기간에 대한 데이터를 반환합니다. 2018년 1월 1일 데이터 부터 조회 가능합니다. Args: code (str): 조회할 주식 코드. start_date (dtm.date): 조회할 기간의 시작 날짜. end_date (Optional[dtm.date]): 조회할 기간의 종료 날짜. 지정하지 않으면 최근 거래일 까지 조회됩니다. Returns: pd.DataFrame: 전 종목의 snapshot 데이터가 포함된 pandas DataFrame. DataFrame의 열은 다음과 같습니다. - date (dtm.date): 거래일자. - market (str): 거래소. - code (str): 종목코드. - name (str): 종목명. - type (str): 종목유형. - change (int): 대비. - change_percent (float): 등락률. - open (int): 시가. - high (int): 고가. - low (int): 저가. - close (int): 종가. - volume (int): 거래량. - value (int): 거래대금. - market_cap (int): 시가총액. - shares (int): 상장주식수. - listing_date (dtm.datetime) 상장일. - days_since_listing (int): 상장 이후 경과한 일수. - administrative_issue (bool): 관리종목 여부. - alert_issue (str): 투자경고 구분. - fiscal_quarter_end (str): 회계분기. - sales_account (int): 매출액. - cumulative_sales_account (int): 누적 매출액. - operating_profit (int): 영업이익. - cumulative_operating_profit (int): 누적 영업이익. - net_income (int): 순이익. - cumulative_net_income (int): 누적 순이익. - current_assets (int): 유동자산. - fixed_assets (int): 고정자산. - total_assets (int): 자산총계. - flow_liabilities (int): 유동부채. - fixed_liabilities (int): 고정부채. - total_liabilities (int): 부채총계. - capital_stock (int): 자본금. - shareholders_equity (int): 자본총계. - retention_ratio (float): 유보율. - debt_ratio (float): 부채율. - roa (float): ROA. - roe (float): ROE. - eps (int): EPS. - sps (int): SPS. - per (float): PER. - pbr (float): PBR. Examples: >>> df = get_snapshot_by_code_for_period("005930", dtm.date(2018, 1, 1), dtm.date(2018, 1, 31)) >>> print(df) date market name type change ... roe eps sps per pbr code ... 005930 2018-01-02 KOSPI 삼성전자 EQUITY 3000 ... 20.06 3804 30021 None None 005930 2018-01-03 KOSPI 삼성전자 EQUITY 30000 ... 20.06 3804 30021 None None 005930 2018-01-04 KOSPI 삼성전자 EQUITY -27000 ... 20.06 3804 30021 None None 005930 2018-01-05 KOSPI 삼성전자 EQUITY 52000 ... 20.06 3804 30021 None None 005930 2018-01-08 KOSPI 삼성전자 EQUITY -5000 ... 20.06 3804 30021 None None 005930 2018-01-09 KOSPI 삼성전자 EQUITY -81000 ... 20.06 3804 30021 None None 005930 2018-01-10 KOSPI 삼성전자 EQUITY -78000 ... 20.06 3804 30021 None None 005930 2018-01-11 KOSPI 삼성전자 EQUITY -30000 ... 20.06 3804 30021 None None 005930 2018-01-12 KOSPI 삼성전자 EQUITY -2000 ... 20.06 3804 30021 None None 005930 2018-01-15 KOSPI 삼성전자 EQUITY 17000 ... 20.06 3804 30021 None None 005930 2018-01-16 KOSPI 삼성전자 EQUITY 73000 ... 20.06 3804 30021 None None 005930 2018-01-17 KOSPI 삼성전자 EQUITY -19000 ... 20.06 3804 30021 None None 005930 2018-01-18 KOSPI 삼성전자 EQUITY 14000 ... 20.06 3804 30021 None None 005930 2018-01-19 KOSPI 삼성전자 EQUITY -29000 ... 20.06 3804 30021 None None 005930 2018-01-22 KOSPI 삼성전자 EQUITY -54000 ... 20.06 3804 30021 None None 005930 2018-01-23 KOSPI 삼성전자 EQUITY 46000 ... 20.06 3804 30021 None None 005930 2018-01-24 KOSPI 삼성전자 EQUITY 9000 ... 20.06 3804 30021 None None 005930 2018-01-25 KOSPI 삼성전자 EQUITY 46000 ... 20.06 3804 30021 None None 005930 2018-01-26 KOSPI 삼성전자 EQUITY 26000 ... 20.06 3804 30021 None None 005930 2018-01-29 KOSPI 삼성전자 EQUITY 22000 ... 20.06 3804 30021 None None 005930 2018-01-30 KOSPI 삼성전자 EQUITY -71000 ... 20.06 3804 30021 None None 005930 2018-01-31 KOSPI 삼성전자 EQUITY 5000 ... 20.06 3804 30021 None None """ url = f"{c.PYQQQ_API_URL}/snapshot/daily/series" params = { "code": code, "start_date": start_date, } if end_date is not None: params["end_date"] = end_date r = send_request("GET", url, params=params) raise_for_status(r) rows = r.json() for data in rows: for iso_date in ["date", "listing_date"]: value = data[iso_date] data[iso_date] = dtm.date.fromisoformat(value) df = pd.DataFrame(rows) return _to_snapshot(df)
def _to_snapshot(df: pd.DataFrame) -> pd.DataFrame: alert = {0: None, 1: "caution", 2: "alert", 3: "risk"} if df.empty: return df dtypes = df.dtypes for k in [ "change", "open", "high", "low", "close", "volume", "value", "market_cap", "shares", "days_since_listing", "sales_account", "cumulative_sales_account", "operating_profit", "cumulative_operating_profit", "net_income", "cumulative_net_income", "current_assets", "fixed_assets", "total_assets", "flow_liabilities", "fixed_liabilities", "total_liabilities", "capital_stock", "shareholders_equity", ]: if k in dtypes: dtypes[k] = np.dtype("int64") for k in ["change_percent", "retention_ratio", "debt_ratio", "roa", "roe", "per", "pbr"]: if k in dtypes: dtypes[k] = np.dtype("float64") df["alert_issue"] = df["alert_issue"].apply(lambda level: alert[level]) df = df[ [ "date", "market", "code", "name", "type", "change", "change_percent", "open", "high", "low", "close", "volume", "value", "market_cap", "shares", "listing_date", "days_since_listing", "administrative_issue", "alert_issue", "fiscal_quarter_end", "sales_account", "cumulative_sales_account", "operating_profit", "cumulative_operating_profit", "net_income", "cumulative_net_income", "current_assets", "fixed_assets", "total_assets", "flow_liabilities", "fixed_liabilities", "total_liabilities", "capital_stock", "shareholders_equity", "retention_ratio", "debt_ratio", "roa", "roe", "eps", "sps", "per", "pbr", ] ] df.set_index("code", inplace=True) return df