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
a83eb3ad
Commit
a83eb3ad
authored
Feb 15, 2023
by
jichao
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
定版
parent
a5e8402b
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
40 additions
and
16 deletions
+40
-16
config.yml
config.yml
+8
-2
test_case.py
portfolios/test_case.py
+4
-0
ruler.py
rebalance/ruler.py
+2
-1
test_case.py
rebalance/test_case.py
+4
-0
robo_executor.py
robo_executor.py
+22
-13
No files found.
config.yml
View file @
a83eb3ad
...
...
@@ -224,7 +224,7 @@ reports: # 报告模块相关
-
fixed-range-report
# 固定区间收益报告
-
relative-range-report
# 相对区间收益报告
robo-executor
:
# 执行器相关
use
:
${ROBO_EXECUTOR:
backtest
}
# 执行哪个执行器,优先取系统环境变量ROBO_EXECUTOR的值,默认backtest
use
:
${ROBO_EXECUTOR:
real
}
# 执行哪个执行器,优先取系统环境变量ROBO_EXECUTOR的值,默认backtest
sync-data
:
${SYNC_DATA:off}
# 是否开启同步资料数据
backtest
:
# 回测执行器相关
start-date
:
2008-01-02
# 回测起始日期
...
...
@@ -233,7 +233,13 @@ robo-executor: # 执行器相关
end-step
:
${BACKTEST_END_STEP:4}
# 回测从哪一步执行完成后结束执行 1:计算资产ewma;2:计算资产池;3:计算最优投组:4:计算再平衡信号以及持仓投组
clean-up
:
on
real
:
# 实盘执行器
start-date
:
2022-11-01
# 实盘开始时间
start-date
:
2008-01-02
# 实盘开始时间
include-date
:
-
2023-02-18
-
2023-03-25
-
2023-06-17
-
2023-09-23
-
2008-01-05
...
...
portfolios/test_case.py
View file @
a83eb3ad
...
...
@@ -36,6 +36,10 @@ class PortfoliosTest(unittest.TestCase):
report
=
reportor
.
load_report
()
self
.
logger
.
info
(
to_str
(
report
))
@
autowired
(
names
=
{
'hold'
:
'next-re'
})
def
test_clear
(
self
,
hold
:
PortfoliosHolder
=
None
):
hold
.
clear
()
if
__name__
==
'__main__'
:
unittest
.
main
()
rebalance/ruler.py
View file @
a83eb3ad
...
...
@@ -56,7 +56,8 @@ class LevelRebalanceRuler(RebalanceRuler):
last_signal
=
rrs
.
get_last_one
(
max_date
=
day
,
risk
=
risk
)
start
=
next_workday
(
last_signal
[
'date'
])
signals
=
{}
signals
=
rrs
.
get_list
(
min_date
=
last_re
[
'date'
],
risk
=
risk
,
effective
=
False
)
signals
=
{
SignalType
(
x
[
'type'
]):
x
for
x
in
signals
if
SignalType
(
x
[
'type'
])
is
not
SignalType
.
NONE
and
SignalType
(
x
[
'type'
])
.
level
>
SignalType
(
last_re
[
'type'
])
.
level
}
while
start
<=
day
:
# 检查风控信号
today_signals
=
{
x
.
signal_type
:
x
.
get_signal
(
start
,
risk
)
for
x
in
risk_signals
if
x
.
signal_type
.
level
<=
SignalType
(
last_re
[
'type'
])
.
level
}
...
...
rebalance/test_case.py
View file @
a83eb3ad
...
...
@@ -54,6 +54,10 @@ class RebalanceTest(unittest.TestCase):
result
=
reportor
.
load_report
()
logger
.
info
(
to_str
(
result
,
show_line
=
10
))
@
autowired
def
test_clear_signal
(
self
,
ruler
:
RebalanceRuler
=
None
):
ruler
.
clear_signal
()
if
__name__
==
'__main__'
:
unittest
.
main
()
robo_executor.py
View file @
a83eb3ad
...
...
@@ -9,7 +9,7 @@ from typing import List
import
pandas
as
pd
from
py_jftech
import
(
component
,
autowired
,
get_config
,
filter_weekend
,
asynchronized
,
workday_range
,
format_date
,
prev_workday
,
parse_date
workday_range
,
format_date
,
prev_workday
,
parse_date
,
is_workday
)
from
api
import
(
...
...
@@ -141,10 +141,11 @@ class BacktestExecutor(RoboExecutor):
class
RealExecutor
(
RoboExecutor
):
@
autowired
def
__init__
(
self
,
builder
:
PortfoliosBuilder
=
None
,
hold
:
PortfoliosHolder
=
None
,
syncs
:
List
[
DataSync
]
=
None
,
):
def
__init__
(
self
,
builder
:
PortfoliosBuilder
=
None
,
hold
:
PortfoliosHolder
=
None
,
syncs
:
List
[
DataSync
]
=
None
,
ruler
:
RebalanceRuler
=
None
):
self
.
_builder
=
builder
self
.
_hold
=
hold
self
.
_syncs
=
syncs
self
.
_ruler
=
ruler
self
.
_config
=
get_config
(
__name__
)[
'real'
]
@
property
...
...
@@ -164,19 +165,27 @@ class RealExecutor(RoboExecutor):
logger
.
warning
(
f
'get curt date from argv failure.'
,
e
)
return
dt
.
combine
(
dt
.
today
()
.
date
(),
dt
.
min
.
time
())
@
property
def
include_date
(
self
):
return
[
dt
.
combine
(
x
,
dt
.
min
.
time
())
for
x
in
self
.
_config
[
'include-date'
]]
def
start_exec
(
self
):
if
self
.
is_sync_data
:
for
sync
in
self
.
_syncs
:
sync
.
do_sync
()
date
=
self
.
curt_date
for
date
in
pd
.
date_range
(
start
=
'2008-01-17'
,
end
=
'2008-01-20'
):
if
is_workday
(
date
)
or
date
in
self
.
include_date
:
date
=
prev_workday
(
date
)
for
risk
in
PortfoliosRisk
:
logger
.
info
(
f
"start to build risk[{risk.name}] real for date[{format_date(date)}]"
.
center
(
50
,
'-'
))
now
=
dt
.
now
()
# 因为每天都必须有NORMAL最优投组,不管用不用
self
.
_builder
.
get_portfolios
(
prev_workday
(
date
)
,
risk
)
self
.
_builder
.
get_portfolios
(
date
,
risk
)
self
.
_hold
.
build_hold_portfolio
(
date
,
risk
)
self
.
_ruler
.
take_next_signal
(
date
,
risk
)
# 如果当前持仓为风控投组,则还要计算风控投组,不管用不用
p_type
=
self
.
_hold
.
get_portfolio_type
(
date
,
risk
)
if
p_type
is
not
PortfoliosType
.
NORMAL
:
self
.
_builder
.
get_portfolios
(
prev_workday
(
date
),
p_type
)
self
.
_builder
.
get_portfolios
(
date
,
risk
,
type
=
p_type
)
logger
.
info
(
f
"build risk[{risk.name}] real for date[{format_date(date)}] success, use[{(dt.now() - now).seconds}s]"
)
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