Commit 7e202633 authored by jichao's avatar jichao

实盘完成待测试

parent 626cb9f0
...@@ -368,6 +368,16 @@ class PortfoliosHolder(ABC): ...@@ -368,6 +368,16 @@ class PortfoliosHolder(ABC):
投资组合持仓器 投资组合持仓器
''' '''
@abstractmethod
def get_portfolio_type(self, day, risk: PortfoliosRisk) -> PortfoliosType:
'''
获取指定日期指定风险等级持仓投组的类型
:param day: 指定日期
:param risk: 指定风险等级
:return: 持仓投组类型
'''
pass
@abstractmethod @abstractmethod
def get_portfolios_weight(self, day, risk: PortfoliosRisk): def get_portfolios_weight(self, day, risk: PortfoliosRisk):
''' '''
...@@ -378,6 +388,7 @@ class PortfoliosHolder(ABC): ...@@ -378,6 +388,7 @@ class PortfoliosHolder(ABC):
''' '''
pass pass
@abstractmethod
def has_hold(self, risk: PortfoliosRisk) -> bool: def has_hold(self, risk: PortfoliosRisk) -> bool:
''' '''
是否存在指定分线等级的投组持仓 是否存在指定分线等级的投组持仓
...@@ -484,6 +495,15 @@ class RebalanceRuler(ABC): ...@@ -484,6 +495,15 @@ class RebalanceRuler(ABC):
''' '''
pass pass
@abstractmethod
def get_signal_type(self, sign_id) -> SignalType:
'''
获取指定id的信号类型
:param sign_id: 信号id
:return: 信号类型
'''
pass
class RoboExecutor(ABC): class RoboExecutor(ABC):
''' '''
......
...@@ -168,6 +168,8 @@ robo-executor: ...@@ -168,6 +168,8 @@ robo-executor:
start-date: 2008-01-02 start-date: 2008-01-02
end-date: 2009-01-01 end-date: 2009-01-01
start-step: 4 start-step: 4
real:
start-date: 2022-11-01
......
...@@ -2,7 +2,7 @@ import json ...@@ -2,7 +2,7 @@ import json
import pandas as pd import pandas as pd
from api import PortfoliosHolder, PortfoliosRisk, RebalanceRuler, Navs, SignalType, RoboExecutor from api import PortfoliosHolder, PortfoliosRisk, RebalanceRuler, Navs, SignalType, RoboExecutor, PortfoliosType
from framework import ( from framework import (
component, autowired, get_config, next_workday, filter_weekend, component, autowired, get_config, next_workday, filter_weekend,
prev_workday, transaction, workday_range, format_date, get_logger prev_workday, transaction, workday_range, format_date, get_logger
...@@ -23,6 +23,13 @@ class NextReblanceHolder(PortfoliosHolder): ...@@ -23,6 +23,13 @@ class NextReblanceHolder(PortfoliosHolder):
self._executor = executor self._executor = executor
self._config = get_config(__name__) self._config = get_config(__name__)
def get_portfolio_type(self, day, risk: PortfoliosRisk) -> PortfoliosType:
hold = rhp.get_one(day, risk)
if hold:
signal_type = self._rule.get_signal_type(hold['signal_id'])
return signal_type.p_type if signal_type else PortfoliosType.NORMAL
return PortfoliosType.NORMAL
def get_last_rebalance_date(self, risk: PortfoliosRisk, max_date=None, signal_id=None): def get_last_rebalance_date(self, risk: PortfoliosRisk, max_date=None, signal_id=None):
assert risk, f"get last rebalance date, risk can not be none" assert risk, f"get last rebalance date, risk can not be none"
last = rhp.get_last_one(max_date=max_date, risk=risk, signal_id=signal_id, rebalance=True) last = rhp.get_last_one(max_date=max_date, risk=risk, signal_id=signal_id, rebalance=True)
......
...@@ -62,5 +62,9 @@ class LevelRebalanceRuler(RebalanceRuler): ...@@ -62,5 +62,9 @@ class LevelRebalanceRuler(RebalanceRuler):
return signal return signal
return None return None
def get_signal_type(self, sign_id) -> SignalType:
signal = rrs.get_by_id(sign_id)
return SignalType(signal['type']) if signal else None
def commit_signal(self, sign_id): def commit_signal(self, sign_id):
rrs.update(sign_id, {'effective': True}) rrs.update(sign_id, {'effective': True})
import pandas as pd import pandas as pd
from framework import component, autowired, block_execute, get_config, get_logger, filter_weekend, workday_range, format_date from framework import component, autowired, block_execute, get_config, get_logger, filter_weekend, workday_range, format_date, prev_workday
from api import RoboExecutor, AssetRisk, Datum, AssetPool, PortfoliosBuilder, PortfoliosRisk, PortfoliosHolder from api import RoboExecutor, AssetRisk, Datum, AssetPool, PortfoliosBuilder, PortfoliosRisk, PortfoliosHolder, PortfoliosType
from datetime import datetime as dt from datetime import datetime as dt
import time import time
from enum import Enum, unique from enum import Enum, unique
...@@ -72,7 +72,7 @@ class BacktestExector(RoboExecutor): ...@@ -72,7 +72,7 @@ class BacktestExector(RoboExecutor):
workdays = workday_range(self.start_date, self.end_date) workdays = workday_range(self.start_date, self.end_date)
for date in workdays: for date in workdays:
self._risk.get_risk_pool(date) self._risk.get_risk_pool(date)
time.sleep(0.05) time.sleep(0.05) # 这里需要sleep,否则里面多进程太快,数据库连接容易超时
for date in workdays: for date in workdays:
self._pool.get_pool(date) self._pool.get_pool(date)
logger.info(f"build asset pool success, use[{(dt.now() - now).seconds}s]") logger.info(f"build asset pool success, use[{(dt.now() - now).seconds}s]")
...@@ -87,3 +87,29 @@ class BacktestExector(RoboExecutor): ...@@ -87,3 +87,29 @@ class BacktestExector(RoboExecutor):
block_execute(self._hold.build_hold_portfolio, {x: (self.end_date, x) for x in PortfoliosRisk}, isolate=True, result=False) block_execute(self._hold.build_hold_portfolio, {x: (self.end_date, x) for x in PortfoliosRisk}, isolate=True, result=False)
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]")
@component(bean_name='real')
class RealExecutor(RoboExecutor):
@autowired
def __init__(self, builder: PortfoliosBuilder = None, hold: PortfoliosHolder = None):
self._builder = builder
self._hold = hold
self._config = get_config(__name__)['real']
@property
def start_date(self):
return pd.to_datetime(filter_weekend(self._config['start-date']))
def start_exec(self):
date = dt.combine(dt.today().date(), dt.min.time())
for risk in PortfoliosRisk:
logger.info(f"start to build risk[{risk.name}] real for date[{format_date(date)}]".center(50, '-'))
now = dt.now()
self._builder.get_portfolios(prev_workday(date), risk)
self._hold.build_hold_portfolio(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)
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