|
@@ -415,16 +415,16 @@ def get_nav_for_hedge_fund_performance(fund_ids, month_end) {
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * 取某月的基金BFI因子
|
|
|
+ * 取某时间段的基金主基准
|
|
|
+ * NOTE: 目前数据库里只存最新的基准,以后很可能会支持时间序列
|
|
|
*
|
|
|
- * Example: get_fund_bfi_factors("'MF00003PW2', 'MF00003PW1', 'MF00003PXO'", '2024-06');
|
|
|
+ * Example: get_fund_primary_benchmark("'MF00003PW2', 'MF00003PW1', 'MF00003PXO'", '1990-01', '2024-06');
|
|
|
*/
|
|
|
-def get_fund_bfi_factors(fund_ids, month_end) {
|
|
|
+def get_fund_primary_benchmark(fund_ids, month_start, month_end) {
|
|
|
|
|
|
- s_query = "SELECT fund_id, factor_id, end_date
|
|
|
- FROM pfdb.pf_fund_factor_bfi_by_category_group
|
|
|
+ s_query = "SELECT fund_id, primary_benchmark_id AS benchmark_id, inception_date
|
|
|
+ FROM mfdb.fund_information
|
|
|
WHERE fund_id IN (" + fund_ids + ")
|
|
|
- AND end_date = '" + month_end + "'
|
|
|
AND isvalid = 1;";
|
|
|
|
|
|
conn = connect_mysql();
|
|
@@ -433,23 +433,85 @@ def get_fund_bfi_factors(fund_ids, month_end) {
|
|
|
|
|
|
conn.close();
|
|
|
|
|
|
+ t.addColumn('end_date', MONTH);
|
|
|
+ m_start = temporalParse(month_start, 'yyyy-MM');
|
|
|
+ m_end = temporalParse(month_end, 'yyyy-MM');
|
|
|
+ tb_end_date = table(m_start..m_end AS end_date);
|
|
|
+
|
|
|
+ return (SELECT t.fund_id, d.end_date, t.benchmark_id FROM t JOIN tb_end_date d WHERE d.end_date >= t.inception_date.month());
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*
|
|
|
+ * 取某时间段的组合主基准
|
|
|
+ * NOTE: 目前所有组合默认主基准是沪深300,以后很可能会改
|
|
|
+ *
|
|
|
+ * Example: get_portfolio_primary_benchmark("166002,166114", '1990-01', '2024-08');
|
|
|
+ */
|
|
|
+def get_portfolio_primary_benchmark(portfolio_ids, month_start, month_end) {
|
|
|
+
|
|
|
+ s_query = "SELECT id AS portfolio_id, 'IN00000008' AS benchmark_id, inception_date
|
|
|
+ FROM pfdb.pf_customer_portfolio_map
|
|
|
+ WHERE id IN (" + portfolio_ids + ")
|
|
|
+ AND isvalid = 1;";
|
|
|
+
|
|
|
+ conn = connect_mysql();
|
|
|
+
|
|
|
+ t = odbc::query(conn, s_query);
|
|
|
+
|
|
|
+ conn.close();
|
|
|
+
|
|
|
+ t.addColumn('end_date', MONTH);
|
|
|
+ m_start = temporalParse(month_start, 'yyyy-MM');
|
|
|
+ m_end = temporalParse(month_end, 'yyyy-MM');
|
|
|
+ tb_end_date = table(m_start..m_end AS end_date);
|
|
|
+
|
|
|
+ return (SELECT t.portfolio_id, d.end_date, t.benchmark_id FROM t JOIN tb_end_date d WHERE d.end_date >= t.inception_date.month());
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*
|
|
|
+ * 取某时间段的基金BFI因子
|
|
|
+ *
|
|
|
+ * Example: get_fund_bfi_factors("'MF00003PW2', 'MF00003PW1', 'MF00003PXO'", '1990-01', '2024-06');
|
|
|
+ */
|
|
|
+def get_fund_bfi_factors(fund_ids, month_start, month_end) {
|
|
|
+
|
|
|
+ s_query = "SELECT fund_id, end_date, factor_id
|
|
|
+ FROM pfdb.pf_fund_factor_bfi_by_category_group
|
|
|
+ WHERE fund_id IN (" + fund_ids + ")
|
|
|
+ AND end_date >= '" + month_start + "'
|
|
|
+ AND end_date <= '" + month_end + "'
|
|
|
+ AND isvalid = 1
|
|
|
+ ORDER BY fund_id, end_date, factor_id;";
|
|
|
+
|
|
|
+ conn = connect_mysql();
|
|
|
+
|
|
|
+ t = odbc::query(conn, s_query);
|
|
|
+
|
|
|
+ conn.close();
|
|
|
+
|
|
|
return t;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
/*
|
|
|
- * 取某月的组合BFI因子
|
|
|
+ * 取某时间段的组合BFI因子
|
|
|
*
|
|
|
- * Example: get_portfolio_bfi_factors("166002,166114", '2024-06');
|
|
|
+ * Example: get_portfolio_bfi_factors("166002,166114", '1900-01', '2024-06');
|
|
|
*/
|
|
|
-def get_portfolio_bfi_factors(portfolio_ids, month_end) {
|
|
|
+def get_portfolio_bfi_factors(portfolio_ids, month_start, month_end) {
|
|
|
|
|
|
- s_query = "SELECT portfolio_id, factor_id, end_date
|
|
|
+ s_query = "SELECT portfolio_id, end_date, factor_id
|
|
|
FROM pfdb.pf_portfolio_factor_bfi_by_category_group
|
|
|
WHERE portfolio_id IN (" + portfolio_ids + ")
|
|
|
- AND end_date = '" + month_end + "'
|
|
|
- AND isvalid = 1;";
|
|
|
+ AND end_date >= '" + month_start + "'
|
|
|
+ AND end_date <= '" + month_end + "'
|
|
|
+ AND isvalid = 1
|
|
|
+ ORDER BY portfolio_id, end_date, factor_id;";
|
|
|
|
|
|
conn = connect_mysql();
|
|
|
|