Commit 4440b488 authored by Dr.李's avatar Dr.李

modified

parent 903df29d
...@@ -1074,19 +1074,18 @@ class Uqer(Base): ...@@ -1074,19 +1074,18 @@ class Uqer(Base):
class SecurityMaster(Base): class SecurityMaster(Base):
__tablename__ = 'security_master' __tablename__ = 'security_master'
Code = Column(Integer, primary_key=True) exchangeCD = Column(String(4))
exchangeCD = Column(Text())
ListSectorCD = Column(BigInteger) ListSectorCD = Column(BigInteger)
ListSector = Column(Text()) ListSector = Column(String(6))
transCurrCD = Column(Text()) transCurrCD = Column(Text())
secShortName = Column(Text()) secShortName = Column(String(10))
secFullName = Column(Text()) secFullName = Column(Text())
listStatusCD = Column(Text()) listStatusCD = Column(String(2))
listDate = Column(DateTime) listDate = Column(DateTime)
delistDate = Column(DateTime) delistDate = Column(DateTime)
equTypeCD = Column(Text()) equTypeCD = Column(String(4))
equType = Column(Text()) equType = Column(String(10))
exCountryCD = Column(Text()) exCountryCD = Column(String(3))
partyID = Column(BigInteger) partyID = Column(BigInteger)
totalShares = Column(Float(53)) totalShares = Column(Float(53))
nonrestFloatShares = Column(Float(53)) nonrestFloatShares = Column(Float(53))
...@@ -1095,6 +1094,7 @@ class SecurityMaster(Base): ...@@ -1095,6 +1094,7 @@ class SecurityMaster(Base):
primeOperating = Column(Text()) primeOperating = Column(Text())
endDate = Column(DateTime) endDate = Column(DateTime)
TShEquity = Column(Float(53)) TShEquity = Column(Float(53))
Code = Column(Integer, primary_key=True)
if __name__ == '__main__': if __name__ == '__main__':
......
...@@ -11,69 +11,89 @@ from matplotlib import pyplot as plt ...@@ -11,69 +11,89 @@ from matplotlib import pyplot as plt
from PyFin.api import makeSchedule from PyFin.api import makeSchedule
from alphamind.api import * from alphamind.api import *
strategies = {
'prod': {
'factors': ['RVOL', 'EPS', 'DROEAfterNonRecurring', 'DivP', 'CFinc1', 'BDTO'],
'weights': [0.05, 0.3, 0.35, 0.075, 0.15, 0.05]
},
'candidate': {
'factors': ['RVOL', 'EPS', 'CFinc1', 'BDTO', 'VAL', 'GREV', 'ROEDiluted'],
'weights': [0.02, 0.2, 0.15, 0.05, 0.2, 0.2, 0.2]
}
}
engine = SqlEngine("mssql+pymssql://licheng:A12345678!@10.63.6.220/alpha") engine = SqlEngine("mssql+pymssql://licheng:A12345678!@10.63.6.220/alpha")
universe = Universe('custom', ['zz500']) universe = Universe('custom', ['zz500'])
benchmark_code = 905
neutralize_risk = ['SIZE'] + industry_styles neutralize_risk = ['SIZE'] + industry_styles
constraint_risk = ['SIZE'] + industry_styles constraint_risk = ['SIZE'] + industry_styles
n_bins = 5 n_bins = 5
factors = ['ROEDiluted'] dates = makeSchedule('2012-01-14',
factor_weights = np.array([1.])
dates = makeSchedule('2017-01-01',
'2017-08-14', '2017-08-14',
tenor='1w', tenor='1w',
calendar='china.sse') calendar='china.sse')
final_res = np.zeros((len(dates), n_bins)) final_res = np.zeros((len(dates), n_bins))
rets = []
total_data_dict = {}
for i, date in enumerate(dates):
print(date) for strategy in strategies:
ref_date = date.strftime('%Y-%m-%d') factors = strategies[strategy]['factors']
factor_weights = strategies[strategy]['weights']
codes = engine.fetch_codes(ref_date, universe)
rets = []
data = engine.fetch_data(ref_date, factors, codes, 905) for i, date in enumerate(dates):
returns = engine.fetch_dx_return(ref_date, codes, horizon=4) ref_date = date.strftime('%Y-%m-%d')
total_data = pd.merge(data['factor'], returns, on=['Code']).dropna() codes = engine.fetch_codes(ref_date, universe)
risk_exp = total_data[neutralize_risk].values.astype(float)
industry = total_data.industry_code.values data = engine.fetch_data(ref_date, factors, codes, benchmark_code)
dx_return = total_data.dx.values returns = engine.fetch_dx_return(ref_date, codes, horizon=4)
benchmark = total_data.weight.values
total_data = pd.merge(data['factor'], returns, on=['Code']).dropna()
constraint_exp = total_data[constraint_risk].values print(date, ': ', len(total_data))
risk_exp_expand = np.concatenate((constraint_exp, np.ones((len(risk_exp), 1))), axis=1).astype(float) risk_exp = total_data[neutralize_risk].values.astype(float)
industry = total_data.industry_code.values
risk_names = constraint_risk + ['total'] dx_return = total_data.dx.values
risk_target = risk_exp_expand.T @ benchmark benchmark = total_data.weight.values
lbound = np.zeros(len(total_data)) constraint_exp = total_data[constraint_risk].values
ubound = 0.01 + benchmark risk_exp_expand = np.concatenate((constraint_exp, np.ones((len(risk_exp), 1))), axis=1).astype(float)
constraint = Constraints(risk_exp_expand, risk_names) risk_names = constraint_risk + ['total']
for i, name in enumerate(risk_names): risk_target = risk_exp_expand.T @ benchmark
constraint.set_constraints(name, lower_bound=risk_target[i], upper_bound=risk_target[i])
lbound = np.zeros(len(total_data))
f_data = total_data[factors] ubound = 0.01 + benchmark
try:
pos, analysis = factor_analysis(f_data, constraint = Constraints(risk_exp_expand, risk_names)
factor_weights, for i, name in enumerate(risk_names):
industry=industry, constraint.set_constraints(name, lower_bound=risk_target[i], upper_bound=risk_target[i])
d1returns=dx_return,
risk_exp=risk_exp, f_data = total_data[factors]
benchmark=benchmark, try:
is_tradable=total_data.isOpen.values.astype(bool), pos, analysis = factor_analysis(f_data,
method='risk_neutral', factor_weights,
constraints=constraint) industry=industry,
except: d1returns=dx_return,
print(date, ' is error!') risk_exp=risk_exp,
rets.append(0.) benchmark=benchmark,
else: is_tradable=total_data.isOpen.values.astype(bool),
rets.append(analysis.er[-1]) method='risk_neutral',
constraints=constraint,
ret_series = pd.Series(rets, dates) use_rank=100)
ret_series.cumsum().plot(figsize=(12, 6)) except Exception as e:
plt.title('{0} weekly reblance'.format(factors)) print(e)
plt.show() rets.append(0.)
else:
rets.append(analysis.er[-1] / benchmark.sum())
total_data_dict[strategy] = rets
ret_df = pd.DataFrame(total_data_dict, index=dates)
ret_df.cumsum().plot(figsize=(12, 6))
plt.savefig("backtest_big_universe_20170814.png")
...@@ -12,48 +12,56 @@ from PyFin.api import makeSchedule ...@@ -12,48 +12,56 @@ from PyFin.api import makeSchedule
from alphamind.api import * from alphamind.api import *
engine = SqlEngine("mssql+pymssql://licheng:A12345678!@10.63.6.220/alpha") engine = SqlEngine("mssql+pymssql://licheng:A12345678!@10.63.6.220/alpha")
universe = Universe('custom', ['zz500']) #engine = SqlEngine('postgresql+psycopg2://postgres:A12345678!@10.63.6.220/alpha')
universe = Universe('custom', ['pm500_mirror'])
neutralize_risk = ['SIZE'] + industry_styles neutralize_risk = ['SIZE'] + industry_styles
n_bins = 5 n_bins = 5
factors = ['ROEDiluted']
factor_weights = np.array([1.]) factor_weights = np.array([1.])
dates = makeSchedule('2017-01-01', dates = makeSchedule('2016-08-14',
'2017-08-14', '2017-08-14',
tenor='1w', tenor='1w',
calendar='china.sse') calendar='china.sse')
final_res = np.zeros((len(dates), n_bins)) prod_factors = ['EARNYILD', 'ROAEBIT']
for factor in prod_factors:
factors = [factor]
final_res = np.zeros((len(dates), n_bins))
for i, date in enumerate(dates):
ref_date = date.strftime('%Y-%m-%d')
for i, date in enumerate(dates): codes = engine.fetch_codes(ref_date, universe)
print(date)
ref_date = date.strftime('%Y-%m-%d')
codes = engine.fetch_codes(ref_date, universe) data = engine.fetch_data(ref_date, factors, codes, 905)
returns = engine.fetch_dx_return(ref_date, codes, horizon=4)
data = engine.fetch_data(ref_date, factors, codes, 905) total_data = pd.merge(data['factor'], returns, on=['Code']).dropna()
returns = engine.fetch_dx_return(ref_date, codes, horizon=4) print(date, ': ', len(total_data))
risk_exp = total_data[neutralize_risk].values.astype(float)
dx_return = total_data.dx.values
benchmark = total_data.weight.values
total_data = pd.merge(data['factor'], returns, on=['Code']).dropna() f_data = total_data[factors]
risk_exp = total_data[neutralize_risk].values.astype(float) try:
dx_return = total_data.dx.values res = quantile_analysis(f_data,
benchmark = total_data.weight.values factor_weights,
dx_return,
risk_exp=risk_exp,
n_bins=n_bins,
benchmark=benchmark)
except Exception as e:
print(e)
res = np.zeros(n_bins)
f_data = total_data[factors] final_res[i] = res / benchmark.sum()
try:
res = quantile_analysis(f_data,
factor_weights,
dx_return,
risk_exp=risk_exp,
n_bins=n_bins,
benchmark=benchmark)
except:
print(date, ' is error!')
res = np.zeros(n_bins)
final_res[i] = res df = pd.DataFrame(final_res, index=dates)
df.cumsum().plot(figsize=(12, 6))
plt.title('{0} weekly re-balance'.format(factors[0]))
plt.savefig('{0}_big_universe_20170814.png'.format(factors[0]))
df = pd.DataFrame(final_res, index=dates)
df.cumsum().plot(figsize=(12, 6))
plt.title('{0} weekly reblance'.format(factors))
plt.show() plt.show()
\ 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