Commit 26116e1a authored by 李宗熹's avatar 李宗熹

Merge remote-tracking branch 'origin/manage-public' into manage-public

parents ac8b9983 03fa8113
This diff is collapsed.
......@@ -14,6 +14,7 @@ from app.pypfopt import risk_models
from app.pypfopt import expected_returns
from app.pypfopt import EfficientFrontier
from app.api.engine import tamp_product_engine, tamp_fund_engine, TAMP_SQL
from app.service.substrategy_dict import get_substrategy_name
def cal_correlation(prod):
......@@ -155,25 +156,41 @@ def choose_bad_evaluation(evaluation):
return evaluation
def get_fund_rank():
def get_fund_rank(fund_type=1):
"""获取基金指标排名
:return: 基金指标排名表
"""
with TAMP_SQL(tamp_fund_engine) as tamp_fund:
tamp_fund_session = tamp_fund.session
sql = "SELECT * FROM new_fund_rank"
if fund_type == 1:
with TAMP_SQL(tamp_fund_engine) as tamp_fund:
tamp_fund_session = tamp_fund.session
sql = "SELECT * FROM new_fund_rank"
# df = pd.read_sql(sql, con)
# df = pd.read_csv('fund_rank.csv', encoding='gbk')
cur = tamp_fund_session.execute(sql)
data = cur.fetchall()
df = pd.DataFrame(list(data), columns=['index', 'fund_id', 'range_return', 'annual_return', 'max_drawdown',
'sharp_ratio', 'volatility', 'sortino_ratio', 'downside_risk',
'substrategy', 'manager', 'annual_return_rank', 'downside_risk_rank',
'max_drawdown_rank', 'sharp_ratio_rank', 'z_score'])
df.drop('index', axis=1, inplace=True)
return df
# df = pd.read_sql(sql, con)
# df = pd.read_csv('fund_rank.csv', encoding='gbk')
cur = tamp_fund_session.execute(sql)
data = cur.fetchall()
df = pd.DataFrame(list(data), columns=['index', 'fund_id', 'range_return', 'annual_return', 'max_drawdown',
'sharp_ratio', 'volatility', 'sortino_ratio', 'downside_risk',
'substrategy', 'manager', 'annual_return_rank', 'downside_risk_rank',
'max_drawdown_rank', 'sharp_ratio_rank', 'z_score'])
df.drop('index', axis=1, inplace=True)
return df
else:
with TAMP_SQL(tamp_fund_engine) as tamp_fund:
tamp_fund_session = tamp_fund.session
sql = "SELECT * FROM tx_fund_rank"
# df = pd.read_sql(sql, con)
# df = pd.read_csv('fund_rank.csv', encoding='gbk')
cur = tamp_fund_session.execute(sql)
data = cur.fetchall()
df = pd.DataFrame(list(data), columns=['index', 'fund_id', 'range_return', 'annual_return', 'max_drawdown',
'sharp_ratio', 'volatility', 'sortino_ratio', 'downside_risk',
'substrategy', 'manager', 'annual_return_rank', 'downside_risk_rank',
'max_drawdown_rank', 'sharp_ratio_rank', 'z_score'])
df.drop('index', axis=1, inplace=True)
return df
def get_index_daily(index_id, start_date):
......@@ -267,7 +284,7 @@ def get_tamp_nav(fund, start_date, rollback=False, invest_type=2):
# # df = pd.read_sql(sql, con).dropna(how='any')
# cur = tamp_product_session.execute(sql)
if invest_type == 0:
sql = """select distinct `id`, `end_date`, `accum_nav` from `public_fund_nav` where `id`='{}' order by `end_date` ASC""".format(
sql = """select distinct `fund_id`, `price_date`, `cumulative_nav` from `tx_fund_nav` where `fund_id`='{}' and `delete_tag`=0 order by `price_date` ASC""".format(
fund)
cur = tamp_fund_session.execute(sql)
elif invest_type == 1:
......@@ -388,7 +405,7 @@ def get_fund_name(fund, fund_type=1):
if fund_type == 0:
with TAMP_SQL(tamp_fund_engine) as tamp_fund:
tamp_fund_session = tamp_fund.session
sql = "SELECT name FROM public_fund_basic WHERE ts_code='{}'".format(fund)
sql = "SELECT fund_short_name FROM tx_fund_info WHERE `id`='{}'".format(fund)
# df = pd.read_sql(sql, con)
cur = tamp_fund_session.execute(sql)
data = cur.fetchall()
......@@ -425,6 +442,7 @@ def get_fund_name(fund, fund_type=1):
# 获取排名信息
fund_rank = get_fund_rank()
tx_fund_rank = get_fund_rank(0)
# 获取探普产品池
tamp_fund = get_tamp_fund()
......@@ -848,7 +866,7 @@ class PortfolioDiagnose(object):
data_adaptor.user_customer_order_df["folio_name"] == group_name]
strategy_list = group_order_df["substrategy"]
uniqe_strategy = list(strategy_list.unique())
uniqe_strategy_name = [dict_substrategy[int(x)] + "、" for x in uniqe_strategy]
uniqe_strategy_name = [get_substrategy_name(x) + "、" for x in uniqe_strategy]
# 覆盖的基金名称
strategy_name_evaluate = "".join(uniqe_strategy_name)[:-1]
......@@ -1012,7 +1030,7 @@ class PortfolioDiagnose(object):
# 基金名称,策略分级
propose_fund_id_name_list = [propose_fund_df[propose_fund_df["fund_id"] == fund_id]["fund_name"].values[0] for
fund_id in propose_fund_id_list]
propose_fund_id_strategy_name_list = [dict_substrategy[int(propose_fund_df[propose_fund_df["fund_id"] == fund_id]["substrategy"].values[0])] for
propose_fund_id_strategy_name_list = [dict_substrategy(propose_fund_df[propose_fund_df["fund_id"] == fund_id]["substrategy"].values[0]) for
fund_id in propose_fund_id_list]
propose_fund_asset = [round(self.new_weights[i] * total_asset, 2) for i in range(len(propose_fund_id_name_list))]
......@@ -1174,7 +1192,12 @@ class PortfolioDiagnose(object):
Returns:
"""
z_score = search_rank(fund_rank, fund_id, metric='z_score')
if fund_id_type == 0:
rank_df = tx_fund_rank
else:
rank_df = tx_fund_rank
z_score = search_rank(rank_df, fund_id, metric='z_score')
total_level = np.select([z_score >= 80,
70 <= z_score < 80,
z_score < 70], [0, 1, 2]).item()
......@@ -1192,7 +1215,7 @@ class PortfolioDiagnose(object):
compare = pd.merge(index_return_monthly, fund_return_monthly, how='inner', left_index=True, right_index=True)
fund_win_rate = ((compare[fund_id] - compare['pct_chg']) > 0).sum() / compare[fund_id].count()
return_rank = search_rank(fund_rank, fund_id, metric='annual_return_rank')
return_rank = search_rank(rank_df, fund_id, metric='annual_return_rank')
return_level = np.select([return_rank >= 0.8,
0.7 <= return_rank < 0.8,
0.6 <= return_rank < 0.7,
......@@ -1200,8 +1223,8 @@ class PortfolioDiagnose(object):
return_bool = 1 if return_level > 2 else 0
return_triple = return_level - 1 if return_level >= 2 else return_level
drawdown_rank = search_rank(fund_rank, fund_id, metric='max_drawdown_rank')
drawdown_value = search_rank(fund_rank, fund_id, metric='max_drawdown')
drawdown_rank = search_rank(rank_df, fund_id, metric='max_drawdown_rank')
drawdown_value = search_rank(rank_df, fund_id, metric='max_drawdown')
drawdown_level = np.select([drawdown_rank >= 0.8,
0.7 <= drawdown_rank < 0.8,
0.6 <= drawdown_rank < 0.7,
......@@ -1209,7 +1232,7 @@ class PortfolioDiagnose(object):
drawdown_bool = 1 if drawdown_level > 2 else 0
drawdown_triple = drawdown_level - 1 if drawdown_level >= 2 else drawdown_level
sharp_rank = search_rank(fund_rank, fund_id, metric='sharp_ratio_rank')
sharp_rank = search_rank(rank_df, fund_id, metric='sharp_ratio_rank')
sharp_level = np.select([sharp_rank >= 0.8,
0.6 <= sharp_rank < 0.8,
sharp_rank < 0.6], [0, 1, 2]).item()
......@@ -1311,7 +1334,7 @@ class PortfolioDiagnose(object):
result = []
for fund in self.portfolio:
try:
result.append(self.single_evaluation(fund, objective))
result.append(self.single_evaluation(fund, self.portfolio_dict.get(fund, 1), objective))
except IndexError:
continue
return result
......
This diff is collapsed.
dict_substrategy = {
"-1": "其他策略",
"1010": '主观多头',
"1020": '股票多空',
"1030": '量化多头',
"2010": '宏观策略',
"3010": '主观趋势',
"3020": '主观套利',
"3030": '量化趋势',
"3040": '量化套利',
"3050": 'CTA策略',
"4010": '并购重组',
"4020": '定向增发',
"4030": '大宗交易',
"4040": '事件驱动复合',
"5010": '市场中性',
"5020": '套利策略',
"5030": '相对价值复合',
"6010": '纯债策略',
"6020": '强债策略',
"6030": '债券策略',
"7010": 'MOM',
"7020": 'FOF',
"8010": '主观多策略',
"8020": '量化多策略',
"A": "股票型",
"B": "混合型",
"C": "债券型",
"D": "货币基金",
"E": "QDII",
"F": "其他",
"J": "商品",
"K": "FOF",
"A01": "股票->积极投资股票型",
"A02": "股票->指数型",
"B01": "混合->灵活配置型",
"B02": "混合->积极配置型",
"B03": "混合->保守配置型",
"B04": "混合->保本型",
"B05": "混合->特定策略型",
"C01": "债券->纯债型",
"C02": "债券->一级债基",
"C03": "债券->二级债基",
"C04": "债券->理财债基",
"D01": "货币A",
"D02": "货币B",
"D03": "货币R",
"E01": "QDII->股票",
"E02": "QDII->混合",
"J01": "商品ETF",
"J02": "商品期货",
"J03": "商品ETF联接",
"A0101": "积极股票型",
"A0102": "稳健股票型",
"A0201": "纯指数型",
"A0202": "增强指数型",
"C0101": "债券->纯债型",
"C0102": "债券->指数型债券",
"C0103": "债券->债券ETF",
"C0104": "债券->债券ETF联接",
"C0105": "债券->增强型指数型债券",
"E0101": "QDII->股票被动型",
"E0102": "QDII->股票主动型",
"E0201": "QDII->混合",
"E0202": "QDII->债券",
"E0203": "QDII->商品",
"E0204": "QDII->FOF",
"E0205": "QDII->其他基金",
"A020101": "股票->股票ETF",
"A020102": "股票->股票ETF联接",
"A020103": "股票->纯指数型",
"E010101": "QDII->股票被动型",
"E010102": "QDII->股票被动型",
"E010103": "QDII->股票被动型",
"E010104": "QDII->股票被动型",
"E010201": "QDII->股票主动型",
"E010202": "QDII->股票主动型",
"E010203": "QDII->股票主动型",
"E010204": "QDII->股票主动型",
"E010205": "QDII->股票主动型",
"E010206": "QDII->股票主动型",
"E020101": "QDII->全球股债混合",
"E020102": "QDII->亚太股债混合",
"E020103": "QDII->大中华市场",
"E020104": "QDII->新兴股债混合",
"E020201": "QDII->债券主动型",
"E020202": "QDII->债券主动型",
"E020203": "QDII->债券主动型",
"E020204": "QDII->债券主动型",
"E020205": "QDII->债券被动型",
"E020206": "QDII->债券被动型",
"E020207": "QDII->债券被动型",
"E020301": "QDII->商品实物",
"E020302": "QDII->商品ETF",
"E020303": "QDII->商品主动股票"
}
def get_substrategy_name(sub):
try:
sub = int(sub)
code = str(sub)
strategy_name = dict_substrategy[code]
return strategy_name
except ValueError:
pass
try:
code = str(sub)
strategy_name = dict_substrategy[code]
return strategy_name
except:
return dict_substrategy["-1"]
......@@ -11,10 +11,10 @@ import calendar
import math
dict_substrategy = {1010: '主观多头', 1020: '股票多空', 1030: '量化多头', 2010: '宏观策略', 3010: '主观趋势', 3020: '主观套利',
3030: '量化趋势', 3040: '量化套利', 3050: 'CTA策略', 4010: '并购重组', 4020: '定向增发', 4030: '大宗交易',
4040: '事件驱动复合', 5010: '市场中性', 5020: '套利策略', 5030: '相对价值复合', 6010: '纯债策略', 6020: '强债策略',
6030: '债券策略', 7010: 'MOM', 7020: 'FOF', 8010: '主观多策略', 8020: '量化多策略', -1: '其他策略'}
# dict_substrategy = {1010: '主观多头', 1020: '股票多空', 1030: '量化多头', 2010: '宏观策略', 3010: '主观趋势', 3020: '主观套利',
# 3030: '量化趋势', 3040: '量化套利', 3050: 'CTA策略', 4010: '并购重组', 4020: '定向增发', 4030: '大宗交易',
# 4040: '事件驱动复合', 5010: '市场中性', 5020: '套利策略', 5030: '相对价值复合', 6010: '纯债策略', 6020: '强债策略',
# 6030: '债券策略', 7010: 'MOM', 7020: 'FOF', 8010: '主观多策略', 8020: '量化多策略', -1: '其他策略'}
BANK_RATE = 0.015
......
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