|
@@ -2,17 +2,18 @@ module fundit::task_fundPerformance
|
|
|
|
|
|
use fundit::sqlUtilities
|
|
|
use fundit::dataPuller
|
|
|
+use fundit::dataSaver
|
|
|
use fundit::returnCalculator
|
|
|
use fundit::indicatorCalculator
|
|
|
use fundit::fundCalculator
|
|
|
|
|
|
|
|
|
/*
|
|
|
- * 按照 fund_performance 表结构准备数据记录
|
|
|
+ * 按照 XXX_performance 表结构准备数据记录
|
|
|
*
|
|
|
*
|
|
|
*/
|
|
|
-def generate_fund_performance(fund_info, indicators, isToMySQL, mutable fund_performance) {
|
|
|
+def generate_entity_performance(entity_info, indicators, isToMySQL, mutable entity_performance) {
|
|
|
|
|
|
t = null;
|
|
|
|
|
@@ -20,7 +21,7 @@ def generate_fund_performance(fund_info, indicators, isToMySQL, mutable fund_per
|
|
|
|
|
|
t = SELECT entity_id, end_date, price_date, nav AS cumulative_nav, ret AS ret_1m, ret AS ret_1m_a, trailing_ret AS ret_3m, trailing_ret_a AS ret_3m_a
|
|
|
FROM indicators['PBI-3M'] AS ind
|
|
|
- INNER JOIN fund_info fi ON ind.entity_id = fi.entity_id
|
|
|
+ INNER JOIN entity_info fi ON ind.entity_id = fi.entity_id
|
|
|
WHERE ind.end_date >= fi.price_date.month(); // 过滤掉不必更新的旧记录
|
|
|
|
|
|
UPDATE t
|
|
@@ -60,7 +61,7 @@ def generate_fund_performance(fund_info, indicators, isToMySQL, mutable fund_per
|
|
|
SET ret_incep = trailing_ret, ret_incep_a = trailing_ret_a
|
|
|
FROM ej(t, indicators['PBI-INCEP'], ['entity_id', 'end_date']);
|
|
|
|
|
|
- INSERT INTO fund_performance SELECT * FROM t;
|
|
|
+ INSERT INTO entity_performance SELECT * FROM t;
|
|
|
|
|
|
} else {
|
|
|
|
|
@@ -68,11 +69,11 @@ def generate_fund_performance(fund_info, indicators, isToMySQL, mutable fund_per
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * 按照 fund_risk_stats 表结构准备数据记录
|
|
|
+ * 按照 XXX_risk_stats 表结构准备数据记录
|
|
|
*
|
|
|
*
|
|
|
*/
|
|
|
-def generate_fund_risk_stats(fund_info, indicators, isToMySQL, mutable fund_risk_stats) {
|
|
|
+def generate_entity_risk_stats(entity_info, indicators, isToMySQL, mutable entity_risk_stats) {
|
|
|
|
|
|
t = null;
|
|
|
|
|
@@ -81,7 +82,7 @@ def generate_fund_risk_stats(fund_info, indicators, isToMySQL, mutable fund_risk
|
|
|
t = SELECT entity_id, end_date, std_dev_a AS stddev_6m, ds_dev_a AS downsidedev_6m, alpha_a AS alpha_6m, winrate AS winrate_6m, beta AS beta_6m,
|
|
|
skewness AS skewness_6m, kurtosis AS kurtosis_6m, wrst_month AS worstmonth_6m, drawdown AS maxdrawdown_6m
|
|
|
FROM indicators['PBI-6M'] AS ind
|
|
|
- INNER JOIN fund_info fi ON ind.entity_id = fi.entity_id
|
|
|
+ INNER JOIN entity_info fi ON ind.entity_id = fi.entity_id
|
|
|
WHERE ind.end_date >= fi.price_date.month(); // 过滤掉不必更新的旧记录
|
|
|
|
|
|
UPDATE t
|
|
@@ -124,7 +125,7 @@ def generate_fund_risk_stats(fund_info, indicators, isToMySQL, mutable fund_risk
|
|
|
skewness_incep = skewness, kurtosis_incep = kurtosis, worstmonth_incep = wrst_month, maxdrawdown_incep = drawdown
|
|
|
FROM ej(t, indicators['PBI-INCEP'], ['entity_id', 'end_date']);
|
|
|
|
|
|
- INSERT INTO fund_risk_stats SELECT * FROM t;
|
|
|
+ INSERT INTO entity_risk_stats SELECT * FROM t;
|
|
|
|
|
|
} else {
|
|
|
|
|
@@ -132,11 +133,11 @@ def generate_fund_risk_stats(fund_info, indicators, isToMySQL, mutable fund_risk
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * 按照 fund_riskadjret_stats 表结构准备数据记录
|
|
|
+ * 按照 XXX_riskadjret_stats 表结构准备数据记录
|
|
|
*
|
|
|
*
|
|
|
*/
|
|
|
-def generate_fund_riskadjret_stats(fund_info, indicators, isToMySQL, mutable fund_riskadjret_stats) {
|
|
|
+def generate_entity_riskadjret_stats(entity_info, indicators, isToMySQL, mutable entity_riskadjret_stats) {
|
|
|
|
|
|
t = null;
|
|
|
|
|
@@ -146,7 +147,7 @@ def generate_fund_riskadjret_stats(fund_info, indicators, isToMySQL, mutable fun
|
|
|
sharpe_a AS sharperatio_6m, sortino_a AS sortinoratio_6m, treynor AS treynorratio_6m, jensen_a AS jensen_6m,
|
|
|
calmar AS calmarratio_6m, omega AS omegaratio_6m, kappa AS kapparatio_6m
|
|
|
FROM indicators['PBI-6M'] AS ind
|
|
|
- INNER JOIN fund_info fi ON ind.entity_id = fi.entity_id
|
|
|
+ INNER JOIN entity_info fi ON ind.entity_id = fi.entity_id
|
|
|
WHERE ind.end_date >= fi.price_date.month(); // 过滤掉不必更新的旧记录
|
|
|
|
|
|
UPDATE t
|
|
@@ -189,7 +190,7 @@ def generate_fund_riskadjret_stats(fund_info, indicators, isToMySQL, mutable fun
|
|
|
calmarratio_incep = calmar, omegaratio_incep = omega, kapparatio_incep = kappa
|
|
|
FROM ej(t, indicators['PBI-INCEP'], ['entity_id', 'end_date']);
|
|
|
|
|
|
- INSERT INTO fund_riskadjret_stats SELECT * FROM t;
|
|
|
+ INSERT INTO entity_riskadjret_stats SELECT * FROM t;
|
|
|
|
|
|
} else {
|
|
|
|
|
@@ -197,11 +198,11 @@ def generate_fund_riskadjret_stats(fund_info, indicators, isToMySQL, mutable fun
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * 按照 fund_indicator 表结构准备数据记录
|
|
|
+ * 按照 XXX_indicator 表结构准备数据记录
|
|
|
*
|
|
|
*
|
|
|
*/
|
|
|
-def generate_fund_indicator(fund_info, indicators, isToMySQL, mutable fund_indicator) {
|
|
|
+def generate_entity_indicator(entity_info, indicators, isToMySQL, mutable entity_indicator) {
|
|
|
|
|
|
t = null;
|
|
|
|
|
@@ -209,7 +210,7 @@ def generate_fund_indicator(fund_info, indicators, isToMySQL, mutable fund_indic
|
|
|
|
|
|
t = SELECT entity_id, end_date, info_a AS info_ratio_6m, m2_a AS m2_6m, track_error_a AS tracking_error_6m
|
|
|
FROM indicators['PBI-6M'] AS ind
|
|
|
- INNER JOIN fund_info fi ON ind.entity_id = fi.entity_id
|
|
|
+ INNER JOIN entity_info fi ON ind.entity_id = fi.entity_id
|
|
|
WHERE ind.end_date >= fi.price_date.month(); // 过滤掉不必更新的旧记录
|
|
|
|
|
|
UPDATE t
|
|
@@ -244,7 +245,7 @@ def generate_fund_indicator(fund_info, indicators, isToMySQL, mutable fund_indic
|
|
|
SET info_ratio_incep = info_a, m2_incep = m2_a, tracking_error_incep = track_error_a, var_incep = var, cvar_incep = cvar
|
|
|
FROM ej(t, indicators['PBI-INCEP'], ['entity_id', 'end_date']);
|
|
|
|
|
|
- INSERT INTO fund_indicator SELECT * FROM t;
|
|
|
+ INSERT INTO entity_indicator SELECT * FROM t;
|
|
|
|
|
|
} else {
|
|
|
|
|
@@ -252,11 +253,11 @@ def generate_fund_indicator(fund_info, indicators, isToMySQL, mutable fund_indic
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * 按照 fund_style_stats 表结构准备数据记录
|
|
|
+ * 按照 XXX_style_stats 表结构准备数据记录
|
|
|
*
|
|
|
*
|
|
|
*/
|
|
|
-def generate_fund_style_stats(fund_info, indicators, isToMySQL, mutable fund_style_stats) {
|
|
|
+def generate_entity_style_stats(entity_info, indicators, isToMySQL, mutable entity_style_stats) {
|
|
|
|
|
|
t = null;
|
|
|
|
|
@@ -265,7 +266,7 @@ def generate_fund_style_stats(fund_info, indicators, isToMySQL, mutable fund_sty
|
|
|
t = SELECT entity_id, end_date, upside_capture_ret AS upsidecapture_ret_6m, downside_capture_ret AS downsidecapture_ret_6m,
|
|
|
upside_capture_ratio AS upsidecapture_ratio_6m, downside_capture_ratio AS downsidecapture_ratio_6m
|
|
|
FROM indicators['PBI-6M'] AS ind
|
|
|
- INNER JOIN fund_info fi ON ind.entity_id = fi.entity_id
|
|
|
+ INNER JOIN entity_info fi ON ind.entity_id = fi.entity_id
|
|
|
WHERE ind.end_date >= fi.price_date.month(); // 过滤掉不必更新的旧记录
|
|
|
|
|
|
UPDATE t
|
|
@@ -308,152 +309,59 @@ def generate_fund_style_stats(fund_info, indicators, isToMySQL, mutable fund_sty
|
|
|
upsidecapture_ratio_incep = upside_capture_ratio, downsidecapture_ratio_incep = downside_capture_ratio
|
|
|
FROM ej(t, indicators['PBI-INCEP'], ['entity_id', 'end_date']);
|
|
|
|
|
|
- INSERT INTO fund_style_stats SELECT * FROM t;
|
|
|
+ INSERT INTO entity_style_stats SELECT * FROM t;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * 建表 fund_performance
|
|
|
- */
|
|
|
-def create_fund_performance() {
|
|
|
-
|
|
|
- return table(1000:0,
|
|
|
- ['entity_id', 'end_date', 'price_date', 'cumulative_nav',
|
|
|
- 'ret_1m', 'ret_1m_a', 'ret_3m', 'ret_3m_a', 'ret_6m', 'ret_6m_a',
|
|
|
- 'ret_1y', 'ret_1y_a', 'ret_2y', 'ret_2y_a', 'ret_3y', 'ret_3y_a', 'ret_4y', 'ret_4y_a',
|
|
|
- 'ret_5y', 'ret_5y_a', 'ret_10y', 'ret_10y_a', 'ret_ytd', 'ret_ytd_a', 'ret_incep', 'ret_incep_a'],
|
|
|
- [SYMBOL, MONTH, DATE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE]);
|
|
|
-}
|
|
|
|
|
|
/*
|
|
|
- * 建表 fund_indicator
|
|
|
+ * 按照 XXX_performance_weekly 表结构准备数据记录
|
|
|
+ *
|
|
|
+ *
|
|
|
*/
|
|
|
-def create_fund_indicator() {
|
|
|
-
|
|
|
- return table(1000:0,
|
|
|
- ['entity_id', 'end_date',
|
|
|
- 'info_ratio_6m', 'm2_6m', 'tracking_error_6m',
|
|
|
- 'info_ratio_1y', 'm2_1y', 'tracking_error_1y',
|
|
|
- 'info_ratio_2y', 'm2_2y', 'tracking_error_2y', 'var_2y', 'cvar_2y',
|
|
|
- 'info_ratio_3y', 'm2_3y', 'tracking_error_3y', 'var_3y', 'cvar_3y',
|
|
|
- 'info_ratio_4y', 'm2_4y', 'tracking_error_4y', 'var_4y', 'cvar_4y',
|
|
|
- 'info_ratio_5y', 'm2_5y', 'tracking_error_5y', 'var_5y', 'cvar_5y',
|
|
|
- 'info_ratio_10y', 'm2_10y', 'tracking_error_10y', 'var_10y', 'cvar_10y',
|
|
|
- 'info_ratio_ytd', 'm2_ytd', 'tracking_error_ytd',
|
|
|
- 'info_ratio_incep', 'm2_incep','tracking_error_incep', 'var_incep', 'cvar_incep'],
|
|
|
- [SYMBOL, MONTH,
|
|
|
- DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE]);
|
|
|
-}
|
|
|
+def generate_entity_performance_weekly(entity_info, ret_w, isToMySQL, mutable entity_performance_weekly) {
|
|
|
|
|
|
-/*
|
|
|
- * 建表 fund_risk_stats
|
|
|
- */
|
|
|
-def create_fund_risk_stats() {
|
|
|
-
|
|
|
- return table(1000:0,
|
|
|
- ['entity_id', 'end_date',
|
|
|
- 'stddev_6m', 'downsidedev_6m', 'alpha_6m', 'winrate_6m', 'beta_6m', 'skewness_6m', 'kurtosis_6m', 'worstmonth_6m', 'maxdrawdown_6m',
|
|
|
- 'stddev_1y', 'downsidedev_1y', 'alpha_1y', 'winrate_1y', 'beta_1y', 'skewness_1y', 'kurtosis_1y', 'worstmonth_1y', 'maxdrawdown_1y',
|
|
|
- 'stddev_2y', 'downsidedev_2y', 'alpha_2y', 'winrate_2y', 'beta_2y', 'skewness_2y', 'kurtosis_2y', 'worstmonth_2y', 'maxdrawdown_2y',
|
|
|
- 'stddev_3y', 'downsidedev_3y', 'alpha_3y', 'winrate_3y', 'beta_3y', 'skewness_3y', 'kurtosis_3y', 'worstmonth_3y', 'maxdrawdown_3y',
|
|
|
- 'stddev_4y', 'downsidedev_4y', 'alpha_4y', 'winrate_4y', 'beta_4y', 'skewness_4y', 'kurtosis_4y', 'worstmonth_4y', 'maxdrawdown_4y',
|
|
|
- 'stddev_5y', 'downsidedev_5y', 'alpha_5y', 'winrate_5y', 'beta_5y', 'skewness_5y', 'kurtosis_5y', 'worstmonth_5y', 'maxdrawdown_5y',
|
|
|
- 'stddev_10y', 'downsidedev_10y','alpha_10y', 'winrate_10y', 'beta_10y', 'skewness_10y', 'kurtosis_10y', 'worstmonth_10y', 'maxdrawdown_10y',
|
|
|
- 'stddev_ytd', 'downsidedev_ytd', 'alpha_ytd', 'winrate_ytd', 'beta_ytd', 'skewness_ytd', 'kurtosis_ytd', 'worstmonth_ytd', 'maxdrawdown_ytd',
|
|
|
- 'stddev_incep', 'downsidedev_incep', 'alpha_incep', 'winrate_incep', 'beta_incep', 'skewness_incep', 'kurtosis_incep', 'worstmonth_incep', 'maxdrawdown_incep'],
|
|
|
- [SYMBOL, MONTH,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE]);
|
|
|
+ t = null;
|
|
|
|
|
|
-}
|
|
|
+ if(isToMySQL) {
|
|
|
|
|
|
-/*
|
|
|
- * 建表 fund_riskadjret_stats
|
|
|
- */
|
|
|
-def create_fund_riskadjret_stats() {
|
|
|
-
|
|
|
- return table(1000:0,
|
|
|
- ['entity_id', 'end_date',
|
|
|
- 'sharperatio_6m', 'sortinoratio_6m', 'treynorratio_6m', 'jensen_6m', 'calmarratio_6m', 'omegaratio_6m', 'kapparatio_6m',
|
|
|
- 'sharperatio_1y', 'sortinoratio_1y', 'treynorratio_1y', 'jensen_1y', 'calmarratio_1y', 'omegaratio_1y', 'kapparatio_1y',
|
|
|
- 'sharperatio_2y', 'sortinoratio_2y', 'treynorratio_2y', 'jensen_2y', 'calmarratio_2y', 'omegaratio_2y', 'kapparatio_2y',
|
|
|
- 'sharperatio_3y', 'sortinoratio_3y', 'treynorratio_3y', 'jensen_3y', 'calmarratio_3y', 'omegaratio_3y', 'kapparatio_3y',
|
|
|
- 'sharperatio_4y', 'sortinoratio_4y', 'treynorratio_4y', 'jensen_4y', 'calmarratio_4y', 'omegaratio_4y', 'kapparatio_4y',
|
|
|
- 'sharperatio_5y', 'sortinoratio_5y', 'treynorratio_5y', 'jensen_5y', 'calmarratio_5y', 'omegaratio_5y', 'kapparatio_5y',
|
|
|
- 'sharperatio_10y', 'sortinoratio_10y', 'treynorratio_10y', 'jensen_10y', 'calmarratio_10y', 'omegaratio_10y', 'kapparatio_10y',
|
|
|
- 'sharperatio_ytd', 'sortinoratio_ytd', 'treynorratio_ytd', 'jensen_ytd', 'calmarratio_ytd', 'omegaratio_ytd', 'kapparatio_ytd',
|
|
|
- 'sharperatio_incep', 'sortinoratio_incep', 'treynorratio_incep', 'jensen_incep', 'calmarratio_incep', 'omegaratio_incep', 'kapparatio_incep'],
|
|
|
- [SYMBOL, MONTH,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE]);
|
|
|
-}
|
|
|
+ t = SELECT entity_id, year_week, year_week.left(4)$INT AS end_year, year_week.right(2)$INT AS week_of_year, price_date,
|
|
|
+ cumulative_nav, ret_1w
|
|
|
+ FROM ret_w r
|
|
|
+ INNER JOIN entity_info fi ON r.entity_id = fi.entity_id
|
|
|
+ WHERE r.price_date >= fi.price_date; // 过滤掉不必更新的旧记录
|
|
|
+
|
|
|
+ INSERT INTO entity_performance_weekly SELECT * FROM t;
|
|
|
|
|
|
-/*
|
|
|
- * 建表 fund_style_stats
|
|
|
- */
|
|
|
-def create_fund_style_stats() {
|
|
|
-
|
|
|
- return table(1000:0,
|
|
|
- ['entity_id', 'end_date',
|
|
|
- 'upsidecapture_ret_6m', 'downsidecapture_ret_6m', 'upsidecapture_ratio_6m', 'downsidecapture_ratio_6m',
|
|
|
- 'upsidecapture_ret_1y', 'downsidecapture_ret_1y', 'upsidecapture_ratio_1y', 'downsidecapture_ratio_1y',
|
|
|
- 'upsidecapture_ret_2y', 'downsidecapture_ret_2y', 'upsidecapture_ratio_2y', 'downsidecapture_ratio_2y',
|
|
|
- 'upsidecapture_ret_3y', 'downsidecapture_ret_3y', 'upsidecapture_ratio_3y', 'downsidecapture_ratio_3y',
|
|
|
- 'upsidecapture_ret_4y', 'downsidecapture_ret_4y', 'upsidecapture_ratio_4y', 'downsidecapture_ratio_4y',
|
|
|
- 'upsidecapture_ret_5y', 'downsidecapture_ret_5y', 'upsidecapture_ratio_5y', 'downsidecapture_ratio_5y',
|
|
|
- 'upsidecapture_ret_10y', 'downsidecapture_ret_10y', 'upsidecapture_ratio_10y', 'downsidecapture_ratio_10y',
|
|
|
- 'upsidecapture_ret_ytd', 'downsidecapture_ret_ytd', 'upsidecapture_ratio_ytd', 'downsidecapture_ratio_ytd',
|
|
|
- 'upsidecapture_ret_incep', 'downsidecapture_ret_incep', 'upsidecapture_ratio_incep', 'downsidecapture_ratio_incep'],
|
|
|
- [SYMBOL, MONTH,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE,
|
|
|
- DOUBLE, DOUBLE, DOUBLE, DOUBLE]);
|
|
|
+ } else {
|
|
|
+
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * 根据 mysql 表改动某些字段
|
|
|
+ * 按照 XXX_latest_performance 表结构准备数据记录
|
|
|
+ *
|
|
|
+ *
|
|
|
*/
|
|
|
-def chg_columns_for_mysql(mutable tb_mysql) {
|
|
|
+def generate_entity_latest_performance(entity_info, perf_latest, isToMySQL, mutable entity_latest_performance) {
|
|
|
+
|
|
|
+ t = null;
|
|
|
+
|
|
|
+ if(isToMySQL) {
|
|
|
|
|
|
- tb_mysql.rename!('entity_id', 'fund_id');
|
|
|
+ t = SELECT r.*
|
|
|
+ FROM perf_latest r
|
|
|
+ INNER JOIN entity_info fi ON r.entity_id = fi.entity_id
|
|
|
+ WHERE r.price_date >= fi.price_date; // 过滤掉不必更新的旧记录
|
|
|
+
|
|
|
+ INSERT INTO entity_latest_performance SELECT * FROM t;
|
|
|
|
|
|
- // 将 dolphinDB 的 MONTH 换成 MySQL 的 YYYY-MM 格式
|
|
|
- v_end_date = EXEC end_date.temporalFormat('yyyy-MM') FROM tb_mysql;
|
|
|
- tb_mysql.replaceColumn!('end_date', v_end_date);
|
|
|
+ } else {
|
|
|
+
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|
|
@@ -473,17 +381,20 @@ def calFundPerformance(entityType, date) {
|
|
|
|
|
|
if(find(['HF', 'MF'], entityType) < 0) return null;
|
|
|
|
|
|
- // 取有最新净值变动的基金列表
|
|
|
+ // 取有最新净值变动的基金列表 (1s)
|
|
|
tb_cal_funds = get_entity_list_by_nav_updatetime(entityType, NULL, date, true);
|
|
|
|
|
|
if(tb_cal_funds.isVoid() || tb_cal_funds.size() == 0 ) return;
|
|
|
|
|
|
|
|
|
- tb_fund_performance = create_fund_performance();
|
|
|
- tb_fund_indicator = create_fund_indicator();
|
|
|
- tb_fund_risk_stats = create_fund_risk_stats();
|
|
|
- tb_fund_riskadjret_stats = create_fund_riskadjret_stats();
|
|
|
- tb_fund_style_stats = create_fund_style_stats();
|
|
|
+ tb_fund_performance = create_entity_performance();
|
|
|
+ tb_fund_indicator = create_entity_indicator();
|
|
|
+ tb_fund_risk_stats = create_entity_risk_stats();
|
|
|
+ tb_fund_riskadjret_stats = create_entity_riskadjret_stats();
|
|
|
+ tb_fund_style_stats = create_entity_style_stats();
|
|
|
+
|
|
|
+ tb_fund_performance_weekly = create_entity_performance_weekly();
|
|
|
+ tb_fund_latest_performance = create_entity_latest_performance();
|
|
|
|
|
|
// 分批跑
|
|
|
i = 0;
|
|
@@ -492,55 +403,82 @@ def calFundPerformance(entityType, date) {
|
|
|
|
|
|
do {
|
|
|
|
|
|
- funds = tb_cal_funds[i:batch_size];
|
|
|
+ funds = tb_cal_funds[i : min(tb_cal_funds.size(), i+batch_size)];
|
|
|
+ //funds = SELECT * FROM tb_cal_funds WHERE entity_id in ('MF00003PXI', 'MF00003PXX')
|
|
|
+
|
|
|
+ if(funds.isVoid() || funds.size() == 0) break;
|
|
|
|
|
|
+ // 200ms
|
|
|
fund_info = SELECT entity_id, price_date, inception_date, benchmark_id, ini_value
|
|
|
FROM ej(funds, get_fund_info(funds.entity_id), 'entity_id', 'fund_id');
|
|
|
|
|
|
- // 计算月收益
|
|
|
+ // 计算月收益 (12s)
|
|
|
rets = mix_monthly_returns(entityType, fund_info);
|
|
|
|
|
|
- // 计算月度指标
|
|
|
- rets.rename!('cumulative_nav', 'nav');
|
|
|
- indicators = cal_monthly_indicators(entityType, 'PBI', rets);
|
|
|
+ if(!rets.isVoid() && rets.size() > 0) {
|
|
|
+
|
|
|
+ // 计算月度指标 (56s)
|
|
|
+ rets.rename!('cumulative_nav', 'nav');
|
|
|
+ indicators = cal_monthly_indicators(entityType, 'PBI', rets);
|
|
|
|
|
|
- // TODO: 最新更新的指标存入数据库
|
|
|
- generate_fund_performance(fund_info, indicators, true, tb_fund_performance);
|
|
|
- generate_fund_indicator(fund_info, indicators, true, tb_fund_indicator);
|
|
|
- generate_fund_risk_stats(fund_info, indicators, true, tb_fund_risk_stats);
|
|
|
- generate_fund_riskadjret_stats(fund_info, indicators, true, tb_fund_riskadjret_stats);
|
|
|
- generate_fund_style_stats(fund_info, indicators, true, tb_fund_style_stats);
|
|
|
+ // 仿照MySQL的表结构准备好记录 (1s)
|
|
|
+ generate_entity_performance(fund_info, indicators, true, tb_fund_performance);
|
|
|
+ generate_entity_indicator(fund_info, indicators, true, tb_fund_indicator);
|
|
|
+ generate_entity_risk_stats(fund_info, indicators, true, tb_fund_risk_stats);
|
|
|
+ generate_entity_riskadjret_stats(fund_info, indicators, true, tb_fund_riskadjret_stats);
|
|
|
+ generate_entity_style_stats(fund_info, indicators, true, tb_fund_style_stats);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // 计算周收益 (8s)
|
|
|
+ rets_w = cal_weekly_returns(entityType, fund_info);
|
|
|
+
|
|
|
+ if(! rets_w.isVoid() && rets_w.size() > 0) {
|
|
|
+ generate_entity_performance_weekly(fund_info, rets_w, true, tb_fund_performance_weekly);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 计算最新收益 (69s)
|
|
|
+ perf_latest = cal_latest_performance(entityType, fund_info, true);
|
|
|
+
|
|
|
+ if(! perf_latest.isVoid() && perf_latest.size() > 0) {
|
|
|
+ generate_entity_latest_performance(fund_info, perf_latest, true, tb_fund_latest_performance);
|
|
|
+ }
|
|
|
|
|
|
i += batch_size;
|
|
|
|
|
|
- } while (i < batch_size);
|
|
|
-// } while (i <= tb_cal_funds.size());
|
|
|
+// } while (i < batch_size);
|
|
|
+ } while (i <= tb_cal_funds.size());
|
|
|
+
|
|
|
|
|
|
+ if(! tb_fund_performance.isVoid() && tb_fund_performance.size() > 0) {
|
|
|
|
|
|
- // saverisk_stats
|
|
|
- try {
|
|
|
+ // save data to MySQL (13s)
|
|
|
+ try {
|
|
|
|
|
|
- chg_columns_for_mysql(tb_fund_performance);
|
|
|
- save_table(tb_fund_performance, 'mfdb.fund_performance', true);
|
|
|
+ chg_columns_for_mysql(tb_fund_performance, 'fund_id');
|
|
|
+ save_and_sync(tb_fund_performance, 'raw_db.fund_performance', 'raw_db.sync_fund_performance_from_dolphin');
|
|
|
|
|
|
- chg_columns_for_mysql(tb_fund_indicator);
|
|
|
- save_table(tb_fund_indicator, 'mfdb.fund_indicator', true);
|
|
|
+ chg_columns_for_mysql(tb_fund_indicator, 'fund_id');
|
|
|
+ save_table(tb_fund_indicator, 'raw_db.fund_indicator', true);
|
|
|
|
|
|
- chg_columns_for_mysql(tb_fund_risk_stats);
|
|
|
- save_table(tb_fund_risk_stats, 'mfdb.fund_risk_stats', true);
|
|
|
+ chg_columns_for_mysql(tb_fund_risk_stats, 'fund_id');
|
|
|
+ save_table(tb_fund_risk_stats, 'raw_db.fund_risk_stats', true);
|
|
|
|
|
|
- chg_columns_for_mysql(tb_fund_riskadjret_stats);
|
|
|
- save_table(tb_fund_riskadjret_stats, 'mfdb.fund_riskadjret_stats', true);
|
|
|
+ chg_columns_for_mysql(tb_fund_riskadjret_stats, 'fund_id');
|
|
|
+ save_table(tb_fund_riskadjret_stats, 'raw_db.fund_riskadjret_stats', true);
|
|
|
|
|
|
- chg_columns_for_mysql(tb_fund_style_stats);
|
|
|
- save_table(tb_fund_style_stats, 'mfdb.fund_style_stats', true);
|
|
|
+ chg_columns_for_mysql(tb_fund_style_stats, 'fund_id');
|
|
|
+ save_table(tb_fund_style_stats, 'raw_db.fund_style_stats', true);
|
|
|
|
|
|
- } catch(ex) {
|
|
|
+ save_table(tb_fund_performance_weekly, 'raw_db.fund_performance_weekly', true);
|
|
|
|
|
|
- //TODO: Log errors
|
|
|
+ save_table(tb_fund_latest_performance, 'raw_db.fund_latest_performance', true);
|
|
|
|
|
|
- rt = ex;
|
|
|
+ } catch(ex) {
|
|
|
|
|
|
+ //TODO: Log errors
|
|
|
+ rt = ex;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
return rt;
|