Exemple #1
0
def get_ksh_tickbar(order_book_id, start_date, end_date, fields, market):
    order_book_id = ensure_order_book_id(order_book_id)
    start_date, end_date = ensure_date_range(start_date, end_date, datetime.timedelta(days=3))
    data = get_client().execute(
        "get_ksh_tickbar", order_book_id, start_date, end_date, fields, market
    )
    today = today_int()
    if data:
        data = [(obid, {k: np.frombuffer(*v) for k, v in d.items()}) for obid, d in data]
        df_list = []
        for obid, d in data:
            df = pd.DataFrame(d)
            df_list.append(df)

        df = pd.concat(df_list)  # type: pd.DataFrame
        df["datetime"] = int17_to_datetime_v(df["datetime"].values)
        history_latest_date = date_to_int8(df.iloc[-1]["datetime"])
        df.set_index("datetime", inplace=True)
    else:
        df = None
        history_latest_date = date_to_int8(get_previous_trading_date(today, market=market))

    if history_latest_date >= end_date or start_date > today or history_latest_date >= today:
        return df

    live_df = get_today_ksh_tick(order_book_id, today, fields, market=market)
    if live_df is None:
        return df
    if df is None:
        return live_df
    return pd.concat([df, live_df])
Exemple #2
0
def performance_forecast(order_book_id, info_date=None, end_date=None, fields=None, market="cn"):
    """获取业绩预报

    :param order_book_id: 股票代码,如'000001.XSHE'
    :param info_date: 信息发布日期,如'20180501',默认为最近的交易日 (Default value = None)
    :param end_date: 业绩预计报告期,如'20180501',默认为最近的交易日 (Default value = None)
    :param fields: str或list类型. 默认为None,返回所有字段 (Default value = None)
    :param market:  (Default value = "cn")
    :returns: pd.DataFrame

    """
    order_book_id = ensure_order_book_id(order_book_id)

    if info_date:
        info_date = ensure_date_int(info_date)
    elif end_date:
        end_date = ensure_date_int(end_date)
    else:
        info_date = ensure_date_int(datetime.datetime.today())

    if fields:
        fields = ensure_list_of_string(fields, "fields")
        check_items_in_container(fields, PERFORMANCE_FORECAST_FIELDS, "fields")
    else:
        fields = PERFORMANCE_FORECAST_FIELDS

    data = get_client().execute(
        "performance_forecast", order_book_id, info_date, end_date, fields, market=market
    )
    if not data:
        return
    df = pd.DataFrame(data)[["info_date", "end_date"] + fields]
    return df
Exemple #3
0
def _is_st_stock(order_book_id, date=None, market="cn"):
    """判断股票在给定日期是否是ST股
    :param order_book_id: 股票id
    :param date:  (Default value = None)
    :param market:  (Default value = "cn")
    :returns: True or False
    """
    order_book_id = ensure_order_book_id(order_book_id, type="CS", market=market)
    date = ensure_date_or_today_int(date)
    df = is_st_stock(order_book_id, start_date=date, end_date=date, market=market)
    if df is None or df.empty:
        return False
    else:
        return df[order_book_id][0]
Exemple #4
0
def index_components(order_book_id,
                     date=None,
                     start_date=None,
                     end_date=None,
                     market="cn"):
    """获取指数成分
    :param order_book_id: 指数 id
    :param date: 指定日期;如不指定,返回最近一个交易日的数据
    :param start_date: 指定开始日期,不能和date同时指定
    :param end_date: 指定结束日期, 需和start_date同时指定并且应当不小于开始日期
    :param market:  (Default value = "cn")
    :returns list or dict
    """
    order_book_id = ensure_order_book_id(order_book_id)

    if date and (start_date or end_date):
        raise ValueError(
            "date cannot be input together with start_date or end_date")
    elif (start_date and not end_date) or (end_date and not start_date):
        raise ValueError("start_date and end_date need to be applied together")

    if start_date:
        start_date, end_date = ensure_date_range(start_date, end_date)
        trading_dates = get_trading_dates_in_type(start_date,
                                                  end_date,
                                                  expect_type="int")
        if not trading_dates:
            return
        data = get_client().execute("index_components_v2",
                                    order_book_id,
                                    trading_dates[0],
                                    trading_dates[-1],
                                    market=market)
        if not data:
            return
        data = {d["trade_date"]: d["component_ids"] for d in data}
        dates = sorted(data.keys())
        for trading_date in trading_dates:
            if trading_date not in data:
                position = bisect.bisect_left(dates, trading_date) - 1
                data[trading_date] = data[dates[position]]
        return {int8_to_datetime(i): data[i] for i in trading_dates}

    if date:
        date = ensure_date_int(date)
    return get_client().execute("index_components",
                                order_book_id,
                                date,
                                market=market)
Exemple #5
0
    def data(order_book_id,
             start_date=None,
             end_date=None,
             frequency="1d",
             fields=None):
        """获取天猫电商销售额数据

        :param order_book_id: 股票名
        :param start_date: 开始日期,默认为结束日期前一个月,  必须在2016年6月30日之后 (Default value = None)
        :param end_date: 结束日期 (Default value = None)
        :param frequency: 如'1d', '1M' (Default value = "1d")
        :param fields: 如'sales' (Default value = None)
        :returns: 返回DataFrame

        """
        order_book_id = ensure_order_book_id(order_book_id)

        if not end_date:
            end_date = datetime.date.today()

        if not start_date:
            start_date = end_date - datetime.timedelta(days=30)

        end_date = to_datetime(end_date)
        start_date = to_datetime(start_date)

        if start_date < datetime.datetime(2016, 6, 30):
            raise ValueError("start_date cannot be earlier than 2016-06-30")

        if start_date > end_date:
            raise ValueError()

        ensure_string(frequency, "frequency")
        check_items_in_container([frequency], {"1d", "1M"}, "frequency")

        if fields is None:
            fields = "sales"
        else:
            fields = ensure_string(fields, "fields")
            check_items_in_container(fields, ["sales"], "fields")
        data = get_client().execute("tmall.data", order_book_id, start_date,
                                    end_date, frequency)
        if not data:
            return
        df = pd.DataFrame(data)
        df = df.set_index("date")
        df.sort_index(inplace=True)
        df.columns = ["sales"]
        return df
Exemple #6
0
def index_weights(order_book_id, date=None, market="cn"):
    """获取指数的权重

    :param order_book_id: 如'000300.XSHG'和'000905.XSHG'
    :param market: 地区代码, 如 'cn' (Default value = "cn")
    :param date: 指定日期;如不指定,返回最近一个交易日的
    :returns: 返回输入日期最近交易日该指数的权重

    """
    index_name = ensure_order_book_id(order_book_id)
    if date:
        date = ensure_date_int(date)
    data = get_client().execute("index_weights", index_name, date, market=market)
    if not data:
        return None

    s = pd.Series({d["order_book_id"]: d["weight"] for d in data})
    s.index.name = "order_book_id"
    return s
Exemple #7
0
def real_cash_flow(order_book_id, date=None, market="cn"):
    """获取现金流信息

    :param order_book_id: 可转债ID str
    :param date: 日期,返回该日前已经发生的所有现金流,默认返回所有
    :param market:  (Default value = "cn")
    :return: pd.DataFrame
    """
    order_book_id = ensure_order_book_id(order_book_id)
    if date:
        date = ensure_date_int(date)
    data = get_client().execute("convertible.real_cash_flow",
                                order_book_id,
                                date,
                                market=market)
    if not data:
        return
    df = pd.DataFrame(data)
    df.set_index(["order_book_id", "payment_date"], inplace=True)
    return df
Exemple #8
0
def get_share_transformation(predecessor=None, market="cn"):
    """
    获取转股信息
    :param predecessor: 换股前的股票代码。默认为空,返回所有转股信息
    :param market:  (Default value = "cn")
    :return pd.DataFrame
    """
    if predecessor:
        predecessor = ensure_order_book_id(predecessor)
    data = get_client().execute("get_share_transformation",
                                predecessor,
                                market=market)
    if not data:
        return
    columns = [
        "predecessor", "successor", "effective_date", "share_conversion_ratio",
        "predecessor_delisted", "discretionary_execution",
        "predecessor_delisted_date", "event"
    ]
    df = pd.DataFrame(data, columns=columns)
    df = df.sort_values('predecessor').reset_index(drop=True)
    return df
Exemple #9
0
def get_cash_flow(order_book_id, start_date=None, end_date=None, market="cn"):
    """获取现金流信息

    :param order_book_id: 可转债ID str
    :param start_date: 开始日期,默认为None
    :param end_date: 结束日期,默认为None
    :param market:  (Default value = "cn")
    :return: pd.DataFrame
    """
    order_book_id = ensure_order_book_id(order_book_id)
    if start_date:
        start_date = ensure_date_int(start_date)
    if end_date:
        end_date = ensure_date_int(end_date)
    data = get_client().execute("convertible.get_cash_flow",
                                order_book_id,
                                start_date,
                                end_date,
                                market=market)
    if not data:
        return
    df = pd.DataFrame(data)
    df.set_index(["order_book_id", "payment_date"], inplace=True)
    return df
Exemple #10
0
def current_performance(
        order_book_id, info_date=None, quarter=None, interval="1q", fields=None, market="cn"
):
    """获取A股快报

    :param order_book_id: 股票代码, 如'000001.XSHE'
    :param info_date: 发布日期, 如'20180501', 默认为最近的交易日 (Default value = None)
    :param quarter: 发布季度, 如'2018q1' (Default value = None)
    :param interval: 数据区间, 发布日期, 如'2y', '4q' (Default value = "1q")
    :param fields: str 或 list 类型. 默认为 None, 返回所有字段 (Default value = None)
    :param market: 地区代码, 如'cn' (Default value = "cn")
    :returns: pd.DataFrame

    """
    order_book_id = ensure_order_book_id(order_book_id, market=market)
    end_date = None
    if info_date:
        info_date = ensure_date_int(info_date)
    elif quarter:
        splited = quarter.lower().split("q")
        if len(quarter) != 6 or len(splited) != 2:
            raise ValueError(
                "invalid argument {}: {}, valid parameter: {}".format(
                    "quarter", quarter, "string format like '2016q1'"
                )
            )

        year, quarter = int(splited[0]), int(splited[1])
        if not 1 <= quarter <= 4:
            raise ValueError(
                "invalid argument {}: {}, valid parameter: {}".format(
                    "quarter", quarter, "quarter should be in [1, 4]"
                )
            )
        month, day = QUARTER_DATE_MAP[quarter]
        end_date = ensure_date_int(datetime.datetime(year, month, day))
    else:
        info_date = ensure_date_int(datetime.date.today())
    ensure_string(interval, "interval")
    if interval[-1] not in ("y", "q", "Y", "Q"):
        raise ValueError(
            "invalid argument {}: {}, valid parameter: {}".format(
                "interval", interval, "interval unit should be q(quarter) or y(year)"
            )
        )

    try:
        int(interval[:-1])
    except ValueError:
        raise ValueError(
            "invalid argument {}: {}, valid parameter: {}".format(
                "interval", interval, "string like 4q, 2y"
            )
        )
    interval = interval.lower()

    if fields is not None:
        fields = ensure_list_of_string(fields, "fields")
        check_items_in_container(fields, PERFORMANCE_FIELDS, "fields")
    else:
        fields = PERFORMANCE_FIELDS

    data = get_client().execute(
        "current_performance", order_book_id, info_date, end_date, fields, market=market
    )
    if not data:
        return
    df = pd.DataFrame(data)
    sort_field = "info_date" if info_date else "end_date"
    df.sort_values(by=[sort_field, "mark"], ascending=[False, True], inplace=True)
    df.drop_duplicates(subset="end_date", keep="first", inplace=True)
    num = int(interval[:-1])
    unit = interval[-1]
    if unit == "y":
        latest_month = df.loc[0, "end_date"].month
        df["month"] = df.end_date.apply(lambda x: x.month)
        df = df[df.month == latest_month]
    df.reset_index(drop=True, inplace=True)
    return df.loc[: num - 1, ["end_date", "info_date"] + fields]
Exemple #11
0
def get_factor(order_book_ids,
               factor,
               start_date=None,
               end_date=None,
               universe=None,
               expect_df=False,
               **kwargs):
    """获取因子

    :param order_book_ids: 股票代码或代码列表
    :param factor: 如 'total_income'
    :param date: 如 date='2015-01-05', 默认为前一交易日
    :param start_date: 开始日期'2015-01-05', 默认为前一交易日, 最小起始日期为'2000-01-04'
    :param end_date: 结束日期
    :param universe: 股票池,默认为全A股
    :param expect_df: 返回 MultiIndex DataFrame (Default value = False)
    :returns: pd.DataFrame
    """

    order_book_ids = ensure_order_book_ids(order_book_ids, type="CS")
    order_book_ids = list(set(order_book_ids))

    factor = ensure_list_of_string(factor)
    factor = list(OrderedDict.fromkeys(factor))

    if start_date and end_date:
        start_date, end_date = ensure_date_range(start_date, end_date,
                                                 datetime.timedelta(days=15))
        if start_date < 20000104:
            warnings.warn(
                "start_date is earlier than 2000-01-04, adjusted to 2000-01-04"
            )
            start_date = 20000104
    elif start_date:
        raise ValueError("Expect end_date")
    elif end_date:
        raise ValueError("Expect start_date")
    else:
        date = kwargs.pop("date", None)
        date = ensure_date_int(
            date or get_previous_trading_date(datetime.date.today()))
        start_date = end_date = date

    if kwargs:
        raise ValueError('unknown kwargs: {}'.format(kwargs))

    if universe is not None:
        universe = ensure_string(universe, "universe")
        if universe != "all":
            universe = ensure_order_book_id(universe, type="INDX")
            from rqdatac import index_components
            allowed_order_book_ids = set(
                index_components(universe, date=end_date) or [])
            not_permit_order_book_ids = [
                order_book_id for order_book_id in order_book_ids
                if order_book_id not in allowed_order_book_ids
            ]
            if not_permit_order_book_ids:
                warnings.warn(
                    "%s not in universe pool, value of those order_book_ids will always be NaN"
                    % not_permit_order_book_ids)

    data = get_client().execute("get_factor_from_store",
                                order_book_ids,
                                factor,
                                start_date,
                                end_date,
                                universe=universe)

    if not data:
        return

    factor_value_length = len(data[0][2])
    if factor_value_length == 0:
        return

    dates = pd.to_datetime(get_trading_dates(start_date, end_date))
    if len(dates) > factor_value_length:
        _get_factor_warning_msg(dates[factor_value_length], dates[-1])
        dates = dates[0:factor_value_length]

    if expect_df or len(factor) > 1:
        order_book_id_index_map = {o: i for i, o in enumerate(order_book_ids)}
        factor_index_map = {f: i for i, f in enumerate(factor)}
        arr = np.full((len(order_book_ids) * len(dates), len(factor)), np.nan)

        for order_book_id, factor_name, values in data:
            order_book_id_index = order_book_id_index_map[order_book_id]
            factor_index = factor_index_map[factor_name]
            slice_ = slice(order_book_id_index * len(dates),
                           (order_book_id_index + 1) * len(dates), None)
            arr[slice_, factor_index] = values

        multi_index = pd.MultiIndex.from_product(
            [order_book_ids, dates], names=["order_book_id", "date"])
        df = pd.DataFrame(index=multi_index, columns=factor, data=arr)
        return df

    order_book_id_index_map = {o: i for i, o in enumerate(order_book_ids)}
    arr = np.full((len(dates), len(order_book_ids)), np.nan)
    for order_book_id, _, values in data:
        arr[:, order_book_id_index_map[order_book_id]] = values
    df = pd.DataFrame(index=dates, columns=order_book_ids, data=arr)

    if len(df.index) == 1:
        return df.iloc[0]
    if len(df.columns) == 1:
        return df[df.columns[0]]
    return df