Commit 8f574deb authored by Dr.李's avatar Dr.李

with simpler engine

parent 651c34cb
...@@ -49,7 +49,6 @@ class DataMeta(object): ...@@ -49,7 +49,6 @@ class DataMeta(object):
warm_start: int = 0, warm_start: int = 0,
data_source: str = None): data_source: str = None):
self.data_source = data_source self.data_source = data_source
self.engine = SqlEngine(self.data_source)
self.freq = freq self.freq = freq
self.universe = universe self.universe = universe
self.batch = batch self.batch = batch
...@@ -108,7 +107,7 @@ class DataMeta(object): ...@@ -108,7 +107,7 @@ class DataMeta(object):
def fetch_train_data(self, def fetch_train_data(self,
ref_date, ref_date,
alpha_model: ModelBase): alpha_model: ModelBase):
return fetch_train_phase(self.engine, return fetch_train_phase(SqlEngine(self.data_source),
alpha_model.formulas, alpha_model.formulas,
ref_date, ref_date,
self.freq, self.freq,
...@@ -124,7 +123,7 @@ class DataMeta(object): ...@@ -124,7 +123,7 @@ class DataMeta(object):
def fetch_predict_data(self, def fetch_predict_data(self,
ref_date: str, ref_date: str,
alpha_model: ModelBase): alpha_model: ModelBase):
return fetch_predict_phase(self.engine, return fetch_predict_phase(SqlEngine(self.data_source),
alpha_model.formulas, alpha_model.formulas,
ref_date, ref_date,
self.freq, self.freq,
......
...@@ -17,6 +17,7 @@ from alphamind.portfolio.constraints import LinearConstraints ...@@ -17,6 +17,7 @@ from alphamind.portfolio.constraints import LinearConstraints
from alphamind.portfolio.constraints import BoundaryType from alphamind.portfolio.constraints import BoundaryType
from alphamind.portfolio.constraints import create_box_bounds from alphamind.portfolio.constraints import create_box_bounds
from alphamind.execution.naiveexecutor import NaiveExecutor from alphamind.execution.naiveexecutor import NaiveExecutor
from alphamind.data.engines.sqlengine import SqlEngine
from alphamind.data.engines.sqlengine import risk_styles from alphamind.data.engines.sqlengine import risk_styles
from alphamind.data.engines.sqlengine import industry_styles from alphamind.data.engines.sqlengine import industry_styles
from alphamind.data.engines.sqlengine import macro_styles from alphamind.data.engines.sqlengine import macro_styles
...@@ -60,11 +61,13 @@ class Strategy(object): ...@@ -60,11 +61,13 @@ class Strategy(object):
def __init__(self, def __init__(self,
alpha_model, alpha_model,
data_meta, data_meta,
running_setting): running_setting,
dask_client=None):
self.alpha_model = alpha_model self.alpha_model = alpha_model
self.data_meta = data_meta self.data_meta = data_meta
self.running_setting = running_setting self.running_setting = running_setting
self.engine = self.data_meta.engine self.engine = SqlEngine(self.data_meta.data_source)
self.dask_client = dask_client
def run(self): def run(self):
alpha_logger.info("starting backting ...") alpha_logger.info("starting backting ...")
...@@ -151,7 +154,7 @@ class Strategy(object): ...@@ -151,7 +154,7 @@ class Strategy(object):
risk_factors=this_data[self.data_meta.neutralized_risk].values.astype(float) if self.data_meta.neutralized_risk else None, risk_factors=this_data[self.data_meta.neutralized_risk].values.astype(float) if self.data_meta.neutralized_risk else None,
post_process=self.data_meta.post_process) post_process=self.data_meta.post_process)
er = new_model.predict(pd.DataFrame(new_factors, columns=features)) er = new_model.predict(pd.DataFrame(new_factors, columns=features)).astype(float)
alpha_logger.info('{0} re-balance: {1} codes'.format(ref_date, len(er))) alpha_logger.info('{0} re-balance: {1} codes'.format(ref_date, len(er)))
target_pos = self._calculate_pos(er, target_pos = self._calculate_pos(er,
...@@ -226,14 +229,15 @@ if __name__ == '__main__': ...@@ -226,14 +229,15 @@ if __name__ == '__main__':
from PyFin.api import * from PyFin.api import *
from alphamind.api import Universe from alphamind.api import Universe
from alphamind.api import ConstLinearModel from alphamind.api import ConstLinearModel
from alphamind.api import XGBTrainer
from alphamind.api import DataMeta from alphamind.api import DataMeta
from alphamind.api import industry_list from alphamind.api import industry_list
from alphamind.api import winsorize_normal from alphamind.api import winsorize_normal
from alphamind.api import standardize from alphamind.api import standardize
start_date = '2010-01-01' start_date = '2017-01-01'
end_date = '2018-04-27' end_date = '2018-05-04'
freq = '10b' freq = '5b'
neutralized_risk = None neutralized_risk = None
universe = Universe("custom", ['zz800', 'cyb']) universe = Universe("custom", ['zz800', 'cyb'])
...@@ -249,89 +253,32 @@ if __name__ == '__main__': ...@@ -249,89 +253,32 @@ if __name__ == '__main__':
'f09': CSQuantiles(LAST('DividendPaidRatio'), groups='sw1_adj'), 'f09': CSQuantiles(LAST('DividendPaidRatio'), groups='sw1_adj'),
} }
# alpha_factors = { alpha_model = XGBTrainer(objective='reg:linear',
# 'f01': LAST('ep_q'), booster='gbtree',
# 'f02': LAST('roe_q'), n_estimators=300,
# 'f03': LAST('SGRO'), eval_sample=0.25,
# 'f04': LAST('GREV'), features=alpha_factors)
# 'f05': LAST('con_target_price'),
# 'f06': LAST('con_pe_rolling_order'),
# 'f07': LAST('IVR'),
# 'f08': LAST('ILLIQUIDITY'),
# }
weights = dict(
f01=0.5,
f02=1.,
f03=1.,
f04=1.,
f05=-1.,
f06=-0.5,
f07=0.5,
f08=0.5,
f09=0.5
)
alpha_model = ConstLinearModel(features=alpha_factors, weights=weights)
data_meta = DataMeta(freq=freq, data_meta = DataMeta(freq=freq,
universe=universe, universe=universe,
batch=1, batch=32,
neutralized_risk=None, # industry_styles, neutralized_risk=None, # industry_styles,
pre_process=None, # [winsorize_normal, standardize], pre_process=None, # [winsorize_normal, standardize],
post_process=None) # [standardize]) post_process=None) # [standardize])
industries = industry_list('sw_adj', 1) industries = industry_list('sw_adj', 1)
total_risk_names = ['benchmark', 'total'] + \ total_risk_names = ['total']
['EARNYILD', 'LIQUIDTY', 'GROWTH', 'SIZE', 'BETA', 'MOMENTUM'] + \
industry_list('sw_adj', 1)
b_type = [] b_type = []
l_val = [] l_val = []
u_val = [] u_val = []
for name in total_risk_names: for name in total_risk_names:
if name == 'benchmark': if name == 'total':
b_type.append(BoundaryType.RELATIVE)
l_val.append(0.8)
u_val.append(1.0)
elif name == 'total':
b_type.append(BoundaryType.ABSOLUTE) b_type.append(BoundaryType.ABSOLUTE)
l_val.append(.0) l_val.append(.0)
u_val.append(.0) u_val.append(.0)
elif name == 'EARNYILD':
b_type.append(BoundaryType.ABSOLUTE)
l_val.append(0.00)
u_val.append(0.20)
elif name == 'GROWTH':
b_type.append(BoundaryType.ABSOLUTE)
l_val.append(0.00)
u_val.append(0.20)
elif name == 'MOMENTUM':
b_type.append(BoundaryType.ABSOLUTE)
l_val.append(0.20)
u_val.append(0.20)
elif name == 'SIZE':
b_type.append(BoundaryType.ABSOLUTE)
l_val.append(-0.2)
u_val.append(0.0)
elif name == 'LIQUIDTY':
b_type.append(BoundaryType.ABSOLUTE)
l_val.append(-0.40)
u_val.append(-0.20)
elif name in ["银行", "保险", "证券", "多元金融"]:
b_type.append(BoundaryType.RELATIVE)
l_val.append(0.8)
u_val.append(0.8)
elif name in ["计算机", "医药生物", "国防军工", "信息服务", "机械设备"]:
b_type.append(BoundaryType.RELATIVE)
l_val.append(1.0)
u_val.append(2.0)
else:
b_type.append(BoundaryType.ABSOLUTE)
l_val.append(0)
u_val.append(0)
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)
......
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