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

fixed bug

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