123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 |
- module fundit::task_portfolioPerformance
- use fundit::dataPuller;
- use fundit::dataSaver;
- use fundit::navCalculator;
- use fundit::returnCalculator;
- use fundit::indicatorCalculator;
- def calPortfolioNAV(portfolio_ids, updatetime=1900.01.01) {
- port_info = get_portfolio_list_by_fund_nav_updatetime(portfolio_ids, updatetime, true);
-
- tb_nav = cal_portfolio_nav(port_info);
- return tb_nav;
- }
- def calPortfolioPerformance(navs) {
- if(navs.isVoid() || navs.size() == 0) return;
- tb_navs = navs;
- tb_navs.rename!(['portfolio_id'], ['entity_id']);
- port_ids = EXEC DISTINCT entity_id from tb_navs;
- port_info = get_entity_info('PF', port_ids);
-
- tb_navs.rename!('nav', 'cumulative_nav');
- tb_month_ret = cal_monthly_returns_by_nav(port_info, tb_navs);
- tb_month_ret.rename!('cumulative_nav', 'nav');
- indicators = cal_monthly_indicators('PF', 'PBI', tb_month_ret);
- return indicators;
- }
- def cal_and_save_portfolio_nav(cal_portfolio_info) {
- rt = '';
-
- tb_portfolio_nav = create_entity_nav();
-
- i = 0;
- batch_size = 1000;
- all_portfolio_id = EXEC DISTINCT portfolio_id FROM cal_portfolio_info;
- do {
- portfolio_info = SELECT * FROM cal_portfolio_info
- WHERE portfolio_id IN all_portfolio_id[i : min(all_portfolio_id.size(), i+batch_size)];
- if(portfolio_info.isVoid() || portfolio_info.size() == 0) break;
-
- tb_ret = cal_portfolio_nav(portfolio_info);
- INSERT INTO tb_portfolio_nav SELECT portfolio_id$STRING, price_date, nav FROM tb_ret;
- i += batch_size;
- } while (i <= cal_portfolio_info.size());
- if(! tb_portfolio_nav.isVoid() && tb_portfolio_nav.size() > 0) {
-
- try {
- tb_portfolio_nav.rename!('entity_id', 'portfolio_id');
- save_and_sync(tb_portfolio_nav, 'raw_db.pf_portfolio_nav', 'raw_db.pf_portfolio_nav');
- } catch(ex) {
-
- rt = ex;
- }
- }
- return rt;
- }
- def cal_and_save_portfolio_indicators(cal_portfolio_info) {
- rt = '';
-
- tb_portfolio_performance = create_entity_performance(true);
- tb_portfolio_indicator = create_entity_indicator(true);
- tb_portfolio_risk_stats = create_entity_risk_stats(true);
- tb_portfolio_riskadjret_stats = create_entity_riskadjret_stats(true);
- tb_portfolio_style_stats = create_entity_style_stats(true);
- tb_portfolio_performance_weekly = create_entity_performance_weekly(true);
- tb_portfolio_latest_performance = create_entity_latest_performance(true);
-
- i = 0;
- batch_size = 1000;
- all_portfolio_id = EXEC DISTINCT portfolio_id FROM cal_portfolio_info;
- do {
- cal_port = SELECT * FROM cal_portfolio_info
- WHERE portfolio_id IN all_portfolio_id[i : min(all_portfolio_id.size(), i+batch_size)];
- if(cal_port.isVoid() || cal_port.size() == 0) break;
-
- s_json = (SELECT portfolio_id, 1900.01.01 AS price_date FROM cal_port GROUP BY portfolio_id).rename!('portfolio_id', 'sec_id').toStdJson();
- tb_monthly_nav = get_nav_for_return_calculation('PF', 'm', s_json);
-
- v_portfolio_id = tb_monthly_nav.sec_id$INT;
- tb_monthly_nav.replaceColumn!('sec_id', v_portfolio_id);
- tb_monthly_nav.dropColumns!('nav').rename!(['sec_id', 'cumulative_nav'], ['portfolio_id', 'nav']);
-
- indicators = calPortfolioPerformance(tb_monthly_nav);
-
- port_info = (SELECT portfolio_id, start_cal_date.min() AS price_date FROM cal_port GROUP BY portfolio_id).rename!('portfolio_id', 'entity_id');
-
- generate_entity_performance(port_info, indicators, true, tb_portfolio_performance);
- generate_entity_indicator(port_info, indicators, true, tb_portfolio_indicator);
- generate_entity_risk_stats(port_info, indicators, true, tb_portfolio_risk_stats);
- generate_entity_riskadjret_stats(port_info, indicators, true, tb_portfolio_riskadjret_stats);
- generate_entity_style_stats(port_info, indicators, true, tb_portfolio_style_stats);
-
- port_info = SELECT * FROM ej(port_info, get_entity_info('PF', all_portfolio_id[i : min(all_portfolio_id.size(), i+batch_size)]), 'entity_id')
- rets_w = cal_weekly_returns('PF', port_info);
- if(! rets_w.isVoid() && rets_w.size() > 0) {
-
- v_portfolio_id = rets_w.entity_id$INT;
- rets_w.replaceColumn!('entity_id', v_portfolio_id);
-
- generate_entity_performance_weekly(port_info, rets_w, true, tb_portfolio_performance_weekly);
- }
-
- perf_latest = cal_latest_performance('PF', port_info, true);
- if(! perf_latest.isVoid() && perf_latest.size() > 0) {
- generate_entity_latest_performance(port_info, perf_latest, true, tb_portfolio_latest_performance);
- }
- i += batch_size;
- } while (i <= cal_portfolio_info.size());
- if(! tb_portfolio_performance.isVoid() && tb_portfolio_performance.size() > 0) {
-
- try {
- chg_columns_for_mysql(tb_portfolio_performance, 'portfolio_id');
- save_and_sync(tb_portfolio_performance, 'raw_db.pf_portfolio_performance', 'raw_db.pf_portfolio_performance');
- chg_columns_for_mysql(tb_portfolio_indicator, 'portfolio_id');
- save_and_sync(tb_portfolio_indicator, 'raw_db.pf_portfolio_indicator', 'raw_db.pf_portfolio_indicator');
- chg_columns_for_mysql(tb_portfolio_risk_stats, 'portfolio_id');
- save_and_sync(tb_portfolio_risk_stats, 'raw_db.pf_portfolio_risk_stats', 'raw_db.pf_portfolio_risk_stats');
- chg_columns_for_mysql(tb_portfolio_riskadjret_stats, 'portfolio_id');
- save_and_sync(tb_portfolio_riskadjret_stats, 'raw_db.pf_portfolio_riskadjret_stats', 'raw_db.pf_portfolio_riskadjret_stats');
- chg_columns_for_mysql(tb_portfolio_style_stats, 'portfolio_id');
- save_and_sync(tb_portfolio_style_stats, 'raw_db.pf_portfolio_style_stats', 'raw_db.pf_portfolio_style_stats');
- save_and_sync(tb_portfolio_performance_weekly, 'raw_db.pf_portfolio_performance_weekly', 'raw_db.pf_portfolio_performance_weekly');
- save_and_sync(tb_portfolio_latest_performance, 'raw_db.pf_portfolio_latest_performance', 'raw_db.pf_portfolio_latest_nav_performance');
- } catch(ex) {
-
- rt = ex;
- }
- }
- return rt;
- }
- def CalPortfolioPerformanceTask(updatetime=1900.01.01) {
- rt = '';
-
- tb_cal_ports = get_portfolio_list_by_fund_nav_updatetime(NULL, updatetime, true);
- if(tb_cal_ports.isVoid() || tb_cal_ports.size() == 0) return;
-
- rt = cal_and_save_portfolio_nav(tb_cal_ports);
-
- rt = rt + '; ' + cal_and_save_portfolio_indicators(tb_cal_ports);
- }
|