Commit a56d4d0d authored by Dr.李's avatar Dr.李

fixed bug

parent 9b5ad813
...@@ -75,6 +75,7 @@ class FDataPack(object): ...@@ -75,6 +75,7 @@ class FDataPack(object):
codes: List=None, codes: List=None,
groups: Optional[np.ndarray]=None, groups: Optional[np.ndarray]=None,
benchmark: Optional[np.ndarray]=None, benchmark: Optional[np.ndarray]=None,
constraints: Optional[np.ndarray]=None,
risk_exp: Optional[np.ndarray]=None, risk_exp: Optional[np.ndarray]=None,
risk_names: List[str]=None): risk_names: List[str]=None):
...@@ -91,10 +92,11 @@ class FDataPack(object): ...@@ -91,10 +92,11 @@ class FDataPack(object):
else: else:
self.benchmark = None self.benchmark = None
self.risk_exp = risk_exp self.risk_exp = risk_exp
self.constraints = constraints
self.risk_names = risk_names self.risk_names = risk_names
def benchmark_risk_exp(self) -> np.ndarray: def benchmark_constraints(self) -> np.ndarray:
return self.benchmark @ self.risk_exp return self.benchmark @ self.constraints
def settle(self, weights: np.ndarray, dx_return: np.ndarray) -> pd.DataFrame: def settle(self, weights: np.ndarray, dx_return: np.ndarray) -> pd.DataFrame:
...@@ -151,6 +153,7 @@ def factor_analysis(factors: pd.DataFrame, ...@@ -151,6 +153,7 @@ def factor_analysis(factors: pd.DataFrame,
benchmark: Optional[np.ndarray]=None, benchmark: Optional[np.ndarray]=None,
risk_exp: Optional[np.ndarray]=None, risk_exp: Optional[np.ndarray]=None,
is_tradable: Optional[np.ndarray]=None, is_tradable: Optional[np.ndarray]=None,
constraints: Optional[np.ndarray]=None,
method='risk_neutral', method='risk_neutral',
**kwargs) -> Tuple[pd.DataFrame, Optional[pd.DataFrame]]: **kwargs) -> Tuple[pd.DataFrame, Optional[pd.DataFrame]]:
...@@ -160,7 +163,8 @@ def factor_analysis(factors: pd.DataFrame, ...@@ -160,7 +163,8 @@ def factor_analysis(factors: pd.DataFrame,
data_pack = FDataPack(raw_factors=factors.values, data_pack = FDataPack(raw_factors=factors.values,
groups=industry, groups=industry,
benchmark=benchmark, benchmark=benchmark,
risk_exp=risk_exp) risk_exp=risk_exp,
constraints=constraints)
er = data_pack.factor_processing([winsorize_normal, standardize], [standardize]) @ factor_weights er = data_pack.factor_processing([winsorize_normal, standardize], [standardize]) @ factor_weights
...@@ -177,12 +181,12 @@ def factor_analysis(factors: pd.DataFrame, ...@@ -177,12 +181,12 @@ def factor_analysis(factors: pd.DataFrame,
risk_lbound = kwargs['risk_bound'][0] risk_lbound = kwargs['risk_bound'][0]
risk_ubound = kwargs['risk_bound'][1] risk_ubound = kwargs['risk_bound'][1]
else: else:
risk_lbound = data_pack.benchmark_risk_exp() risk_lbound = data_pack.benchmark_constraints()
risk_ubound = data_pack.benchmark_risk_exp() risk_ubound = data_pack.benchmark_constraints()
weights = build_portfolio(er, weights = build_portfolio(er,
builder='linear', builder='linear',
risk_exposure=risk_exp, risk_constraints=constraints,
lbound=lbound, lbound=lbound,
ubound=ubound, ubound=ubound,
risk_target=(risk_lbound, risk_ubound), risk_target=(risk_lbound, risk_ubound),
......
...@@ -20,7 +20,6 @@ from alphamind.data.dbmodel.models import FactorMaster ...@@ -20,7 +20,6 @@ from alphamind.data.dbmodel.models import FactorMaster
from alphamind.data.dbmodel.models import Strategy from alphamind.data.dbmodel.models import Strategy
from alphamind.data.dbmodel.models import DailyReturn from alphamind.data.dbmodel.models import DailyReturn
from alphamind.data.dbmodel.models import IndexComponent from alphamind.data.dbmodel.models import IndexComponent
from alphamind.data.dbmodel.models import Universe as UniverseTable
from PyFin.api import advanceDateByCalendar from PyFin.api import advanceDateByCalendar
risk_styles = ['BETA', risk_styles = ['BETA',
...@@ -180,7 +179,7 @@ class SqlEngine(object): ...@@ -180,7 +179,7 @@ class SqlEngine(object):
total_data = {'risk_cov': risk_cov_data} total_data = {'risk_cov': risk_cov_data}
if benchmark: if benchmark:
query = select([IndexComponent.code, (IndexComponent.weight / 100.).lable('weight')]).where( query = select([IndexComponent.Code, (IndexComponent.weight / 100.).label('weight')]).where(
and_( and_(
IndexComponent.Date == ref_date, IndexComponent.Date == ref_date,
IndexComponent.indexCode == benchmark IndexComponent.indexCode == benchmark
...@@ -205,7 +204,7 @@ if __name__ == '__main__': ...@@ -205,7 +204,7 @@ if __name__ == '__main__':
import datetime as dt import datetime as dt
universe = Universe('zz500', ['zz500'], filter_cond=Uqer.BLEV >= 0.1) universe = Universe('zz500', ['zz500'], filter_cond=(Uqer.BLEV >= 0.1) & (Uqer.BLEV <= 0.1))
engine = SqlEngine(db_url) engine = SqlEngine(db_url)
ref_date = '2017-07-04' ref_date = '2017-07-04'
......
...@@ -18,13 +18,13 @@ solvers.options['glpk'] = {'msg_lev': 'GLP_MSG_OFF'} ...@@ -18,13 +18,13 @@ solvers.options['glpk'] = {'msg_lev': 'GLP_MSG_OFF'}
def linear_build(er: np.ndarray, def linear_build(er: np.ndarray,
lbound: Union[np.ndarray, float], lbound: Union[np.ndarray, float],
ubound: Union[np.ndarray, float], ubound: Union[np.ndarray, float],
risk_exposure: np.ndarray, risk_constraints: np.ndarray,
risk_target: Tuple[np.ndarray, np.ndarray], risk_target: Tuple[np.ndarray, np.ndarray],
solver: str=None) -> Tuple[str, np.ndarray, np.ndarray]: solver: str=None) -> Tuple[str, np.ndarray, np.ndarray]:
n, m = risk_exposure.shape n, m = risk_constraints.shape
w = cvxpy.Variable(n) w = cvxpy.Variable(n)
curr_risk_exposure = risk_exposure.T @ w curr_risk_exposure = risk_constraints.T @ w
if not risk_target: if not risk_target:
constraints = [w >= lbound, constraints = [w >= lbound,
......
...@@ -50,7 +50,8 @@ class TestFactorAnalysis(unittest.TestCase): ...@@ -50,7 +50,8 @@ class TestFactorAnalysis(unittest.TestCase):
d1returns=self.d1returns, d1returns=self.d1returns,
industry=industry, industry=industry,
benchmark=benchmark, benchmark=benchmark,
risk_exp=self.risk_factor) risk_exp=self.risk_factor,
constraints=self.risk_factor)
weight = weight_table.weight weight = weight_table.weight
...@@ -70,7 +71,8 @@ class TestFactorAnalysis(unittest.TestCase): ...@@ -70,7 +71,8 @@ class TestFactorAnalysis(unittest.TestCase):
d1returns=self.d1returns, d1returns=self.d1returns,
industry=industry, industry=industry,
benchmark=benchmark, benchmark=benchmark,
risk_exp=self.risk_factor) risk_exp=self.risk_factor,
constraints=self.risk_factor)
weight = weight_table.weight weight = weight_table.weight
self.assertEqual(analysis_table['er'].sum() / analysis_table['er'][-1], 2.0) self.assertEqual(analysis_table['er'].sum() / analysis_table['er'][-1], 2.0)
......
...@@ -273,12 +273,4 @@ def aggregate(groups, x, func, ddof=1): ...@@ -273,12 +273,4 @@ def aggregate(groups, x, func, ddof=1):
if __name__ == '__main__': if __name__ == '__main__':
pass
x1 = np.random.randint(30, size=1000) \ No newline at end of file
array = np.unique(x1)
x2 = np.random.randint(30, size=1000)
res = array_index(array, x2)
print(res)
\ No newline at end of file
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