Commit 1cf3fd20 authored by 李宗熹's avatar 李宗熹

Merge branch 'dev' of http://47.100.44.39:10001/pengxiong/fund_report into dev

parents 39279e4f 75230ea3
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -3,6 +3,7 @@ from app.utils.risk_parity import *
from app.pypfopt import risk_models
from app.pypfopt import expected_returns
from app.pypfopt import EfficientFrontier
from app.utils.week_evaluation import *
def cal_correlation(prod):
......@@ -494,20 +495,109 @@ class PortfolioDiagnose(object):
propose_fund_return.to_csv('new_port.csv', encoding='gbk')
return index_return, propose_fund_return
def old_evaluation(self):
start_year = self.start_date.year
start_month = self.start_date.month
def old_evaluation(self, group_name, group_result, data_adaptor):
start_year = data_adaptor.start_date.year
start_month = data_adaptor.start_date.month
current_year = datetime.datetime.now().year
current_month = datetime.datetime.now().month
current_day = datetime.datetime.now().day
past_month = (current_year - start_year) * 12 + current_month - start_month
# 投入成本(万元)
input_cost = round(group_result[group_name]["total_cost"]/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()
drawdown_level = np.select([drawdown_rank >= 0.8,
0.7 <= drawdown_rank < 0.8,
0.6 <= drawdown_rank < 0.7,
drawdown_rank < 0.6], [0, 1, 2, 3]).item()
# 收益稳健
fund_rank_re = fund_rank_data[fund_rank_data["annual_return_rank"] > 0.8]
return_rank_evaluate = ""
if len(fund_rank_re) > 0:
num = len(fund_rank_re)
fund_id_rank_list = list(fund_rank_re["fund_id"])
for f_id in fund_id_rank_list:
name = data_adaptor.user_customer_order_df[data_adaptor.user_customer_order_df["fund_id"] == f_id]["fund_name"].values[0]
return_rank_evaluate = return_rank_evaluate + name + "、"
return_rank_evaluate = return_rank_evaluate[:-1] +"等" + str(num) + "只产品稳健,对组合的收益率贡献明显,"
# 正收益基金数量
group_hold_data = pd.DataFrame(group_result[group_name]["group_hoding_info"])
profit_positive_num = group_hold_data[group_hold_data["profit"]>0]["profit"].count()
if profit_positive_num > 0:
profit_positive_evaluate = str(profit_positive_num) + "只基金取的正收益,"
else:
profit_positive_evaluate = ""
# 综合得分较低数量
abandon_num = len(self.abandon_fund_score)
abandon_evaluate = str(abandon_num) + "只基金综合得分较低建议更换,"
# 成立时间短
if len(self.no_data_fund) > 0:
no_data_fund_evaluate = str(len(self.no_data_fund)) + "只基金因为成立时间较短,暂不做评价;"
else:
no_data_fund_evaluate = ";"
group_order_df = data_adaptor.user_customer_order_df[data_adaptor.user_customer_order_df["folio_name"] == group_name]
strategy_list = group_order_df["substrategy"]
uniqe_strategy = list(strategy_list.unique())
uniqe_strategy_name = [dict_substrategy[int(x)] + "、" for x in uniqe_strategy]
# 覆盖的基金名称
strategy_name_evaluate = "".join(uniqe_strategy_name)[:-1]
if len(uniqe_strategy)/float(len(strategy_list)) > 0.6:
strategy_distribution_evaluate = "策略上有一定分散"
else:
strategy_distribution_evaluate = "策略分散程度不高"
# 相关性
if len(self.abandon_fund_corr) > 0:
fund_corr_name = [str(group_order_df[group_order_df["fund_id"] == f_id]["fund_name"].values[0]) + "和" for f_id in self.abandon_fund_corr]
fund_corr_evaluate = "".join(fund_corr_name)[:-1] + "相关性较高,建议调整组合配比;"
else:
fund_corr_evaluate = ";"
num_fund = len(self.portfolio)
abandon_fund = [[x, self.invest_type] for x in self.abandon_fund_score + self.abandon_fund_corr]
old_strategy = set([search_rank(fund_rank, x, metric='substrategy') for x in self.portfolio])
evaluate_enum = [["优秀", "良好", "一般"],
["优秀", "良好", "合格", "较差"]]
data = [start_year, start_month, past_month, self.invest_amount,
current_year, current_month, current_day]
return data
z_score_evaluate = evaluate_enum[0][z_score_level]
drawdown_evaluate = evaluate_enum[1][drawdown_level]
if z_score_evaluate in ["优秀", "良好"]:
z_score_evaluate = """<span class="self_description_red">{}</span>""".format(z_score_evaluate)
else:
z_score_evaluate = """<span class="self_description_green">{}</span>""".format(z_score_evaluate)
if drawdown_evaluate in ["优秀", "良好"]:
drawdown_evaluate = """<span class="self_description_red">{}</span>""".format(drawdown_evaluate)
else:
drawdown_evaluate = """<span class="self_description_green">{}</span>""".format(drawdown_evaluate)
sentence = {
1: "1、组合构建于{}年{}月,至今已运行{}个月。投入成本为{}万元,截止{}年{}月{}日,整体盈利{}万元,整体表现{},回撤控制能力{};\n",
2: "2、组合共持有{}只基金,{}{}{}{}\n",
3: "3、策略角度来看,组合涵盖了{}, {}{}\n"
}
data = {1: [start_year, start_month, past_month, input_cost, current_year, current_month, current_day,
total_profit, z_score_evaluate, drawdown_evaluate],
2: [num_fund, return_rank_evaluate, profit_positive_evaluate, abandon_evaluate, no_data_fund_evaluate],
3: [strategy_name_evaluate, strategy_distribution_evaluate, fund_corr_evaluate]
}
ret = []
for k, v in data.items():
ret.append(sentence[k].format(*data[k]).replace(",;", ";"))
return ret
def new_evaluation(self):
hold_fund = set(self.portfolio) - set(self.abandon_fund)
......@@ -657,10 +747,10 @@ portfolio = ['HF00002JJ2', 'HF00005DBQ', 'HF0000681Q', 'HF00006693', 'HF00006AZF
portfolio_diagnose = PortfolioDiagnose(client_type=1, portfolio=portfolio, invest_amount=10000000)
portfolio_diagnose.optimize()
if __name__ == '__main__':
# print(portfolio_diagnose.single_fund_radar())
print(portfolio_diagnose.single_fund_radar())
# print(portfolio_diagnose.propose_fund_radar())
# print(portfolio_diagnose.old_portfolio_evaluation())
print('旧组合相关性:', portfolio_diagnose.old_correlation)
print('新组合相关性:', portfolio_diagnose.new_correlation)
print('旧组合个基评价:', portfolio_diagnose.old_portfolio_evaluation())
print('新组合个基评价:', portfolio_diagnose.propose_fund_evaluation())
# print('旧组合相关性:', portfolio_diagnose.old_correlation)
# print('新组合相关性:', portfolio_diagnose.new_correlation)
# print('旧组合个基评价:', portfolio_diagnose.old_portfolio_evaluation())
# print('新组合个基评价:', portfolio_diagnose.propose_fund_evaluation())
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