def get_dominant_future(underlying_symbol, rule=0): # type: (str, Optional[int]) -> Optional[str] """ 获取某一期货品种策略当前日期的主力合约代码。 合约首次上市时,以当日收盘同品种持仓量最大者作为从第二个交易日开始的主力合约。当同品种其他合约持仓量在收盘后超过当前主力合约1.1倍时,从第二个交易日开始进行主力合约的切换。日内不会进行主力合约的切换。 :param underlying_symbol: 期货合约品种,例如沪深300股指期货为'IF' :param rule: 默认是rule=0,采用最大昨仓为当日主力合约,每个合约只能做一次主力合约,不会重复出现。针对股指期货,只在当月和次月选择主力合约。 当rule=1时,主力合约的选取只考虑最大昨仓这个条件。 :example: 获取某一天的主力合约代码(策略当前日期是20160801): .. code-block:: python3 :linenos: get_dominant_future('IF') #[Out] #'IF1608' """ dt = Environment.get_instance().trading_dt.date() ret = rqdatac.get_dominant_future(underlying_symbol, dt, dt, rule) if isinstance(ret, pd.Series) and ret.size == 1: return ret.item() else: user_log.warn( _("\'{0}\' future does not exist").format(underlying_symbol)) return None
def get_fundamentals(query, entry_date=None, interval='1d', report_quarter=False, expect_df=False, **kwargs): user_log.warn('get_fundamentals is deprecated, use get_pit_financials_ex instead') env = Environment.get_instance() dt = env.calendar_dt.date() if entry_date is None and 'date' in kwargs: entry_date = kwargs.pop('date') if kwargs: raise RQInvalidArgument('unknown arguments: {}'.format(kwargs)) latest_query_day = dt - datetime.timedelta(days=1) if entry_date: entry_date = to_date(entry_date) if entry_date <= latest_query_day: query_date = entry_date else: raise RQInvalidArgument( _('in get_fundamentals entry_date {} is no earlier than test date {}').format(entry_date, dt)) else: query_date = latest_query_day result = rqdatac.get_fundamentals(query, query_date, interval, report_quarter=report_quarter, expect_df=expect_df) if result is None: return pd.DataFrame() if expect_df: return result if len(result.major_axis) == 1: frame = result.major_xs(result.major_axis[0]) # research 与回测返回的Frame维度相反 return frame.T return result
def get_financials(query, quarter=None, interval='4q', expect_df=False): user_log.warn( 'get_financials is deprecated, use get_pit_finacials_ex instead') if quarter is None: valid = True else: valid = isinstance(quarter, six.string_types) and quarter[-2] == 'q' if valid: try: valid = 1990 <= int(quarter[:-2]) <= 2050 and 1 <= int( quarter[-1]) <= 4 except ValueError: valid = False if not valid: raise RQInvalidArgument( _(u"function {}: invalid {} argument, quarter should be in form of '2012q3', " u"got {} (type: {})").format('get_financials', 'quarter', quarter, type(quarter))) env = Environment.get_instance() dt = env.calendar_dt.date() - datetime.timedelta( days=1) # Take yesterday's data as default year = dt.year mon = dt.month day = dt.day int_date = year * 10000 + mon * 100 + day q = (mon - 4) // 3 + 1 y = year if q <= 0: y -= 1 q = 4 default_quarter = str(y) + 'q' + str(q) if quarter is None or quarter > default_quarter: quarter = default_quarter include_date = False for d in query.column_descriptions: if d['name'] == 'announce_date': include_date = True if not include_date: query = query.add_column(rqdatac.fundamentals.announce_date) result = rqdatac.get_financials(query, quarter, interval, expect_df=expect_df) if result is None: return pd.DataFrame() if isinstance(result, pd.Series): return result elif isinstance(result, pd.DataFrame): result = result[(result['announce_date'] <= int_date) | pd.isnull(result['announce_date'])] if not include_date: del result['announce_date'] else: d = dict() for order_book_id in result.minor_axis: df = result.minor_xs(order_book_id) df = df[(df.announce_date < int_date) | (pd.isnull(df.announce_date))] d[order_book_id] = df pl = pd.Panel.from_dict(d, orient='minor') if not include_date: pl.drop('announce_date', axis=0, inplace=True) if len(pl.items) == 1: pl = pl[pl.items[0]] return pl return result