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

FEATURE: update sqlengine

parent 38c1a6a9
...@@ -127,10 +127,15 @@ class SqlEngine: ...@@ -127,10 +127,15 @@ class SqlEngine:
db_session = orm.sessionmaker(bind=self._engine) db_session = orm.sessionmaker(bind=self._engine)
return db_session() return db_session()
def _create_stats(self, df, horizon, offset): def _create_stats(self, df, horizon, offset, no_code=False):
df["trade_date"] = pd.to_datetime(df["trade_date"])
df.set_index("trade_date", inplace=True) df.set_index("trade_date", inplace=True)
df["dx"] = np.log(1. + df["chgPct"] / 100.) df["dx"] = np.log(1. + df["chgPct"] / 100.)
df = df.groupby("code").rolling(window=horizon + 1)['dx'].sum().groupby(level=0).shift(-(horizon + offset + 1)).dropna().reset_index() if not no_code:
df = df.groupby("code").rolling(window=horizon + 1)['dx'].sum() \
.groupby(level=0).shift(-(horizon + offset + 1)).dropna().reset_index()
else:
df = df.rolling(window=horizon + 1)['dx'].sum().shift(-(horizon + offset + 1)).dropna().reset_index()
return df return df
def fetch_dx_return(self, def fetch_dx_return(self,
...@@ -141,7 +146,8 @@ class SqlEngine: ...@@ -141,7 +146,8 @@ class SqlEngine:
offset: int = 0, offset: int = 0,
neutralized_risks: list = None, neutralized_risks: list = None,
pre_process=None, pre_process=None,
post_process=None) -> pd.DataFrame: post_process=None,
benchmark: int = None) -> pd.DataFrame:
start_date = ref_date start_date = ref_date
if not expiry_date: if not expiry_date:
...@@ -164,6 +170,20 @@ class SqlEngine: ...@@ -164,6 +170,20 @@ class SqlEngine:
df = self._create_stats(df, horizon, offset) df = self._create_stats(df, horizon, offset)
df = df[df.trade_date == ref_date] df = df[df.trade_date == ref_date]
if benchmark:
benchmark = _map_index_codes[benchmark]
query = select([IndexMarket.trade_date, IndexMarket.chgPct.label("chgPct")]).where(
and_(
IndexMarket.trade_date.between(start_date, end_date),
IndexMarket.indexCode == benchmark,
IndexMarket.flag == 1
)
)
df2 = pd.read_sql(query, self.session.bind).dropna()
df2 = self._create_stats(df2, horizon, offset, no_code=True)
ind_ret = df2[df2.trade_date == ref_date]['dx'].values[0]
df['dx'] = df['dx'] - ind_ret
if neutralized_risks: if neutralized_risks:
_, risk_exp = self.fetch_risk_model(ref_date, codes) _, risk_exp = self.fetch_risk_model(ref_date, codes)
df = pd.merge(df, risk_exp, on='code').dropna() df = pd.merge(df, risk_exp, on='code').dropna()
...@@ -235,11 +255,26 @@ class SqlEngine: ...@@ -235,11 +255,26 @@ class SqlEngine:
df2 = self.fetch_codes_range(universe, start_date, end_date, dates) df2 = self.fetch_codes_range(universe, start_date, end_date, dates)
df2["trade_date"] = pd.to_datetime(df2["trade_date"]) df2["trade_date"] = pd.to_datetime(df2["trade_date"])
df = pd.merge(df1, df2, on=["trade_date", "code"]) df = pd.merge(df1, df2, on=["trade_date", "code"])
df = df.set_index("trade_date")
if benchmark:
benchmark = _map_index_codes[benchmark]
query = select([IndexMarket.trade_date,
IndexMarket.chgPct.label("chgPct")]).where(
and_(
IndexMarket.trade_date.between(start_date, end_date),
IndexMarket.indexCode == benchmark,
IndexMarket.flag == 1
)
)
df2 = pd.read_sql(query, self.session.bind).dropna()
df2 = self._create_stats(df2, horizon, offset, no_code=True).set_index("trade_date")
df['dx'] = df['dx'].values - df2.loc[df.index]['dx'].values
if dates: if dates:
df = df[df.trade_date.isin(dates)] df = df[df.index.isin(dates)]
return df.reset_index(drop=True).sort_values(['trade_date', 'code']) return df.reset_index().sort_values(['trade_date', 'code'])
def fetch_dx_return_index_range(self, def fetch_dx_return_index_range(self,
index_code, index_code,
...@@ -272,7 +307,6 @@ class SqlEngine: ...@@ -272,7 +307,6 @@ class SqlEngine:
df = pd.read_sql(query, self.session.bind).dropna() df = pd.read_sql(query, self.session.bind).dropna()
df = self._create_stats(df, horizon, offset) df = self._create_stats(df, horizon, offset)
df["trade_date"] = pd.to_datetime(df["trade_date"])
if dates: if dates:
df = df[df.trade_date.isin(dates)] df = df[df.trade_date.isin(dates)]
...@@ -811,25 +845,27 @@ if __name__ == "__main__": ...@@ -811,25 +845,27 @@ if __name__ == "__main__":
sql_engine = SqlEngine(db_url=db_url) sql_engine = SqlEngine(db_url=db_url)
universe = Universe("hs300") universe = Universe("hs300")
start_date = '2020-01-01' start_date = '2020-01-02'
end_date = '2020-02-21' end_date = '2020-02-21'
frequency = "10b"
benchmark = 300 benchmark = 300
factors = ["EMA5D", "EMV6D"] factors = ["EMA5D", "EMV6D"]
ref_dates = makeSchedule(start_date, end_date, "10b", 'china.sse') ref_dates = makeSchedule(start_date, end_date, frequency, 'china.sse')
print(ref_dates)
# df = sql_engine.fetch_factor("2020-02-21", factors=factors, codes=["2010031963"]) # df = sql_engine.fetch_factor("2020-02-21", factors=factors, codes=["2010031963"])
# print(df) # print(df)
# df = sql_engine.fetch_factor_range(universe=universe, start_date=start_date, end_date=end_date, factors=factors) df = sql_engine.fetch_factor_range(universe=universe, dates=ref_dates, factors=factors)
# print(df) print(df)
# df = sql_engine.fetch_codes_range(start_date=start_date, end_date=end_date, universe=Universe("hs300")) df = sql_engine.fetch_codes_range(start_date=start_date, end_date=end_date, universe=Universe("hs300"))
# print(df) print(df)
# df = sql_engine.fetch_dx_return("2020-10-09", codes=["2010031963"]) # df = sql_engine.fetch_dx_return("2020-10-09", codes=["2010031963"], benchmark=benchmark)
# print(df) # print(df)
df = sql_engine.fetch_dx_return_range(universe, dates=ref_dates, horizon=9, offset=1) df = sql_engine.fetch_dx_return_range(universe, dates=ref_dates, horizon=9, offset=1, benchmark=benchmark)
print(df) print(df)
# df = sql_engine.fetch_dx_return_index("2020-10-09", index_code=benchmark) # df = sql_engine.fetch_dx_return_index("2020-10-09", index_code=benchmark)
# print(df) # print(df)
df = sql_engine.fetch_dx_return_index_range(start_date=start_date, end_date=end_date, index_code=benchmark, horizon=9, offset=1) # df = sql_engine.fetch_dx_return_index_range(start_date=start_date, end_date=end_date, index_code=benchmark, horizon=9, offset=1)
print(df) # print(df)
# df = sql_engine.fetch_benchmark("2020-10-09", benchmark=benchmark) # df = sql_engine.fetch_benchmark("2020-10-09", benchmark=benchmark)
# print(df) # print(df)
# df = sql_engine.fetch_benchmark_range(start_date=start_date, end_date=end_date, benchmark=benchmark) # df = sql_engine.fetch_benchmark_range(start_date=start_date, end_date=end_date, benchmark=benchmark)
...@@ -846,12 +882,12 @@ if __name__ == "__main__": ...@@ -846,12 +882,12 @@ if __name__ == "__main__":
# print(df) # print(df)
# df = sql_engine.fetch_risk_model("2020-02-21", codes=["2010031963"]) # df = sql_engine.fetch_risk_model("2020-02-21", codes=["2010031963"])
# print(df) # print(df)
# df = sql_engine.fetch_risk_model("2020-02-21", codes=["2010031963"], model_type="factor") df = sql_engine.fetch_risk_model("2020-02-21", codes=["2010031963"], model_type="factor")
# print(df) print(df)
# df = sql_engine.fetch_risk_model_range(universe=universe, df = sql_engine.fetch_risk_model_range(universe=universe,
# start_date=start_date, start_date=start_date,
# end_date=end_date) end_date=end_date)
# print(df) print(df)
# df = sql_engine.fetch_risk_model_range(universe=universe, # df = sql_engine.fetch_risk_model_range(universe=universe,
# start_date=start_date, # start_date=start_date,
# end_date=end_date, # end_date=end_date,
...@@ -859,10 +895,9 @@ if __name__ == "__main__": ...@@ -859,10 +895,9 @@ if __name__ == "__main__":
# print(df) # print(df)
# df = sql_engine.fetch_data("2020-02-11", factors=factors, codes=["2010031963"], benchmark=300) # df = sql_engine.fetch_data("2020-02-11", factors=factors, codes=["2010031963"], benchmark=300)
# print(df) # print(df)
# df = sql_engine.fetch_data_range(universe, df = sql_engine.fetch_data_range(universe,
# factors=factors, factors=factors,
# start_date=start_date, dates=ref_dates,
# end_date=end_date, benchmark=benchmark)["factor"]
# benchmark=benchmark) print(df)
# print(df)
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