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
ee38ad4d
Commit
ee38ad4d
authored
Dec 02, 2020
by
pengxiong@wealthgrow.cn
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'dev' of
http://47.100.44.39:10001/pengxiong/fund_report
into dev
parents
feef4557
eb5e56e4
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
93 additions
and
10 deletions
+93
-10
data_service.py
app/service/data_service.py
+2
-2
portfolio_diagnose.py
app/service/portfolio_diagnose.py
+91
-8
No files found.
app/service/data_service.py
View file @
ee38ad4d
...
...
@@ -34,10 +34,10 @@ class UserCustomerDataAdaptor:
p_end_date
=
pd
.
to_datetime
(
end_date
)
.
date
()
p_end_date
=
datetime
.
date
(
year
=
p_end_date
.
year
,
month
=
p_end_date
.
month
,
day
=
1
)
-
datetime
.
timedelta
(
days
=
1
)
self
.
end_date
=
pd
.
to_datetime
(
str
(
p_end_date
))
self
.
end_date
=
pd
.
to_datetime
(
"2020-11-23"
)
#
self.end_date = pd.to_datetime("2020-11-23")
p_start_date
=
datetime
.
date
(
year
=
p_end_date
.
year
,
month
=
p_end_date
.
month
,
day
=
1
)
self
.
month_start_date
=
p_start_date
self
.
month_start_date
=
pd
.
to_datetime
(
"2020-11-16"
)
#
self.month_start_date = pd.to_datetime("2020-11-16")
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
.
index_df
=
self
.
get_customer_index_nav_data
()
...
...
app/service/portfolio_diagnose.py
View file @
ee38ad4d
...
...
@@ -3,6 +3,7 @@ from app.utils.risk_parity import *
from
app.pypfopt
import
risk_models
from
app.pypfopt
import
expected_returns
from
app.pypfopt
import
EfficientFrontier
from
app.utils.week_evaluation
import
*
def
cal_correlation
(
prod
):
...
...
@@ -486,20 +487,102 @@ class PortfolioDiagnose(object):
propose_fund_return
.
to_csv
(
'new_port.csv'
,
encoding
=
'gbk'
)
return
index_return
,
propose_fund_return
def
old_evaluation
(
self
):
start_year
=
self
.
start_date
.
year
start_month
=
self
.
start_date
.
month
def
old_evaluation
(
self
,
group_name
,
group_result
,
data_adaptor
):
start_year
=
data_adaptor
.
start_date
.
year
start_month
=
data_adaptor
.
start_date
.
month
current_year
=
datetime
.
datetime
.
now
()
.
year
current_month
=
datetime
.
datetime
.
now
()
.
month
current_day
=
datetime
.
datetime
.
now
()
.
day
past_month
=
(
current_year
-
start_year
)
*
12
+
current_month
-
start_month
# 投入成本(万元)
input_cost
=
round
(
group_result
[
group_name
][
"total_cost"
]
/
10000
,
2
)
# 整体盈利(万元)
total_profit
=
round
(
group_result
[
group_name
][
"cumulative_profit"
]
/
10000
,
2
)
# 整体表现 回撤能力
fund_rank_data
=
fund_rank
[
fund_rank
[
"fund_id"
]
.
isin
(
self
.
portfolio
)]
z_score
=
fund_rank_data
[
"z_score"
]
.
mean
()
drawdown_rank
=
fund_rank_data
[
"max_drawdown_rank"
]
.
mean
()
return_rank_df
=
fund_rank_data
[
"annual_return_rank"
]
z_score_level
=
np
.
select
([
z_score
>=
80
,
70
<=
z_score
<
80
,
z_score
<
70
],
[
0
,
1
,
2
])
.
item
()
drawdown_level
=
np
.
select
([
drawdown_rank
>=
0.8
,
0.7
<=
drawdown_rank
<
0.8
,
0.6
<=
drawdown_rank
<
0.7
,
drawdown_rank
<
0.6
],
[
0
,
1
,
2
,
3
])
.
item
()
# 收益稳健
fund_rank_re
=
fund_rank_data
[
fund_rank_data
[
"annual_return_rank"
]
>
0.8
]
return_rank_evaluate
=
""
if
len
(
fund_rank_re
)
>
0
:
num
=
len
(
fund_rank_re
)
fund_id_rank_list
=
list
(
fund_rank_re
[
"fund_id"
])
for
f_id
in
fund_id_rank_list
:
name
=
data_adaptor
.
user_customer_order_df
[
data_adaptor
.
user_customer_order_df
[
"fund_id"
]
==
f_id
][
"fund_name"
]
.
values
[
0
]
return_rank_evaluate
=
return_rank_evaluate
+
name
+
"、"
return_rank_evaluate
=
return_rank_evaluate
[:
-
1
]
+
"等"
+
str
(
num
)
+
"只产品稳健,对组合的收益率贡献明显,"
# 正收益基金数量
group_hold_data
=
pd
.
DataFrame
(
group_result
[
group_name
][
"group_hoding_info"
])
profit_positive_num
=
group_hold_data
[
group_hold_data
[
"profit"
]
>
0
][
"profit"
]
.
count
()
if
profit_positive_num
>
0
:
profit_positive_evaluate
=
str
(
profit_positive_num
)
+
"只基金取的正收益,"
else
:
profit_positive_evaluate
=
""
# 综合得分较低数量
abandon_num
=
len
(
self
.
abandon_fund_score
)
abandon_evaluate
=
str
(
abandon_num
)
+
"只基金综合得分较低建议更换,"
# 成立时间短
if
len
(
self
.
no_data_fund
)
>
0
:
no_data_fund_evaluate
=
str
(
len
(
self
.
no_data_fund
))
+
"只基金因为成立时间较短,暂不做评价;"
else
:
no_data_fund_evaluate
=
";"
group_order_df
=
data_adaptor
.
user_customer_order_df
[
data_adaptor
.
user_customer_order_df
[
"folio_name"
]
==
group_name
]
strategy_list
=
group_order_df
[
"substrategy"
]
uniqe_strategy
=
list
(
strategy_list
.
unique
())
uniqe_strategy_name
=
[
dict_substrategy
[
int
(
x
)]
+
"、"
for
x
in
uniqe_strategy
]
# 覆盖的基金名称
strategy_name_evaluate
=
""
.
join
(
uniqe_strategy_name
)[:
-
1
]
if
len
(
uniqe_strategy
)
/
float
(
len
(
strategy_list
))
>
0.6
:
strategy_distribution_evaluate
=
"策略上有一定分散"
else
:
strategy_distribution_evaluate
=
"策略分散程度不高"
# 相关性
if
len
(
self
.
abandon_fund_corr
)
>
0
:
fund_corr_name
=
[
str
(
group_order_df
[
group_order_df
[
"fund_id"
]
==
f_id
][
"fund_name"
]
.
values
[
0
])
+
"和"
for
f_id
in
self
.
abandon_fund_corr
]
fund_corr_evaluate
=
""
.
join
(
fund_corr_name
)[:
-
1
]
+
"相关性较高,建议调整组合配比;"
else
:
fund_corr_evaluate
=
";"
num_fund
=
len
(
self
.
portfolio
)
abandon_fund
=
[[
x
,
self
.
invest_type
]
for
x
in
self
.
abandon_fund_score
+
self
.
abandon_fund_corr
]
old_strategy
=
set
([
search_rank
(
fund_rank
,
x
,
metric
=
'substrategy'
)
for
x
in
self
.
portfolio
])
evaluate_enum
=
[[
"优秀"
,
"良好"
,
"一般"
],
[
"优秀"
,
"良好"
,
"合格"
,
"较差"
]]
z_score_evaluate
=
evaluate_enum
[
0
][
z_score_level
]
drawdown_evaluate
=
evaluate_enum
[
1
][
drawdown_level
]
# return_evaluate = evaluate_enum[1][return_level]
data
=
[
start_year
,
start_month
,
past_month
,
self
.
invest_amount
,
current_year
,
current_month
,
current_day
]
return
data
sentence
=
{
1
:
"1、组合构建于{}年{}月,至今已运行{}个月。投入成本为{}万元,截止{}年{}月{}日,整体盈利{}万元,整体表现{},回撤控制能力{};
\n
"
,
2
:
"2、组合共持有{}只基金,{}{}{}{}
\n
"
,
3
:
"3、策略角度来看,组合涵盖了{}, {}{}
\n
"
}
data
=
{
1
:
[
start_year
,
start_month
,
past_month
,
input_cost
,
current_year
,
current_month
,
current_day
,
total_profit
,
z_score_evaluate
,
drawdown_evaluate
],
2
:
[
num_fund
,
return_rank_evaluate
,
profit_positive_evaluate
,
abandon_evaluate
,
no_data_fund_evaluate
],
3
:
[
strategy_name_evaluate
,
strategy_distribution_evaluate
,
fund_corr_evaluate
]
}
ret
=
""
for
k
,
v
in
data
.
items
():
# print(translate_single(content[k], v))
ret
=
ret
+
sentence
[
k
]
.
format
(
*
data
[
k
])
ret
.
replace
(
",;"
,
";"
)
return
ret
def
new_evaluation
(
self
):
hold_fund
=
set
(
self
.
portfolio
)
-
set
(
self
.
abandon_fund
)
...
...
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