Commit 2021b48e authored by jichao's avatar jichao

增加危机1信号判断逻辑

parent 0da5f758
......@@ -40,6 +40,8 @@ py-jftech:
api.PortfoliosBuilder: portfolios.builder.PoemPortfoliosBuilder
names:
crisis_one: rebalance.signals.crisis_signal.LastRateCrisisOneSignal
date-curve: rebalance.drift_solver.DateCurve
curve-drift: rebalance.signals.curve_drift.CurveDrift
email:
server: smtphz.qiye.163.com
user: jft-ra@thizgroup.com
......
......@@ -20,7 +20,14 @@ class DateCurve(DriftSolver):
def get_drift(self, day, risk: PortfoliosRisk):
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 self.diff_threshold - self.init_factor * (day - last_re['date']).days ** 4
@component(bean_name='date-curve')
class NonnegativeDateCurve(DateCurve):
def get_drift(self, day, risk: PortfoliosRisk):
result = super(NonnegativeDateCurve, self).get_drift(day, risk)
return max(0, result)
......
......@@ -22,15 +22,14 @@ class CurveDrift(BaseRebalanceSignal):
SignalType.CRISIS_ONE,
SignalType.CRISIS_TWO,
SignalType.MARKET_RIGHT,
SignalType.INIT
SignalType.INIT,
SignalType.LOW_BUY
]
def is_trigger(self, day, risk: PortfoliosRisk) -> bool:
last_re = rrs.get_last_one(max_date=day, risk=risk, effective=True)
if last_re is None or SignalType(last_re['type']) in self.exclude_last_type:
return False
if last_re['date'] + relativedelta(days=120) <= day:
return True
hr_datums = self._datum.get_high_risk_datums(risk)
datum_ids = [x['id'] for x in hr_datums]
normal_portfolio = self._builder.get_portfolios(day, risk)
......@@ -42,3 +41,31 @@ class CurveDrift(BaseRebalanceSignal):
@property
def signal_type(self) -> SignalType:
return SignalType.DRIFT_BUY
@component(bean_name='curve-drift')
class Max120tCurveDrift(CurveDrift):
def is_trigger(self, day, risk: PortfoliosRisk) -> bool:
last_re = rrs.get_last_one(max_date=day, risk=risk, effective=True)
if last_re is None or SignalType(last_re['type']) in self.exclude_last_type:
return False
if last_re['date'] + relativedelta(days=120) <= day:
return True
return super(Max120tCurveDrift, self).is_trigger(day, risk)
@component(bean_name='curve-drift')
class AbsCurveDrift(CurveDrift):
def is_trigger(self, day, risk: PortfoliosRisk) -> bool:
last_re = rrs.get_last_one(max_date=day, risk=risk, effective=True)
if last_re is None or SignalType(last_re['type']) in self.exclude_last_type:
return False
hr_datums = self._datum.get_high_risk_datums(risk)
datum_ids = [x['id'] for x in hr_datums]
normal_portfolio = self._builder.get_portfolios(day, risk)
normal_weight = round(sum([x[1] for x in normal_portfolio.items() if x[0] in datum_ids]), 2)
hold_portfolio = self._hold.get_portfolios_weight(day, risk)
hold_weight = round(sum([x[1] for x in hold_portfolio.items() if x[0] in datum_ids]), 2)
return abs(normal_weight - hold_weight) >= self._solver.get_drift(day, risk)
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