Commit 2c487c1a authored by jichao's avatar jichao

依赖注入实现中

parent 3052be21
......@@ -223,6 +223,68 @@ class PortfoliosBuilder(ABC):
pass
class Solver(ABC):
'''
解算器
'''
def solve_max_rtn(self):
'''
:return: max_rtn, max_var, minCVaR_whenMaxR
'''
pass
def solve_min_rtn(self):
'''
:return: min_rtn, min_var, maxCVaR_whenMinR
'''
pass
def solve_mpt(self, min_rtn, max_rtn):
'''
常规mpt计算
:param min_rtn: 最小回报率
:param max_rtn: 最大回报率
:return: 投组,cvar
'''
pass
def solve_poem(self, min_rtn, max_rtn, base_cvar, max_cvar):
'''
poem方式的mpt计算
:param min_rtn: 最小回报率
:param max_rtn: 最大回报率
:param base_cvar: 基础cvar
:param max_cvar: 最大cvar
:return: 投组,cvar
'''
pass
def reset_navs(self, day):
'''
根据指定的日期,重置当前解算器,其他计算,全部依赖这里重置后的基金净值数据
:param day: 指定的日期
:return: 根据指定日期获取的,基金净值数据
'''
pass
@property
@abstractmethod
def navs(self):
'''
:return: 当前解算器需要的基金净值
'''
pass
class SolverFactory(ABC):
'''
解算器工厂
'''
@abstractmethod
def create_solver(self, risk: PortfoliosRisk, type: PortfoliosType = PortfoliosType.NORMAL) -> Solver:
pass
class SignalBuilder(ABC):
'''
控制信号,发起是否调仓服务
......
import json
from api import DatumType, Datum
from api import DatumType, Datum, PortfoliosRisk
from basic.dao import robo_base_datum as rbd
from framework import component, parse_date
......@@ -17,3 +17,6 @@ class DefaultDatum(Datum):
result = rbd.get_base_datums(type=DatumType.INDEX, ticker=ticker, datum_ids=index_ids)
return [{**json.loads(x['datas']), 'id': x['id']} for x in result]
def get_high_risk_datums(self, risk: PortfoliosRisk):
pass
......@@ -74,7 +74,7 @@ asset-pool:
threshold: -0.03
coef: 0.95
portfolios:
builder:
solver:
tol: 1E-10
navs:
months: 3
......
This diff is collapsed.
This diff is collapsed.
import unittest
from framework import autowired, parse_date, get_logger
from api import PortfoliosBuilder, PortfoliosType
from api import PortfoliosBuilder, PortfoliosType, PortfoliosRisk
class PortfoliosTest(unittest.TestCase):
......@@ -8,14 +8,19 @@ class PortfoliosTest(unittest.TestCase):
logger = get_logger(__name__)
@autowired(names={'builder': 'poem'})
def test_poem_portfolio_builder(self, builder: PortfoliosBuilder = None):
result, detail = builder.build_portfolio(parse_date('2011-11-07'), PortfoliosType.NORMAL)
def test_poem_build_portfolio(self, builder: PortfoliosBuilder = None):
result, detail = builder.build_portfolio(parse_date('2022-11-07'), PortfoliosType.NORMAL)
self.logger.info("portfolios: ")
for risk, portfolio in result.items():
self.logger.info(risk.name)
self.logger.info(portfolio)
self.logger.info(detail[risk])
@autowired(names={'builder': 'poem'})
def test_poem_get_portfolio(self, builder: PortfoliosBuilder = None):
portfolio = builder.get_portfolios(parse_date('2022-11-07'), PortfoliosRisk.FT9)
self.logger.info(portfolio)
if __name__ == '__main__':
unittest.main()
import unittest
class MyTestCase(unittest.TestCase):
def test_something(self):
self.assertEqual(True, True) # add assertion here
if __name__ == '__main__':
unittest.main()
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