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
59181600
Commit
59181600
authored
Jan 28, 2023
by
jichao
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
定版
parent
a63e7233
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
7 additions
and
69 deletions
+7
-69
config.yml
config.yml
+5
-7
crisis_signal.py
rebalance/signals/crisis_signal.py
+0
-34
curve_drift.py
rebalance/signals/curve_drift.py
+2
-28
No files found.
config.yml
View file @
59181600
...
...
@@ -38,10 +38,6 @@ py-jftech:
injectable
:
types
:
api.PortfoliosBuilder
:
portfolios.builder.PoemPortfoliosBuilder
names
:
crisis_one
:
rebalance.signals.crisis_signal.LastRateCrisisOneSignal
curve-drift
:
rebalance.signals.curve_drift.Max120tCurveDrift
# curve-drift: rebalance.signals.curve_drift.AbsCurveDrift
email
:
server
:
smtphz.qiye.163.com
user
:
jft-ra@thizgroup.com
...
...
@@ -148,7 +144,6 @@ rebalance: # 再平衡模块
inversion-threshold
:
0.3
# 利率倒挂触发阀值
crisis-1
:
# 危机1相关
mean-count
:
850
# spx去多少交易日计算平均值
consecut-days
:
5
# spx连续多少天跌破平均值则触发
threshold
:
-0.05
# spx计算后跌破阀值
crisis-2
:
# 危机2相关
negative-growth
:
1
# 实际利率负增长时长,单位年,点到点取值
...
...
@@ -160,7 +155,10 @@ rebalance: # 再平衡模块
coef
:
0.95
# 计算cvar的系数
cvar-min-volume
:
30
# 计算cvar至少需要多少交易日数据
high-low-buy
:
# 高低买入相关
threshold
:
[
0.5
,
0.8
]
# [ 低买入阀值,高买入阀值 ]
threshold
:
# [ 低买入阀值,高买入阀值 ]
ft3
:
[
0.5
,
0.8
]
ft6
:
[
0.55
,
0.8
]
ft9
:
[
0.55
,
0.8
]
reports
:
# 报告模块相关
navs
:
type
:
FUND
...
...
@@ -213,7 +211,7 @@ reports: # 报告模块相关
backtest
:
# 回测导出曹策略
exist-build
:
on
# 如果报告文件存在,是否重新构建文件
save-path
:
${EXPORT_PATH:excels}
# 导出报告文件存放路径,如果以./或者../开头,则会以执行python文件为根目录,如果以/开头,则为系统绝对路径,否则,以项目目录为根目录
file-name
:
${EXPORT_FILENAME:132
2
}
file-name
:
${EXPORT_FILENAME:132
3
}
include-report
:
# 需要导出的报告类型列表,下面的顺序,也代表了excel中sheet的顺序
# - funds-report # 基金资料
# - navs-report # 净值报告
...
...
rebalance/signals/crisis_signal.py
View file @
59181600
...
...
@@ -64,40 +64,6 @@ class CrisisSignal(BaseRebalanceSignal, ABC):
return
exp_signal
[
'date'
]
if
exp_signal
else
None
@
component
(
bean_name
=
'crisis_one'
)
class
ConsecutFiveDaysCrisisOneSignal
(
CrisisSignal
,
BaseRebalanceSignal
):
'''
连续5个交易入跌破850天平均值
'''
@
property
def
consecut_days
(
self
):
return
self
.
_config
[
'crisis-1'
][
'consecut-days'
]
@
property
def
mean_count
(
self
):
return
self
.
_config
[
'crisis-1'
][
'mean-count'
]
@
property
def
signal_type
(
self
):
return
SignalType
.
CRISIS_ONE
def
is_trigger
(
self
,
day
,
risk
:
PortfoliosRisk
)
->
bool
:
exp_date
=
self
.
get_exp_start_date
(
day
,
risk
)
if
exp_date
:
crisis_one
=
rrs
.
get_first_after
(
type
=
SignalType
.
CRISIS_ONE
,
risk
=
risk
,
min_date
=
exp_date
)
if
not
crisis_one
:
spx
=
self
.
_navs
.
get_last_index_close
(
max_date
=
day
,
ticker
=
'SPX Index'
,
count
=
self
.
mean_count
+
self
.
consecut_days
)
spx
=
pd
.
DataFrame
(
spx
)
spx
.
sort_values
(
by
=
'date'
,
inplace
=
True
,
ascending
=
False
)
spx
.
reset_index
(
drop
=
True
,
inplace
=
True
)
for
offset
in
range
(
self
.
consecut_days
):
spx
.
loc
[
0
+
offset
,
'mean'
]
=
spx
.
loc
[
0
+
offset
:
850
+
offset
]
.
close
.
mean
()
spx
.
dropna
(
inplace
=
True
)
spx
[
'diff'
]
=
spx
[
'close'
]
-
spx
[
'mean'
]
return
spx
[
spx
[
'diff'
]
>=
0
]
.
empty
return
False
@
component
(
bean_name
=
'crisis_one'
)
class
LastRateCrisisOneSignal
(
CrisisSignal
,
BaseRebalanceSignal
):
'''
...
...
rebalance/signals/curve_drift.py
View file @
59181600
...
...
@@ -29,6 +29,8 @@ class CurveDrift(BaseRebalanceSignal):
last_re
=
rrs
.
get_last_one
(
max_date
=
day
,
risk
=
risk
,
effective
=
True
)
if
last_re
is
None
or
SignalType
(
last_re
[
'type'
])
in
self
.
exclude_last_type
:
return
False
if
last_re
[
'date'
]
+
relativedelta
(
days
=
120
)
<=
day
:
return
True
hr_datums
=
self
.
_datum
.
get_high_risk_datums
(
risk
)
datum_ids
=
[
x
[
'id'
]
for
x
in
hr_datums
]
normal_portfolio
=
self
.
_builder
.
get_portfolios
(
day
,
risk
)
...
...
@@ -40,31 +42,3 @@ class CurveDrift(BaseRebalanceSignal):
@
property
def
signal_type
(
self
)
->
SignalType
:
return
SignalType
.
DRIFT_BUY
@
component
(
bean_name
=
'curve-drift'
)
class
Max120tCurveDrift
(
CurveDrift
):
def
is_trigger
(
self
,
day
,
risk
:
PortfoliosRisk
)
->
bool
:
last_re
=
rrs
.
get_last_one
(
max_date
=
day
,
risk
=
risk
,
effective
=
True
)
if
last_re
is
None
or
SignalType
(
last_re
[
'type'
])
in
self
.
exclude_last_type
:
return
False
if
last_re
[
'date'
]
+
relativedelta
(
days
=
120
)
<=
day
:
return
True
return
super
(
Max120tCurveDrift
,
self
)
.
is_trigger
(
day
,
risk
)
@
component
(
bean_name
=
'curve-drift'
)
class
AbsCurveDrift
(
CurveDrift
):
def
is_trigger
(
self
,
day
,
risk
:
PortfoliosRisk
)
->
bool
:
last_re
=
rrs
.
get_last_one
(
max_date
=
day
,
risk
=
risk
,
effective
=
True
)
if
last_re
is
None
or
SignalType
(
last_re
[
'type'
])
in
self
.
exclude_last_type
:
return
False
hr_datums
=
self
.
_datum
.
get_high_risk_datums
(
risk
)
datum_ids
=
[
x
[
'id'
]
for
x
in
hr_datums
]
normal_portfolio
=
self
.
_builder
.
get_portfolios
(
day
,
risk
)
normal_weight
=
round
(
sum
([
x
[
1
]
for
x
in
normal_portfolio
.
items
()
if
x
[
0
]
in
datum_ids
]),
2
)
hold_portfolio
=
self
.
_hold
.
get_portfolios_weight
(
day
,
risk
)
hold_weight
=
round
(
sum
([
x
[
1
]
for
x
in
hold_portfolio
.
items
()
if
x
[
0
]
in
datum_ids
]),
2
)
return
abs
(
normal_weight
-
hold_weight
)
>=
self
.
_solver
.
get_drift
(
day
,
risk
)
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