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
19c41851
Commit
19c41851
authored
Jan 06, 2023
by
jichao
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
6258
parent
0b2f68b7
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
22 additions
and
12 deletions
+22
-12
sync.py
basic/sync.py
+9
-0
config.yml
config.yml
+2
-2
drift_solver.py
rebalance/drift_solver.py
+1
-1
curve_drift.py
rebalance/signals/curve_drift.py
+4
-3
test_case.py
rebalance/test_case.py
+2
-2
robo_executor.py
robo_executor.py
+4
-4
No files found.
basic/sync.py
View file @
19c41851
import
logging
from
abc
import
ABC
,
abstractmethod
from
datetime
import
datetime
as
dt
from
dateutil.relativedelta
import
relativedelta
from
typing
import
List
from
urllib.parse
import
quote
...
...
@@ -68,6 +69,10 @@ class JDCDataSync(DataSync, ABC):
@
component
(
bean_name
=
'index-sync'
)
class
IndexSync
(
JDCDataSync
):
@
property
def
start_date
(
self
):
return
super
(
IndexSync
,
self
)
.
start_date
-
relativedelta
(
years
=
4
)
@
property
def
datum_type
(
self
)
->
DatumType
:
return
DatumType
.
INDEX
...
...
@@ -98,6 +103,10 @@ class IndexSync(JDCDataSync):
@
component
(
bean_name
=
'eco-sync'
)
class
EcoSync
(
JDCDataSync
):
@
property
def
start_date
(
self
):
return
super
(
EcoSync
,
self
)
.
start_date
-
relativedelta
(
years
=
4
)
@
property
def
datum_type
(
self
)
->
DatumType
:
return
DatumType
.
ECO
...
...
config.yml
View file @
19c41851
...
...
@@ -151,7 +151,7 @@ rebalance: # 再平衡模块
fed-threshold
:
-0.75
# fed判断阀值
right-side
:
# 市场右侧相关
rtn-days
:
5
# 计算spx回报率滚动天数,交易日
min-threshold
:
-0.0
3
# spx回报率跌破阀值
min-threshold
:
-0.0
5
# spx回报率跌破阀值
coef
:
0.95
# 计算cvar的系数
cvar-min-volume
:
30
# 计算cvar至少需要多少交易日数据
high-low-buy
:
# 高低买入相关
...
...
@@ -226,7 +226,7 @@ robo-executor: # 执行器相关
backtest
:
# 回测执行器相关
start-date
:
2008-01-02
# 回测起始日期
end-date
:
2022-11-01
# 回测截止日期
start-step
:
${BACKTEST_START_STEP:
1
}
# 回测从哪一步开始执行 1:计算资产ewma;2:计算资产池;3:计算最优投组:4:计算再平衡信号以及持仓投组
start-step
:
${BACKTEST_START_STEP:
4
}
# 回测从哪一步开始执行 1:计算资产ewma;2:计算资产池;3:计算最优投组:4:计算再平衡信号以及持仓投组
end-step
:
${BACKTEST_END_STEP:4}
# 回测从哪一步执行完成后结束执行 1:计算资产ewma;2:计算资产池;3:计算最优投组:4:计算再平衡信号以及持仓投组
clean-up
:
on
real
:
# 实盘执行器
...
...
rebalance/drift_solver.py
View file @
19c41851
...
...
@@ -21,7 +21,7 @@ class DateCurve(DriftSolver):
def
get_drift
(
self
,
day
,
risk
:
PortfoliosRisk
):
last_re
=
rrs
.
get_last_one
(
max_date
=
day
,
risk
=
risk
,
effective
=
True
)
result
=
self
.
diff_threshold
-
self
.
init_factor
*
(
day
-
last_re
[
'date'
])
.
days
**
4
return
max
(
0
,
result
)
return
result
@
component
(
bean_name
=
'high-weight'
)
...
...
rebalance/signals/curve_drift.py
View file @
19c41851
...
...
@@ -22,15 +22,16 @@ class CurveDrift(BaseRebalanceSignal):
SignalType
.
CRISIS_ONE
,
SignalType
.
CRISIS_TWO
,
SignalType
.
MARKET_RIGHT
,
SignalType
.
INIT
SignalType
.
INIT
,
SignalType
.
LOW_BUY
]
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
#
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
)
...
...
rebalance/test_case.py
View file @
19c41851
...
...
@@ -13,7 +13,7 @@ class RebalanceTest(unittest.TestCase):
@
autowired
(
names
=
{
'builder'
:
'crisis_one'
})
def
test_crisis_one
(
self
,
builder
:
RebalanceSignal
=
None
):
start
=
parse_date
(
'20
18-07-06
'
)
start
=
parse_date
(
'20
08-01-07
'
)
end
=
start
+
relativedelta
(
years
=
3
)
while
start
<
end
:
signal
=
builder
.
is_trigger
(
start
,
PortfoliosRisk
.
FT9
)
...
...
@@ -33,7 +33,7 @@ class RebalanceTest(unittest.TestCase):
@
autowired
(
names
=
{
'builder'
:
'market-right'
})
def
test_market_right
(
self
,
builder
:
RebalanceSignal
=
None
):
signal
=
builder
.
get_signal
(
parse_date
(
'20
22-02-22
'
),
PortfoliosRisk
.
FT9
)
signal
=
builder
.
get_signal
(
parse_date
(
'20
08-01-07
'
),
PortfoliosRisk
.
FT9
)
logger
.
info
(
signal
)
@
autowired
(
names
=
{
'builder'
:
'curve-drift'
})
...
...
robo_executor.py
View file @
19c41851
...
...
@@ -119,10 +119,10 @@ class BacktestExecutor(RoboExecutor):
now
=
dt
.
now
()
wait
([
self
.
async_build_hold
(
x
)
for
x
in
PortfoliosRisk
])
logger
.
info
(
f
"build hold portfolios success, use[{(dt.now() - now).seconds}s]"
)
logger
.
info
(
"start to export report"
.
center
(
50
,
'-'
))
now
=
dt
.
now
()
file
=
self
.
_export
.
export
(
max_date
=
self
.
end_date
)
logger
.
info
(
f
"report file[{os.path.basename(file)}] exported successfully. use[{(dt.now() - now).seconds}s]."
)
#
logger.info("start to export report".center(50, '-'))
#
now = dt.now()
#
file = self._export.export(max_date=self.end_date)
#
logger.info(f"report file[{os.path.basename(file)}] exported successfully. use[{(dt.now() - now).seconds}s].")
@
asynchronized
(
isolate
=
True
)
def
async_build_risk_date
(
self
,
asset_id
):
...
...
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