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

添加信号模块

parent 4499db85
......@@ -43,6 +43,12 @@ class SolveType(Enum):
POEM = 2
@unique
class DriftType(Enum):
PORTFOLIO_HIGH_WEIGHT = 1
DATE_CURVE = 2
@unique
class SignalType(Enum):
INIT = 0
......@@ -340,6 +346,46 @@ class PortfoliosHolder(ABC):
'''
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):
'''
......
......@@ -113,6 +113,10 @@ portfolios:
mpt:
quantile: 0.1
rebalance:
drift:
date-curve:
diff-threshold: 0.4
init-factor: 0.000000002
builder:
disable-period: #自然日
normal: 10
......
......@@ -23,4 +23,4 @@ class NextReblanceHolder(PortfoliosHolder):
def build_hold_portfolio(self, day, risk: PortfoliosRisk):
pass
\ No newline at end of file
pass
......@@ -25,6 +25,10 @@ class PortfoliosTest(unittest.TestCase):
def test_has_hold(self, hold: PortfoliosHolder = None):
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__':
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