Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Sign in
Toggle navigation
F
fund_report
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
彭熊
fund_report
Commits
66be88e5
Commit
66be88e5
authored
Nov 26, 2020
by
赵杰
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
综合数据,分组数据隔离重构
parent
3566b0cb
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
199 additions
and
30 deletions
+199
-30
data_service.py
app/service/data_service.py
+61
-2
result_service.py
app/service/result_service.py
+138
-28
No files found.
app/service/data_service.py
View file @
66be88e5
...
...
@@ -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
app/service/result_service.py
View file @
66be88e5
...
...
@@ -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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment