|
@@ -170,9 +170,9 @@ def get_cus_fund_info(fund_ids) {
|
|
|
* get_factor_info(NULL);
|
|
|
*
|
|
|
*/
|
|
|
-def get_factor_info(fund_ids) {
|
|
|
+def get_factor_info(factor_ids) {
|
|
|
|
|
|
- s_entity_ids = ids_to_string(fund_ids);
|
|
|
+ s_entity_ids = ids_to_string(factor_ids);
|
|
|
|
|
|
s_entity_sql = iif(s_entity_ids == NULL || s_entity_ids == '', '', " AND fi.factor_id IN (" + s_entity_ids + ")");
|
|
|
|
|
@@ -191,9 +191,218 @@ def get_factor_info(fund_ids) {
|
|
|
return t
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * 取基金经理有效信息
|
|
|
+ *
|
|
|
+ * NOTE: Will return multiple records per company!
|
|
|
+ *
|
|
|
+ * Example: get_personnel_info(['PL000000AN', 'PL000001GH']);
|
|
|
+ */
|
|
|
+def get_personnel_info(personnel_ids) {
|
|
|
+
|
|
|
+ s_entity_ids = ids_to_string(personnel_ids);
|
|
|
+
|
|
|
+ s_entity_sql = iif(s_entity_ids == NULL || s_entity_ids == '', '', " AND pi.personnel_id IN (" + s_entity_ids + ")");
|
|
|
+
|
|
|
+ s_query = "SELECT pi.personnel_id AS manager_id, fi.raise_type, fs.strategy,
|
|
|
+ MIN(map.management_start_date) AS inception_date,
|
|
|
+ CASE fs.strategy WHEN 1 THEN 'IN00000008'
|
|
|
+ WHEN 2 THEN 'IN00000008'
|
|
|
+ WHEN 3 THEN 'IN0000008S'
|
|
|
+ WHEN 4 THEN 'IN00000008'
|
|
|
+ WHEN 5 THEN 'IN00000008'
|
|
|
+ WHEN 6 THEN 'IN00000077'
|
|
|
+ WHEN 7 THEN 'FA00000VNB'
|
|
|
+ WHEN 8 THEN 'FA00000VNB'
|
|
|
+ WHEN 101 THEN 'IN00000008'
|
|
|
+ WHEN 102 THEN 'FA00000VNB'
|
|
|
+ WHEN 103 THEN 'IN00000077'
|
|
|
+ WHEN 104 THEN 'IN0000007G'
|
|
|
+ WHEN 105 THEN 'IN0000009M'
|
|
|
+ ELSE 'IN00000008' END AS benchmark_id,
|
|
|
+ 1 AS ini_value
|
|
|
+ FROM mfdb.personnel_information pi
|
|
|
+ INNER JOIN mfdb.fund_manager_mapping map ON pi.personnel_id = map.fund_manager_id
|
|
|
+ INNER JOIN mfdb.fund_information fi ON map.fund_id = fi.fund_id
|
|
|
+ INNER JOIN mfdb.fund_strategy fs ON fi.fund_id = fs.fund_id
|
|
|
+ WHERE pi.isvalid = 1 " +
|
|
|
+ s_entity_sql + "
|
|
|
+ AND map.isvalid = 1
|
|
|
+ AND fi.isvalid = 1
|
|
|
+ AND fs.isvalid = 1
|
|
|
+ AND fs.strategy > 0
|
|
|
+ GROUP BY pi.personnel_id, fi.raise_type, fs.strategy
|
|
|
+ ORDER BY pi.personnel_id"
|
|
|
+
|
|
|
+ conn = connect_mysql()
|
|
|
+
|
|
|
+ t = odbc::query(conn, s_query)
|
|
|
+
|
|
|
+ conn.close()
|
|
|
+
|
|
|
+ return t
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*
|
|
|
+ * 取基金经理简版信息 (curve_type + 全strategy)
|
|
|
+ *
|
|
|
+ * NOTE: 仿照 MySQL 的设定,curve_type: 1-私募, 4-公募, 7-公私募综合; strategy: 0-不分策略
|
|
|
+ *
|
|
|
+ * Example: get_personnel_info_for_perf(['PL000000AN', 'PL000001GH']);
|
|
|
+ */
|
|
|
+def get_personnel_info_for_perf(personnel_ids) {
|
|
|
+
|
|
|
+ s_entity_ids = ids_to_string(personnel_ids);
|
|
|
+
|
|
|
+ s_entity_sql = iif(s_entity_ids == NULL || s_entity_ids == '', '', " AND pi.personnel_id IN (" + s_entity_ids + ")");
|
|
|
+
|
|
|
+ s_query = "SELECT * FROM (
|
|
|
+ SELECT pi.personnel_id AS manager_id,
|
|
|
+ IF(fi.raise_type = 1, 1, 4) AS curve_type,
|
|
|
+ 0 AS strategy,
|
|
|
+ MIN(map.management_start_date) AS inception_date,
|
|
|
+ 'FA00000VNB' AS benchmark_id,
|
|
|
+ 1 AS ini_value
|
|
|
+ FROM mfdb.personnel_information pi
|
|
|
+ INNER JOIN mfdb.fund_manager_mapping map ON pi.personnel_id = map.fund_manager_id
|
|
|
+ INNER JOIN mfdb.fund_information fi ON map.fund_id = fi.fund_id
|
|
|
+ WHERE pi.isvalid = 1 " +
|
|
|
+ s_entity_sql + "
|
|
|
+ AND map.isvalid = 1
|
|
|
+ AND fi.isvalid = 1
|
|
|
+ GROUP BY pi.personnel_id, fi.raise_type
|
|
|
+ UNION
|
|
|
+ SELECT pi.personnel_id AS manager_id,
|
|
|
+ 7 AS curve_type,
|
|
|
+ 0 AS strategy,
|
|
|
+ MIN(map.management_start_date) AS inception_date,
|
|
|
+ 'FA00000VNB' AS benchmark_id,
|
|
|
+ 1 AS ini_value
|
|
|
+ FROM mfdb.personnel_information pi
|
|
|
+ INNER JOIN mfdb.fund_manager_mapping map ON pi.personnel_id = map.fund_manager_id
|
|
|
+ INNER JOIN mfdb.fund_information fi ON map.fund_id = fi.fund_id
|
|
|
+ WHERE pi.isvalid = 1 " +
|
|
|
+ s_entity_sql + "
|
|
|
+ AND map.isvalid = 1
|
|
|
+ AND fi.isvalid = 1
|
|
|
+ GROUP BY pi.personnel_id) t
|
|
|
+ ORDER BY manager_id, curve_type, strategy;";
|
|
|
+
|
|
|
+ conn = connect_mysql()
|
|
|
+
|
|
|
+ t = odbc::query(conn, s_query)
|
|
|
+
|
|
|
+ conn.close()
|
|
|
+
|
|
|
+ return t
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
|
|
|
/*
|
|
|
+ * 取基金公司简版信息 (curve_type + 全strategy)
|
|
|
+ *
|
|
|
+ * NOTE: 仿照 MySQL 的设定,curve_type: 1-私募, 4-公募, 7-公私募综合; strategy: 0-不分策略
|
|
|
+ *
|
|
|
+ * Example: get_company_info_for_perf(['CO0001003W', 'CO00000017']);
|
|
|
+ */
|
|
|
+def get_company_info_for_perf(company_ids) {
|
|
|
+
|
|
|
+ s_entity_ids = ids_to_string(company_ids);
|
|
|
+
|
|
|
+ s_entity_sql = iif(s_entity_ids == NULL || s_entity_ids == '', '', " AND ci.company_id IN (" + s_entity_ids + ")");
|
|
|
+
|
|
|
+ s_query = "SELECT * FROM (
|
|
|
+ SELECT ci.company_id,
|
|
|
+ IF(fi.raise_type = 1, 1, 4) AS curve_type,
|
|
|
+ 0 AS strategy,
|
|
|
+ MIN(IFNULL(fi.inception_date, ci.establish_date)) AS inception_date,
|
|
|
+ 'FA00000VNB' AS benchmark_id,
|
|
|
+ 1 AS ini_value
|
|
|
+ FROM mfdb.company_information ci
|
|
|
+ INNER JOIN mfdb.fund_information fi ON ci.company_id = fi.advisor_id
|
|
|
+ WHERE ci.isvalid = 1 " +
|
|
|
+ s_entity_sql + "
|
|
|
+ AND fi.isvalid = 1
|
|
|
+ GROUP BY ci.company_id, fi.raise_type
|
|
|
+ UNION
|
|
|
+ SELECT ci.company_id,
|
|
|
+ 7 AS curve_type,
|
|
|
+ 0 AS strategy,
|
|
|
+ MIN(IFNULL(fi.inception_date, ci.establish_date)) AS inception_date,
|
|
|
+ 'FA00000VNB' AS benchmark_id,
|
|
|
+ 1 AS ini_value
|
|
|
+ FROM mfdb.company_information ci
|
|
|
+ INNER JOIN mfdb.fund_information fi ON ci.company_id = fi.advisor_id
|
|
|
+ WHERE ci.isvalid = 1 " +
|
|
|
+ s_entity_sql + "
|
|
|
+ AND fi.isvalid = 1
|
|
|
+ GROUP BY ci.company_id) t
|
|
|
+ ORDER BY company_id, curve_type, strategy;";
|
|
|
+
|
|
|
+ conn = connect_mysql()
|
|
|
+
|
|
|
+ t = odbc::query(conn, s_query)
|
|
|
+
|
|
|
+ conn.close()
|
|
|
+
|
|
|
+ return t
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * 取基金公司有效信息
|
|
|
+ *
|
|
|
+ * NOTE: Will return multiple records per company!
|
|
|
+ *
|
|
|
+ * Example: get_company_info(['CO0001003W', 'CO00000017']);
|
|
|
+ *
|
|
|
+ */
|
|
|
+def get_company_info(company_ids) {
|
|
|
+
|
|
|
+ s_entity_ids = ids_to_string(company_ids);
|
|
|
+
|
|
|
+ s_entity_sql = iif(s_entity_ids == NULL || s_entity_ids == '', '', " AND ci.company_id IN (" + s_entity_ids + ")");
|
|
|
+
|
|
|
+ s_query = "SELECT ci.company_id, fi.raise_type,
|
|
|
+ fs.strategy,
|
|
|
+ MIN(IFNULL(fi.inception_date, ci.establish_date)) AS inception_date,
|
|
|
+ CASE fs.strategy WHEN 1 THEN 'IN00000008'
|
|
|
+ WHEN 2 THEN 'IN00000008'
|
|
|
+ WHEN 3 THEN 'IN0000008S'
|
|
|
+ WHEN 4 THEN 'IN00000008'
|
|
|
+ WHEN 5 THEN 'IN00000008'
|
|
|
+ WHEN 6 THEN 'IN00000077'
|
|
|
+ WHEN 7 THEN 'FA00000VNB'
|
|
|
+ WHEN 8 THEN 'FA00000VNB'
|
|
|
+ WHEN 101 THEN 'IN00000008'
|
|
|
+ WHEN 102 THEN 'FA00000VNB'
|
|
|
+ WHEN 103 THEN 'IN00000077'
|
|
|
+ WHEN 104 THEN 'IN0000007G'
|
|
|
+ WHEN 105 THEN 'IN0000009M'
|
|
|
+ ELSE 'IN00000008' END AS benchmark_id,
|
|
|
+ 1 AS ini_value
|
|
|
+ FROM mfdb.company_information ci
|
|
|
+ INNER JOIN mfdb.fund_information fi ON ci.company_id = fi.advisor_id
|
|
|
+ INNER JOIN mfdb.fund_strategy fs ON fi.fund_id = fs.fund_id
|
|
|
+ WHERE ci.isvalid = 1 " +
|
|
|
+ s_entity_sql + "
|
|
|
+ AND fi.isvalid = 1
|
|
|
+ AND fs.isvalid = 1
|
|
|
+ AND fs.strategy > 0
|
|
|
+ GROUP BY ci.company_id, fi.raise_type, fs.strategy
|
|
|
+ ORDER BY ci.company_id"
|
|
|
+
|
|
|
+ conn = connect_mysql()
|
|
|
+
|
|
|
+ t = odbc::query(conn, s_query)
|
|
|
+
|
|
|
+ conn.close()
|
|
|
+
|
|
|
+ return t
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
* 取基金组合基础有效信息
|
|
|
*
|
|
|
* Example: get_entity_info('HF', ['HF000004KN','HF000103EU','HF00018WXG']);
|
|
@@ -230,6 +439,15 @@ def get_entity_info(entity_type, entity_ids) {
|
|
|
|
|
|
t = get_factor_info(s_entity_ids);
|
|
|
t.rename!('factor_id', 'entity_id');
|
|
|
+ } else if(entity_type == 'PL') {
|
|
|
+
|
|
|
+ t = get_personnel_info(s_entity_ids);
|
|
|
+ t.rename!('manager_id', 'entity_id');
|
|
|
+
|
|
|
+ } else if(entity_type == 'CO') {
|
|
|
+
|
|
|
+ t = get_company_info(s_entity_ids);
|
|
|
+ t.rename!('company_id', 'entity_id');
|
|
|
}
|
|
|
|
|
|
return t;
|
|
@@ -375,6 +593,45 @@ def get_entity_bfi_factors(entity_type, entity_ids, month_start, month_end, upda
|
|
|
return t;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+/*
|
|
|
+ * 取某时间段的基金经理 BFI基准
|
|
|
+ *
|
|
|
+ *
|
|
|
+ * Example: get_mc_bfi_factors('PL', ['PL000000NS', 'PL00000ICF'], 1990.01M, 2024.06M);
|
|
|
+ *
|
|
|
+ */
|
|
|
+def get_mc_bfi_factors(entity_type, entity_ids, month_start, month_end, updatetime=1990.01.01) {
|
|
|
+
|
|
|
+ tmp = get_bfi_by_category_group_table_description(entity_type);
|
|
|
+
|
|
|
+ s_entity_ids = ids_to_string(entity_ids);
|
|
|
+
|
|
|
+ sql_entity_id = '';
|
|
|
+
|
|
|
+ if(s_entity_ids != NULL) {
|
|
|
+ sql_entity_id = " AND " + tmp.sec_id_col[0] + " IN (" + s_entity_ids + ")";
|
|
|
+ }
|
|
|
+
|
|
|
+ s_query = "SELECT " + tmp.sec_id_col[0] + " AS entity_id, curve_type, strategy, end_date, factor_id
|
|
|
+ FROM " + tmp.table_name[0] + "
|
|
|
+ WHERE isvalid = 1 " +
|
|
|
+ sql_entity_id + "
|
|
|
+ AND end_date >= '" + month_start.temporalFormat('yyyy-MM') + "'
|
|
|
+ AND end_date <= '" + month_end.temporalFormat('yyyy-MM') + "'
|
|
|
+ AND updatetime >= '" + updatetime$STRING + "'
|
|
|
+ ORDER BY " + tmp.sec_id_col[0] + ", end_date, factor_id";
|
|
|
+
|
|
|
+ conn = connect_mysql();
|
|
|
+
|
|
|
+ t = odbc::query(conn, s_query);
|
|
|
+
|
|
|
+ conn.close();
|
|
|
+
|
|
|
+ return t;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
/*
|
|
|
* 取基金-经理关系表
|
|
|
*
|