Commit 2c354f4c authored by Dr.李's avatar Dr.李

fixed test and added one more api for get forwarding factor

parent 957f8a82
...@@ -417,8 +417,7 @@ class SqlEngine(object): ...@@ -417,8 +417,7 @@ class SqlEngine(object):
df = pd.read_sql(query, self.engine) df = pd.read_sql(query, self.engine)
if universe.is_filtered: if universe.is_filtered:
codes = universe.query(self, start_date, end_date, dates) df = pd.merge(df, universe_df, how='inner', on=['trade_date', 'code'])
df = pd.merge(df, codes, how='inner', on=['trade_date', 'code'])
if external_data is not None: if external_data is not None:
df = pd.merge(df, external_data, on=['trade_date', 'code']).dropna() df = pd.merge(df, external_data, on=['trade_date', 'code']).dropna()
...@@ -435,6 +434,55 @@ class SqlEngine(object): ...@@ -435,6 +434,55 @@ class SqlEngine(object):
df = df.reset_index() df = df.reset_index()
return pd.merge(df, universe_df[['trade_date', 'code']], how='inner') return pd.merge(df, universe_df[['trade_date', 'code']], how='inner')
def fetch_factor_range_forward(self,
universe: Universe,
factors: Union[Transformer, object],
start_date: str = None,
end_date: str = None,
dates: Iterable[str] = None):
if isinstance(factors, Transformer):
transformer = factors
else:
transformer = Transformer(factors)
dependency = transformer.dependency
factor_cols = _map_factors(dependency, factor_tables)
codes = universe.query(self, start_date, end_date, dates)
total_codes = codes.code.unique().tolist()
total_dates = codes.trade_date.astype(str).unique().tolist()
big_table = Market
joined_tables = set()
joined_tables.add(Market.__table__.name)
for t in set(factor_cols.values()):
if t.__table__.name not in joined_tables:
if dates is not None:
big_table = outerjoin(big_table, t, and_(Market.trade_date == t.trade_date,
Market.code == t.code,
Market.trade_date.in_(dates)))
else:
big_table = outerjoin(big_table, t, and_(Market.trade_date == t.trade_date,
Market.code == t.code,
Market.trade_date.between(start_date, end_date)))
joined_tables.add(t.__table__.name)
stats = func.lag(list(factor_cols.keys())[0], -1).over(
partition_by=Market.code,
order_by=Market.trade_date).label('dx')
query = select([Market.trade_date, Market.code, stats]).select_from(big_table).where(
and_(
Market.trade_date.in_(total_dates),
Market.code.in_(total_codes)
)
)
df = pd.read_sql(query, self.engine).sort_values(['trade_date', 'code'])
return df
def fetch_benchmark(self, def fetch_benchmark(self,
ref_date: str, ref_date: str,
benchmark: int, benchmark: int,
...@@ -988,9 +1036,6 @@ if __name__ == '__main__': ...@@ -988,9 +1036,6 @@ if __name__ == '__main__':
universe = Universe('', ['zz800']) universe = Universe('', ['zz800'])
codes = engine.fetch_codes(ref_date, universe) codes = engine.fetch_codes(ref_date, universe)
dates = makeSchedule('2010-01-01', '2018-02-01', '10b', 'china.sse') dates = makeSchedule('2018-01-01', '2018-02-01', '10b', 'china.sse')
# df = engine.fetch_factor_range(universe, DIFF('roe_q'), dates=dates) factor_data = engine.fetch_factor_range_forward(universe, ['roe_q'], dates=dates)
print(factor_data)
risk_cov, risk_exposure = engine.fetch_risk_model(ref_date, codes)
factor_data = engine.fetch_factor_range(universe, ['roe_q'], dates=dates)
risk_cov, risk_exposure = engine.fetch_risk_model_range(universe, dates=dates)
...@@ -7,6 +7,7 @@ Created on 2017-12-25 ...@@ -7,6 +7,7 @@ Created on 2017-12-25
from typing import Iterable from typing import Iterable
from typing import Dict from typing import Dict
from alphamind.data.dbmodel.models import Market
from alphamind.data.dbmodel.models import RiskCovDay from alphamind.data.dbmodel.models import RiskCovDay
from alphamind.data.dbmodel.models import RiskCovShort from alphamind.data.dbmodel.models import RiskCovShort
from alphamind.data.dbmodel.models import RiskCovLong from alphamind.data.dbmodel.models import RiskCovLong
...@@ -22,7 +23,7 @@ from alphamind.data.dbmodel.models import RiskExposure ...@@ -22,7 +23,7 @@ from alphamind.data.dbmodel.models import RiskExposure
from alphamind.data.engines.industries import INDUSTRY_MAPPING from alphamind.data.engines.industries import INDUSTRY_MAPPING
factor_tables = [RiskExposure, Uqer, Gogoal, Experimental, LegacyFactor, Tiny] factor_tables = [Market, RiskExposure, Uqer, Gogoal, Experimental, LegacyFactor, Tiny]
def _map_risk_model_table(risk_model: str) -> tuple: def _map_risk_model_table(risk_model: str) -> tuple:
......
...@@ -16,8 +16,8 @@ class TargetVolExecutor(ExecutorBase): ...@@ -16,8 +16,8 @@ class TargetVolExecutor(ExecutorBase):
def __init__(self, window=30, target_vol=0.01): def __init__(self, window=30, target_vol=0.01):
super().__init__() super().__init__()
self.m_vol = MovingStandardDeviation(window=window, dependency='return') self.m_vol = MovingStandardDeviation(window, 'return')
self.m_leverage = MovingAverage(window=window, dependency='leverage') self.m_leverage = MovingAverage(window, 'leverage')
self.target_vol = target_vol self.target_vol = target_vol
self.multiplier = 1. self.multiplier = 1.
......
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