Example #1
0
def get_member_rank(obj, trading_date=None, rank_by='volume', **kwargs):
    """获取指定日期最近的期货会员排名数据
    :param obj: 期货合约或品种代码
    :param trading_date: 日期
    :param rank_by: 排名依据字段
    :keyword start_date
    :keyword end_date
    :returns pandas.DataFrame or None
    """
    if not kwargs:
        trading_date = ensure_date_or_today_int(trading_date)
        ret = get_client().execute("futures.get_member_rank", obj,
                                   trading_date, rank_by)
    else:
        start_date = kwargs.pop("start_date", None)
        end_date = kwargs.pop("end_date", None)
        if kwargs:
            raise ValueError('unknown kwargs: {}'.format(kwargs))
        elif start_date and end_date:
            start_date, end_date = ensure_date_int(
                start_date), ensure_date_int(end_date)
            ret = get_client().execute("futures.get_member_rank_v2", obj,
                                       start_date, end_date, rank_by)
        else:
            raise ValueError('please ensure start_date and end_date exist')

    if not ret:
        return

    df = pd.DataFrame(ret).sort_values(by=['trading_date', 'rank'])
    df.set_index('trading_date', inplace=True)
    return df
Example #2
0
def get_instrument_industry(order_book_ids,
                            source='sws',
                            level=1,
                            date=None,
                            market="cn"):
    """获取股票对应的行业

    :param order_book_ids: 股票列表,如['000001.XSHE', '000002.XSHE']
    :param source: 分类来源。sws: 申万, citics: 中信, gildata: 聚源
    :param date: 如 '2015-01-07' (Default value = None)
    :param level:  (Default value = 1)
    :param market:  (Default value = "cn")
    :returns: code, name
        返回输入日期最近交易日的股票对应行业
    """
    order_book_ids = ensure_order_book_ids(order_book_ids)
    source = ensure_string_in(source, ["sws", "citics", "gildata"], "source")
    check_items_in_container(level, [0, 1, 2, 3], 'level')
    date = ensure_date_or_today_int(date)

    r = get_client().execute("get_instrument_industry",
                             order_book_ids,
                             source,
                             level,
                             date,
                             market=market)
    if not r:
        return
    return pd.DataFrame(r).set_index("order_book_id")
Example #3
0
def concept_list(date=None, market="cn"):
    """获取所有股票概念.

    :param date: 可指定日期,默认按当前日期返回.
    :param market: 地区代码, 如 'cn' (Default value = "cn")
    :returns: 符合指定日期内出现过的所有概念列表

    """
    date = ensure_date_or_today_int(date)
    return get_client().execute("concept_list", date, market=market)
Example #4
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]
Example #5
0
def concept_names(order_book_id, date=None, market="cn"):
    """获取证券所属的概念列表。

    :param order_book_id: 证券ID
    :param date: 可指定日期,默认按当前日期返回。
    :param market: 地区代码, 如 'cn' (Default value = "cn")
    :returns: 概念列表

    """

    date = ensure_date_or_today_int(date)
    return get_client().execute("concept_names",
                                order_book_id,
                                date,
                                market=market)
Example #6
0
def get_instrument_industry(order_book_ids,
                            source='citics',
                            level=1,
                            date=None,
                            market="cn"):
    """获取股票对应的行业

    :param order_book_ids: 股票列表,如['000001.XSHE', '000002.XSHE']
    :param source: 分类来源。citics 以及 citics_2019: 中信, gildata: 聚源
    :param date: 如 '2015-01-07' (Default value = None)
    :param level:  (Default value = 1)
    :param market:  (Default value = "cn")
    :returns: code, name
        返回输入日期最近交易日的股票对应行业
    """
    order_book_ids = ensure_order_book_ids(order_book_ids)
    source = ensure_string_in(source,
                              ["sws", "citics", "gildata", "citics_2019"],
                              "source")
    if source == "citics_2019":
        check_items_in_container(level, [0, 1, 2, 3, "citics_sector"], 'level')
    else:
        check_items_in_container(level, [0, 1, 2, 3], 'level')
    date = ensure_date_or_today_int(date)

    r = get_client().execute("get_instrument_industry",
                             order_book_ids,
                             source,
                             level,
                             date,
                             market=market)

    if not r:
        return
    res = [i['order_book_id'] for i in r]
    if source == "citics_2019" and level == "citics_sector":
        # is_special industry是否传入的是风格版块,产业板块和上下游产业版块
        from rqdatac.services import basic
        res_list = basic.instruments(res)
        date = to_date_str(date)
        for index, order_book in enumerate(res_list):
            if order_book.de_listed_date == "0000-00-00" or order_book.de_listed_date is None:
                order_book.de_listed_date = "2099-12-31"
            if not order_book.listed_date <= date <= order_book.de_listed_date:
                r.pop(index)

    return pd.DataFrame(r).set_index("order_book_id")
Example #7
0
def concept(*concepts, **kwargs):
    """获取对应某个概念的股票列表。

    可指定日期,默认按当前日期返回。目前支持的概念列表可以查询以下网址:
    https://www.ricequant.com/api/research/chn#concept-API-industry

    :param concepts: 概念字符串,如 '民营医院'
    :param date: 可指定日期,默认按当前日期返回.
    :param market: 地区代码, 如 'cn'
    :returns: 符合对应概念的股票列表

    """
    date = kwargs.pop("date", None)
    market = kwargs.pop("market", "cn")
    date = ensure_date_or_today_int(date)
    if kwargs:
        raise ValueError('unknown kwargs: {}'.format(kwargs))
    return get_client().execute("concept", concepts, date, market=market)
Example #8
0
def get_industry(industry, source='sws', date=None, market="cn"):
    """获取行业股票列表

    :param industry: 行业名称或代码
    :param source: 分类来源。sws: 申万, citics: 中信, gildata: 聚源
    :param date: 查询日期,默认为当前最新日期
    :param market:  (Default value = "cn")
    :return: 所属目标行业的order_book_id list or None
    """
    industry = ensure_string(industry, "industry")
    source = ensure_string_in(source, ["sws", "citics", "gildata"], "source")
    date = ensure_date_or_today_int(date)

    res = get_client().execute("get_industry",
                               industry,
                               source,
                               date,
                               market=market)
    return sorted(res)
Example #9
0
def concept_names(order_book_id, date=None, expect_type="str", market="cn"):
    """获取证券所属的概念列表。

    :param order_book_id: 证券ID
    :param date: 可指定日期,默认按当前日期返回。
    :param expect_type: 期望返回结果类型,可选址为:"str":返回字符串,"list":返回列表,默认为str。
    :param market: 地区代码, 如 "cn" (Default value = "cn")
    :returns: 概念列表

    """

    date = ensure_date_or_today_int(date)
    data = get_client().execute("concept_names",
                                order_book_id,
                                date,
                                market=market)
    if expect_type == "str":
        return data
    elif expect_type == "list":
        return data.split("|")
    raise ValueError("expect_type should be str like 'str' or 'list'")
Example #10
0
def get_industry(industry, source='citics', date=None, market="cn"):
    """获取行业股票列表

    :param industry: 行业名称或代码
    :param source: 分类来源。citics 以及 citics_2019: 中信, gildata: 聚源
    :param date: 查询日期,默认为当前最新日期
    :param market:  (Default value = "cn")
    :return: 所属目标行业的order_book_id list or None
    """

    industry = ensure_string(industry, "industry")
    source = ensure_string_in(source,
                              ["sws", "citics", "gildata", "citics_2019"],
                              "source")
    date = ensure_date_or_today_int(date)

    res = get_client().execute("get_industry",
                               industry,
                               source,
                               date,
                               market=market)

    if not res:
        return res

    if res[-1] == "have_sector_name":
        # have_sector_name 代表 industry传入的是风格版块,产业板块或者上下游产业版块
        from rqdatac.services import basic
        res_list = basic.instruments(res[:-1])
        res = []
        date = to_date_str(date)
        for order_book in res_list:
            if order_book.de_listed_date == "0000-00-00" or order_book.de_listed_date is None:
                order_book.de_listed_date = "2099-12-31"
            if order_book.listed_date <= date <= order_book.de_listed_date:
                res.append(order_book.order_book_id)
    return sorted(res)
Example #11
0
def get_trading_hours(order_book_id,
                      date=None,
                      expected_fmt="str",
                      frequency="1m",
                      market="cn"):
    """获取合约指定日期交易时间
      :param order_book_id: 合约代码
      :param date: 日期,默认为今天
      :param expected_fmt: 返回格式,默认为str, 也支持datetime.time和datetime.datetime格式
      :param frequency: 频率,默认为1m, 对应米筐分钟线时间段的起始, tick和1m相比区别在于每个交易时间段开盘往前移一分钟
      :param market:  (Default value = "cn")

      :return: trading_hours str or list of datetime.time/datetime.datetime list or None
      """
    date = ensure_date_or_today_int(date)
    if not is_trading_date(date, market):
        warnings.warn(" %d is not a trading date" % date)
        return

    ensure_string(order_book_id, "order_book_id")
    ins = instruments(order_book_id)
    if ins is None:
        return

    ensure_string_in(expected_fmt, ("str", "time", "datetime"), "expected_fmt")
    ensure_string_in(frequency, ("1m", "tick"), "frequency")
    date_str = to_date_str(date)

    if ins.listed_date > date_str:
        return

    if ins.type in (
            "Future", "Option"
    ) and ins.de_listed_date < date_str and ins.de_listed_date != "0000-00-00":
        return

    if ins.type not in (
            "Future", "Option"
    ) and ins.de_listed_date <= date_str and ins.de_listed_date != "0000-00-00":
        return
    if ins.type == "Repo":
        trading_hours = "09:31-11:30,13:01-15:30"
    elif ins.type == "Spot":
        if has_night_trading(date, market):
            trading_hours = "20:01-02:30,09:01-15:30"
        else:
            trading_hours = "09:01-15:30"
    elif ins.type not in ("Future",
                          "Option") or (ins.type == "Option"
                                        and ins.exchange in ("XSHG", "XSHE")):
        trading_hours = "09:31-11:30,13:01-15:00"
    else:
        trading_hours = get_client().execute("get_trading_hours",
                                             ins.underlying_symbol,
                                             date,
                                             market=market)
        if trading_hours is None:
            return
        # 前一天放假或者该品种上市首日没有夜盘
        no_night_trading = (not has_night_trading(date, market)
                            or get_underlying_listed_date(
                                ins.underlying_symbol, ins.type) == date_str)

        if no_night_trading and not trading_hours.startswith("09"):
            trading_hours = trading_hours.split(",", 1)[-1]

    if frequency == "tick":
        trading_hours = ",".join([
            s[:4] + str(int(s[4]) - 1) + s[5:]
            for s in trading_hours.split(",")
        ])

    if expected_fmt != "str":
        trading_hours = [t.split("-", 1) for t in trading_hours.split(",")]
        for i, (start, end) in enumerate(trading_hours):
            trading_hours[i][0] = str_to_dt_time(start)
            trading_hours[i][1] = str_to_dt_time(end)

        if expected_fmt == "datetime":
            td = int8_to_date(date)
            prev_td = get_previous_trading_date(date)
            prev_td_next = prev_td + datetime.timedelta(days=1)

            for i, (start, end) in enumerate(trading_hours):
                if start.hour > 16:
                    start_dt = prev_td
                    end_dt = start_dt if end.hour > 16 else prev_td_next
                else:
                    start_dt = end_dt = td
                trading_hours[i][0] = datetime.datetime.combine(
                    start_dt, start)
                trading_hours[i][1] = datetime.datetime.combine(end_dt, end)

    return trading_hours
Example #12
0
def get_securities_margin(order_book_ids,
                          start_date=None,
                          end_date=None,
                          fields=None,
                          expect_df=False,
                          market="cn"):
    """获取股票融资融券数据

    :param order_book_ids: 股票代码或代码列表
    :param start_date: 开始时间,支持 str, date, datetime, pandasTimestamp
        默认为 end_date 之前一个月 (Default value = None)
    :param end_date: 结束时间 默认为当前日期前一天 (Default value = None)
    :param fields: str 或 list 类型. 默认为 None, 返回所有字段。可选字段包括:
                   today, week, month, three_month, six_month, year, current_year, total
                   (Default value = None)
    :param expect_df: 返回 MultiIndex DataFrame (Default value = False)
    :param market: 地区代码, 如: 'cn' (Default value = "cn")
    :returns: 如果传入多个股票代码,且 fields 为多个或者 None,返回 pandas.Panel
        如果传入一只股票或者 fields 为单个字段,则返回 pandas.DataFrame
        如果传入的股票代码和字段数都是1,则返回 pandas.Series

    """

    order_book_ids = ensure_list_of_string(order_book_ids, "order_book_ids")
    all_list = []
    for order_book_id in order_book_ids:
        if order_book_id.upper() in MARGIN_SUMMARY_MAP:
            all_list.append(MARGIN_SUMMARY_MAP[order_book_id.upper()])
        else:
            inst = instruments(order_book_id, market)

            if inst.type in ["CS", "ETF", "LOF"]:
                all_list.append(inst.order_book_id)
            else:
                warnings.warn(
                    "{} is not stock, ETF, or LOF.".format(order_book_id))
    order_book_ids = all_list
    if not order_book_ids:
        raise ValueError("no valid securities in {}".format(order_book_ids))

    if fields is None:
        fields = list(MARGIN_FIELDS)
    else:
        fields = ensure_list_of_string(fields, "fields")
        check_items_in_container(fields, MARGIN_FIELDS, "fields")
        fields = ensure_order(fields, MARGIN_FIELDS)
    start_date, end_date = ensure_date_range(start_date, end_date)
    if end_date > ensure_date_or_today_int(None):
        end_date = ensure_date_or_today_int(
            get_previous_trading_date(datetime.date.today()))
    trading_dates = pd.to_datetime(
        get_trading_dates(start_date, end_date, market=market))

    data = get_client().execute("get_securities_margin",
                                order_book_ids,
                                start_date,
                                end_date,
                                market=market)
    if not data:
        return

    if expect_df:
        df = pd.DataFrame(data)
        df.sort_values(["order_book_id", "date"], inplace=True)
        df.set_index(["order_book_id", "date"], inplace=True)
        df = df.reindex(columns=fields)
        return df

    pl = pd.Panel(items=fields,
                  major_axis=trading_dates,
                  minor_axis=order_book_ids)
    for r in data:
        for field in fields:
            value = r.get(field)
            pl.at[field, r["date"], r["order_book_id"]] = value

    if len(order_book_ids) == 1:
        pl = pl.minor_xs(order_book_ids[0])
    if len(fields) == 1:
        pl = pl[fields[0]]
    if len(order_book_ids) != 1 and len(fields) != 1:
        warnings.warn(
            "Panel is removed after pandas version 0.25.0."
            " the default value of 'expect_df' will change to True in the future."
        )
    return pl