123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420 |
- module fundit::task_weeklyPerformance
- use fundit::sqlUtilities;
- use fundit::operationDataPuller;
- use fundit::performanceDataPuller;
- use fundit::indicatorCalculator;
- use fundit::rbsaCalculator;
- use fundit::navCalculator;
- use fundit::bfiMatcher;
- use fundit::dataSaver;
- def CalEntityRBSATask(entityType, entityIds, updateTime) {
- t_cal = get_entity_list_by_latest_return_updatetime(entityType, entityIds, updateTime, true);
- window = 48;
- step = 13;
- if(t_cal.isVoid() || t_cal.size() == 0) return;
- d_rbsa = get_rbsa_index();
-
- v_index = d_rbsa.values().flatten().distinct();
-
-
- t_index_ret = get_entity_return(NULL, v_index, 'w', t_cal.price_date.min().temporalAdd(-window, 'w'), today(), true);
- i = 0;
- batch_size = 200;
- total_cnt = t_cal.size();
- do {
- tb_result = table(1000:0,
- ["entity_id", "asset_type_id", "index_id", "effective_date", "level", "alternative_id", "weighting"],
- [iif(entityType=='PF', INT, STRING), STRING, STRING, STRING, INT, STRING, DOUBLE]);
- t = t_cal[i: min(total_cnt, i+batch_size)];
-
- s_json = (SELECT entity_id, price_date.temporalAdd(-window-10, 'w') AS price_date FROM t).toStdJson();
- t_entity_ret = get_entity_ret_by_date(entityType, s_json, 'w', true);
- if(entityType == 'PF') {
- v_entity_id = t_entity_ret.entity_id$INT;
- t_entity_ret.replaceColumn!('entity_id', v_entity_id);
- }
- for(entity in t) {
- entity_ret = SELECT * FROM t_entity_ret WHERE entity_id = entity.entity_id;
- for(asset_type in d_rbsa.keys()) {
- index_ret = SELECT entity_id, price_date, ret FROM t_index_ret WHERE entity_id IN d_rbsa[asset_type] AND price_date IS NOT NULL;
-
- res = cal_entity_RBSA(entityType, entity_ret, index_ret, 'w',
- entity.price_date.temporalAdd(-window-10, 'w')[0], today(), true, window, step);
-
- if(res.isVoid() || res.size() == 0) continue;
-
-
- latest_date = (EXEC price_date.max() AS price_date FROM res)[0];
-
- tb_result.tableInsert(SELECT entity_id, asset_type, index_id, price_date, level, alternative_id, weights
- FROM res WHERE price_date = latest_date);
-
- }
- }
- if(entityType IN ['MF', 'HF'])
- save_and_sync(tb_result, 'raw_db.pf_fund_rbsa_breakdown', 'raw_db.pf_fund_rbsa_breakdown', 'fund_id', 'effective_date');
- else
- save_and_sync(tb_result, 'raw_db.pf_portfolio_rbsa_breakdown', 'raw_db.pf_portfolio_rbsa_breakdown', 'portfolio_id', 'effective_date');
- i += batch_size;
- } while (i < total_cnt);
- }
- def MatchEntityBFITask(entityType, date) {
- rt = '';
- if(find(['HF', 'MF', 'PF'], entityType) < 0) return null;
-
- tb_cal_entity = get_entity_list_by_weekly_return_updatetime(entityType, NULL, date, true);
- if(tb_cal_entity.isVoid() || tb_cal_entity.size() == 0 ) return;
- i = 0;
- size = tb_cal_entity.size();
- batch_size = 100;
-
- do {
- t_tmp_entity = tb_cal_entity[i : min(size, i+batch_size)];
- i = i + batch_size;
-
- coe = cal_entity_index_coe(entityType, t_tmp_entity);
-
- if(coe.isVoid() || coe.size() == 0) continue;
- entity_info = get_entity_info(entityType, t_tmp_entity.entity_id);
-
- bfi_raw = match_entity_bfi(entityType, entity_info, coe);
-
- try {
-
-
- t_coe = SELECT entity_id, end_date, index_id,
- iif(coe_1y.abs() < get_min_threshold('correlation'), double(NULL), coe_1y) AS coe_1y,
- iif(coe_3y.abs() < get_min_threshold('correlation'), double(NULL), coe_3y) AS coe_3y,
- iif(coe_5y.abs() < get_min_threshold('correlation'), double(NULL), coe_5y) AS coe_5y,
- t_value_1y, t_value_3y, t_value_5y, beta_1y, beta_3y, beta_5y
- FROM coe;
- DELETE FROM t_coe WHERE coe_1y IS NULL AND coe_3y IS NULL AND coe_5y IS NULL;
-
- t_bfi_candidates = SELECT entity_id, end_date, index_id AS factor_id, coe_1y AS coe, coe_1y.square() AS r2, 'w' AS performance_flag, t_value_1y, beta_1y
- FROM t_coe WHERE index_id LIKE 'FA%';
-
- chg_columns_for_mysql(t_coe, iif(entityType == 'PF', 'portfolio_id', 'fund_id'));
-
- if(entityType IN ['MF', 'HF']) save_and_sync(t_coe, 'raw_db.pf_fund_index_coe', , 'fund_id', 'end_date');
-
- entity_id_col = iif(entityType == 'PF', 'portfolio_id', 'fund_id');
- chg_columns_for_mysql(t_bfi_candidates, entity_id_col);
- save_and_sync(t_bfi_candidates, iif(entityType == 'PF', 'raw_db.pf_portfolio_factor_bfi', 'raw_db.cm_fund_factor_bfi'), , entity_id_col, 'end_date');
- if(bfi_raw.isVoid() || bfi_raw.size() == 0) continue;
-
- t_bfi = SELECT entity_id, end_date, factor_id, coe_1y AS coe, r2, performance_flag, t_value_1y, beta_1y
- FROM bfi_raw ORDER BY entity_id, end_date, r2 DESC;
-
- t_max_r2 = SELECT entity_id, factor_id.first() AS factor_id, end_date,
- string(NULL) AS performance_flag, coe.first() AS coe, r2.first() AS r2, concat(factor_name, ",") AS rz_portrait
- FROM ej(t_bfi, get_bfi_index_list(), 'factor_id')
- GROUP BY entity_id, end_date;
-
- chg_columns_for_mysql(t_bfi, entity_id_col);
- save_and_sync(t_bfi, iif(entityType == 'PF', 'raw_db.pf_portfolio_factor_bfi_by_category_group', 'raw_db.pf_fund_factor_bfi_by_category_group'), , entity_id_col, 'end_date');
-
- chg_columns_for_mysql(t_max_r2, entity_id_col);
- save_and_sync(t_max_r2, iif(entityType == 'PF', 'raw_db.pf_portfolio_factor_bfi_max_r2', 'raw_db.pf_fund_factor_bfi_by_category_group_max_r2'), , entity_id_col, 'end_date');
- } catch (ex) {
-
- rt += ex;
- }
- } while (i<size)
-
- return rt;
- }
- def calEntityBfiIndicatorTask(entityType, date) {
- rt = '';
- if(!(entityType IN ['MF', 'HF', 'PF'])) return null;
- very_old_day = 1900.01.01;
- if(date.isNothing() || date.isNull())
- end_day = temporalAdd(now(), -1d);
- else
- end_day = date;
-
- isFromMySQL = iif(end_day <= 1989.01.01, false, true);
-
- tb_cal_entities = get_entity_bfi_factors(entityType, NULL, very_old_day.month(), today().month(), end_day);
- if(tb_cal_entities.isVoid() || tb_cal_entities.size() == 0 ) return;
- v_uniq_entity_id = EXEC DISTINCT entity_id FROM tb_cal_entities;
-
- tb_bfi_indicator = create_entity_bfi_indicator(iif(entityType=='PF', true, false));
-
- i = 0;
- batch_size = 100;
- do {
- entities = SELECT * FROM tb_cal_entities WHERE entity_id IN v_uniq_entity_id[i : min(v_uniq_entity_id.size(), i+batch_size)];
- if(entities.isVoid() || entities.size() == 0) break;
-
- entity_info = SELECT entity_id, end_date.temporalParse('yyyy-MM') AS end_date, inception_date, factor_id AS benchmark_id, ini_value
- FROM ej(entities, get_entity_info(entityType, entities.entity_id), 'entity_id');
-
- rets = get_monthly_ret(entityType, entity_info.entity_id, very_old_day, entity_info.end_date.max().temporalFormat('yyyy-MM-dd').temporalParse('yyyy-MM-dd').monthEnd(), isFromMySQL);
-
- v_end_date = rets.end_date.temporalParse('yyyy-MM');
- rets.replaceColumn!('end_date', v_end_date);
- if(!rets.isVoid() && rets.size() > 0) {
-
- indicators = cal_monthly_indicators(entityType, 'BFI', rets);
-
- generate_entity_bfi_indicator(entity_info, indicators, true, tb_bfi_indicator);
- }
-
- i += batch_size;
- } while (i <= v_uniq_entity_id.size());
- if(! tb_bfi_indicator.isVoid() && tb_bfi_indicator.size() > 0) {
-
- try {
- t_desc = get_bfi_indicator_table_description(entityType);
-
- chg_columns_for_mysql(tb_bfi_indicator, t_desc.sec_id_col[0]);
- db_name = t_desc.table_name[0].split('.')[0];
- save_and_sync(tb_bfi_indicator, t_desc.table_name[0].strReplace(db_name, 'raw_db'), t_desc.table_name[0].strReplace(db_name, 'raw_db'), t_desc.sec_id_col[0], 'end_date');
-
- if(end_day <= get_ini_data_const()['date'])
- save_table(tb_bfi_indicator, t_desc.table_name[0], false);
- } catch(ex) {
-
- rt = ex;
- }
- }
-
- return rt;
-
- }
- def cal_and_save_mc_weekly_nav(entity_type, entity_date, is_save_local) {
- rt = '';
- if( !(entity_type in ['PL', 'CO']) ) return rt;
- if(entity_date.isVoid() || entity_date.size() == 0) return rt;
-
- tb_entity_nav = create_mc_nav();
-
- d_curve_type = dict(INT, INT);
- d_curve_type[1] = 1;
- d_curve_type[4] = 2;
- d_curve_type[7] = -99;
-
- i = 0;
- batch_size = 1000;
- all_entity_id = entity_date.entity_id.distinct();
- do {
- tb_entity = SELECT entity_id, effective_date FROM entity_date
- WHERE entity_id IN all_entity_id[i : min(all_entity_id.size(), i+batch_size)];
- if(tb_entity.isVoid() || tb_entity.size() == 0) break;
- s_json = tb_entity.toStdJson();
- t_ret = get_mc_average_return(entity_type, 'w', s_json, 0, 1, true);
-
- for(cur in d_curve_type.keys()) {
- tmp = SELECT entity_id, cur AS curve_type, 0 AS strategy, effective_date, price_date, ret, incl_cal_cnt
- FROM t_ret WHERE raise_type = d_curve_type[cur] AND strategy = -99;
-
- tb_nav = cal_mc_nav_by_return(entity_type, tmp, 'w');
- INSERT INTO tb_entity_nav
- SELECT entity_id, curve_type, strategy, effective_date AS year_week, price_date, nav, ret, incl_cal_cnt
- FROM ej(tb_nav, tmp, ['entity_id', 'curve_type', 'strategy', 'effective_date']);
- }
- i += batch_size;
- } while (i <= all_entity_id.size());
- if(! tb_entity_nav.isVoid() && tb_entity_nav.size() > 0) {
-
- try {
- entity_id_col = iif(entity_type == 'PL', 'manager_id', 'company_id');
- tb_entity_nav.rename!('entity_id', entity_id_col);
- save_and_sync(tb_entity_nav, iif(entity_type == 'PL', 'raw_db.manager_nav', 'raw_db.company_nav'), , entity_id_col, 'year_week');
-
- if(is_save_local == true) {
- save_table(tb_entity_nav, iif(entity_type == 'PL', 'mfdb.manager_nav', 'mfdb.company_nav'), false);
- }
- } catch(ex) {
-
- rt += ex;
- }
- }
- return rt;
-
- }
- def CalMCWeeklyNavTask(entityType, updatetime) {
- if(!(entityType IN ['PL', 'CO'])) return;
- is_save_local = iif(updatetime <= get_ini_data_const()['updatetime'], true, false);
-
- if(entityType == 'PL') {
- entity_date = get_manager_list_by_fund_updatetime(updatetime, 'w');
- entity_date.rename!('manager_id', 'entity_id');
- }
- else {
- entity_date = get_company_list_by_fund_updatetime(updatetime, 'w');
- entity_date.rename!('company_id', 'entity_id');
- }
-
-
- cal_and_save_mc_weekly_nav(entityType, entity_date, is_save_local);
- entity_date = null;
- }
|