Commit e331b42d authored by jichao's avatar jichao

增加危机1信号判断逻辑

parent 25fb8bff
...@@ -38,6 +38,8 @@ py-jftech: ...@@ -38,6 +38,8 @@ py-jftech:
injectable: injectable:
types: types:
api.PortfoliosBuilder: portfolios.builder.PoemPortfoliosBuilder api.PortfoliosBuilder: portfolios.builder.PoemPortfoliosBuilder
names:
crisis_one: rebalance.signals.crisis_signal.LastRateCrisisOneSignal
email: email:
server: smtphz.qiye.163.com server: smtphz.qiye.163.com
user: jft-ra@thizgroup.com user: jft-ra@thizgroup.com
...@@ -145,6 +147,7 @@ rebalance: # 再平衡模块 ...@@ -145,6 +147,7 @@ rebalance: # 再平衡模块
crisis-1: # 危机1相关 crisis-1: # 危机1相关
mean-count: 850 # spx去多少交易日计算平均值 mean-count: 850 # spx去多少交易日计算平均值
consecut-days: 5 # spx连续多少天跌破平均值则触发 consecut-days: 5 # spx连续多少天跌破平均值则触发
threshold: -0.1 # spx计算后跌破阀值
crisis-2: # 危机2相关 crisis-2: # 危机2相关
negative-growth: 1 # 实际利率负增长时长,单位年,点到点取值 negative-growth: 1 # 实际利率负增长时长,单位年,点到点取值
fed-months: 3 # fed 滚动月份,点到点取值 fed-months: 3 # fed 滚动月份,点到点取值
......
...@@ -58,8 +58,10 @@ class CrisisSignal(BaseRebalanceSignal, ABC): ...@@ -58,8 +58,10 @@ class CrisisSignal(BaseRebalanceSignal, ABC):
@component(bean_name='crisis_one') @component(bean_name='crisis_one')
class CrisisOneSignal(CrisisSignal, BaseRebalanceSignal): class ConsecutFiveDaysCrisisOneSignal(CrisisSignal, BaseRebalanceSignal):
'''
连续5个交易入跌破850天平均值
'''
@property @property
def consecut_days(self): def consecut_days(self):
return self._config['crisis-1']['consecut-days'] return self._config['crisis-1']['consecut-days']
...@@ -89,6 +91,36 @@ class CrisisOneSignal(CrisisSignal, BaseRebalanceSignal): ...@@ -89,6 +91,36 @@ class CrisisOneSignal(CrisisSignal, BaseRebalanceSignal):
return False return False
@component(bean_name='crisis_one')
class LastRateCrisisOneSignal(CrisisSignal, BaseRebalanceSignal):
'''
(close / 850ma – 1) < threshold,threshold=-0.05、-0.1
'''
@property
def mean_count(self):
return self._config['crisis-1']['mean-count']
@property
def threshold(self):
return self._config['crisis-1']['threshold']
@property
def signal_type(self):
return SignalType.CRISIS_ONE
def is_trigger(self, day, risk: PortfoliosRisk) -> bool:
exp_date = self.get_exp_start_date(day, risk)
if exp_date:
crisis_one = rrs.get_first_after(type=SignalType.CRISIS_ONE, risk=risk, min_date=exp_date)
if not crisis_one:
spx = self._navs.get_last_index_close(max_date=day, ticker='SPX Index', count=self.mean_count)
spx = pd.DataFrame(spx)
spx.sort_values(by='date', inplace=True)
return spx.iloc[-1]['close'] / spx['close'].mean() - 1 < self.threshold
return False
@component(bean_name='crisis_two') @component(bean_name='crisis_two')
class CrisisTwoSignal(CrisisSignal, BaseRebalanceSignal): class CrisisTwoSignal(CrisisSignal, BaseRebalanceSignal):
......
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