Commit 0b987f3e authored by Dr.李's avatar Dr.李

update store and analysis

parent 6eb178dc
...@@ -162,7 +162,8 @@ def factor_analysis(factors: pd.DataFrame, ...@@ -162,7 +162,8 @@ def factor_analysis(factors: pd.DataFrame,
detail_analysis=True, detail_analysis=True,
benchmark: Optional[np.ndarray]=None, benchmark: Optional[np.ndarray]=None,
risk_exp: Optional[np.ndarray]=None, risk_exp: Optional[np.ndarray]=None,
is_tradable: Optional[np.ndarray]=None) -> Tuple[pd.DataFrame, Optional[pd.DataFrame]]: is_tradable: Optional[np.ndarray]=None,
method='risk_neutral') -> Tuple[pd.DataFrame, Optional[pd.DataFrame]]:
data_pack = FDataPack(raw_factors=factors.values, data_pack = FDataPack(raw_factors=factors.values,
d1returns=d1returns, d1returns=d1returns,
...@@ -172,7 +173,7 @@ def factor_analysis(factors: pd.DataFrame, ...@@ -172,7 +173,7 @@ def factor_analysis(factors: pd.DataFrame,
er = data_pack.factor_processing([winsorize_normal, standardize]) @ factor_weights er = data_pack.factor_processing([winsorize_normal, standardize]) @ factor_weights
if benchmark is not None and risk_exp is not None: if benchmark is not None and risk_exp is not None and method == 'risk_neutral':
# using linear programming portfolio builder # using linear programming portfolio builder
benchmark = benchmark.flatten() benchmark = benchmark.flatten()
lbound = 0. lbound = 0.
......
...@@ -12,12 +12,12 @@ import numpy as np ...@@ -12,12 +12,12 @@ import numpy as np
import pandas as pd import pandas as pd
db_settings = { db_settings = {
'uqer': 'alpha':
{ {
'user': 'sa', 'user': 'licheng',
'password': 'We051253524522', 'password': 'A12345678!',
'host': 'rm-bp1psdz5615icqc0yo.mysql.rds.aliyuncs.com', 'host': '10.63.6.220',
'db': 'uqer', 'db': 'alpha',
'charset': 'utf8' 'charset': 'utf8'
} }
} }
...@@ -31,7 +31,8 @@ risk_styles = ['BETA', ...@@ -31,7 +31,8 @@ risk_styles = ['BETA',
'BTOP', 'BTOP',
'LEVERAGE', 'LEVERAGE',
'LIQUIDTY', 'LIQUIDTY',
'SIZENL'] 'SIZENL',
'COUNTRY']
industry_styles = [ industry_styles = [
'Bank', 'Bank',
...@@ -82,8 +83,9 @@ def fetch_codes(codes: Union[str, Iterable[int]], start_date, end_date, engine): ...@@ -82,8 +83,9 @@ def fetch_codes(codes: Union[str, Iterable[int]], start_date, end_date, engine):
return code_table, code_str return code_table, code_str
def industry_mapping(industry_arr, industry_dummies): def industry_mapping(industry_arr, industry_codes, industry_dummies):
return [industry_arr[row][0] for row in industry_dummies] return [industry_arr[row][0] for row in industry_dummies], \
[industry_codes[row][0] for row in industry_dummies],
def fetch_data(factors: Iterable[str], def fetch_data(factors: Iterable[str],
...@@ -92,10 +94,10 @@ def fetch_data(factors: Iterable[str], ...@@ -92,10 +94,10 @@ def fetch_data(factors: Iterable[str],
codes: Union[str, Iterable[int]] = None, codes: Union[str, Iterable[int]] = None,
benchmark: int = None, benchmark: int = None,
risk_model: str = 'day') -> dict: risk_model: str = 'day') -> dict:
engine = sa.create_engine('mysql+mysqldb://{user}:{password}@{host}/{db}?charset={charset}' engine = sa.create_engine('mssql+pymssql://{user}:{password}@{host}/{db}?charset={charset}'
.format(**db_settings['uqer'])) .format(**db_settings['alpha']))
factor_str = ','.join('factors.' + f for f in factors) factor_str = ','.join('uqer.' + f for f in factors)
code_table, code_str = fetch_codes(codes, start_date, end_date, engine) code_table, code_str = fetch_codes(codes, start_date, end_date, engine)
total_risk_factors = risk_styles + industry_styles total_risk_factors = risk_styles + industry_styles
...@@ -104,30 +106,30 @@ def fetch_data(factors: Iterable[str], ...@@ -104,30 +106,30 @@ def fetch_data(factors: Iterable[str],
special_risk_table = 'specific_risk_' + risk_model special_risk_table = 'specific_risk_' + risk_model
if code_str: if code_str:
sql = "select factors.Date, factors.Code, {0}, {3}, market.isOpen, daily_return.d1, {5}.SRISK" \ sql = "select uqer.Date, uqer.Code, {0}, {3}, market.isOpen, daily_return.d1, {5}.SRISK" \
" from (factors INNER JOIN" \ " from (uqer INNER JOIN" \
" risk_exposure on factors.Date = risk_exposure.Date and factors.Code = risk_exposure.Code)" \ " risk_exposure on uqer.Date = risk_exposure.Date and uqer.Code = risk_exposure.Code)" \
" INNER JOIN market on factors.Date = market.Date and factors.Code = market.Code" \ " INNER JOIN market on uqer.Date = market.Date and uqer.Code = market.Code" \
" INNER JOIN daily_return on factors.Date = daily_return.Date and factors.Code = daily_return.Code" \ " INNER JOIN daily_return on uqer.Date = daily_return.Date and uqer.Code = daily_return.Code" \
" INNER JOIN {5} on factors.Date = {5}.Date and factors.Code = {5}.Code" \ " INNER JOIN {5} on uqer.Date = {5}.Date and uqer.Code = {5}.Code" \
" where factors.Date >= '{1}' and factors.Date <= '{2}' and factors.Code in ({4})".format(factor_str, " where uqer.Date >= '{1}' and uqer.Date <= '{2}' and uqer.Code in ({4})".format(factor_str,
start_date, start_date,
end_date, end_date,
risk_str, risk_str,
code_str, code_str,
special_risk_table) special_risk_table)
else: else:
sql = "select factors.Date, factors.Code, {0}, {3}, market.isOpen, daily_return.d1, {4}.SRISK" \ sql = "select uqer.Date, uqer.Code, {0}, {3}, market.isOpen, daily_return.d1, {4}.SRISK" \
" from (factors INNER JOIN" \ " from (uqer INNER JOIN" \
" risk_exposure on factors.Date = risk_exposure.Date and factors.Code = risk_exposure.Code)" \ " risk_exposure on uqer.Date = risk_exposure.Date and uqer.Code = risk_exposure.Code)" \
" INNER JOIN market on factors.Date = market.Date and factors.Code = market.Code" \ " INNER JOIN market on uqer.Date = market.Date and uqer.Code = market.Code" \
" INNER JOIN daily_return on factors.Date = daily_return.Date and factors.Code = daily_return.Code" \ " INNER JOIN daily_return on uqer.Date = daily_return.Date and uqer.Code = daily_return.Code" \
" INNER JOIN {4} on factors.Date = {4}.Date and factors.Code = {4}.Code" \ " INNER JOIN {4} on uqer.Date = {4}.Date and uqer.Code = {4}.Code" \
" where factors.Date >= '{1}' and factors.Date <= '{2}'".format(factor_str, " where uqer.Date >= '{1}' and uqer.Date <= '{2}'".format(factor_str,
start_date, start_date,
end_date, end_date,
risk_str, risk_str,
special_risk_table) special_risk_table)
factor_data = pd.read_sql(sql, engine) factor_data = pd.read_sql(sql, engine)
...@@ -147,7 +149,7 @@ def fetch_data(factors: Iterable[str], ...@@ -147,7 +149,7 @@ def fetch_data(factors: Iterable[str],
total_data = {'factor': factor_data, 'risk_cov': risk_cov_data} total_data = {'factor': factor_data, 'risk_cov': risk_cov_data}
if benchmark: if benchmark:
sql = "select Date, Code, weight from index_components " \ sql = "select Date, Code, weight / 100. as weight from index_components " \
"where Date >= '{0}' and Date <= '{1}' and indexCode = {2}".format(start_date, "where Date >= '{0}' and Date <= '{1}' and indexCode = {2}".format(start_date,
end_date, end_date,
benchmark) benchmark)
...@@ -156,9 +158,10 @@ def fetch_data(factors: Iterable[str], ...@@ -156,9 +158,10 @@ def fetch_data(factors: Iterable[str],
total_data['benchmark'] = benchmark_data total_data['benchmark'] = benchmark_data
industry_arr = np.array(industry_styles) industry_arr = np.array(industry_styles)
industry_codes = np.arange(len(industry_styles), dtype=int)
industry_dummies = factor_data[industry_styles].values.astype(bool) industry_dummies = factor_data[industry_styles].values.astype(bool)
factor_data['industry'] = industry_mapping(industry_arr, industry_dummies) factor_data['industry'], factor_data['industry_code'] = industry_mapping(industry_arr, industry_codes, industry_dummies)
return total_data return total_data
......
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