Joey il y a 5 jours
Parent
commit
ae2319efb3
1 fichiers modifiés avec 74 ajouts et 12 suppressions
  1. 74 12
      modules/dataPuller.dos

+ 74 - 12
modules/dataPuller.dos

@@ -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();