Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
A
alpha-mind
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Dr.李
alpha-mind
Commits
ed3131b1
Unverified
Commit
ed3131b1
authored
Jul 19, 2018
by
iLampard
Committed by
GitHub
Jul 19, 2018
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1 from alpha-miner/master
merge update
parents
d52e93db
e84b1fbf
Changes
14
Show whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
223 additions
and
279 deletions
+223
-279
api.py
alphamind/api.py
+2
-0
optimizers.pyx
alphamind/cython/optimizers.pyx
+19
-15
__init__.py
alphamind/model/__init__.py
+3
-0
linearmodel.py
alphamind/model/linearmodel.py
+5
-41
loader.py
alphamind/model/loader.py
+3
-0
modelbase.py
alphamind/model/modelbase.py
+39
-0
svm.py
alphamind/model/svm.py
+19
-0
treemodel.py
alphamind/model/treemodel.py
+6
-82
pfopt
alphamind/pfopt
+1
-1
meanvariancebuilder.py
alphamind/portfolio/meanvariancebuilder.py
+0
-1
strategy.py
alphamind/strategy/strategy.py
+122
-134
test_optimizers.py
alphamind/tests/cython/test_optimizers.py
+0
-4
test_meanvariancebuild.py
alphamind/tests/portfolio/test_meanvariancebuild.py
+3
-0
xgboost
xgboost
+1
-1
No files found.
alphamind/api.py
View file @
ed3131b1
...
@@ -43,6 +43,7 @@ from alphamind.model import RandomForestClassifier
...
@@ -43,6 +43,7 @@ from alphamind.model import RandomForestClassifier
from
alphamind.model
import
XGBRegressor
from
alphamind.model
import
XGBRegressor
from
alphamind.model
import
XGBClassifier
from
alphamind.model
import
XGBClassifier
from
alphamind.model
import
XGBTrainer
from
alphamind.model
import
XGBTrainer
from
alphamind.model
import
NvSVRModel
from
alphamind.model
import
load_model
from
alphamind.model
import
load_model
from
alphamind.model.data_preparing
import
fetch_data_package
from
alphamind.model.data_preparing
import
fetch_data_package
from
alphamind.model.data_preparing
import
fetch_train_phase
from
alphamind.model.data_preparing
import
fetch_train_phase
...
@@ -104,6 +105,7 @@ __all__ = [
...
@@ -104,6 +105,7 @@ __all__ = [
'XGBRegressor'
,
'XGBRegressor'
,
'XGBClassifier'
,
'XGBClassifier'
,
'XGBTrainer'
,
'XGBTrainer'
,
'NvSVRModel'
,
'load_model'
,
'load_model'
,
'NaiveExecutor'
,
'NaiveExecutor'
,
'ThresholdExecutor'
,
'ThresholdExecutor'
,
...
...
alphamind/cython/optimizers.pyx
View file @
ed3131b1
...
@@ -72,11 +72,11 @@ cdef extern from "tvoptimizer.hpp" namespace "pfopt":
...
@@ -72,11 +72,11 @@ cdef extern from "tvoptimizer.hpp" namespace "pfopt":
double*,
double*,
double*,
double*,
double,
double,
double,
int,
int,
double*,
double*,
double*,
double*,
double*) except +
double*,
string) except +
vector[double] xValue()
vector[double] xValue()
double feval()
double feval()
int status()
int status()
...
@@ -96,11 +96,11 @@ cdef class CVOptimizer:
...
@@ -96,11 +96,11 @@ cdef class CVOptimizer:
cnp.ndarray[double, ndim=2] cons_matrix=None,
cnp.ndarray[double, ndim=2] cons_matrix=None,
double[:] clbound=None,
double[:] clbound=None,
double[:] cubound=None,
double[:] cubound=None,
double target_low=0.0,
double target_vol=1.0,
double target_high=1.0,
cnp.ndarray[double, ndim=2] factor_cov_matrix=None,
cnp.ndarray[double, ndim=2] factor_cov_matrix=None,
cnp.ndarray[double, ndim=2] factor_loading_matrix=None,
cnp.ndarray[double, ndim=2] factor_loading_matrix=None,
double[:] idsync_risk=None):
double[:] idsync_risk=None,
str linear_solver="ma27"):
self.n = lbound.shape[0]
self.n = lbound.shape[0]
self.m = 0
self.m = 0
...
@@ -123,12 +123,12 @@ cdef class CVOptimizer:
...
@@ -123,12 +123,12 @@ cdef class CVOptimizer:
&cons[0],
&cons[0],
&clbound[0],
&clbound[0],
&cubound[0],
&cubound[0],
target_low,
target_vol,
target_high,
self.f,
self.f,
&factor_cov[0] if factor_cov is not None else NULL,
&factor_cov[0] if factor_cov is not None else NULL,
&factor_loading[0] if factor_loading is not None else NULL,
&factor_loading[0] if factor_loading is not None else NULL,
&idsync_risk[0] if idsync_risk is not None else NULL)
&idsync_risk[0] if idsync_risk is not None else NULL,
bytes(linear_solver, encoding='utf8'))
else:
else:
self.cobj = new TVOptimizer(self.n,
self.cobj = new TVOptimizer(self.n,
&expected_return[0],
&expected_return[0],
...
@@ -139,12 +139,12 @@ cdef class CVOptimizer:
...
@@ -139,12 +139,12 @@ cdef class CVOptimizer:
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
target_low,
target_vol,
target_high,
self.f,
self.f,
&factor_cov[0] if factor_cov is not None else NULL,
&factor_cov[0] if factor_cov is not None else NULL,
&factor_loading[0] if factor_loading is not None else NULL,
&factor_loading[0] if factor_loading is not None else NULL,
&idsync_risk[0] if idsync_risk is not None else NULL)
&idsync_risk[0] if idsync_risk is not None else NULL,
bytes(linear_solver, encoding='utf8'))
def __dealloc__(self):
def __dealloc__(self):
del self.cobj
del self.cobj
...
@@ -174,7 +174,8 @@ cdef extern from "mvoptimizer.hpp" namespace "pfopt":
...
@@ -174,7 +174,8 @@ cdef extern from "mvoptimizer.hpp" namespace "pfopt":
int,
int,
double*,
double*,
double*,
double*,
double*) except +
double*,
string) except +
vector[double] xValue()
vector[double] xValue()
double feval()
double feval()
int status()
int status()
...
@@ -213,7 +214,8 @@ cdef class QPOptimizer:
...
@@ -213,7 +214,8 @@ cdef class QPOptimizer:
double risk_aversion=1.0,
double risk_aversion=1.0,
cnp.ndarray[double, ndim=2] factor_cov_matrix=None,
cnp.ndarray[double, ndim=2] factor_cov_matrix=None,
cnp.ndarray[double, ndim=2] factor_loading_matrix=None,
cnp.ndarray[double, ndim=2] factor_loading_matrix=None,
double[:] idsync_risk=None):
double[:] idsync_risk=None,
str linear_solver='ma27'):
self.n = lbound.shape[0]
self.n = lbound.shape[0]
self.m = 0
self.m = 0
...
@@ -243,7 +245,8 @@ cdef class QPOptimizer:
...
@@ -243,7 +245,8 @@ cdef class QPOptimizer:
self.f,
self.f,
&factor_cov[0] if factor_cov is not None else NULL,
&factor_cov[0] if factor_cov is not None else NULL,
&factor_loading[0] if factor_loading is not None else NULL,
&factor_loading[0] if factor_loading is not None else NULL,
&idsync_risk[0] if idsync_risk is not None else NULL)
&idsync_risk[0] if idsync_risk is not None else NULL,
bytes(linear_solver, encoding='utf8'))
else:
else:
self.cobj = new MVOptimizer(self.n,
self.cobj = new MVOptimizer(self.n,
&expected_return[0],
&expected_return[0],
...
@@ -258,7 +261,8 @@ cdef class QPOptimizer:
...
@@ -258,7 +261,8 @@ cdef class QPOptimizer:
self.f,
self.f,
&factor_cov[0] if factor_cov is not None else NULL,
&factor_cov[0] if factor_cov is not None else NULL,
&factor_loading[0] if factor_loading is not None else NULL,
&factor_loading[0] if factor_loading is not None else NULL,
&idsync_risk[0] if idsync_risk is not None else NULL)
&idsync_risk[0] if idsync_risk is not None else NULL,
bytes(linear_solver, encoding='utf8'))
def __dealloc__(self):
def __dealloc__(self):
del self.cobj
del self.cobj
...
...
alphamind/model/__init__.py
View file @
ed3131b1
...
@@ -16,6 +16,8 @@ from alphamind.model.treemodel import XGBRegressor
...
@@ -16,6 +16,8 @@ from alphamind.model.treemodel import XGBRegressor
from
alphamind.model.treemodel
import
XGBClassifier
from
alphamind.model.treemodel
import
XGBClassifier
from
alphamind.model.treemodel
import
XGBTrainer
from
alphamind.model.treemodel
import
XGBTrainer
from
alphamind.model.svm
import
NvSVRModel
from
alphamind.model.loader
import
load_model
from
alphamind.model.loader
import
load_model
...
@@ -28,4 +30,5 @@ __all__ = ['LinearRegression',
...
@@ -28,4 +30,5 @@ __all__ = ['LinearRegression',
'XGBRegressor'
,
'XGBRegressor'
,
'XGBClassifier'
,
'XGBClassifier'
,
'XGBTrainer'
,
'XGBTrainer'
,
'NvSVRModel'
,
'load_model'
]
'load_model'
]
\ No newline at end of file
alphamind/model/linearmodel.py
View file @
ed3131b1
...
@@ -6,14 +6,11 @@ Created on 2017-5-10
...
@@ -6,14 +6,11 @@ Created on 2017-5-10
"""
"""
import
numpy
as
np
import
numpy
as
np
from
distutils.version
import
LooseVersion
from
sklearn
import
__version__
as
sklearn_version
from
sklearn.linear_model
import
LinearRegression
as
LinearRegressionImpl
from
sklearn.linear_model
import
LinearRegression
as
LinearRegressionImpl
from
sklearn.linear_model
import
Lasso
from
sklearn.linear_model
import
Lasso
from
sklearn.linear_model
import
LogisticRegression
as
LogisticRegressionImpl
from
sklearn.linear_model
import
LogisticRegression
as
LogisticRegressionImpl
from
PyFin.api
import
pyFinAssert
from
PyFin.api
import
pyFinAssert
from
alphamind.model.modelbase
import
ModelBase
from
alphamind.model.modelbase
import
create_model_base
from
alphamind.utilities
import
alpha_logger
class
ConstLinearModelImpl
(
object
):
class
ConstLinearModelImpl
(
object
):
...
@@ -35,7 +32,7 @@ class ConstLinearModelImpl(object):
...
@@ -35,7 +32,7 @@ class ConstLinearModelImpl(object):
return
1.
-
sse
/
ssto
return
1.
-
sse
/
ssto
class
ConstLinearModel
(
ModelBase
):
class
ConstLinearModel
(
create_model_base
()
):
def
__init__
(
self
,
def
__init__
(
self
,
features
=
None
,
features
=
None
,
...
@@ -63,7 +60,7 @@ class ConstLinearModel(ModelBase):
...
@@ -63,7 +60,7 @@ class ConstLinearModel(ModelBase):
return
self
.
impl
.
weights
.
tolist
()
return
self
.
impl
.
weights
.
tolist
()
class
LinearRegression
(
ModelBase
):
class
LinearRegression
(
create_model_base
(
'sklearn'
)
):
def
__init__
(
self
,
features
=
None
,
fit_intercept
:
bool
=
False
,
fit_target
=
None
,
**
kwargs
):
def
__init__
(
self
,
features
=
None
,
fit_intercept
:
bool
=
False
,
fit_target
=
None
,
**
kwargs
):
super
()
.
__init__
(
features
=
features
,
fit_target
=
fit_target
)
super
()
.
__init__
(
features
=
features
,
fit_target
=
fit_target
)
...
@@ -71,26 +68,15 @@ class LinearRegression(ModelBase):
...
@@ -71,26 +68,15 @@ class LinearRegression(ModelBase):
def
save
(
self
)
->
dict
:
def
save
(
self
)
->
dict
:
model_desc
=
super
()
.
save
()
model_desc
=
super
()
.
save
()
model_desc
[
'sklearn_version'
]
=
sklearn_version
model_desc
[
'weight'
]
=
self
.
impl
.
coef_
.
tolist
()
model_desc
[
'weight'
]
=
self
.
impl
.
coef_
.
tolist
()
return
model_desc
return
model_desc
@
classmethod
def
load
(
cls
,
model_desc
:
dict
):
obj_layout
=
super
()
.
load
(
model_desc
)
if
LooseVersion
(
sklearn_version
)
<
LooseVersion
(
model_desc
[
'sklearn_version'
]):
alpha_logger
.
warning
(
'Current sklearn version {0} is lower than the model version {1}. '
'Loaded model may work incorrectly.'
.
format
(
sklearn_version
,
model_desc
[
'sklearn_version'
]))
return
obj_layout
@
property
@
property
def
weights
(
self
):
def
weights
(
self
):
return
self
.
impl
.
coef_
.
tolist
()
return
self
.
impl
.
coef_
.
tolist
()
class
LassoRegression
(
ModelBase
):
class
LassoRegression
(
create_model_base
(
'sklearn'
)
):
def
__init__
(
self
,
alpha
=
0.01
,
features
=
None
,
fit_intercept
:
bool
=
False
,
fit_target
=
None
,
**
kwargs
):
def
__init__
(
self
,
alpha
=
0.01
,
features
=
None
,
fit_intercept
:
bool
=
False
,
fit_target
=
None
,
**
kwargs
):
super
()
.
__init__
(
features
=
features
,
fit_target
=
fit_target
)
super
()
.
__init__
(
features
=
features
,
fit_target
=
fit_target
)
...
@@ -98,26 +84,15 @@ class LassoRegression(ModelBase):
...
@@ -98,26 +84,15 @@ class LassoRegression(ModelBase):
def
save
(
self
)
->
dict
:
def
save
(
self
)
->
dict
:
model_desc
=
super
()
.
save
()
model_desc
=
super
()
.
save
()
model_desc
[
'sklearn_version'
]
=
sklearn_version
model_desc
[
'weight'
]
=
self
.
impl
.
coef_
.
tolist
()
model_desc
[
'weight'
]
=
self
.
impl
.
coef_
.
tolist
()
return
model_desc
return
model_desc
@
classmethod
def
load
(
cls
,
model_desc
:
dict
):
obj_layout
=
super
()
.
load
(
model_desc
)
if
LooseVersion
(
sklearn_version
)
<
LooseVersion
(
model_desc
[
'sklearn_version'
]):
alpha_logger
.
warning
(
'Current sklearn version {0} is lower than the model version {1}. '
'Loaded model may work incorrectly.'
.
format
(
sklearn_version
,
model_desc
[
'sklearn_version'
]))
return
obj_layout
@
property
@
property
def
weights
(
self
):
def
weights
(
self
):
return
self
.
impl
.
coef_
.
tolist
()
return
self
.
impl
.
coef_
.
tolist
()
class
LogisticRegression
(
ModelBase
):
class
LogisticRegression
(
create_model_base
(
'sklearn'
)
):
def
__init__
(
self
,
features
=
None
,
fit_intercept
:
bool
=
False
,
fit_target
=
None
,
**
kwargs
):
def
__init__
(
self
,
features
=
None
,
fit_intercept
:
bool
=
False
,
fit_target
=
None
,
**
kwargs
):
super
()
.
__init__
(
features
=
features
,
fit_target
=
fit_target
)
super
()
.
__init__
(
features
=
features
,
fit_target
=
fit_target
)
...
@@ -125,20 +100,9 @@ class LogisticRegression(ModelBase):
...
@@ -125,20 +100,9 @@ class LogisticRegression(ModelBase):
def
save
(
self
)
->
dict
:
def
save
(
self
)
->
dict
:
model_desc
=
super
()
.
save
()
model_desc
=
super
()
.
save
()
model_desc
[
'sklearn_version'
]
=
sklearn_version
model_desc
[
'weight'
]
=
self
.
impl
.
coef_
.
tolist
()
model_desc
[
'weight'
]
=
self
.
impl
.
coef_
.
tolist
()
return
model_desc
return
model_desc
@
classmethod
def
load
(
cls
,
model_desc
:
dict
):
obj_layout
=
super
()
.
load
(
model_desc
)
if
LooseVersion
(
sklearn_version
)
<
LooseVersion
(
model_desc
[
'sklearn_version'
]):
alpha_logger
.
warning
(
'Current sklearn version {0} is lower than the model version {1}. '
'Loaded model may work incorrectly.'
.
format
(
sklearn_version
,
model_desc
[
'sklearn_version'
]))
return
obj_layout
@
property
@
property
def
weights
(
self
):
def
weights
(
self
):
return
self
.
impl
.
coef_
.
tolist
()
return
self
.
impl
.
coef_
.
tolist
()
...
...
alphamind/model/loader.py
View file @
ed3131b1
...
@@ -15,6 +15,7 @@ from alphamind.model.treemodel import RandomForestClassifier
...
@@ -15,6 +15,7 @@ from alphamind.model.treemodel import RandomForestClassifier
from
alphamind.model.treemodel
import
XGBRegressor
from
alphamind.model.treemodel
import
XGBRegressor
from
alphamind.model.treemodel
import
XGBClassifier
from
alphamind.model.treemodel
import
XGBClassifier
from
alphamind.model.treemodel
import
XGBTrainer
from
alphamind.model.treemodel
import
XGBTrainer
from
alphamind.model.svm
import
NvSVRModel
def
load_model
(
model_desc
:
dict
)
->
ModelBase
:
def
load_model
(
model_desc
:
dict
)
->
ModelBase
:
...
@@ -40,5 +41,7 @@ def load_model(model_desc: dict) -> ModelBase:
...
@@ -40,5 +41,7 @@ def load_model(model_desc: dict) -> ModelBase:
return
XGBClassifier
.
load
(
model_desc
)
return
XGBClassifier
.
load
(
model_desc
)
elif
'XGBTrainer'
in
model_name_parts
:
elif
'XGBTrainer'
in
model_name_parts
:
return
XGBTrainer
.
load
(
model_desc
)
return
XGBTrainer
.
load
(
model_desc
)
elif
'NvSVR'
in
model_name_parts
:
return
NvSVRModel
.
load
(
model_desc
)
else
:
else
:
raise
ValueError
(
'{0} is not currently supported in model loader.'
.
format
(
model_name
))
raise
ValueError
(
'{0} is not currently supported in model loader.'
.
format
(
model_name
))
alphamind/model/modelbase.py
View file @
ed3131b1
...
@@ -6,10 +6,13 @@ Created on 2017-9-4
...
@@ -6,10 +6,13 @@ Created on 2017-9-4
"""
"""
import
abc
import
abc
from
distutils.version
import
LooseVersion
import
arrow
import
arrow
import
numpy
as
np
import
numpy
as
np
import
pandas
as
pd
import
pandas
as
pd
from
simpleutils.miscellaneous
import
list_eq
from
simpleutils.miscellaneous
import
list_eq
from
sklearn
import
__version__
as
sklearn_version
from
xgboost
import
__version__
as
xgbboot_version
from
alphamind.utilities
import
alpha_logger
from
alphamind.utilities
import
alpha_logger
from
alphamind.utilities
import
encode
from
alphamind.utilities
import
encode
from
alphamind.utilities
import
decode
from
alphamind.utilities
import
decode
...
@@ -84,3 +87,39 @@ class ModelBase(metaclass=abc.ABCMeta):
...
@@ -84,3 +87,39 @@ class ModelBase(metaclass=abc.ABCMeta):
obj_layout
.
fit_target
=
None
obj_layout
.
fit_target
=
None
return
obj_layout
return
obj_layout
def
create_model_base
(
party_name
=
None
):
if
not
party_name
:
return
ModelBase
else
:
class
ExternalLibBase
(
ModelBase
):
_lib_name
=
party_name
def
save
(
self
)
->
dict
:
model_desc
=
super
()
.
save
()
if
self
.
_lib_name
==
'sklearn'
:
model_desc
[
self
.
_lib_name
+
"_version"
]
=
sklearn_version
elif
self
.
_lib_name
==
'xgboost'
:
model_desc
[
self
.
_lib_name
+
"_version"
]
=
xgbboot_version
else
:
raise
ValueError
(
"3rd party lib name ({0}) is not recognized"
.
format
(
self
.
_lib_name
))
return
model_desc
@
classmethod
def
load
(
cls
,
model_desc
:
dict
):
obj_layout
=
super
()
.
load
(
model_desc
)
if
cls
.
_lib_name
==
'sklearn'
:
current_version
=
sklearn_version
elif
cls
.
_lib_name
==
'xgboost'
:
current_version
=
xgbboot_version
else
:
raise
ValueError
(
"3rd party lib name ({0}) is not recognized"
.
format
(
cls
.
_lib_name
))
if
LooseVersion
(
current_version
)
<
LooseVersion
(
model_desc
[
cls
.
_lib_name
+
"_version"
]):
alpha_logger
.
warning
(
'Current {2} version {0} is lower than the model version {1}. '
'Loaded model may work incorrectly.'
.
format
(
sklearn_version
,
model_desc
[
cls
.
_lib_name
],
cls
.
_lib_name
))
return
obj_layout
return
ExternalLibBase
alphamind/model/svm.py
0 → 100644
View file @
ed3131b1
# -*- coding: utf-8 -*-
"""
Created on 2018-7-9
@author: cheng.li
"""
from
sklearn.svm
import
NuSVR
from
alphamind.model.modelbase
import
create_model_base
class
NvSVRModel
(
create_model_base
(
'sklearn'
)):
def
__init__
(
self
,
features
=
None
,
fit_target
=
None
,
**
kwargs
):
super
()
.
__init__
(
features
=
features
,
fit_target
=
fit_target
)
self
.
impl
=
NuSVR
(
**
kwargs
)
alphamind/model/treemodel.py
View file @
ed3131b1
...
@@ -9,7 +9,6 @@ from distutils.version import LooseVersion
...
@@ -9,7 +9,6 @@ from distutils.version import LooseVersion
import
arrow
import
arrow
import
numpy
as
np
import
numpy
as
np
import
pandas
as
pd
import
pandas
as
pd
from
sklearn
import
__version__
as
sklearn_version
from
sklearn.ensemble
import
RandomForestRegressor
as
RandomForestRegressorImpl
from
sklearn.ensemble
import
RandomForestRegressor
as
RandomForestRegressorImpl
from
sklearn.ensemble
import
RandomForestClassifier
as
RandomForestClassifierImpl
from
sklearn.ensemble
import
RandomForestClassifier
as
RandomForestClassifierImpl
from
sklearn.model_selection
import
train_test_split
from
sklearn.model_selection
import
train_test_split
...
@@ -17,11 +16,11 @@ import xgboost as xgb
...
@@ -17,11 +16,11 @@ import xgboost as xgb
from
xgboost
import
__version__
as
xgbboot_version
from
xgboost
import
__version__
as
xgbboot_version
from
xgboost
import
XGBRegressor
as
XGBRegressorImpl
from
xgboost
import
XGBRegressor
as
XGBRegressorImpl
from
xgboost
import
XGBClassifier
as
XGBClassifierImpl
from
xgboost
import
XGBClassifier
as
XGBClassifierImpl
from
alphamind.model.modelbase
import
ModelB
ase
from
alphamind.model.modelbase
import
create_model_b
ase
from
alphamind.utilities
import
alpha_logger
from
alphamind.utilities
import
alpha_logger
class
RandomForestRegressor
(
ModelBase
):
class
RandomForestRegressor
(
create_model_base
(
'sklearn'
)
):
def
__init__
(
self
,
def
__init__
(
self
,
n_estimators
:
int
=
100
,
n_estimators
:
int
=
100
,
...
@@ -34,27 +33,12 @@ class RandomForestRegressor(ModelBase):
...
@@ -34,27 +33,12 @@ class RandomForestRegressor(ModelBase):
max_features
=
max_features
,
max_features
=
max_features
,
**
kwargs
)
**
kwargs
)
def
save
(
self
)
->
dict
:
model_desc
=
super
()
.
save
()
model_desc
[
'sklearn_version'
]
=
sklearn_version
return
model_desc
@
classmethod
def
load
(
cls
,
model_desc
:
dict
):
obj_layout
=
super
()
.
load
(
model_desc
)
if
LooseVersion
(
sklearn_version
)
<
LooseVersion
(
model_desc
[
'sklearn_version'
]):
alpha_logger
.
warning
(
'Current sklearn version {0} is lower than the model version {1}. '
'Loaded model may work incorrectly.'
.
format
(
sklearn_version
,
model_desc
[
'sklearn_version'
]))
return
obj_layout
@
property
@
property
def
importances
(
self
):
def
importances
(
self
):
return
self
.
impl
.
feature_importances_
.
tolist
()
return
self
.
impl
.
feature_importances_
.
tolist
()
class
RandomForestClassifier
(
ModelBase
):
class
RandomForestClassifier
(
create_model_base
(
'sklearn'
)
):
def
__init__
(
self
,
def
__init__
(
self
,
n_estimators
:
int
=
100
,
n_estimators
:
int
=
100
,
...
@@ -67,27 +51,12 @@ class RandomForestClassifier(ModelBase):
...
@@ -67,27 +51,12 @@ class RandomForestClassifier(ModelBase):
max_features
=
max_features
,
max_features
=
max_features
,
**
kwargs
)
**
kwargs
)
def
save
(
self
)
->
dict
:
model_desc
=
super
()
.
save
()
model_desc
[
'sklearn_version'
]
=
sklearn_version
return
model_desc
@
classmethod
def
load
(
cls
,
model_desc
:
dict
):
obj_layout
=
super
()
.
load
(
model_desc
)
if
LooseVersion
(
sklearn_version
)
<
LooseVersion
(
model_desc
[
'sklearn_version'
]):
alpha_logger
.
warning
(
'Current sklearn version {0} is lower than the model version {1}. '
'Loaded model may work incorrectly.'
.
format
(
sklearn_version
,
model_desc
[
'sklearn_version'
]))
return
obj_layout
@
property
@
property
def
importances
(
self
):
def
importances
(
self
):
return
self
.
impl
.
feature_importances_
.
tolist
()
return
self
.
impl
.
feature_importances_
.
tolist
()
class
XGBRegressor
(
ModelBase
):
class
XGBRegressor
(
create_model_base
(
'xgboost'
)
):
def
__init__
(
self
,
def
__init__
(
self
,
n_estimators
:
int
=
100
,
n_estimators
:
int
=
100
,
...
@@ -104,27 +73,12 @@ class XGBRegressor(ModelBase):
...
@@ -104,27 +73,12 @@ class XGBRegressor(ModelBase):
n_jobs
=
n_jobs
,
n_jobs
=
n_jobs
,
**
kwargs
)
**
kwargs
)
def
save
(
self
)
->
dict
:
model_desc
=
super
()
.
save
()
model_desc
[
'xgbboot_version'
]
=
xgbboot_version
return
model_desc
@
classmethod
def
load
(
cls
,
model_desc
:
dict
):
obj_layout
=
super
()
.
load
(
model_desc
)
if
LooseVersion
(
xgbboot_version
)
<
LooseVersion
(
model_desc
[
'xgbboot_version'
]):
alpha_logger
.
warning
(
'Current xgboost version {0} is lower than the model version {1}. '
'Loaded model may work incorrectly.'
.
format
(
xgbboot_version
,
model_desc
[
'xgbboot_version'
]))
return
obj_layout
@
property
@
property
def
importances
(
self
):
def
importances
(
self
):
return
self
.
impl
.
feature_importances_
.
tolist
()
return
self
.
impl
.
feature_importances_
.
tolist
()
class
XGBClassifier
(
ModelBase
):
class
XGBClassifier
(
create_model_base
(
'xgboost'
)
):
def
__init__
(
self
,
def
__init__
(
self
,
n_estimators
:
int
=
100
,
n_estimators
:
int
=
100
,
...
@@ -141,27 +95,12 @@ class XGBClassifier(ModelBase):
...
@@ -141,27 +95,12 @@ class XGBClassifier(ModelBase):
n_jobs
=
n_jobs
,
n_jobs
=
n_jobs
,
**
kwargs
)
**
kwargs
)
def
save
(
self
)
->
dict
:
model_desc
=
super
()
.
save
()
model_desc
[
'xgbboot_version'
]
=
xgbboot_version
return
model_desc
@
classmethod
def
load
(
cls
,
model_desc
:
dict
):
obj_layout
=
super
()
.
load
(
model_desc
)
if
LooseVersion
(
xgbboot_version
)
<
LooseVersion
(
model_desc
[
'xgbboot_version'
]):
alpha_logger
.
warning
(
'Current xgboost version {0} is lower than the model version {1}. '
'Loaded model may work incorrectly.'
.
format
(
xgbboot_version
,
model_desc
[
'xgbboot_version'
]))
return
obj_layout
@
property
@
property
def
importances
(
self
):
def
importances
(
self
):
return
self
.
impl
.
feature_importances_
.
tolist
()
return
self
.
impl
.
feature_importances_
.
tolist
()
class
XGBTrainer
(
ModelBase
):
class
XGBTrainer
(
create_model_base
(
'xgboost'
)
):
def
__init__
(
self
,
def
__init__
(
self
,
objective
=
'binary:logistic'
,
objective
=
'binary:logistic'
,
...
@@ -226,21 +165,6 @@ class XGBTrainer(ModelBase):
...
@@ -226,21 +165,6 @@ class XGBTrainer(ModelBase):
d_predict
=
xgb
.
DMatrix
(
x
[
self
.
features
]
.
values
)
d_predict
=
xgb
.
DMatrix
(
x
[
self
.
features
]
.
values
)
return
self
.
impl
.
predict
(
d_predict
)
return
self
.
impl
.
predict
(
d_predict
)
def
save
(
self
)
->
dict
:
model_desc
=
super
()
.
save
()
model_desc
[
'xgbboot_version'
]
=
xgbboot_version
return
model_desc
@
classmethod
def
load
(
cls
,
model_desc
:
dict
):
obj_layout
=
super
()
.
load
(
model_desc
)
if
LooseVersion
(
xgbboot_version
)
<
LooseVersion
(
model_desc
[
'xgbboot_version'
]):
alpha_logger
.
warning
(
'Current xgboost version {0} is lower than the model version {1}. '
'Loaded model may work incorrectly.'
.
format
(
xgbboot_version
,
model_desc
[
'xgbboot_version'
]))
return
obj_layout
@
property
@
property
def
importances
(
self
):
def
importances
(
self
):
imps
=
self
.
impl
.
get_fscore
()
.
items
()
imps
=
self
.
impl
.
get_fscore
()
.
items
()
...
...
pfopt
@
148fd8ee
Subproject commit
ffaf2153dfdce380c3d8aa1a69b328ab77665ad3
Subproject commit
148fd8eedca5aeff85d90e6374658d96316e7f66
alphamind/portfolio/meanvariancebuilder.py
View file @
ed3131b1
...
@@ -109,7 +109,6 @@ def target_vol_builder(er: np.ndarray,
...
@@ -109,7 +109,6 @@ def target_vol_builder(er: np.ndarray,
cons_mat
,
cons_mat
,
clbound
,
clbound
,
cubound
,
cubound
,
0.
,
vol_target
,
vol_target
,
risk_model
[
'factor_cov'
],
risk_model
[
'factor_cov'
],
risk_model
[
'factor_loading'
],
risk_model
[
'factor_loading'
],
...
...
alphamind/strategy/strategy.py
View file @
ed3131b1
...
@@ -23,6 +23,7 @@ from alphamind.data.engines.sqlengine import industry_styles
...
@@ -23,6 +23,7 @@ from alphamind.data.engines.sqlengine import industry_styles
from
alphamind.data.engines.sqlengine
import
macro_styles
from
alphamind.data.engines.sqlengine
import
macro_styles
from
alphamind.data.processing
import
factor_processing
from
alphamind.data.processing
import
factor_processing
from
alphamind.analysis.factoranalysis
import
er_portfolio_analysis
from
alphamind.analysis.factoranalysis
import
er_portfolio_analysis
from
alphamind.exceptions.exceptions
import
PortfolioBuilderException
all_styles
=
risk_styles
+
industry_styles
+
macro_styles
all_styles
=
risk_styles
+
industry_styles
+
macro_styles
...
@@ -73,6 +74,7 @@ class Strategy(object):
...
@@ -73,6 +74,7 @@ class Strategy(object):
self
.
total_data
=
None
self
.
total_data
=
None
self
.
index_return
=
None
self
.
index_return
=
None
self
.
risk_models
=
None
self
.
risk_models
=
None
self
.
alpha_models
=
None
def
prepare_backtest_data
(
self
):
def
prepare_backtest_data
(
self
):
total_factors
=
self
.
engine
.
fetch_factor_range
(
self
.
universe
,
total_factors
=
self
.
engine
.
fetch_factor_range
(
self
.
universe
,
...
@@ -120,6 +122,25 @@ class Strategy(object):
...
@@ -120,6 +122,25 @@ class Strategy(object):
offset
=
1
)
.
set_index
(
'trade_date'
)
offset
=
1
)
.
set_index
(
'trade_date'
)
self
.
total_data
=
total_data
self
.
total_data
=
total_data
def
prepare_backtest_models
(
self
):
if
self
.
total_data
is
None
:
self
.
prepare_backtest_data
()
total_data_groups
=
self
.
total_data
.
groupby
(
'trade_date'
)
if
self
.
dask_client
is
None
:
models
=
{}
for
ref_date
,
_
in
total_data_groups
:
models
[
ref_date
]
=
train_model
(
ref_date
.
strftime
(
'
%
Y-
%
m-
%
d'
),
self
.
alpha_model
,
self
.
data_meta
)
else
:
def
worker
(
parameters
):
new_model
=
train_model
(
parameters
[
0
]
.
strftime
(
'
%
Y-
%
m-
%
d'
),
parameters
[
1
],
parameters
[
2
])
return
parameters
[
0
],
new_model
l
=
self
.
dask_client
.
map
(
worker
,
[(
d
[
0
],
self
.
alpha_model
,
self
.
data_meta
)
for
d
in
total_data_groups
])
results
=
self
.
dask_client
.
gather
(
l
)
models
=
dict
(
results
)
self
.
alpha_models
=
models
alpha_logger
.
info
(
"alpha models training finished ..."
)
@
staticmethod
@
staticmethod
def
_create_lu_bounds
(
running_setting
,
codes
,
benchmark_w
):
def
_create_lu_bounds
(
running_setting
,
codes
,
benchmark_w
):
...
@@ -168,29 +189,19 @@ class Strategy(object):
...
@@ -168,29 +189,19 @@ class Strategy(object):
executor
=
copy
.
deepcopy
(
running_setting
.
executor
)
executor
=
copy
.
deepcopy
(
running_setting
.
executor
)
positions
=
pd
.
DataFrame
()
positions
=
pd
.
DataFrame
()
if
self
.
dask_client
is
None
:
if
self
.
alpha_models
is
None
:
models
=
{}
self
.
prepare_backtest_models
()
for
ref_date
,
_
in
total_data_groups
:
models
[
ref_date
]
=
train_model
(
ref_date
.
strftime
(
'
%
Y-
%
m-
%
d'
),
self
.
alpha_model
,
self
.
data_meta
)
else
:
def
worker
(
parameters
):
new_model
=
train_model
(
parameters
[
0
]
.
strftime
(
'
%
Y-
%
m-
%
d'
),
parameters
[
1
],
parameters
[
2
])
return
parameters
[
0
],
new_model
l
=
self
.
dask_client
.
map
(
worker
,
[(
d
[
0
],
self
.
alpha_model
,
self
.
data_meta
)
for
d
in
total_data_groups
])
results
=
self
.
dask_client
.
gather
(
l
)
models
=
dict
(
results
)
for
ref_date
,
this_data
in
total_data_groups
:
for
ref_date
,
this_data
in
total_data_groups
:
risk_model
=
self
.
risk_models
[
ref_date
]
risk_model
=
self
.
risk_models
[
ref_date
]
new_model
=
models
[
ref_date
]
new_model
=
self
.
alpha_
models
[
ref_date
]
codes
=
this_data
.
code
.
values
.
tolist
()
codes
=
this_data
.
code
.
values
.
tolist
()
if
previous_pos
.
empty
:
if
previous_pos
.
empty
:
current_position
=
None
current_position
=
None
else
:
else
:
previous_pos
.
set_index
(
'code'
,
inplace
=
True
)
previous_pos
.
set_index
(
'code'
,
inplace
=
True
)
remained_pos
=
previous_pos
.
loc
[
codes
]
remained_pos
=
previous_pos
.
reindex
(
codes
)
remained_pos
.
fillna
(
0.
,
inplace
=
True
)
remained_pos
.
fillna
(
0.
,
inplace
=
True
)
current_position
=
remained_pos
.
weight
.
values
current_position
=
remained_pos
.
weight
.
values
...
@@ -248,12 +259,12 @@ class Strategy(object):
...
@@ -248,12 +259,12 @@ class Strategy(object):
ret_df
=
ret_df
.
shift
(
1
)
ret_df
=
ret_df
.
shift
(
1
)
ret_df
.
iloc
[
0
]
=
0.
ret_df
.
iloc
[
0
]
=
0.
ret_df
[
'excess_return'
]
=
ret_df
[
'returns'
]
-
ret_df
[
'benchmark_returns'
]
*
ret_df
[
'leverage'
]
ret_df
[
'excess_return'
]
=
ret_df
[
'returns'
]
-
ret_df
[
'benchmark_returns'
]
*
ret_df
[
'leverage'
]
return
ret_df
,
positions
return
ret_df
,
positions
def
_calculate_pos
(
self
,
running_setting
,
er
,
data
,
constraints
,
benchmark_w
,
lbound
,
ubound
,
risk_model
,
def
_calculate_pos
(
self
,
running_setting
,
er
,
data
,
constraints
,
benchmark_w
,
lbound
,
ubound
,
risk_model
,
current_position
):
current_position
):
more_opts
=
running_setting
.
more_opts
more_opts
=
running_setting
.
more_opts
try
:
target_pos
,
_
=
er_portfolio_analysis
(
er
,
target_pos
,
_
=
er_portfolio_analysis
(
er
,
industry
=
data
.
industry_name
.
values
,
industry
=
data
.
industry_name
.
values
,
dx_return
=
None
,
dx_return
=
None
,
...
@@ -267,6 +278,19 @@ class Strategy(object):
...
@@ -267,6 +278,19 @@ class Strategy(object):
target_vol
=
more_opts
.
get
(
'target_vol'
),
target_vol
=
more_opts
.
get
(
'target_vol'
),
risk_model
=
risk_model
,
risk_model
=
risk_model
,
turn_over_target
=
more_opts
.
get
(
'turn_over_target'
))
turn_over_target
=
more_opts
.
get
(
'turn_over_target'
))
except
PortfolioBuilderException
:
alpha_logger
.
warning
(
"Not able to fit the constraints. Using full re-balance."
)
target_pos
,
_
=
er_portfolio_analysis
(
er
,
industry
=
data
.
industry_name
.
values
,
dx_return
=
None
,
constraints
=
constraints
,
detail_analysis
=
False
,
benchmark
=
benchmark_w
,
method
=
running_setting
.
rebalance_method
,
lbound
=
lbound
,
ubound
=
ubound
,
target_vol
=
more_opts
.
get
(
'target_vol'
),
risk_model
=
risk_model
)
return
target_pos
return
target_pos
...
@@ -291,44 +315,23 @@ if __name__ == '__main__':
...
@@ -291,44 +315,23 @@ if __name__ == '__main__':
mpl
.
rcParams
[
'font.sans-serif'
]
=
[
'SimHei'
]
mpl
.
rcParams
[
'font.sans-serif'
]
=
[
'SimHei'
]
mpl
.
rcParams
[
'axes.unicode_minus'
]
=
False
mpl
.
rcParams
[
'axes.unicode_minus'
]
=
False
# Back test parameter settings
"""
start_date
=
'2016-01-01'
Back test parameter settings
end_date
=
'2018-06-11'
"""
benchmark_code
=
905
universe
=
Universe
(
'zz800'
)
+
Universe
(
'cyb'
)
start_date
=
'2011-01-01'
end_date
=
'2011-05-04'
freq
=
'10b'
freq
=
'10b'
industry_name
=
'sw_adj'
neutralized_risk
=
None
industry_level
=
1
turn_over_target
=
0.4
batch
=
1
horizon
=
map_freq
(
freq
)
weights_bandwidth
=
0.02
universe
=
Universe
(
'zz800'
)
data_source
=
os
.
environ
[
'DB_URI'
]
benchmark_code
=
300
method
=
'risk_neutral'
# Model settings
alpha_factors
=
{
alpha_factors
=
{
'ep_q_cs'
:
CSQuantiles
(
LAST
(
'ep_q'
),
groups
=
'sw1_adj'
),
'ep_q_cs'
:
CSQuantiles
(
LAST
(
'ep_q'
),
groups
=
'sw1_adj'
)
'roe_q_cs'
:
CSQuantiles
(
LAST
(
'roe_q'
),
groups
=
'sw1_adj'
),
'SGRO_cs'
:
CSQuantiles
(
LAST
(
'SGRO'
),
groups
=
'sw1_adj'
),
'GREV_cs'
:
CSQuantiles
(
LAST
(
'GREV'
),
groups
=
'sw1_adj'
),
'con_peg_rolling_cs'
:
CSQuantiles
(
LAST
(
'con_peg_rolling'
),
groups
=
'sw1_adj'
),
'con_pe_rolling_order_cs'
:
CSQuantiles
(
LAST
(
'con_pe_rolling_order'
),
groups
=
'sw1_adj'
),
'IVR_cs'
:
CSQuantiles
(
LAST
(
'IVR'
),
groups
=
'sw1_adj'
),
'ILLIQUIDITY_cs'
:
CSQuantiles
(
LAST
(
'ILLIQUIDITY'
)
*
LAST
(
'NegMktValue'
),
groups
=
'sw1_adj'
),
'DividendPaidRatio_cs'
:
CSQuantiles
(
LAST
(
'DividendPaidRatio'
),
groups
=
'sw1_adj'
),
}
}
weights
=
dict
(
ep_q_cs
=
1.
,
weights
=
dict
(
ep_q_cs
=
1.
)
roe_q_cs
=
1.
,
SGRO_cs
=
0.0
,
GREV_cs
=
0.0
,
con_peg_rolling_cs
=-
0.25
,
con_pe_rolling_order_cs
=-
0.25
,
IVR_cs
=
0.5
,
ILLIQUIDITY_cs
=
0.5
,
DividendPaidRatio_cs
=
0.5
)
alpha_model
=
ConstLinearModel
(
features
=
alpha_factors
,
weights
=
weights
)
alpha_model
=
ConstLinearModel
(
features
=
alpha_factors
,
weights
=
weights
)
...
@@ -338,86 +341,71 @@ if __name__ == '__main__':
...
@@ -338,86 +341,71 @@ if __name__ == '__main__':
neutralized_risk
=
None
,
neutralized_risk
=
None
,
pre_process
=
None
,
pre_process
=
None
,
post_process
=
None
,
post_process
=
None
,
data_source
=
data_source
)
data_source
=
os
.
environ
[
'DB_URI'
])
strategy
=
Strategy
(
alpha_model
,
data_meta
,
universe
=
universe
,
start_date
=
start_date
,
end_date
=
end_date
,
freq
=
freq
,
benchmark
=
benchmark_code
)
strategy
.
prepare_backtest_data
()
# Constraintes settings
industry_names
=
industry_list
(
industry_name
,
industry_level
)
def
create_scenario
(
weights_bandwidth
=
0.02
,
target_vol
=
0.01
,
method
=
'risk_neutral'
):
constraint_risk
=
[
'SIZE'
,
'BETA'
]
industry_names
=
industry_list
(
'sw_adj'
,
1
)
total_risk_names
=
constraint_risk
+
[
'benchmark'
,
'total
'
]
constraint_risk
=
[
'EARNYILD'
,
'LIQUIDTY'
,
'GROWTH'
,
'SIZE'
,
'BETA'
,
'MOMENTUM
'
]
all_styles
=
risk_styles
+
industry_names
+
macro_styles
total_risk_names
=
constraint_risk
+
industry_names
+
[
'benchmark'
,
'total'
]
b_type
=
[]
b_type
=
[]
l_val
=
[]
l_val
=
[]
u_val
=
[]
u_val
=
[]
previous_pos
=
pd
.
DataFrame
()
rets
=
[]
turn_overs
=
[]
leverags
=
[]
for
name
in
total_risk_names
:
for
name
in
total_risk_names
:
if
name
==
'benchmark'
:
if
name
==
'benchmark'
:
b_type
.
append
(
BoundaryType
.
RELATIVE
)
b_type
.
append
(
BoundaryType
.
RELATIVE
)
l_val
.
append
(
0.8
)
l_val
.
append
(
0.8
)
u_val
.
append
(
1.0
)
u_val
.
append
(
1.001
)
elif
name
==
'total'
:
elif
name
==
'total'
:
b_type
.
append
(
BoundaryType
.
ABSOLUTE
)
b_type
.
append
(
BoundaryType
.
ABSOLUTE
)
l_val
.
append
(
.0
)
l_val
.
append
(
-
0.001
)
u_val
.
append
(
.0
)
u_val
.
append
(
.001
)
elif
name
==
'EARNYILD'
:
elif
name
==
'EARNYILD'
:
b_type
.
append
(
BoundaryType
.
ABSOLUTE
)
b_type
.
append
(
BoundaryType
.
ABSOLUTE
)
l_val
.
append
(
0.00
)
l_val
.
append
(
-
0.001
)
u_val
.
append
(
0.60
)
u_val
.
append
(
0.60
)
elif
name
==
'GROWTH'
:
elif
name
==
'GROWTH'
:
b_type
.
append
(
BoundaryType
.
ABSOLUTE
)
b_type
.
append
(
BoundaryType
.
ABSOLUTE
)
l_val
.
append
(
-
0.05
)
l_val
.
append
(
-
0.20
)
u_val
.
append
(
0.05
)
u_val
.
append
(
0.20
)
elif
name
==
'MOMENTUM'
:
elif
name
==
'MOMENTUM'
:
b_type
.
append
(
BoundaryType
.
ABSOLUTE
)
b_type
.
append
(
BoundaryType
.
ABSOLUTE
)
l_val
.
append
(
0.2
0
)
l_val
.
append
(
-
0.1
0
)
u_val
.
append
(
0.20
)
u_val
.
append
(
0.20
)
elif
name
==
'SIZE'
:
elif
name
==
'SIZE'
:
b_type
.
append
(
BoundaryType
.
ABSOLUTE
)
b_type
.
append
(
BoundaryType
.
ABSOLUTE
)
l_val
.
append
(
-
0.05
)
l_val
.
append
(
-
0.20
)
u_val
.
append
(
0.05
)
u_val
.
append
(
0.20
)
elif
name
==
'LIQUIDTY'
:
elif
name
==
'LIQUIDTY'
:
b_type
.
append
(
BoundaryType
.
ABSOLUTE
)
b_type
.
append
(
BoundaryType
.
ABSOLUTE
)
l_val
.
append
(
-
0.40
)
l_val
.
append
(
-
0.25
)
u_val
.
append
(
-
0.0
)
u_val
.
append
(
0.25
)
elif
benchmark_code
==
905
and
name
not
in
[
"计算机"
,
"医药生物"
,
"国防军工"
,
"信息服务"
,
"机械设备"
]
and
name
in
industry_names
:
b_type
.
append
(
BoundaryType
.
RELATIVE
)
l_val
.
append
(
0.8
)
u_val
.
append
(
1.0
)
elif
benchmark_code
==
300
and
name
in
[
"银行"
,
"保险"
,
"证券"
,
"多元金融"
]:
b_type
.
append
(
BoundaryType
.
RELATIVE
)
l_val
.
append
(
0.70
)
u_val
.
append
(
0.90
)
elif
name
in
[
"计算机"
,
"医药生物"
,
"国防军工"
,
"信息服务"
,
"机械设备"
]:
b_type
.
append
(
BoundaryType
.
ABSOLUTE
)
l_val
.
append
(
0.0
)
u_val
.
append
(
0.05
)
else
:
else
:
b_type
.
append
(
BoundaryType
.
ABSOLUTE
)
b_type
.
append
(
BoundaryType
.
ABSOLUTE
)
l_val
.
append
(
-
0.002
)
l_val
.
append
(
-
0.01
)
u_val
.
append
(
0.002
)
u_val
.
append
(
0.01
)
bounds
=
create_box_bounds
(
total_risk_names
,
b_type
,
l_val
,
u_val
)
bounds
=
create_box_bounds
(
total_risk_names
,
b_type
,
l_val
,
u_val
)
# Running settings
running_setting
=
RunningSetting
(
weights_bandwidth
=
weights_bandwidth
,
running_setting
=
RunningSetting
(
weights_bandwidth
=
weights_bandwidth
,
rebalance_method
=
method
,
rebalance_method
=
method
,
bounds
=
bounds
,
bounds
=
bounds
,
turn_over_target
=
turn_over_target
)
target_vol
=
target_vol
,
turn_over_target
=
0.4
)
# Strategy
ret_df
,
positions
=
strategy
.
run
(
running_setting
)
strategy
=
Strategy
(
alpha_model
,
return
ret_df
data_meta
,
universe
=
universe
,
start_date
=
start_date
,
end_date
=
end_date
,
freq
=
freq
,
benchmark
=
benchmark_code
)
strategy
.
prepare_backtest_data
()
ret_df
,
positions
=
strategy
.
run
(
running_setting
=
running_setting
)
create_scenario
(
0.01
,
target_vol
=
0.01
,
method
=
'tv'
)
\ No newline at end of file
\ No newline at end of file
alphamind/tests/cython/test_optimizers.py
View file @
ed3131b1
...
@@ -116,7 +116,6 @@ class TestOptimizers(unittest.TestCase):
...
@@ -116,7 +116,6 @@ class TestOptimizers(unittest.TestCase):
None
,
None
,
None
,
None
,
None
,
None
,
target_vol
,
target_vol
)
target_vol
)
# check against known good result
# check against known good result
...
@@ -144,7 +143,6 @@ class TestOptimizers(unittest.TestCase):
...
@@ -144,7 +143,6 @@ class TestOptimizers(unittest.TestCase):
cons
,
cons
,
clbound
,
clbound
,
cubound
,
cubound
,
target_vol
,
target_vol
)
target_vol
)
# check against known good result
# check against known good result
...
@@ -173,7 +171,6 @@ class TestOptimizers(unittest.TestCase):
...
@@ -173,7 +171,6 @@ class TestOptimizers(unittest.TestCase):
cons
,
cons
,
clbound
,
clbound
,
cubound
,
cubound
,
0.
,
target_vol
,
target_vol
,
factor_var
,
factor_var
,
factor_load
,
factor_load
,
...
@@ -204,7 +201,6 @@ class TestOptimizers(unittest.TestCase):
...
@@ -204,7 +201,6 @@ class TestOptimizers(unittest.TestCase):
cons
,
cons
,
clbound
,
clbound
,
cubound
,
cubound
,
0.
,
target_vol
)
target_vol
)
# check against known good result
# check against known good result
...
...
alphamind/tests/portfolio/test_meanvariancebuild.py
View file @
ed3131b1
...
@@ -57,6 +57,9 @@ class TestMeanVarianceBuild(unittest.TestCase):
...
@@ -57,6 +57,9 @@ class TestMeanVarianceBuild(unittest.TestCase):
status
,
_
,
x
=
mean_variance_builder
(
er
,
model
,
bm
,
lbound
,
ubound
,
None
,
None
,
lam
=
1
)
status
,
_
,
x
=
mean_variance_builder
(
er
,
model
,
bm
,
lbound
,
ubound
,
None
,
None
,
lam
=
1
)
np
.
testing
.
assert_array_almost_equal
(
x
,
np
.
linalg
.
inv
(
cov
)
@
er
)
np
.
testing
.
assert_array_almost_equal
(
x
,
np
.
linalg
.
inv
(
cov
)
@
er
)
def
test_mean_variance_builder_without_constraints_with_factor_model
(
self
):
pass
def
test_mean_variance_builder_with_none_unity_lambda
(
self
):
def
test_mean_variance_builder_with_none_unity_lambda
(
self
):
er
=
np
.
array
([
0.01
,
0.02
,
0.03
])
er
=
np
.
array
([
0.01
,
0.02
,
0.03
])
cov
=
np
.
array
([[
0.02
,
0.01
,
0.02
],
cov
=
np
.
array
([[
0.02
,
0.01
,
0.02
],
...
...
xgboost
@
a187ed6c
Subproject commit
5cd851ccef8cf0a0a71094d0d0e33a9d102f1f55
Subproject commit
a187ed6c8f3aa40b47d5be80667cbbe6a6fd563d
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment