Commit 27cd5b86 authored by 纪超's avatar 纪超

添加信号模块

parent 4499db85
...@@ -43,6 +43,12 @@ class SolveType(Enum): ...@@ -43,6 +43,12 @@ class SolveType(Enum):
POEM = 2 POEM = 2
@unique
class DriftType(Enum):
PORTFOLIO_HIGH_WEIGHT = 1
DATE_CURVE = 2
@unique @unique
class SignalType(Enum): class SignalType(Enum):
INIT = 0 INIT = 0
...@@ -340,6 +346,46 @@ class PortfoliosHolder(ABC): ...@@ -340,6 +346,46 @@ class PortfoliosHolder(ABC):
''' '''
pass pass
@abstractmethod
def build_hold_portfolio(self, day, risk: PortfoliosRisk):
'''
构建指定日期,指定风险等级的持仓投组
:param day: 指定日期
:param risk: 指定风险等级
:return:
'''
pass
class DriftSolver(ABC):
'''
漂移解算器
'''
@abstractmethod
def get_drift(self, day):
'''
获取指定日期得漂移计算结果
:param day:
:return:
'''
pass
class DriftFactory(ABC):
'''
漂移解算器工厂
'''
@abstractmethod
def create_drift_solver(self, type: DriftType, **kwargs) -> DriftSolver:
'''
创建指定类型的漂移解算器
:param type: 指定的解算器类型
:param kwargs: 解算器需要的参数字典
:return: 漂移解算器
'''
pass
class SignalBuilder(ABC): class SignalBuilder(ABC):
''' '''
......
...@@ -113,6 +113,10 @@ portfolios: ...@@ -113,6 +113,10 @@ portfolios:
mpt: mpt:
quantile: 0.1 quantile: 0.1
rebalance: rebalance:
drift:
date-curve:
diff-threshold: 0.4
init-factor: 0.000000002
builder: builder:
disable-period: #自然日 disable-period: #自然日
normal: 10 normal: 10
......
...@@ -25,6 +25,10 @@ class PortfoliosTest(unittest.TestCase): ...@@ -25,6 +25,10 @@ class PortfoliosTest(unittest.TestCase):
def test_has_hold(self, hold: PortfoliosHolder = None): def test_has_hold(self, hold: PortfoliosHolder = None):
self.logger.info(hold.has_hold(PortfoliosRisk.FT3)) self.logger.info(hold.has_hold(PortfoliosRisk.FT3))
@autowired(names={'hold': 'next-re'})
def test_build_hold(self, hold: PortfoliosHolder = None):
pass
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()
from api import DriftSolver, DriftFactory, DriftType
from framework import component, autowired, get_config
from rebalance.dao import robo_rebalance_signal as rrs
@component
class DefaultDriftFactory(DriftFactory):
def create_drift_solver(self, type: DriftType, **kwargs) -> DriftSolver:
if type is DriftType.DATE_CURVE:
return DateCurveDriftSolver()
elif type is DriftType.PORTFOLIO_HIGH_WEIGHT:
pass
return None
class DateCurve(DriftSolver):
def __init__(self):
self._config = get_config(__name__)['date-curve']
@property
def diff_threshold(self):
return self._config['diff-threshold']
@property
def init_factor(self):
return self._config['init-factor']
def get_drift(self, day):
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)
class PortfolioHighWeight(DriftSolver):
def get_drift(self, day):
pass
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