Commit 3566b0cb authored by 赵杰's avatar 赵杰

分组数据结果配置成json

parent 8853b6d0
......@@ -94,21 +94,21 @@ class UserCustomerDataAdaptor:
cur_fund_nav_df = pd.DataFrame(list(data), columns=['price_date', 'nav', 'cnav'])
# # 对应基金分红
# sql = """select distinct `distribute_date`, `distribution` from `fund_distribution` where `fund_id`='{}' and `distribute_type`='1' order by `distribute_date` ASC""".format(
# cur_fund_id)
# cur = tamp_product_session.execute(sql)
# data = cur.fetchall()
# cur_fund_distribution_df = pd.DataFrame(list(data), columns=['price_date', 'distribution'])
# self.all_fund_distribution[cur_fund_id] = cur_fund_distribution_df
#
# # 对应基金performance数据
# sql = """select distinct `price_date`, `ret_cum_1w`, `ret__cum_1m`, `ret_cum_6m`, `ret_cum_1y`, `ret_cum_ytd`, `ret_cum_incep` from `fund_performance` where `fund_id`='{}' order by `price_date` ASC""".format(
# cur_fund_id)
# cur = tamp_product_session.execute(sql)
# data = cur.fetchall()
# cur_fund_performance_df = pd.DataFrame(list(data),
# columns=['price_date', 'ret_cum_1w', 'ret__cum_1m', 'ret_cum_6m', 'ret_cum_1y', 'ret_cum_ytd', 'ret_cum_incep'])
# self.all_fund_performance[cur_fund_id] = cur_fund_performance_df
sql = """select distinct `distribute_date`, `distribution` from `fund_distribution` where `fund_id`='{}' and `distribute_type`='1' order by `distribute_date` ASC""".format(
cur_fund_id)
cur = tamp_product_session.execute(sql)
data = cur.fetchall()
cur_fund_distribution_df = pd.DataFrame(list(data), columns=['price_date', 'distribution'])
self.all_fund_distribution[cur_fund_id] = cur_fund_distribution_df
# 对应基金performance数据
sql = """select distinct `price_date`, `ret_1w`, `ret_cum_1m`, `ret_cum_6m`, `ret_cum_1y`, `ret_cum_ytd`, `ret_cum_incep` from `fund_performance` where `fund_id`='{}' order by `price_date` ASC""".format(
cur_fund_id)
cur = tamp_product_session.execute(sql)
data = cur.fetchall()
cur_fund_performance_df = pd.DataFrame(list(data),
columns=['price_date', 'ret_1w', 'ret_cum_1m', 'ret_cum_6m', 'ret_cum_1y', 'ret_cum_ytd', 'ret_cum_incep'])
self.all_fund_performance[cur_fund_id] = cur_fund_performance_df
cur_fund_nav_df["price_date"] = pd.to_datetime(cur_fund_nav_df["price_date"])
cur_fund_nav_df.set_index("price_date", inplace=True)
......
......@@ -13,6 +13,11 @@ from decimal import Decimal
from app.service.data_service import UserCustomerDataAdaptor
from app.utils.week_evaluation import *
dict_substrategy = {1010: '主观多头', 1020: '股票多空', 1030: '量化多头', 2010: '宏观策略', 3010: '主观趋势', 3020: '主观套利',
3030: '量化趋势', 3040: '量化套利', 3050: 'CTA策略', 4010: '并购重组', 4020: '定向增发', 4030: '大宗交易',
4040: '事件驱动复合', 5010: '市场中性', 5020: '套利策略', 5030: '相对价值复合', 6010: '纯债策略', 6020: '强债策略',
6030: '债券策略', 7010: 'MOM', 7020: 'FOF', 8010: '主观多策略', 8020: '量化多策略', -1: '其他策略'}
BANK_RATE = 0.015
def resample(df, trading_cal, freq):
"""对基金净值表进行粒度不同的重采样,并剔除不在交易日中的结果
......@@ -66,42 +71,81 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor):
for folio in self.group_data.keys():
# self.group_result_data.append({folio: {}})
folio_report_data = {}
cur_folio_result_cnav_data = self.group_data[folio]["result_cnav_data"]
cur_folio_order_data = self.group_data[folio]["order_df"]
freq_max = cur_folio_order_data["freq"].max()
fund_id_list = list(cur_folio_order_data["fund_id"].unique())
fund_id_list_earn = [i + "_earn" for i in fund_id_list]
fund_id_list_amount = [i + "_amount" for i in fund_id_list]
profit_df = cur_folio_result_cnav_data[fund_id_list_earn]
resample_df = resample(cur_folio_result_cnav_data, self.trade_cal, 2)
# 组合收益率
return_ratio_serise = self.combination_yield(cur_folio_result_cnav_data, fund_id_list)
# 组合收益率数组
return_ratio_df = self.combination_yield(cur_folio_result_cnav_data, fund_id_list)
resample_df = resample(return_ratio_df, self.trade_cal, freq_max)
# 总成本
total_cost = float(cur_folio_order_data[cur_folio_order_data["order_type"] == 1]["confirm_amount"].sum() - \
cur_folio_order_data[cur_folio_order_data["order_type"] == 2]["confirm_amount"].sum())
folio_report_data["total_cose"] = total_cost
# 累积盈利
cumulative_profit = profit_df.sum().sum()
# 年化收益
return_ratio_year = 0
"""*************************年化收益*******************************"""
folio_report_data["cumulative_profit"] = float(cumulative_profit)
# 区间年化收益
n_freq = freq_days(int(freq_max))
return_ratio_year = annual_return((resample_df["cum_return_ratio"].values[-1]-1), resample_df, n_freq)
folio_report_data["return_ratio_year"] = float(return_ratio_year)
# 波动率
volatility_ = volatility(resample_df["cum_return_ratio"], n_freq)
folio_report_data["volatility"] = float(volatility_)
# 最大回撤
drawdown = max_drawdown(resample_df["cum_return_ratio"])
folio_report_data["max_drawdown"] = float(drawdown)
# 夏普比率
sim = simple_return(resample_df["cum_return_ratio"])
exc = excess_return(sim, BANK_RATE, n_freq)
sharpe = sharpe_ratio(exc, sim, n_freq)
folio_report_data["sharpe"] = float(sharpe)
# 期末资产
ending_assets = cumulative_profit + total_cost
folio_report_data["ending_assets"] = float(ending_assets)
# 本月收益
cur_month_profit_df = profit_df.loc[self.month_start_date:self.end_date+datetime.timedelta(days=1), fund_id_list_earn]
cur_month_profit = cur_month_profit_df.sum().sum()
folio_report_data["cur_month_profit"] = float(cur_month_profit)
# 本月累积收益率
cur_month_profit_ratio = return_ratio_serise.loc[self.month_start_date:].sum()
last_profit_ratio = return_ratio_df.loc[:self.month_start_date, "cum_return_ratio"].values
cur_profit_ratio = return_ratio_df.loc[self.month_start_date:, "cum_return_ratio"].values
if len(last_profit_ratio) <= 0:
cur_month_profit_ratio = cur_profit_ratio[-1] - 1
else:
cur_month_profit_ratio = (cur_profit_ratio[-1] - last_profit_ratio[-1]) / last_profit_ratio[-1]
folio_report_data["cur_month_profit_ratio"] = float(cur_month_profit_ratio)
# 今年累积收益
cur_year_date = pd.to_datetime(str(datetime.date(year=self.end_date.year, month=1, day=1)))
cur_year_profit_df = profit_df.loc[cur_year_date:self.end_date + datetime.timedelta(days=1), fund_id_list_earn]
cur_year_profit = cur_year_profit_df.sum().sum()
folio_report_data["cur_year_profit"] = float(cur_year_profit)
# 今年累积收益率
cur_year_profit_ratio = return_ratio_serise.loc[cur_year_date:]
last_profit_ratio = return_ratio_df.loc[:cur_year_date, "cum_return_ratio"].values
cur_profit_ratio = return_ratio_df.loc[cur_year_date:, "cum_return_ratio"].values
if len(last_profit_ratio) <= 0:
cur_year_profit_ratio = cur_profit_ratio[-1] - 1
else:
cur_year_profit_ratio = (cur_profit_ratio[-1] - last_profit_ratio[-1]) / last_profit_ratio[-1]
folio_report_data["cur_year_profit_ratio"] = float(cur_year_profit_ratio)
# 月度回报
def year_month(x):
......@@ -113,22 +157,72 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor):
grouped = profit_df_cp.groupby(profit_df_cp["date"].apply(year_month))
sum_group = grouped.agg(np.sum)
month_sum = sum_group.sum(axis=1)
folio_report_data["month_return"] = month_sum
# 贡献分解
month_earn = sum_group.div(month_sum, axis='rows')
folio_report_data["contribution_decomposition"] = month_earn
# 累积收益率
profit_df_cp["cumulative_return"] = return_ratio_serise.cumsum()
grouped_cumulative = profit_df_cp["cumulative_return"].groupby(profit_df_cp["date"].apply(year_month))
month_cumulative_return = grouped_cumulative.last()
cumulative_return= return_ratio_df["cum_return_ratio"].values[-1]
folio_report_data["contribution_decomposition"] = float(cumulative_return)
# 组合内单个基金净值数据 组合内基金持仓数据
result_fund_nav_info, result_fund_hoding_info = self.group_fund_basic_info_data(fund_id_list, cur_folio_order_data, cur_folio_result_cnav_data, cumulative_profit, total_cost)
# 拼接组合以及综合结果数据
folio_report_data["group_nav_info"] = result_fund_nav_info
folio_report_data["group_hoding_info"] = result_fund_hoding_info
continue
# 单个组合基金净值数据
def signal_fund_info_data(self, p_fund_id_list, p_order_df):
pass
# 组合数据
# 组合基金净值数据
def group_fund_basic_info_data(self, p_fund_id_list, p_order_df, p_result_cnav_data, p_sum_profit, p_total_amount):
group_fund_basic_info = []
group_fund_hoding_info = []
for index, row in p_order_df.iterrows():
cur_fund_id = str(row["fund_id"])
cur_fund_performance = self.all_fund_performance[cur_fund_id]
cur_fund_info_series = cur_fund_performance.iloc[-1]
# 基金净值数据
fund_basic_info = {"fund_name": row["fund_name"], "confirm_nav": row["nav"]}
fund_basic_info["cur_nav"] = float(self.fund_nav_total[cur_fund_id].dropna().values[-1])
fund_basic_info["cur_cnav"] = float(self.fund_cnav_total[cur_fund_id].dropna().values[-1])
fund_basic_info["ret_1w"] = cur_fund_info_series["ret_1w"] # 上周
fund_basic_info["ret_cum_1m"] = cur_fund_info_series["ret_cum_1m"]
fund_basic_info["ret_cum_6m"] = cur_fund_info_series["ret_cum_6m"]
fund_basic_info["ret_cum_1y"] = cur_fund_info_series["ret_cum_1y"]
fund_basic_info["ret_cum_ytd"] = cur_fund_info_series["ret_cum_ytd"]
fund_basic_info["ret_cum_incep"] = cur_fund_info_series["ret_cum_incep"]
# 申购以来
confirm_date = pd.to_datetime(row["confirm_share_date"])
confirm_cnav = float(p_result_cnav_data.loc[confirm_date, cur_fund_id])
fund_basic_info["ret_after_confirm"] = (fund_basic_info["cur_cnav"] - confirm_cnav)/confirm_cnav
# 分红
distribution_df = self.all_fund_distribution[cur_fund_id]
if distribution_df.empty:
fund_basic_info["distribution"] = "-"
else:
distribution_df["price_date"] = pd.to_datetime(distribution_df["price_date"])
fund_basic_info["distribution"] = float(distribution_df[distribution_df["price_date"] > confirm_date]["distribution"].sum())
def get_group_data(self):
pass
group_fund_basic_info.append(fund_basic_info)
def performance_reward(self, order_info, ):
pass
# 基金持仓数据
fund_hoding_info = {"fund_strategy_name": dict_substrategy[int(row["substrategy"])], "fund_name": row["fund_name"]}
fund_hoding_info["confirm_date"] = row["confirm_share_date"]
fund_hoding_info["weight"] = float(row["confirm_amount"]) / p_total_amount
fund_hoding_info["market_values"] = float(row["confirm_share"]) * (fund_basic_info["cur_cnav"] - confirm_cnav) + float(row["confirm_amount"])
fund_hoding_info["cost"] = float(row["confirm_amount"])
fund_hoding_info["profit"] = float(row["confirm_share"]) * (fund_basic_info["cur_cnav"] - confirm_cnav)
# fund_hoding_info["ykb"] = fund_hoding_info["profit"] / fund_hoding_info["cost"]
try:
fund_hoding_info["ykb"] = float(gain_loss_ratio(p_result_cnav_data[cur_fund_id + "_profit"].dropna()))
except:
fund_hoding_info["ykb"] = 0
fund_hoding_info["profit_contribution"] = fund_hoding_info["profit"] / p_sum_profit
group_fund_hoding_info.append(fund_hoding_info)
return group_fund_basic_info, group_fund_hoding_info
@staticmethod
def combination_yield(p_combina_df, fund_id_list):
......@@ -146,7 +240,26 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor):
# 收益率
return_ratio = nav_profit_ratio_weight.sum(axis=1)
return return_ratio
# 累积收益率
return_ratio_list = list(return_ratio.values)
cum_return_ratio = []
last_ratio = 0
for i in range(len(return_ratio_list)):
if i == 0:
last_ratio = 1 + return_ratio_list[i]
cum_return_ratio.append(last_ratio)
continue
cur_ratio = (1 + return_ratio_list[i]) * last_ratio
cum_return_ratio.append(cur_ratio)
last_ratio = cur_ratio
# 收益率
cum_return_ratio_df = pd.DataFrame(return_ratio.values, columns=["return_ratio"])
cum_return_ratio_df["cum_return_ratio"] = cum_return_ratio
cum_return_ratio_df.index = return_ratio.index
return cum_return_ratio_df
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