Commit 59181600 authored by jichao's avatar jichao

定版

parent a63e7233
...@@ -38,10 +38,6 @@ py-jftech: ...@@ -38,10 +38,6 @@ py-jftech:
injectable: injectable:
types: types:
api.PortfoliosBuilder: portfolios.builder.PoemPortfoliosBuilder api.PortfoliosBuilder: portfolios.builder.PoemPortfoliosBuilder
names:
crisis_one: rebalance.signals.crisis_signal.LastRateCrisisOneSignal
curve-drift: rebalance.signals.curve_drift.Max120tCurveDrift
# curve-drift: rebalance.signals.curve_drift.AbsCurveDrift
email: email:
server: smtphz.qiye.163.com server: smtphz.qiye.163.com
user: jft-ra@thizgroup.com user: jft-ra@thizgroup.com
...@@ -148,7 +144,6 @@ rebalance: # 再平衡模块 ...@@ -148,7 +144,6 @@ rebalance: # 再平衡模块
inversion-threshold: 0.3 # 利率倒挂触发阀值 inversion-threshold: 0.3 # 利率倒挂触发阀值
crisis-1: # 危机1相关 crisis-1: # 危机1相关
mean-count: 850 # spx去多少交易日计算平均值 mean-count: 850 # spx去多少交易日计算平均值
consecut-days: 5 # spx连续多少天跌破平均值则触发
threshold: -0.05 # spx计算后跌破阀值 threshold: -0.05 # spx计算后跌破阀值
crisis-2: # 危机2相关 crisis-2: # 危机2相关
negative-growth: 1 # 实际利率负增长时长,单位年,点到点取值 negative-growth: 1 # 实际利率负增长时长,单位年,点到点取值
...@@ -160,7 +155,10 @@ rebalance: # 再平衡模块 ...@@ -160,7 +155,10 @@ rebalance: # 再平衡模块
coef: 0.95 # 计算cvar的系数 coef: 0.95 # 计算cvar的系数
cvar-min-volume: 30 # 计算cvar至少需要多少交易日数据 cvar-min-volume: 30 # 计算cvar至少需要多少交易日数据
high-low-buy: # 高低买入相关 high-low-buy: # 高低买入相关
threshold: [ 0.5, 0.8 ] # [ 低买入阀值,高买入阀值 ] threshold: # [ 低买入阀值,高买入阀值 ]
ft3: [ 0.5, 0.8 ]
ft6: [ 0.55, 0.8 ]
ft9: [ 0.55, 0.8 ]
reports: # 报告模块相关 reports: # 报告模块相关
navs: navs:
type: FUND type: FUND
...@@ -213,7 +211,7 @@ reports: # 报告模块相关 ...@@ -213,7 +211,7 @@ reports: # 报告模块相关
backtest: # 回测导出曹策略 backtest: # 回测导出曹策略
exist-build: on # 如果报告文件存在,是否重新构建文件 exist-build: on # 如果报告文件存在,是否重新构建文件
save-path: ${EXPORT_PATH:excels} # 导出报告文件存放路径,如果以./或者../开头,则会以执行python文件为根目录,如果以/开头,则为系统绝对路径,否则,以项目目录为根目录 save-path: ${EXPORT_PATH:excels} # 导出报告文件存放路径,如果以./或者../开头,则会以执行python文件为根目录,如果以/开头,则为系统绝对路径,否则,以项目目录为根目录
file-name: ${EXPORT_FILENAME:1322} file-name: ${EXPORT_FILENAME:1323}
include-report: # 需要导出的报告类型列表,下面的顺序,也代表了excel中sheet的顺序 include-report: # 需要导出的报告类型列表,下面的顺序,也代表了excel中sheet的顺序
# - funds-report # 基金资料 # - funds-report # 基金资料
# - navs-report # 净值报告 # - navs-report # 净值报告
......
...@@ -64,40 +64,6 @@ class CrisisSignal(BaseRebalanceSignal, ABC): ...@@ -64,40 +64,6 @@ class CrisisSignal(BaseRebalanceSignal, ABC):
return exp_signal['date'] if exp_signal else None return exp_signal['date'] if exp_signal else None
@component(bean_name='crisis_one')
class ConsecutFiveDaysCrisisOneSignal(CrisisSignal, BaseRebalanceSignal):
'''
连续5个交易入跌破850天平均值
'''
@property
def consecut_days(self):
return self._config['crisis-1']['consecut-days']
@property
def mean_count(self):
return self._config['crisis-1']['mean-count']
@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 + self.consecut_days)
spx = pd.DataFrame(spx)
spx.sort_values(by='date', inplace=True, ascending=False)
spx.reset_index(drop=True, inplace=True)
for offset in range(self.consecut_days):
spx.loc[0 + offset, 'mean'] = spx.loc[0 + offset: 850 + offset].close.mean()
spx.dropna(inplace=True)
spx['diff'] = spx['close'] - spx['mean']
return spx[spx['diff'] >= 0].empty
return False
@component(bean_name='crisis_one') @component(bean_name='crisis_one')
class LastRateCrisisOneSignal(CrisisSignal, BaseRebalanceSignal): class LastRateCrisisOneSignal(CrisisSignal, BaseRebalanceSignal):
''' '''
......
...@@ -29,6 +29,8 @@ class CurveDrift(BaseRebalanceSignal): ...@@ -29,6 +29,8 @@ class CurveDrift(BaseRebalanceSignal):
last_re = rrs.get_last_one(max_date=day, risk=risk, effective=True) 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: if last_re is None or SignalType(last_re['type']) in self.exclude_last_type:
return False return False
if last_re['date'] + relativedelta(days=120) <= day:
return True
hr_datums = self._datum.get_high_risk_datums(risk) hr_datums = self._datum.get_high_risk_datums(risk)
datum_ids = [x['id'] for x in hr_datums] datum_ids = [x['id'] for x in hr_datums]
normal_portfolio = self._builder.get_portfolios(day, risk) normal_portfolio = self._builder.get_portfolios(day, risk)
...@@ -40,31 +42,3 @@ class CurveDrift(BaseRebalanceSignal): ...@@ -40,31 +42,3 @@ class CurveDrift(BaseRebalanceSignal):
@property @property
def signal_type(self) -> SignalType: def signal_type(self) -> SignalType:
return SignalType.DRIFT_BUY 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