def cal_fund_holder_risk_alpha_return_quarter(self, fund, end_date): """ 根据季报持仓风格暴露进行收益拆分 """ beg_date = "20040101" type_list = ['STYLE', 'COUNTRY', 'INDUSTRY'] fund_exposure = FundHolderExposureQuarter( ).get_fund_holder_exposure_quarter_daily(fund, beg_date, end_date) barra_riskfactor_return = Barra().get_factor_return( beg_date, end_date, type_list=type_list) date_series = Date().get_trade_date_series(beg_date, end_date) fund_pct = FundFactor().get_fund_factor("Repair_Nav_Pct", fund_pool=[fund], date_list=date_series) fund_pct.columns = ["FundReturn"] if fund_exposure is None: return None fund_riskfactor_return = barra_riskfactor_return.mul(fund_exposure) fund_return = pd.concat([fund_pct, fund_riskfactor_return], axis=1) fund_return = fund_return.dropna() barra_factor_name = list( Barra().get_factor_name(type_list=["STYLE"])["NAME_EN"].values) fund_return["StyleReturn"] = fund_return[barra_factor_name].sum(axis=1) barra_factor_name = list( Barra().get_factor_name(type_list=["INDUSTRY"])["NAME_EN"].values) fund_return["IndustryReturn"] = fund_return[barra_factor_name].sum( axis=1) barra_factor_name = list( Barra().get_factor_name(type_list=["COUNTRY"])["NAME_EN"].values) fund_return["CountryReturn"] = fund_return[barra_factor_name].sum( axis=1) barra_factor_name = ["StyleReturn", "IndustryReturn", "CountryReturn"] fund_return["SumReturn"] = fund_return[barra_factor_name].sum(axis=1) fund_return["AlphaReturn"] = fund_return["FundReturn"] - fund_return[ "SumReturn"] data_new = fund_return.dropna() # 合并新数据 #################################################################### out_path = os.path.join(self.data_path_exposure, 'fund_holding_risk_alpha_return_quarter') out_file = os.path.join( out_path, 'Fund_Holder_Risk_Alpha_Return_Quarter_' + fund + "_" + end_date + '.csv') print(out_file) if os.path.exists(out_file): data_old = pd.read_csv(out_file, index_col=[0], encoding='gbk') data_old.index = data_old.index.map(str) params = FactorOperate().pandas_add_row(data_old, data_new) else: params = data_new params.to_csv(out_file) return data_new
def cal_fund_regression_risk_alpha_return_style(self, fund, beg_date, end_date): # 参数 #################################################################### exposure_index = FundRegressionExposureStyle( ).get_fund_regression_exposure_style(fund) if exposure_index is not None: # 取得数据 指数收益率数据 和 基金涨跌幅数据 #################################################################### barra_name = list(Barra().get_factor_name(['STYLE' ])['NAME_EN'].values) barra_name.extend( list(Barra().get_factor_name(["COUNTRY"])['NAME_EN'].values)) barra_return = Barra().get_factor_return( None, None, type_list=["INDUSTRY", "COUNTRY", "STYLE"]) barra_return = barra_return[barra_name] barra_return /= 100.0 if fund[len(fund) - 2:] == 'OF': fund_return = FundFactor().get_fund_factor( "Repair_Nav_Pct", None, [fund]) / 100.0 fund_return.columns = ["FundReturn"] else: fund_return = Index().get_index_factor(fund, attr=["PCT"]) fund_return.columns = ["FundReturn"] exposure_index = exposure_index.dropna(how="all") index_exposure_return = barra_return.mul(exposure_index) index_exposure_return = index_exposure_return.dropna(how="all") data = pd.concat([fund_return, index_exposure_return], axis=1) data = data.dropna(how="all") data = data.loc[index_exposure_return.index, :] data = data.dropna(subset=["FundReturn"]) data["SumReturn"] = data[barra_name].sum(axis=1, skipna=True) data["AlphaReturn"] = data["FundReturn"] - data["SumReturn"] data = data.loc[beg_date:end_date, :] data["CumFundReturn"] = (data["FundReturn"] + 1.0).cumprod() - 1.0 data["CumAlphaReturn"] = (data["AlphaReturn"] + 1.0).cumprod() - 1.0 data["CumSumReturn"] = (data["SumReturn"] + 1.0).cumprod() - 1.0 # 合并新数据 #################################################################### out_path = os.path.join(self.data_path_exposure, 'fund_regression_risk_alpha_return_style') out_file = os.path.join( out_path, 'Fund_Regression_Risk_Alpha_Style_' + fund + '.csv') if os.path.exists(out_file): params_old = pd.read_csv(out_file, index_col=[0], encoding='gbk') params_old.index = params_old.index.map(str) params = FactorOperate().pandas_add_row(params_old, data) else: params = data print(params) params.to_csv(out_file)