|
@@ -345,6 +345,22 @@ def create_entity_style_stats(is_id_integer=false) {
|
|
|
|
|
|
|
|
|
/*
|
|
|
+ * 建表 XXX_ms_stats
|
|
|
+ */
|
|
|
+def create_entity_ms_stats(is_id_integer=false) {
|
|
|
+
|
|
|
+ return table(1000:0,
|
|
|
+ ['entity_id', 'end_date',
|
|
|
+ 'ms_return_3y', 'ms_rar_3y', 'ms_risk_3y',
|
|
|
+ 'ms_return_5y', 'ms_rar_5y', 'ms_risk_5y',
|
|
|
+ 'ms_return_10y', 'ms_rar_10y', 'ms_risk_10y'],
|
|
|
+ [iif(is_id_integer, INT, SYMBOL), MONTH,
|
|
|
+ DOUBLE, DOUBLE, DOUBLE,
|
|
|
+ DOUBLE, DOUBLE, DOUBLE,
|
|
|
+ DOUBLE, DOUBLE, DOUBLE]);
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
* 建基金经理/公司表 XXX_style_stats
|
|
|
*/
|
|
|
def create_mc_style_stats() {
|
|
@@ -727,7 +743,7 @@ def generate_entity_performance(entity_info, indicators, isToMySQL, mutable enti
|
|
|
|
|
|
t = null;
|
|
|
|
|
|
- if(extra_keys.isNothing() || extra_keys.isVoid()) v_extra_keys = array(STRING);
|
|
|
+ if(extra_keys.isNothing() || extra_keys.isVoid() || extra_keys.size() == 0) v_extra_keys = array(STRING);
|
|
|
else v_extra_keys = extra_keys;
|
|
|
|
|
|
if(isToMySQL) {
|
|
@@ -735,7 +751,7 @@ def generate_entity_performance(entity_info, indicators, isToMySQL, mutable enti
|
|
|
if(indicators['PBI-3M'].isVoid() || indicators['PBI-3M'].size() == 0) return;
|
|
|
|
|
|
t = sql(select =(sqlCol('entity_id'),
|
|
|
- sqlCol(extra_keys.join('end_date')),
|
|
|
+ sqlCol(v_extra_keys.join('end_date')),
|
|
|
sqlCol('price_date'),
|
|
|
sqlCol(['nav', 'ret', 'ret', 'trailing_ret', 'trailing_ret_a'], , ['cumulative_nav', 'ret_1m', 'ret_1m_a', 'ret_3m', 'ret_3m_a'])
|
|
|
),
|
|
@@ -778,7 +794,7 @@ def generate_entity_risk_stats(entity_info, indicators, isToMySQL, mutable entit
|
|
|
|
|
|
t = null;
|
|
|
|
|
|
- if(extra_keys.isNothing() || extra_keys.isVoid()) v_extra_keys = array(STRING);
|
|
|
+ if(extra_keys.isNothing() || extra_keys.isVoid() || extra_keys.size() == 0) v_extra_keys = array(STRING);
|
|
|
else v_extra_keys = extra_keys;
|
|
|
|
|
|
if(indicators['PBI-6M'].isVoid() || indicators['PBI-6M'].size() == 0) return;
|
|
@@ -786,7 +802,7 @@ def generate_entity_risk_stats(entity_info, indicators, isToMySQL, mutable entit
|
|
|
if(isToMySQL) {
|
|
|
|
|
|
t = sql(select =(sqlCol('entity_id'),
|
|
|
- sqlCol(extra_keys.join('end_date')),
|
|
|
+ sqlCol(v_extra_keys.join('end_date')),
|
|
|
sqlCol(['std_dev_a', 'ds_dev_a', 'alpha_a', 'winrate', 'beta', 'skewness', 'kurtosis', 'wrst_month', 'drawdown'],
|
|
|
, ['stddev_6m', 'downsidedev_6m', 'alpha_6m', 'winrate_6m', 'beta_6m', 'skewness_6m', 'kurtosis_6m', 'worstmonth_6m', 'maxdrawdown_6m'])
|
|
|
),
|
|
@@ -838,7 +854,7 @@ def generate_entity_riskadjret_stats(entity_info, indicators, isToMySQL, mutable
|
|
|
|
|
|
t = null;
|
|
|
|
|
|
- if(extra_keys.isNothing() || extra_keys.isVoid()) v_extra_keys = array(STRING);
|
|
|
+ if(extra_keys.isNothing() || extra_keys.isVoid() || extra_keys.size() == 0) v_extra_keys = array(STRING);
|
|
|
else v_extra_keys = extra_keys;
|
|
|
|
|
|
if(indicators['PBI-6M'].isVoid() || indicators['PBI-6M'].size() == 0) return;
|
|
@@ -846,7 +862,7 @@ def generate_entity_riskadjret_stats(entity_info, indicators, isToMySQL, mutable
|
|
|
if(isToMySQL) {
|
|
|
|
|
|
t = sql(select =(sqlCol('entity_id'),
|
|
|
- sqlCol(extra_keys.join('end_date')),
|
|
|
+ sqlCol(v_extra_keys.join('end_date')),
|
|
|
sqlCol(['sharpe_a', 'sortino_a', 'treynor', 'jensen_a', 'calmar', 'omega', 'kappa'],
|
|
|
, ['sharperatio_6m', 'sortinoratio_6m', 'treynorratio_6m', 'jensen_6m', 'calmarratio_6m', 'omegaratio_6m', 'kapparatio_6m'])
|
|
|
),
|
|
@@ -895,7 +911,7 @@ def generate_entity_indicator(entity_info, indicators, isToMySQL, mutable entity
|
|
|
|
|
|
t = null;
|
|
|
|
|
|
- if(extra_keys.isNothing() || extra_keys.isVoid()) v_extra_keys = array(STRING);
|
|
|
+ if(extra_keys.isNothing() || extra_keys.isVoid() || extra_keys.size() == 0) v_extra_keys = array(STRING);
|
|
|
else v_extra_keys = extra_keys;
|
|
|
|
|
|
if(indicators['PBI-6M'].isVoid() || indicators['PBI-6M'].size() == 0) return;
|
|
@@ -903,7 +919,7 @@ def generate_entity_indicator(entity_info, indicators, isToMySQL, mutable entity
|
|
|
if(isToMySQL) {
|
|
|
|
|
|
t = sql(select =(sqlCol('entity_id'),
|
|
|
- sqlCol(extra_keys.join('end_date')),
|
|
|
+ sqlCol(v_extra_keys.join('end_date')),
|
|
|
sqlCol(['info_a', 'm2_a', 'track_error_a'],
|
|
|
, ['info_ratio_6m', 'm2_6m', 'tracking_error_6m'])
|
|
|
),
|
|
@@ -953,7 +969,7 @@ def generate_entity_style_stats(entity_info, indicators, isToMySQL, mutable enti
|
|
|
|
|
|
t = null;
|
|
|
|
|
|
- if(extra_keys.isNothing() || extra_keys.isVoid()) v_extra_keys = array(STRING);
|
|
|
+ if(extra_keys.isNothing() || extra_keys.isVoid() || extra_keys.size() == 0) v_extra_keys = array(STRING);
|
|
|
else v_extra_keys = extra_keys;
|
|
|
|
|
|
if(indicators['PBI-6M'].isVoid() || indicators['PBI-6M'].size() == 0) return;
|
|
@@ -961,7 +977,7 @@ def generate_entity_style_stats(entity_info, indicators, isToMySQL, mutable enti
|
|
|
if(isToMySQL) {
|
|
|
|
|
|
t = sql(select =(sqlCol('entity_id'),
|
|
|
- sqlCol(extra_keys.join('end_date')),
|
|
|
+ sqlCol(v_extra_keys.join('end_date')),
|
|
|
sqlCol(['upside_capture_ret', 'downside_capture_ret', 'upside_capture_ratio', 'downside_capture_ratio'],
|
|
|
, ['upsidecapture_ret_6m', 'downsidecapture_ret_6m', 'upsidecapture_ratio_6m', 'downsidecapture_ratio_6m'])
|
|
|
),
|
|
@@ -999,6 +1015,57 @@ def generate_entity_style_stats(entity_info, indicators, isToMySQL, mutable enti
|
|
|
|
|
|
|
|
|
/*
|
|
|
+ * 按照 XXX_ms_stats 表结构准备数据记录
|
|
|
+ *
|
|
|
+ *
|
|
|
+ */
|
|
|
+def generate_entity_ms_stats(entity_info, indicators, isToMySQL, mutable entity_ms_stats, extra_keys=[]) {
|
|
|
+
|
|
|
+ t = null;
|
|
|
+
|
|
|
+ if(extra_keys.isNothing() || extra_keys.isVoid() || extra_keys.size() == 0) v_extra_keys = array(STRING);
|
|
|
+ else v_extra_keys = extra_keys;
|
|
|
+
|
|
|
+ if(indicators['PBI-3Y'].isVoid() || indicators['PBI-3Y'].size() == 0) return;
|
|
|
+
|
|
|
+ if(isToMySQL) {
|
|
|
+
|
|
|
+ t = sql(select =(sqlCol('entity_id'),
|
|
|
+ sqlCol(v_extra_keys.join('end_date')),
|
|
|
+ sqlCol(['ms_ret_a', 'ms_rar_a', 'ms_risk_a'],
|
|
|
+ , ['ms_return_3y', 'ms_rar_3y', 'ms_risk_3y'])
|
|
|
+ ),
|
|
|
+ from = ej(indicators['PBI-3Y'] AS a, entity_info AS fi, ['entity_id'].join(v_extra_keys)),
|
|
|
+ where = < end_date >= fi_price_date.month()> // 过滤掉不必更新的旧记录
|
|
|
+ ).eval();
|
|
|
+
|
|
|
+ v_trailing = ['5y', '10y'];
|
|
|
+ for(tr in v_trailing) {
|
|
|
+
|
|
|
+ col_ms_ret = 'ms_return_' + tr;
|
|
|
+ col_ms_rar = 'ms_rar_' + tr;
|
|
|
+ col_ms_risk = 'ms_risk_' + tr;
|
|
|
+
|
|
|
+ t.addColumn([col_ms_ret, col_ms_rar, col_ms_risk],
|
|
|
+ [DOUBLE, DOUBLE, DOUBLE]);
|
|
|
+
|
|
|
+ if(!indicators['PBI-'+tr.upper()].isVoid()) {
|
|
|
+
|
|
|
+ sqlUpdate(table = t,
|
|
|
+ updates = [<ms_ret_a as _$col_ms_ret>, <ms_rar_a as _$col_ms_rar>, <ms_risk_a as _$col_ms_risk>],
|
|
|
+ from = <ej(t, indicators['PBI-'+tr.upper()], ['entity_id'].join(v_extra_keys).join(['end_date']))>
|
|
|
+ ).eval();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ INSERT INTO entity_ms_stats SELECT * FROM t;
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
* 按照 XXX_bfi_bm_indicator 表结构准备数据记录
|
|
|
*
|
|
|
* @param entity_info <TABLE>: [COLUMNS] entity_id, end_date, benchmark_id, inception_date, ini_value [,curve_type, strategy]
|
|
@@ -1011,7 +1078,7 @@ def generate_entity_bfi_indicator(entity_info, indicators, isToMySQL, mutable en
|
|
|
|
|
|
t = null;
|
|
|
|
|
|
- if(extra_keys.isNothing() || extra_keys.isVoid()) v_extra_keys = array(STRING);
|
|
|
+ if(extra_keys.isNothing() || extra_keys.isVoid() || extra_keys.size() == 0) v_extra_keys = array(STRING);
|
|
|
else v_extra_keys = extra_keys;
|
|
|
|
|
|
v_cols_from = ['upside_capture_ret', 'downside_capture_ret', 'upside_capture_ratio', 'downside_capture_ratio', 'alpha_a', 'winrate', 'beta', 'info_a', 'track_error_a', 'jensen_a'];
|