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

using direct builder

parent efbb91b1
...@@ -185,9 +185,7 @@ def factor_analysis(factors: pd.DataFrame, ...@@ -185,9 +185,7 @@ def factor_analysis(factors: pd.DataFrame,
er = data_pack.factor_processing(pre_process, post_process, do_neutralize) @ factor_weights er = data_pack.factor_processing(pre_process, post_process, do_neutralize) @ factor_weights
if benchmark is not None and risk_exp is not None and method == 'risk_neutral': def create_constraints(benchmark, **kwargs):
# using linear programming portfolio builder
benchmark = benchmark.flatten()
if 'lbound' in kwargs: if 'lbound' in kwargs:
lbound = kwargs['lbound'] lbound = kwargs['lbound']
...@@ -212,25 +210,37 @@ def factor_analysis(factors: pd.DataFrame, ...@@ -212,25 +210,37 @@ def factor_analysis(factors: pd.DataFrame,
risk_lbound = data_pack.benchmark_constraints() risk_lbound = data_pack.benchmark_constraints()
risk_ubound = data_pack.benchmark_constraints() risk_ubound = data_pack.benchmark_constraints()
weights = build_portfolio(er, return lbound, ubound, cons_exp, risk_lbound, risk_ubound
builder='linear',
risk_constraints=cons_exp, if benchmark is not None and risk_exp is not None and method == 'risk_neutral':
lbound=lbound, lbound, ubound, cons_exp, risk_lbound, risk_ubound = create_constraints(benchmark, **kwargs)
ubound=ubound, status, _, weights = linear_build(er,
risk_target=(risk_lbound, risk_ubound), risk_constraints=cons_exp,
**kwargs) lbound=lbound,
ubound=ubound,
risk_target=(risk_lbound, risk_ubound))
if status != 'optimal':
raise ValueError('linear programming optimizer in status: {0}'.format(status))
elif method == 'rank': elif method == 'rank':
# using rank builder weights = rank_build(er, use_rank=kwargs['use_rank']).flatten()
weights = build_portfolio(er,
builder='rank',
**kwargs) / kwargs['use_rank']
elif method == 'ls' or method == 'long_short': elif method == 'ls' or method == 'long_short':
weights = build_portfolio(er, weights = long_short_build(er).flatten()
builder=method)
elif method == 'mv' or method == 'mean_variance': elif method == 'mv' or method == 'mean_variance':
weights = build_portfolio(er, lbound, ubound, cons_exp, risk_lbound, risk_ubound = create_constraints(benchmark, **kwargs)
builder=method) cov = kwargs['cov']
status, _, weights = mean_variance_builder(er,
cov=cov,
bm=benchmark,
lbound=lbound,
ubound=ubound,
risk_exposure=cons_exp,
risk_target=(risk_lbound, risk_ubound))
if status != 'optimal':
raise ValueError('mean variance optimizer in status: {0}'.format(status))
else:
raise ValueError("Unknown building tpe ({0})".format(method))
if detail_analysis: if detail_analysis:
analysis = data_pack.settle(weights, d1returns) analysis = data_pack.settle(weights, d1returns)
...@@ -241,6 +251,3 @@ def factor_analysis(factors: pd.DataFrame, ...@@ -241,6 +251,3 @@ def factor_analysis(factors: pd.DataFrame,
'er': er}, 'er': er},
index=factors.index),\ index=factors.index),\
analysis analysis
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