def get_term_to_maturity(order_book_ids, start_date=None, end_date=None, market="cn"): """获取货币型基金的持仓剩余期限 :param order_book_ids: 基金代码,str :param start_date: 开始日期 (Default value = None) :param end_date: 结束日期 (Default value = None) :param market: (Default value = "cn") :returns: DataFrame """ order_book_ids = ensure_fund(order_book_ids, market) if start_date: start_date = ensure_date_int(start_date) if end_date: end_date = ensure_date_int(end_date) result = get_client().execute("fund.get_term_to_maturity", [order_book_ids], start_date, end_date, market=market) if not result or result[0] is None: return df = pd.DataFrame(result) df = df[['date', '0_30', '30_60', '60_90', '90_120', '120_397', '90_180', '>180']] df.set_index('date', inplace=True) df = df.stack().reset_index() if pd_version >= "0.21": df.set_axis(['date', 'term', 'weight'], axis=1, inplace=True) else: df.set_axis(1, ['date', 'term', 'weight']) df = df.set_index('date').sort_index() df.dropna(inplace=True) return df
def top_stocks(field, date, frequency="1d", count=5, market="cn"): """获取雪球舆情数据 :param field: 如 'new_comments', 'total_comments', 'new_followers', 'total_followers', 'sell_actions', 'buy_actions' :param date: 如 '2015-05-21', 必须在2015年4月23日之后 :param frequency: 如 '1d', '1w', '1M' (Default value = "1d") :param count: 如 5, 10, 100 (Default value = 5) :param market: 地区代码, 如 'cn' (Default value = "cn") :returns: 如果有数据,返回一个DataFrame,否则返回None """ field = ensure_string(field, "field") frequency = ensure_string(frequency, "frequency") check_items_in_container([field], FIELDS, "field") check_items_in_container([frequency], {"1d", "1w", "1M"}, "frequency") d = {"1d": "d", "1M": "m", "1w": "w"} frequency = d[frequency] date = ensure_date_int(date) if date < 20150423 or date > ensure_date_int(datetime.datetime.today()): raise ValueError("date out of range, start_date " "cannot be earlier than 2015-04-23") data = get_client().execute("xueqiu.top_stocks", field, date, frequency, count, market) if not data: return df = pd.DataFrame(data) df = df[["order_book_id", field]] return df
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_conversion_info(order_book_ids, start_date=None, end_date=None, market="cn"): """获取转股变动信息 :param order_book_ids: 可转债ID,str or list :param start_date: 开始日期,默认为None :param end_date: 结束日期,默认为None :param market: (Default value = "cn") :return: pd.DataFrame """ order_book_ids = ensure_order_book_ids(order_book_ids) 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_conversion_info", order_book_ids, start_date, end_date, market=market) if not data: return df = pd.DataFrame(data) df.set_index(["order_book_id", "info_date"], inplace=True) return df
def get_split(order_book_ids, start_date=None, end_date=None, market="cn"): """获取拆分信息 :param order_book_ids: 股票 order_book_id or order_book_id list :param start_date: 开始日期;默认为上市首日 :param end_date: 结束日期;默认为今天 :param market: (Default value = "cn") """ order_book_ids = ensure_order_book_ids(order_book_ids, market=market) if start_date is not None: start_date = ensure_date_int(start_date) if end_date is not None: end_date = ensure_date_int(end_date) data = get_client().execute("get_split", order_book_ids, start_date, end_date, market=market) if not data: return df = pd.DataFrame(data) df.sort_values("ex_dividend_date", inplace=True) # cumprod [1, 2, 4] -> [1, 1*2, 1*2*4] df["cum_factor"] = df["split_coefficient_to"] / df["split_coefficient_from"] df["cum_factor"] = df.groupby("order_book_id")["cum_factor"].cumprod() if len(order_book_ids) == 1: df.set_index("ex_dividend_date", inplace=True) else: df.set_index(["order_book_id", "ex_dividend_date"], inplace=True) df.sort_index(inplace=True) return df
def get_dividend_info(order_book_ids, start_date=None, end_date=None, market="cn"): """对应时间段是否发生分红 :param order_book_ids: 股票 order_book_id or order_book_id list :param start_date: 开始日期,默认为空 :param end_date: 结束日期,默认为空 :param market: (Default value = "cn") """ order_book_ids = ensure_order_book_ids(order_book_ids) if start_date is not None: start_date = ensure_date_int(start_date) if end_date is not None: end_date = ensure_date_int(end_date) if start_date and end_date: if start_date > end_date: raise ValueError("invalid date range: [{!r}, {!r}]".format( start_date, end_date)) data = get_client().execute("get_dividend_info", order_book_ids, start_date, end_date, market=market) if not data: return df = pd.DataFrame(data) if len(order_book_ids) == 1: df.set_index("effective_date", inplace=True) else: df.set_index(["order_book_id", "effective_date"], inplace=True) return df.sort_index()
def get_ex_factor(order_book_ids, start_date=None, end_date=None, market="cn"): """获取复权因子 :param order_book_ids: 如'000001.XSHE' :param market: 国家代码, 如 'cn' (Default value = "cn") :param start_date: 开始日期,默认为股票上市日期 :param end_date: 结束日期,默认为今天 :returns: 如果有数据,返回一个DataFrame, 否则返回None """ order_book_ids = ensure_order_book_ids(order_book_ids, market=market) if start_date is not None: start_date = ensure_date_int(start_date) if end_date is not None: end_date = ensure_date_int(end_date) data = get_client().execute("get_ex_factor", order_book_ids, start_date, end_date, market=market) if not data: return None df = pd.DataFrame(data) df.sort_values(["order_book_id", "ex_date"], inplace=True) df.set_index("ex_date", inplace=True) return df
def get_indicators(order_book_ids, start_date=None, end_date=None, fields=None, market="cn"): """获取基金衍生数据 :param order_book_ids: 基金代码,str 或 list of str :param start_date: 开始日期 (Default value = None) :param end_date: 结束日期 (Default value = None) :param fields: str or list of str (Default value = None) :param market: (Default value = "cn") :returns: DataFrame or Series """ order_book_ids = ensure_list_of_string(order_book_ids) if start_date: start_date = ensure_date_int(start_date) if end_date: end_date = ensure_date_int(end_date) if fields is not None: fields = ensure_list_of_string(fields, "fields") result = get_client().execute("fund.get_indicators", order_book_ids, start_date, end_date, fields, market=market) if not result: return df = pd.DataFrame(result).set_index(keys=["order_book_id", "datetime"]) df.sort_index(inplace=True) if fields is not None: return df[fields] return df
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
def get_nav(order_book_ids, start_date=None, end_date=None, fields=None, expect_df=False, market="cn"): """获取基金净值数据 :param order_book_ids: 基金代码,str 或 list of str :param start_date: 开始日期 (Default value = None) :param end_date: 结束日期 (Default value = None) :param fields: str or list of str,例如:'acc_net_value', 'unit_net_value', 'subscribe_status', 'redeem_status', 'change_rate' (Default value = None) :param expect_df: 返回 MultiIndex DataFrame (Default value = False) :param market: (Default value = "cn") :returns: DataFrame or Series or Panel """ order_book_ids = ensure_list_of_string(order_book_ids) if len(order_book_ids) > 1: ins = instruments(order_book_ids, market=market) if len(set([i.accrued_daily for i in ins])) > 1: raise RQDataError( "ERROR: Only support single accrued type when getting nav at one time." ) if start_date: start_date = ensure_date_int(start_date) if end_date: end_date = ensure_date_int(end_date) if fields is not None: fields = ensure_list_of_string(fields) for f in fields: if f not in NAV_FIELDS: raise ValueError("invalid field: {}".format(f)) else: fields = NAV_FIELDS result = get_client().execute( "fund.get_nav", order_book_ids, start_date, end_date, fields, market=market ) if not result: return result = pd.DataFrame(result) if expect_df: result.sort_values(["order_book_id", "datetime"], inplace=True) result.set_index(["order_book_id", "datetime"], inplace=True) result.reindex(columns=fields) return result result = result.set_index(["datetime", "order_book_id"]) result.reindex(columns=fields) result = result.to_panel() if len(order_book_ids) == 1: result = result.minor_xs(order_book_ids[0]) if len(fields) == 1: return result[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 result
def get_private_placement(order_book_ids, start_date=None, end_date=None, progress="complete", market="cn"): """获取定增数据 :param order_book_ids: 合约代码 :param start_date: 开始日期,默认为None :param end_date: 结束日期,默认为None :param progress: 是否已完成定增,默认为complete。可选参数["complete", "incomplete", "all"] :param market: (Default value = "cn") :return: """ order_book_ids = ensure_order_book_ids(order_book_ids, market=market) if start_date and end_date: start_date, end_date = ensure_date_range(start_date, end_date) elif start_date: start_date = ensure_date_int(start_date) elif end_date: end_date = ensure_date_int(end_date) ensure_string_in(progress, ["complete", "incomplete", "all"], "progress") data = get_client().execute("get_private_placement", order_book_ids, start_date, end_date, progress, market=market) if not data: return progress_map = { 10: "董事会预案", 20: "股东大会通过", 21: "国资委通过", 22: "发审委通过", 23: "证监会通过", 29: "实施中", 30: "实施完成", 40: "国资委否决", 41: "股东大会否决", 42: "证监会否决", 43: "发审委否决", 50: "延期实施", 60: "停止实施", 70: "暂缓发行" } issue_type_map = {21: "非公开发行", 23: "非公开发行配套融资"} df = pd.DataFrame(data) df["progress"] = df["progress"].map(progress_map) df["issue_type"] = df["issue_type"].map(issue_type_map) df.set_index(["order_book_id", "initial_info_date"], inplace=True) return df
def get_greeks(order_book_ids, start_date=None, end_date=None, fields=None, model='implied_forward', market="cn"): """获取指定股票期权的隐含波动率iv, 以及5个希腊字母数值(delta, gamma, bega, theta, rho) :param order_book_ids: 股票 order_book_id or order_book_id list :param start_date: 开始日期, 必要参数 :param end_date: 结束日期;默认为今天 :param fields: str或list类型. 默认为None, 返回所有fields. :param model: str类型, last: 代表用每日close价格, implied_forward 代表用隐含风险收益率计算 :param market: 默认值为"cn" """ order_book_ids = ensure_order_book_ids(order_book_ids, market=market) check_items_in_container(model, ['implied_forward', 'last'], 'model') if start_date is not None: start_date = ensure_date_int(start_date) else: raise ValueError('start_date is expected') if end_date is not None: end_date = ensure_date_int(end_date) else: end_date = ensure_date_int(datetime.datetime.now().date()) if end_date < start_date: raise ValueError("invalid date range: [{!r}, {!r}]".format( start_date, end_date)) if fields is None: fields = VALID_GREEKS_FIELDS else: check_items_in_container(fields, VALID_GREEKS_FIELDS, 'Greeks') data = get_client().execute("options.get_greeks", order_book_ids, start_date, end_date, fields, model, market=market) if not data: return None df = pd.DataFrame(data) df.set_index(["order_book_id", "trading_date"], inplace=True) df.sort_index(inplace=True) return df[fields]
def get_ratings(order_book_id, date=None, market="cn"): """获取距离指定日期最近发布的基金评级信息 :param order_book_id: 基金代码 str or list :param date: 日期,为空则返回所有时间段的数据 (Default value = None) :param market: (Default value = "cn") :returns: DataFrame """ order_book_id = ensure_list_of_string(order_book_id) if date is not None: date = to_datetime(date) if date > datetime.datetime.today(): return date = ensure_date_int(date) df = get_client().execute("fund.get_ratings_v2", order_book_id, date, market=market) if not df: return df = pd.DataFrame(df, columns=["order_book_id", "datetime", "zs", "sh3", "sh5", "jajx"]) df.sort_values(["order_book_id", "datetime"], inplace=True) if date is not None: df.drop_duplicates(subset=['order_book_id'], keep='last', inplace=True) df.set_index(["order_book_id", "datetime"], inplace=True) df.fillna(np.nan, inplace=True) return df
def get_etf_components(order_book_id, trading_date=None, market="cn"): """获取etf基金份额数据 :param order_book_id: 基金代码 str :param trading_date: 交易日期,默认为当天 :param market: (Default value = "cn") :return: DataFrame """ if order_book_id.endswith(".XSHG") or order_book_id.endswith(".XSHE"): pass elif order_book_id.startswith("1"): order_book_id = order_book_id + ".XSHE" elif order_book_id.startswith("5"): order_book_id = order_book_id + ".XSHG" else: return None if trading_date is not None: trading_date = to_date(trading_date) if trading_date > datetime.date.today(): return None else: trading_date = datetime.date.today() trading_date = ensure_date_int(ensure_trading_date(trading_date)) result = get_client().execute("fund.get_etf_components", order_book_id, trading_date, market=market) if not result: return None columns = ["trading_date", "order_book_id", "stock_code", "stock_amount", "cash_substitute", "cash_substitute_proportion", "fixed_cash_substitute"] df = pd.DataFrame(result, columns=columns).sort_values(by=["trading_date", "order_book_id", "stock_code"], ascending=[True, True, True]) return df
def get_industry_mapping(source="citics", date=None, market="cn"): """获取行业分类列表 :param source: 分类来源,citics。citics: 中信, gildata: 聚源 :param market: (Default value = "cn") :return: DataFrame """ source = ensure_string_in(source, ["sws", "citics", "gildata", "citics_2019"], "source") if date is None: date = datetime.date.today() date = ensure_date_int(date) res = get_client().execute("get_industry_mapping_v2", source, date, market=market) if not res: return df = pd.DataFrame(res) if source == "sws": df.rename(columns=dict(zip(OTHER_COLUMNS, SHENWAN_COLUMNS)), inplace=True) columns = SHENWAN_COLUMNS else: columns = OTHER_COLUMNS df = df.dropna().drop_duplicates() df = df.sort_values(columns[::2]).reset_index(drop=True) return df[columns]
def get_bond_stru(order_book_id, date=None, market="cn"): """获取指定日期公募基金债券持仓券种明细信息 :param order_book_id: 基金代码 str, 仅支持传入单个基金代码 :param date: 日期,为空则返回所有时间段的数据 (Default value = None) :param market: (Default value = "cn") :returns: DataFrame """ order_book_id = ensure_string(order_book_id) order_book_id = ensure_fund(order_book_id, market) if date is not None: date = to_datetime(date) if date > datetime.datetime.today(): return date = ensure_date_int(date) data = get_client().execute("fund.get_bond_stru", order_book_id, date, market=market) if not data: return df = pd.DataFrame(data) df.set_index(['date'], inplace=True) df.sort_index(inplace=True) df = df[['order_book_id', 'bond_type', 'weight_nv', 'weight_bond_mv', 'market_value']] return df
def get_dominant(underlying_symbol, start_date=None, end_date=None, rule=0, market="cn"): """获取指定期货品种当日对应的主力合约 :param underlying_symbol: 如'IF' 'IC' :param start_date: 如 '2015-01-07' (Default value = None) :param end_date: 如 '2015-01-08' (Default value = None) :param market: (Default value = "cn") :param rule: 主力合约规则 (Default value = 0) 0:在rule=1的规则上,增加约束(曾做过主力合约的合约,一旦被换下来后,不会再被选上) 1:合约首次上市时,以当日收盘同品种持仓量最大者作为从第二个交易日开始的主力合约,当同品种其他合约持仓量在收盘后 超过当前主力合约1.1倍时,从第二个交易日开始进行主力合约的切换。日内不会进行主力合约的切换 :returns: pandas.Series 返回参数指定的具体主力合约名称 """ if not isinstance(underlying_symbol, six.string_types): raise ValueError( "invalid underlying_symbol: {}".format(underlying_symbol)) check_items_in_container(rule, [0, 1], 'rule') underlying_symbol = underlying_symbol.upper() if start_date: start_date = ensure_date_int(start_date) if end_date: end_date = ensure_date_int(end_date) elif start_date: end_date = start_date result = get_client().execute("futures.get_dominant", underlying_symbol, start_date, end_date, rule, market=market) if not result: return df = pd.DataFrame(result) df["date"] = df["date"].apply(int8_to_datetime) return df.set_index("date").sort_index()["dominant"]
def shenwan_instrument_industry(order_book_ids, date=None, level=1, expect_df=False, market="cn"): """获取股票对应的申万行业 :param order_book_ids: 股票列表,如['000001.XSHE', '000002.XSHE'] :param date: 如 '2015-01-07' (Default value = None) :param level: (Default value = 1) :param expect_df: 返回 DataFrame,默认为 False :param market: (Default value = "cn") :returns: code, name 返回输入日期最近交易日的股票对应申万行业 """ if level not in [0, 1, 2, 3]: raise ValueError("level should be in 0,1,2,3") order_book_ids = ensure_order_book_ids(order_book_ids) if not date: date = datetime.date.today() date = ensure_date_int(date) r = get_client().execute("shenwan_instrument_industry", order_book_ids, date, level, market=market) if not r: return if len(order_book_ids) == 1 and not expect_df: r = r[0] if level != 0: return r[LEVEL_MAP[level][0]], r[LEVEL_MAP[level][1]] else: return ( r["index_code"], r["index_name"], r["second_index_code"], r["second_index_name"], r["third_index_code"], r["third_index_name"], ) df = pd.DataFrame(r).set_index("order_book_id") if level != 0 and level != 1: df.rename(columns=dict(zip(LEVEL_MAP[level], LEVEL_MAP[1])), inplace=True) return df
def jy_instrument_industry(order_book_ids, date=None, level=1, expect_df=False, market="cn"): """获取股票对应的聚源行业 :param order_book_ids: 股票列表,如['000001.XSHE', '000002.XSHE'] :param date: 如 '2015-01-07' (Default value = None) :param level: 聚源等级,0, 1, 2, 3, 'customized' (Default value = 1) :param expect_df: 返回 DataFrame,默认为 False :param market: (Default value = "cn") :returns: code, name 返回输入日期最近交易日的股票对应聚源行业以及对应的聚源等级 """ if level not in (0, 1, 2, 3, "customized"): raise ValueError("level should in 0, 1, 2, 3, 'customized'") order_book_ids = ensure_order_book_ids(order_book_ids, market=market) if not date: date = ensure_date_int( get_previous_trading_date(datetime.date.today(), market=market)) else: date = ensure_date_int(date) df = get_client().execute("jy_instrument_industry", order_book_ids, date, level, market=market) if not df: return if len(order_book_ids) == 1 and not expect_df: r = df[0] if level == 0: return r["first_industry_name"], r["second_industry_name"], r[ "third_industry_name"] return r["industry_name"] return pd.DataFrame(df).set_index("order_book_id")
def zx_industry(industry_name, date=None): """获取中信行业股票列表 :param industry_name: 中信行业名称或代码 :param date: 查询日期,默认为当前最新日期 :return: 所属目标行业的order_book_id list or None """ if not isinstance(industry_name, six.string_types): raise ValueError("string expected, got {!r}".format(industry_name)) if not date: date = datetime.date.today() date = ensure_date_int(date) return get_client().execute("zx_industry", industry_name, date)
def get_holdings(order_book_id, date=None, market="cn", **kwargs): """获取距离指定日期最近发布的基金持仓信息 :param order_book_id: 基金代码 str :param date: 日期,为空则返回所有持仓 (Default value = None) :param market: (Default value = "cn") :returns: DataFrame """ order_book_id = ensure_list_of_string(order_book_id) if date is not None: date = ensure_date_int(date) start_date = end_date = None else: if "start_date" in kwargs and "end_date" in kwargs: start_date = ensure_date_int(kwargs.pop("start_date")) end_date = ensure_date_int(kwargs.pop("end_date")) elif "start_date" in kwargs or "end_date" in kwargs: raise ValueError('please ensure start_date and end_date exist') else: start_date = end_date = None if kwargs: raise ValueError('unknown kwargs: {}'.format(kwargs)) df = get_client().execute("fund.get_holdings_v3", order_book_id, date, start_date, end_date, market=market) if not df: return df = pd.DataFrame(data=df) fields = ["order_book_id", "type", "weight", "shares", "market_value", "symbol"] if "category" in df.columns: df.category = df.category.map(CATEGORY_MAP) fields += ["category"] if "region" in df.columns: fields += ["region"] df.sort_values(["fund_id", "date", "type", "order_book_id"], inplace=True) df.set_index(["fund_id", "date"], inplace=True) return df[fields]
def get_stock_connect_quota(connect=None, start_date=None, end_date=None, fields=None): """获取历史沪深港通额度日频数据 :param connect: 默认返回全部content ["sh_to_hk", "hk_to_sh", "sz_to_hk", "hk_to_sz"] :param start_date: 默认为全部历史数据 :param end_date: 默认为最新日期 :param fields: 默认为所有字段 ['buy_turnover', 'sell_turnover', 'quota_balance', 'quota_balance_ratio'] :return: """ DEFAULT_CONNECT = ["sh_to_hk", "hk_to_sh", "sz_to_hk", "hk_to_sz"] if connect is None: connect = DEFAULT_CONNECT else: connect = ensure_list_of_string(connect) check_items_in_container(connect, DEFAULT_CONNECT, 'connect') DEFAULT_FIELDS = ['buy_turnover', 'sell_turnover', 'quota_balance', 'quota_balance_ratio'] if fields is None: fields = DEFAULT_FIELDS else: fields = ensure_list_of_string(fields) check_items_in_container(fields, DEFAULT_FIELDS, 'fields') start_date = ensure_date_int(start_date) if start_date else start_date end_date = ensure_date_int(end_date) if end_date else end_date if start_date and end_date and start_date > end_date: raise ValueError("invalid date range: [{!r}, {!r}]".format(start_date, end_date)) data = get_client().execute( "get_stock_connect_quota", connect=connect, start_date=start_date, end_date=end_date, fields=fields ) if not data: return None res = pd.DataFrame(data) res.set_index(['datetime', 'connect'], inplace=True) res.sort_index(ascending=True, inplace=True) return res
def get_ex_factor(order_book_id, start_date=None, end_date=None, market="cn"): """获取公募基金复权因子 :param order_book_id: 如'000001' :param start_date: 如 '2013-01-04' (Default value = None) :param end_date: 如 '2014-01-04' (Default value = None) :param market: (Default value = "cn") :returns: 如果有数据,返回一个DataFrame, 否则返回None """ order_book_ids = ensure_list_of_string(order_book_id) if start_date: start_date = ensure_date_int(start_date) if end_date: end_date = ensure_date_int(end_date) if start_date and end_date and end_date < start_date: raise ValueError() data = get_client().execute("fund.get_ex_factor", order_book_ids, start_date, end_date, market=market) df = pd.DataFrame( data, columns=["order_book_id", "ex_factor", "ex_cum_factor", "ex_end_date", "ex_date"] ) return df.set_index("ex_date").sort_index()
def get_allotment(order_book_ids, start_date=None, end_date=None, fields=None, market="cn"): """获取配股信息 :param order_book_ids: 股票名称 :param start_date: 开始日期, 如'1991-01-01' (Default value = 1991-01-01) :param end_date: 结束日期,如'2014-01-04' (Default value = None) :param market: 地区代码,如'cn' (Default value = "cn") :returns: 返回一个DataFrame 'order_book_id': 股票合约代码 'declaration_announcement_date': 首次信息发布日期 'proportion': 配股比例(每一股对应的配股比例) 'allotted_proportion': 实际配股比例(每一股对应的配股比例) 'allotted_shares': 实际配股数量 'allotment_price': 每股配股价格 'book_closure_date': 股权登记日 'ex_right_date': 除权除息日 """ order_book_ids = ensure_order_book_ids(order_book_ids, market=market) if start_date: start_date = ensure_date_int(start_date) if end_date: end_date = ensure_date_int(end_date) if fields: fields = ensure_list_of_string(fields, "fields") check_items_in_container(fields, allotment_fields, "fields") else: fields = allotment_fields all_allotment = get_client().execute("get_allotment", order_book_ids, fields, start_date, end_date, market=market) if not all_allotment: return df = pd.DataFrame(all_allotment) df.set_index(["order_book_id", "declaration_announcement_date"], inplace=True) df.sort_index(inplace=True) df = df[fields] return df
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)
def get_dividend(order_book_ids, start_date=None, end_date=None, adjusted=False, market="cn"): """获取分红信息 :param order_book_ids: 股票 order_book_id or order_book_id list :param start_date: 开始日期,默认为股票上市日期 :param end_date: 结束日期,默认为今天 :param adjusted: deprecated :param market: (Default value = "cn") """ if adjusted: warnings.warn("get_dividend adjusted = `True` is not supported yet. " "The default value is `False` now.") order_book_ids = ensure_order_book_ids(order_book_ids) if start_date is not None: start_date = ensure_date_int(start_date) if end_date is not None: end_date = ensure_date_int(end_date) data = get_client().execute("get_dividend", order_book_ids, start_date, end_date, market=market) if not data: return df = pd.DataFrame(data) if len(order_book_ids) == 1: df.set_index("declaration_announcement_date", inplace=True) else: df.set_index(["order_book_id", "declaration_announcement_date"], inplace=True) return df.sort_index()
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
def get_stock_change(fund_id, start_date=None, end_date=None, market="cn"): """获取基金衍生数据 :param fund_id: 基金代码 str, 如‘000001’ :param start_date: 开始日期 (Default value = None) :param end_date: 结束日期 (Default value = None) :param market: (Default value = "cn") :returns: DataFrame """ fund_id = ensure_fund(fund_id, market) if start_date: start_date = ensure_date_int(start_date) if end_date: end_date = ensure_date_int(end_date) result = get_client().execute("fund.get_stock_change", fund_id, start_date, end_date, market=market) if not result: return df = pd.DataFrame(result) df.set_index(['date'], inplace=True) df.sort_index(inplace=True) df = df[['order_book_id', 'market_value', 'weight', 'change_type']] return df
def get_factor_covariance(date, horizon='daily'): """ 获取因子协方差矩阵 :param date: str 日期(例如:‘2017-03-20’) :param horizon: str 预测期限。默认为日度('daily'),可选月度(‘monthly’)或季度('quarterly')。 :return: pandas.DataFrame,其中 index 和 column 均为因子名称。 """ date = get_previous_trading_date(get_next_trading_date(date)) date = ensure_date_int(date) ensure_string_in(horizon, HORIZON_CONTAINER, 'horizon') df = get_client().execute('get_factor_covariance', date, horizon) if not df: return df = pd.DataFrame(df) df.drop("date", axis=1, inplace=True) return df.reindex(columns=df.index)
def shenwan_industry(index_name, date=None, market="cn"): """获取申万行业组成 :param index_name: 申万行业代码或名字, 如'801010.INDX'或'农林牧渔' :param date: 如 '2015-01-07' (Default value = None) :param market: (Default value = "cn") :returns: 返回输入日期最近交易日的申万行业组成 """ if not isinstance(index_name, six.string_types): raise ValueError("string expected, got {!r}".format(index_name)) if not date: date = datetime.date.today() date = ensure_date_int(date) return get_client().execute("shenwan_industry", index_name, date, market=market)