|
@@ -16,7 +16,8 @@ def get_indicator_info() {
|
|
|
14, 15, 16, 17, 18, 19, 40, 58,
|
|
|
37, 38, 41, 42, 43, 44, 45, 46, 47, 48, 49,
|
|
|
33, 34, 35, 36,
|
|
|
- 66, 53, 54, 55, 56, 57
|
|
|
+ 66, 53, 54, 55, 56, 57,
|
|
|
+ 71, 72, 73
|
|
|
];
|
|
|
|
|
|
names = ['ret',
|
|
@@ -24,7 +25,8 @@ def get_indicator_info() {
|
|
|
'kapparatio', 'treynorratio', 'jensen', 'omegaratio', 'sharperatio', 'sortinoratio_MAR', 'calmarratio', 'sortinoratio',
|
|
|
'per_con', 'info_ratio', 'var', 'cvar', 'smddvar', 'smddcvar', 'smdd_lpm1', 'smdd_lpm2', 'smdd_downside_dev', 'tracking_error', 'm2',
|
|
|
'upsidecapture_ret', 'downsidecapture_ret', 'upsidecapture_ratio', 'downsidecapture_ratio',
|
|
|
- 'stability', 'jc_stddev', 'gzstyle_stddev', 'gzstrategy_stddev', 'zz_stddev', 'zx_stddev'
|
|
|
+ 'stability', 'jc_stddev', 'gzstyle_stddev', 'gzstrategy_stddev', 'zz_stddev', 'zx_stddev',
|
|
|
+ 'ms_return', 'ms_rar', 'ms_risk'
|
|
|
];
|
|
|
|
|
|
is_ASCs = [false,
|
|
@@ -32,7 +34,8 @@ def get_indicator_info() {
|
|
|
false, false, false, false, false, false, false, false,
|
|
|
false, false, true, true, true, true, true, true, true, true, false,
|
|
|
false, false, false, true,
|
|
|
- true, true, true, true, true, true
|
|
|
+ true, true, true, true, true, true,
|
|
|
+ false, false, true
|
|
|
];
|
|
|
|
|
|
return table(names AS name, ids AS id, is_ASCs AS is_ASC);
|
|
@@ -73,9 +76,13 @@ def gen_ranking_sql(entity_type, data_table, indicator_table) {
|
|
|
for(indicator in indicator_table) {
|
|
|
|
|
|
// 与 MySQL 不同,这里统一把近4年和成立以来的排名去掉
|
|
|
- if(indicator.id == 1)
|
|
|
+ if(indicator.id == 1) {
|
|
|
v_trailing = ['1m', '3m', '6m', '1y', '2y', '3y', '5y', '10y', 'ytd'];
|
|
|
- else {
|
|
|
+ // 晨星指标只有3,5,10年
|
|
|
+ } else if(indicator.id in (71, 72, 73)) {
|
|
|
+ v_trailing = ['3y', '5y', '10y'];
|
|
|
+ v_missing_trailing = ['1m', '3m', '6m', '1y', '2y', 'ytd'];
|
|
|
+ } else {
|
|
|
v_trailing = ['6m', '1y', '2y', '3y', '5y', '10y', 'ytd'];
|
|
|
v_missing_trailing = ['1m', '3m'];
|
|
|
}
|
|
@@ -268,11 +275,18 @@ def prepare_data_for_ranking(ranking_by, entity_type, entity_info, end_date, isF
|
|
|
|
|
|
tb_data = lj(tb_data, tb_data_capture_stats, matchingCols);
|
|
|
|
|
|
+ // morningstar data
|
|
|
+ table_desc = get_ms_stats_table_description(entity_type);
|
|
|
+ tb_data_ms_stats = get_monthly_indicator_data(table_desc.table_name[0], end_date, isFromMySQL);
|
|
|
+ tb_data = lj(tb_data, tb_data_ms_stats, matchingCols);
|
|
|
+
|
|
|
+
|
|
|
v_indicator_id = [1, // 对应 fund_performance, 取消39(年化收益) 因为没有意义
|
|
|
38, 41, 42, 48, 49, // 对应 fund_indicator, 取消37 (per_con), 43, 44, 45, 46, 47 (smdd模型) 因为dolphin 未计算
|
|
|
2, 6, 9, 10, 11, 12, 21, 59, // 对应 fund_risk_stats, 取消50, 52 因为 dolphin 未计算
|
|
|
14, 15, 16, 17, 18, 40, 58, // 对应 fund_riskadjret_stats 取消19 (MAR Sortino ratio) 因为 dolphin 未计算
|
|
|
- 33, 34, 35, 36 // 对应 fund_style_stats
|
|
|
+ 33, 34, 35, 36, // 对应 fund_style_stats
|
|
|
+ 71, 72, 73 // 对应 fund_ms_stats
|
|
|
];
|
|
|
|
|
|
}
|
|
@@ -338,6 +352,11 @@ def run_transformation_sql(entity_type, data_table, ranking_by, indicator_info)
|
|
|
// 只有收益需要1m, 3m
|
|
|
if(indicator.id == 1)
|
|
|
v_trailing = ['1m', '3m', '6m', '1y', '2y', '3y', '5y', '10y', 'ytd'];
|
|
|
+ // 晨星指标只有3,5,10年
|
|
|
+ else if(indicator.id in (71, 72, 73)) {
|
|
|
+ v_trailing = ['3y', '5y', '10y'];
|
|
|
+ v_missing = ['1m', '3m', '6m', '1y', '2y', 'ytd'];
|
|
|
+ }
|
|
|
else {
|
|
|
v_trailing = ['6m', '1y', '2y', '3y', '5y', '10y', 'ytd'];
|
|
|
v_missing = ['1m', '3m'];
|
|
@@ -349,7 +368,7 @@ def run_transformation_sql(entity_type, data_table, ranking_by, indicator_info)
|
|
|
from = data_table
|
|
|
).eval();
|
|
|
|
|
|
- // 给非收益指标补上1m, 3m的三套指标
|
|
|
+ // 给非收益指标补上缺失的指标
|
|
|
if(indicator.id != 1 )
|
|
|
{
|
|
|
v_tmp_col = ['indicator_' + v_missing, 'absrank_' + v_missing, 'perrank_' + v_missing].flatten();
|