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