|
@@ -81,7 +81,11 @@ def mix_monthly_returns(entity_type, entity_info) {
|
|
FROM historical_rets h
|
|
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') );
|
|
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_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 )
|
|
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();
|
|
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
|
|
FROM tb_nav
|
|
- GROUP BY fund_id, monthEnd(price_date);
|
|
|
|
|
|
+ GROUP BY entity_id, monthEnd(price_date);
|
|
|
|
|
|
// 完整月末日期的净值序列(包括缺失数据为NULL)
|
|
// 完整月末日期的净值序列(包括缺失数据为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
|
|
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 失效,只好用全名
|
|
// NOTE: DolphinDB 遇见 EXISTS 语句时,似乎主表的 alias 失效,只好用全名
|
|
INSERT INTO tb_monthly_nav
|
|
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
|
|
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; }
|
|
if(tb_monthly_nav.isVoid() || tb_monthly_nav.size() == 0) { return tb_rets; }
|
|
|
|
|
|
// 算 ratios 之前先把时间顺序排好
|
|
// 算 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
|
|
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
|
|
// the records without return calculated but do have nav are still useful for some calculations
|