Commit a83eb3ad authored by jichao's avatar jichao

定版

parent a5e8402b
...@@ -224,7 +224,7 @@ reports: # 报告模块相关 ...@@ -224,7 +224,7 @@ reports: # 报告模块相关
- fixed-range-report # 固定区间收益报告 - fixed-range-report # 固定区间收益报告
- relative-range-report # 相对区间收益报告 - relative-range-report # 相对区间收益报告
robo-executor: # 执行器相关 robo-executor: # 执行器相关
use: ${ROBO_EXECUTOR:backtest} # 执行哪个执行器,优先取系统环境变量ROBO_EXECUTOR的值,默认backtest use: ${ROBO_EXECUTOR:real} # 执行哪个执行器,优先取系统环境变量ROBO_EXECUTOR的值,默认backtest
sync-data: ${SYNC_DATA:off} # 是否开启同步资料数据 sync-data: ${SYNC_DATA:off} # 是否开启同步资料数据
backtest: # 回测执行器相关 backtest: # 回测执行器相关
start-date: 2008-01-02 # 回测起始日期 start-date: 2008-01-02 # 回测起始日期
...@@ -233,7 +233,13 @@ robo-executor: # 执行器相关 ...@@ -233,7 +233,13 @@ robo-executor: # 执行器相关
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: # 实盘执行器
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
......
...@@ -36,6 +36,10 @@ class PortfoliosTest(unittest.TestCase): ...@@ -36,6 +36,10 @@ class PortfoliosTest(unittest.TestCase):
report = reportor.load_report() report = reportor.load_report()
self.logger.info(to_str(report)) self.logger.info(to_str(report))
@autowired(names={'hold': 'next-re'})
def test_clear(self, hold: PortfoliosHolder = None):
hold.clear()
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()
...@@ -56,7 +56,8 @@ class LevelRebalanceRuler(RebalanceRuler): ...@@ -56,7 +56,8 @@ class LevelRebalanceRuler(RebalanceRuler):
last_signal = rrs.get_last_one(max_date=day, risk=risk) last_signal = rrs.get_last_one(max_date=day, risk=risk)
start = next_workday(last_signal['date']) 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: 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} 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}
......
...@@ -54,6 +54,10 @@ class RebalanceTest(unittest.TestCase): ...@@ -54,6 +54,10 @@ class RebalanceTest(unittest.TestCase):
result = reportor.load_report() result = reportor.load_report()
logger.info(to_str(result, show_line=10)) logger.info(to_str(result, show_line=10))
@autowired
def test_clear_signal(self, ruler: RebalanceRuler = None):
ruler.clear_signal()
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()
...@@ -9,7 +9,7 @@ from typing import List ...@@ -9,7 +9,7 @@ from typing import List
import pandas as pd import pandas as pd
from py_jftech import ( from py_jftech import (
component, autowired, get_config, filter_weekend, asynchronized, 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 ( from api import (
...@@ -141,10 +141,11 @@ class BacktestExecutor(RoboExecutor): ...@@ -141,10 +141,11 @@ class BacktestExecutor(RoboExecutor):
class RealExecutor(RoboExecutor): class RealExecutor(RoboExecutor):
@autowired @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._builder = builder
self._hold = hold self._hold = hold
self._syncs = syncs self._syncs = syncs
self._ruler = ruler
self._config = get_config(__name__)['real'] self._config = get_config(__name__)['real']
@property @property
...@@ -164,19 +165,27 @@ class RealExecutor(RoboExecutor): ...@@ -164,19 +165,27 @@ class RealExecutor(RoboExecutor):
logger.warning(f'get curt date from argv failure.', e) logger.warning(f'get curt date from argv failure.', e)
return dt.combine(dt.today().date(), dt.min.time()) 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): def start_exec(self):
if self.is_sync_data: if self.is_sync_data:
for sync in self._syncs: for sync in self._syncs:
sync.do_sync() sync.do_sync()
date = self.curt_date date = self.curt_date
for risk in PortfoliosRisk: for date in pd.date_range(start='2008-01-17', end='2008-01-20'):
logger.info(f"start to build risk[{risk.name}] real for date[{format_date(date)}]".center(50, '-')) if is_workday(date) or date in self.include_date:
now = dt.now() date = prev_workday(date)
# 因为每天都必须有NORMAL最优投组,不管用不用 for risk in PortfoliosRisk:
self._builder.get_portfolios(prev_workday(date), risk) logger.info(f"start to build risk[{risk.name}] real for date[{format_date(date)}]".center(50, '-'))
self._hold.build_hold_portfolio(date, risk) now = dt.now()
# 如果当前持仓为风控投组,则还要计算风控投组,不管用不用 # 因为每天都必须有NORMAL最优投组,不管用不用
p_type = self._hold.get_portfolio_type(date, risk) self._builder.get_portfolios(date, risk)
if p_type is not PortfoliosType.NORMAL: self._hold.build_hold_portfolio(date, risk)
self._builder.get_portfolios(prev_workday(date), p_type) self._ruler.take_next_signal(date, risk)
logger.info(f"build risk[{risk.name}] real for date[{format_date(date)}] success, use[{(dt.now() - now).seconds}s]") # 如果当前持仓为风控投组,则还要计算风控投组,不管用不用
p_type = self._hold.get_portfolio_type(date, risk)
if p_type is not PortfoliosType.NORMAL:
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]")
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment