folio_comment_service.py 4.29 KB
Newer Older
赵杰's avatar
赵杰 committed
1 2 3
from app.service.portfolio_diagnose import PortfolioDiagnose
from app.service.result_service_v2 import UserCustomerResultAdaptor
import datetime
4
import json
赵杰's avatar
赵杰 committed
5
import traceback
赵杰's avatar
赵杰 committed
6
from app.utils.draw import draw_combination_chart
7
from app.utils.format_transfer import npEncoder
赵杰's avatar
赵杰 committed
8 9


10
def recalculation_fund_comment(args):
11 12 13 14 15 16 17 18 19
    try:
        ifa_id = args.get("ifa_id")
        customer_id = args.get("customer_id")
        folio = args.get("folio")
        suggest_result = json.loads(args.get("suggest_data"))

        suggest_fund_dict = {}
        suggest_fund_list = []
        suggest_amount_list = []
赵杰's avatar
赵杰 committed
20
        all_sug_amount_dict = {}
赵杰's avatar
赵杰 committed
21
        newprcode_dict = {}
22
        for key, value_list in suggest_result.items():
赵杰's avatar
赵杰 committed
23 24
            if len(value_list) <= 0:
                continue
25
            for value in value_list:
赵杰's avatar
赵杰 committed
26 27 28 29
                if len(value) == 0:
                    continue
                if value.get("newprcode"):
                    newprcode_dict[value["fund_id"]] = value["newprcode"]
赵杰's avatar
赵杰 committed
30
                all_sug_amount_dict[value["fund_id"]] = value["after_optimization"]
赵杰's avatar
赵杰 committed
31
                value["after_optimization"] = round(float(value["after_optimization"]), 2)
32 33 34 35 36 37 38 39 40 41 42 43 44
                if value["after_optimization"] <= 0:
                    continue
                suggest_fund_dict[value["fund_id"]] = value["fund_type"]
                suggest_fund_list.append(value["fund_id"])
                suggest_amount_list.append(value["after_optimization"])
        sum_amount = sum(suggest_amount_list)
        suggest_weight_list = [round(amount / sum_amount, 4) for amount in suggest_amount_list]

        user_customer = UserCustomerResultAdaptor(ifa_id, customer_id, end_date=datetime.datetime.now().strftime("%Y-%m-%d"))
        group_result = user_customer.calculate_group_result_data()
        cur_folio_result = group_result[folio]

        portfolio_diagnose = PortfolioDiagnose(client_type=1, portfolio=user_customer.all_fund_type_dict,
赵杰's avatar
赵杰 committed
45
                                               invest_amount=float(sum_amount * 10000),
46 47 48 49 50 51 52
                                               start_date=user_customer.start_date)

        portfolio_diagnose.proposal_customize(suggest_fund_list, suggest_weight_list, suggest_fund_dict)

        abandon_fund = list(set(cur_folio_result["fund_id_list"]) - set(suggest_fund_list))
        portfolio_diagnose.abandon_fund_score = abandon_fund

赵杰's avatar
赵杰 committed
53 54 55
        dict_result = {}
        new_suggestions_result, new_suggestions_result_asset,  return_compare_data, \
        indicator_compare, new_group_evaluation = \
56
            portfolio_diagnose.new_evaluation(folio, group_result, user_customer, suggest_fund_dict)
赵杰's avatar
赵杰 committed
57 58 59
        for key_, value_ in new_suggestions_result.items():
            for new_sug in value_:
                new_sug["after_optimization"] = all_sug_amount_dict.get(new_sug["fund_id"], 0)
赵杰's avatar
赵杰 committed
60 61
                if newprcode_dict.get(new_sug["fund_id"]):
                    new_sug["newprcode"] = newprcode_dict.get(new_sug["fund_id"])
62

赵杰's avatar
赵杰 committed
63
        new_suggestions_result_asset["after"] = round(sum_amount, 2)
赵杰's avatar
赵杰 committed
64 65 66 67 68 69 70 71 72 73
        dict_result["suggestions_result"] = new_suggestions_result
        dict_result["suggestions_result_asset"] = new_suggestions_result_asset
        # dict_result["return_compare_data"] = return_compare_data
        dict_result["indicator_compare"] = indicator_compare
        dict_result["new_group_evaluation"] = new_group_evaluation

        new_correlation = portfolio_diagnose.new_correlation
        new_correlation_columns = new_correlation.columns.tolist()
        new_correlation_values = new_correlation.values.tolist()
        dict_result["new_correlation"] = list(zip(range(1, len(new_correlation_columns)+1), new_correlation_columns, new_correlation_values))
74 75
        return_compare_data["origin_combination"]["data"] = return_compare_data["origin_combination"]["data"] - 100
        return_compare_data["origin_combination"]["data"][0] = 0.0
赵杰's avatar
赵杰 committed
76 77 78 79 80
        dict_result["return_compare_pic"] = draw_combination_chart(
            return_compare_data["xlabels"],
            return_compare_data["new_combination"],
            return_compare_data["origin_combination"],
            return_compare_data["index"])
81
    except Exception as e:
赵杰's avatar
赵杰 committed
82
        print(traceback.print_exc())
83
        return False
赵杰's avatar
赵杰 committed
84
    # print(json.dumps(dict_result, cls=npEncoder, ensure_ascii=False))
赵杰's avatar
赵杰 committed
85
    return json.dumps(dict_result, cls=npEncoder, ensure_ascii=False)