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
cf56ccc4
Commit
cf56ccc4
authored
Dec 04, 2023
by
wenwen.tang
😕
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
调仓日可指定任意日期
parent
18c7d36d
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
32 additions
and
22 deletions
+32
-22
config-svrobo5.yml
config-svrobo5.yml
+1
-0
config-svrobo6.yml
config-svrobo6.yml
+11
-10
holder.py
portfolios/holder.py
+7
-6
base_signal.py
rebalance/base_signal.py
+8
-2
robo_executor.py
robo_executor.py
+5
-4
No files found.
config-svrobo5.yml
View file @
cf56ccc4
...
...
@@ -86,6 +86,7 @@ portfolios: # 投组模块
dividend-date
:
15
#配息日,每月15号
dividend-adjust-day
:
[
1
,
4
,
7
,
10
]
#每年的首个季度调整配息
warehouse-frequency
:
1
#每隔1个月调一次仓
warehouse-transfer-date
:
1
#调仓日
solver
:
# 解算器相关
tol
:
1E-10
# 误差满足条件
navs
:
# 净值要求
...
...
config-svrobo6.yml
View file @
cf56ccc4
...
...
@@ -51,7 +51,7 @@ py-jftech:
max-workers
:
${MAX_PROCESS:4}
basic
:
# 基础信息模块
sync
:
start-date
:
1990-01-01
# 同步数据开始日期
start-date
:
2018-08-26
# 同步数据开始日期
datum
:
# 资料模块
change
:
date
:
${DATUM_CHANGE_DATE}
...
...
@@ -85,11 +85,12 @@ portfolios: # 投组模块
dividend-date
:
15
#配息日,每月15号
dividend-adjust-day
:
[
1
,
4
,
7
,
10
]
#每年的首个季度调整配息
warehouse-frequency
:
1
#每隔1个月调一次仓
warehouse-transfer-date
:
1
#调仓日
redeem-list
:
[
'
TEUSAAU
LX
Equity'
,
'
LIGTRAA
ID
Equity'
,
'
TEMFHAC
LX
Equity'
,
'
LUSHUAA
ID
Equity'
]
#从持仓中的低风险资产“直接”按序赎回
solver
:
# 解算器相关
model
:
arc
# 结算模型 ARC ,PRR, ~ 标准解算器
model
:
prr
# 结算模型 ARC ,PRR, ~ 标准解算器
arc
:
on
#是否开启ARC
brr
:
0.0
1
#误差补偿值
brr
:
0.0
2
#误差补偿值
trr
:
3
tol
:
1E-10
# 误差满足条件
navs
:
# 净值要求
...
...
@@ -98,9 +99,9 @@ portfolios: # 投组模块
max-nan
:
# 最大缺失净值条件
asset
:
8
# 单一资产最多缺少多少交易日数据,则踢出资产池
day
:
0.5
# 单一交易日最多缺少百分之多少净值,则删除该交易日
risk
:
[]
# 资产风险等级要求,可分开写也可以合并写,e.g. risk:[ 2, 3 ] 则表示 所有投组资产风险等级都是 2 或 3
LARC
:
[
0.5
,
0.1
,
0.1
,
0.1
]
#低阈值
UARC
:
[
0.7
,
0.25
,
0.25
,
0.25
]
#高阈值
risk
:
[
]
# 资产风险等级要求,可分开写也可以合并写,e.g. risk:[ 2, 3 ] 则表示 所有投组资产风险等级都是 2 或 3
LARC
:
[
0.30
,
0.00
,
0.00
]
#低阈值
UARC
:
[
0.70
,
0.70
,
0.70
]
#高阈值
matrix-rtn-days
:
20
# 计算回报率矩阵时,回报率滚动天数
asset-count
:
[
5
,
5
]
# 投组资产个数。e.g. count 或 [min, max] 分别表示 最大最小都为count 或 最小为min 最大为max,另外这里也可以类似上面给不同风险等级分别配置
mpt
:
# mpt计算相关
...
...
@@ -234,12 +235,12 @@ robo-executor: # 执行器相关
use
:
${ROBO_EXECUTOR:backtest}
# 执行哪个执行器,优先取系统环境变量ROBO_EXECUTOR的值,默认backtest
sync-data
:
${SYNC_DATA:off}
# 是否开启同步资料数据
backtest
:
# 回测执行器相关
start-date
:
20
22-02-1
6
# 回测起始日期
end-date
:
20
23-01-0
3
# 回测截止日期
start-date
:
20
18-11-2
6
# 回测起始日期
end-date
:
20
19-01-1
3
# 回测截止日期
sealing-period
:
10
#调仓封闭期
start-step
:
${BACKTEST_START_STEP:
3
}
# 回测从哪一步开始执行 1:计算资产池;2:计算最优投组:3:计算再平衡信号以及持仓投组
start-step
:
${BACKTEST_START_STEP:
1
}
# 回测从哪一步开始执行 1:计算资产池;2:计算最优投组:3:计算再平衡信号以及持仓投组
end-step
:
${BACKTEST_END_STEP:3}
# 回测从哪一步执行完成后结束执行 1:计算资产池;2:计算最优投组:3:计算再平衡信号以及持仓投组
clean-up
:
o
n
clean-up
:
o
ff
real
:
# 实盘执行器
export
:
${EXPORT_ENABLE:off}
# 是否开启报告
start-date
:
2023-05-08
# 实盘开始时间
...
...
portfolios/holder.py
View file @
cf56ccc4
...
...
@@ -266,7 +266,7 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder):
# 若调仓当日,有基金产生配息
share_nav
=
{
x
:
fund_nav
*
w
/
navs
[
x
]
for
x
,
w
in
weight
.
items
()}
share_nodiv_nav
=
{
x
:
nav
*
w
/
nav_cals
[
x
]
for
x
,
w
in
weight
.
items
()}
if
self
.
is_
first
_workday
(
day
):
if
self
.
is_
transfer
_workday
(
day
):
div_forecast
=
asset_nav
*
self
.
month_dividend
else
:
fund_av
=
self
.
init_nav
...
...
@@ -311,10 +311,11 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder):
'asset_nav'
:
asset_nav
,
})
def
is_first_workday
(
self
,
day
):
# 获取当月第一天的日期
first_day
=
date
(
day
.
year
,
day
.
month
,
1
)
first_work_day
=
first_day
if
is_workday
(
first_day
)
else
next_workday
(
first_day
)
def
is_transfer_workday
(
self
,
day
):
transfer_date
=
self
.
_config
[
'warehouse-transfer-date'
]
# 获取当月第n天的日期
transfer_date
=
date
(
day
.
year
,
day
.
month
,
transfer_date
)
first_work_day
=
transfer_date
if
is_workday
(
transfer_date
)
else
next_workday
(
transfer_date
)
return
day
.
day
==
first_work_day
.
day
def
no_rebalance
(
self
,
day
,
risk
:
PortfoliosRisk
,
last_nav
):
...
...
@@ -352,7 +353,7 @@ class InvTrustPortfoliosHolder(DividendPortfoliosHolder):
weight_nodiv_nav
=
format_weight
(
weight_nodiv_nav
)
asset_nav
=
fund_av
div_forecast
=
last_nav
[
'div_forecast'
]
if
self
.
is_
first
_workday
(
day
):
if
self
.
is_
transfer
_workday
(
day
):
div_forecast
=
asset_nav
*
self
.
month_dividend
rhp
.
insert
({
'date'
:
day
,
...
...
rebalance/base_signal.py
View file @
cf56ccc4
...
...
@@ -6,7 +6,7 @@ from functools import reduce
from
typing
import
List
import
pandas
as
pd
from
py_jftech
import
component
,
autowired
,
get_config
,
prev_workday
from
py_jftech
import
component
,
autowired
,
get_config
,
prev_workday
,
workday_range
from
py_jftech
import
is_workday
from
api
import
PortfoliosBuilder
...
...
@@ -48,7 +48,13 @@ class BaseRebalanceSignal(RebalanceSignal, ABC):
signal
=
rrs
.
get_last_one
(
day
,
risk
,
SignalType
.
NORMAL
,
effective
=
None
)
if
signal
:
frequency
=
get_config
(
'portfolios'
)[
'holder'
][
'warehouse-frequency'
]
date
=
pd
.
to_datetime
(
day
.
replace
(
day
=
1
))
+
pd
.
DateOffset
(
months
=
frequency
)
transfer_date
=
get_config
(
'portfolios'
)[
'holder'
][
'warehouse-transfer-date'
]
date
=
pd
.
to_datetime
(
signal
[
'date'
]
.
replace
(
day
=
transfer_date
))
# 说明发生了跨月份问题
if
signal
[
'date'
]
.
day
>
transfer_date
:
if
rrs
.
get_count
(
risk
=
PortfoliosRisk
.
FT3
,
effective
=
True
)
>
1
:
date
=
date
+
pd
.
DateOffset
(
months
=
1
)
date
=
date
+
pd
.
DateOffset
(
months
=
frequency
)
date
=
date
-
timedelta
(
days
=
1
)
# 指定周期末的工作日
date
=
date
if
is_workday
(
date
)
else
prev_workday
(
date
)
...
...
robo_executor.py
View file @
cf56ccc4
...
...
@@ -37,12 +37,13 @@ class BacktestExecutor(RoboExecutor):
@
staticmethod
def
get_last_business_day
(
start_date
,
end_date
):
start_date
=
prev_workday
(
start_date
)
transfer_date
=
get_config
(
'portfolios'
)[
'holder'
][
'warehouse-transfer-date'
]
# 生成日期范围并转换为DataFrame
dates
=
pd
.
date_range
(
start_date
,
end_date
,
freq
=
'M'
)
if
dates
[
0
]
!=
start_date
:
dates
=
dates
.
insert
(
0
,
start_date
)
dates
=
pd
.
date_range
(
start_date
,
end_date
,
freq
=
'M
S'
,
closed
=
'right
'
)
dates
=
[
pd
.
to_datetime
(
f
"{date.year}-{date.month}-{transfer_date}"
)
for
date
in
dates
]
dates
.
insert
(
0
,
start_date
)
df
=
pd
.
DataFrame
({
'dates'
:
dates
})
df
[
'dates'
]
=
df
[
'dates'
]
.
apply
(
lambda
x
:
prev_workday
(
x
))
result
=
[]
for
i
in
range
(
0
,
len
(
df
),
get_config
(
'portfolios'
)[
'holder'
][
'warehouse-frequency'
]):
result
.
append
(
df
.
iloc
[
i
][
'dates'
])
...
...
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