Commit a83eb3ad authored by jichao's avatar jichao

定版

parent a5e8402b
......@@ -224,7 +224,7 @@ reports: # 报告模块相关
- fixed-range-report # 固定区间收益报告
- relative-range-report # 相对区间收益报告
robo-executor: # 执行器相关
use: ${ROBO_EXECUTOR:backtest} # 执行哪个执行器,优先取系统环境变量ROBO_EXECUTOR的值,默认backtest
use: ${ROBO_EXECUTOR:real} # 执行哪个执行器,优先取系统环境变量ROBO_EXECUTOR的值,默认backtest
sync-data: ${SYNC_DATA:off} # 是否开启同步资料数据
backtest: # 回测执行器相关
start-date: 2008-01-02 # 回测起始日期
......@@ -233,7 +233,13 @@ robo-executor: # 执行器相关
end-step: ${BACKTEST_END_STEP:4} # 回测从哪一步执行完成后结束执行 1:计算资产ewma;2:计算资产池;3:计算最优投组:4:计算再平衡信号以及持仓投组
clean-up: on
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):
report = reportor.load_report()
self.logger.info(to_str(report))
@autowired(names={'hold': 'next-re'})
def test_clear(self, hold: PortfoliosHolder = None):
hold.clear()
if __name__ == '__main__':
unittest.main()
......@@ -56,7 +56,8 @@ class LevelRebalanceRuler(RebalanceRuler):
last_signal = rrs.get_last_one(max_date=day, risk=risk)
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:
# 检查风控信号
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):
result = reportor.load_report()
logger.info(to_str(result, show_line=10))
@autowired
def test_clear_signal(self, ruler: RebalanceRuler = None):
ruler.clear_signal()
if __name__ == '__main__':
unittest.main()
......@@ -9,7 +9,7 @@ from typing import List
import pandas as pd
from py_jftech import (
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 (
......@@ -141,10 +141,11 @@ class BacktestExecutor(RoboExecutor):
class RealExecutor(RoboExecutor):
@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._hold = hold
self._syncs = syncs
self._ruler = ruler
self._config = get_config(__name__)['real']
@property
......@@ -164,19 +165,27 @@ class RealExecutor(RoboExecutor):
logger.warning(f'get curt date from argv failure.', e)
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):
if self.is_sync_data:
for sync in self._syncs:
sync.do_sync()
date = self.curt_date
for date in pd.date_range(start='2008-01-17', end='2008-01-20'):
if is_workday(date) or date in self.include_date:
date = prev_workday(date)
for risk in PortfoliosRisk:
logger.info(f"start to build risk[{risk.name}] real for date[{format_date(date)}]".center(50, '-'))
now = dt.now()
# 因为每天都必须有NORMAL最优投组,不管用不用
self._builder.get_portfolios(prev_workday(date), risk)
self._builder.get_portfolios(date, risk)
self._hold.build_hold_portfolio(date, risk)
self._ruler.take_next_signal(date, risk)
# 如果当前持仓为风控投组,则还要计算风控投组,不管用不用
p_type = self._hold.get_portfolio_type(date, risk)
if p_type is not PortfoliosType.NORMAL:
self._builder.get_portfolios(prev_workday(date), p_type)
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