Browse Source

小修小补

Joey 6 months ago
parent
commit
7951c381d4
1 changed files with 17 additions and 13 deletions
  1. 17 13
      modules/returnCalculator.dos

+ 17 - 13
modules/returnCalculator.dos

@@ -81,7 +81,11 @@ def mix_monthly_returns(entity_type, entity_info) {
         FROM historical_rets h
         WHERE NOT EXISTS ( SELECT * FROM ret WHERE entity_id = historical_rets.entity_id AND end_date = historical_rets.end_date.temporalParse('yyyy-MM') );
 
-    return SELECT * FROM ret ORDER BY entity_id, end_date, price_date;
+    // 过滤掉成立日之前的收益
+    return SELECT ret.* 
+           FROM ret INNER JOIN entity_info ei ON ret.entity_id = ei.entity_id
+           WHERE ret.end_date >= ei.inception_date.month()
+           ORDER BY entity_id, end_date, price_date;
 }
 
 
@@ -115,41 +119,41 @@ def cal_fund_monthly_returns(entity_type, fund_ids, isFromMySQL){
     // 基金净值
     tb_nav = SELECT * FROM get_nav_by_price_date(entity_type, fund_ids, very_old_price_date, isFromMySQL);
 
-    tb_month_end = table(100:0, ['fund_id', 'price_date'], [STRING, DATE]);
+    tb_month_end = table(100:0, ['entity_id', 'price_date'], [STRING, DATE]);
     // 填充好各基金有效期内所有月份的最后一天
     for( f in tb_fund_info )
     {
-        INSERT INTO tb_month_end SELECT fund_id, price_date FROM table(f.fund_id.take(1) AS fund_id).cj(table(temporalSeq(f.inception_date, today(), 'M') AS price_date)) ;
+        INSERT INTO tb_month_end SELECT fund_id AS entity_id, price_date FROM table(f.fund_id.take(1) AS fund_id).cj(table(temporalSeq(f.inception_date, today(), 'M') AS price_date)) ;
     }
 
     UPDATE tb_month_end SET end_date = price_date.month();
     
-    tb_monthly_nav = SELECT fund_id, monthEnd(price_date).month().last() AS end_date, price_date.last() AS price_date, cumulative_nav.last() AS cumulative_nav
+    tb_monthly_nav = SELECT entity_id, monthEnd(price_date).month().last() AS end_date, price_date.last() AS price_date, cumulative_nav.last() AS cumulative_nav
                      FROM tb_nav
-                     GROUP BY fund_id, monthEnd(price_date);
+                     GROUP BY entity_id, monthEnd(price_date);
 
     // 完整月末日期的净值序列(包括缺失数据为NULL)
-    tb_monthly_nav = SELECT me.fund_id, me.end_date, n.price_date, n.cumulative_nav
+    tb_monthly_nav = SELECT me.entity_id, me.end_date, n.price_date, n.cumulative_nav
                      FROM tb_month_end me
-                     LEFT JOIN tb_monthly_nav n ON me.fund_id = n.fund_id AND me.end_date = n.end_date
-                     ORDER BY me.fund_id, me.end_date;
+                     LEFT JOIN tb_monthly_nav n ON me.entity_id = n.entity_id AND me.end_date = n.end_date
+                     ORDER BY me.entity_id, me.end_date;
 
     // 补一下成立日的初始净值
     // NOTE: DolphinDB 遇见 EXISTS 语句时,似乎主表的 alias 失效,只好用全名
     INSERT INTO tb_monthly_nav 
-        SELECT fund_id, inception_date.month(), inception_date, ifNull(ini_value, 1)
+        SELECT fund_id AS entity_id, inception_date.month(), inception_date, ifNull(ini_value, 1)
         FROM tb_fund_info fi
-        WHERE NOT EXISTS ( SELECT * FROM tb_monthly_nav n WHERE fund_id = tb_fund_info.fund_id AND n.price_date = tb_fund_info.inception_date);
+        WHERE NOT EXISTS ( SELECT * FROM tb_monthly_nav n WHERE entity_id = tb_fund_info.fund_id AND n.price_date = tb_fund_info.inception_date);
 
     if(tb_monthly_nav.isVoid() || tb_monthly_nav.size() == 0) { return tb_rets; }
 
     // 算 ratios 之前先把时间顺序排好
-    tb_monthly_nav.sortBy!(['fund_id', 'end_date', 'price_date'], [1, 1, 1]);
+    tb_monthly_nav.sortBy!(['entity_id', 'end_date', 'price_date'], [1, 1, 1]);
 
     // 计算月收益
-    tb_rets = SELECT fund_id, end_date, price_date, cumulative_nav, cumulative_nav.ratios() - 1 AS ret
+    tb_rets = SELECT entity_id AS fund_id, end_date, price_date, cumulative_nav, cumulative_nav.ratios() - 1 AS ret
               FROM tb_monthly_nav
-              CONTEXT BY fund_id;
+              CONTEXT BY entity_id;
 
 
     // the records without return calculated but do have nav are still useful for some calculations