Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
R
robo-dividend
Project
Project
Details
Activity
Releases
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
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wenwen.tang
robo-dividend
Commits
92b565e1
Commit
92b565e1
authored
Dec 18, 2022
by
jichao
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
回测报告增加基金池
parent
938ef10c
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
62 additions
and
6 deletions
+62
-6
config.yml
config.yml
+4
-3
builder.py
portfolios/builder.py
+43
-1
robo_mpt_portfolios.py
portfolios/dao/robo_mpt_portfolios.py
+13
-0
test_case.py
rebalance/test_case.py
+1
-1
test_case.py
reports/test_case.py
+1
-1
No files found.
config.yml
View file @
92b565e1
...
...
@@ -208,12 +208,13 @@ reports: # 报告模块相关
backtest
:
# 回测导出曹策略
exist-build
:
on
# 如果报告文件存在,是否重新构建文件
save-path
:
${EXPORT_PATH:excels}
# 导出报告文件存放路径,如果以./或者../开头,则会以执行python文件为根目录,如果以/开头,则为系统绝对路径,否则,以项目目录为根目录
file-name
:
${EXPORT_FILENAME:asset-pool}
file-name
:
${EXPORT_FILENAME:asset-pool
-mpt
}
include-report
:
# 需要导出的报告类型列表,下面的顺序,也代表了excel中sheet的顺序
# - navs-report # 净值报告
# - hold-report # 持仓报告
# - signal-report # 信号报告
-
asset-pool-report
# 基金池报告
-
mpt-report
# 最优投组报告
# - benckmark-report # benckmark报告
# - indicators-report # 各种特殊指标报告
# - fixed-range-report # 固定区间收益报告
...
...
@@ -224,8 +225,8 @@ robo-executor: # 执行器相关
backtest
:
# 回测执行器相关
start-date
:
2008-01-02
# 回测起始日期
end-date
:
2022-11-01
# 回测截止日期
start-step
:
1
# 回测从哪一步开始执行 1:计算资产ewma;2:计算资产池;3:计算最优投组:4:计算再平衡信号以及持仓投组
end-step
:
2
# 回测从哪一步执行完成后结束执行 1:计算资产ewma;2:计算资产池;3:计算最优投组:4:计算再平衡信号以及持仓投组
start-step
:
4
# 回测从哪一步开始执行 1:计算资产ewma;2:计算资产池;3:计算最优投组:4:计算再平衡信号以及持仓投组
end-step
:
4
# 回测从哪一步执行完成后结束执行 1:计算资产ewma;2:计算资产池;3:计算最优投组:4:计算再平衡信号以及持仓投组
clean-up
:
on
real
:
# 实盘执行器
start-date
:
2022-11-01
# 实盘开始时间
...
...
portfolios/builder.py
View file @
92b565e1
import
json
import
logging
from
datetime
import
datetime
as
dt
from
typing
import
List
from
py_jftech
import
component
,
autowired
,
format_date
from
pymysql
import
IntegrityError
,
constants
from
api
import
PortfoliosBuilder
,
PortfoliosRisk
,
AssetPool
,
Navs
,
PortfoliosType
,
Datum
,
SolveType
,
SolverFactory
from
api
import
PortfoliosBuilder
,
PortfoliosRisk
,
AssetPool
,
Navs
,
PortfoliosType
,
Datum
,
SolveType
,
SolverFactory
,
RoboReportor
,
DatumType
from
portfolios.dao
import
robo_mpt_portfolios
as
rmp
logger
=
logging
.
getLogger
(
__name__
)
...
...
@@ -106,3 +108,43 @@ class PoemPortfoliosBuilder(MptPortfoliosBuilder):
}
detail
[
risk
][
'mpt_cvar'
]
=
mpt_cvar
return
result
,
detail
@
component
(
bean_name
=
'mpt-report'
)
class
MptReportor
(
RoboReportor
):
@
autowired
def
__init__
(
self
,
datum
:
Datum
=
None
):
self
.
_datum
=
datum
@
property
def
report_name
(
self
)
->
str
:
return
'最优投组'
def
load_report
(
self
,
max_date
=
dt
.
today
(),
min_date
=
None
)
->
List
[
dict
]:
results
=
[]
datums
=
{
x
[
'id'
]:
x
for
x
in
self
.
_datum
.
get_datums
(
type
=
DatumType
.
FUND
)}
for
portfolio
in
rmp
.
get_list
(
max_date
=
max_date
,
min_date
=
min_date
):
solve_type
=
SolveType
(
portfolio
[
'solve'
])
datas
=
{
'date'
:
portfolio
[
'date'
],
'risk'
:
PortfoliosRisk
(
portfolio
[
'risk'
])
.
name
,
'type'
:
PortfoliosType
(
portfolio
[
'type'
])
.
name
,
'solve'
:
solve_type
.
name
,
'cvar'
:
portfolio
[
'cvar'
]
}
if
solve_type
is
not
SolveType
.
INFEASIBLE
:
for
asset_id
,
weight
in
json
.
loads
(
portfolio
[
'portfolio'
])
.
items
():
datum
=
datums
[
int
(
asset_id
)]
results
.
append
({
**
datas
,
'ft_ticker'
:
datum
[
'ftTicker'
],
'lipper_id'
:
datum
[
'lipperKey'
],
'bloomberg_ticker'
:
datum
[
'bloombergTicker'
],
'name'
:
datum
[
'chineseName'
],
'weight'
:
weight
,
})
else
:
results
.
append
(
datas
)
return
results
portfolios/dao/robo_mpt_portfolios.py
View file @
92b565e1
...
...
@@ -37,3 +37,16 @@ def get_one(day, type: PortfoliosType, risk: PortfoliosRisk):
select {','.join([f"{x[0]} as {x[1]}" for x in __COLUMNS__.items()])} from robo_mpt_portfolios
{where(rmp_date=day, rmp_risk=risk, rmp_type=type)}
'''
@
read
def
get_list
(
max_date
=
None
,
min_date
=
None
,
type
:
PortfoliosType
=
None
,
risk
:
PortfoliosRisk
=
None
):
sqls
=
[]
if
max_date
:
sqls
.
append
(
f
"rmp_date <= '{format_date(max_date)}'"
)
if
min_date
:
sqls
.
append
(
f
"rmp_date >= '{format_date(min_date)}'"
)
return
f
'''
select {','.join([f"{x[0]} as {x[1]}" for x in __COLUMNS__.items()])} from robo_mpt_portfolios
{where(*sqls, rmp_risk=risk, rmp_type=type)}
'''
rebalance/test_case.py
View file @
92b565e1
...
...
@@ -23,7 +23,7 @@ class RebalanceTest(unittest.TestCase):
@
autowired
(
names
=
{
'builder'
:
'crisis_two'
})
def
test_crisis_two
(
self
,
builder
:
RebalanceSignal
=
None
):
start
=
parse_date
(
'20
18-07-06
'
)
start
=
parse_date
(
'20
08-01-02
'
)
end
=
start
+
relativedelta
(
years
=
3
)
while
start
<
end
:
signal
=
builder
.
is_trigger
(
start
,
PortfoliosRisk
.
FT9
)
...
...
reports/test_case.py
View file @
92b565e1
...
...
@@ -31,7 +31,7 @@ class ReportTest(unittest.TestCase):
@
autowired
(
names
=
{
'reportor'
:
'backtest-export'
})
def
test_backtest_export
(
self
,
exportor
:
RoboExportor
=
None
):
path
=
exportor
.
export
(
max_date
=
parse_date
(
'2022-
06
-01'
))
path
=
exportor
.
export
(
max_date
=
parse_date
(
'2022-
11
-01'
))
logger
.
info
(
path
)
...
...
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