dataSaver.dos 56 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195
  1. module fundit::dataSaver
  2. use fundit::sqlUtilities
  3. /*
  4. * 存数据表到mySQL或本地dolphindb,原数据表会被TRUNCATE
  5. *
  6. * save_table(tb_fund_performance, "raw_db.fund_performance", false)
  7. */
  8. def save_table(tb, table_name, isToMySQL) {
  9. if(isToMySQL == true) {
  10. conn = connect_mysql('raw_db');
  11. odbc::execute(conn, "TRUNCATE TABLE " + table_name + "_dolphin");
  12. odbc::append(conn, tb, table_name + "_dolphin", false);
  13. conn.close();
  14. } else {
  15. db = get_local_database("fundit", table_name.split(".")[0]);
  16. //local_table = loadTable(db, table_name.split(".")[1]);
  17. saveTable(db, tb, table_name.split(".")[1]);
  18. }
  19. }
  20. /*
  21. * 【临时】 用于将dolphin table 存到 mysql
  22. *
  23. */
  24. def save_table2(tb, table_name, isCreateTable) {
  25. tb.addColumn(['creatorid', 'createtime', 'updaterid', 'updatetime'], [INT, DATETIME, INT, DATETIME]);
  26. conn = connect_mysql('raw_db');
  27. odbc::append(conn, tb, table_name , isCreateTable, false);
  28. conn.close()
  29. }
  30. /*
  31. * 存私募基金净值到本地dolphindb
  32. *
  33. * save_hedge_fund_nav_to_local(tb_nav)
  34. */
  35. def save_hedge_fund_nav_to_local(tb_nav) {
  36. save_table(tb_nav, "mfdb.nav", false)
  37. }
  38. /*
  39. * 将数据存到本地,之后传回MySQL并同步至正式表。同一个ID且不早于源表的数据会被清除
  40. *
  41. * @param table <TABLE>: 数据表
  42. * @param source_table_name <STRING>: DolphinDB同步到MySQL的暂存表名
  43. * @param target_table_name <STRING>: 正式的MySQL数据表名
  44. * @param entity_id_col <STRING>: 暂存表中主键中的ID字段名
  45. * @param date_col <STRING>: 暂存表中主键中的日期字段名
  46. *
  47. */
  48. def save_and_sync(table, source_table_name, target_table_name, entity_id_col, date_col) {
  49. save_table(table, source_table_name, true);
  50. t_table_name = iif(target_table_name.isNothing(), source_table_name, target_table_name);
  51. s_query = "CALL raw_db.sp_sync_table_from_dolphin('" + source_table_name + "_dolphin', '" + t_table_name + "', '" + entity_id_col + "','" + date_col + "');"
  52. conn = connect_mysql('raw_db');
  53. odbc::execute(conn, s_query);
  54. conn.close();
  55. }
  56. /*
  57. * 建表 XXXX_nav
  58. */
  59. def create_entity_nav(is_id_integer=false) {
  60. return table(1000:0,
  61. ['entity_id', 'price_date', 'cumulative_nav'],
  62. [iif(is_id_integer, INT, SYMBOL), DATE, DOUBLE]);
  63. }
  64. /*
  65. * 建公司/经理周净值表 XXXX_nav
  66. */
  67. def create_mc_nav() {
  68. return table(1000:0,
  69. ['entity_id', 'curve_type', 'strategy', 'year_week', 'price_date', 'cumulative_nav', 'ret_1w', 'fund_num'],
  70. [SYMBOL, INT, INT, STRING, DATE, DOUBLE, DOUBLE, INT]);
  71. }
  72. /*
  73. * 建公司/经理净值表 XXXX_fitted_curve
  74. */
  75. def create_mc_fitted_curve() {
  76. return table(1000:0,
  77. ['entity_id', 'curve_type', 'strategy', 'end_date', 'cumulative_nav', 'fund_num'],
  78. [SYMBOL, INT, INT, STRING, DOUBLE, INT]);
  79. }
  80. /*
  81. * 建公司/经理业绩表 xxx_performance
  82. *
  83. */
  84. def create_mc_performance() {
  85. return table(1000:0,
  86. ['entity_id', 'curve_type', 'strategy', 'end_date', 'price_date', 'cumulative_nav',
  87. 'ret_1m', 'ret_1m_a', 'ret_3m', 'ret_3m_a', 'ret_6m', 'ret_6m_a',
  88. 'ret_1y', 'ret_1y_a', 'ret_2y', 'ret_2y_a', 'ret_3y', 'ret_3y_a', 'ret_4y', 'ret_4y_a',
  89. 'ret_5y', 'ret_5y_a', 'ret_10y', 'ret_10y_a', 'ret_ytd', 'ret_ytd_a', 'ret_incep', 'ret_incep_a'],
  90. [SYMBOL, INT, INT, MONTH, DATE, DOUBLE,
  91. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  92. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  93. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE]);
  94. }
  95. /*
  96. * 建表 XXXX_performance
  97. */
  98. def create_entity_performance(is_id_integer=false) {
  99. return table(1000:0,
  100. ['entity_id', 'end_date', 'price_date', 'cumulative_nav',
  101. 'ret_1m', 'ret_1m_a', 'ret_3m', 'ret_3m_a', 'ret_6m', 'ret_6m_a',
  102. 'ret_1y', 'ret_1y_a', 'ret_2y', 'ret_2y_a', 'ret_3y', 'ret_3y_a', 'ret_4y', 'ret_4y_a',
  103. 'ret_5y', 'ret_5y_a', 'ret_10y', 'ret_10y_a', 'ret_ytd', 'ret_ytd_a', 'ret_incep', 'ret_incep_a'],
  104. [iif(is_id_integer, INT, SYMBOL), MONTH, DATE, DOUBLE,
  105. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  106. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  107. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE]);
  108. }
  109. /*
  110. * 建表 XXX_indicator
  111. */
  112. def create_entity_indicator(is_id_integer=false) {
  113. return table(1000:0,
  114. ['entity_id', 'end_date',
  115. 'info_ratio_6m', 'm2_6m', 'tracking_error_6m',
  116. 'info_ratio_1y', 'm2_1y', 'tracking_error_1y',
  117. 'info_ratio_2y', 'm2_2y', 'tracking_error_2y', 'var_2y', 'cvar_2y',
  118. 'info_ratio_3y', 'm2_3y', 'tracking_error_3y', 'var_3y', 'cvar_3y',
  119. 'info_ratio_4y', 'm2_4y', 'tracking_error_4y', 'var_4y', 'cvar_4y',
  120. 'info_ratio_5y', 'm2_5y', 'tracking_error_5y', 'var_5y', 'cvar_5y',
  121. 'info_ratio_10y', 'm2_10y', 'tracking_error_10y', 'var_10y', 'cvar_10y',
  122. 'info_ratio_ytd', 'm2_ytd', 'tracking_error_ytd',
  123. 'info_ratio_incep', 'm2_incep','tracking_error_incep', 'var_incep', 'cvar_incep'],
  124. [iif(is_id_integer, INT, SYMBOL), MONTH,
  125. DOUBLE, DOUBLE, DOUBLE,
  126. DOUBLE, DOUBLE, DOUBLE,
  127. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  128. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  129. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  130. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  131. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  132. DOUBLE, DOUBLE, DOUBLE,
  133. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE]);
  134. }
  135. /*
  136. * 建公司/经理表 XXX_indicator
  137. */
  138. def create_mc_indicator() {
  139. return table(1000:0,
  140. ['entity_id', 'curve_type', 'strategy', 'end_date',
  141. 'info_ratio_6m', 'm2_6m', 'tracking_error_6m',
  142. 'info_ratio_1y', 'm2_1y', 'tracking_error_1y',
  143. 'info_ratio_2y', 'm2_2y', 'tracking_error_2y', 'var_2y', 'cvar_2y',
  144. 'info_ratio_3y', 'm2_3y', 'tracking_error_3y', 'var_3y', 'cvar_3y',
  145. 'info_ratio_4y', 'm2_4y', 'tracking_error_4y', 'var_4y', 'cvar_4y',
  146. 'info_ratio_5y', 'm2_5y', 'tracking_error_5y', 'var_5y', 'cvar_5y',
  147. 'info_ratio_10y', 'm2_10y', 'tracking_error_10y', 'var_10y', 'cvar_10y',
  148. 'info_ratio_ytd', 'm2_ytd', 'tracking_error_ytd',
  149. 'info_ratio_incep', 'm2_incep','tracking_error_incep', 'var_incep', 'cvar_incep'],
  150. [SYMBOL, INT, INT, MONTH,
  151. DOUBLE, DOUBLE, DOUBLE,
  152. DOUBLE, DOUBLE, DOUBLE,
  153. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  154. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  155. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  156. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  157. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  158. DOUBLE, DOUBLE, DOUBLE,
  159. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE]);
  160. }
  161. /*
  162. * 建表 XXX_risk_stats
  163. *
  164. * NOTE: mfdb.fund_risk_stats 中 maxdrawdown_6m 和 maxdrawdown_ytd 因不明原因分别是 6m_maxdrawdown 和 ytd_maxdrawdown 的虚拟列!
  165. */
  166. def create_entity_risk_stats(is_id_integer=false) {
  167. return table(1000:0,
  168. ['entity_id', 'end_date',
  169. 'stddev_6m', 'downsidedev_6m', 'alpha_6m', 'winrate_6m', 'beta_6m', 'skewness_6m', 'kurtosis_6m', 'worstmonth_6m', 'maxdrawdown_6m',
  170. 'stddev_1y', 'downsidedev_1y', 'alpha_1y', 'winrate_1y', 'beta_1y', 'skewness_1y', 'kurtosis_1y', 'worstmonth_1y', 'maxdrawdown_1y',
  171. 'stddev_2y', 'downsidedev_2y', 'alpha_2y', 'winrate_2y', 'beta_2y', 'skewness_2y', 'kurtosis_2y', 'worstmonth_2y', 'maxdrawdown_2y',
  172. 'stddev_3y', 'downsidedev_3y', 'alpha_3y', 'winrate_3y', 'beta_3y', 'skewness_3y', 'kurtosis_3y', 'worstmonth_3y', 'maxdrawdown_3y',
  173. 'stddev_4y', 'downsidedev_4y', 'alpha_4y', 'winrate_4y', 'beta_4y', 'skewness_4y', 'kurtosis_4y', 'worstmonth_4y', 'maxdrawdown_4y',
  174. 'stddev_5y', 'downsidedev_5y', 'alpha_5y', 'winrate_5y', 'beta_5y', 'skewness_5y', 'kurtosis_5y', 'worstmonth_5y', 'maxdrawdown_5y',
  175. 'stddev_10y', 'downsidedev_10y','alpha_10y', 'winrate_10y', 'beta_10y', 'skewness_10y', 'kurtosis_10y', 'worstmonth_10y', 'maxdrawdown_10y',
  176. 'stddev_ytd', 'downsidedev_ytd', 'alpha_ytd', 'winrate_ytd', 'beta_ytd', 'skewness_ytd', 'kurtosis_ytd', 'worstmonth_ytd', 'maxdrawdown_ytd',
  177. 'stddev_incep', 'downsidedev_incep', 'alpha_incep', 'winrate_incep', 'beta_incep', 'skewness_incep', 'kurtosis_incep', 'worstmonth_incep', 'maxdrawdown_incep'],
  178. [iif(is_id_integer, INT, SYMBOL), MONTH,
  179. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  180. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  181. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  182. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  183. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  184. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  185. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  186. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  187. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE]);
  188. }
  189. /*
  190. * 建基金经理/公司表 XXX_risk_stats
  191. *
  192. */
  193. def create_mc_risk_stats() {
  194. return table(1000:0,
  195. ['entity_id', 'curve_type', 'strategy', 'end_date',
  196. 'stddev_6m', 'downsidedev_6m', 'alpha_6m', 'winrate_6m', 'beta_6m', 'skewness_6m', 'kurtosis_6m', 'worstmonth_6m', 'maxdrawdown_6m',
  197. 'stddev_1y', 'downsidedev_1y', 'alpha_1y', 'winrate_1y', 'beta_1y', 'skewness_1y', 'kurtosis_1y', 'worstmonth_1y', 'maxdrawdown_1y',
  198. 'stddev_2y', 'downsidedev_2y', 'alpha_2y', 'winrate_2y', 'beta_2y', 'skewness_2y', 'kurtosis_2y', 'worstmonth_2y', 'maxdrawdown_2y',
  199. 'stddev_3y', 'downsidedev_3y', 'alpha_3y', 'winrate_3y', 'beta_3y', 'skewness_3y', 'kurtosis_3y', 'worstmonth_3y', 'maxdrawdown_3y',
  200. 'stddev_4y', 'downsidedev_4y', 'alpha_4y', 'winrate_4y', 'beta_4y', 'skewness_4y', 'kurtosis_4y', 'worstmonth_4y', 'maxdrawdown_4y',
  201. 'stddev_5y', 'downsidedev_5y', 'alpha_5y', 'winrate_5y', 'beta_5y', 'skewness_5y', 'kurtosis_5y', 'worstmonth_5y', 'maxdrawdown_5y',
  202. 'stddev_10y', 'downsidedev_10y','alpha_10y', 'winrate_10y', 'beta_10y', 'skewness_10y', 'kurtosis_10y', 'worstmonth_10y', 'maxdrawdown_10y',
  203. 'stddev_ytd', 'downsidedev_ytd', 'alpha_ytd', 'winrate_ytd', 'beta_ytd', 'skewness_ytd', 'kurtosis_ytd', 'worstmonth_ytd', 'maxdrawdown_ytd',
  204. 'stddev_incep', 'downsidedev_incep', 'alpha_incep', 'winrate_incep', 'beta_incep', 'skewness_incep', 'kurtosis_incep', 'worstmonth_incep', 'maxdrawdown_incep'],
  205. [SYMBOL, INT, INT, MONTH,
  206. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  207. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  208. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  209. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  210. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  211. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  212. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  213. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  214. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE]);
  215. }
  216. /*
  217. * 建表 XXX_riskadjret_stats
  218. */
  219. def create_entity_riskadjret_stats(is_id_integer=false) {
  220. return table(1000:0,
  221. ['entity_id', 'end_date',
  222. 'sharperatio_6m', 'sortinoratio_6m', 'treynorratio_6m', 'jensen_6m', 'calmarratio_6m', 'omegaratio_6m', 'kapparatio_6m',
  223. 'sharperatio_1y', 'sortinoratio_1y', 'treynorratio_1y', 'jensen_1y', 'calmarratio_1y', 'omegaratio_1y', 'kapparatio_1y',
  224. 'sharperatio_2y', 'sortinoratio_2y', 'treynorratio_2y', 'jensen_2y', 'calmarratio_2y', 'omegaratio_2y', 'kapparatio_2y',
  225. 'sharperatio_3y', 'sortinoratio_3y', 'treynorratio_3y', 'jensen_3y', 'calmarratio_3y', 'omegaratio_3y', 'kapparatio_3y',
  226. 'sharperatio_4y', 'sortinoratio_4y', 'treynorratio_4y', 'jensen_4y', 'calmarratio_4y', 'omegaratio_4y', 'kapparatio_4y',
  227. 'sharperatio_5y', 'sortinoratio_5y', 'treynorratio_5y', 'jensen_5y', 'calmarratio_5y', 'omegaratio_5y', 'kapparatio_5y',
  228. 'sharperatio_10y', 'sortinoratio_10y', 'treynorratio_10y', 'jensen_10y', 'calmarratio_10y', 'omegaratio_10y', 'kapparatio_10y',
  229. 'sharperatio_ytd', 'sortinoratio_ytd', 'treynorratio_ytd', 'jensen_ytd', 'calmarratio_ytd', 'omegaratio_ytd', 'kapparatio_ytd',
  230. 'sharperatio_incep', 'sortinoratio_incep', 'treynorratio_incep', 'jensen_incep', 'calmarratio_incep', 'omegaratio_incep', 'kapparatio_incep'],
  231. [iif(is_id_integer, INT, SYMBOL), MONTH,
  232. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  233. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  234. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  235. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  236. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  237. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  238. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  239. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  240. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE]);
  241. }
  242. /*
  243. * 建基金经理/公司表 XXX_riskadjret_stats
  244. */
  245. def create_mc_riskadjret_stats() {
  246. return table(1000:0,
  247. ['entity_id', 'curve_type', 'strategy', 'end_date',
  248. 'sharperatio_6m', 'sortinoratio_6m', 'treynorratio_6m', 'jensen_6m', 'calmarratio_6m', 'omegaratio_6m', 'kapparatio_6m',
  249. 'sharperatio_1y', 'sortinoratio_1y', 'treynorratio_1y', 'jensen_1y', 'calmarratio_1y', 'omegaratio_1y', 'kapparatio_1y',
  250. 'sharperatio_2y', 'sortinoratio_2y', 'treynorratio_2y', 'jensen_2y', 'calmarratio_2y', 'omegaratio_2y', 'kapparatio_2y',
  251. 'sharperatio_3y', 'sortinoratio_3y', 'treynorratio_3y', 'jensen_3y', 'calmarratio_3y', 'omegaratio_3y', 'kapparatio_3y',
  252. 'sharperatio_4y', 'sortinoratio_4y', 'treynorratio_4y', 'jensen_4y', 'calmarratio_4y', 'omegaratio_4y', 'kapparatio_4y',
  253. 'sharperatio_5y', 'sortinoratio_5y', 'treynorratio_5y', 'jensen_5y', 'calmarratio_5y', 'omegaratio_5y', 'kapparatio_5y',
  254. 'sharperatio_10y', 'sortinoratio_10y', 'treynorratio_10y', 'jensen_10y', 'calmarratio_10y', 'omegaratio_10y', 'kapparatio_10y',
  255. 'sharperatio_ytd', 'sortinoratio_ytd', 'treynorratio_ytd', 'jensen_ytd', 'calmarratio_ytd', 'omegaratio_ytd', 'kapparatio_ytd',
  256. 'sharperatio_incep', 'sortinoratio_incep', 'treynorratio_incep', 'jensen_incep', 'calmarratio_incep', 'omegaratio_incep', 'kapparatio_incep'],
  257. [SYMBOL, INT, INT, MONTH,
  258. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  259. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  260. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  261. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  262. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  263. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  264. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  265. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  266. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE]);
  267. }
  268. /*
  269. * 建表 XXX_style_stats
  270. */
  271. def create_entity_style_stats(is_id_integer=false) {
  272. return table(1000:0,
  273. ['entity_id', 'end_date',
  274. 'upsidecapture_ret_6m', 'downsidecapture_ret_6m', 'upsidecapture_ratio_6m', 'downsidecapture_ratio_6m',
  275. 'upsidecapture_ret_1y', 'downsidecapture_ret_1y', 'upsidecapture_ratio_1y', 'downsidecapture_ratio_1y',
  276. 'upsidecapture_ret_2y', 'downsidecapture_ret_2y', 'upsidecapture_ratio_2y', 'downsidecapture_ratio_2y',
  277. 'upsidecapture_ret_3y', 'downsidecapture_ret_3y', 'upsidecapture_ratio_3y', 'downsidecapture_ratio_3y',
  278. 'upsidecapture_ret_4y', 'downsidecapture_ret_4y', 'upsidecapture_ratio_4y', 'downsidecapture_ratio_4y',
  279. 'upsidecapture_ret_5y', 'downsidecapture_ret_5y', 'upsidecapture_ratio_5y', 'downsidecapture_ratio_5y',
  280. 'upsidecapture_ret_10y', 'downsidecapture_ret_10y', 'upsidecapture_ratio_10y', 'downsidecapture_ratio_10y',
  281. 'upsidecapture_ret_ytd', 'downsidecapture_ret_ytd', 'upsidecapture_ratio_ytd', 'downsidecapture_ratio_ytd',
  282. 'upsidecapture_ret_incep', 'downsidecapture_ret_incep', 'upsidecapture_ratio_incep', 'downsidecapture_ratio_incep'],
  283. [iif(is_id_integer, INT, SYMBOL), MONTH,
  284. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  285. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  286. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  287. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  288. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  289. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  290. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  291. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  292. DOUBLE, DOUBLE, DOUBLE, DOUBLE]);
  293. }
  294. /*
  295. * 建表 XXX_ms_stats
  296. */
  297. def create_entity_ms_stats(is_id_integer=false) {
  298. return table(1000:0,
  299. ['entity_id', 'end_date',
  300. 'ms_return_3y', 'ms_rar_3y', 'ms_risk_3y',
  301. 'ms_return_5y', 'ms_rar_5y', 'ms_risk_5y',
  302. 'ms_return_10y', 'ms_rar_10y', 'ms_risk_10y'],
  303. [iif(is_id_integer, INT, SYMBOL), MONTH,
  304. DOUBLE, DOUBLE, DOUBLE,
  305. DOUBLE, DOUBLE, DOUBLE,
  306. DOUBLE, DOUBLE, DOUBLE]);
  307. }
  308. /*
  309. * 建基金经理/公司表 XXX_style_stats
  310. */
  311. def create_mc_style_stats() {
  312. return table(1000:0,
  313. ['entity_id', 'curve_type', 'strategy', 'end_date',
  314. 'upsidecapture_ret_6m', 'downsidecapture_ret_6m', 'upsidecapture_ratio_6m', 'downsidecapture_ratio_6m',
  315. 'upsidecapture_ret_1y', 'downsidecapture_ret_1y', 'upsidecapture_ratio_1y', 'downsidecapture_ratio_1y',
  316. 'upsidecapture_ret_2y', 'downsidecapture_ret_2y', 'upsidecapture_ratio_2y', 'downsidecapture_ratio_2y',
  317. 'upsidecapture_ret_3y', 'downsidecapture_ret_3y', 'upsidecapture_ratio_3y', 'downsidecapture_ratio_3y',
  318. 'upsidecapture_ret_4y', 'downsidecapture_ret_4y', 'upsidecapture_ratio_4y', 'downsidecapture_ratio_4y',
  319. 'upsidecapture_ret_5y', 'downsidecapture_ret_5y', 'upsidecapture_ratio_5y', 'downsidecapture_ratio_5y',
  320. 'upsidecapture_ret_10y', 'downsidecapture_ret_10y', 'upsidecapture_ratio_10y', 'downsidecapture_ratio_10y',
  321. 'upsidecapture_ret_ytd', 'downsidecapture_ret_ytd', 'upsidecapture_ratio_ytd', 'downsidecapture_ratio_ytd',
  322. 'upsidecapture_ret_incep', 'downsidecapture_ret_incep', 'upsidecapture_ratio_incep', 'downsidecapture_ratio_incep'],
  323. [SYMBOL, INT, INT, MONTH,
  324. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  325. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  326. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  327. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  328. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  329. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  330. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  331. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  332. DOUBLE, DOUBLE, DOUBLE, DOUBLE]);
  333. }
  334. /*
  335. * 建表 XXX_bfi_bm_indicator
  336. */
  337. def create_entity_bfi_indicator(is_id_integer=false) {
  338. return table(1000:0,
  339. ['entity_id', 'end_date', 'factor_id',
  340. 'upsidecapture_ret_6m', 'downsidecapture_ret_6m', 'upsidecapture_ratio_6m', 'downsidecapture_ratio_6m',
  341. 'alpha_6m', 'winrate_6m', 'beta_6m', 'info_ratio_6m', 'tracking_error_6m', 'jensen_6m',
  342. 'upsidecapture_ret_1y', 'downsidecapture_ret_1y', 'upsidecapture_ratio_1y', 'downsidecapture_ratio_1y',
  343. 'alpha_1y', 'winrate_1y', 'beta_1y', 'info_ratio_1y', 'tracking_error_1y', 'jensen_1y',
  344. 'upsidecapture_ret_2y', 'downsidecapture_ret_2y', 'upsidecapture_ratio_2y', 'downsidecapture_ratio_2y',
  345. 'alpha_2y', 'winrate_2y', 'beta_2y', 'info_ratio_2y', 'tracking_error_2y', 'jensen_2y',
  346. 'upsidecapture_ret_3y', 'downsidecapture_ret_3y', 'upsidecapture_ratio_3y', 'downsidecapture_ratio_3y',
  347. 'alpha_3y', 'winrate_3y', 'beta_3y', 'info_ratio_3y', 'tracking_error_3y', 'jensen_3y',
  348. 'upsidecapture_ret_4y', 'downsidecapture_ret_4y', 'upsidecapture_ratio_4y', 'downsidecapture_ratio_4y',
  349. 'alpha_4y', 'winrate_4y', 'beta_4y', 'info_ratio_4y', 'tracking_error_4y', 'jensen_4y',
  350. 'upsidecapture_ret_5y', 'downsidecapture_ret_5y', 'upsidecapture_ratio_5y', 'downsidecapture_ratio_5y',
  351. 'alpha_5y', 'winrate_5y', 'beta_5y', 'info_ratio_5y', 'tracking_error_5y', 'jensen_5y',
  352. 'upsidecapture_ret_10y', 'downsidecapture_ret_10y', 'upsidecapture_ratio_10y', 'downsidecapture_ratio_10y',
  353. 'alpha_10y', 'winrate_10y', 'beta_10y', 'info_ratio_10y', 'tracking_error_10y', 'jensen_10y',
  354. 'upsidecapture_ret_ytd', 'downsidecapture_ret_ytd', 'upsidecapture_ratio_ytd', 'downsidecapture_ratio_ytd',
  355. 'alpha_ytd', 'winrate_ytd', 'beta_ytd', 'info_ratio_ytd', 'tracking_error_ytd', 'jensen_ytd',
  356. 'upsidecapture_ret_incep', 'downsidecapture_ret_incep', 'upsidecapture_ratio_incep', 'downsidecapture_ratio_incep',
  357. 'alpha_incep', 'winrate_incep', 'beta_incep', 'info_ratio_incep', 'tracking_error_incep', 'jensen_incep'],
  358. [iif(is_id_integer, INT, SYMBOL), MONTH, SYMBOL,
  359. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  360. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  361. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  362. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  363. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  364. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  365. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  366. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  367. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  368. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  369. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  370. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  371. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  372. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  373. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  374. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  375. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  376. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE] );
  377. }
  378. /*
  379. * 建基金经理/公司表 XXX_bfi_bm_indicator
  380. */
  381. def create_mc_bfi_indicator() {
  382. return table(1000:0,
  383. ['entity_id', 'curve_type', 'strategy', 'end_date', 'factor_id',
  384. 'upsidecapture_ret_6m', 'downsidecapture_ret_6m', 'upsidecapture_ratio_6m', 'downsidecapture_ratio_6m',
  385. 'alpha_6m', 'winrate_6m', 'beta_6m', 'info_ratio_6m', 'tracking_error_6m', 'jensen_6m',
  386. 'upsidecapture_ret_1y', 'downsidecapture_ret_1y', 'upsidecapture_ratio_1y', 'downsidecapture_ratio_1y',
  387. 'alpha_1y', 'winrate_1y', 'beta_1y', 'info_ratio_1y', 'tracking_error_1y', 'jensen_1y',
  388. 'upsidecapture_ret_2y', 'downsidecapture_ret_2y', 'upsidecapture_ratio_2y', 'downsidecapture_ratio_2y',
  389. 'alpha_2y', 'winrate_2y', 'beta_2y', 'info_ratio_2y', 'tracking_error_2y', 'jensen_2y',
  390. 'upsidecapture_ret_3y', 'downsidecapture_ret_3y', 'upsidecapture_ratio_3y', 'downsidecapture_ratio_3y',
  391. 'alpha_3y', 'winrate_3y', 'beta_3y', 'info_ratio_3y', 'tracking_error_3y', 'jensen_3y',
  392. 'upsidecapture_ret_4y', 'downsidecapture_ret_4y', 'upsidecapture_ratio_4y', 'downsidecapture_ratio_4y',
  393. 'alpha_4y', 'winrate_4y', 'beta_4y', 'info_ratio_4y', 'tracking_error_4y', 'jensen_4y',
  394. 'upsidecapture_ret_5y', 'downsidecapture_ret_5y', 'upsidecapture_ratio_5y', 'downsidecapture_ratio_5y',
  395. 'alpha_5y', 'winrate_5y', 'beta_5y', 'info_ratio_5y', 'tracking_error_5y', 'jensen_5y',
  396. 'upsidecapture_ret_10y', 'downsidecapture_ret_10y', 'upsidecapture_ratio_10y', 'downsidecapture_ratio_10y',
  397. 'alpha_10y', 'winrate_10y', 'beta_10y', 'info_ratio_10y', 'tracking_error_10y', 'jensen_10y',
  398. 'upsidecapture_ret_ytd', 'downsidecapture_ret_ytd', 'upsidecapture_ratio_ytd', 'downsidecapture_ratio_ytd',
  399. 'alpha_ytd', 'winrate_ytd', 'beta_ytd', 'info_ratio_ytd', 'tracking_error_ytd', 'jensen_ytd',
  400. 'upsidecapture_ret_incep', 'downsidecapture_ret_incep', 'upsidecapture_ratio_incep', 'downsidecapture_ratio_incep',
  401. 'alpha_incep', 'winrate_incep', 'beta_incep', 'info_ratio_incep', 'tracking_error_incep', 'jensen_incep'],
  402. [SYMBOL, INT, INT, MONTH, SYMBOL,
  403. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  404. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  405. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  406. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  407. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  408. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  409. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  410. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  411. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  412. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  413. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  414. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  415. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  416. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  417. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  418. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  419. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  420. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE] );
  421. }
  422. /*
  423. * 建表 xxx_performance_weekly
  424. */
  425. def create_entity_performance_weekly(is_id_integer=false) {
  426. return table(1000:0,
  427. ['entity_id', 'year_week', 'end_year', 'week_of_year', 'price_date', 'cumulative_nav', 'ret_1w'],
  428. [iif(is_id_integer, INT, SYMBOL), STRING, STRING, SHORT, DATE, DOUBLE, DOUBLE]);
  429. }
  430. /*
  431. * 建表 xxx_latest_performance
  432. */
  433. def create_entity_latest_performance(is_id_integer=false) {
  434. return table(1000:0,
  435. ['entity_id', 'end_date', 'price_date', 'pre_price_date', 'nav', 'cumulative_nav',
  436. 'net_value_change', 'ret_1d', 'ret_1w', 'ret_1m', 'ret_3m', 'ret_6m',
  437. 'ret_1y', 'ret_2y', 'ret_3y', 'ret_4y', 'ret_5y', 'ret_10y', 'ret_ytd', 'ret_incep', 'ret_incep_a', 'ret_incep_a_all', 'ret_incep_a_gips',
  438. 'maxdrawdown_1m', 'maxdrawdown_3m', 'maxdrawdown_1y', 'maxdrawdown_incep', 'calmarratio_incep',
  439. 'ret_1y_a', 'ret_2y_a', 'ret_3y_a', 'ret_4y_a', 'ret_5y_a', 'ret_10y_a'],
  440. [iif(is_id_integer, INT, SYMBOL), STRING, DATE, DATE, DOUBLE, DOUBLE,
  441. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  442. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  443. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  444. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE]);
  445. }
  446. /*
  447. * 建表 xxx_index_coe
  448. *
  449. */
  450. def create_entity_index_coe(is_id_integer=false) {
  451. return table(1000:0,
  452. ['entity_id', 'end_date', 'index_id',
  453. 'coe_1y', 'coe_3y', 'coe_5y', //'info_ratio_1y', 'info_ratio_3y', 'info_ratio_5y',
  454. 't_value_1y', 't_value_3y', 't_value_5y', 'beta_1y', 'beta_3y', 'beta_5y'],
  455. [iif(is_id_integer, INT, SYMBOL), MONTH, SYMBOL,
  456. DOUBLE, DOUBLE, DOUBLE, //DOUBLE, DOUBLE, DOUBLE,
  457. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE]);
  458. }
  459. /*
  460. * 建表 xxx_index_coe
  461. *
  462. */
  463. def create_mc_index_coe(is_id_integer=false) {
  464. return table(1000:0,
  465. ['entity_id', 'curve_type', 'strategy', 'end_date', 'index_id',
  466. 'coe_1y', 'coe_3y', 'coe_5y', //'info_ratio_1y', 'info_ratio_3y', 'info_ratio_5y',
  467. 't_value_1y', 't_value_3y', 't_value_5y', 'beta_1y', 'beta_3y', 'beta_5y'],
  468. [SYMBOL, INT, INT, MONTH, SYMBOL,
  469. DOUBLE, DOUBLE, DOUBLE, //DOUBLE, DOUBLE, DOUBLE,
  470. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE]);
  471. }
  472. /*
  473. * 建表 xxx_factor_bfi_max_r2
  474. *
  475. */
  476. def create_entity_bfi_max_r2(is_id_integer=false) {
  477. return table(1000:0,
  478. ['entity_id', 'end_date', 'factor_id', 'coe', 'r2', 'performance_flag', 'rz_portrait'],
  479. [iif(is_id_integer, INT, SYMBOL), MONTH, SYMBOL, DOUBLE, DOUBLE, STRING, STRING]);
  480. }
  481. /*
  482. * 建表 xxx_factor_bfi
  483. *
  484. */
  485. def create_entity_factor_bfi(is_id_integer=false) {
  486. return table(1000:0,
  487. ['entity_id', 'end_date', 'factor_id',
  488. 'coe', 'r2', 'performance_flag', 't_value_1y', 'beta_1y'],
  489. [iif(is_id_integer, INT, SYMBOL), MONTH, SYMBOL,
  490. DOUBLE, DOUBLE, STRING, DOUBLE, DOUBLE]);
  491. }
  492. /*
  493. * 建基金经理/公司 bfi连接表 xxx_factor_bfi
  494. *
  495. */
  496. def create_mc_factor_bfi(is_id_integer=false) {
  497. return table(1000:0,
  498. ['entity_id', 'curve_type', 'strategy', 'end_date', 'factor_id',
  499. 'coe', 'r2', 'performance_flag', 't_value_1y', 'beta_1y'],
  500. [SYMBOL, INT, INT, MONTH, SYMBOL,
  501. DOUBLE, DOUBLE, STRING, DOUBLE, DOUBLE]);
  502. }
  503. /*
  504. * 建表 XXXX_indicator_ranking
  505. */
  506. def create_entity_indicator_ranking(is_id_integer=false) {
  507. return table(1000:0,
  508. ['entity_id', 'end_date', 'category_id', 'indicator_id',
  509. 'indicator_1m', 'absrank_1m', 'perrank_1m', 'indicator_3m', 'absrank_3m', 'perrank_3m',
  510. 'indicator_6m', 'absrank_6m', 'perrank_6m', 'indicator_1y', 'absrank_1y', 'perrank_1y',
  511. 'indicator_2y', 'absrank_2y', 'perrank_2y', 'indicator_3y', 'absrank_3y', 'perrank_3y',
  512. 'indicator_5y', 'absrank_5y', 'perrank_5y',
  513. 'indicator_10y', 'absrank_10y', 'perrank_10y', 'indicator_ytd', 'absrank_ytd', 'perrank_ytd'],
  514. [iif(is_id_integer, INT, SYMBOL), STRING, SYMBOL, INT,
  515. DOUBLE, INT, INT, DOUBLE, INT, INT,
  516. DOUBLE, INT, INT, DOUBLE, INT, INT,
  517. DOUBLE, INT, INT, DOUBLE, INT, INT,
  518. DOUBLE, INT, INT,
  519. DOUBLE, INT, INT, DOUBLE, INT, INT]);
  520. }
  521. /*
  522. * 建基金经理/公司表 XXXX_indicator_ranking
  523. */
  524. def create_mc_indicator_ranking(is_id_integer=false) {
  525. return table(1000:0,
  526. ['entity_id', 'curve_type', 'strategy', 'category_id', 'end_date', 'indicator_id',
  527. 'indicator_1m', 'absrank_1m', 'perrank_1m', 'indicator_3m', 'absrank_3m', 'perrank_3m',
  528. 'indicator_6m', 'absrank_6m', 'perrank_6m', 'indicator_1y', 'absrank_1y', 'perrank_1y',
  529. 'indicator_2y', 'absrank_2y', 'perrank_2y', 'indicator_3y', 'absrank_3y', 'perrank_3y',
  530. 'indicator_5y', 'absrank_5y', 'perrank_5y',
  531. 'indicator_10y', 'absrank_10y', 'perrank_10y', 'indicator_ytd', 'absrank_ytd', 'perrank_ytd'],
  532. [SYMBOL, INT, INT, SYMBOL, STRING, INT,
  533. DOUBLE, INT, INT, DOUBLE, INT, INT,
  534. DOUBLE, INT, INT, DOUBLE, INT, INT,
  535. DOUBLE, INT, INT, DOUBLE, INT, INT,
  536. DOUBLE, INT, INT,
  537. DOUBLE, INT, INT, DOUBLE, INT, INT]);
  538. }
  539. /*
  540. * 建表 XXXX_indicator_ranking_num, raise_type 没有用
  541. */
  542. def create_entity_indicator_ranking_num() {
  543. return table(1000:0,
  544. ['end_date', 'category_id', 'raise_type', 'indicator_id',
  545. 'avg_1m', 'avg_1m_cnt', 'perrank_percent_5_1m', 'perrank_percent_10_1m', 'perrank_percent_25_1m', 'perrank_percent_50_1m',
  546. 'perrank_percent_75_1m', 'perrank_percent_90_1m', 'perrank_percent_95_1m', 'best_1m', 'worst_1m',
  547. 'avg_3m', 'avg_3m_cnt', 'perrank_percent_5_3m', 'perrank_percent_10_3m', 'perrank_percent_25_3m', 'perrank_percent_50_3m',
  548. 'perrank_percent_75_3m', 'perrank_percent_90_3m', 'perrank_percent_95_3m', 'best_3m', 'worst_3m',
  549. 'avg_6m', 'avg_6m_cnt', 'perrank_percent_5_6m', 'perrank_percent_10_6m', 'perrank_percent_25_6m', 'perrank_percent_50_6m',
  550. 'perrank_percent_75_6m', 'perrank_percent_90_6m', 'perrank_percent_95_6m', 'best_6m', 'worst_6m',
  551. 'avg_1y', 'avg_1y_cnt', 'perrank_percent_5_1y', 'perrank_percent_10_1y', 'perrank_percent_25_1y', 'perrank_percent_50_1y',
  552. 'perrank_percent_75_1y', 'perrank_percent_90_1y', 'perrank_percent_95_1y', 'best_1y', 'worst_1y',
  553. 'avg_2y', 'avg_2y_cnt', 'perrank_percent_5_2y', 'perrank_percent_10_2y', 'perrank_percent_25_2y', 'perrank_percent_50_2y',
  554. 'perrank_percent_75_2y', 'perrank_percent_90_2y', 'perrank_percent_95_2y', 'best_2y', 'worst_2y',
  555. 'avg_3y', 'avg_3y_cnt', 'perrank_percent_5_3y', 'perrank_percent_10_3y', 'perrank_percent_25_3y', 'perrank_percent_50_3y',
  556. 'perrank_percent_75_3y', 'perrank_percent_90_3y', 'perrank_percent_95_3y', 'best_3y', 'worst_3y',
  557. 'avg_5y', 'avg_5y_cnt', 'perrank_percent_5_5y', 'perrank_percent_10_5y', 'perrank_percent_25_5y', 'perrank_percent_50_5y',
  558. 'perrank_percent_75_5y', 'perrank_percent_90_5y', 'perrank_percent_95_5y', 'best_5y', 'worst_5y',
  559. 'avg_10y', 'avg_10y_cnt', 'perrank_percent_5_10y', 'perrank_percent_10_10y', 'perrank_percent_25_10y', 'perrank_percent_50_10y',
  560. 'perrank_percent_75_10y', 'perrank_percent_90_10y', 'perrank_percent_95_10y', 'best_10y', 'worst_10y',
  561. 'avg_ytd', 'avg_ytd_cnt', 'perrank_percent_5_ytd', 'perrank_percent_10_ytd', 'perrank_percent_25_ytd', 'perrank_percent_50_ytd',
  562. 'perrank_percent_75_ytd', 'perrank_percent_90_ytd', 'perrank_percent_95_ytd', 'best_ytd', 'worst_ytd'],
  563. [STRING, SYMBOL, INT, INT,
  564. DOUBLE, INT, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  565. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  566. DOUBLE, INT, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  567. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  568. DOUBLE, INT, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  569. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  570. DOUBLE, INT, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  571. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  572. DOUBLE, INT, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  573. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  574. DOUBLE, INT, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  575. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  576. DOUBLE, INT, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  577. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  578. DOUBLE, INT, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  579. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  580. DOUBLE, INT, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  581. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE ]);
  582. }
  583. /*
  584. * 建基金经理/公司表 XXXX_indicator_ranking_num, raise_type 没有用
  585. */
  586. def create_mc_indicator_ranking_num() {
  587. return table(1000:0,
  588. ['curve_type', 'strategy', 'category_id', 'end_date', 'indicator_id',
  589. 'avg_1m', 'avg_1m_cnt', 'perrank_percent_5_1m', 'perrank_percent_10_1m', 'perrank_percent_25_1m', 'perrank_percent_50_1m',
  590. 'perrank_percent_75_1m', 'perrank_percent_90_1m', 'perrank_percent_95_1m', 'best_1m', 'worst_1m',
  591. 'avg_3m', 'avg_3m_cnt', 'perrank_percent_5_3m', 'perrank_percent_10_3m', 'perrank_percent_25_3m', 'perrank_percent_50_3m',
  592. 'perrank_percent_75_3m', 'perrank_percent_90_3m', 'perrank_percent_95_3m', 'best_3m', 'worst_3m',
  593. 'avg_6m', 'avg_6m_cnt', 'perrank_percent_5_6m', 'perrank_percent_10_6m', 'perrank_percent_25_6m', 'perrank_percent_50_6m',
  594. 'perrank_percent_75_6m', 'perrank_percent_90_6m', 'perrank_percent_95_6m', 'best_6m', 'worst_6m',
  595. 'avg_1y', 'avg_1y_cnt', 'perrank_percent_5_1y', 'perrank_percent_10_1y', 'perrank_percent_25_1y', 'perrank_percent_50_1y',
  596. 'perrank_percent_75_1y', 'perrank_percent_90_1y', 'perrank_percent_95_1y', 'best_1y', 'worst_1y',
  597. 'avg_2y', 'avg_2y_cnt', 'perrank_percent_5_2y', 'perrank_percent_10_2y', 'perrank_percent_25_2y', 'perrank_percent_50_2y',
  598. 'perrank_percent_75_2y', 'perrank_percent_90_2y', 'perrank_percent_95_2y', 'best_2y', 'worst_2y',
  599. 'avg_3y', 'avg_3y_cnt', 'perrank_percent_5_3y', 'perrank_percent_10_3y', 'perrank_percent_25_3y', 'perrank_percent_50_3y',
  600. 'perrank_percent_75_3y', 'perrank_percent_90_3y', 'perrank_percent_95_3y', 'best_3y', 'worst_3y',
  601. 'avg_5y', 'avg_5y_cnt', 'perrank_percent_5_5y', 'perrank_percent_10_5y', 'perrank_percent_25_5y', 'perrank_percent_50_5y',
  602. 'perrank_percent_75_5y', 'perrank_percent_90_5y', 'perrank_percent_95_5y', 'best_5y', 'worst_5y',
  603. 'avg_10y', 'avg_10y_cnt', 'perrank_percent_5_10y', 'perrank_percent_10_10y', 'perrank_percent_25_10y', 'perrank_percent_50_10y',
  604. 'perrank_percent_75_10y', 'perrank_percent_90_10y', 'perrank_percent_95_10y', 'best_10y', 'worst_10y',
  605. 'avg_ytd', 'avg_ytd_cnt', 'perrank_percent_5_ytd', 'perrank_percent_10_ytd', 'perrank_percent_25_ytd', 'perrank_percent_50_ytd',
  606. 'perrank_percent_75_ytd', 'perrank_percent_90_ytd', 'perrank_percent_95_ytd', 'best_ytd', 'worst_ytd'],
  607. [INT, INT, SYMBOL, STRING, INT,
  608. DOUBLE, INT, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  609. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  610. DOUBLE, INT, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  611. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  612. DOUBLE, INT, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  613. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  614. DOUBLE, INT, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  615. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  616. DOUBLE, INT, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  617. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  618. DOUBLE, INT, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  619. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  620. DOUBLE, INT, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  621. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  622. DOUBLE, INT, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  623. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  624. DOUBLE, INT, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  625. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE ]);
  626. }
  627. /*
  628. * 根据 mysql 表改动某些字段
  629. */
  630. def chg_columns_for_mysql(mutable tb_mysql, id_col_name) {
  631. tb_mysql.rename!('entity_id', id_col_name);
  632. // 将 dolphinDB 的 MONTH 换成 MySQL 的 YYYY-MM 格式
  633. v_end_date = EXEC end_date.temporalFormat('yyyy-MM') FROM tb_mysql;
  634. tb_mysql.replaceColumn!('end_date', v_end_date);
  635. }
  636. /*
  637. * 按照 XXX_performance 表结构准备数据记录
  638. *
  639. * @param entity_info <TABLE>: [COLUMNS] entity_id, end_date (用于筛掉不必要的老记录), [curve_type, strategy]
  640. * @param indicators <DICT>: 指标类型-区间:数据表
  641. * @param entity_performance <TABLE>: 被更新的数据表
  642. * @param extra_keys <VECTOR>: 只有基金经理和公司会用到,对应 [curve_type, strategy]
  643. *
  644. * TODO: price_date is NULL for some records
  645. */
  646. def generate_entity_performance(entity_info, indicators, isToMySQL, mutable entity_performance, extra_keys=[]) {
  647. t = null;
  648. if(extra_keys.isNothing() || extra_keys.isVoid() || extra_keys.size() == 0) v_extra_keys = array(STRING);
  649. else v_extra_keys = extra_keys;
  650. if(isToMySQL) {
  651. if(indicators['PBI-3M'].isVoid() || indicators['PBI-3M'].size() == 0) return;
  652. t = sql(select =(sqlCol('entity_id'),
  653. sqlCol(v_extra_keys.join('end_date')),
  654. sqlCol('price_date'),
  655. sqlCol(['nav', 'ret', 'ret', 'trailing_ret', 'trailing_ret_a'], , ['cumulative_nav', 'ret_1m', 'ret_1m_a', 'ret_3m', 'ret_3m_a'])
  656. ),
  657. from = ej(indicators['PBI-3M'] AS a, entity_info AS fi, ['entity_id'].join(v_extra_keys)),
  658. where = < end_date >= fi_price_date.month()> // 过滤掉不必更新的旧记录, 这里用系统字段的别名 fi_price_date 有点脏,但目前没办法
  659. ).eval();
  660. v_trailing = ['6m', '1y', '2y', '3y', '4y', '5y', '10y', 'ytd', 'incep'];
  661. for(tr in v_trailing) {
  662. col_name = 'ret_' + tr;
  663. col_a_name = 'ret_' + tr + '_a';
  664. t.addColumn([col_name, col_a_name], [DOUBLE, DOUBLE]);
  665. if(!indicators['PBI-'+tr.upper()].isVoid()) {
  666. sqlUpdate(table = t,
  667. updates = [<trailing_ret as _$col_name>, <trailing_ret_a as _$col_a_name>],
  668. from = <ej(t, indicators['PBI-'+tr.upper()], ['entity_id'].join(v_extra_keys).join(['end_date']))>
  669. ).eval();
  670. }
  671. }
  672. INSERT INTO entity_performance SELECT * FROM t;
  673. } else {
  674. }
  675. }
  676. /*
  677. * 按照 XXX_risk_stats 表结构准备数据记录
  678. *
  679. *
  680. */
  681. def generate_entity_risk_stats(entity_info, indicators, isToMySQL, mutable entity_risk_stats, extra_keys=[]) {
  682. t = null;
  683. if(extra_keys.isNothing() || extra_keys.isVoid() || extra_keys.size() == 0) v_extra_keys = array(STRING);
  684. else v_extra_keys = extra_keys;
  685. if(indicators['PBI-6M'].isVoid() || indicators['PBI-6M'].size() == 0) return;
  686. if(isToMySQL) {
  687. t = sql(select =(sqlCol('entity_id'),
  688. sqlCol(v_extra_keys.join('end_date')),
  689. sqlCol(['std_dev_a', 'ds_dev_a', 'alpha_a', 'winrate', 'beta', 'skewness', 'kurtosis', 'wrst_month', 'drawdown'],
  690. , ['stddev_6m', 'downsidedev_6m', 'alpha_6m', 'winrate_6m', 'beta_6m', 'skewness_6m', 'kurtosis_6m', 'worstmonth_6m', 'maxdrawdown_6m'])
  691. ),
  692. from = ej(indicators['PBI-6M'] AS a, entity_info AS fi, ['entity_id'].join(v_extra_keys)),
  693. where = < end_date >= fi_price_date.month()> // 过滤掉不必更新的旧记录
  694. ).eval();
  695. v_trailing = ['1y', '2y', '3y', '4y', '5y', '10y', 'ytd', 'incep'];
  696. for(tr in v_trailing) {
  697. col_std_dev = 'stddev_' + tr;
  698. col_ds_dev = 'downsidedev_' + tr;
  699. col_alpha = 'alpha_' + tr;
  700. col_winrate = 'winrate_' + tr;
  701. col_beta = 'beta_' + tr;
  702. col_skewness = 'skewness_' + tr;
  703. col_kurtosis = 'kurtosis_' + tr;
  704. col_wrst_month = 'worstmonth_' + tr;
  705. col_drawdown = 'maxdrawdown_' + tr;
  706. t.addColumn([col_std_dev, col_ds_dev, col_alpha, col_winrate, col_beta, col_skewness, col_kurtosis, col_wrst_month, col_drawdown],
  707. [DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE]);
  708. if(!indicators['PBI-'+tr.upper()].isVoid()) {
  709. sqlUpdate(table = t,
  710. updates = [<std_dev_a as _$col_std_dev>, <ds_dev_a as _$col_ds_dev>, <alpha_a as _$col_alpha>,
  711. <winrate as _$col_winrate>, <beta as _$col_beta>, <skewness as _$col_skewness>,
  712. <kurtosis as _$col_kurtosis>, <wrst_month as _$col_wrst_month>, <drawdown as _$col_drawdown>],
  713. from = <ej(t, indicators['PBI-'+tr.upper()], ['entity_id'].join(v_extra_keys).join(['end_date']))>
  714. ).eval();
  715. }
  716. }
  717. INSERT INTO entity_risk_stats SELECT * FROM t;
  718. } else {
  719. }
  720. }
  721. /*
  722. * 按照 XXX_riskadjret_stats 表结构准备数据记录
  723. *
  724. *
  725. */
  726. def generate_entity_riskadjret_stats(entity_info, indicators, isToMySQL, mutable entity_riskadjret_stats, extra_keys=[]) {
  727. t = null;
  728. if(extra_keys.isNothing() || extra_keys.isVoid() || extra_keys.size() == 0) v_extra_keys = array(STRING);
  729. else v_extra_keys = extra_keys;
  730. if(indicators['PBI-6M'].isVoid() || indicators['PBI-6M'].size() == 0) return;
  731. if(isToMySQL) {
  732. t = sql(select =(sqlCol('entity_id'),
  733. sqlCol(v_extra_keys.join('end_date')),
  734. sqlCol(['sharpe_a', 'sortino_a', 'treynor', 'jensen_a', 'calmar', 'omega', 'kappa'],
  735. , ['sharperatio_6m', 'sortinoratio_6m', 'treynorratio_6m', 'jensen_6m', 'calmarratio_6m', 'omegaratio_6m', 'kapparatio_6m'])
  736. ),
  737. from = ej(indicators['PBI-6M'] AS a, entity_info AS fi, ['entity_id'].join(v_extra_keys)),
  738. where = < end_date >= fi_price_date.month()> // 过滤掉不必更新的旧记录
  739. ).eval();
  740. v_trailing = ['1y', '2y', '3y', '4y', '5y', '10y', 'ytd', 'incep'];
  741. for(tr in v_trailing) {
  742. col_sharpe = 'sharperatio_' + tr;
  743. col_sortino = 'sortinoratio_' + tr;
  744. col_treynor = 'treynorratio_' + tr;
  745. col_jensen = 'jensen_' + tr;
  746. col_calmar = 'calmarratio_' + tr;
  747. col_omega = 'omegaratio_' + tr;
  748. col_kappa = 'kapparatio_' + tr;
  749. t.addColumn([col_sharpe, col_sortino, col_treynor, col_jensen, col_calmar, col_omega, col_kappa],
  750. [DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE]);
  751. if(!indicators['PBI-'+tr.upper()].isVoid()) {
  752. sqlUpdate(table = t,
  753. updates = [<sharpe_a as _$col_sharpe>, <sortino_a as _$col_sortino>, <treynor as _$col_treynor>,
  754. <jensen_a as _$col_jensen>, <calmar as _$col_calmar>, <omega as _$col_omega>,
  755. <kappa as _$col_kappa>],
  756. from = <ej(t, indicators['PBI-'+tr.upper()], ['entity_id'].join(v_extra_keys).join(['end_date']))>
  757. ).eval();
  758. }
  759. }
  760. INSERT INTO entity_riskadjret_stats SELECT * FROM t;
  761. } else {
  762. }
  763. }
  764. /*
  765. * 按照 XXX_indicator 表结构准备数据记录
  766. *
  767. *
  768. */
  769. def generate_entity_indicator(entity_info, indicators, isToMySQL, mutable entity_indicator, extra_keys=[]) {
  770. t = null;
  771. if(extra_keys.isNothing() || extra_keys.isVoid() || extra_keys.size() == 0) v_extra_keys = array(STRING);
  772. else v_extra_keys = extra_keys;
  773. if(indicators['PBI-6M'].isVoid() || indicators['PBI-6M'].size() == 0) return;
  774. if(isToMySQL) {
  775. t = sql(select =(sqlCol('entity_id'),
  776. sqlCol(v_extra_keys.join('end_date')),
  777. sqlCol(['info_a', 'm2_a', 'track_error_a'],
  778. , ['info_ratio_6m', 'm2_6m', 'tracking_error_6m'])
  779. ),
  780. from = ej(indicators['PBI-6M'] AS a, entity_info AS fi, ['entity_id'].join(v_extra_keys)),
  781. where = < end_date >= fi_price_date.month()> // 过滤掉不必更新的旧记录
  782. ).eval();
  783. v_trailing = ['1y', '2y', '3y', '4y', '5y', '10y', 'ytd', 'incep'];
  784. for(tr in v_trailing) {
  785. col_info = 'info_ratio_' + tr;
  786. col_m2 = 'm2_' + tr;
  787. col_track_error = 'tracking_error_' + tr;
  788. col_var = 'var_' + tr;
  789. col_cvar = 'cvar_' + tr;
  790. t.addColumn([col_info, col_m2, col_track_error],
  791. [DOUBLE, DOUBLE, DOUBLE]);
  792. if(tr != 'ytd') // YTD 没有 VAR, CVAR
  793. t.addColumn([col_var, col_cvar], [DOUBLE, DOUBLE]);
  794. if(!indicators['PBI-'+tr.upper()].isVoid()) {
  795. sqlUpdate(table = t,
  796. updates = iif(tr != 'ytd', [<info_a as _$col_info>, <m2_a as _$col_m2>, <track_error_a as _$col_track_error>,
  797. <var as _$col_var>, <cvar as _$col_cvar>], [<info_a as _$col_info>, <m2_a as _$col_m2>, <track_error_a as _$col_track_error>]),
  798. from = <ej(t, indicators['PBI-'+tr.upper()], ['entity_id'].join(v_extra_keys).join(['end_date']))>
  799. ).eval();
  800. }
  801. }
  802. // var, cvar 只有2年及更长时间才计算
  803. t.dropColumns!(['var_1y', 'cvar_1y']);
  804. INSERT INTO entity_indicator SELECT * FROM t;
  805. } else {
  806. }
  807. }
  808. /*
  809. * 按照 XXX_style_stats 表结构准备数据记录
  810. *
  811. *
  812. */
  813. def generate_entity_style_stats(entity_info, indicators, isToMySQL, mutable entity_style_stats, extra_keys=[]) {
  814. t = null;
  815. if(extra_keys.isNothing() || extra_keys.isVoid() || extra_keys.size() == 0) v_extra_keys = array(STRING);
  816. else v_extra_keys = extra_keys;
  817. if(indicators['PBI-6M'].isVoid() || indicators['PBI-6M'].size() == 0) return;
  818. if(isToMySQL) {
  819. t = sql(select =(sqlCol('entity_id'),
  820. sqlCol(v_extra_keys.join('end_date')),
  821. sqlCol(['upside_capture_ret', 'downside_capture_ret', 'upside_capture_ratio', 'downside_capture_ratio'],
  822. , ['upsidecapture_ret_6m', 'downsidecapture_ret_6m', 'upsidecapture_ratio_6m', 'downsidecapture_ratio_6m'])
  823. ),
  824. from = ej(indicators['PBI-6M'] AS a, entity_info AS fi, ['entity_id'].join(v_extra_keys)),
  825. where = < end_date >= fi_price_date.month()> // 过滤掉不必更新的旧记录
  826. ).eval();
  827. v_trailing = ['1y', '2y', '3y', '4y', '5y', '10y', 'ytd', 'incep'];
  828. for(tr in v_trailing) {
  829. col_upside_capture_ret = 'upsidecapture_ret_' + tr;
  830. col_downside_capture_ret = 'downsidecapture_ret_' + tr;
  831. col_upside_capture_ratio = 'upsidecapture_ratio_' + tr;
  832. col_downside_capture_ratio = 'downsidecapture_ratio_' + tr;
  833. t.addColumn([col_upside_capture_ret, col_downside_capture_ret, col_upside_capture_ratio, col_downside_capture_ratio],
  834. [DOUBLE, DOUBLE, DOUBLE, DOUBLE]);
  835. if(!indicators['PBI-'+tr.upper()].isVoid()) {
  836. sqlUpdate(table = t,
  837. updates = [<upside_capture_ret as _$col_upside_capture_ret>, <downside_capture_ret as _$col_downside_capture_ret>,
  838. <upside_capture_ratio as _$col_upside_capture_ratio>, <downside_capture_ratio as _$col_downside_capture_ratio>],
  839. from = <ej(t, indicators['PBI-'+tr.upper()], ['entity_id'].join(v_extra_keys).join(['end_date']))>
  840. ).eval();
  841. }
  842. }
  843. INSERT INTO entity_style_stats SELECT * FROM t;
  844. } else {
  845. }
  846. }
  847. /*
  848. * 按照 XXX_ms_stats 表结构准备数据记录
  849. *
  850. *
  851. */
  852. def generate_entity_ms_stats(entity_info, indicators, isToMySQL, mutable entity_ms_stats, extra_keys=[]) {
  853. t = null;
  854. if(extra_keys.isNothing() || extra_keys.isVoid() || extra_keys.size() == 0) v_extra_keys = array(STRING);
  855. else v_extra_keys = extra_keys;
  856. if(indicators['PBI-3Y'].isVoid() || indicators['PBI-3Y'].size() == 0) return;
  857. if(isToMySQL) {
  858. t = sql(select =(sqlCol('entity_id'),
  859. sqlCol(v_extra_keys.join('end_date')),
  860. sqlCol(['ms_ret_a', 'ms_rar_a', 'ms_risk_a'],
  861. , ['ms_return_3y', 'ms_rar_3y', 'ms_risk_3y'])
  862. ),
  863. from = ej(indicators['PBI-3Y'] AS a, entity_info AS fi, ['entity_id'].join(v_extra_keys)),
  864. where = < end_date >= fi_price_date.month()> // 过滤掉不必更新的旧记录
  865. ).eval();
  866. v_trailing = ['5y', '10y'];
  867. for(tr in v_trailing) {
  868. col_ms_ret = 'ms_return_' + tr;
  869. col_ms_rar = 'ms_rar_' + tr;
  870. col_ms_risk = 'ms_risk_' + tr;
  871. t.addColumn([col_ms_ret, col_ms_rar, col_ms_risk],
  872. [DOUBLE, DOUBLE, DOUBLE]);
  873. if(!indicators['PBI-'+tr.upper()].isVoid()) {
  874. sqlUpdate(table = t,
  875. updates = [<ms_ret_a as _$col_ms_ret>, <ms_rar_a as _$col_ms_rar>, <ms_risk_a as _$col_ms_risk>],
  876. from = <ej(t, indicators['PBI-'+tr.upper()], ['entity_id'].join(v_extra_keys).join(['end_date']))>
  877. ).eval();
  878. }
  879. }
  880. INSERT INTO entity_ms_stats SELECT * FROM t;
  881. } else {
  882. }
  883. }
  884. /*
  885. * 按照 XXX_bfi_bm_indicator 表结构准备数据记录
  886. *
  887. * @param entity_info <TABLE>: [COLUMNS] entity_id, end_date, benchmark_id, inception_date, ini_value [,curve_type, strategy]
  888. * @param indicators <DICTIONARY>
  889. *
  890. * TODO: why we need isToMySQL here?
  891. * 其它的指标恐怕也要按这个改,因为私募可能会有近6月没有数据但近2年之类的周期有数据的情况!
  892. */
  893. def generate_entity_bfi_indicator(entity_info, indicators, isToMySQL, mutable entity_bfi_indicator, extra_keys=[]) {
  894. t = null;
  895. if(extra_keys.isNothing() || extra_keys.isVoid() || extra_keys.size() == 0) v_extra_keys = array(STRING);
  896. else v_extra_keys = extra_keys;
  897. v_cols_from = ['upside_capture_ret', 'downside_capture_ret', 'upside_capture_ratio', 'downside_capture_ratio', 'alpha_a', 'winrate', 'beta', 'info_a', 'track_error_a', 'jensen_a'];
  898. v_cols_to = ['upsidecapture_ret', 'downsidecapture_ret', 'upsidecapture_ratio', 'downsidecapture_ratio', 'alpha', 'winrate', 'beta', 'info_ratio', 'tracking_error', 'jensen'];
  899. v_cols_useless = ['track_error', 'info', 'alpha', 'treynor', 'jensen', 'm2', 'm2_a']; // 标准指标中不被当前表覆盖的数据点
  900. v_join_key = ['entity_id', 'benchmark_id', 'end_date'].join(v_extra_keys);
  901. if(isToMySQL) {
  902. t = lj(
  903. lj(
  904. lj(
  905. lj(
  906. lj(
  907. lj(
  908. lj(
  909. lj(
  910. lj(entity_info,
  911. indicators['BFI-6M'] AS t_6m, v_join_key).dropColumns!(v_cols_useless),
  912. indicators['BFI-1Y'] AS t_1y, v_join_key).dropColumns!(v_cols_useless),
  913. indicators['BFI-2Y'] AS t_2y, v_join_key).dropColumns!(v_cols_useless),
  914. indicators['BFI-3Y'] AS t_3y, v_join_key).dropColumns!(v_cols_useless),
  915. indicators['BFI-4Y'] AS t_4y, v_join_key).dropColumns!(v_cols_useless),
  916. indicators['BFI-5Y'] AS t_5y, v_join_key).dropColumns!(v_cols_useless),
  917. indicators['BFI-10Y'] AS t_10y, v_join_key).dropColumns!(v_cols_useless),
  918. indicators['BFI-YTD'] AS t_ytd, v_join_key).dropColumns!(v_cols_useless),
  919. indicators['BFI-INCEP'] AS t_incep, v_join_key).dropColumns!(v_cols_useless);
  920. t.rename!(v_cols_from, v_cols_to + '_6m');
  921. t.rename!('t_1y_' + v_cols_from, v_cols_to + '_1y');
  922. t.rename!('t_2y_' + v_cols_from, v_cols_to + '_2y');
  923. t.rename!('t_3y_' + v_cols_from, v_cols_to + '_3y');
  924. t.rename!('t_4y_' + v_cols_from, v_cols_to + '_4y');
  925. t.rename!('t_5y_' + v_cols_from, v_cols_to + '_5y');
  926. t.rename!('t_10y_' + v_cols_from, v_cols_to + '_10y');
  927. t.rename!('t_ytd_' + v_cols_from, v_cols_to + '_ytd');
  928. t.rename!('t_incep_' + v_cols_from, v_cols_to + '_incep');
  929. if(t.columnNames().find('inception_date') >= 0) t.dropColumns!('inception_date');
  930. if(t.columnNames().find('ini_value') >= 0) t.dropColumns!('ini_value');
  931. t.rename!('benchmark_id', 'factor_id');
  932. entity_bfi_indicator.tableInsert(t.reorderColumns!(entity_bfi_indicator.colNames()));
  933. } else {
  934. }
  935. }
  936. /*
  937. * 按照 XXX_performance_weekly 表结构准备数据记录
  938. *
  939. *
  940. */
  941. def generate_entity_performance_weekly(entity_info, ret_w, isToMySQL, mutable entity_performance_weekly) {
  942. t = null;
  943. if(ret_w.isVoid() || ret_w.size() == 0) return;
  944. if(isToMySQL) {
  945. t = SELECT entity_id, year_week, year_week.left(4)$INT AS end_year, year_week.right(2)$INT AS week_of_year, price_date,
  946. cumulative_nav, ret_1w
  947. FROM ret_w r
  948. INNER JOIN entity_info fi ON r.entity_id = fi.entity_id
  949. WHERE r.price_date >= fi.price_date; // 过滤掉不必更新的旧记录
  950. INSERT INTO entity_performance_weekly SELECT * FROM t;
  951. } else {
  952. }
  953. }
  954. /*
  955. * 按照 XXX_latest_performance 表结构准备数据记录
  956. *
  957. *
  958. */
  959. def generate_entity_latest_performance(entity_info, perf_latest, isToMySQL, mutable entity_latest_performance) {
  960. t = null;
  961. if(perf_latest.isVoid() || perf_latest.size() == 0) return;
  962. if(isToMySQL) {
  963. t = SELECT r.*
  964. FROM perf_latest r
  965. INNER JOIN entity_info fi ON r.entity_id = fi.entity_id
  966. WHERE r.price_date >= fi.price_date; // 过滤掉不必更新的旧记录
  967. INSERT INTO entity_latest_performance SELECT * FROM t;
  968. } else {
  969. }
  970. }