Commit 4516bd33 authored by jichao's avatar jichao

回测报告增加基金池

parent 60ea7192
......@@ -89,7 +89,8 @@ portfolios: # 投组模块
solver: # 解算器相关
tol: 1E-10 # 误差满足条件
navs: # 净值要求
months: 3 # 需要几个月的净值数据
range: # 需要净值数据的区间, days: 90 表示90自然日,months: 3 表示3个自然月
days: 90
max-nan: # 最大缺失净值条件
asset: 8 # 单一资产最多缺少多少交易日数据,则踢出资产池
day: 0.5 # 单一交易日最多缺少百分之多少净值,则删除该交易日
......@@ -97,7 +98,7 @@ portfolios: # 投组模块
ft3: [ 2, 3 ] # 类似这样写,只要求ft3的投组资产风险等级
ft6: [ 2, 3, 4 ]
ft9: [ 2, 3, 4, 5 ]
matrix-rtn-days: 21 # 计算回报率矩阵时,回报率滚动天数
matrix-rtn-days: 20 # 计算回报率矩阵时,回报率滚动天数
asset-count: 5 # 投组资产个数。e.g. count 或 [min, max] 分别表示 最大最小都为count 或 最小为min 最大为max,另外这里也可以类似上面给不同风险等级分别配置
mpt: # mpt计算相关
cvar-beta: 0.2 # 计算Kbeta 需要用到
......
......@@ -214,7 +214,7 @@ class DefaultSolver(Solver):
exclude = self.get_config('navs.exclude-asset-type') or []
asset_ids = list(set(asset_ids) & set([x['id'] for x in datum if x['assetType'] not in exclude]))
min_date = day - relativedelta(months=self.get_config('navs.months'))
min_date = day - relativedelta(**self.get_config('navs.range'))
navs = pd.DataFrame(self._navs.get_fund_navs(fund_ids=asset_ids, max_date=day, min_date=min_date))
navs = navs[navs['nav_date'].dt.day_of_week < 5]
navs['nav_date'] = pd.to_datetime(navs['nav_date'])
......@@ -228,6 +228,8 @@ class DefaultSolver(Solver):
navs.drop(index=[x for x in navs_nan.index if navs_nan.loc[x] >= self.get_config('navs.max-nan.day')],
inplace=True)
navs.fillna(method='ffill', inplace=True)
if navs.iloc[0].isna().sum() > 0:
navs.fillna(method='bfill', inplace=True)
self.__navs = navs
def get_config(self, name):
......@@ -242,7 +244,7 @@ class DefaultSolver(Solver):
value = load_config(self._config[self.type.value] if self.type is not PortfoliosType.NORMAL else self._config)
if value is None:
value = load_config(self._config)
return value[f'ft{self.risk.value}'] if value and isinstance(value, dict) else value
return value[f'ft{self.risk.value}'] if value and isinstance(value, dict) and f'ft{self.risk.value}' in value else value
def debug_solve_result(self, model):
if logger.isEnabledFor(DEBUG):
......
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