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
1cf3fd20
Commit
1cf3fd20
authored
Dec 02, 2020
by
李宗熹
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'dev' of
http://47.100.44.39:10001/pengxiong/fund_report
into dev
parents
39279e4f
75230ea3
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
103 additions
and
4050 deletions
+103
-4050
monthReport.html
app/html/monthReport.html
+0
-4037
portfolio_diagnose.py
app/service/portfolio_diagnose.py
+103
-13
No files found.
app/html/monthReport.html
deleted
100644 → 0
View file @
39279e4f
This source diff could not be displayed because it is too large. You can
view the blob
instead.
app/service/portfolio_diagnose.py
View file @
1cf3fd20
...
...
@@ -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
):
...
...
@@ -494,20 +495,109 @@ 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
=
[[
"优秀"
,
"良好"
,
"一般"
],
[
"优秀"
,
"良好"
,
"合格"
,
"较差"
]]
data
=
[
start_year
,
start_month
,
past_month
,
self
.
invest_amount
,
current_year
,
current_month
,
current_day
]
return
data
z_score_evaluate
=
evaluate_enum
[
0
][
z_score_level
]
drawdown_evaluate
=
evaluate_enum
[
1
][
drawdown_level
]
if
z_score_evaluate
in
[
"优秀"
,
"良好"
]:
z_score_evaluate
=
"""<span class="self_description_red">{}</span>"""
.
format
(
z_score_evaluate
)
else
:
z_score_evaluate
=
"""<span class="self_description_green">{}</span>"""
.
format
(
z_score_evaluate
)
if
drawdown_evaluate
in
[
"优秀"
,
"良好"
]:
drawdown_evaluate
=
"""<span class="self_description_red">{}</span>"""
.
format
(
drawdown_evaluate
)
else
:
drawdown_evaluate
=
"""<span class="self_description_green">{}</span>"""
.
format
(
drawdown_evaluate
)
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
():
ret
.
append
(
sentence
[
k
]
.
format
(
*
data
[
k
])
.
replace
(
",;"
,
";"
))
return
ret
def
new_evaluation
(
self
):
hold_fund
=
set
(
self
.
portfolio
)
-
set
(
self
.
abandon_fund
)
...
...
@@ -657,10 +747,10 @@ portfolio = ['HF00002JJ2', 'HF00005DBQ', 'HF0000681Q', 'HF00006693', 'HF00006AZF
portfolio_diagnose
=
PortfolioDiagnose
(
client_type
=
1
,
portfolio
=
portfolio
,
invest_amount
=
10000000
)
portfolio_diagnose
.
optimize
()
if
__name__
==
'__main__'
:
#
print(portfolio_diagnose.single_fund_radar())
print
(
portfolio_diagnose
.
single_fund_radar
())
# print(portfolio_diagnose.propose_fund_radar())
# print(portfolio_diagnose.old_portfolio_evaluation())
print
(
'旧组合相关性:'
,
portfolio_diagnose
.
old_correlation
)
print
(
'新组合相关性:'
,
portfolio_diagnose
.
new_correlation
)
print
(
'旧组合个基评价:'
,
portfolio_diagnose
.
old_portfolio_evaluation
())
print
(
'新组合个基评价:'
,
portfolio_diagnose
.
propose_fund_evaluation
())
#
print('旧组合相关性:', portfolio_diagnose.old_correlation)
#
print('新组合相关性:', portfolio_diagnose.new_correlation)
#
print('旧组合个基评价:', portfolio_diagnose.old_portfolio_evaluation())
#
print('新组合个基评价:', portfolio_diagnose.propose_fund_evaluation())
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