Example #1
0
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
Example #3
0
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
Example #4
0
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']]
Example #5
0
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
Example #6
0
    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']



Example #7
0
 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)
Example #8
0
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