task_monthlyPerformance.dos 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. module fundit::task_monthlyPerformance
  2. use fundit::dataPuller;
  3. use fundit::dataSaver;
  4. use fundit::bfiMatcher;
  5. use fundit::rankingCalculator;
  6. /*
  7. * [定时任务] 计算基金一、二级分类排名并存入数据库
  8. *
  9. * @param entity_type <STRING>: 'MF', 'HF'
  10. * @param end_date <MONTH>:
  11. * @param isFromMySQL <BOOL>: false 时读取dolphin本地的收益及指标表,用于初始化数据
  12. *
  13. *
  14. * Example: CalEntityRankingTask('MF', 2024.09M, true);
  15. */
  16. def CalEntityRankingTask(entity_type, end_date, isFromMySQL=true) {
  17. if(!(entity_type in ['MF', 'HF'])) return NULL;
  18. entity_info = get_entity_info(entity_type, NULL);
  19. v_ranking_tables = cal_indicator_ranking('strategy', entity_type, entity_info, end_date, isFromMySQL);
  20. save_ranking_tables(entity_type, v_ranking_tables);
  21. }
  22. /*
  23. * [定时任务] 计算基金BFI排名并存入数据库
  24. *
  25. * @param entity_type <STRING>: 'MF', 'HF'
  26. * @param end_date <MONTH>:
  27. * @param isFromMySQL <BOOL>: false 时读取dolphin本地的收益及指标表,用于初始化数据
  28. *
  29. *
  30. * Example: CalEntityBfiRankingTask('MF', 2024.09M, true);
  31. */
  32. def CalEntityBfiRankingTask(entity_type, end_date, isFromMySQL=true) {
  33. if(!(entity_type in ['MF', 'HF'])) return NULL;
  34. entity_info = get_entity_info(entity_type, NULL);
  35. v_ranking_tables = cal_indicator_ranking('bfi', entity_type, entity_info, end_date, isFromMySQL);
  36. save_ranking_tables(entity_type, v_ranking_tables);
  37. }
  38. /*
  39. * Private Method: 计算相对排名并存入数据库
  40. *
  41. *
  42. */
  43. def cal_and_save_relative_ranking(entity_type, benchmark_ranking, entity_ranking, ranking_by, isFromMySQL=true) {
  44. t_entity_ranking = entity_ranking;
  45. cal_relative_ranking(benchmark_ranking, t_entity_ranking, isFromMySQL);
  46. t_entity_ranking.rename!('category_id', ranking_by);
  47. save_relative_ranking_table(entity_type, t_entity_ranking, ranking_by);
  48. }
  49. /*
  50. *
  51. * 以公募基金为评级参考,计算组合、私有基金收益及指标排名
  52. *
  53. *
  54. * Example: CalRelativeRanking('PF', 2024.09M, true);
  55. */
  56. def CalRelativeRanking(entity_type, end_date, isFromMySQL=true) {
  57. entity_info = get_entity_info(entity_type, NULL);
  58. if(entity_type == 'PF')
  59. entity_info = SELECT * FROM entity_info WHERE portfolio_type IN (1, 2) // 1: 用户组合、2:客户真实组合,忽略客户推荐组合、总览综合等虚拟组合
  60. v_ranking_by = ['strategy', 'substrategy'/*, 'factor_id'*/];
  61. // 暂时以公募混合基金为排名参考
  62. for(ranking_by in v_ranking_by) {
  63. if(ranking_by == 'strategy') {
  64. v_category = EXEC DISTINCT strategy FROM entity_info WHERE strategy IS NOT NULL;
  65. tb_fund_ranking = get_fund_indicator_ranking(NULL, end_date, v_category, true)
  66. } else if(ranking_by == 'substrategy') {
  67. v_category = EXEC DISTINCT substrategy FROM entity_info WHERE substrategy IS NOT NULL;
  68. tb_fund_ranking = get_fund_indicator_substrategy_ranking(NULL, end_date, v_category, true)
  69. } else if(ranking_by == 'bfi') {
  70. tb_fund_ranking = null;
  71. }
  72. if(tb_fund_ranking.isVoid() || tb_fund_ranking.size() == 0) return;
  73. tb_fund_ranking.rename!(ranking_by, 'category_id');
  74. // 收益
  75. v_indicator_id = [1];
  76. benchmark_ranking = SELECT * FROM tb_fund_ranking WHERE indicator_id IN v_indicator_id;
  77. entity_ranking = transform_return_for_ranking(entity_type, entity_info, end_date, ranking_by, isFromMySQL).rename!(ranking_by, 'category_id');
  78. cal_and_save_relative_ranking(entity_type, benchmark_ranking, entity_ranking, ranking_by, isFromMySQL);
  79. // 风险指标
  80. v_indicator_id = [2, 6, 9, 10, 11, 12, 21, 50, 52, 59];
  81. benchmark_ranking = SELECT * FROM tb_fund_ranking WHERE indicator_id IN v_indicator_id;
  82. entity_ranking = transform_risk_stats_for_ranking(entity_type, entity_info, end_date, ranking_by, isFromMySQL).rename!(ranking_by, 'category_id');
  83. cal_and_save_relative_ranking(entity_type, benchmark_ranking, entity_ranking, ranking_by, isFromMySQL);
  84. // 风险调整收益指标
  85. v_indicator_id = [14, 15, 16, 17, 18, 19, 40, 58];
  86. benchmark_ranking = SELECT * FROM tb_fund_ranking WHERE indicator_id IN v_indicator_id;
  87. entity_ranking = transform_risk_adj_ret_stats_for_ranking(entity_type, entity_info, end_date, ranking_by, isFromMySQL).rename!(ranking_by, 'category_id');
  88. cal_and_save_relative_ranking(entity_type, benchmark_ranking, entity_ranking, ranking_by, isFromMySQL);
  89. // 其它风险指标
  90. v_indicator_id = [37, 38, 41, 42, 43, 44, 45, 46, 47, 48, 49];
  91. benchmark_ranking = SELECT * FROM tb_fund_ranking WHERE indicator_id IN v_indicator_id;
  92. entity_ranking = transform_other_indicator_for_ranking(entity_type, entity_info, end_date, ranking_by, isFromMySQL).rename!(ranking_by, 'category_id');
  93. cal_and_save_relative_ranking(entity_type, benchmark_ranking, entity_ranking, ranking_by, isFromMySQL);
  94. // 上下行捕获指标
  95. v_indicator_id = [33, 34, 35, 36];
  96. benchmark_ranking = SELECT * FROM tb_fund_ranking WHERE indicator_id IN v_indicator_id;
  97. entity_ranking = transform_capture_style_for_ranking(entity_type, entity_info, end_date, ranking_by, isFromMySQL).rename!(ranking_by, 'category_id');
  98. cal_and_save_relative_ranking(entity_type, benchmark_ranking, entity_ranking, ranking_by, isFromMySQL);
  99. }
  100. // SELECT * FROM entity_ranking WHERE entity_id = 143109
  101. }