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

added weights for linear regression model

parent 3f80fe21
......@@ -590,6 +590,7 @@ class DailyPortfolios(Base):
industry = Column(String(50), nullable=False)
benchmark_weight = Column(Float(53), nullable=False)
is_tradable = Column(Boolean, nullable=False)
factor = Column(JSONB)
class DailyReturn(Base):
......
......@@ -21,8 +21,8 @@ Back test parameter settings
"""
start_date = '2012-01-01'
end_date = '2012-11-15'
benchmark_code = 300
end_date = '2017-11-20'
benchmark_code = 905
universe_name = ['zz500', 'hs300']
universe = Universe(universe_name, universe_name)
frequency = '5b'
......@@ -35,9 +35,9 @@ neutralize_risk = ['SIZE'] + industry_styles
constraint_risk = ['SIZE'] + industry_styles
size_risk_lower = 0
size_risk_upper = 0
turn_over_target_base = 0.25
turn_over_target_base = 0.05
weight_gaps = [0.01, 0.02, 0.03, 0.04]
benchmark_total_lower = 0.8
benchmark_total_lower = 1.
benchmark_total_upper = 1.
horizon = map_freq(frequency)
hedging_ratio = 0.
......@@ -101,7 +101,7 @@ for ref_date in ref_dates:
alpha_logger.info('trade_date: {0} training finished'.format(ref_date))
frequency = '5b'
frequency = '1b'
ref_dates = makeSchedule(start_date, end_date, frequency, 'china.sse')
const_model_factor_data = engine.fetch_data_range(universe,
......@@ -255,7 +255,7 @@ for weight_gap in weight_gaps:
leverage = result.weight_x.abs().sum()
ret = (result.weight_x - hedging_ratio * result.weight_y * leverage / result.weight_y.sum()).values @ result.dx.values
ret = (result.weight_x - hedging_ratio * result.weight_y * leverage / result.weight_y.sum()).values @ (np.exp(result.dx.values) - 1.)
rets.append(np.log(1. + ret))
executor.set_current(executed_pos)
turn_overs.append(turn_over)
......@@ -269,7 +269,7 @@ for weight_gap in weight_gaps:
# index return
index_return = engine.fetch_dx_return_index_range(benchmark_code, start_date, end_date, horizon=horizon,
offset=1).set_index('trade_date')
ret_df['index'] = np.log(index_return['dx'] + 1.)
ret_df['index'] = index_return['dx']
ret_df.loc[advanceDateByCalendar('china.sse', ref_dates[-1], frequency)] = 0.
ret_df = ret_df.shift(1)
......
......@@ -19,24 +19,23 @@ start = dt.datetime.now()
universe_name = 'zz500'
factor_name = 'ROIC'
expression = LAST(factor_name)
factor_name = 'PE'
expression = 1. / LAST(factor_name)
alpha_factor_name = 'alpha_factor'
alpha_factor_name = '1/PE'
alpha_factor = {alpha_factor_name: expression}
# end of formula definition
engine = SqlEngine('postgresql+psycopg2://postgres:A12345678!@10.63.6.220/alpha')
universe = Universe('custom', [universe_name])
benchmark_code = 905
neutralize_risk = ['SIZE'] + industry_styles
freq = '2w'
freq = '5b'
n_bins = 5
horizon = map_freq(freq)
start_date = '2012-01-01'
end_date = '2017-11-03'
end_date = '2017-11-20'
dates = makeSchedule(start_date,
end_date,
......@@ -45,17 +44,18 @@ dates = makeSchedule(start_date,
factor_all_data = engine.fetch_data_range(universe,
alpha_factor,
dates=dates,
benchmark=benchmark_code)['factor']
dates=dates)['factor']
return_all_data = engine.fetch_dx_return_range(universe, dates=dates, horizon=horizon)
factor_groups = factor_all_data.groupby('trade_date')
return_groups = return_all_data.groupby('trade_date')
final_res = np.zeros((len(dates), n_bins))
final_res = np.zeros((len(factor_groups.groups), n_bins))
index_dates = []
for i, value in enumerate(factor_groups):
date = value[0]
data = value[1][['code', alpha_factor_name, 'isOpen', 'weight'] + neutralize_risk]
data = value[1][['code', alpha_factor_name, 'isOpen'] + neutralize_risk]
codes = data.code.tolist()
ref_date = value[0].strftime('%Y-%m-%d')
returns = return_groups.get_group(date)
......@@ -63,7 +63,8 @@ for i, value in enumerate(factor_groups):
total_data = pd.merge(data, returns, on=['code']).dropna()
risk_exp = total_data[neutralize_risk].values.astype(float)
dx_return = total_data.dx.values
benchmark = total_data.weight.values
index_dates.append(date)
f_data = total_data[[alpha_factor_name]]
try:
......@@ -73,29 +74,28 @@ for i, value in enumerate(factor_groups):
post_process=[winsorize_normal, standardize])
res = er_quantile_analysis(er,
n_bins=n_bins,
dx_return=dx_return,
benchmark=benchmark)
dx_return=dx_return)
except Exception as e:
print(e)
res = np.zeros(n_bins)
final_res[i] = res / benchmark.sum()
final_res[i] = res
df = pd.DataFrame(final_res, index=dates)
df = pd.DataFrame(final_res, index=index_dates)
start_date = advanceDateByCalendar('china.sse', dates[0], '-1d')
df.loc[start_date] = 0.
df.sort_index(inplace=True)
fig, axes = plt.subplots(1, 2, figsize=(18, 6))
df = df.cumsum().plot(ax=axes[0], title='Quantile Analysis for {0}'.format(factor_name))
df = df.cumsum().plot(ax=axes[0], title='Quantile Analysis for {0}'.format(alpha_factor_name))
# =================================================================== #
factor_name = 'ROE'
expression = LAST(factor_name)
factor_name = 'PE'
expression = DIFF(1./LAST(factor_name))
alpha_factor_name = 'alpha_factor'
alpha_factor_name = '1/PE_1w_diff'
alpha_factor = {alpha_factor_name: expression}
dates = makeSchedule(start_date,
......@@ -105,17 +105,18 @@ dates = makeSchedule(start_date,
factor_all_data = engine.fetch_data_range(universe,
alpha_factor,
dates=dates,
benchmark=benchmark_code)['factor']
dates=dates)['factor']
return_all_data = engine.fetch_dx_return_range(universe, dates=dates, horizon=horizon)
factor_groups = factor_all_data.groupby('trade_date')
return_groups = return_all_data.groupby('trade_date')
final_res = np.zeros((len(dates), n_bins))
final_res = np.zeros((len(factor_groups.groups), n_bins))
index_dates = []
for i, value in enumerate(factor_groups):
date = value[0]
data = value[1][['code', alpha_factor_name, 'isOpen', 'weight'] + neutralize_risk]
data = value[1][['code', alpha_factor_name, 'isOpen'] + neutralize_risk]
codes = data.code.tolist()
ref_date = value[0].strftime('%Y-%m-%d')
returns = return_groups.get_group(date)
......@@ -123,7 +124,8 @@ for i, value in enumerate(factor_groups):
total_data = pd.merge(data, returns, on=['code']).dropna()
risk_exp = total_data[neutralize_risk].values.astype(float)
dx_return = total_data.dx.values
benchmark = total_data.weight.values
index_dates.append(date)
f_data = total_data[[alpha_factor_name]]
try:
......@@ -133,21 +135,20 @@ for i, value in enumerate(factor_groups):
post_process=[winsorize_normal, standardize])
res = er_quantile_analysis(er,
n_bins=n_bins,
dx_return=dx_return,
benchmark=benchmark)
dx_return=dx_return)
except Exception as e:
print(e)
res = np.zeros(n_bins)
final_res[i] = res / benchmark.sum()
final_res[i] = res
df = pd.DataFrame(final_res, index=dates)
df = pd.DataFrame(final_res, index=index_dates)
start_date = advanceDateByCalendar('china.sse', dates[0], '-1d')
df.loc[start_date] = 0.
df.sort_index(inplace=True)
df = df.cumsum().plot(ax=axes[1], title='Quantile Analysis for {0}'.format(factor_name))
df = df.cumsum().plot(ax=axes[1], title='Quantile Analysis for {0}'.format(alpha_factor_name))
plt.show()
print(dt.datetime.now() - start)
\ No newline at end of file
......@@ -90,6 +90,10 @@ class LinearRegression(ModelBase):
obj_layout.impl = pickle.loads(base64.decodebytes(encoded))
return obj_layout
@property
def weights(self):
return self.impl.coef_.tolist()
if __name__ == '__main__':
......
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