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
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")
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)
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]
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)
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")
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)
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)
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'")
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)
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
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