dataSaver.dos 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645
  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. saveTable(db, tb, table_name.split(".")[1])
  17. }
  18. }
  19. /*
  20. * 【临时】 用于将dolphin table 存到 mysql
  21. *
  22. */
  23. def save_table2(tb, table_name, isCreateTable) {
  24. tb.addColumn(['creatorid', 'createtime', 'updaterid', 'updatetime'], [INT, DATETIME, INT, DATETIME]);
  25. conn = connect_mysql('raw_db');
  26. odbc::append(conn, tb, table_name , isCreateTable, false);
  27. conn.close()
  28. }
  29. /*
  30. * 存私募基金净值到本地dolphindb
  31. *
  32. * save_hedge_fund_nav_to_local(tb_nav)
  33. */
  34. def save_hedge_fund_nav_to_local(tb_nav) {
  35. save_table(tb_nav, "mfdb.nav", false)
  36. }
  37. /*
  38. * 将数据存回MySQL并同步至正式表
  39. *
  40. *
  41. */
  42. def save_and_sync(table, source_table_name, target_table_name) {
  43. save_table(table, source_table_name, true);
  44. s_query = "CALL raw_db.sp_sync_table_from_dolphin('" + source_table_name + "_dolphin', '" + target_table_name + "');"
  45. conn = connect_mysql('raw_db');
  46. odbc::execute(conn, s_query);
  47. conn.close();
  48. }
  49. /*
  50. * 建表 XXXX_nav
  51. */
  52. def create_entity_nav(is_id_integer=false) {
  53. return table(1000:0,
  54. ['entity_id', 'price_date', 'cumulative_nav'],
  55. [iif(is_id_integer, INT, SYMBOL), DATE, DOUBLE]);
  56. }
  57. /*
  58. * 建表 XXXX_performance
  59. */
  60. def create_entity_performance(is_id_integer=false) {
  61. return table(1000:0,
  62. ['entity_id', 'end_date', 'price_date', 'cumulative_nav',
  63. 'ret_1m', 'ret_1m_a', 'ret_3m', 'ret_3m_a', 'ret_6m', 'ret_6m_a',
  64. 'ret_1y', 'ret_1y_a', 'ret_2y', 'ret_2y_a', 'ret_3y', 'ret_3y_a', 'ret_4y', 'ret_4y_a',
  65. 'ret_5y', 'ret_5y_a', 'ret_10y', 'ret_10y_a', 'ret_ytd', 'ret_ytd_a', 'ret_incep', 'ret_incep_a'],
  66. [iif(is_id_integer, INT, SYMBOL), MONTH, DATE, DOUBLE,
  67. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  68. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  69. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE]);
  70. }
  71. /*
  72. * 建表 XXX_indicator
  73. */
  74. def create_entity_indicator(is_id_integer=false) {
  75. return table(1000:0,
  76. ['entity_id', 'end_date',
  77. 'info_ratio_6m', 'm2_6m', 'tracking_error_6m',
  78. 'info_ratio_1y', 'm2_1y', 'tracking_error_1y',
  79. 'info_ratio_2y', 'm2_2y', 'tracking_error_2y', 'var_2y', 'cvar_2y',
  80. 'info_ratio_3y', 'm2_3y', 'tracking_error_3y', 'var_3y', 'cvar_3y',
  81. 'info_ratio_4y', 'm2_4y', 'tracking_error_4y', 'var_4y', 'cvar_4y',
  82. 'info_ratio_5y', 'm2_5y', 'tracking_error_5y', 'var_5y', 'cvar_5y',
  83. 'info_ratio_10y', 'm2_10y', 'tracking_error_10y', 'var_10y', 'cvar_10y',
  84. 'info_ratio_ytd', 'm2_ytd', 'tracking_error_ytd',
  85. 'info_ratio_incep', 'm2_incep','tracking_error_incep', 'var_incep', 'cvar_incep'],
  86. [iif(is_id_integer, INT, SYMBOL), MONTH,
  87. DOUBLE, DOUBLE, DOUBLE,
  88. DOUBLE, DOUBLE, DOUBLE,
  89. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  90. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  91. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  92. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  93. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  94. DOUBLE, DOUBLE, DOUBLE,
  95. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE]);
  96. }
  97. /*
  98. * 建表 XXX_risk_stats
  99. *
  100. * NOTE: mfdb.fund_risk_stats 中 maxdrawdown_6m 和 maxdrawdown_ytd 因不明原因分别是 6m_maxdrawdown 和 ytd_maxdrawdown 的虚拟列!
  101. */
  102. def create_entity_risk_stats(is_id_integer=false) {
  103. return table(1000:0,
  104. ['entity_id', 'end_date',
  105. 'stddev_6m', 'downsidedev_6m', 'alpha_6m', 'winrate_6m', 'beta_6m', 'skewness_6m', 'kurtosis_6m', 'worstmonth_6m', 'maxdrawdown_6m',
  106. 'stddev_1y', 'downsidedev_1y', 'alpha_1y', 'winrate_1y', 'beta_1y', 'skewness_1y', 'kurtosis_1y', 'worstmonth_1y', 'maxdrawdown_1y',
  107. 'stddev_2y', 'downsidedev_2y', 'alpha_2y', 'winrate_2y', 'beta_2y', 'skewness_2y', 'kurtosis_2y', 'worstmonth_2y', 'maxdrawdown_2y',
  108. 'stddev_3y', 'downsidedev_3y', 'alpha_3y', 'winrate_3y', 'beta_3y', 'skewness_3y', 'kurtosis_3y', 'worstmonth_3y', 'maxdrawdown_3y',
  109. 'stddev_4y', 'downsidedev_4y', 'alpha_4y', 'winrate_4y', 'beta_4y', 'skewness_4y', 'kurtosis_4y', 'worstmonth_4y', 'maxdrawdown_4y',
  110. 'stddev_5y', 'downsidedev_5y', 'alpha_5y', 'winrate_5y', 'beta_5y', 'skewness_5y', 'kurtosis_5y', 'worstmonth_5y', 'maxdrawdown_5y',
  111. 'stddev_10y', 'downsidedev_10y','alpha_10y', 'winrate_10y', 'beta_10y', 'skewness_10y', 'kurtosis_10y', 'worstmonth_10y', 'maxdrawdown_10y',
  112. 'stddev_ytd', 'downsidedev_ytd', 'alpha_ytd', 'winrate_ytd', 'beta_ytd', 'skewness_ytd', 'kurtosis_ytd', 'worstmonth_ytd', 'maxdrawdown_ytd',
  113. 'stddev_incep', 'downsidedev_incep', 'alpha_incep', 'winrate_incep', 'beta_incep', 'skewness_incep', 'kurtosis_incep', 'worstmonth_incep', 'maxdrawdown_incep'],
  114. [iif(is_id_integer, INT, SYMBOL), MONTH,
  115. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  116. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  117. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  118. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  119. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  120. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  121. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  122. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  123. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE]);
  124. }
  125. /*
  126. * 建表 XXX_riskadjret_stats
  127. */
  128. def create_entity_riskadjret_stats(is_id_integer=false) {
  129. return table(1000:0,
  130. ['entity_id', 'end_date',
  131. 'sharperatio_6m', 'sortinoratio_6m', 'treynorratio_6m', 'jensen_6m', 'calmarratio_6m', 'omegaratio_6m', 'kapparatio_6m',
  132. 'sharperatio_1y', 'sortinoratio_1y', 'treynorratio_1y', 'jensen_1y', 'calmarratio_1y', 'omegaratio_1y', 'kapparatio_1y',
  133. 'sharperatio_2y', 'sortinoratio_2y', 'treynorratio_2y', 'jensen_2y', 'calmarratio_2y', 'omegaratio_2y', 'kapparatio_2y',
  134. 'sharperatio_3y', 'sortinoratio_3y', 'treynorratio_3y', 'jensen_3y', 'calmarratio_3y', 'omegaratio_3y', 'kapparatio_3y',
  135. 'sharperatio_4y', 'sortinoratio_4y', 'treynorratio_4y', 'jensen_4y', 'calmarratio_4y', 'omegaratio_4y', 'kapparatio_4y',
  136. 'sharperatio_5y', 'sortinoratio_5y', 'treynorratio_5y', 'jensen_5y', 'calmarratio_5y', 'omegaratio_5y', 'kapparatio_5y',
  137. 'sharperatio_10y', 'sortinoratio_10y', 'treynorratio_10y', 'jensen_10y', 'calmarratio_10y', 'omegaratio_10y', 'kapparatio_10y',
  138. 'sharperatio_ytd', 'sortinoratio_ytd', 'treynorratio_ytd', 'jensen_ytd', 'calmarratio_ytd', 'omegaratio_ytd', 'kapparatio_ytd',
  139. 'sharperatio_incep', 'sortinoratio_incep', 'treynorratio_incep', 'jensen_incep', 'calmarratio_incep', 'omegaratio_incep', 'kapparatio_incep'],
  140. [iif(is_id_integer, INT, SYMBOL), MONTH,
  141. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  142. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  143. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  144. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  145. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  146. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  147. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  148. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  149. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE]);
  150. }
  151. /*
  152. * 建表 XXX_style_stats
  153. */
  154. def create_entity_style_stats(is_id_integer=false) {
  155. return table(1000:0,
  156. ['entity_id', 'end_date',
  157. 'upsidecapture_ret_6m', 'downsidecapture_ret_6m', 'upsidecapture_ratio_6m', 'downsidecapture_ratio_6m',
  158. 'upsidecapture_ret_1y', 'downsidecapture_ret_1y', 'upsidecapture_ratio_1y', 'downsidecapture_ratio_1y',
  159. 'upsidecapture_ret_2y', 'downsidecapture_ret_2y', 'upsidecapture_ratio_2y', 'downsidecapture_ratio_2y',
  160. 'upsidecapture_ret_3y', 'downsidecapture_ret_3y', 'upsidecapture_ratio_3y', 'downsidecapture_ratio_3y',
  161. 'upsidecapture_ret_4y', 'downsidecapture_ret_4y', 'upsidecapture_ratio_4y', 'downsidecapture_ratio_4y',
  162. 'upsidecapture_ret_5y', 'downsidecapture_ret_5y', 'upsidecapture_ratio_5y', 'downsidecapture_ratio_5y',
  163. 'upsidecapture_ret_10y', 'downsidecapture_ret_10y', 'upsidecapture_ratio_10y', 'downsidecapture_ratio_10y',
  164. 'upsidecapture_ret_ytd', 'downsidecapture_ret_ytd', 'upsidecapture_ratio_ytd', 'downsidecapture_ratio_ytd',
  165. 'upsidecapture_ret_incep', 'downsidecapture_ret_incep', 'upsidecapture_ratio_incep', 'downsidecapture_ratio_incep'],
  166. [iif(is_id_integer, INT, SYMBOL), MONTH,
  167. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  168. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  169. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  170. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  171. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  172. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  173. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  174. DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  175. DOUBLE, DOUBLE, DOUBLE, DOUBLE]);
  176. }
  177. /*
  178. * 建表 xxx_performance_weekly
  179. */
  180. def create_entity_performance_weekly(is_id_integer=false) {
  181. return table(1000:0,
  182. ['entity_id', 'year_week', 'end_year', 'week_of_year', 'price_date', 'cumulative_nav', 'ret_1w'],
  183. [iif(is_id_integer, INT, SYMBOL), STRING, STRING, SHORT, DATE, DOUBLE, DOUBLE]);
  184. }
  185. /*
  186. * 建表 xxx_latest_performance
  187. */
  188. def create_entity_latest_performance(is_id_integer=false) {
  189. return table(1000:0,
  190. ['entity_id', 'end_date', 'price_date', 'pre_price_date', 'nav', 'cumulative_nav',
  191. 'net_value_change', 'ret_1d', 'ret_1w', 'ret_1m', 'ret_3m', 'ret_6m',
  192. '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',
  193. 'maxdrawdown_1m', 'maxdrawdown_3m', 'maxdrawdown_1y', 'maxdrawdown_incep', 'calmarratio_incep',
  194. 'ret_1y_a', 'ret_2y_a', 'ret_3y_a', 'ret_4y_a', 'ret_5y_a', 'ret_10y_a'],
  195. [iif(is_id_integer, INT, SYMBOL), STRING, DATE, DATE, DOUBLE, DOUBLE,
  196. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  197. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  198. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE,
  199. DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE]);
  200. }
  201. /*
  202. * 建表 xxx_index_coe
  203. *
  204. */
  205. def create_entity_index_coe(is_id_integer=false) {
  206. return table(1000:0,
  207. ['entity_id', 'end_date', 'coe_1y', 'coe_3y', 'coe_5y'],
  208. [iif(is_id_integer, INT, SYMBOL), STRING, DOUBLE, DOUBLE, DOUBLE]);
  209. }
  210. /*
  211. * 根据 mysql 表改动某些字段
  212. */
  213. def chg_columns_for_mysql(mutable tb_mysql, id_col_name) {
  214. tb_mysql.rename!('entity_id', id_col_name);
  215. // 将 dolphinDB 的 MONTH 换成 MySQL 的 YYYY-MM 格式
  216. v_end_date = EXEC end_date.temporalFormat('yyyy-MM') FROM tb_mysql;
  217. tb_mysql.replaceColumn!('end_date', v_end_date);
  218. }
  219. /*
  220. * 按照 XXX_performance 表结构准备数据记录
  221. *
  222. *
  223. */
  224. def generate_entity_performance(entity_info, indicators, isToMySQL, mutable entity_performance) {
  225. t = null;
  226. if(isToMySQL) {
  227. if(indicators['PBI-3M'].isVoid() || indicators['PBI-3M'].size() == 0) return;
  228. t = SELECT entity_id AS entity_id, end_date, price_date, nav AS cumulative_nav, ret AS ret_1m, ret AS ret_1m_a, trailing_ret AS ret_3m, trailing_ret_a AS ret_3m_a
  229. FROM indicators['PBI-3M'] AS ind
  230. INNER JOIN entity_info fi ON ind.entity_id = fi.entity_id
  231. WHERE ind.end_date >= fi.price_date.month(); // 过滤掉不必更新的旧记录
  232. UPDATE t
  233. SET ret_6m = trailing_ret, ret_6m_a = trailing_ret_a
  234. FROM ej(t, indicators['PBI-6M'], ['entity_id', 'end_date']);
  235. UPDATE t
  236. SET ret_1y = trailing_ret, ret_1y_a = trailing_ret_a
  237. FROM ej(t, indicators['PBI-1Y'], ['entity_id', 'end_date']);
  238. UPDATE t
  239. SET ret_2y = trailing_ret, ret_2y_a = trailing_ret_a
  240. FROM ej(t, indicators['PBI-2Y'], ['entity_id', 'end_date']);
  241. UPDATE t
  242. SET ret_3y = trailing_ret, ret_3y_a = trailing_ret_a
  243. FROM ej(t, indicators['PBI-3Y'], ['entity_id', 'end_date']);
  244. UPDATE t
  245. SET ret_4y = trailing_ret, ret_4y_a = trailing_ret_a
  246. FROM ej(t, indicators['PBI-4Y'], ['entity_id', 'end_date']);
  247. UPDATE t
  248. SET ret_5y = trailing_ret, ret_5y_a = trailing_ret_a
  249. FROM ej(t, indicators['PBI-5Y'], ['entity_id', 'end_date']);
  250. UPDATE t
  251. SET ret_10y = trailing_ret, ret_10y_a = trailing_ret_a
  252. FROM ej(t, indicators['PBI-10Y'], ['entity_id', 'end_date']);
  253. UPDATE t
  254. SET ret_ytd = trailing_ret, ret_ytd_a = trailing_ret_a
  255. FROM ej(t, indicators['PBI-YTD'], ['entity_id', 'end_date']);
  256. // 取消了 ret_incep_a_all (没意义) 和 ret_incep_a_gips (ret_incep_a 与之相等)
  257. UPDATE t
  258. SET ret_incep = trailing_ret, ret_incep_a = trailing_ret_a
  259. FROM ej(t, indicators['PBI-INCEP'], ['entity_id', 'end_date']);
  260. INSERT INTO entity_performance SELECT * FROM t;
  261. } else {
  262. }
  263. }
  264. /*
  265. * 按照 XXX_risk_stats 表结构准备数据记录
  266. *
  267. *
  268. */
  269. def generate_entity_risk_stats(entity_info, indicators, isToMySQL, mutable entity_risk_stats) {
  270. t = null;
  271. if(indicators['PBI-6M'].isVoid() || indicators['PBI-6M'].size() == 0) return;
  272. if(isToMySQL) {
  273. t = SELECT entity_id, end_date, std_dev_a AS stddev_6m, ds_dev_a AS downsidedev_6m, alpha_a AS alpha_6m, winrate AS winrate_6m, beta AS beta_6m,
  274. skewness AS skewness_6m, kurtosis AS kurtosis_6m, wrst_month AS worstmonth_6m, drawdown AS maxdrawdown_6m // mfdb中的真实字段名是 6m_maxdrawdown
  275. FROM indicators['PBI-6M'] AS ind
  276. INNER JOIN entity_info fi ON ind.entity_id = fi.entity_id
  277. WHERE ind.end_date >= fi.price_date.month(); // 过滤掉不必更新的旧记录
  278. UPDATE t
  279. SET stddev_1y = std_dev_a, downsidedev_1y = ds_dev_a, alpha_1y = alpha_a, winrate_1y = winrate, beta_1y = beta,
  280. skewness_1y = skewness, kurtosis_1y = kurtosis, worstmonth_1y = wrst_month, maxdrawdown_1y = drawdown
  281. FROM ej(t, indicators['PBI-1Y'], ['entity_id', 'end_date']);
  282. UPDATE t
  283. SET stddev_2y = std_dev_a, downsidedev_2y = ds_dev_a, alpha_2y = alpha_a, winrate_2y = winrate, beta_2y = beta,
  284. skewness_2y = skewness, kurtosis_2y = kurtosis, worstmonth_2y = wrst_month, maxdrawdown_2y = drawdown
  285. FROM ej(t, indicators['PBI-2Y'], ['entity_id', 'end_date']);
  286. UPDATE t
  287. SET stddev_3y = std_dev_a, downsidedev_3y = ds_dev_a, alpha_3y = alpha_a, winrate_3y = winrate, beta_3y = beta,
  288. skewness_3y = skewness, kurtosis_3y = kurtosis, worstmonth_3y = wrst_month, maxdrawdown_3y = drawdown
  289. FROM ej(t, indicators['PBI-3Y'], ['entity_id', 'end_date']);
  290. UPDATE t
  291. SET stddev_4y = std_dev_a, downsidedev_4y = ds_dev_a, alpha_4y = alpha_a, winrate_4y = winrate, beta_4y = beta,
  292. skewness_4y = skewness, kurtosis_4y = kurtosis, worstmonth_4y = wrst_month, maxdrawdown_4y = drawdown
  293. FROM ej(t, indicators['PBI-4Y'], ['entity_id', 'end_date']);
  294. UPDATE t
  295. SET stddev_5y = std_dev_a, downsidedev_5y = ds_dev_a, alpha_5y = alpha_a, winrate_5y = winrate, beta_5y = beta,
  296. skewness_5y = skewness, kurtosis_5y = kurtosis, worstmonth_5y = wrst_month, maxdrawdown_5y = drawdown
  297. FROM ej(t, indicators['PBI-5Y'], ['entity_id', 'end_date']);
  298. UPDATE t
  299. SET stddev_10y = std_dev_a, downsidedev_10y = ds_dev_a, alpha_10y = alpha_a, winrate_10y = winrate, beta_10y = beta,
  300. skewness_10y = skewness, kurtosis_10y = kurtosis, worstmonth_10y = wrst_month, maxdrawdown_10y = drawdown
  301. FROM ej(t, indicators['PBI-10Y'], ['entity_id', 'end_date']);
  302. UPDATE t
  303. SET stddev_ytd = std_dev_a, downsidedev_ytd = ds_dev_a, alpha_ytd = alpha_a, winrate_ytd = winrate, beta_ytd = beta,
  304. skewness_ytd = skewness, kurtosis_ytd = kurtosis, worstmonth_ytd = wrst_month, maxdrawdown_ytd = drawdown // mfdb中的真实字段名是 ytd_maxdrawdown
  305. FROM ej(t, indicators['PBI-YTD'], ['entity_id', 'end_date']);
  306. UPDATE t
  307. SET stddev_incep = std_dev_a, downsidedev_incep = ds_dev_a, alpha_incep = alpha_a, winrate_incep = winrate, beta_incep = beta,
  308. skewness_incep = skewness, kurtosis_incep = kurtosis, worstmonth_incep = wrst_month, maxdrawdown_incep = drawdown
  309. FROM ej(t, indicators['PBI-INCEP'], ['entity_id', 'end_date']);
  310. INSERT INTO entity_risk_stats SELECT * FROM t;
  311. } else {
  312. }
  313. }
  314. /*
  315. * 按照 XXX_riskadjret_stats 表结构准备数据记录
  316. *
  317. *
  318. */
  319. def generate_entity_riskadjret_stats(entity_info, indicators, isToMySQL, mutable entity_riskadjret_stats) {
  320. t = null;
  321. if(indicators['PBI-6M'].isVoid() || indicators['PBI-6M'].size() == 0) return;
  322. if(isToMySQL) {
  323. t = SELECT entity_id, end_date,
  324. sharpe_a AS sharperatio_6m, sortino_a AS sortinoratio_6m, treynor AS treynorratio_6m, jensen_a AS jensen_6m,
  325. calmar AS calmarratio_6m, omega AS omegaratio_6m, kappa AS kapparatio_6m
  326. FROM indicators['PBI-6M'] AS ind
  327. INNER JOIN entity_info fi ON ind.entity_id = fi.entity_id
  328. WHERE ind.end_date >= fi.price_date.month(); // 过滤掉不必更新的旧记录
  329. UPDATE t
  330. SET sharperatio_1y = sharpe_a, sortinoratio_1y = sortino_a, treynorratio_1y = treynor, jensen_1y = jensen_a,
  331. calmarratio_1y = calmar, omegaratio_1y = omega, kapparatio_1y = kappa
  332. FROM ej(t, indicators['PBI-1Y'], ['entity_id', 'end_date']);
  333. UPDATE t
  334. SET sharperatio_2y = sharpe_a, sortinoratio_2y = sortino_a, treynorratio_2y = treynor, jensen_2y = jensen_a,
  335. calmarratio_2y = calmar, omegaratio_2y = omega, kapparatio_2y = kappa
  336. FROM ej(t, indicators['PBI-2Y'], ['entity_id', 'end_date']);
  337. UPDATE t
  338. SET sharperatio_3y = sharpe_a, sortinoratio_3y = sortino_a, treynorratio_3y = treynor, jensen_3y = jensen_a,
  339. calmarratio_3y = calmar, omegaratio_3y = omega, kapparatio_3y = kappa
  340. FROM ej(t, indicators['PBI-3Y'], ['entity_id', 'end_date']);
  341. UPDATE t
  342. SET sharperatio_4y = sharpe_a, sortinoratio_4y = sortino_a, treynorratio_4y = treynor, jensen_4y = jensen_a,
  343. calmarratio_4y = calmar, omegaratio_4y = omega, kapparatio_4y = kappa
  344. FROM ej(t, indicators['PBI-4Y'], ['entity_id', 'end_date']);
  345. UPDATE t
  346. SET sharperatio_5y = sharpe_a, sortinoratio_5y = sortino_a, treynorratio_5y = treynor, jensen_5y = jensen_a,
  347. calmarratio_5y = calmar, omegaratio_5y = omega, kapparatio_5y = kappa
  348. FROM ej(t, indicators['PBI-5Y'], ['entity_id', 'end_date']);
  349. UPDATE t
  350. SET sharperatio_10y = sharpe_a, sortinoratio_10y = sortino_a, treynorratio_10y = treynor, jensen_10y = jensen_a,
  351. calmarratio_10y = calmar, omegaratio_10y = omega, kapparatio_10y = kappa
  352. FROM ej(t, indicators['PBI-10Y'], ['entity_id', 'end_date']);
  353. UPDATE t
  354. SET sharperatio_ytd = sharpe_a, sortinoratio_ytd = sortino_a, treynorratio_ytd = treynor, jensen_ytd = jensen_a,
  355. calmarratio_ytd = calmar, omegaratio_ytd = omega, kapparatio_ytd = kappa
  356. FROM ej(t, indicators['PBI-YTD'], ['entity_id', 'end_date']);
  357. UPDATE t
  358. SET sharperatio_incep = sharpe_a, sortinoratio_incep = sortino_a, treynorratio_incep = treynor, jensen_incep = jensen_a,
  359. calmarratio_incep = calmar, omegaratio_incep = omega, kapparatio_incep = kappa
  360. FROM ej(t, indicators['PBI-INCEP'], ['entity_id', 'end_date']);
  361. INSERT INTO entity_riskadjret_stats SELECT * FROM t;
  362. } else {
  363. }
  364. }
  365. /*
  366. * 按照 XXX_indicator 表结构准备数据记录
  367. *
  368. *
  369. */
  370. def generate_entity_indicator(entity_info, indicators, isToMySQL, mutable entity_indicator) {
  371. t = null;
  372. if(indicators['PBI-6M'].isVoid() || indicators['PBI-6M'].size() == 0) return;
  373. if(isToMySQL) {
  374. t = SELECT entity_id, end_date, info_a AS info_ratio_6m, m2_a AS m2_6m, track_error_a AS tracking_error_6m
  375. FROM indicators['PBI-6M'] AS ind
  376. INNER JOIN entity_info fi ON ind.entity_id = fi.entity_id
  377. WHERE ind.end_date >= fi.price_date.month(); // 过滤掉不必更新的旧记录
  378. UPDATE t
  379. SET info_ratio_1y = info_a, m2_1y = m2_a, tracking_error_1y = track_error_a
  380. FROM ej(t, indicators['PBI-1Y'], ['entity_id', 'end_date']);
  381. UPDATE t
  382. SET info_ratio_2y = info_a, m2_2y = m2_a, tracking_error_2y = track_error_a, var_2y = var, cvar_2y = cvar
  383. FROM ej(t, indicators['PBI-2Y'], ['entity_id', 'end_date']);
  384. UPDATE t
  385. SET info_ratio_3y = info_a, m2_3y = m2_a, tracking_error_3y = track_error_a, var_3y = var, cvar_3y = cvar
  386. FROM ej(t, indicators['PBI-3Y'], ['entity_id', 'end_date']);
  387. UPDATE t
  388. SET info_ratio_4y = info_a, m2_4y = m2_a, tracking_error_4y = track_error_a, var_4y = var, cvar_4y = cvar
  389. FROM ej(t, indicators['PBI-4Y'], ['entity_id', 'end_date']);
  390. UPDATE t
  391. SET info_ratio_5y = info_a, m2_5y = m2_a, tracking_error_5y = track_error_a, var_5y = var, cvar_5y = cvar
  392. FROM ej(t, indicators['PBI-5Y'], ['entity_id', 'end_date']);
  393. UPDATE t
  394. SET info_ratio_10y = info_a, m2_10y = m2_a, tracking_error_10y = track_error_a, var_10y = var, cvar_10y = cvar
  395. FROM ej(t, indicators['PBI-10Y'], ['entity_id', 'end_date']);
  396. UPDATE t
  397. SET info_ratio_ytd = info_a, m2_ytd = m2_a, tracking_error_ytd = track_error_a
  398. FROM ej(t, indicators['PBI-YTD'], ['entity_id', 'end_date']);
  399. UPDATE t
  400. SET info_ratio_incep = info_a, m2_incep = m2_a, tracking_error_incep = track_error_a, var_incep = var, cvar_incep = cvar
  401. FROM ej(t, indicators['PBI-INCEP'], ['entity_id', 'end_date']);
  402. INSERT INTO entity_indicator SELECT * FROM t;
  403. } else {
  404. }
  405. }
  406. /*
  407. * 按照 XXX_style_stats 表结构准备数据记录
  408. *
  409. *
  410. */
  411. def generate_entity_style_stats(entity_info, indicators, isToMySQL, mutable entity_style_stats) {
  412. t = null;
  413. if(indicators['PBI-6M'].isVoid() || indicators['PBI-6M'].size() == 0) return;
  414. if(isToMySQL) {
  415. t = SELECT entity_id, end_date, upside_capture_ret AS upsidecapture_ret_6m, downside_capture_ret AS downsidecapture_ret_6m,
  416. upside_capture_ratio AS upsidecapture_ratio_6m, downside_capture_ratio AS downsidecapture_ratio_6m
  417. FROM indicators['PBI-6M'] AS ind
  418. INNER JOIN entity_info fi ON ind.entity_id = fi.entity_id
  419. WHERE ind.end_date >= fi.price_date.month(); // 过滤掉不必更新的旧记录
  420. UPDATE t
  421. SET upsidecapture_ret_1y = upside_capture_ret, downsidecapture_ret_1y = downside_capture_ret,
  422. upsidecapture_ratio_1y = upside_capture_ratio, downsidecapture_ratio_1y = downside_capture_ratio
  423. FROM ej(t, indicators['PBI-1Y'], ['entity_id', 'end_date']);
  424. UPDATE t
  425. SET upsidecapture_ret_2y = upside_capture_ret, downsidecapture_ret_2y = downside_capture_ret,
  426. upsidecapture_ratio_2y = upside_capture_ratio, downsidecapture_ratio_2y = downside_capture_ratio
  427. FROM ej(t, indicators['PBI-2Y'], ['entity_id', 'end_date']);
  428. UPDATE t
  429. SET upsidecapture_ret_3y = upside_capture_ret, downsidecapture_ret_3y = downside_capture_ret,
  430. upsidecapture_ratio_3y = upside_capture_ratio, downsidecapture_ratio_3y = downside_capture_ratio
  431. FROM ej(t, indicators['PBI-3Y'], ['entity_id', 'end_date']);
  432. UPDATE t
  433. SET upsidecapture_ret_4y = upside_capture_ret, downsidecapture_ret_4y = downside_capture_ret,
  434. upsidecapture_ratio_4y = upside_capture_ratio, downsidecapture_ratio_4y = downside_capture_ratio
  435. FROM ej(t, indicators['PBI-4Y'], ['entity_id', 'end_date']);
  436. UPDATE t
  437. SET upsidecapture_ret_5y = upside_capture_ret, downsidecapture_ret_5y = downside_capture_ret,
  438. upsidecapture_ratio_5y = upside_capture_ratio, downsidecapture_ratio_5y = downside_capture_ratio
  439. FROM ej(t, indicators['PBI-5Y'], ['entity_id', 'end_date']);
  440. UPDATE t
  441. SET upsidecapture_ret_10y = upside_capture_ret, downsidecapture_ret_10y = downside_capture_ret,
  442. upsidecapture_ratio_10y = upside_capture_ratio, downsidecapture_ratio_10y = downside_capture_ratio
  443. FROM ej(t, indicators['PBI-10Y'], ['entity_id', 'end_date']);
  444. UPDATE t
  445. SET upsidecapture_ret_ytd = upside_capture_ret, downsidecapture_ret_ytd = downside_capture_ret,
  446. upsidecapture_ratio_ytd = upside_capture_ratio, downsidecapture_ratio_ytd = downside_capture_ratio
  447. FROM ej(t, indicators['PBI-YTD'], ['entity_id', 'end_date']);
  448. UPDATE t
  449. SET upsidecapture_ret_incep = upside_capture_ret, downsidecapture_ret_incep = downside_capture_ret,
  450. upsidecapture_ratio_incep = upside_capture_ratio, downsidecapture_ratio_incep = downside_capture_ratio
  451. FROM ej(t, indicators['PBI-INCEP'], ['entity_id', 'end_date']);
  452. INSERT INTO entity_style_stats SELECT * FROM t;
  453. } else {
  454. }
  455. }
  456. /*
  457. * 按照 XXX_performance_weekly 表结构准备数据记录
  458. *
  459. *
  460. */
  461. def generate_entity_performance_weekly(entity_info, ret_w, isToMySQL, mutable entity_performance_weekly) {
  462. t = null;
  463. if(ret_w.isVoid() || ret_w.size() == 0) return;
  464. if(isToMySQL) {
  465. 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,
  466. cumulative_nav, ret_1w
  467. FROM ret_w r
  468. INNER JOIN entity_info fi ON r.entity_id = fi.entity_id
  469. WHERE r.price_date >= fi.price_date; // 过滤掉不必更新的旧记录
  470. INSERT INTO entity_performance_weekly SELECT * FROM t;
  471. } else {
  472. }
  473. }
  474. /*
  475. * 按照 XXX_latest_performance 表结构准备数据记录
  476. *
  477. *
  478. */
  479. def generate_entity_latest_performance(entity_info, perf_latest, isToMySQL, mutable entity_latest_performance) {
  480. t = null;
  481. if(perf_latest.isVoid() || perf_latest.size() == 0) return;
  482. if(isToMySQL) {
  483. t = SELECT r.*
  484. FROM perf_latest r
  485. INNER JOIN entity_info fi ON r.entity_id = fi.entity_id
  486. WHERE r.price_date >= fi.price_date; // 过滤掉不必更新的旧记录
  487. INSERT INTO entity_latest_performance SELECT * FROM t;
  488. } else {
  489. }
  490. }