Commit 92b565e1 authored by jichao's avatar jichao

回测报告增加基金池

parent 938ef10c
......@@ -208,12 +208,13 @@ reports: # 报告模块相关
backtest: # 回测导出曹策略
exist-build: on # 如果报告文件存在,是否重新构建文件
save-path: ${EXPORT_PATH:excels} # 导出报告文件存放路径,如果以./或者../开头,则会以执行python文件为根目录,如果以/开头,则为系统绝对路径,否则,以项目目录为根目录
file-name: ${EXPORT_FILENAME:asset-pool}
file-name: ${EXPORT_FILENAME:asset-pool-mpt}
include-report: # 需要导出的报告类型列表,下面的顺序,也代表了excel中sheet的顺序
# - navs-report # 净值报告
# - hold-report # 持仓报告
# - signal-report # 信号报告
- asset-pool-report # 基金池报告
- mpt-report # 最优投组报告
# - benckmark-report # benckmark报告
# - indicators-report # 各种特殊指标报告
# - fixed-range-report # 固定区间收益报告
......@@ -224,8 +225,8 @@ robo-executor: # 执行器相关
backtest: # 回测执行器相关
start-date: 2008-01-02 # 回测起始日期
end-date: 2022-11-01 # 回测截止日期
start-step: 1 # 回测从哪一步开始执行 1:计算资产ewma;2:计算资产池;3:计算最优投组:4:计算再平衡信号以及持仓投组
end-step: 2 # 回测从哪一步执行完成后结束执行 1:计算资产ewma;2:计算资产池;3:计算最优投组:4:计算再平衡信号以及持仓投组
start-step: 4 # 回测从哪一步开始执行 1:计算资产ewma;2:计算资产池;3:计算最优投组:4:计算再平衡信号以及持仓投组
end-step: 4 # 回测从哪一步执行完成后结束执行 1:计算资产ewma;2:计算资产池;3:计算最优投组:4:计算再平衡信号以及持仓投组
clean-up: on
real: # 实盘执行器
start-date: 2022-11-01 # 实盘开始时间
......
import json
import logging
from datetime import datetime as dt
from typing import List
from py_jftech import component, autowired, format_date
from pymysql import IntegrityError, constants
from api import PortfoliosBuilder, PortfoliosRisk, AssetPool, Navs, PortfoliosType, Datum, SolveType, SolverFactory
from api import PortfoliosBuilder, PortfoliosRisk, AssetPool, Navs, PortfoliosType, Datum, SolveType, SolverFactory, RoboReportor, DatumType
from portfolios.dao import robo_mpt_portfolios as rmp
logger = logging.getLogger(__name__)
......@@ -106,3 +108,43 @@ class PoemPortfoliosBuilder(MptPortfoliosBuilder):
}
detail[risk]['mpt_cvar'] = mpt_cvar
return result, detail
@component(bean_name='mpt-report')
class MptReportor(RoboReportor):
@autowired
def __init__(self, datum: Datum = None):
self._datum = datum
@property
def report_name(self) -> str:
return '最优投组'
def load_report(self, max_date=dt.today(), min_date=None) -> List[dict]:
results = []
datums = {x['id']: x for x in self._datum.get_datums(type=DatumType.FUND)}
for portfolio in rmp.get_list(max_date=max_date, min_date=min_date):
solve_type = SolveType(portfolio['solve'])
datas = {
'date': portfolio['date'],
'risk': PortfoliosRisk(portfolio['risk']).name,
'type': PortfoliosType(portfolio['type']).name,
'solve': solve_type.name,
'cvar': portfolio['cvar']
}
if solve_type is not SolveType.INFEASIBLE:
for asset_id, weight in json.loads(portfolio['portfolio']).items():
datum = datums[int(asset_id)]
results.append({
**datas,
'ft_ticker': datum['ftTicker'],
'lipper_id': datum['lipperKey'],
'bloomberg_ticker': datum['bloombergTicker'],
'name': datum['chineseName'],
'weight': weight,
})
else:
results.append(datas)
return results
......@@ -37,3 +37,16 @@ def get_one(day, type: PortfoliosType, risk: PortfoliosRisk):
select {','.join([f"{x[0]} as {x[1]}" for x in __COLUMNS__.items()])} from robo_mpt_portfolios
{where(rmp_date=day, rmp_risk=risk, rmp_type=type)}
'''
@read
def get_list(max_date=None, min_date=None, type: PortfoliosType = None, risk: PortfoliosRisk = None):
sqls = []
if max_date:
sqls.append(f"rmp_date <= '{format_date(max_date)}'")
if min_date:
sqls.append(f"rmp_date >= '{format_date(min_date)}'")
return f'''
select {','.join([f"{x[0]} as {x[1]}" for x in __COLUMNS__.items()])} from robo_mpt_portfolios
{where(*sqls, rmp_risk=risk, rmp_type=type)}
'''
......@@ -23,7 +23,7 @@ class RebalanceTest(unittest.TestCase):
@autowired(names={'builder': 'crisis_two'})
def test_crisis_two(self, builder: RebalanceSignal = None):
start = parse_date('2018-07-06')
start = parse_date('2008-01-02')
end = start + relativedelta(years=3)
while start < end:
signal = builder.is_trigger(start, PortfoliosRisk.FT9)
......
......@@ -31,7 +31,7 @@ class ReportTest(unittest.TestCase):
@autowired(names={'reportor': 'backtest-export'})
def test_backtest_export(self, exportor: RoboExportor = None):
path = exportor.export(max_date=parse_date('2022-06-01'))
path = exportor.export(max_date=parse_date('2022-11-01'))
logger.info(path)
......
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