Commit b04cf3b2 authored by 李宗熹's avatar 李宗熹

评价修改

parent f73b3277
......@@ -233,7 +233,7 @@ def get_radar_data(fund):
sharpe_score = df['sharp_ratio_rank'].values[0] * 100
total_score = df['z_score'].values[0]
fund_name = get_fund_name(fund).values[0][0]
# print(fund_name)
return {'name': fund_name, 'data': [{'name': '绝对收益', 'data': '%.2f' % return_score},
{'name': '抗风险能力', 'data': '%.2f' % downside_score},
{'name': '极端风险', 'data': '%.2f' % drawdown_score},
......@@ -285,7 +285,8 @@ class PortfolioDiagnose(object):
self.end_date = end_date
if self.end_date is None:
self.end_date = datetime.datetime.now() - datetime.timedelta(days=1)
self.end_date = datetime.datetime(datetime.date.today().year,
datetime.date.today().month, 1) - datetime.timedelta(1)
self.start_date = cal_date(self.end_date, 'Y', 1)
self.replace_pair = dict() # 由于数据不足半年而被替换为相同基金经理和策略的原基金和替换基金的映射
......@@ -478,14 +479,14 @@ class PortfolioDiagnose(object):
dd = expected_returns.drawdown_from_prices(propose_portfolio)
# if self.client_type == 1:
# proposal_risk = [[x, get_risk_level(search_rank(fund_rank, x, metric='substrategy'))] for x in
# propose_portfolio.columns]
# self.proposal_fund = list(filter(lambda x: x[1] != 'H', proposal_risk))
# proposal_risk = [[x, get_risk_level(search_rank(fund_rank, x, metric='substrategy'))] for x in
# propose_portfolio.columns]
# self.proposal_fund = list(filter(lambda x: x[1] != 'H', proposal_risk))
# drop_fund_list = list(filter(lambda x: x[1] = 'H', proposal_risk))
# proposal_portfolio = list((set(self.portfolio) - set(self.no_data_fund) - set(self.replace_pair.keys())) | \
# (set(self.proposal_fund) | set(self.replace_pair.values())))
# propose_portfolio.drop()
# drop_fund_list = list(filter(lambda x: x[1] = 'H', proposal_risk))
# proposal_portfolio = list((set(self.portfolio) - set(self.no_data_fund) - set(self.replace_pair.keys())) | \
# (set(self.proposal_fund) | set(self.replace_pair.values())))
# propose_portfolio.drop()
propose_risk_mapper = dict()
for fund in propose_portfolio.columns:
......@@ -534,9 +535,7 @@ class PortfolioDiagnose(object):
index_return = index_data.iloc[:, :] / index_data.iloc[0, :] - 1
# origin_fund_return = origin_portfolio.iloc[:, :] / origin_portfolio.iloc[0, :] - 1
propose_fund_return = propose_portfolio.iloc[:, :] / propose_portfolio.iloc[0, :] - 1
print(self.new_weights)
propose_fund_return['return'] = propose_fund_return.T.iloc[:, :].apply(lambda x: np.dot(self.new_weights, x))
propose_fund_return.to_csv('new_port.csv', encoding='gbk')
return index_return, propose_fund_return
def old_evaluation(self, group_name, group_result, data_adaptor):
......@@ -548,17 +547,17 @@ class PortfolioDiagnose(object):
past_month = (current_year - start_year) * 12 + current_month - start_month
# 投入成本(万元)
input_cost = round(group_result[group_name]["total_cost"]/10000, 2)
input_cost = round(group_result[group_name]["total_cost"] / 10000, 2)
# 整体盈利(万元)
total_profit = round(group_result[group_name]["cumulative_profit"]/10000, 2)
total_profit = round(group_result[group_name]["cumulative_profit"] / 10000, 2)
# 整体表现 回撤能力
fund_rank_data = fund_rank[fund_rank["fund_id"].isin(self.portfolio)]
z_score = fund_rank_data["z_score"].mean()
drawdown_rank = fund_rank_data["max_drawdown_rank"].mean()
return_rank_df = fund_rank_data["annual_return_rank"]
z_score_level = np.select([z_score >= 80,
70 <= z_score < 80,
z_score < 70], [0, 1, 2]).item()
70 <= z_score < 80,
z_score < 70], [0, 1, 2]).item()
drawdown_level = np.select([drawdown_rank >= 0.8,
0.7 <= drawdown_rank < 0.8,
0.6 <= drawdown_rank < 0.7,
......@@ -671,11 +670,13 @@ class PortfolioDiagnose(object):
propose_fund_df = product_df[product_df["fund_id"].isin(propose_fund_id_list)]
propose_fund_id_list_name = [] # 基金名称,策略分级
# hold_fund = set(self.portfolio) - set(self.abandon_fund)
# abandon_fund = self.abandon_fund
# proposal_fund = self.proposal_fund
# data = [hold_fund, abandon_fund, proposal_fund]
# return data
sentence = "在保留{}的基础上,建议赎回{},并增配{}后,整体组合波动率大幅降低,最大回撤从{}降到不足{},年化收益率提升{}个点"
hold_fund = "".join(set(self.portfolio) - set(self.abandon_fund_score + self.abandon_fund_corr))
abandon_fund = "".join(self.abandon_fund_score + self.abandon_fund_corr)
proposal_fund = "".join(self.proposal_fund)
data = [hold_fund, abandon_fund, proposal_fund, old_max_drawdown]
return sentence % data
def single_evaluation(self, fund_id):
"""
......@@ -779,12 +780,16 @@ class PortfolioDiagnose(object):
ret = []
i = 1
for k, v in evaluation.items():
print(k, v)
single_sentence = str(i) + "." + sentence[k] % translate_single(content, k, v)
single_sentence = str(i) + "、" + sentence[k] % translate_single(content, k, v)
ret.append(single_sentence)
i += 1
fund_name = get_fund_name(fund_id).values[0][0]
return {'name': fund_name, 'data': ret}
evaluation_dict = {'name': fund_name, 'data': ret}
if fund_id in self.abandon_fund_score + self.abandon_fund_corr:
evaluation_dict['status'] = "换仓"
elif fund_id in self.portfolio:
evaluation_dict['status'] = "保留"
return evaluation_dict
def old_portfolio_evaluation(self, ):
result = []
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment