Commit 66be88e5 authored by 赵杰's avatar 赵杰

综合数据,分组数据隔离重构

parent 3566b0cb
......@@ -39,6 +39,7 @@ class UserCustomerDataAdaptor:
self.user_customer_order_df = self.get_user_customer_order_data()
self.fund_nav_total, self.fund_cnav_total = self.get_customer_fund_nav_data()
self.get_customer_index_nav_data()
self.total_customer_order_cnav_df = self.total_combine_data()
self.group_operate()
@staticmethod
......@@ -133,7 +134,6 @@ class UserCustomerDataAdaptor:
# 分组合计算
def group_operate(self):
for folio in self.user_customer_order_df["folio_name"].unique():
cur_folio_order_df = self.user_customer_order_df[self.user_customer_order_df["folio_name"] == folio]
fund_id_list = list(self.user_customer_order_df["fund_id"].unique())
......@@ -216,5 +216,64 @@ class UserCustomerDataAdaptor:
self.group_data[p_folio] = {"result_cnav_data": cnav_df, "order_df": p_order_df}
return cnav_df
# 所有的数据操作
def total_combine_data(self):
pass
p_order_df = self.user_customer_order_df.copy()
p_nav_df = self.fund_nav_total.copy()
p_cnav_df = self.fund_cnav_total.copy()
start_date = pd.to_datetime(p_order_df["confirm_share_date"].min())
cnav_df = p_cnav_df[p_cnav_df.index >= start_date].copy()
p_fund_id_list = list(p_order_df["fund_id"].unique())
for p_fund_id in p_fund_id_list:
order_min_date = p_order_df[p_order_df["fund_id"] == p_fund_id]["confirm_share_date"].min()
if pd.to_datetime(order_min_date) > start_date:
cnav_df.loc[:order_min_date - datetime.timedelta(days=1), p_fund_id] = np.nan
for index, row in p_order_df.iterrows():
cur_fund_id = str(row["fund_id"])
confirm_share_date = pd.to_datetime(row["confirm_share_date"])
# 根据确认净值日查看是否含有累积净值的数据,如果没有按照前后差值推算当天累积净值
if pd.isnull(cnav_df.loc[confirm_share_date, cur_fund_id]):
last_nav_data = p_nav_df[p_nav_df.index < confirm_share_date][cur_fund_id].dropna().tail(1)
last_cnav_data = p_cnav_df[p_cnav_df.index < confirm_share_date][cur_fund_id].dropna().tail(1)
# 判断上个净值日和当前确认日之中是否存在分红日
"""need add judge"""
if len(last_nav_data) < 1:
cnav_df.loc[confirm_share_date, cur_fund_id] = row["nav"]
else:
diff_nav = row["nav"] - last_nav_data.values[0]
cur_cnav = last_cnav_data.values[0] + diff_nav
cnav_df.loc[confirm_share_date, cur_fund_id] = cur_cnav
cnav_df = cnav_df.dropna(axis=0, how="all").fillna(method='ffill')
for index, row in p_order_df.iterrows():
cur_fund_id = str(row["fund_id"])
confirm_share_date = pd.to_datetime(row["confirm_share_date"])
if cur_fund_id + "_amount" not in cnav_df:
profit = cnav_df[cur_fund_id].dropna() - cnav_df[cur_fund_id].dropna().shift(1)
cnav_df[cur_fund_id + "_profit"] = profit
cnav_df[cur_fund_id + "_profit_ratio"] = profit / cnav_df[cur_fund_id].dropna().shift(1)
cnav_df[cur_fund_id + "_amount"] = 0
cnav_df[cur_fund_id + "_earn"] = 0
# cnav_df[cur_fund_id + "_cum_earn"] = 0
cnav_df[cur_fund_id + "_share"] = 0
# buy
if row['order_type'] == 1:
cnav_df.loc[confirm_share_date:, cur_fund_id + "_amount"] += row["confirm_amount"]
cnav_df.loc[confirm_share_date:, cur_fund_id + "_share"] += row["confirm_share"]
# sell
elif row['order_type'] == 2:
cnav_df.loc[confirm_share_date:, cur_fund_id + "_amount"] -= row["confirm_amount"]
cnav_df.loc[confirm_share_date:, cur_fund_id + "_share"] -= row["confirm_share"]
cnav_df[cur_fund_id + "_earn"] = cnav_df[cur_fund_id + "_profit"] * cnav_df[cur_fund_id + "_share"]
cnav_df[cur_fund_id + "_earn"] = cnav_df[cur_fund_id + "_earn"].apply(lambda x: float(x))
cnav_df[cur_fund_id + "_cum_earn"] = cnav_df[cur_fund_id + "_earn"].cumsum()
return cnav_df
......@@ -60,17 +60,16 @@ def resample(df, trading_cal, freq):
class UserCustomerResultAdaptor(UserCustomerDataAdaptor):
total_result_data = {}
group_result_data = []
group_result_data = {}
def __init__(self, user_id, customer_id, end_date=str(datetime.date.today())):
# super().__init__()
super().__init__(user_id, customer_id, end_date)
# 综述数据
def get_total_data(self):
# 组合结果数据
def get_group_result_data(self):
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"]
......@@ -79,7 +78,7 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor):
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]
# fund_id_list_amount = [i + "_amount" for i in fund_id_list]
profit_df = cur_folio_result_cnav_data[fund_id_list_earn]
# 组合收益率数组
......@@ -106,7 +105,7 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor):
# 最大回撤
drawdown = max_drawdown(resample_df["cum_return_ratio"])
folio_report_data["max_drawdown"] = float(drawdown)
folio_report_data["max_drawdown"] = drawdown
# 夏普比率
sim = simple_return(resample_df["cum_return_ratio"])
......@@ -147,25 +146,25 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor):
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):
a = x.year
b = x.month
return str(a) + "/" + str(b)
profit_df_cp = profit_df.copy()
profit_df_cp["date"] = profit_df_cp.index
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
# 累积收益率
cumulative_return= return_ratio_df["cum_return_ratio"].values[-1]
folio_report_data["contribution_decomposition"] = float(cumulative_return)
# # 月度回报
# def year_month(x):
# a = x.year
# b = x.month
# return str(a) + "/" + str(b)
# profit_df_cp = profit_df.copy()
# profit_df_cp["date"] = profit_df_cp.index
# 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
#
# # 累积收益率
# 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)
......@@ -174,10 +173,119 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor):
folio_report_data["group_nav_info"] = result_fund_nav_info
folio_report_data["group_hoding_info"] = result_fund_hoding_info
continue
self.group_result_data[folio] = folio_report_data
return self.group_result_data
# 综述数据
def get_total_data(self):
report_data = {}
cur_folio_result_cnav_data = self.total_customer_order_cnav_df
cur_folio_order_data = self.user_customer_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]
profit_df = cur_folio_result_cnav_data[fund_id_list_earn]
# 持仓周期
first_trade_date = cur_folio_order_data["confirm_share_date"].min()
hold_days = self.end_date - pd.to_datetime(first_trade_date).days
report_data["hold_days"] = hold_days
# 组合收益率数组
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())
report_data["total_cost"] = total_cost
#
# # 累积盈利
# cumulative_profit = profit_df.sum().sum()
# 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)
# report_data["return_ratio_year"] = float(return_ratio_year)
#
# # 波动率
# volatility_ = volatility(resample_df["cum_return_ratio"], n_freq)
# report_data["volatility"] = float(volatility_)
# 最大回撤
drawdown = max_drawdown(resample_df["cum_return_ratio"])
report_data["max_drawdown"] = drawdown
#
# # 夏普比率
# sim = simple_return(resample_df["cum_return_ratio"])
# exc = excess_return(sim, BANK_RATE, n_freq)
# sharpe = sharpe_ratio(exc, sim, n_freq)
# report_data["sharpe"] = float(sharpe)
#
# # 期末资产
# ending_assets = cumulative_profit + total_cost
# 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()
# report_data["cur_month_profit"] = float(cur_month_profit)
#
# # 本月累积收益率
# 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]
# 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()
# report_data["cur_year_profit"] = float(cur_year_profit)
#
# # 今年累积收益率
# 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]
# report_data["cur_year_profit_ratio"] = float(cur_year_profit_ratio)
# 月度回报
def year_month(x):
a = x.year
b = x.month
return str(a) + "/" + str(b)
profit_df_cp = profit_df.copy()
profit_df_cp["date"] = profit_df_cp.index
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)
report_data["month_return"] = month_sum
# # 贡献分解
# month_earn = sum_group.div(month_sum, axis='rows')
# report_data["contribution_decomposition"] = month_earn
# 累积收益率
cumulative_return = return_ratio_df["cum_return_ratio"].values[-1]
report_data["contribution_decomposition"] = float(cumulative_return)
self.total_result_data = report_data
return report_data
# 组合基金净值数据
def group_fund_basic_info_data(self, p_fund_id_list, p_order_df, p_result_cnav_data, p_sum_profit, p_total_amount):
def group_fund_basic_info_data(self, 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():
......@@ -261,5 +369,7 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor):
cum_return_ratio_df.index = return_ratio.index
return cum_return_ratio_df
@staticmethod
def signal_fund_profit_result():
pass
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