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

FEATURE: update risk model fetching

parent f3dd843e
...@@ -156,6 +156,7 @@ class _RiskExposure(Base): ...@@ -156,6 +156,7 @@ class _RiskExposure(Base):
AERODEF = Column(INT) AERODEF = Column(INT)
Conglomerates = Column(INT) Conglomerates = Column(INT)
COUNTRY = Column(INT) COUNTRY = Column(INT)
flag = Column(INT, index=True, server_default=text("'1'"))
class _RiskCovDay(Base): class _RiskCovDay(Base):
......
...@@ -306,10 +306,11 @@ class SqlEngine: ...@@ -306,10 +306,11 @@ class SqlEngine:
)) ))
query = select( query = select(
[RiskExposure.code, special_risk_table.SRISK.label('srisk')] + risk_exposure_cols) \ [RiskExposure.code.label("code"), special_risk_table.SRISK.label('srisk')] + risk_exposure_cols) \
.select_from(big_table).where( .select_from(big_table).where(
and_(RiskExposure.trade_date == ref_date, and_(RiskExposure.trade_date == ref_date,
RiskExposure.code.in_(codes) RiskExposure.code.in_(codes),
RiskExposure.flag == 1
)) ))
risk_exp = pd.read_sql(query, self.engine).dropna() risk_exp = pd.read_sql(query, self.engine).dropna()
...@@ -325,6 +326,77 @@ class SqlEngine: ...@@ -325,6 +326,77 @@ class SqlEngine:
idsync = new_risk_exp['srisk'] * new_risk_exp['srisk'] / 10000 idsync = new_risk_exp['srisk'] * new_risk_exp['srisk'] / 10000
return FactorRiskModel(factor_cov, factor_loading, idsync), risk_cov, risk_exp return FactorRiskModel(factor_cov, factor_loading, idsync), risk_cov, risk_exp
def fetch_risk_model_range(self,
universe: Universe,
start_date: str = None,
end_date: str = None,
dates: Iterable[str] = None,
risk_model: str = 'short',
excluded: Iterable[str] = None,
model_type: str = None) -> Tuple[pd.DataFrame, pd.DataFrame]:
risk_cov_table, special_risk_table = _map_risk_model_table(risk_model)
cov_risk_cols = [risk_cov_table.__table__.columns[f] for f in total_risk_factors]
cond = risk_cov_table.trade_date.in_(dates) if dates else risk_cov_table.trade_date.between(
start_date,
end_date)
query = select([risk_cov_table.trade_date,
risk_cov_table.FactorID,
risk_cov_table.Factor]
+ cov_risk_cols).where(
cond
)
risk_cov = pd.read_sql(query, self.engine).sort_values(['trade_date', 'FactorID'])
if not excluded:
excluded = []
risk_exposure_cols = [RiskExposure.__table__.columns[f] for f in total_risk_factors if
f not in set(excluded)]
cond = universe._query_statements(start_date, end_date, dates)
big_table = join(RiskExposure, UniverseTable,
and_(
RiskExposure.trade_date == UniverseTable.trade_date,
RiskExposure.code == UniverseTable.code,
RiskExposure.flag == 1,
cond
)
)
big_table = join(special_risk_table,
big_table,
and_(
RiskExposure.code == special_risk_table.code,
RiskExposure.trade_date == special_risk_table.trade_date,
))
query = select(
[RiskExposure.trade_date,
RiskExposure.code.label("code"),
special_risk_table.SRISK.label('srisk')] + risk_exposure_cols).select_from(big_table) \
.distinct()
risk_exp = pd.read_sql(query, self.engine).sort_values(['trade_date', 'code']).dropna()
if not model_type:
return risk_cov, risk_exp
elif model_type == 'factor':
new_risk_cov = risk_cov.set_index('Factor')
new_risk_exp = risk_exp.set_index('code')
risk_cov_groups = new_risk_cov.groupby('trade_date')
risk_exp_groups = new_risk_exp.groupby('trade_date')
models = dict()
for ref_date, cov_g in risk_cov_groups:
exp_g = risk_exp_groups.get_group(ref_date)
factor_names = cov_g.index.tolist()
factor_cov = cov_g.loc[factor_names, factor_names] / 10000.
factor_loading = exp_g.loc[:, factor_names]
idsync = exp_g['srisk'] * exp_g['srisk'] / 10000
models[ref_date] = FactorRiskModel(factor_cov, factor_loading, idsync)
return pd.Series(models), risk_cov, risk_exp
if __name__ == "__main__": if __name__ == "__main__":
db_url = "mysql+mysqldb://reader:Reader#2020@121.37.138.1:13317/vision?charset=utf8" db_url = "mysql+mysqldb://reader:Reader#2020@121.37.138.1:13317/vision?charset=utf8"
...@@ -345,3 +417,19 @@ if __name__ == "__main__": ...@@ -345,3 +417,19 @@ if __name__ == "__main__":
print(df) print(df)
df = sql_engine.fetch_industry_range(start_date=start_date, end_date=end_date, universe=Universe("hs300")) df = sql_engine.fetch_industry_range(start_date=start_date, end_date=end_date, universe=Universe("hs300"))
print(df) print(df)
df = sql_engine.fetch_risk_model("2020-02-21", codes=["2010031963"])
print(df)
df = sql_engine.fetch_risk_model("2020-02-21", codes=["2010031963"], model_type="factor")
print(df)
start_date = '2020-01-01'
end_date = '2020-02-21'
df = sql_engine.fetch_risk_model_range(universe=universe,
start_date=start_date,
end_date=end_date)
print(df)
df = sql_engine.fetch_risk_model_range(universe=universe,
start_date=start_date,
end_date=end_date,
model_type="factor")
print(df)
...@@ -10,20 +10,6 @@ from typing import Dict ...@@ -10,20 +10,6 @@ from typing import Dict
from typing import Iterable from typing import Iterable
if "DB_VENDOR" in os.environ and os.environ["DB_VENDOR"].lower() == "rl": if "DB_VENDOR" in os.environ and os.environ["DB_VENDOR"].lower() == "rl":
from alphamind.data.dbmodel.models import Categories
from alphamind.data.dbmodel.models import Market
from alphamind.data.dbmodel.models import RiskCovDay
from alphamind.data.dbmodel.models import RiskCovLong
from alphamind.data.dbmodel.models import RiskCovShort
from alphamind.data.dbmodel.models import RiskExposure
from alphamind.data.dbmodel.models import SpecificRiskDay
from alphamind.data.dbmodel.models import SpecificRiskLong
from alphamind.data.dbmodel.models import SpecificRiskShort
from alphamind.data.dbmodel.models import Uqer
from alphamind.data.engines.industries import INDUSTRY_MAPPING
factor_tables = [Market, RiskExposure, Uqer, Categories]
else:
from alphamind.data.dbmodel.models import Categories from alphamind.data.dbmodel.models import Categories
from alphamind.data.dbmodel.models import Market from alphamind.data.dbmodel.models import Market
from alphamind.data.dbmodel.models_rl import RiskCovDay from alphamind.data.dbmodel.models_rl import RiskCovDay
...@@ -37,6 +23,20 @@ else: ...@@ -37,6 +23,20 @@ else:
from alphamind.data.engines.industries import INDUSTRY_MAPPING from alphamind.data.engines.industries import INDUSTRY_MAPPING
factor_tables = [Market, RiskExposure, Uqer, Categories] factor_tables = [Market, RiskExposure, Uqer, Categories]
else:
from alphamind.data.dbmodel.models import Categories
from alphamind.data.dbmodel.models import Market
from alphamind.data.dbmodel.models import RiskCovDay
from alphamind.data.dbmodel.models import RiskCovLong
from alphamind.data.dbmodel.models import RiskCovShort
from alphamind.data.dbmodel.models import RiskExposure
from alphamind.data.dbmodel.models import SpecificRiskDay
from alphamind.data.dbmodel.models import SpecificRiskLong
from alphamind.data.dbmodel.models import SpecificRiskShort
from alphamind.data.dbmodel.models import Uqer
from alphamind.data.engines.industries import INDUSTRY_MAPPING
factor_tables = [Market, RiskExposure, Uqer, Categories]
def _map_risk_model_table(risk_model: str) -> tuple: def _map_risk_model_table(risk_model: str) -> tuple:
......
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