|
@@ -0,0 +1,102 @@
|
|
|
+login(`admin, `123456)
|
|
|
+loadPlugin("ODBC")
|
|
|
+
|
|
|
+clearCachedModules()
|
|
|
+use fundit::fundCalculator
|
|
|
+use fundit::dataPuller
|
|
|
+use fundit::returnCalculator
|
|
|
+use fundit::indicatorCalculator
|
|
|
+
|
|
|
+/* init values for test cases */
|
|
|
+end_day = 2024.06.28;
|
|
|
+fund_ids = "'HF000004KN','HF000103EU','HF00018WXG'";
|
|
|
+entity_type = 'HF';
|
|
|
+isFromNav = true;
|
|
|
+
|
|
|
+/* codes from cal_fund_indicators */
|
|
|
+ very_old_date = 1990.01.01;
|
|
|
+
|
|
|
+ fund_info = get_fund_info(fund_ids);
|
|
|
+ fund_info.rename!('fund_id', 'entity_id');
|
|
|
+
|
|
|
+ if(isFromNav == true) {
|
|
|
+ // 从净值开始计算收益
|
|
|
+ tb_ret = SELECT * FROM cal_fund_monthly_returns(entity_type, fund_ids, true) WHERE price_date <= end_day;
|
|
|
+ tb_ret.rename!(['fund_id', 'cumulative_nav'], ['entity_id', 'nav']);
|
|
|
+ } else {
|
|
|
+ // 从fund_performance表里读月收益
|
|
|
+ tb_ret = get_monthly_ret('FD', fund_ids, very_old_date, end_day, true);
|
|
|
+ tb_ret.rename!(['fund_id'], ['entity_id']);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 取基金和基准的对照表
|
|
|
+ primary_benchmark = SELECT entity_id, iif(benchmark_id.isNull(), 'IN00000008', benchmark_id) AS benchmark_id FROM fund_info;
|
|
|
+
|
|
|
+ // 取所有出现的基准月收益
|
|
|
+ bmk_ret = get_benchmark_return(primary_benchmark, end_day);
|
|
|
+
|
|
|
+ risk_free_rate = SELECT fund_id, temporalParse(end_date, 'yyyy-MM') AS end_date, ret FROM get_risk_free_rate(very_old_date, end_day);
|
|
|
+
|
|
|
+
|
|
|
+/* Tests for standard indicators */
|
|
|
+
|
|
|
+rtn = cal_basic_performance(tb_ret, 'm');
|
|
|
+
|
|
|
+lpm = cal_LPM(tb_ret, risk_free_rate);
|
|
|
+
|
|
|
+lpms = cal_omega_sortino_kappa(tb_ret, risk_free_rate);
|
|
|
+
|
|
|
+alpha_beta = cal_alpha_beta(tb_ret, primary_benchmark, bmk_ret, risk_free_rate);
|
|
|
+
|
|
|
+bmk_tracking = cal_benchmark_tracking(tb_ret, primary_benchmark, bmk_ret);
|
|
|
+
|
|
|
+capture_r = cal_capture_ratio(tb_ret, primary_benchmark, bmk_ret)
|
|
|
+
|
|
|
+sharpe = cal_sharpe(tb_ret, rtn, risk_free_rate);
|
|
|
+
|
|
|
+treynor = cal_treynor(tb_ret, risk_free_rate, alpha_beta);
|
|
|
+
|
|
|
+jensen = cal_jensen(tb_ret, bmk_ret, risk_free_rate, alpha_beta);
|
|
|
+
|
|
|
+m2 = cal_m2(tb_ret, primary_benchmark, bmk_ret, risk_free_rate);
|
|
|
+
|
|
|
+ms = cal_ms_return(tb_ret, risk_free_rate);
|
|
|
+
|
|
|
+/* codes from cal_fund_bfi_indicators */
|
|
|
+ start_month = 1990.01M;
|
|
|
+
|
|
|
+ // 取基金和基准的对照表
|
|
|
+ bfi_benchmark = SELECT fund_id AS entity_id, end_date.temporalParse('yyyy-MM') AS end_date, factor_id AS benchmark_id
|
|
|
+ FROM get_fund_bfi_factors(fund_ids, start_month.temporalFormat('yyyy-MM'), end_day.temporalFormat('yyyy-MM'));
|
|
|
+
|
|
|
+ bfi_bmk_ret = get_benchmark_return(bfi_benchmark, end_day);
|
|
|
+
|
|
|
+/* Tests for BFI indicators */
|
|
|
+
|
|
|
+t_bfi_bmk = SELECT * FROM bfi_benchmark WHERE entity_id = 'HF000004KN' and end_date = 2024.06M
|
|
|
+
|
|
|
+ t0 = SELECT t.entity_id, t.end_date, t.price_date,
|
|
|
+ t.ret, bmk.ret AS ret_bmk, cumcount(t.entity_id) AS cnt, (t.ret - bmk.ret) AS exc_ret, bm.benchmark_id
|
|
|
+ FROM tb_ret t
|
|
|
+ INNER JOIN t_bfi_bmk bm ON t.entity_id = bm.entity_id
|
|
|
+ INNER JOIN bfi_bmk_ret bmk ON t.end_date = bmk.end_date AND bm.benchmark_id = bmk.benchmark_id
|
|
|
+ WHERE t.ret > -1
|
|
|
+ AND bmk.ret > -1
|
|
|
+ CONTEXT BY t.entity_id, bm.benchmark_id;
|
|
|
+
|
|
|
+ t = SELECT entity_id, end_date.cummax() AS end_date, price_date.cummax() AS price_date, price_date.cummin() AS min_date, benchmark_id,
|
|
|
+ cumcount(iif(exc_ret >= 0, 1, null)) \ cnt AS winrate,
|
|
|
+ exc_ret.cumstd() AS track_error,
|
|
|
+ iif(exc_ret.cumstd() == 0, null, exc_ret.cumavg() / exc_ret.cumstd()) AS info
|
|
|
+ FROM t0 CONTEXT BY entity_id, benchmark_id
|
|
|
+ ORDER BY entity_id, end_date, benchmark_id;
|
|
|
+select * from bfi_benchmark where benchmark_id = 'FA00000VMP' order by end_date desc
|
|
|
+
|
|
|
+
|
|
|
+bfi_bmk_tracking = cal_benchmark_tracking(tb_ret, bfi_benchmark, bfi_bmk_ret);
|
|
|
+
|
|
|
+bfi_alpha_beta = cal_alpha_beta(tb_ret, bfi_benchmark, bfi_bmk_ret, risk_free_rate);
|
|
|
+
|
|
|
+bfi_indicators = cal_indicators_with_benchmark(tb_ret, bfi_benchmark, bfi_bmk_ret, risk_free_rate);
|
|
|
+
|
|
|
+SELECT * FROM bfi_indicators ORDER BY entity_id, end_date desc, benchmark_id
|