def low_liquidity_filter(stocks,date,percentileThres): """ :param stocks: 股票列表 :param date: 日期 :param thres: 剔除换手率位于某百分位以下的股票,例如thres=5,则剔除换手率处于5分位以下的股票 :return:list """ liquidity = rqdatac.get_style_factor_exposure(stocks,date,date,factors="liquidity")['liquidity'] return liquidity[liquidity>np.nanpercentile(liquidity,q=percentileThres)].index.get_level_values(0).unique().tolist()
def get_style_exposure(stock_list, date): style_exposure = rqdatac.get_style_factor_exposure(stock_list, date, date, factors='all') style_exposure.index = style_exposure.index.droplevel('date') return style_exposure
def get_factor_exposure(stock_list,date): industry_exposure = get_shenwan_industry_exposure(stock_list, date) style_exposure = rqdatac.get_style_factor_exposure(stock_list, date, date, factors = 'all') style_exposure.index = style_exposure.index.droplevel('date') factor_exposure = pd.concat([style_exposure,industry_exposure],axis=1) factor_exposure['comovement'] = 1 return factor_exposure
def get_explicit_factor_returns(date): """ :param date:日期 :return: pandas.Series """ previous_trading_date = rqdatac.get_previous_trading_date(date) all_a_stocks = rqdatac.all_instruments(type="CS",date=previous_trading_date).order_book_id.tolist() filtered_stocks = noisy_stocks_filter(all_a_stocks,previous_trading_date) # print(all_a_stocks,previous_trading_date) factor_exposures = rqdatac.get_style_factor_exposure(all_a_stocks, previous_trading_date, previous_trading_date, "all").sort_index() factor_exposures.index=factor_exposures.index.droplevel(1) closePrice = rqdatac.get_price(all_a_stocks, rqdatac.get_previous_trading_date(previous_trading_date), previous_trading_date, fields="close") priceChange = closePrice.pct_change().iloc[-1] index_mapping = {"csi_300":'000300.XSHG',"csi_500":"000905.XSHG","csi_800":"000906.XSHG"} all_stocks = {index:rqdatac.index_components(index_mapping.get(index),date=previous_trading_date) for index in index_mapping} all_stocks['whole_market'] = filtered_stocks def _calc_explicitReturns_with_stocksList(stocksList): # 根据股票池计算收益率 _sizeBeta = factor_exposures[['size','beta']].loc[stocksList] _quantileGroup = _sizeBeta.apply(lambda x:pd.cut(x,bins=3,labels=False)+1).reset_index() _quantileStocks = _quantileGroup.groupby(['size','beta']).apply(lambda x:x.index.tolist()) market_neutralize_stocks = _quantileStocks.apply( lambda x: pd.Series(stocksList).loc[x].values.tolist()).values.tolist() return factor_exposures.loc[stocksList].apply(lambda x,y=market_neutralize_stocks:_calc_single_explicit_returns(x,y)) def _calc_single_explicit_returns(_factor_exposure,market_neutralize_stocks): # 计算单一因子收益率 def _deuce(series): median = series.median() return [series[series<=median].index.tolist(),series[series>median].index.tolist()] deuceResults = np.array([_deuce(_factor_exposure[neutralized_stks]) for neutralized_stks in market_neutralize_stocks]).flatten() short_stocksList = list(reduce(lambda x,y:set(x)|set(y),np.array([s for i,s in enumerate(deuceResults) if i%2==0]))) long_stockList = list(reduce(lambda x,y:set(x)|set(y),np.array([s for i,s in enumerate(deuceResults) if i%2==1]))) return priceChange[long_stockList].mean() - priceChange[short_stocksList].mean() results = {key: _calc_explicitReturns_with_stocksList(all_stocks.get(key)) for key in all_stocks} return pd.DataFrame(results)[['whole_market','csi_300','csi_500','csi_800']]
def get_exposure(stock_list, date): style_factors = [ 'beta', 'momentum', 'size', 'earnings_yield', 'residual_volatility', 'growth', 'book_to_price', 'leverage', 'liquidity', 'non_linear_size' ] non_missing_stock_list, industry_exposure = get_shenwan_industry_exposure( stock_list, date) style_exposure = rqdatac.get_style_factor_exposure(non_missing_stock_list, date, date, factors=style_factors) style_exposure.index = style_exposure.index.droplevel('date') factor_exposure = pd.concat([style_exposure, industry_exposure], axis=1) factor_exposure['comovement'] = 1 return factor_exposure
industry_exposure = get_shenwan_industry_exposure(stock_list, date) style_exposure = rqdatac.get_style_factor_exposure(stock_list, date, date, factors = 'all') style_exposure.index = style_exposure.index.droplevel('date') factor_exposure = pd.concat([style_exposure,industry_exposure],axis=1) factor_exposure['comovement'] = 1 return factor_exposure date = '2018-07-12' stock_list = rqdatac.all_instruments(type='CS',country='cn',date=date).order_book_id.tolist() factor_exposure = get_factor_exposure(stock_list,date) style_exposure = rqdatac.get_style_factor_exposure(stock_list, date, date, factors=['beta']) style_exposure.index = style_exposure.index.droplevel('date') liquidity_exposure = rqdatac.get_factor_exposure(stock_list,date,date,factors=['beta']) liquidity_exposure.index = liquidity_exposure.index.droplevel('date') data = pd.concat([factor_exposure['beta'],style_exposure,liquidity_exposure],axis=1) data.columns=['源代码计算beta暴露度结果','get_style_factor_exposure API','get_factor_exposure API']
def to_constraint(self, order_book_ids, date): factor_data = rqdatac.get_style_factor_exposure( order_book_ids, date, date).xs(date, level=1) return _to_constraint2(factor_data, self._rules)
def get_explicit_factor_returns(date, stock_list): """ :param date:日期 :return: pandas.Series """ previous_trading_date = rqdatac.get_previous_trading_date(date) factor_exposures = rqdatac.get_style_factor_exposure( stock_list, previous_trading_date, previous_trading_date, "all").sort_index() factor_exposures.index = factor_exposures.index.droplevel(1) priceChange = rqdatac.get_price( stock_list, rqdatac.get_previous_trading_date(previous_trading_date), previous_trading_date, fields="close").pct_change().iloc[-1] def _calc_explicitReturns_with_stocksList(stocksList): # 根据股票池计算收益率 _sizeBeta = factor_exposures[['size', 'beta']].loc[stocksList] _quantileGroup = _sizeBeta.apply( lambda x: pd.cut(x, bins=3, labels=False) + 1).reset_index() _quantileStocks = _quantileGroup.groupby( ['size', 'beta']).apply(lambda x: x.index.tolist()) market_neutralize_stocks = _quantileStocks.apply(lambda x: pd.Series( stocksList).loc[x].values.tolist()).values.tolist() return factor_exposures.loc[stocksList].apply( lambda x, y=market_neutralize_stocks: _calc_single_explicit_returns(x, y)) def _calc_single_explicit_returns(_factor_exposure, market_neutralize_stocks): # 计算单一因子收益率 def _deuce(series): median = series.median() return [ series[series <= median].index.tolist(), series[series > median].index.tolist() ] deuceResults = np.array([ _deuce(_factor_exposure[neutralized_stks]) for neutralized_stks in market_neutralize_stocks ]).flatten() short_stocksList = list( reduce( lambda x, y: set(x) | set(y), np.array([s for i, s in enumerate(deuceResults) if i % 2 == 0]))) long_stockList = list( reduce( lambda x, y: set(x) | set(y), np.array([s for i, s in enumerate(deuceResults) if i % 2 == 1]))) return priceChange[long_stockList].mean( ) - priceChange[short_stocksList].mean() results = _calc_explicitReturns_with_stocksList(stock_list) return results