Commit 05619743 authored by 赵杰's avatar 赵杰

新版持仓报告修复bug

parent 733f1845
...@@ -106,11 +106,32 @@ class UserCustomerDataAdaptor: ...@@ -106,11 +106,32 @@ class UserCustomerDataAdaptor:
user_customer_order_df = order_df.set_index('fund_id').join(product_df.set_index('fund_id')).reset_index() user_customer_order_df = order_df.set_index('fund_id').join(product_df.set_index('fund_id')).reset_index()
user_customer_order_df["confirm_share_date"] = user_customer_order_df["confirm_share_date"].apply(lambda x: pd.to_datetime(x.date())) user_customer_order_df["confirm_share_date"] = user_customer_order_df["confirm_share_date"].apply(lambda x: pd.to_datetime(x.date()))
self.start_date = user_customer_order_df["confirm_share_date"].min()
self.customer_real_name = user_customer_order_df["customer_name"].values[0] self.customer_real_name = user_customer_order_df["customer_name"].values[0]
self.ifa_real_name = user_customer_order_df["username"].values[0] self.ifa_real_name = user_customer_order_df["username"].values[0]
user_customer_order_df = user_customer_order_df[user_customer_order_df["confirm_share_date"] <= self.end_date] user_customer_order_df = user_customer_order_df[user_customer_order_df["confirm_share_date"] <= self.end_date]
user_customer_order_df["confirm_amount"] = user_customer_order_df["confirm_amount"] - user_customer_order_df["subscription_fee"]
user_customer_order_df.index = pd.Series(range(len(user_customer_order_df))) user_customer_order_df.index = pd.Series(range(len(user_customer_order_df)))
for index, row in user_customer_order_df.iterrows():
if row["order_type"] == 2:
need_less_share = row["confirm_share"]
for index_ori, row_ori in user_customer_order_df.iterrows():
if index_ori >= index:
break
if row["fund_id"] == row_ori["fund_id"] and row_ori["order_type"] == 1:
ori_share = row_ori["confirm_share"]
if need_less_share >= ori_share:
need_less_share -= ori_share
user_customer_order_df.loc[index_ori, "confirm_share"] = 0
else:
need_less_share = 0
user_customer_order_df.loc[index_ori, "confirm_share"] = row_ori[
"confirm_share"] - need_less_share
if need_less_share <= 0:
break
user_customer_order_df = user_customer_order_df[(user_customer_order_df["order_type"] == 1)&(user_customer_order_df["confirm_share"] > 0)]
user_customer_order_df.index = pd.Series(range(len(user_customer_order_df)))
self.start_date = user_customer_order_df["confirm_share_date"].min()
return user_customer_order_df return user_customer_order_df
# 获取客户持有的基金净值数据 # 获取客户持有的基金净值数据
......
...@@ -28,7 +28,8 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor): ...@@ -28,7 +28,8 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor):
folio_report_data = {} folio_report_data = {}
cur_folio_result_cnav_data = self.group_data[folio]["result_cnav_data"] cur_folio_result_cnav_data = self.group_data[folio]["result_cnav_data"]
cur_folio_order_data = self.group_data[folio]["order_df"] cur_folio_order_data = self.group_data[folio]["order_df"].copy()
freq_max = cur_folio_order_data["freq"].max() freq_max = cur_folio_order_data["freq"].max()
first_trade_date = cur_folio_order_data["confirm_share_date"].min() first_trade_date = cur_folio_order_data["confirm_share_date"].min()
...@@ -62,8 +63,7 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor): ...@@ -62,8 +63,7 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor):
"cumulative": cumulative_data} "cumulative": cumulative_data}
# 总成本 # 总成本
total_cost = float(cur_folio_order_data[cur_folio_order_data["order_type"] == 1]["confirm_amount"].sum() - \ total_cost = round(float((cur_folio_order_data[cur_folio_order_data["order_type"] == 1]["confirm_share"]*cur_folio_order_data[cur_folio_order_data["order_type"] == 1]["nav"]).sum()), 2)
cur_folio_order_data[cur_folio_order_data["order_type"] == 2]["confirm_amount"].sum())
folio_report_data["total_cost"] = total_cost folio_report_data["total_cost"] = total_cost
# 累积盈利 # 累积盈利
...@@ -103,7 +103,7 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor): ...@@ -103,7 +103,7 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor):
# 本月累积收益率 # 本月累积收益率
last_profit_ratio = return_ratio_df.loc[:self.month_start_date, "cum_return_ratio"].values 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 cur_profit_ratio = return_ratio_df.loc[self.month_start_date - datetime.timedelta(days=1):, "cum_return_ratio"].values
if len(last_profit_ratio) <= 0: if len(last_profit_ratio) <= 0:
cur_month_profit_ratio = cur_profit_ratio[-1] - 1 cur_month_profit_ratio = cur_profit_ratio[-1] - 1
else: else:
...@@ -182,7 +182,7 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor): ...@@ -182,7 +182,7 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor):
report_data = {} report_data = {}
cur_folio_result_cnav_data = self.total_customer_order_cnav_df.copy() cur_folio_result_cnav_data = self.total_customer_order_cnav_df.copy()
cur_folio_order_data = self.user_customer_order_df cur_folio_order_data = self.user_customer_order_df.copy()
freq_max = cur_folio_order_data["freq"].max() freq_max = cur_folio_order_data["freq"].max()
# #
fund_id_list = list(cur_folio_order_data["fund_id"].unique()) fund_id_list = list(cur_folio_order_data["fund_id"].unique())
...@@ -207,8 +207,7 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor): ...@@ -207,8 +207,7 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor):
resample_df = resample_df[resample_df.index <= self.end_date] resample_df = resample_df[resample_df.index <= self.end_date]
# 总成本 # 总成本
total_cost = float(cur_folio_order_data[cur_folio_order_data["order_type"] == 1]["confirm_amount"].sum() - \ total_cost = round(float((cur_folio_order_data[cur_folio_order_data["order_type"] == 1]["confirm_share"]*cur_folio_order_data[cur_folio_order_data["order_type"] == 1]["nav"]).sum()), 2)
cur_folio_order_data[cur_folio_order_data["order_type"] == 2]["confirm_amount"].sum())
report_data["total_cost"] = total_cost report_data["total_cost"] = total_cost
# 累积盈利 # 累积盈利
...@@ -339,6 +338,8 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor): ...@@ -339,6 +338,8 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor):
n_freq = freq_days(int(freq_max)) n_freq = freq_days(int(freq_max))
resample_df = resample(p_result_cnav_data, self.trade_cal_date, freq_max) resample_df = resample(p_result_cnav_data, self.trade_cal_date, freq_max)
for index, row in p_order_df.iterrows(): for index, row in p_order_df.iterrows():
if row['order_type'] == 2 or row["confirm_share"] <= 0:
continue
cur_fund_id = str(row["fund_id"]) cur_fund_id = str(row["fund_id"])
cur_fund_performance = self.all_fund_performance[cur_fund_id] cur_fund_performance = self.all_fund_performance[cur_fund_id]
if len(cur_fund_performance) <=0: if len(cur_fund_performance) <=0:
...@@ -399,24 +400,37 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor): ...@@ -399,24 +400,37 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor):
fund_hoding_info["confirm_date"] = row["confirm_share_date"].strftime("%Y-%m-%d") fund_hoding_info["confirm_date"] = row["confirm_share_date"].strftime("%Y-%m-%d")
fund_hoding_info["hold_year"] = "%.2f" % round((self.end_date - pd.to_datetime(row["confirm_share_date"])).days/365.0, 2) # 存续年数 fund_hoding_info["hold_year"] = "%.2f" % round((self.end_date - pd.to_datetime(row["confirm_share_date"])).days/365.0, 2) # 存续年数
fund_hoding_info["market_values"] = round((float(row["confirm_share"]) * (fund_basic_info["cur_cnav"] - confirm_cnav) + float(row["confirm_amount"]))/10000, 2) fund_hoding_info["market_values"] = round((float(row["confirm_share"]) * (fund_basic_info["cur_cnav"] - confirm_cnav) + float(row["confirm_amount"]))/10000, 2)
temp_market_values = float(row["confirm_share"]) * (fund_basic_info["cur_cnav"] - confirm_cnav) + float(row["confirm_amount"])
fund_hoding_info["weight"] = "%.2f" % round(float(fund_hoding_info["market_values"]) / total_market_values * 10000.0 * 100, 2) # 月末占比 fund_hoding_info["weight"] = "%.2f" % round(float(fund_hoding_info["market_values"]) / total_market_values * 10000.0 * 100, 2) # 月末占比
fund_hoding_info["cost"] = "%.2f" % round(float(row["confirm_amount"])/10000, 2) # 投资本金 fund_hoding_info["cost"] = "%.2f" % round(float(row["confirm_amount"])/10000, 2) # 投资本金
# 当月收益 # 当月收益
last_month_cnav_serise = p_result_cnav_data[p_result_cnav_data.index<pd.to_datetime(self.month_start_date)][row["fund_id"]].dropna() if row['confirm_share_date'] > self.month_start_date:
cal_month_start_date = row['confirm_share_date']
last_month_cnav_serise = p_result_cnav_data[p_result_cnav_data.index == pd.to_datetime(cal_month_start_date)][
row["fund_id"]].dropna()
else:
cal_month_start_date = self.month_start_date - datetime.timedelta(days=1)
last_month_cnav_serise = p_result_cnav_data[p_result_cnav_data.index<pd.to_datetime(cal_month_start_date)][row["fund_id"]].dropna()
if len(last_month_cnav_serise) == 0: if len(last_month_cnav_serise) == 0:
fund_hoding_info["profit"] = round(float(row["confirm_share"]) * (fund_basic_info["cur_cnav"] - confirm_cnav) / 10000, 2) fund_hoding_info["profit"] = round(float(row["confirm_share"]) * (fund_basic_info["cur_cnav"] - confirm_cnav) / 10000, 2)
temp_profit = float(row["confirm_share"]) * (fund_basic_info["cur_cnav"] - confirm_cnav)
temp_profit_ratio = (fund_basic_info["cur_cnav"] - confirm_cnav)/confirm_cnav
else: else:
last_month_cnav = float(last_month_cnav_serise.values[-1]) last_month_cnav = float(last_month_cnav_serise.values[-1])
fund_hoding_info["profit"] = round(float(row["confirm_share"]) * (fund_basic_info["cur_cnav"] - last_month_cnav)/10000, 2) fund_hoding_info["profit"] = round(float(row["confirm_share"]) * (fund_basic_info["cur_cnav"] - last_month_cnav)/10000, 2)
temp_profit = float(row["confirm_share"]) * (fund_basic_info["cur_cnav"] - last_month_cnav)
temp_profit_ratio = (fund_basic_info["cur_cnav"] - last_month_cnav) / last_month_cnav
# 当月收益率 # 当月收益率
fund_hoding_info["month_return_ratio"] = "%.2f" % round(float(fund_hoding_info["profit"]) / float(fund_hoding_info["market_values"])*100, 2) # fund_hoding_info["month_return_ratio"] = "%.2f" % round(temp_profit / temp_market_values*100, 2)
fund_hoding_info["month_return_ratio"] = "%.2f" % round(temp_profit_ratio * 100, 2)
# 累积收益 # 累积收益
fund_hoding_info["cum_profit"] = "%.2f" % round(float(row["confirm_share"]) * (fund_basic_info["cur_cnav"] - confirm_cnav) / 10000, 2) fund_hoding_info["cum_profit"] = "%.2f" % round(float(row["confirm_share"]) * (fund_basic_info["cur_cnav"] - confirm_cnav) / 10000, 2)
# 累积收益率 # 累积收益率
fund_hoding_info["cum_profit_ratio"] = "%.2f" % round((fund_basic_info["cur_cnav"] - confirm_cnav)/confirm_cnav*100, 2) fund_hoding_info["cum_profit_ratio"] = "%.2f" % round((fund_basic_info["cur_cnav"] - confirm_cnav)/confirm_cnav*100, 2)
cum_profit_ratio_temp = (fund_basic_info["cur_cnav"] - confirm_cnav) / confirm_cnav
# 累积年化收益率 # 累积年化收益率
cur_resample_df = resample_df[[row["fund_id"]]].dropna() cur_resample_df = resample_df[[row["fund_id"]]].dropna()
return_ratio_year = annual_return(float(fund_hoding_info["cum_profit_ratio"])/100.0, cur_resample_df, n_freq) return_ratio_year = annual_return(float(cum_profit_ratio_temp), cur_resample_df, n_freq)
fund_hoding_info["return_ratio_year"] = "%.2f" % round(float(return_ratio_year)*100, 2) fund_hoding_info["return_ratio_year"] = "%.2f" % round(float(return_ratio_year)*100, 2)
group_fund_hoding_info.append(fund_hoding_info) group_fund_hoding_info.append(fund_hoding_info)
return group_fund_basic_info, group_fund_hoding_info return group_fund_basic_info, group_fund_hoding_info
......
...@@ -1046,7 +1046,7 @@ ...@@ -1046,7 +1046,7 @@
{%endif%} {%endif%}
</td> </td>
<td> <td>
{%if (now_month_income| float) >=0%} {%if (now_month_income_temp| float) >=0%}
本月收益:<span class="red">{{now_month_income}}元</span> 本月收益:<span class="red">{{now_month_income}}元</span>
{%else%} {%else%}
本月收益:<span class="green">{{now_month_income}}元</span> 本月收益:<span class="green">{{now_month_income}}元</span>
...@@ -1060,7 +1060,7 @@ ...@@ -1060,7 +1060,7 @@
{%endif%} {%endif%}
</td> </td>
<td> <td>
{%if (now_year_income|float)>=0%} {%if (now_year_income_temp|float)>=0%}
今年累计收益:<span class="red">{{now_year_income}}元</span> 今年累计收益:<span class="red">{{now_year_income}}元</span>
{%else%} {%else%}
今年累计收益:<span class="green">{{now_year_income}}元</span> 今年累计收益:<span class="green">{{now_year_income}}元</span>
...@@ -1113,7 +1113,7 @@ ...@@ -1113,7 +1113,7 @@
</td> </td>
<td> <td>
{%if (total_profit|float)>=0%} {%if (total_profit_temp|float)>=0%}
累计盈利:<span class="red">{{total_profit}}元</span> 累计盈利:<span class="red">{{total_profit}}元</span>
{%else%} {%else%}
累计盈利:<span class="green">{{total_profit}}元</span> 累计盈利:<span class="green">{{total_profit}}元</span>
......
...@@ -263,6 +263,8 @@ class DataIntegrate: ...@@ -263,6 +263,8 @@ class DataIntegrate:
'now_withdrawal': self.now_withdrawal, 'index_withdrawal': self.index_withdrawal, 'expected_withdrawal': 20, 'now_withdrawal': self.now_withdrawal, 'index_withdrawal': self.index_withdrawal, 'expected_withdrawal': 20,
'now_year_income': '{:,}'.format(self.now_year_income), 'now_month_income': '{:,}'.format(self.now_month_income), 'now_year_income': '{:,}'.format(self.now_year_income), 'now_month_income': '{:,}'.format(self.now_month_income),
'final_balance': '{:,}'.format(self.final_balance), 'total_profit': '{:,}'.format(self.total_profit), 'final_balance': '{:,}'.format(self.final_balance), 'total_profit': '{:,}'.format(self.total_profit),
'total_profit_temp': self.total_profit,
'now_year_income_temp': self.now_year_income, 'now_month_income_temp': self.now_month_income,
'monthly_return_performance_pic': self.monthly_return_performance_pic, 'monthly_return_performance_pic': self.monthly_return_performance_pic,
'month_rise': self.month_rise, 'year_totoal_rate_of_return': self.year_totoal_rate_of_return, 'month_rise': self.month_rise, 'year_totoal_rate_of_return': self.year_totoal_rate_of_return,
......
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