Commit 19c41851 authored by jichao's avatar jichao

6258

parent 0b2f68b7
import logging import logging
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from datetime import datetime as dt from datetime import datetime as dt
from dateutil.relativedelta import relativedelta
from typing import List from typing import List
from urllib.parse import quote from urllib.parse import quote
...@@ -68,6 +69,10 @@ class JDCDataSync(DataSync, ABC): ...@@ -68,6 +69,10 @@ class JDCDataSync(DataSync, ABC):
@component(bean_name='index-sync') @component(bean_name='index-sync')
class IndexSync(JDCDataSync): class IndexSync(JDCDataSync):
@property
def start_date(self):
return super(IndexSync, self).start_date - relativedelta(years=4)
@property @property
def datum_type(self) -> DatumType: def datum_type(self) -> DatumType:
return DatumType.INDEX return DatumType.INDEX
...@@ -98,6 +103,10 @@ class IndexSync(JDCDataSync): ...@@ -98,6 +103,10 @@ class IndexSync(JDCDataSync):
@component(bean_name='eco-sync') @component(bean_name='eco-sync')
class EcoSync(JDCDataSync): class EcoSync(JDCDataSync):
@property
def start_date(self):
return super(EcoSync, self).start_date - relativedelta(years=4)
@property @property
def datum_type(self) -> DatumType: def datum_type(self) -> DatumType:
return DatumType.ECO return DatumType.ECO
......
...@@ -151,7 +151,7 @@ rebalance: # 再平衡模块 ...@@ -151,7 +151,7 @@ rebalance: # 再平衡模块
fed-threshold: -0.75 # fed判断阀值 fed-threshold: -0.75 # fed判断阀值
right-side: # 市场右侧相关 right-side: # 市场右侧相关
rtn-days: 5 # 计算spx回报率滚动天数,交易日 rtn-days: 5 # 计算spx回报率滚动天数,交易日
min-threshold: -0.03 # spx回报率跌破阀值 min-threshold: -0.05 # spx回报率跌破阀值
coef: 0.95 # 计算cvar的系数 coef: 0.95 # 计算cvar的系数
cvar-min-volume: 30 # 计算cvar至少需要多少交易日数据 cvar-min-volume: 30 # 计算cvar至少需要多少交易日数据
high-low-buy: # 高低买入相关 high-low-buy: # 高低买入相关
...@@ -226,7 +226,7 @@ robo-executor: # 执行器相关 ...@@ -226,7 +226,7 @@ robo-executor: # 执行器相关
backtest: # 回测执行器相关 backtest: # 回测执行器相关
start-date: 2008-01-02 # 回测起始日期 start-date: 2008-01-02 # 回测起始日期
end-date: 2022-11-01 # 回测截止日期 end-date: 2022-11-01 # 回测截止日期
start-step: ${BACKTEST_START_STEP:1} # 回测从哪一步开始执行 1:计算资产ewma;2:计算资产池;3:计算最优投组:4:计算再平衡信号以及持仓投组 start-step: ${BACKTEST_START_STEP:4} # 回测从哪一步开始执行 1:计算资产ewma;2:计算资产池;3:计算最优投组:4:计算再平衡信号以及持仓投组
end-step: ${BACKTEST_END_STEP:4} # 回测从哪一步执行完成后结束执行 1:计算资产ewma;2:计算资产池;3:计算最优投组:4:计算再平衡信号以及持仓投组 end-step: ${BACKTEST_END_STEP:4} # 回测从哪一步执行完成后结束执行 1:计算资产ewma;2:计算资产池;3:计算最优投组:4:计算再平衡信号以及持仓投组
clean-up: on clean-up: on
real: # 实盘执行器 real: # 实盘执行器
......
...@@ -21,7 +21,7 @@ class DateCurve(DriftSolver): ...@@ -21,7 +21,7 @@ class DateCurve(DriftSolver):
def get_drift(self, day, risk: PortfoliosRisk): def get_drift(self, day, risk: PortfoliosRisk):
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)
result = self.diff_threshold - self.init_factor * (day - last_re['date']).days ** 4 result = self.diff_threshold - self.init_factor * (day - last_re['date']).days ** 4
return max(0, result) return result
@component(bean_name='high-weight') @component(bean_name='high-weight')
......
...@@ -22,15 +22,16 @@ class CurveDrift(BaseRebalanceSignal): ...@@ -22,15 +22,16 @@ class CurveDrift(BaseRebalanceSignal):
SignalType.CRISIS_ONE, SignalType.CRISIS_ONE,
SignalType.CRISIS_TWO, SignalType.CRISIS_TWO,
SignalType.MARKET_RIGHT, SignalType.MARKET_RIGHT,
SignalType.INIT SignalType.INIT,
SignalType.LOW_BUY
] ]
def is_trigger(self, day, risk: PortfoliosRisk) -> bool: def is_trigger(self, day, risk: PortfoliosRisk) -> bool:
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: # if last_re['date'] + relativedelta(days=120) <= day:
return True # 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)
......
...@@ -13,7 +13,7 @@ class RebalanceTest(unittest.TestCase): ...@@ -13,7 +13,7 @@ class RebalanceTest(unittest.TestCase):
@autowired(names={'builder': 'crisis_one'}) @autowired(names={'builder': 'crisis_one'})
def test_crisis_one(self, builder: RebalanceSignal = None): def test_crisis_one(self, builder: RebalanceSignal = None):
start = parse_date('2018-07-06') start = parse_date('2008-01-07')
end = start + relativedelta(years=3) end = start + relativedelta(years=3)
while start < end: while start < end:
signal = builder.is_trigger(start, PortfoliosRisk.FT9) signal = builder.is_trigger(start, PortfoliosRisk.FT9)
...@@ -33,7 +33,7 @@ class RebalanceTest(unittest.TestCase): ...@@ -33,7 +33,7 @@ class RebalanceTest(unittest.TestCase):
@autowired(names={'builder': 'market-right'}) @autowired(names={'builder': 'market-right'})
def test_market_right(self, builder: RebalanceSignal = None): def test_market_right(self, builder: RebalanceSignal = None):
signal = builder.get_signal(parse_date('2022-02-22'), PortfoliosRisk.FT9) signal = builder.get_signal(parse_date('2008-01-07'), PortfoliosRisk.FT9)
logger.info(signal) logger.info(signal)
@autowired(names={'builder': 'curve-drift'}) @autowired(names={'builder': 'curve-drift'})
......
...@@ -119,10 +119,10 @@ class BacktestExecutor(RoboExecutor): ...@@ -119,10 +119,10 @@ class BacktestExecutor(RoboExecutor):
now = dt.now() now = dt.now()
wait([self.async_build_hold(x) for x in PortfoliosRisk]) wait([self.async_build_hold(x) for x in PortfoliosRisk])
logger.info(f"build hold portfolios success, use[{(dt.now() - now).seconds}s]") logger.info(f"build hold portfolios success, use[{(dt.now() - now).seconds}s]")
logger.info("start to export report".center(50, '-')) # logger.info("start to export report".center(50, '-'))
now = dt.now() # now = dt.now()
file = self._export.export(max_date=self.end_date) # file = self._export.export(max_date=self.end_date)
logger.info(f"report file[{os.path.basename(file)}] exported successfully. use[{(dt.now() - now).seconds}s].") # logger.info(f"report file[{os.path.basename(file)}] exported successfully. use[{(dt.now() - now).seconds}s].")
@asynchronized(isolate=True) @asynchronized(isolate=True)
def async_build_risk_date(self, asset_id): def async_build_risk_date(self, asset_id):
......
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