Commit 89ba4f54 authored by Rid7's avatar Rid7

接入tamp产品池排名

parent 4a65db78
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
import logging import logging
logging.basicConfig(level=logging.INFO) logging.basicConfig(level=logging.INFO)
from app.api.engine import tamp_fund_engine, TAMP_SQL from app.api.engine import tamp_fund_engine, TAMP_SQL, tamp_product_engine
from app.utils.week_evaluation import * from app.utils.week_evaluation import *
...@@ -32,39 +32,70 @@ def get_nav(fund, start_date, rollback=False, invest_type='public'): ...@@ -32,39 +32,70 @@ def get_nav(fund, start_date, rollback=False, invest_type='public'):
Returns:df[DataFrame]: 索引为净值公布日, 列为复权净值的净值表; 查询失败则返回None Returns:df[DataFrame]: 索引为净值公布日, 列为复权净值的净值表; 查询失败则返回None
""" """
with TAMP_SQL(tamp_fund_engine) as tamp_product: with TAMP_SQL(tamp_fund_engine) as tamp_fund:
tamp_product_session = tamp_product.session tamp_fund_session = tamp_fund.session
if invest_type == 'public': if invest_type == 'public':
sql = "SELECT ts_code, end_date, adj_nav FROM public_fund_nav " \ sql = "SELECT ts_code, end_date, adj_nav FROM public_fund_nav " \
"WHERE ts_code='{}'".format(fund) "WHERE ts_code='{}'".format(fund)
cur = tamp_product_session.execute(sql) cur = tamp_fund_session.execute(sql)
data = cur.fetchall() data = cur.fetchall()
df = pd.DataFrame(list(data), columns=['fund_id', 'end_date', 'adj_nav']).dropna(how='any') df1 = pd.DataFrame(list(data), columns=['fund_id', 'end_date', 'adj_nav']).dropna(how='any')
df.rename({'ts_code': 'fund_id'}, axis=1, inplace=True) df1.rename({'ts_code': 'fund_id'}, axis=1, inplace=True)
else: else:
sql = "SELECT fund_id, price_date, cumulative_nav FROM fund_nav " \
"WHERE fund_id='{}'".format(fund)
# df = pd.read_sql(sql, con).dropna(how='any')
cur = tamp_fund_session.execute(sql)
data = cur.fetchall()
df1 = pd.DataFrame(data, columns=['fund_id', 'price_date', 'cumulative_nav']).dropna(how='any')
df1.rename({'price_date': 'end_date', 'cumulative_nav': 'adj_nav'}, axis=1, inplace=True)
# if df1['adj_nav'].count() == 0:
# logging.log(logging.ERROR, "CAN NOT FIND {}".format(fund))
# return None
df1['end_date'] = pd.to_datetime(df1['end_date'])
if rollback and df1['end_date'].min() < start_date < df1['end_date'].max():
while start_date not in list(df1['end_date']):
start_date -= datetime.timedelta(days=1)
df1 = df1[df1['end_date'] >= start_date]
df1.drop_duplicates(subset='end_date', inplace=True, keep='first')
# df1.set_index('end_date', inplace=True)
# df1.sort_index(inplace=True, ascending=True)
with TAMP_SQL(tamp_product_engine) as tamp_product:
tamp_product_session = tamp_product.session
if invest_type == "private":
sql = "SELECT fund_id, price_date, cumulative_nav FROM fund_nav " \ sql = "SELECT fund_id, price_date, cumulative_nav FROM fund_nav " \
"WHERE fund_id='{}'".format(fund) "WHERE fund_id='{}'".format(fund)
# df = pd.read_sql(sql, con).dropna(how='any') # df = pd.read_sql(sql, con).dropna(how='any')
cur = tamp_product_session.execute(sql) cur = tamp_product_session.execute(sql)
data = cur.fetchall() data = cur.fetchall()
df = pd.DataFrame(data, columns=['fund_id', 'price_date', 'cumulative_nav']).dropna(how='any') df2 = pd.DataFrame(data, columns=['fund_id', 'price_date', 'cumulative_nav']).dropna(how='any')
df.rename({'price_date': 'end_date', 'cumulative_nav': 'adj_nav'}, axis=1, inplace=True) df2.rename({'price_date': 'end_date', 'cumulative_nav': 'adj_nav'}, axis=1, inplace=True)
if df['adj_nav'].count() == 0: # if df2['adj_nav'].count() == 0:
logging.log(logging.ERROR, "CAN NOT FIND {}".format(fund)) # logging.log(logging.ERROR, "CAN NOT FIND {}".format(fund))
return None # return None
df['end_date'] = pd.to_datetime(df['end_date']) df2['end_date'] = pd.to_datetime(df2['end_date'])
if rollback and df['end_date'].min() < start_date < df['end_date'].max(): if rollback and df2['end_date'].min() < start_date < df2['end_date'].max():
while start_date not in list(df['end_date']): while start_date not in list(df2['end_date']):
start_date -= datetime.timedelta(days=1) start_date -= datetime.timedelta(days=1)
df = df[df['end_date'] >= start_date] df2 = df2[df2['end_date'] >= start_date]
df.drop_duplicates(subset='end_date', inplace=True, keep='first') df2.drop_duplicates(subset='end_date', inplace=True, keep='first')
df.set_index('end_date', inplace=True) # df2.set_index('end_date', inplace=True)
df.sort_index(inplace=True, ascending=True) # df2.sort_index(inplace=True, ascending=True)
return df
df = pd.concat([df1, df2])
df.drop_duplicates(subset='end_date', inplace=True, keep='first')
df.set_index('end_date', inplace=True)
df.sort_index(inplace=True, ascending=True)
return df
def get_frequency(df): def get_frequency(df):
...@@ -101,10 +132,10 @@ def get_trade_cal(): ...@@ -101,10 +132,10 @@ def get_trade_cal():
Returns:df[DataFrame]: 索引为交易日, 列为交易日的上交所交易日历表 Returns:df[DataFrame]: 索引为交易日, 列为交易日的上交所交易日历表
""" """
with TAMP_SQL(tamp_fund_engine) as tamp_product: with TAMP_SQL(tamp_fund_engine) as tamp_fund:
tamp_product_session = tamp_product.session tamp_fund_session = tamp_fund.session
sql = 'SELECT cal_date FROM stock_trade_cal WHERE is_open=1' sql = 'SELECT cal_date FROM stock_trade_cal WHERE is_open=1'
cur = tamp_product_session.execute(sql) cur = tamp_fund_session.execute(sql)
data = cur.fetchall() data = cur.fetchall()
df = pd.DataFrame(list(data), columns=['cal_date']).dropna(how='all') df = pd.DataFrame(list(data), columns=['cal_date']).dropna(how='all')
# df = pd.read_sql(sql, con) # df = pd.read_sql(sql, con)
...@@ -122,21 +153,31 @@ def get_manager(invest_type): ...@@ -122,21 +153,31 @@ def get_manager(invest_type):
Returns: Returns:
""" """
with TAMP_SQL(tamp_fund_engine) as tamp_product: with TAMP_SQL(tamp_fund_engine) as tamp_fund:
tamp_product_session = tamp_product.session tamp_fund_session = tamp_fund.session
if invest_type == 'public': if invest_type == 'public':
sql = 'SELECT ts_code, name FROM public_fund_manager WHERE end_date IS NULL' sql = 'SELECT ts_code, name FROM public_fund_manager WHERE end_date IS NULL'
# df = pd.read_sql(sql, con) # df = pd.read_sql(sql, con)
cur = tamp_product_session.execute(sql) cur = tamp_fund_session.execute(sql)
data = cur.fetchall() data = cur.fetchall()
df = pd.DataFrame(list(data), columns=['ts_code', 'name']) df1 = pd.DataFrame(list(data), columns=['ts_code', 'name'])
else: else:
sql = 'SELECT fund_id, fund_manager_id FROM fund_manager_mapping' sql = 'SELECT fund_id, fund_manager_id, management_start_date FROM fund_manager_mapping'
# df = pd.read_sql(sql, con) # df = pd.read_sql(sql, con)
cur = tamp_fund_session.execute(sql)
data = cur.fetchall()
df1 = pd.DataFrame(list(data), columns=['fund_id', 'fund_manager_id', 'management_start_date'])
with TAMP_SQL(tamp_product_engine) as tamp_product:
tamp_product_session = tamp_product.session
if invest_type == 'private':
sql = 'SELECT fund_id, fund_manager_id, management_start_date FROM fund_manager_mapping'
cur = tamp_product_session.execute(sql) cur = tamp_product_session.execute(sql)
data = cur.fetchall() data = cur.fetchall()
df = pd.DataFrame(list(data), columns=['fund_id', 'fund_manager_id']) df2 = pd.DataFrame(list(data), columns=['fund_id', 'fund_manager_id', 'management_start_date'])
return df
df = pd.concat([df1, df2]).drop_duplicates()
return df
def get_fund_info(end_date, invest_type): def get_fund_info(end_date, invest_type):
...@@ -149,33 +190,49 @@ def get_fund_info(end_date, invest_type): ...@@ -149,33 +190,49 @@ def get_fund_info(end_date, invest_type):
Returns: Returns:
[type]: [description] [type]: [description]
""" """
with TAMP_SQL(tamp_fund_engine) as tamp_product: with TAMP_SQL(tamp_fund_engine) as tamp_fund:
tamp_product_session = tamp_product.session tamp_fund_session = tamp_fund.session
if invest_type == 'public': if invest_type == 'public':
sql = "SELECT ts_code, fund_type, management FROM public_fund_basic " \ sql = "SELECT ts_code, fund_type, management FROM public_fund_basic " \
"WHERE delist_date IS NULL AND (due_date IS NULL OR due_date>'{}')".format(end_date.strftime('%Y%m%d')) "WHERE delist_date IS NULL AND (due_date IS NULL OR due_date>'{}')".format(end_date.strftime('%Y%m%d'))
# df = pd.read_sql(sql, con).dropna(how='all') # df = pd.read_sql(sql, con).dropna(how='all')
cur = tamp_product_session.execute(sql) cur = tamp_fund_session.execute(sql)
data = cur.fetchall() data = cur.fetchall()
df = pd.DataFrame(list(data), columns=['ts_code', 'fund_type', 'management']) df1 = pd.DataFrame(list(data), columns=['fund_id', 'fund_type', 'management'])
manager_info = get_manager(invest_type) # manager_info = get_manager(invest_type)
df.rename({'ts_code': 'fund_id'}, axis=1, inplace=True) # df1.rename({'ts_code': 'fund_id'}, axis=1, inplace=True)
df = pd.merge(df, manager_info, how="left", on='fund_id') # df = pd.merge(df, manager_info, how="left", on='fund_id')
else: else:
sql = "SELECT id, substrategy FROM fund_info WHERE delete_tag=0 " \
"AND substrategy!=-1"
cur = tamp_fund_session.execute(sql)
data = cur.fetchall()
df1 = pd.DataFrame(list(data), columns=['fund_id', 'substrategy'])
# df = pd.read_sql(sql, con).dropna(how='all')
# df1.rename({'id': 'fund_id'}, axis=1, inplace=True)
# manager_info = get_manager(invest_type)
# df = pd.merge(df, manager_info, how="inner", on='fund_id')
with TAMP_SQL(tamp_product_engine) as tamp_product:
tamp_product_session = tamp_product.session
if invest_type == "private":
sql = "SELECT id, substrategy FROM fund_info WHERE delete_tag=0 " \ sql = "SELECT id, substrategy FROM fund_info WHERE delete_tag=0 " \
"AND substrategy!=-1" "AND substrategy!=-1"
cur = tamp_product_session.execute(sql) cur = tamp_product_session.execute(sql)
data = cur.fetchall() data = cur.fetchall()
df = pd.DataFrame(list(data), columns=['id', 'substrategy']) df2 = pd.DataFrame(list(data), columns=['fund_id', 'substrategy'])
# df = pd.read_sql(sql, con).dropna(how='all') # df = pd.read_sql(sql, con).dropna(how='all')
df.rename({'id': 'fund_id'}, axis=1, inplace=True) # df2.rename({'id': 'fund_id'}, axis=1, inplace=True)
manager_info = get_manager(invest_type) # manager_info = get_manager(invest_type)
df = pd.merge(df, manager_info, how="inner", on='fund_id')
return df manager_info = get_manager(invest_type)
df = pd.concat([df1, df2]).drop_duplicates()
df = pd.merge(df, manager_info, how="inner", on='fund_id')
return df
def resample(df, trading_cal, freq, simple_flag=True): def resample(df, trading_cal, freq, simple_flag=True):
...@@ -276,11 +333,12 @@ def fund_rank(start_date, end_date, invest_type='private'): ...@@ -276,11 +333,12 @@ def fund_rank(start_date, end_date, invest_type='private'):
continue continue
n = get_frequency(df) n = get_frequency(df)
except Exception as e: except Exception as e:
# logging.log(logging.ERROR, repr(e)) logging.log(logging.ERROR, repr(e))
logging.log(logging.INFO, 'Skipped {}'.format(fund)) logging.log(logging.INFO, 'Skipped {}'.format(fund))
skipped_funds.append(fund)
continue continue
df = resample(df, trading_cal, n) df = resample(df, trading_cal, n, simple_flag=False)
try: try:
_ = get_frequency(df) _ = get_frequency(df)
...@@ -302,7 +360,8 @@ def fund_rank(start_date, end_date, invest_type='private'): ...@@ -302,7 +360,8 @@ def fund_rank(start_date, end_date, invest_type='private'):
down_risk = downside_risk(sim_return, bank_rate=0.015, n=n) down_risk = downside_risk(sim_return, bank_rate=0.015, n=n)
sor_ratio = sortino_ratio(ex_return, down_risk, n) sor_ratio = sortino_ratio(ex_return, down_risk, n)
manager = fund_info[fund_info['fund_id'] == fund]['fund_manager_id'].values manager = fund_info[fund_info['fund_id'] == fund].groupby("management_start_date").last()
manager = manager['fund_manager_id'].values
# management = fund_info[fund_info['fund_id'] == fund]['management'].values # management = fund_info[fund_info['fund_id'] == fund]['management'].values
row = pd.Series([fund, rng_return, ann_return, drawdown, shp_ratio, row = pd.Series([fund, rng_return, ann_return, drawdown, shp_ratio,
...@@ -324,8 +383,8 @@ def fund_rank(start_date, end_date, invest_type='private'): ...@@ -324,8 +383,8 @@ def fund_rank(start_date, end_date, invest_type='private'):
if __name__ == '__main__': if __name__ == '__main__':
end_date = datetime.datetime.now() - datetime.timedelta(days=1) end_date = datetime.datetime.now() - datetime.timedelta(days=1)
start_date = cal_date(end_date, 'Y', 1) start_date = cal_date(end_date, 'Y', 1)
fund_rank = fund_rank(start_date, end_date, False) fund_rank = fund_rank(start_date, end_date, invest_type="private")
# fund_rank.to_csv("fund_rank.csv", encoding='gbk') fund_rank.to_csv("fund_rank.csv", encoding='gbk')
# df = pd.read_csv('fund_rank.csv') df = pd.read_csv('fund_rank.csv')
# df.to_sql("fund_rank", con, if_exists='replace') # df.to_sql("fund_rank", con, if_exists='replace')
# con.close() # con.close()
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