Commit f8f83edd authored by wenwen.tang's avatar wenwen.tang 😕

加入一个指定月份删除某档基金的功能

parent 4a5dbfe8
import logging
import sys import sys
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from datetime import datetime as dt from datetime import datetime as dt
...@@ -6,6 +7,8 @@ from typing import List ...@@ -6,6 +7,8 @@ from typing import List
from py_jftech import get_config, parse_date from py_jftech import get_config, parse_date
logger = logging.getLogger(__name__)
@unique @unique
class BacktestStep(Enum): class BacktestStep(Enum):
......
...@@ -42,7 +42,7 @@ class SortinoAssetOptimize(AssetOptimize, ABC): ...@@ -42,7 +42,7 @@ class SortinoAssetOptimize(AssetOptimize, ABC):
pass pass
@abstractmethod @abstractmethod
def get_groups(self): def get_groups(self, day=None):
''' '''
:return: 返回待处理的id数组 :return: 返回待处理的id数组
''' '''
...@@ -122,7 +122,7 @@ class FundDividendSortinoAssetOptimize(SortinoAssetOptimize): ...@@ -122,7 +122,7 @@ class FundDividendSortinoAssetOptimize(SortinoAssetOptimize):
min_dates = self.nav_min_dates min_dates = self.nav_min_dates
max_incept_date = sorted([(day - relativedelta(**x)) for x in self.delta_kwargs])[0] max_incept_date = sorted([(day - relativedelta(**x)) for x in self.delta_kwargs])[0]
max_incept_date = max_incept_date if is_workday(max_incept_date) else next_workday(max_incept_date) max_incept_date = max_incept_date if is_workday(max_incept_date) else next_workday(max_incept_date)
for fund_group in self.get_groups(): for fund_group in self.get_groups(day):
fund_group = [x for x in fund_group if min_dates[x] <= max_incept_date] fund_group = [x for x in fund_group if min_dates[x] <= max_incept_date]
if len(fund_group) > self.optimize_count: if len(fund_group) > self.optimize_count:
pool.extend(self.find_optimize(tuple(fund_group), day)[0]) pool.extend(self.find_optimize(tuple(fund_group), day)[0])
...@@ -132,8 +132,16 @@ class FundDividendSortinoAssetOptimize(SortinoAssetOptimize): ...@@ -132,8 +132,16 @@ class FundDividendSortinoAssetOptimize(SortinoAssetOptimize):
last_one = rop.get_last_one(day=day, type=AssetPoolType.OPTIMIZE) last_one = rop.get_last_one(day=day, type=AssetPoolType.OPTIMIZE)
return json.loads(last_one['asset_ids']) return json.loads(last_one['asset_ids'])
def get_filtered_funds(self): def get_filtered_funds(self, day):
funds = self._datum.get_datums(type=DatumType.FUND) funds = self._datum.get_datums(type=DatumType.FUND)
if get_config('portfolios.checker.month-fund-filter'):
# 如果有按月剔除
filters = get_config('portfolios.checker.month-fund-filter')
excludes = filters.get(day.month)
if excludes:
for f in funds[:]:
if f['bloombergTicker'] in excludes:
funds.remove(f)
if self.asset_filter: if self.asset_filter:
filters = list(self.asset_filter.keys())[0] filters = list(self.asset_filter.keys())[0]
funds_in = [] funds_in = []
...@@ -143,8 +151,8 @@ class FundDividendSortinoAssetOptimize(SortinoAssetOptimize): ...@@ -143,8 +151,8 @@ class FundDividendSortinoAssetOptimize(SortinoAssetOptimize):
return funds_in return funds_in
return funds return funds
def get_groups(self): def get_groups(self, day=None):
funds = pd.DataFrame(self.get_filtered_funds()) funds = pd.DataFrame(self.get_filtered_funds(day))
result = [] result = []
if self.asset_include: if self.asset_include:
include = list(self.asset_include.keys())[0] include = list(self.asset_include.keys())[0]
......
...@@ -34,7 +34,7 @@ py-jftech: ...@@ -34,7 +34,7 @@ py-jftech:
port: ${MYSQL_PORT:3306} port: ${MYSQL_PORT:3306}
user: ${MYSQL_USER:root} user: ${MYSQL_USER:root}
password: ${MYSQL_PWD:changeit} password: ${MYSQL_PWD:changeit}
dbname: ${MYSQL_DBNAME:mdiv_prr3} # mdiv_prr3 dbname: ${MYSQL_DBNAME:j_robo} # mdiv_prr3
injectable: injectable:
names: names:
backtest: robo_executor.BacktestExecutor backtest: robo_executor.BacktestExecutor
...@@ -115,7 +115,7 @@ portfolios: # 投组模块 ...@@ -115,7 +115,7 @@ portfolios: # 投组模块
checker: #投组检测模块 checker: #投组检测模块
switch: on #是否开启检查 switch: on #是否开启检查
custom-type-priority: [3,2,1,4] # 检测优先级 custom-type-priority: [3,2,1,4] # 检测优先级
month-fund-filter: {2:['TEMSCFA LX Equity'],12:['TEMHYAD LX Equity','TEMFIAI LX Equity']} # 根据月份删除某几档基金
reports: # 报告模块相关 reports: # 报告模块相关
navs: navs:
type: FUND type: FUND
...@@ -245,7 +245,7 @@ robo-executor: # 执行器相关 ...@@ -245,7 +245,7 @@ robo-executor: # 执行器相关
sealing-period: 10 #调仓封闭期 sealing-period: 10 #调仓封闭期
start-step: ${BACKTEST_START_STEP:1} # 回测从哪一步开始执行 1:计算资产池;2:计算最优投组:3:计算再平衡信号以及持仓投组 start-step: ${BACKTEST_START_STEP:1} # 回测从哪一步开始执行 1:计算资产池;2:计算最优投组:3:计算再平衡信号以及持仓投组
end-step: ${BACKTEST_END_STEP:3} # 回测从哪一步执行完成后结束执行 1:计算资产池;2:计算最优投组:3:计算再平衡信号以及持仓投组 end-step: ${BACKTEST_END_STEP:3} # 回测从哪一步执行完成后结束执行 1:计算资产池;2:计算最优投组:3:计算再平衡信号以及持仓投组
clean-up: off clean-up: on
real: # 实盘执行器 real: # 实盘执行器
export: ${EXPORT_ENABLE:off} # 是否开启报告 export: ${EXPORT_ENABLE:off} # 是否开启报告
start-date: 2023-05-08 # 实盘开始时间 start-date: 2023-05-08 # 实盘开始时间
......
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