Commit 515ec9c6 authored by Dr.李's avatar Dr.李

update all the example

parent 33e49554
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 9,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 10,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -61,7 +61,7 @@ ...@@ -61,7 +61,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 11,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -96,7 +96,7 @@ ...@@ -96,7 +96,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 22,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -122,7 +122,7 @@ ...@@ -122,7 +122,7 @@
" industry_groups = industry_total.groupby('trade_date')\n", " industry_groups = industry_total.groupby('trade_date')\n",
" \n", " \n",
" alpha_name = [str(factor_name) + '_' + ('pos' if positive else 'neg')]\n", " alpha_name = [str(factor_name) + '_' + ('pos' if positive else 'neg')]\n",
" simple_expression = CSRes(LAST(factor_name), 'roe_q') if positive else -CSRes(LAST(factor_name), 'roe_q')\n", " simple_expression = CSRes(LAST(factor_name), 'ETOP') if positive else -CSRes(LAST(factor_name), 'ETOP')\n",
"\n", "\n",
" const_features = {alpha_name[0]: simple_expression}\n", " const_features = {alpha_name[0]: simple_expression}\n",
" const_weights = {alpha_name[0]: 1.}\n", " const_weights = {alpha_name[0]: 1.}\n",
...@@ -230,7 +230,7 @@ ...@@ -230,7 +230,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 23,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -239,9 +239,495 @@ ...@@ -239,9 +239,495 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 24,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 00:15:34,154 - ALPHA_MIND - INFO - 2017-01-03 00:00:00: 800\n",
"2019-02-10 00:15:34,160 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,162 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,196 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 is finished\n",
"2019-02-10 00:15:34,206 - ALPHA_MIND - INFO - 2017-01-17 00:00:00: 800\n",
"2019-02-10 00:15:34,213 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,217 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,249 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 is finished\n",
"2019-02-10 00:15:34,258 - ALPHA_MIND - INFO - 2017-02-07 00:00:00: 800\n",
"2019-02-10 00:15:34,266 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,269 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,302 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 is finished\n",
"2019-02-10 00:15:34,310 - ALPHA_MIND - INFO - 2017-02-21 00:00:00: 799\n",
"2019-02-10 00:15:34,320 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,323 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,353 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 is finished\n",
"2019-02-10 00:15:34,361 - ALPHA_MIND - INFO - 2017-03-07 00:00:00: 800\n",
"2019-02-10 00:15:34,368 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,370 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,401 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 is finished\n",
"2019-02-10 00:15:34,412 - ALPHA_MIND - INFO - 2017-03-21 00:00:00: 800\n",
"2019-02-10 00:15:34,422 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,425 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,463 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 is finished\n",
"2019-02-10 00:15:34,471 - ALPHA_MIND - INFO - 2017-04-06 00:00:00: 800\n",
"2019-02-10 00:15:34,476 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,480 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,511 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 is finished\n",
"2019-02-10 00:15:34,521 - ALPHA_MIND - INFO - 2017-04-20 00:00:00: 800\n",
"2019-02-10 00:15:34,527 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,531 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,559 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 is finished\n",
"2019-02-10 00:15:34,568 - ALPHA_MIND - INFO - 2017-05-05 00:00:00: 800\n",
"2019-02-10 00:15:34,574 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,576 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,608 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 is finished\n",
"2019-02-10 00:15:34,618 - ALPHA_MIND - INFO - 2017-05-19 00:00:00: 800\n",
"2019-02-10 00:15:34,624 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,627 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,659 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 is finished\n",
"2019-02-10 00:15:34,669 - ALPHA_MIND - INFO - 2017-06-06 00:00:00: 800\n",
"2019-02-10 00:15:34,676 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,678 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,707 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 is finished\n",
"2019-02-10 00:15:34,717 - ALPHA_MIND - INFO - 2017-06-20 00:00:00: 800\n",
"2019-02-10 00:15:34,723 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,725 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,755 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 is finished\n",
"2019-02-10 00:15:34,766 - ALPHA_MIND - INFO - 2017-07-04 00:00:00: 800\n",
"2019-02-10 00:15:34,773 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,775 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,806 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 is finished\n",
"2019-02-10 00:15:34,817 - ALPHA_MIND - INFO - 2017-07-18 00:00:00: 800\n",
"2019-02-10 00:15:34,824 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,828 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,859 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 is finished\n",
"2019-02-10 00:15:34,870 - ALPHA_MIND - INFO - 2017-08-01 00:00:00: 800\n",
"2019-02-10 00:15:34,878 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,881 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,912 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 is finished\n",
"2019-02-10 00:15:34,921 - ALPHA_MIND - INFO - 2017-08-15 00:00:00: 800\n",
"2019-02-10 00:15:34,928 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,931 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,959 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 is finished\n",
"2019-02-10 00:15:34,969 - ALPHA_MIND - INFO - 2017-08-29 00:00:00: 800\n",
"2019-02-10 00:15:34,975 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,978 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 full re-balance\n",
"2019-02-10 00:15:35,008 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 is finished\n",
"2019-02-10 00:15:35,018 - ALPHA_MIND - INFO - 2017-09-12 00:00:00: 800\n",
"2019-02-10 00:15:35,025 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:35,029 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 full re-balance\n",
"2019-02-10 00:15:35,058 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 is finished\n",
"2019-02-10 00:15:35,068 - ALPHA_MIND - INFO - 2017-09-26 00:00:00: 800\n",
"2019-02-10 00:15:35,075 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:35,079 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 full re-balance\n",
"2019-02-10 00:15:35,108 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 is finished\n",
"2019-02-10 00:15:35,118 - ALPHA_MIND - INFO - 2017-10-17 00:00:00: 800\n",
"2019-02-10 00:15:35,125 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:35,129 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 full re-balance\n",
"2019-02-10 00:15:35,158 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 is finished\n",
"2019-02-10 00:15:35,170 - ALPHA_MIND - INFO - 2017-10-31 00:00:00: 800\n",
"2019-02-10 00:15:35,177 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:35,180 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 full re-balance\n",
"2019-02-10 00:15:35,209 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 is finished\n",
"2019-02-10 00:15:35,218 - ALPHA_MIND - INFO - 2017-11-14 00:00:00: 800\n",
"2019-02-10 00:15:35,225 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:35,228 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 full re-balance\n",
"2019-02-10 00:15:35,257 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 is finished\n",
"2019-02-10 00:15:35,267 - ALPHA_MIND - INFO - 2017-11-28 00:00:00: 800\n",
"2019-02-10 00:15:35,274 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:35,277 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 full re-balance\n",
"2019-02-10 00:15:35,305 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 is finished\n",
"2019-02-10 00:15:35,315 - ALPHA_MIND - INFO - 2017-12-12 00:00:00: 800\n",
"2019-02-10 00:15:35,323 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:35,325 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 full re-balance\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 00:15:35,351 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 is finished\n",
"2019-02-10 00:15:35,360 - ALPHA_MIND - INFO - 2017-12-26 00:00:00: 800\n",
"2019-02-10 00:15:35,366 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:35,370 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 full re-balance\n",
"2019-02-10 00:15:35,401 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 is finished\n",
"2019-02-10 00:15:35,410 - ALPHA_MIND - INFO - 2018-01-10 00:00:00: 800\n",
"2019-02-10 00:15:35,419 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:35,421 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 full re-balance\n",
"2019-02-10 00:15:35,448 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 is finished\n",
"2019-02-10 00:15:35,457 - ALPHA_MIND - INFO - 2018-01-24 00:00:00: 800\n",
"2019-02-10 00:15:35,465 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:35,468 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 full re-balance\n",
"2019-02-10 00:15:35,497 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 is finished\n",
"2019-02-10 00:15:35,505 - ALPHA_MIND - INFO - 2018-02-07 00:00:00: 800\n",
"2019-02-10 00:15:35,510 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:35,513 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 full re-balance\n",
"2019-02-10 00:15:35,543 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 is finished\n",
"2019-02-10 00:15:50,965 - ALPHA_MIND - INFO - 2017-01-03 00:00:00: 800\n",
"2019-02-10 00:15:50,973 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:50,977 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,012 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 is finished\n",
"2019-02-10 00:15:51,021 - ALPHA_MIND - INFO - 2017-01-17 00:00:00: 800\n",
"2019-02-10 00:15:51,028 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,030 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,060 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 is finished\n",
"2019-02-10 00:15:51,069 - ALPHA_MIND - INFO - 2017-02-07 00:00:00: 800\n",
"2019-02-10 00:15:51,076 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,079 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,107 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 is finished\n",
"2019-02-10 00:15:51,115 - ALPHA_MIND - INFO - 2017-02-21 00:00:00: 799\n",
"2019-02-10 00:15:51,122 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,124 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,158 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 is finished\n",
"2019-02-10 00:15:51,167 - ALPHA_MIND - INFO - 2017-03-07 00:00:00: 800\n",
"2019-02-10 00:15:51,173 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,177 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,208 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 is finished\n",
"2019-02-10 00:15:51,217 - ALPHA_MIND - INFO - 2017-03-21 00:00:00: 800\n",
"2019-02-10 00:15:51,222 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,225 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,255 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 is finished\n",
"2019-02-10 00:15:51,264 - ALPHA_MIND - INFO - 2017-04-06 00:00:00: 800\n",
"2019-02-10 00:15:51,270 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,273 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,305 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 is finished\n",
"2019-02-10 00:15:51,314 - ALPHA_MIND - INFO - 2017-04-20 00:00:00: 800\n",
"2019-02-10 00:15:51,320 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,323 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,353 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 is finished\n",
"2019-02-10 00:15:51,360 - ALPHA_MIND - INFO - 2017-05-05 00:00:00: 800\n",
"2019-02-10 00:15:51,366 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,369 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,397 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 is finished\n",
"2019-02-10 00:15:51,406 - ALPHA_MIND - INFO - 2017-05-19 00:00:00: 800\n",
"2019-02-10 00:15:51,413 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,416 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,449 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 is finished\n",
"2019-02-10 00:15:51,459 - ALPHA_MIND - INFO - 2017-06-06 00:00:00: 800\n",
"2019-02-10 00:15:51,465 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,467 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,499 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 is finished\n",
"2019-02-10 00:15:51,508 - ALPHA_MIND - INFO - 2017-06-20 00:00:00: 800\n",
"2019-02-10 00:15:51,514 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,516 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,545 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 is finished\n",
"2019-02-10 00:15:51,554 - ALPHA_MIND - INFO - 2017-07-04 00:00:00: 800\n",
"2019-02-10 00:15:51,560 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,564 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,594 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 is finished\n",
"2019-02-10 00:15:51,603 - ALPHA_MIND - INFO - 2017-07-18 00:00:00: 800\n",
"2019-02-10 00:15:51,608 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,611 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,641 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 is finished\n",
"2019-02-10 00:15:51,649 - ALPHA_MIND - INFO - 2017-08-01 00:00:00: 800\n",
"2019-02-10 00:15:51,656 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,659 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,689 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 is finished\n",
"2019-02-10 00:15:51,699 - ALPHA_MIND - INFO - 2017-08-15 00:00:00: 800\n",
"2019-02-10 00:15:51,706 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,708 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,736 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 is finished\n",
"2019-02-10 00:15:51,745 - ALPHA_MIND - INFO - 2017-08-29 00:00:00: 800\n",
"2019-02-10 00:15:51,750 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,753 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,782 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 is finished\n",
"2019-02-10 00:15:51,792 - ALPHA_MIND - INFO - 2017-09-12 00:00:00: 800\n",
"2019-02-10 00:15:51,798 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,800 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,831 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 is finished\n",
"2019-02-10 00:15:51,841 - ALPHA_MIND - INFO - 2017-09-26 00:00:00: 800\n",
"2019-02-10 00:15:51,848 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,850 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,883 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 is finished\n",
"2019-02-10 00:15:51,893 - ALPHA_MIND - INFO - 2017-10-17 00:00:00: 800\n",
"2019-02-10 00:15:51,900 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,904 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 full re-balance\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 00:15:51,933 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 is finished\n",
"2019-02-10 00:15:51,944 - ALPHA_MIND - INFO - 2017-10-31 00:00:00: 800\n",
"2019-02-10 00:15:51,949 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,951 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,983 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 is finished\n",
"2019-02-10 00:15:51,993 - ALPHA_MIND - INFO - 2017-11-14 00:00:00: 800\n",
"2019-02-10 00:15:51,998 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:52,000 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 full re-balance\n",
"2019-02-10 00:15:52,028 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 is finished\n",
"2019-02-10 00:15:52,037 - ALPHA_MIND - INFO - 2017-11-28 00:00:00: 800\n",
"2019-02-10 00:15:52,044 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:52,046 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 full re-balance\n",
"2019-02-10 00:15:52,072 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 is finished\n",
"2019-02-10 00:15:52,082 - ALPHA_MIND - INFO - 2017-12-12 00:00:00: 799\n",
"2019-02-10 00:15:52,088 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:52,091 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 full re-balance\n",
"2019-02-10 00:15:52,118 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 is finished\n",
"2019-02-10 00:15:52,128 - ALPHA_MIND - INFO - 2017-12-26 00:00:00: 799\n",
"2019-02-10 00:15:52,134 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:52,138 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 full re-balance\n",
"2019-02-10 00:15:52,166 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 is finished\n",
"2019-02-10 00:15:52,175 - ALPHA_MIND - INFO - 2018-01-10 00:00:00: 799\n",
"2019-02-10 00:15:52,181 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:52,183 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 full re-balance\n",
"2019-02-10 00:15:52,213 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 is finished\n",
"2019-02-10 00:15:52,223 - ALPHA_MIND - INFO - 2018-01-24 00:00:00: 799\n",
"2019-02-10 00:15:52,229 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:52,231 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 full re-balance\n",
"2019-02-10 00:15:52,259 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 is finished\n",
"2019-02-10 00:15:52,268 - ALPHA_MIND - INFO - 2018-02-07 00:00:00: 799\n",
"2019-02-10 00:15:52,275 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:52,277 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 full re-balance\n",
"2019-02-10 00:15:52,305 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 is finished\n",
"2019-02-10 00:16:02,488 - ALPHA_MIND - INFO - 2017-01-03 00:00:00: 800\n",
"2019-02-10 00:16:02,494 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:02,497 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 full re-balance\n",
"2019-02-10 00:16:02,532 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 is finished\n",
"2019-02-10 00:16:02,540 - ALPHA_MIND - INFO - 2017-01-17 00:00:00: 800\n",
"2019-02-10 00:16:02,548 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:02,551 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 full re-balance\n",
"2019-02-10 00:16:02,588 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 is finished\n",
"2019-02-10 00:16:02,597 - ALPHA_MIND - INFO - 2017-02-07 00:00:00: 800\n",
"2019-02-10 00:16:02,603 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:02,606 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 full re-balance\n",
"2019-02-10 00:16:02,635 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 is finished\n",
"2019-02-10 00:16:02,644 - ALPHA_MIND - INFO - 2017-02-21 00:00:00: 799\n",
"2019-02-10 00:16:02,651 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:02,654 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 full re-balance\n",
"2019-02-10 00:16:02,685 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 is finished\n",
"2019-02-10 00:16:02,694 - ALPHA_MIND - INFO - 2017-03-07 00:00:00: 800\n",
"2019-02-10 00:16:02,701 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:02,704 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 full re-balance\n",
"2019-02-10 00:16:02,735 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 is finished\n",
"2019-02-10 00:16:02,744 - ALPHA_MIND - INFO - 2017-03-21 00:00:00: 800\n",
"2019-02-10 00:16:02,751 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:02,753 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 full re-balance\n",
"2019-02-10 00:16:02,783 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 is finished\n",
"2019-02-10 00:16:02,791 - ALPHA_MIND - INFO - 2017-04-06 00:00:00: 800\n",
"2019-02-10 00:16:02,799 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:02,801 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 full re-balance\n",
"2019-02-10 00:16:02,834 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 is finished\n",
"2019-02-10 00:16:02,842 - ALPHA_MIND - INFO - 2017-04-20 00:00:00: 800\n",
"2019-02-10 00:16:02,849 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:02,852 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 full re-balance\n",
"2019-02-10 00:16:02,883 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 is finished\n",
"2019-02-10 00:16:02,892 - ALPHA_MIND - INFO - 2017-05-05 00:00:00: 800\n",
"2019-02-10 00:16:02,899 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:02,902 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 full re-balance\n",
"2019-02-10 00:16:02,932 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 is finished\n",
"2019-02-10 00:16:02,940 - ALPHA_MIND - INFO - 2017-05-19 00:00:00: 800\n",
"2019-02-10 00:16:02,948 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:02,950 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 full re-balance\n",
"2019-02-10 00:16:02,981 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 is finished\n",
"2019-02-10 00:16:02,989 - ALPHA_MIND - INFO - 2017-06-06 00:00:00: 800\n",
"2019-02-10 00:16:02,996 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:02,999 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,028 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 is finished\n",
"2019-02-10 00:16:03,039 - ALPHA_MIND - INFO - 2017-06-20 00:00:00: 800\n",
"2019-02-10 00:16:03,048 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,051 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,086 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 is finished\n",
"2019-02-10 00:16:03,101 - ALPHA_MIND - INFO - 2017-07-04 00:00:00: 800\n",
"2019-02-10 00:16:03,108 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,110 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,153 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 is finished\n",
"2019-02-10 00:16:03,161 - ALPHA_MIND - INFO - 2017-07-18 00:00:00: 800\n",
"2019-02-10 00:16:03,169 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,171 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,206 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 is finished\n",
"2019-02-10 00:16:03,215 - ALPHA_MIND - INFO - 2017-08-01 00:00:00: 800\n",
"2019-02-10 00:16:03,221 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,224 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,252 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 is finished\n",
"2019-02-10 00:16:03,260 - ALPHA_MIND - INFO - 2017-08-15 00:00:00: 800\n",
"2019-02-10 00:16:03,267 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,270 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 full re-balance\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 00:16:03,296 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 is finished\n",
"2019-02-10 00:16:03,306 - ALPHA_MIND - INFO - 2017-08-29 00:00:00: 800\n",
"2019-02-10 00:16:03,311 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,315 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,343 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 is finished\n",
"2019-02-10 00:16:03,354 - ALPHA_MIND - INFO - 2017-09-12 00:00:00: 800\n",
"2019-02-10 00:16:03,359 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,363 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,395 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 is finished\n",
"2019-02-10 00:16:03,406 - ALPHA_MIND - INFO - 2017-09-26 00:00:00: 800\n",
"2019-02-10 00:16:03,412 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,416 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,443 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 is finished\n",
"2019-02-10 00:16:03,454 - ALPHA_MIND - INFO - 2017-10-17 00:00:00: 800\n",
"2019-02-10 00:16:03,459 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,462 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,491 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 is finished\n",
"2019-02-10 00:16:03,502 - ALPHA_MIND - INFO - 2017-10-31 00:00:00: 800\n",
"2019-02-10 00:16:03,508 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,510 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,541 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 is finished\n",
"2019-02-10 00:16:03,551 - ALPHA_MIND - INFO - 2017-11-14 00:00:00: 800\n",
"2019-02-10 00:16:03,557 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,559 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,586 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 is finished\n",
"2019-02-10 00:16:03,596 - ALPHA_MIND - INFO - 2017-11-28 00:00:00: 800\n",
"2019-02-10 00:16:03,603 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,605 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,632 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 is finished\n",
"2019-02-10 00:16:03,642 - ALPHA_MIND - INFO - 2017-12-12 00:00:00: 800\n",
"2019-02-10 00:16:03,650 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,653 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,681 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 is finished\n",
"2019-02-10 00:16:03,690 - ALPHA_MIND - INFO - 2017-12-26 00:00:00: 800\n",
"2019-02-10 00:16:03,696 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,698 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,726 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 is finished\n",
"2019-02-10 00:16:03,736 - ALPHA_MIND - INFO - 2018-01-10 00:00:00: 800\n",
"2019-02-10 00:16:03,742 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,745 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,774 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 is finished\n",
"2019-02-10 00:16:03,784 - ALPHA_MIND - INFO - 2018-01-24 00:00:00: 800\n",
"2019-02-10 00:16:03,790 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,792 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,821 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 is finished\n",
"2019-02-10 00:16:03,831 - ALPHA_MIND - INFO - 2018-02-07 00:00:00: 800\n",
"2019-02-10 00:16:03,837 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,839 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,869 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 is finished\n",
"2019-02-10 00:16:12,133 - ALPHA_MIND - INFO - 2017-01-03 00:00:00: 800\n",
"2019-02-10 00:16:12,139 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,141 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,171 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 is finished\n",
"2019-02-10 00:16:12,180 - ALPHA_MIND - INFO - 2017-01-17 00:00:00: 800\n",
"2019-02-10 00:16:12,186 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,188 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,220 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 is finished\n",
"2019-02-10 00:16:12,231 - ALPHA_MIND - INFO - 2017-02-07 00:00:00: 800\n",
"2019-02-10 00:16:12,237 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,240 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,269 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 is finished\n",
"2019-02-10 00:16:12,280 - ALPHA_MIND - INFO - 2017-02-21 00:00:00: 799\n",
"2019-02-10 00:16:12,287 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,289 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,324 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 is finished\n",
"2019-02-10 00:16:12,333 - ALPHA_MIND - INFO - 2017-03-07 00:00:00: 800\n",
"2019-02-10 00:16:12,341 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,344 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,374 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 is finished\n",
"2019-02-10 00:16:12,384 - ALPHA_MIND - INFO - 2017-03-21 00:00:00: 800\n",
"2019-02-10 00:16:12,391 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,394 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,423 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 is finished\n",
"2019-02-10 00:16:12,434 - ALPHA_MIND - INFO - 2017-04-06 00:00:00: 800\n",
"2019-02-10 00:16:12,441 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,444 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,472 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 is finished\n",
"2019-02-10 00:16:12,483 - ALPHA_MIND - INFO - 2017-04-20 00:00:00: 800\n",
"2019-02-10 00:16:12,488 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,492 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,522 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 is finished\n",
"2019-02-10 00:16:12,531 - ALPHA_MIND - INFO - 2017-05-05 00:00:00: 800\n",
"2019-02-10 00:16:12,538 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,541 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,569 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 is finished\n",
"2019-02-10 00:16:12,579 - ALPHA_MIND - INFO - 2017-05-19 00:00:00: 800\n",
"2019-02-10 00:16:12,586 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,588 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,615 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 is finished\n",
"2019-02-10 00:16:12,625 - ALPHA_MIND - INFO - 2017-06-06 00:00:00: 800\n",
"2019-02-10 00:16:12,631 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,634 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,663 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 is finished\n",
"2019-02-10 00:16:12,672 - ALPHA_MIND - INFO - 2017-06-20 00:00:00: 800\n",
"2019-02-10 00:16:12,680 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,682 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 full re-balance\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 00:16:12,713 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 is finished\n",
"2019-02-10 00:16:12,722 - ALPHA_MIND - INFO - 2017-07-04 00:00:00: 800\n",
"2019-02-10 00:16:12,728 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,731 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,761 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 is finished\n",
"2019-02-10 00:16:12,771 - ALPHA_MIND - INFO - 2017-07-18 00:00:00: 800\n",
"2019-02-10 00:16:12,778 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,780 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,809 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 is finished\n",
"2019-02-10 00:16:12,818 - ALPHA_MIND - INFO - 2017-08-01 00:00:00: 800\n",
"2019-02-10 00:16:12,823 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,826 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,855 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 is finished\n",
"2019-02-10 00:16:12,865 - ALPHA_MIND - INFO - 2017-08-15 00:00:00: 800\n",
"2019-02-10 00:16:12,870 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,872 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,900 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 is finished\n",
"2019-02-10 00:16:12,909 - ALPHA_MIND - INFO - 2017-08-29 00:00:00: 800\n",
"2019-02-10 00:16:12,915 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,917 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,945 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 is finished\n",
"2019-02-10 00:16:12,953 - ALPHA_MIND - INFO - 2017-09-12 00:00:00: 800\n",
"2019-02-10 00:16:12,960 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,963 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,989 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 is finished\n",
"2019-02-10 00:16:12,997 - ALPHA_MIND - INFO - 2017-09-26 00:00:00: 800\n",
"2019-02-10 00:16:13,003 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:13,005 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 full re-balance\n",
"2019-02-10 00:16:13,035 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 is finished\n",
"2019-02-10 00:16:13,045 - ALPHA_MIND - INFO - 2017-10-17 00:00:00: 800\n",
"2019-02-10 00:16:13,051 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:13,053 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 full re-balance\n",
"2019-02-10 00:16:13,080 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 is finished\n",
"2019-02-10 00:16:13,088 - ALPHA_MIND - INFO - 2017-10-31 00:00:00: 800\n",
"2019-02-10 00:16:13,094 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:13,097 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 full re-balance\n",
"2019-02-10 00:16:13,127 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 is finished\n",
"2019-02-10 00:16:13,136 - ALPHA_MIND - INFO - 2017-11-14 00:00:00: 800\n",
"2019-02-10 00:16:13,141 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:13,143 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 full re-balance\n",
"2019-02-10 00:16:13,171 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 is finished\n",
"2019-02-10 00:16:13,181 - ALPHA_MIND - INFO - 2017-11-28 00:00:00: 800\n",
"2019-02-10 00:16:13,186 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:13,188 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 full re-balance\n",
"2019-02-10 00:16:13,216 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 is finished\n",
"2019-02-10 00:16:13,226 - ALPHA_MIND - INFO - 2017-12-12 00:00:00: 799\n",
"2019-02-10 00:16:13,232 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:13,234 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 full re-balance\n",
"2019-02-10 00:16:13,260 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 is finished\n",
"2019-02-10 00:16:13,269 - ALPHA_MIND - INFO - 2017-12-26 00:00:00: 799\n",
"2019-02-10 00:16:13,275 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:13,276 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 full re-balance\n",
"2019-02-10 00:16:13,307 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 is finished\n",
"2019-02-10 00:16:13,315 - ALPHA_MIND - INFO - 2018-01-10 00:00:00: 799\n",
"2019-02-10 00:16:13,322 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:13,325 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 full re-balance\n",
"2019-02-10 00:16:13,353 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 is finished\n",
"2019-02-10 00:16:13,362 - ALPHA_MIND - INFO - 2018-01-24 00:00:00: 799\n",
"2019-02-10 00:16:13,369 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:13,370 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 full re-balance\n",
"2019-02-10 00:16:13,409 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 is finished\n",
"2019-02-10 00:16:13,417 - ALPHA_MIND - INFO - 2018-02-07 00:00:00: 799\n",
"2019-02-10 00:16:13,424 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:13,427 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 full re-balance\n",
"2019-02-10 00:16:13,453 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 is finished\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Wall time: 47.5 s\n"
]
}
],
"source": [ "source": [
"%%time\n", "%%time\n",
"\n", "\n",
...@@ -262,7 +748,7 @@ ...@@ -262,7 +748,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 25,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -275,7 +761,7 @@ ...@@ -275,7 +761,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 26,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -310,7 +796,7 @@ ...@@ -310,7 +796,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.6.5" "version": "3.6.8"
}, },
"varInspector": { "varInspector": {
"cols": { "cols": {
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 8,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 9,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -59,7 +59,7 @@ ...@@ -59,7 +59,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 10,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -79,9 +79,17 @@ ...@@ -79,9 +79,17 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 11,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Wall time: 2.99 ms\n"
]
}
],
"source": [ "source": [
"%%time\n", "%%time\n",
"w = Variable(n)\n", "w = Variable(n)\n",
...@@ -101,9 +109,55 @@ ...@@ -101,9 +109,55 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 12,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"-----------------------------------------------------------------\n",
" OSQP v0.4.1 - Operator Splitting QP Solver\n",
" (c) Bartolomeo Stellato, Goran Banjac\n",
" University of Oxford - Stanford University 2018\n",
"-----------------------------------------------------------------\n",
"problem: variables n = 439, constraints m = 640\n",
" nnz(P) + nnz(A) = 4419\n",
"settings: linear system solver = qdldl,\n",
" eps_abs = 1.0e-03, eps_rel = 1.0e-03,\n",
" eps_prim_inf = 1.0e-04, eps_dual_inf = 1.0e-04,\n",
" rho = 1.00e-01 (adaptive),\n",
" sigma = 1.00e-06, alpha = 1.60, max_iter = 4000\n",
" check_termination: on (interval 25),\n",
" scaling: on, scaled_termination: off\n",
" warm start: on, polish: on\n",
"\n",
"iter objective pri res dua res rho time\n",
" 1 -6.4413e+01 5.65e+00 6.37e+02 1.00e-01 1.36e-03s\n",
" 200 -2.4008e+00 4.49e-06 1.89e-03 1.55e+00 5.62e-03s\n",
"plsh -2.4003e+00 5.55e-16 1.37e-14 --------- 6.38e-03s\n",
"\n",
"status: solved\n",
"solution polish: successful\n",
"number of iterations: 200\n",
"optimal objective: -2.4003\n",
"run time: 6.38e-03s\n",
"optimal rho estimate: 2.29e-01\n",
"\n",
"Wall time: 29.9 ms\n"
]
},
{
"data": {
"text/plain": [
"-2.4003282365506444"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"%%time\n", "%%time\n",
"prob.solve(verbose=True)" "prob.solve(verbose=True)"
...@@ -111,18 +165,67 @@ ...@@ -111,18 +165,67 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 13,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"text/plain": [
"('optimal', -2.4003282365506444)"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"prob.status, prob.value" "prob.status, prob.value"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 14,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"ECOS 2.0.7 - (C) embotech GmbH, Zurich Switzerland, 2012-15. Web: www.embotech.com/ECOS\n",
"\n",
"It pcost dcost gap pres dres k/t mu step sigma IR | BT\n",
" 0 -3.332e-01 -1.048e+02 +2e+03 9e-01 1e-02 1e+00 5e+00 --- --- 1 1 - | - - \n",
" 1 -3.461e-01 -1.811e+01 +1e+03 2e-01 2e-03 8e-01 3e+00 0.5430 3e-01 1 1 1 | 0 0\n",
" 2 -2.875e+00 -4.039e+00 +2e+02 1e-02 9e-05 9e-02 4e-01 0.9297 6e-02 1 1 1 | 0 0\n",
" 3 -2.573e+00 -2.939e+00 +5e+01 5e-03 3e-05 3e-02 1e-01 0.7733 9e-02 1 1 2 | 0 0\n",
" 4 -2.449e+00 -2.553e+00 +1e+01 1e-03 8e-06 6e-03 3e-02 0.7708 6e-02 1 1 1 | 0 0\n",
" 5 -2.407e+00 -2.418e+00 +2e+00 1e-04 9e-07 6e-04 4e-03 0.9066 2e-02 1 1 1 | 0 0\n",
" 6 -2.402e+00 -2.404e+00 +3e-01 3e-05 2e-07 1e-04 7e-04 0.8248 1e-02 1 1 2 | 0 0\n",
" 7 -2.401e+00 -2.401e+00 +6e-02 6e-06 4e-08 9e-06 2e-04 0.9466 2e-01 2 2 2 | 0 0\n",
" 8 -2.400e+00 -2.400e+00 +5e-03 4e-07 3e-09 7e-07 1e-05 0.9237 1e-03 1 1 1 | 0 0\n",
" 9 -2.400e+00 -2.400e+00 +2e-04 2e-08 1e-10 2e-08 5e-07 0.9890 3e-02 1 1 1 | 0 0\n",
"10 -2.400e+00 -2.400e+00 +2e-06 2e-10 1e-12 2e-10 5e-09 0.9890 1e-04 1 1 1 | 0 0\n",
"11 -2.400e+00 -2.400e+00 +2e-08 2e-12 1e-14 2e-12 6e-11 0.9890 1e-04 2 1 1 | 0 0\n",
"\n",
"OPTIMAL (within feastol=2.2e-12, reltol=9.8e-09, abstol=2.4e-08).\n",
"Runtime: 0.011237 seconds.\n",
"\n",
"Wall time: 32.9 ms\n"
]
},
{
"data": {
"text/plain": [
"-2.400328236659518"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"%%time\n", "%%time\n",
"prob.solve(verbose=True, solver='ECOS')" "prob.solve(verbose=True, solver='ECOS')"
...@@ -130,18 +233,53 @@ ...@@ -130,18 +233,53 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 15,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"text/plain": [
"('optimal', -2.400328236659518)"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"prob.status, prob.value" "prob.status, prob.value"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 16,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" pcost dcost gap pres dres\n",
" 0: -4.0275e+01 -8.9373e+01 8e+03 6e+01 6e-16\n",
" 1: -2.7029e+00 -8.3780e+01 2e+02 1e+00 2e-15\n",
" 2: -1.3699e+00 -2.0914e+01 2e+01 3e-15 3e-15\n",
" 3: -1.6193e+00 -6.3167e+00 5e+00 5e-16 2e-15\n",
" 4: -1.8992e+00 -4.2870e+00 2e+00 5e-16 1e-15\n",
" 5: -2.1306e+00 -3.2594e+00 1e+00 4e-16 8e-16\n",
" 6: -2.1625e+00 -2.9783e+00 8e-01 3e-16 6e-16\n",
" 7: -2.2529e+00 -2.6835e+00 4e-01 3e-16 6e-16\n",
" 8: -2.3100e+00 -2.5413e+00 2e-01 1e-15 5e-16\n",
" 9: -2.3407e+00 -2.4723e+00 1e-01 8e-16 5e-16\n",
"10: -2.3953e+00 -2.4100e+00 1e-02 4e-16 1e-15\n",
"11: -2.4002e+00 -2.4005e+00 2e-04 2e-16 9e-16\n",
"12: -2.4003e+00 -2.4003e+00 2e-06 2e-16 9e-16\n",
"13: -2.4003e+00 -2.4003e+00 2e-08 2e-16 9e-16\n",
"Optimal solution found.\n",
"Wall time: 23.9 ms\n"
]
}
],
"source": [ "source": [
"%%time\n", "%%time\n",
"P = matrix(sec_cov_values)\n", "P = matrix(sec_cov_values)\n",
...@@ -169,9 +307,17 @@ ...@@ -169,9 +307,17 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 17,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Wall time: 20.9 ms\n"
]
}
],
"source": [ "source": [
"%%time\n", "%%time\n",
"lbound = np.zeros(n)\n", "lbound = np.zeros(n)\n",
...@@ -204,7 +350,7 @@ ...@@ -204,7 +350,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 18,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -213,7 +359,7 @@ ...@@ -213,7 +359,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 19,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -225,7 +371,7 @@ ...@@ -225,7 +371,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 20,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -249,7 +395,7 @@ ...@@ -249,7 +395,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 21,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -281,7 +427,7 @@ ...@@ -281,7 +427,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 22,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -300,9 +446,61 @@ ...@@ -300,9 +446,61 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 23,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Scale(n) cvxpy cvxopt ipopt\n",
"200 0.0340 0.0109 0.0120\n",
"400 0.0399 0.0469 0.0199\n",
"600 0.0519 0.1606 0.0319\n",
"800 0.0708 0.5037 0.0519\n",
"1000 0.1027 0.9594 0.0469\n",
"1200 0.1406 1.6586 0.0539\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\cvxpy-1.0.10-py3.6-win-amd64.egg\\cvxpy\\problems\\problem.py:614: RuntimeWarning: overflow encountered in long_scalars\n",
" if self.max_big_small_squared < big*small**2:\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"1400 0.1386 2.7945 0.0728\n",
"1600 0.1586 3.8437 0.0987\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\cvxpy-1.0.10-py3.6-win-amd64.egg\\cvxpy\\problems\\problem.py:615: RuntimeWarning: overflow encountered in long_scalars\n",
" self.max_big_small_squared = big*small**2\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"1800 0.2224 8.4165 0.1885\n",
"2000 0.3022 10.5777 0.1905\n",
"2200 0.3201 15.0518 0.1676\n",
"2400 0.3282 17.1641 0.2045\n",
"2600 0.3391 23.3546 0.1985\n",
"2800 0.4807 29.7235 0.2424\n",
"3000 0.4199 39.5318 0.2804\n",
"3200 0.5067 53.5702 0.2586\n"
]
}
],
"source": [ "source": [
"n_steps = list(range(200, 3201, 200))\n", "n_steps = list(range(200, 3201, 200))\n",
"cvxpy_times = [None] * len(n_steps)\n", "cvxpy_times = [None] * len(n_steps)\n",
...@@ -323,13 +521,6 @@ ...@@ -323,13 +521,6 @@
" print(\"{0:<8}{1:>12.4f}{2:>12.4f}{3:>12.4f}\".format(n, cvxpy_times[i], cvxopt_times[i], ipopt_times[i]))" " print(\"{0:<8}{1:>12.4f}{2:>12.4f}{3:>12.4f}\".format(n, cvxpy_times[i], cvxopt_times[i], ipopt_times[i]))"
] ]
}, },
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": null,
...@@ -354,7 +545,7 @@ ...@@ -354,7 +545,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.6.5" "version": "3.6.8"
}, },
"varInspector": { "varInspector": {
"cols": { "cols": {
......
...@@ -9,9 +9,20 @@ ...@@ -9,9 +9,20 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 1,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"text/plain": [
"datetime.datetime(2019, 2, 10, 0, 16, 56, 354078)"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"%matplotlib inline\n", "%matplotlib inline\n",
"import os\n", "import os\n",
...@@ -28,7 +39,7 @@ ...@@ -28,7 +39,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 2,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -53,7 +64,7 @@ ...@@ -53,7 +64,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 8,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -79,15 +90,23 @@ ...@@ -79,15 +90,23 @@
" warm_start=0,\n", " warm_start=0,\n",
" data_source=data_source)\n", " data_source=data_source)\n",
" ref_date, model = params\n", " ref_date, model = params\n",
" er = predict_by_model(ref_date, model, data_meta)\n", " er, _ = predict_by_model(ref_date, model, data_meta)\n",
" return er" " return er"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 9,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Wall time: 1min 9s\n"
]
}
],
"source": [ "source": [
"%%time\n", "%%time\n",
"predicts = [predict_worker((d.strftime('%Y-%m-%d'), alpha_model)) for d in ref_dates]" "predicts = [predict_worker((d.strftime('%Y-%m-%d'), alpha_model)) for d in ref_dates]"
...@@ -95,9 +114,114 @@ ...@@ -95,9 +114,114 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 10,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 00:19:34,241 - ALPHA_MIND - INFO - 2017-04-10 full re-balance: 500\n",
"2019-02-10 00:19:34,503 - ALPHA_MIND - INFO - 2017-04-10 is finished\n",
"2019-02-10 00:19:34,508 - ALPHA_MIND - INFO - 2017-04-17 full re-balance: 500\n",
"2019-02-10 00:19:34,796 - ALPHA_MIND - INFO - 2017-04-17 is finished\n",
"2019-02-10 00:19:34,802 - ALPHA_MIND - INFO - 2017-04-24 full re-balance: 500\n",
"2019-02-10 00:19:35,044 - ALPHA_MIND - INFO - 2017-04-24 is finished\n",
"2019-02-10 00:19:35,057 - ALPHA_MIND - INFO - 2017-05-02 full re-balance: 500\n",
"2019-02-10 00:19:35,288 - ALPHA_MIND - INFO - 2017-05-02 is finished\n",
"2019-02-10 00:19:35,301 - ALPHA_MIND - INFO - 2017-05-09 full re-balance: 500\n",
"2019-02-10 00:19:35,561 - ALPHA_MIND - INFO - 2017-05-09 is finished\n",
"2019-02-10 00:19:35,578 - ALPHA_MIND - INFO - 2017-05-16 full re-balance: 500\n",
"2019-02-10 00:19:35,839 - ALPHA_MIND - INFO - 2017-05-16 is finished\n",
"2019-02-10 00:19:35,849 - ALPHA_MIND - INFO - 2017-05-23 full re-balance: 500\n",
"2019-02-10 00:19:36,085 - ALPHA_MIND - INFO - 2017-05-23 is finished\n",
"2019-02-10 00:19:36,091 - ALPHA_MIND - INFO - 2017-06-01 full re-balance: 500\n",
"2019-02-10 00:19:36,356 - ALPHA_MIND - INFO - 2017-06-01 is finished\n",
"2019-02-10 00:19:36,362 - ALPHA_MIND - INFO - 2017-06-08 full re-balance: 500\n",
"2019-02-10 00:19:36,620 - ALPHA_MIND - INFO - 2017-06-08 is finished\n",
"2019-02-10 00:19:36,625 - ALPHA_MIND - INFO - 2017-06-15 full re-balance: 500\n",
"2019-02-10 00:19:36,866 - ALPHA_MIND - INFO - 2017-06-15 is finished\n",
"2019-02-10 00:19:36,873 - ALPHA_MIND - INFO - 2017-06-22 full re-balance: 500\n",
"2019-02-10 00:19:37,103 - ALPHA_MIND - INFO - 2017-06-22 is finished\n",
"2019-02-10 00:19:37,110 - ALPHA_MIND - INFO - 2017-06-29 full re-balance: 500\n",
"2019-02-10 00:19:37,404 - ALPHA_MIND - INFO - 2017-06-29 is finished\n",
"2019-02-10 00:19:37,412 - ALPHA_MIND - INFO - 2017-07-06 full re-balance: 500\n",
"2019-02-10 00:19:37,630 - ALPHA_MIND - INFO - 2017-07-06 is finished\n",
"2019-02-10 00:19:37,635 - ALPHA_MIND - INFO - 2017-07-13 full re-balance: 500\n",
"2019-02-10 00:19:37,858 - ALPHA_MIND - INFO - 2017-07-13 is finished\n",
"2019-02-10 00:19:37,866 - ALPHA_MIND - INFO - 2017-07-20 full re-balance: 500\n",
"2019-02-10 00:19:38,127 - ALPHA_MIND - INFO - 2017-07-20 is finished\n",
"2019-02-10 00:19:38,132 - ALPHA_MIND - INFO - 2017-07-27 full re-balance: 500\n",
"2019-02-10 00:19:38,421 - ALPHA_MIND - INFO - 2017-07-27 is finished\n",
"2019-02-10 00:19:38,428 - ALPHA_MIND - INFO - 2017-08-03 full re-balance: 500\n",
"2019-02-10 00:19:38,692 - ALPHA_MIND - INFO - 2017-08-03 is finished\n",
"2019-02-10 00:19:38,699 - ALPHA_MIND - INFO - 2017-08-10 full re-balance: 500\n",
"2019-02-10 00:19:38,937 - ALPHA_MIND - INFO - 2017-08-10 is finished\n",
"2019-02-10 00:19:38,942 - ALPHA_MIND - INFO - 2017-08-17 full re-balance: 500\n",
"2019-02-10 00:19:39,171 - ALPHA_MIND - INFO - 2017-08-17 is finished\n",
"2019-02-10 00:19:39,176 - ALPHA_MIND - INFO - 2017-08-24 full re-balance: 500\n",
"2019-02-10 00:19:39,410 - ALPHA_MIND - INFO - 2017-08-24 is finished\n",
"2019-02-10 00:19:39,417 - ALPHA_MIND - INFO - 2017-08-31 full re-balance: 500\n",
"2019-02-10 00:19:39,649 - ALPHA_MIND - INFO - 2017-08-31 is finished\n",
"2019-02-10 00:19:39,659 - ALPHA_MIND - INFO - 2017-09-07 full re-balance: 500\n",
"2019-02-10 00:19:39,985 - ALPHA_MIND - INFO - 2017-09-07 is finished\n",
"2019-02-10 00:19:39,993 - ALPHA_MIND - INFO - 2017-09-14 full re-balance: 500\n",
"2019-02-10 00:19:40,246 - ALPHA_MIND - INFO - 2017-09-14 is finished\n",
"2019-02-10 00:19:40,256 - ALPHA_MIND - INFO - 2017-09-21 full re-balance: 500\n",
"2019-02-10 00:19:40,573 - ALPHA_MIND - INFO - 2017-09-21 is finished\n",
"2019-02-10 00:19:40,578 - ALPHA_MIND - INFO - 2017-09-28 full re-balance: 500\n",
"2019-02-10 00:19:40,804 - ALPHA_MIND - INFO - 2017-09-28 is finished\n",
"2019-02-10 00:19:40,816 - ALPHA_MIND - INFO - 2017-10-12 full re-balance: 500\n",
"2019-02-10 00:19:41,057 - ALPHA_MIND - INFO - 2017-10-12 is finished\n",
"2019-02-10 00:19:41,068 - ALPHA_MIND - INFO - 2017-10-19 full re-balance: 500\n",
"2019-02-10 00:19:41,333 - ALPHA_MIND - INFO - 2017-10-19 is finished\n",
"2019-02-10 00:19:41,342 - ALPHA_MIND - INFO - 2017-10-26 full re-balance: 500\n",
"2019-02-10 00:19:41,571 - ALPHA_MIND - INFO - 2017-10-26 is finished\n",
"2019-02-10 00:19:41,579 - ALPHA_MIND - INFO - 2017-11-02 full re-balance: 500\n",
"2019-02-10 00:19:41,768 - ALPHA_MIND - INFO - 2017-11-02 is finished\n",
"2019-02-10 00:19:41,774 - ALPHA_MIND - INFO - 2017-11-09 full re-balance: 500\n",
"2019-02-10 00:19:41,988 - ALPHA_MIND - INFO - 2017-11-09 is finished\n",
"2019-02-10 00:19:41,993 - ALPHA_MIND - INFO - 2017-11-16 full re-balance: 500\n",
"2019-02-10 00:19:42,235 - ALPHA_MIND - INFO - 2017-11-16 is finished\n",
"2019-02-10 00:19:42,242 - ALPHA_MIND - INFO - 2017-11-23 full re-balance: 500\n",
"2019-02-10 00:19:42,534 - ALPHA_MIND - INFO - 2017-11-23 is finished\n",
"2019-02-10 00:19:42,538 - ALPHA_MIND - INFO - 2017-11-30 full re-balance: 500\n",
"2019-02-10 00:19:42,774 - ALPHA_MIND - INFO - 2017-11-30 is finished\n",
"2019-02-10 00:19:42,779 - ALPHA_MIND - INFO - 2017-12-07 full re-balance: 500\n",
"2019-02-10 00:19:43,045 - ALPHA_MIND - INFO - 2017-12-07 is finished\n",
"2019-02-10 00:19:43,053 - ALPHA_MIND - INFO - 2017-12-14 full re-balance: 500\n",
"2019-02-10 00:19:43,274 - ALPHA_MIND - INFO - 2017-12-14 is finished\n",
"2019-02-10 00:19:43,283 - ALPHA_MIND - INFO - 2017-12-21 full re-balance: 500\n",
"2019-02-10 00:19:43,547 - ALPHA_MIND - INFO - 2017-12-21 is finished\n",
"2019-02-10 00:19:43,559 - ALPHA_MIND - INFO - 2017-12-28 full re-balance: 500\n",
"2019-02-10 00:19:43,798 - ALPHA_MIND - INFO - 2017-12-28 is finished\n",
"2019-02-10 00:19:43,805 - ALPHA_MIND - INFO - 2018-01-05 full re-balance: 500\n",
"2019-02-10 00:19:44,058 - ALPHA_MIND - INFO - 2018-01-05 is finished\n",
"2019-02-10 00:19:44,067 - ALPHA_MIND - INFO - 2018-01-12 full re-balance: 500\n",
"2019-02-10 00:19:44,310 - ALPHA_MIND - INFO - 2018-01-12 is finished\n",
"2019-02-10 00:19:44,320 - ALPHA_MIND - INFO - 2018-01-19 full re-balance: 500\n",
"2019-02-10 00:19:44,578 - ALPHA_MIND - INFO - 2018-01-19 is finished\n",
"2019-02-10 00:19:44,588 - ALPHA_MIND - INFO - 2018-01-26 full re-balance: 500\n",
"2019-02-10 00:19:44,855 - ALPHA_MIND - INFO - 2018-01-26 is finished\n",
"2019-02-10 00:19:44,860 - ALPHA_MIND - INFO - 2018-02-02 full re-balance: 500\n",
"2019-02-10 00:19:45,116 - ALPHA_MIND - INFO - 2018-02-02 is finished\n",
"2019-02-10 00:19:45,123 - ALPHA_MIND - INFO - 2018-02-09 full re-balance: 500\n",
"2019-02-10 00:19:45,380 - ALPHA_MIND - INFO - 2018-02-09 is finished\n",
"2019-02-10 00:19:45,391 - ALPHA_MIND - INFO - 2018-02-23 full re-balance: 500\n",
"2019-02-10 00:19:45,660 - ALPHA_MIND - INFO - 2018-02-23 is finished\n",
"2019-02-10 00:19:45,666 - ALPHA_MIND - INFO - 2018-03-02 full re-balance: 500\n",
"2019-02-10 00:19:45,890 - ALPHA_MIND - INFO - 2018-03-02 is finished\n",
"2019-02-10 00:19:45,898 - ALPHA_MIND - INFO - 2018-03-09 full re-balance: 500\n",
"2019-02-10 00:19:46,126 - ALPHA_MIND - INFO - 2018-03-09 is finished\n",
"2019-02-10 00:19:46,136 - ALPHA_MIND - INFO - 2018-03-16 full re-balance: 500\n",
"2019-02-10 00:19:46,352 - ALPHA_MIND - INFO - 2018-03-16 is finished\n",
"2019-02-10 00:19:46,363 - ALPHA_MIND - INFO - 2018-03-23 full re-balance: 500\n",
"2019-02-10 00:19:46,630 - ALPHA_MIND - INFO - 2018-03-23 is finished\n",
"2019-02-10 00:19:46,642 - ALPHA_MIND - INFO - 2018-03-30 full re-balance: 500\n",
"2019-02-10 00:19:46,885 - ALPHA_MIND - INFO - 2018-03-30 is finished\n"
]
}
],
"source": [ "source": [
"industry_names = industry_list(industry_name, industry_level)\n", "industry_names = industry_list(industry_name, industry_level)\n",
"industry_total = engine.fetch_industry_matrix_range(universe, dates=ref_dates, category=industry_name, level=industry_level)\n", "industry_total = engine.fetch_industry_matrix_range(universe, dates=ref_dates, category=industry_name, level=industry_level)\n",
...@@ -146,9 +270,32 @@ ...@@ -146,9 +270,32 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 11,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x1ef2b939e48>"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAvMAAAFpCAYAAAAREKdvAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzs3Xd4VFX6wPHvO+kJCWlACIGAgCAdEUFUVDqIwgpcC7ZVVlkbuq6rq2tdV9S1t9+KXVzFK4iC0tvaQAQUJSJFpCShJfQkk3bP7487YIikkUwmwffzPPMk995zz3lnEsg7Z957rhhjUEoppZRSStU/nkAHoJRSSimllDo+mswrpZRSSilVT2kyr5RSSimlVD2lybxSSimllFL1lCbzSimllFJK1VOazCullFJKKVVPaTKvlAoYEXlYRH6qpbHSReSuCtr0F5E0ESkUkQW1EVdNEZFgETEickk1+2nj66d3TcXmTyIywBdvkh/6rvB3RimlAk2TeaWU34jIm75Eq/TjcML5KHBWIGMs5T/A10ArYEyAY1F+JCJfHOP3cnOg41JKqaoKDnQASqkT3ueAVWrfPgBjzCHgUK1HdAwi4gFaA/cZY9LLaRdqjCmoxbhqdbzfmbeBO0tsFwcqEKWUOl46M6+U8rcCY8yOUg8vHF1mI665IrJURIJ9+zwislhEPhORIN++aBF5XkQyRSRXRFaKyIiSA4pIdxFZJiJeEVknIqPKC1BEBuAmcgK865ulvbxECcdQEflSRLzANb5zeorIfBE5JCK7RGSqiDQv1e+tvlKNXBGZLSJXV1QS4psxniQij4jIdmCLb3+IiPxTRDaLSJ6IrBGRccfoopGITPeNmSEiE0r1f5uIrPbFvV1E3q2oREVEHhWRn3x9bhWRl0QkpsTxcb7X+mwR+c7XbrmIdC/VT1sRmSYie3xtVovI0BLHq/yaAinlxV6BvFK/l7uP0SZSRF4XkQMikuX7uejfTqVUnaH/ISml6gRjjAGuAFoCD/t23wt0AS4zxhSLiACfAh1xy2A6Aa8AH4jIOQAiEgXMBnYDp+Mm338HEsoZ/jN+TQrHA02BqSWOPwlMBE4BZopIZ2AJ7qcOpwEDcN8IzBeRUF8co4B/+x7dgA+Bxyv5clwKNAT6A4N8+94ALgDGAR1wX6MnReSqUuc+ACzwjfkE8JSIXFiqzV+AzsAo4CTgvxXEk1Ni3Gt8z/fpUm1CfDHdCPQADgDvl3gTlgx8CUQDw33j3w84vuM18prKr9cO/KOC5wQwWkR2i8h6EXlDRI71xuBWYKsvptt92zdVom+llKodxhh96EMf+vDLA3gTKMItpTn8+LnE8YeBn0qdM8B3zv1AIXBhqWN5QHSpc94Gpvq+H4+bSDYscbwbYIC7yok12NfmklLjGeDSUm3fAd4ptS8CyAeG+7aXAW+VavOMr7+kcuL4AlgLSIl9bX3ntS3V9iFgRan43yjVxgaWlDNeT995TXzbbXzbvcs5ZwyQezhG3ETfAF1KtDnLt6+1b3sikAlEltFnjbymQBDwEzC+gt/N63HfKHXCfZO0EtgBNC7RJh1YXOq8x4HNgf63pQ996EMfhx9aM6+U8revgZKzx0XlNTbGLBCRZ3FnmF8wxswocbgnEAZsdyfpjwjFTYDBnT1OM8bsL9HndyJSndr85aW2ewItRWRkqf0huIn34TjeKHX8C2ACFVthjDEltk/zff221PMOxk12S1paavtL4J7DGyLSD7gL91OGWH79hDYV2HmsYERktC/u1kAMbsIcDjQCdvmaFQFrSpyW4fvaBPgZd7b+C2NM7rHGoIZeU2NMMdC+jDEo0e7lEptrRGQpsAm4mqNn+4/1et4hIlHGmJyKxlFKKX/TZF4p5W95xpiNlW3sq5fvg1vD3kZEpERi6wGygTOOcerhi0QFd6a2JpVO2jy4nzr8+xhts0p8f7xxHGs8gN6At9Qxp4K+jmT/ItIKt0zpTeBB3FhTgbm4b4h+e7LImcD7wL9wy0z24c66v1bqnGJjTMlYSv7MSu87Fn+/puUyxmSJyHrcMq/ySAXHlVKqVmkyr5Sqa/6JuzTkWcAc3ATyCd+xFUAiEGyMKWt9+jTgKhGJMcYcABCRrkCDGoxxBW4t/8+lZtBL+hE4E5hUYt+ZxzneSt/XFGPMnAra9i415hn8+qnF6bifbEwwvhVyRKRXBf2dBewwxtx3eIcc31r2K4ErRSSyjNn52n5NjyIi0bifPEwrdaj0evtnAFt1Vl4pVVfoBbBKqTrDVwJyB3ClMWYZbl3zIyLS09dkHu5Fkh+LyEgRaSUiPUTkFhG5xtfmHdy6+ski0llE+uBeJFt6Rrs6/oV7AedbvhVYWolIP3FX2Un1tXkSuExEbvat4nItcNnxDOZ74/I28Lq4q+y0FpGuInKtiNxRqvkIEfmzb8wJuBe5Hr5YdT3uzPLtvpj/AFR0oeg6IEnclXhOEpE/4v5cquoF3DcS00Wkj2/8C0RksO94jbymIhLkW3lnfFmBiMjJInK/b5xU38XTM3E/5XirVPPTRORe3zlX4F78WvriX6WUChhN5pVSdYKIJAKTgSeNMfMAjDHv+/a9JyLRvhnb84GPcS98XIdbNjIUt94Z465dPwxIwp3tfRu3dCO7pmI1xqzBnRGOBebjzhhPwi072e9r8wHuGuZ/B74HLsatVT9e1wLP467wsxZ3xZor8D3vEh7AfT1W+8b/mzHmI19M3+LWl9/oi/k23NVZynuuH+HWkD8G/ID75uBvVQ3eGJOBO8vvxV1tKA33UxjxHa+p11SAdrif4JSlADjPF8cG3N+RbUBPY0xmqbbP4F4UvNL3/fPAc1V57kop5U9S9qeZSimlapK469nPB5oaY3YEOh6llFL1n87MK6WUUkopVU9pMq+UUkoppVQ9pWU2SimllFJK1VM6M6+UUkoppVQ9pcm8UkoppZRS9VRdvGmU1v0opZRSSqnaUq/v7FwXk3kyM0sv86uUUkoppVTNSk5ODnQI1aZlNkoppZRSStVTmswrpZRSSilVT2kyr5RSSimlVD1VJ2vmSzPG4PV6cRwHkXp9jcIJyRiDx+MhPDxcfz5KKaWUUrWoXiTzXq+XkJAQgoPrRbi/S0VFRXi9XiIiIgIdilJKKaXU70a9KLNxHEcT+TouODgYx3ECHYZSSiml1O9KvUjmtXSjftCfk1JKKaVU7aoXyXx98sorr5CXlxfoMJRSSiml1O+AJvPHwRhTZknJq6++WuVkvqioqCbCUkoppZRSvzNaiF5J27Zt4/LLL6dPnz6sXLmScePGMXnyZAoKCkhNTeXpp59mypQp7Ny5kzFjxhAXF8fUqVNp27YtGzZsAOCTTz5hwYIFPPPMM9x6663ExsayZs0aOnfuTIMGDcjIyGDr1q1kZGQwbtw4rr32WnJzc7n++uvZvn07juMwYcIERowYEeBXQymllFJK1QX1Lpl3pryC2fZLjfYpzVvhueRPFbb7+eefeeqpp7jjjjsYN24c77//PpGRkbz44otMmjSJ2267jUmTJvHBBx8QHx9fYX+bNm3i/fffJygoiCeffJKNGzfywQcfkJOTw9lnn82VV17J4sWLSUpKYvLkyQAcOHCg2s9XKaWUUqommG2/4Mx8D4mJxXP5DYEOp0JFjmHd7jxWbc9hVeYh3h+XXOE5lmUNAZ4FgoBXbdt+tNTxMOBtoAeQDVxs2/Zmy7IGAo8CoUABcIdt24t85/QA3gQigFnABNu2jWVZ8cD7QEtgM2DZtr23vPi0zKYKUlJS6NGjBytXrmT9+vWMGDGCgQMH8sEHH5Cenl7l/oYPH05QUNCR7f79+xMWFkZ8fDyJiYns3r2b9u3b8/nnn/Ovf/2Lr7/+mpiYmJp8SkoppZRSVWZ2pONM+jfOQxPgu+WY/83BZG4NdFjHtDunkLkb9jHxs3Qu/2ADdy/Yyoc/ZhMeXHEabFlWEPAiMBToAFxqWVaHUs2uBfbatt0GeBp4zLc/C7jAtu3OwFXA5BLn/B9wHdDW9xji238XsNC27bbAQt92uerdzHxlZtD9JTIyEnBr5vv27ctLL71U4TklV3jJz88/Zn+HhYWFHfk+KCiI4uJiWrduzezZs1m0aBETJ07knHPO4bbbbqvO01BKKaWUOi4mexdm5hTMV4sgNBQZZiF9+uE8cDNm4SfIFYGfnS8odkjblceqzEOsyswh/UABAImRwfRtGUP35Ci6NIkkKjSogp4AOB3YaNv2JgDLsqYAI4AfS7QZATzg+34q8IJlWWLb9rcl2qQB4b5Z/Hggxrbtpb4+3wZGArN9fZ3rO+ctYAlwZ3kB1slkPjEx8ahtx3HweAL7IUJMTAxTp04lMTERy7Lo3r07MTExhIaG4jgOhYWFhIWFMXv2bFq2bEloaCgAX331FdHR0YSFhTFkyBCGDRtGYmIiEydOJCYmhoYNGwJw66234vF4jjz3qVOn0rJlS0SEhIQE2rZty6WXXsqePXt+8/rUFXXh56SUUkopPyguhv17ISIMrKvg2lsgJg4OVxj85wPIOQjx8VDLuYAxhm37vHy9ZS/LNu/l24z95Bc5hAYJ3Zo15A9dm9G7ZRypcRHHXEbbsqwVJTYn2bY9qcR2M2Bbie10oFepLo60sW27yLKs/UAC7sz8YaOAb23bzrcsq5mvn5J9NvN938S27e2+vrZbltW4oudfJ5P5rKyso7Zzc3N/M4td27Zt28ZVV13FokWLAFi3bh1XXXUVBQXuu72//e1vDBo0iI8++og333yTxo0bM3XqVJYtW8aFF15IcnIy7dq1Iycnh2eeeYa///3vDBgwgOHDhwPwzDPPEBUVxfjx4wEYPXo0b731Fj///DMPP/wwIkJISAgTJ06kQYMGgXkRKlAXfk5KKaWUqjkm5yBm7oeYhZ9AUSFy5gBk+MVIJLD311Juk74F58EJyKir8AwZ5fe4cguL+WFnLt9m5rBqew47DxUCkBwdysDWDTm1aRSdmkQSdriUxsklOzv3N/0kJydj2/Zp5Qx1rJvomKq0sSyrI27pzaAq9FlpdTKZr4uaN29+JJEHOOuss5g1a9Zv2l1zzTVcc801R7aHDx9+JGEv6Zlnnjlq+/bbbz9q+/BYzZs359xzz61O6EoppZRSVWK8uZgFMzHzPgJvLtKzL3LhpUiTY18wKimtoF1nzOJPMQNHIkGVKmGpNMcYtuzLP5K8r92dS5ED4cFCl6Qo/nBKPN2bRpEUHVqj4+LOmjcvsZ0CZJbRJt2yrGCgIbAHwLKsFGA6cKVt2z+XaJ9SRp87Lctq6puVbwrsqihATeaVUkopVeeZzK2YFV8iw8YgwZq++IspKsQsmYWZNRUO7oduvfCMGIuktKzwXM+AC3BefAS+WwY9zqxeHMaw41Ah3+/IZfWOHNbszGV/fjEAreLCuLB9PKcmR9E+MZKQIL/egf4boK1lWa2ADOAS4LJSbWbgXuC6FBgNLPKtTBMLfAr83bbtLw839iXqBy3L6g18DVwJPF+qr0d9Xz+uKED916CUUkqpOs0c3I/z7IOwZzcEBSHnW4EO6YRlPnoHM3c6nNIVz8jLkZPaVf7kLj0hsQnOgpkEHUcyvyeviO935PD9jly+35HD7lz3ppoJEcGcmhxFl6QouiZFkhAZUuW+j5evBv4mYC7u0pSv27adZlnWQ8AK27ZnAK8Bky3L2og7I3+J7/SbgDbAvZZl3evbN8i27V3An/l1acrZvge4SbxtWda1wFZgTEUxijHHXaLjLyYz8+hPL7QWu37Qn5NSSqmaZoqKcJ6+F37ZAK3awqZ1eP7xDNKsRaBDO+GY4mKcO66GNqcQdMPdx9WHM/9jjP0ann88jaS2Lrftofxi1uxyE/fVO3KPrDoTHeqhUxM3ce+cFEmz6NBjXrhaE5KTk+HYNez1hs7MK6WUUqrOMu+/CuvTkGv/gnTsjnPfjThvPovnrsdrvC77d+/H7+Dgfjxn9DvuLuTMAZiP38UsnIFcc/RS2oXFDmt357HaVzrz8x4vjoGwIKFj40j6t25I16QoWsWF4fFT8n4i0mReKaWUUnWS89kczJJZyKA/4Ol9LgBy6XWYV57ALPgYGXxRYAM8wZhliyEqGjr3OO4+JDIK6dMP8/lcikddxVYnku+2uzPvabtyKSg2BAm0S4zA6pRAl6QoTk6I8Hfd+wlNk3mllFJK1Tlm44+YdydBh+7IqCuP7JeeZ2O++QLz0X8xXU9HklLK6UVVlvHmYr5bhvTpjwQff0367pxCvms/mNU7Ylj9aQYHjNtX84ahDGoTS7ekKDo2iSAyRD9VqSmazCullFKqTjF7duP836OQ0AjPdXcgnl8TPxHBM3Y8zv034bz1PJ47JiJ6w8JqM6uWQkEB0uvcKp13qKCYNTvdspnvtueSedCte49t1J7uWT/RdWg/ujWLqdWLVn9v9Le/Evbv38+bb74ZsPGfe+65Mo8ZYxgzZgwHDx485vErrriC/fv3l9v/6NGjWb169W/2r1mzhoULFx7Znj9/Pk888UQlo1ZKKaWqzhTk47w0EQry8dx4DxL12xslSmw8cvE42LgWs/jTAER54jHLlkCjJGjdvtx2hcUO3+/I4Z3vdnPHnM1cMXUDEz/LYNGm/TSNDuGaUxvz3PmteKM7TPhhMuftXq2JvJ9pMl8JBw4c4O233w7Y+M8//3yZxxYuXEiHDh2Ijo4+ar8xBsdxmDx5Mg0bNjyucdPS0o66UdaAAQOYN28eeXl5x9WfUkopVR5jDObtF2Drz3jG3Y4kl71ijZxxHnTqgfnwbczuHbUY5YnH7MmCn75Hep/7m1VjHGP4eY+XD9OyuX/RNi77YAP3LtzGtB+z8YgwplMCjwxowTujT+a+85oz4pR4UmPDkI7doGlzzMKZ1MGVE08o9a7M5tUVO/llr7dG+2wVF86405qUefyRRx5hy5YtDBw4kL59+3Lvvffy0ksvMW3aNESEfv36cffdx17C6ZdffuGuu+4iOzuboKAgXn75ZVJTU3n44YdZvHgxIsItt9zCiBEj2LlzJ3/+8585ePAgxcXFTJw4kYULF+L1ehk4cCDt2rXjhRdeOKr/6dOnM3bsWAC2bdvG5ZdfTp8+fVi5ciWvv/46o0aNYvbs2cTHx/P0008zffp0kpOTiY+Pp0uXLowfPx6ATz75hLvvvpv9+/fz5JNP0r17d5544gm8Xi/Lly/npptuYsSIEZxxxhnMnz+fCy+8sIZefaWUUspl5n2E+fp/yMjLka6nl9tWRPBcccOv5Ta3P+y35QtPdOabz8AYpPe5v7lZ0/c7cznou1lTi4ahDG4TS5ekSDo1iSy37l1EkH7DMf/9P9i4Ftp2qK2n87tT75L5QLj77rtZt24d8+fPB2DRokXMmTOHTz75hIiICPbu3VvmuTfffDM33ngjQ4cOxev1Yoxh1qxZpKWlMX/+fPbs2cOwYcPo3bs306dP55xzzmHChAkUFxeTl5dHr169eOONN46MXdo333zDY489dmT7559/5qmnnmLixIlHtVu9ejWzZs1i7ty5FBcXM3jwYLp06XLkeFFREZ9++ikLFy7kqaee4v333+evf/0r33//Pf/617+OtOvatSvLly/XZF4ppVSNMmtWYqa9hfQ4ExlW4X1yAJD4RsiYazCTX8R8Nhc5Z4ifozyxFBYbtu3PZ9OaTDafegVbfihi896NHPAl7wmRwfRs1oCuSZF0SYoiPqJqaaOccR5m+ts4C2cQpMm839S7ZL68GfTa8vnnn3PxxRcTEREBQFxc3DHbHTp0iO3btzN06FAAwsPDAVi+fDkjR44kKCiIRo0a0bt3b1avXk23bt24/fbbKSoqYvDgwXTq1KnCWPbt20eDBr/WE6akpNCjx2+XlFq+fDmDBw8+EvPAgQOPOj5s2DAAunTpQnp6epnjJSYmsnPnzgrjUkoppSrL7MjAmfQENGuB/HFClWbY5exBmBVfYKa+genUA0lo5MdI6699eUX8si+fzXu9bN6bzy/78knfn0+xAZIGEIpDiwKH01Ma0Do+nC41cLMmCQt3fz7zP8Zk79afjZ/Uu2S+LjDGVOqXu6wasbL29+7dm2nTprFw4UImTJjA+PHjGTOm/NmJ4OBgHMfB47uSv6w7sFZUrxYaGgpAUFAQRUVFZbbzer1H3pQopZRS1WXycnFeegSCPO4Fr2FV+xvjltvciPPgLTjvvIjnlvt/9+U2hcUO67O8/LArl7W789i818s+b/GR4wkRwbSMC6Nnswak/rSU1K8/odmD/yY45viusSuPnHc+Zt7HmMWfIqOvrvH+lV4AWylRUVEcOnToyPY555zDlClTjlwIWlaZTXR0NE2bNmXOnDkA5Ofnk5eXR+/evZkxYwbFxcVkZ2fz9ddf061bN9LT00lMTGTs2LFccskl/PDDDwCEhIRQWFh4zDFOOukktmzZUuFzOP3005k/fz5er5ecnJyjVqkpS4MGDY563gCbNm2iXbt2FZ6rlFJKVcQ4Ds5rT8HODDzj70ISj+/Td2mUhFx0JaxZhflqUcUnnGAKih3W7MxlyvdZ3LNgK5d9sIG7F2xlyvdZ7PcWcWpyA67t0Zh/9m/O5NFtef2iNtx3XnMu7xLPmSs/JKV1C78k8gCS0Bi698Z8Pg+TX7PXPCqXzsxXQnx8PD179qRfv36cd9553HvvvaSlpTF06FBCQkLo168ff//734957nPPPcedd97JE088QXBwMC+//DJDhw5l5cqVDBw4EBHhnnvuoXHjxti2zX/+8x+Cg4OJiori2WefBWDs2LEMGDCAzp07/+YC2P79+7N06VJatWpV7nPo1q0bgwYNYuDAgaSkpNC1a9ffrIBTWp8+fXjxxRcZOHDgkQtgv/rqqzKfq1JKKVUVZsa7sHo5cul1SLvO1epLzh3m3kzKfhXTsRsSm1BDUdY9BcUO67LyWLMzlzU7c1mX5aXQMQhwUnwYQ9vG0qlJJB0aRdIgrJybM/30Pezbg+eS8/war2fAhTirvsIsW6LXNfiB1MHlgkxmZuZRO3Jzc8ssH/m927lzJxMmTGDKlCkVts3JySEqKoq8vDwuuugiHn/8cTp3rvx/nrt37+bGG2/Etu1jHtefk1JKqcoyK77Aeflx5KyByJU31UhpjNmZifPgLdChm1uyU8/LbXILi8nOLSI7t4is3EJ2HCxk7e5fk3ePuCvydW4SScfGEXRoHEmD0MrfWdV5/WnMd8vxPPkWEhLqt+dhjMF5+C9QWIDnwRfq1M8lOTkZoO4EdBx0Zr6ea9KkCZdddhkHDx6scKb9b3/7G+vXryc/P58xY8ZUKZEHyMjI4L777qtOuEoppRRmVybOG89C6/bIZeNrLLmTJsnIyLGYD97ALP8M6XVOjfRb04wx5BQ6vkS9kKwSXw9/n51bRG6hc9R5h5P389vF0alxJKc0jqhS8n5UDPlezKqlyOl9/ZrIg2+Zyv4XYN54BtZ+Bx26V7kPs2c3Zt5HEBKKtGwDqW0goXGdemMQKJrM15C7776bb7755qh948aN4+KLL/b72JVdJvLFF1+s1jjdunWr1vlKKaUUgJk9DYzBc/2dSEjN3h1UBlyIWfElZsokzCldkZjYGu2/IsYYDhY4RxLy3Tnu1+y8w0m7m6x7i46ujBAgNjyIxKgQmsWE0iUpisSIYBIig0mMDCEhMpj4yGBCg2rmckfz7TLI9yK9z62R/ioiPc/GTHsTZ8FMgqqQzJv8fMzcaZi5H4LjgAFT7Fuoo0E0pLZBUtviJvitIS7xd5fg14tkvg6WAv3GI488EugQAq4+/JyUUkoFltmbjVm6GDl7EBJX83Xt4gnCc/UtOP+8FfPeJOT6v9X4GIftzikkbVcuadsPkZlTRHaem6wXFB/999AjEBcRTGJkMKmxYZyaHEViZDAJESHu18gQ4iKCCQmqvSTULFsMCY2hTe2s/y4hIcg5QzAzp2B2ZCBJzcqPzxjM1//DfPg27M1CTjvLXQ0nJg4yt2A2b4QtGzGbN2DmTMU4vk8xohtCy7ZIahsOz+BLbLzfn18g1Ytk3uPxUFRURHBwvQj3d6moqOjI8phKKaVUWcyCGeA4yKCRfhtDklsgwy/BfPQOpudZyKl9qt2nMYZdOYXuRae78kjblcvOQ+5Kc5HFXloU7KF182b0SokjIfLoGfW48GCCPHVnttjs3ws/rkaGjkZq8W+3nDMUM2sqZtEnyGXXlx3fL+txprwCm9ZBi9Z4xt2OnNzx1wapbZDUNr+2L8iH9M2YLRth80bMlo2YNaswxpfgx8a757R0Z/FJbV3rn9j4U73IjsPDw/F6veTn5//uPjqpD4wxeDweXX9eKaVUuUzuIcxnc5DTzkQaJfl1LBl8EWbVVzj//Q+e9l2RyKgqnW+MYcehQn7YmUvazlzW7MolK9ct74gO9dChcSTD28XRIW0xLea8TVB0DKw4hJx/sZsk1+EJSLP8MzBOrZXYHCYN49xym68WYUZe/pufidmbjfnwbfdTg5hY5KqbkT79K3zDIaFhcFI75KRfl842+V7YtqnEDP5GzPff/FpFEN8IWraBfz5f48+zttXd37QSROTInUuVUkopVT+ZJbPBm4cMucjvY0lwsHszqUf+ivlkCmJdW2Zbxxh25xSScaCAjAMFrM/ysmZXLnvy3OS9YVgQHZtEclFjd9WYFrFheEQw2btxFr6HnH42ctn1mHcnYWa8i1m9HM+1tyFNm/v9eR4Ps2yxO1PdNKXWx5YBF2CWLcZ8uQAZOMKNpyAfM+8jzOyp4BQjQ0chw8Yg4ce/Qp6EhUObDkiJMiKTlwtbN2G2bDgyg38iqBfJvFJKKaXqN1NYgFk4Ezp0R1q0rpUxpWVb5KyBmEWfYM4eRH6jZmQeKCD9QAEZB/J9X91HyTr3uIhgOjWOoGPjSDo1iSQlJvSYlQFm+tvuOBddiURFI3+6HXNqb5x3XsJ56FZ3f/8LarWUpSImYyts3YRc8qeAjC+pbaDNKe7PpP9wzMqlmGlvQvYuOPUMPKP/6LdPbSQiEtp1Qtp18kv/gaLJvFJKKaX8zny1CA7swzN0VK2Ml1/ksCozhzVtLiT9UEvqitprAAAgAElEQVTS5+8iKyjnyHEBmjTwrRzTJJKUhmE0iw6lWcNQGoYFVVjWa35Zj/n6f+4MckLjX/vtcSaeNh1wJr+IsV/DfPc1nqtv8XtZUWWZrxeDx4P0PDtgMXj6X4Dz8uM4998EOzIgpSWe2x9G2ncJWEz1WaWSecuyhgDPAkHAq7ZtP1rqeBjwNtADyAYutm17c4njLYAfgQds236iZkJXSimlVH1gnGLMvOnQsi1U806v5Sksdli1PYcvthxkefohvEUO4cFCs8QUOqT/SErH9qSc0oZm0aEkx4Qe9zKPxhgc+zW3rvsYb06kYRyeG+/BfLUQM+UVnAcnINY17go+Abz2zzgO5uv/QcdTA3sBaPczoFES5BxCrrjBvXGY5/jWy1eVSOYtywoCXgQGAunAN5ZlzbBt+8cSza4F9tq23cayrEuAx4CSC6w/DcyuubCVUkopVW+sWgq7tuMZf1eNJ7NFjmH19hy+2HqAr7cdIqfQITrUw9mp0ZyVGkPnJpF4jIPzz9dg0UI8576EhIVVb9CVX8LGte6da8uo6xYR5MwBmPZdcN54FjP5RXeW/sqbArdU4vo1sCcLGXV1YMb3kaAgPP94CoKC3dp2VS2VmZk/Hdho2/YmAMuypgAjcGfaDxsBPOD7firwgmVZYtu2sSxrJLAJyEEppZRSvyvGGJw5H0LjZOjeq0b6LHYMP+zM5fMtB/h620EOFjhEhXjo1bwBZ7WIoWvTKIKPWgoyCM+l1+M8cTdmzjRkxGXHPbYpLMCZ9hY0S0XO7F9he0lojOcv/8QsnuXeNOn+m5Cx4/Gc3ve4YzheZtkSCI9AutXMz6E6JLJBoEM4YVQmmW8GbCuxnQ6U/i040sa27SLLsvYDCZZl5QF34s7q/7X64SqllFKqXlm7GrZsRK64sVqlFAXFDuuy8vhiy0GWbj3I/vxiwoM99EppwFmp0XRvGkVIOWUz0q6TuyzinGmYPv2Ou4bdLJwJWTvx3PZQpZ+PeDxI/+GYjt1wXn8G88oTON8uQ8aORxrEHFccVWUK8jGrvkJ69HGXclSVdrzl5pZlJeBOcvcE3rRt+yZf+2jg8xJdpADv2LZ9q2VZVwP/BjJ8x16wbfvV8uKrTDJ/rM/DSt/qs6w2DwJP27Z9yLKsMgewLOs64DoA27YrEZJSSiml6gNnzjRoGIeccV6l2hcWG7YfLGDLvny27vc99hWw41ABjoGwIOG0Zg04OzWGU5OjCAuufN27jP4j5vtvcOzXCbrx7io/F3NgH2bWB9ClJ9KhW5XPl6QUPHc+5r6hmDkFsyHNLbvp0rPKfVWVWb0c8nKRXuf6fawTSTXLzb3AvUAn3wMA27YPAkd+gSzLWgl8WKK/9w8n/pVRmWQ+HSi5UGoKkFlGm3TLsoKBhsAe3Bn80ZZlPQ7EAo5lWV7btl8oebJt25OASb7N0m8UlFJKKVUPmS0bYe1q5KKrkJDQo44VO+5Nmbb6kvYt+/LZtj+fjAMFHF4l0iPQNDqU1NhQzm4ZTau4cLo3jSK8Cgl8SRKfiJxvuTcmSvsW6di9as9n5ntQkI9n9B+Pa3xw68XlfAvTpSfOa0/hPP9P9wJQ61p36UQ/McuWQFyiXy9APkFVp9w8B/jCsqw2lMGyrLZAY46eqa+SyiTz3wBtLctqhTvlfwlQuthsBnAVsBQYDSyybdsAR9Y9sizrAeBQ6UReKaWUUicmM+dDiIhEzhlyZF9hsWH62mympWXjLfp1/i6pQQjNG4Zxeko0zRuGkhobRrNqrDhTFhkwAvPFApwpk/Dc/xwSHFK555KxFfO/uch5w2rkZkvSvBWee57CzHwXM2c6Zu1qPH+cgPgh2TYH90PaKmTgyDq15n09cdzl5kBWJfq/FHcmvuRk9ijLsvoC64HbbNveduxTXRUm876gbgLm4tYKvW7bdpplWQ8BK2zbngG8Bky2LGsj7oz8JZUIvkyJiYnVOV0ppZRSgVZUCJdfDzGxEJcAwJrtB3hs4UY2ZefSt3UCZ50Uz0kJkbSMjyQipBaXJnzmbdiVCZERbnyV4RTAs29Ds1SoyWUUr7sdrroRsna6r1kQEJsANbnqT1gIPPkGJLeAUp+QKLAsa0WJzUm+ipHDqlNuXhmXAFeU2J4JvGfbdr5lWeOBt4B+5XVQqXXmbdueBcwqte++Et97gTEV9PFAZcYCyMqqzBsZpZRSStVVzjsvYb5cgGfiq+R5i5j83W5mr99HfGQw95zTjNNTon0t88nZn1/rS94Vv/48rFuD5+GXkNiEctuaNStxnn0QGXMNnkEj/RKPIQjz8WTM4lmQlILnmtuQVm1rpO/iR/4KRYUE3fdsjfR3IklOTsa27dPKaVKdcvNyWZbVFQi2bXvl4X22bWeXaPIKbv19ufSzFqWUUnWWyT2EM/9jnC8XBDoUVQXmwF7MlwuRM/qx/GAIN838hdnr93F+uzheGN6qRCIfOJ6Lr4XiQsy0t8ptZ4qLcezXoXFTpN/5fotHwsLxXDYez20PQb4X59E7cD56B1NUWK1+zY50+GU90rtyFyCr3zhSbm5ZVijuTPqMUm0Ol5vD0eXmFbkUeK/kDsuympbYvBBYW1EnlZqZV0oppWqT2ZGBWTQT89UiyPeCx4Np0wFpkhzo0FQlmIWfsCcogleThrDsswxSY8O4s28z2iVGBDq0I6RxMjLoIswsG3POEKRNh2O2M5/Pg+3b8Pz575Wur69WXB264XngOcyUVzGf2pgfVriz9M1Sj6s/s2wJiAcJwLr2J4LqlptblrUZiAFCffdeGlRiJRwLGFZqyFssy7oQKPL1dXVFMYoxdW7xGJOZWfrTC6WUUic6Ywys/Q5nwUz4YQUEByM9+yK9zsF56RGkWy88f9JbltR1xXk5zH3y/5jccjCFQaFc0jmRkR3iS93EqW4w+V6c+26AqGg8/3jqN+vGm9wcnH+Mh6bN8fz1XzV+99oK4/t2Gc7kFyEvBxkxFhk0skpr9RvHwbn7OmjSjKDbHvRjpPVXcnIyHLvmvd7QmXmllFIBZQryMcuWuDfjydwK0Q2RCy5Fzh2CxMQBIP0vwMyeihkyCmneKsARq7Js3Z/Pi3PW8VOr4XRuCDf0bUVyTN294FLCwpHR12AmPY75bB5y7tCjjptZH8ChA3isa2s9kQeQ7r3xtDnFvf5g2luYVUuRlJbgFIPjHPUwxrjfm8P7iqEgH7J3ISPH1nrsqvbozLxSSqmAMHuzMUtmYT6bA4cOQvNWyIAL3dn4kKPLGUzOIZy7/wRtOhB0870BiliVpbDY4YM0d7nJ8II8rj60igE3XBOQBLiqjDE4T/4D0jfjefj/jtyR1ezegXPfDUjPvniuuTXgMZqvl2BmvAcFBeDx/PoQz9HbpfdFN8Qz7q9ImN719Vh0Zl4ppZSqIvPLesyCGZiVX7oziN164RlwIbTtWGbyJ1ENkMEXYaZPxmz8scz6ZuV/xhj2eYvZsi+fzfu8bN6bT9quPHblFNI3KoerP3+C+BvuqBeJPICI4Ln0OpyHJmA+ege5/AYA98JYTxDyhysq6MH/RMS9gFUvYlXHoMm8UkqpWuN8Ngcz+SX3RkLnDUf6nY80SqrUudL/AszCmTjTJ+P56yP1Jlmsz/KLHLbtL2DLPi+b9+WzeV8+W/bmsz+/+EibuIhgWsaGMf60xnR7+W+Q1BiqeGfVQJNmqch552MWfYLpOxgK8jErv3TLveLKX7ZSqUDTZF4ppVStMUuXQLNUPHc9hoRX7db1EhaOnG9h3psEad9Cp1P9E+TvkDGGrNwiNu31ujPue/PZsi+fzIMFOL5q3NAgoUXDMHqmNKBlbBipvkfDcDeVMN8uw9mRgYy7vV6+0ZILL8Us/wznvUlQXAyx8cjgPwQ6LKUqpMm8UkqpWmFyc2DTT8iQUVVO5A+Tswdj5n3kzs537F4vk8a6ILewmI3ZXtZneVmfncf6rDz2en+dbU9qEEJqbBh9WkTTMi6MlrHhJDUIIaiMFWmMMThzpkFiE+S0s2rradQoiWyAXHQl5q3n3e0/3oqEhQc4KqUqpsm8Ukqp2vHTanAcpOPxz6hLSIg7g/rGs7BqKfToU4MBnpiKHcOWffmsy8pjQ7abvKfvLzhyr/nk6BC6JkVxcmIEJ8W7s+2RIZVf/hCADWmwaR1y2XgkqIrn1iHSpz9m6SL397T3uYEOR6lK0WReKaVUrTBp30J4BJzUrlr9SO9zMXM+xPnoHTzdetXr5NFfNu/1smjTfjZke9m4x0tBsZu6x4QFcXJCOGelxnByQjhtEyKIDqv+6+fM+dBdUvTM/tXuK5DE48Hzl4fBGMTjCXQ4SlWKJvNKKaX8zhiDWbMKTumKBFfvT494gvCMHIvzf49ili2p9wlkTfts8wGeX7YdY+Ck+HAGt43l5IQITk4Ip0mDkBovTTJbf4YfVrg3NQqt/8sf6ptDVd9oMq+UUsr/dmTAnt3IsDE101/3MyC1DWbGu5jTf7su/e+RYwz/XZ3F1LRsOjSK4M6+zYgN9/+feeej/0JkA6TfcL+PpZT6Lf0MSSmllN+ZtJUASA0tWSgieC66Avbsxnw2t0b6rM9yC4t55H8ZTE3LZmDrhjzUv0WtJPJm41p3Vn7IRUhklN/HU0r9libzSiml/M6kfQtJzZDEJjXX6SndoF1nzKfvY7x5NddvPbP9YAF3zt3CysxDXHdaE27slURIUO2s8uN89A7ExOqsvFIBpMm8UkopvzIF+bB+TbVWsTkWEcHzhyvg4H7Mwpk12nd98f2OHO6Ys5m9eUU82K8557eLq7XlOs3a1bDuB2TYGF3CUakA0mReKaWUf234EQoKajyZB5DW7aHr6Zi50zE5h2q8/7rKGMOn6/Zy/6JtxEYE8+8hLemSVHtlLsYYnOmTIS4R6Tu41sZVSv2WJvNKKaX8yqStguAQOLmTX/r3jBwL3lzM3Gl+6b+uKSw2vLR8B5NW7KRHcgMeH5xK0+jQ2g3i+xXwy3pk+MVISC2PrZQ6iibzSiml/MqsWQUnd0TC/LNsoaS0Qnr2xSycidm/1y9j1BX7vEXct3Ar8zbuZ3THBO4+p1nVb/BUTcZx3Fr5RklIH10WVKlA02ReKaWU35g9u2H7thpbxaYsMuJSKCrCfPq+X8cJpE17vPx19mY27vFy+5nJXNGtEZ5aqo8/yqqvIP0X5MJLq33PAKVU9Wkyr5RSym9M2rcASMcefh1HGicjZw3EfDYPs3uHX8cKhK+2HuCueVtwDEwcmErfljEBicM4xTgfvwtNmyOn9w1IDEqpo+lbaqWUUn5j0lZBbAIkN/f7WDL8EsxXizAz30Ouuc3v4/mLYwyZBwvYmO1lQ7aXDdl5rMvy0i4xgr/3bUZcROD+dJtlS2BHOp7xdyEevVOqUnWBJvNKKaX8whQXw4+rkR59amW5RIlLQPqdj5n/MWbwKKRZC7+PWROycwtZn+1lY7aX9dl5/JztJafQASAsSGgdH86lnRMZ1TGekKDAfaBuigoxM6dAi9Zw6hkBi0MpdTRN5pVSSvnHL+shL8fv9fIlyZDRmM/m4nz8DkE33F1r41ZWXqHDuqw81mfn+WbdvezNKwIgSKBlXBhnt4yhbUI4beLDad4wjCBPAOrij8F8sQCyduK5ZXytrWWvlKqYJvNKKaX8wqStAvG4d2qtJRIdgwwciZn5HuaXDUirtrU29rEUFhvWZ+fx/Y4cvt+Ry7qsPIqNe6xZTChdm0TSNjGctgkRtIoLIzSAM+/lMQX57sXFrdtDp5q/X4BS6vhpMq+UUsovTNq3cNLJSFSDWh1XBo3ALP4U5+XH8Pz5LiS1Ta2N7RjD5r35rPYl7z/uzsVbZBCgdXw4I06Jp0tSFG0TwmkQWn9qzs3/5sC+PXjG3a6z8krVMZrMK6WUqnHm4AHYvAG54NJaH1vCI/HcfC/Ofx7DefRvyMXjkHOG+iUJNcaw/WChm7zvzOWHnbkczC8GICUmlH4nNaRLUhSdG0fSIKz+JO8lGW8eZvZUOKUr0q5zoMNRSpWiybxSSqkaZ9Z+B8bUar18SXJSOzz3PoPz+tOY//4H1qfBlTci4ZHV7ju/yOGHnbmsyDjEysxD7Mpxa94TIoPp2SyKLk2i6JIUSUJkSLXHqgvMwplwcD+ekZcHOhSlAsKyrCHAs0AQ8Kpt24+WOh4GvA30ALKBi23b3mxZVgIwFegJvGnb9k0lzlkCNAXyfLsG2ba9q6y+yotPk3mllFI1b80qiIqGlrVX4lKaRMfguflezJxpmI/+i9m2Cc/1dyIpLavcV3ZuISsycvgm4xCrd+RQUGwIDxa6JkVxUYcouiRFkRwdcsKVoJicQ5i506Hr6chJ7QIdjlK1zrKsIOBFYCCQDnxjWdYM27Z/LNHsWmCvbdttLMu6BHgMuBjwAvcCnXyP0sbatr2i1L6y+iqTJvNKKaVqlDEG8+O3SIduAV+LXDweZNgYTOv2OK88gTPxr8hlf8ZzZv9yz3OMYWO2l28yDrEi4xCb9uYD0DgqhIGtG9IzJZpOjSMCulRkbTDzPoK8HDwjxgY6FKUC5XRgo23bmwAsy5oCjABKJvMjgAd8308FXrAsS2zbzgG+sCyrKrMaZfVlyjpBk3mllFI1K30z7N8LHevOqifSrrNbdvPKE5g3n8XZsAa5dDwSFnakTW5hMau357oJfOYh9nuL8Qi0T4zgym6N6NmsAc0bhp5ws+9lMQf2YRbOQE47C2neKtDhKBUozYBtJbbTgV5ltbFtu8iyrP1AApBVQd9vWJZVDEwDHvYl7FXuq04m84mJiYEOQSml1PEKDYJn3oaUlhBUh/7MJCbCoy/Dvj2Yfdlk5HhZs1dYsyuXNTsO8nNWDo6B6LAgeqXG0adVPL1T42gYcWLUvldZEPDYK5DcAkJ+p6+B+l2wLKtkqcsk27Ynldg+1rv30rPklWlT2ljbtjMsy4rGTeavwK2Vr3Jfdeh/2V9lZVX0RkYppVRdVfzEPZBzkKD7nwt0KEfkFzlsyPbyU1Ye67LyWLfjIPuL3L+Z4eJwcpMGjO6YQNekKE5pFHHkRk2FOfvJyglk5IFh9mbj3H0d0vNsPNfcGuhwlPKb5ORkbNs+rZwm6UDzEtspQGYZbdItywoGGgJ7yhvXtu0M39eDlmW9i1vO8/bx9FUnk3mllFL1k/Hmwca1yIALAheDMezKKWTtbl/inpXHL3vzcXxzW8nRofRo0ZB2EcW0XfgOzX9aRvB5Q5G+1yI6Aw3g3iDKGOSCSwIdilKB9g3Q1rKsVkAGcAlwWak2M4CrgKXAaGBReTXuviQ91rbtLMuyQoDhwILj6Qs0mVdKKVWT1v0AxUVILdbLFxYbftnrZe3uPNbuzuOnrDz25rnLRYYHezg5IZxRHRJo3yiCkxMjiCmx3rvpdAdm+mTMvOmYTevx3HA3Ev/7LvU0u3dgvpiPnD0IaZQU6HCUCihf3fpNwFzc4rPXbdtOsyzrIWCFbdszgNeAyZZlbcSdRT/yLtiyrM1ADBBqWdZIYBCwBZjrS+SDcBP5V3ynlNlXWcSYikp6ap3JzCz96YVSSqn6wHn3P5gvF+J55l2/zXIfzC9mXVaeL3nPZUO2l4Ji929Z46gQTmkUwSmNImjfKIIWDcOOlMyUx3y3DOfVp+GUrgTdeLdf4q4vnNefwaz4As+/XkbiEgIdjlJ+lZycDMeuU683dGZeKaVUjTFrVkH7LjWayB/wFrE84xA/+Wbe0w8UABAkcFJ8OIPbxrrJe2LEcd+oSbr1RgaNxMx8D7Ptl9/t6i1m+zbMsiXIgAs0kVeqntBkXimlVI0wuzJh9w5kwIU11ueWffk8uGgb2XlFNAj10D4xgnNbxXBKo0jaJoQTFlxz67xL/wswCz7G+fR9gsbfVWP91idmxnsQGooMHR3oUJRSlaTJvFJKqRph0r4FQDrVTL38mp25PPK/dMKCPTw6qAXtEiPw+HGNd4lqgPQbjvnUxmRsRZq18NtYdZHZugmz4gtkmIVENwx0OEqpSjqxb12nlFKq1pi0b6FREtI4udp9fbnlAPcv2kZcRDCPD07llEaRfk3kD5MBF0JYBGaW7fex6hKzJwvnnZcgMgoZPDLQ4SilqkCTeaWUUtVmigrhp+9rZBWbT9bt4d9fZNImPpxHB6XSKKr2louUBjFIv2GYbz7HbE+vtXEDyfnmC5wHb4bMrXiuuBGJbBDokJRSVaDJvFJKqerbuBbyvUjH7sfdhWMMb327i1dW7OL0lAY81L850SWWkawtMnAkhIRiZn1Q62PXJpObg/PaU5hJj0OTZnjuewY57axAh6WUqiKtmVdKKVVtZs0qCAqG9p2P6/zCYsMLy7azZPMBhraN5U+nNanUkpL+INENkXOHYubPwFxwcY2UDdU1Zv0anNeehn3ZyAWXIudbSFDtv3FSSlWfzswrpZSqNpP2LbQ5BQmPrPK5uYXFPLxkG0s2H2Bs10Su7xm4RP4wGfQHCA4+4WbnTVEhzrS3cJ64B4KD8dz5GJ4LL9VEXql6TGfmlVJKVYvZtwfSf0EuuqrK5+7NK+KhxdvYvC+fm3snMaB1rB8irDppGIf0HYxZ/Cnm/ItPiDuhmsytOK8+Cdt+ce/ual2LhEcEOiylVDXpzLxSSqlqMT/6lqSsYr18xoEC7py3hYwDBfzjnJQ6k8gfJkMuAk8QZvbUQIdSLcYYnIWf4Dz8F9ibjefGe/BceZMm8kqdIHRmXimlVPWsWQUxsZDSstKnrMvK4+El6Qjwr4EtaJtQ9xJLiU1Azh6I+WyeOzuf0CjQIVWZ2ZeN8+ZzkPYtdD4Nz1U3Iw3jAh2WUqoG6cy8Ukqp42acYsza75CO3RFP5f6kfJN+iH8s2EpkiIfHBqfWyUT+MBkyCgAzZ1qAI6k6s+ornAdugQ1pyNg/47n5Xk3klToB6cy8Ukqp47flZzh0ECqxvrxjDDN/2sub3+6iVVw4952bQmxE3f4zJPGNkDP7Y76Yhxk2BolLCHRIv2GMgT1ZkLkVk7kFMrZiMjbD1k2Q2gbPuL8gSSmBDlMp5Sd1+39RpZRSdZpJWwUiSIdu5bbbeaiA55ZuZ82uPHqlNOC2PslEhNSPD4dl6GjMlwswcz9ELvlTwOIwxsCBfW7SnrHFl7xvhcytkJf7a8PYeEhugYy6ChkwAgnWP/VKncgq9S/csqwhwLNAEPCqbduPljoeBrwN9ACygYtt295sWdbpwCRfMwEesG17ek0Fr5RSKrDMmlXQojUS3fDYx41h/s/7eW3lLgS4pXcS/U5qiEhgl56sCklsgvQ+D/PZXMyQUUhsfK2Ob378DmfWB5Cx2f0U5LAG0ZCcivQ+1/2a3AKatUCioms1PqVUYFWYzFuWFQS8CAwE0oFvLMuaYdv2jyWaXQvstW27jWVZlwCPARcDa4DTbNsusiyrKbDasqyZtm0X1fgzUUopVatMziHYtB4ZNvqYx/fkFfHisu2syMyhc5NIbundlMYNQmo5ypohw8Zgli7CzJuOWNfW2rjO0sWYt56D+EZI9zPcGfdmqdCsBUTH1qs3RUop/6jMzPzpwEbbtjcBWJY1BRgBlEzmRwAP+L6fCrxgWZbYtl3icz/CAVPtiJVSStU6482FzG2+8o5tbm12+mYwDnKMevnPNx/g5W92kF9sGNejMee3i8NTjxNPadwU6XUO5n+z3dn5GP8uo2mMwcybjpn6JrTvgueGu5GIqt+QSyl14qtMMt8M2FZiOx3oVVYb3yz8fiAByLIsqxfwOpAKXHGsWXnLsq4DrvOdX9XnoJRSqoaYgnzYkY7J2AoZW36tyc7e9Wuj0FBo2sJN4ludDG1OOXLoQH4xL3+zgy+2HKRtQji39mlKSkxYAJ5JzZNhYzDLlmDmfYSMvtpv4xjHwdivYRbORHqejfzxViSkfn6ioZTyv8ok88eaSik9w15mG9u2vwY6WpZ1CvCWZVmzbdv2lmxo2/Ykfq2t19l7pZSqZSZ9M85rT0HGVjCOuzMoGJKaIa3bw9mDkGYtIDkVEhsjnqDf9LEi4xAvLNvOwYJixnZNZFSHBII89Xc2vjRJSkF6no1ZMgsz+CIkOqbGxzCFhZjXn8as+AIZcCEy5ppKL/mplPp9qkwynw40L7GdAmSW0SbdsqxgoCH/z959x1dV5P8ff81J7x2SkEDovRcRK/aCoKsOyO6Ka/uua936VX/qWverW3R1dXVdddeyioOrKwg2BMsqItjonUBCAklISK/3zO+Pe4EYIQRIuPcmn+fjkUdyzp0z53MB4zuTmTlQ2ryBMWat1roaGAYsP+KKhRBCtCtbmI/78J0QEoKaon0LKXtBWkabdkKpafTw3JdFvL+5nF4JEdw1OZs+yZHHoPJjT52nscs+wS6ci7roR+3at62pxv3r72D9StQlP0GddaHMiRdCHFJbwvwyoL/WujewA5gBzGzRZi4wC1gCXAIsMsZY3zV5vqk3vYCBQG57FS+EEOLo2KJC3IfvAKVwfvkAKr3HYV2/alcNjy4ppKSmkR8MSWbmiFTCQjrvSLLq0RM1ZhJ20TzsWReiYmLbpV+7pxT30XugcDvqqp/jTJzcLv0KITq/Q37H9c1xvwF4F1jrPWVWa63v1VpP9TV7FkjRWm8CfgHc6jt/It4dbL4B3gB+Zowpae83IYQQ4vDZ0mLviHxTI84v7mtzkC+qamTuulJue28bdyzcjqPgd2f2ZNbobp06yO+lpmioq8V+MLdd+rM783Ef/A0UF+LceJcEeSHEYVHWBtwUdVtQ0HIWjxBCiPZk95Ti/uE2qKzA+eX9qF59W22fX17PkrxKluRVsbnUu+wpJzGCE3rGMXVwMpGhnT/EN+f56+9g3UqcB59BRccccT92y3rcv9wLysG56S5UTv/2K1IIcUiZmZlw4LWfQUMeCyeEEF2MrSz3jsiXl+H8/N4DBnlrLVGlfowAACAASURBVJtLvQH+87xK8isaABiYGsms0Wkcnx1HRlz4sS49YDjnT8f9+nPsordQU6YfUR92xTLcvz0ECck4t9yN6pbZzlUKIboCCfNCCNGF2Ooq3EfugpJdODf/1rtTjY/HtawrqfUG+O2VFNc04SgY1j2a8wcmcVxWLCnRskUi4P0BaMR47PtvYvsPhYQkiE+EqOg2LVp1//s+9sUnILsPzk13ouKTjkHVQogjobU+B3gUCAGeMcY82OL1COAFYCywG5hujMnVWqfgff7SeOCfxpgbfO2jgTlAX8ADzDPG3Op77QrgD3jXqQI8box5prX6JMwLIUQXYetqcB+9GwrzcK6/AzVwOJX1Hr4urOargiq+KqymvM5DmKMYlRHDZSNiGZ8VR3zE97ehFOBMmYH70G9w/3j7/pOhYRCfAHGJEJ/ofbhUfII36Md5j+3GNdh5r8CQ0TjX/S8qUh4GJUSg0lqHAE8AZ+LdvXGZ1nquMab5w1OvAsqMMf201jOAh4DpQB1wJ96dHIe16PqPxpjFWutw4AOt9bnGmLd9r726N/i3hYR5IYToAmx9Pe5j9+Ju30LurNv4yvbky3e3sXF3La6FuHCH0RmxHJcdy5jMGKLDJMAfiurdH+f+p2BXAbZiD1TugQrvh60sh/JSbN4WqCwHjwfY/yAVddwpqCtuQoXKbzqECHATgE3GmC0AWuvZwDSgeZifBtzt+/o14HGttTLGVAP/1Vr3a96hMaYGWOz7ukFr/RXerd+PiIR5IYTo5MqravnqhZf5OnQEX596ORVbHBQl9EuJ5NJhKYzNjKVfcmSnesDTsaJSu0Nq91ZXz1nXhdrqfUEf14WBw+VhUEIEhx5AXrPjfOC4g7XxbcdeDqQAh9zBUWudCFyAdxrPXhdrrU8GNgA/N8bkHfBin4AM86mpqf4uQQghglZFXSO5pbUs376HJbmlrN1VhU04gcTuIUzslczEnCQm9EwiSea/CyEEWuvmDzN92hjzdLPjA/2s3nIryLa0OdB9Q4FXgMf2jvwD84BXjDH1WuufAs8Dp7XWT0CG+ZIS2YpeCCFaU9/kUljZwI7KBgoqGiiobGBHRSMFlQ1U1nundCigv6cUvX05YyYMpf8Zp+0bfffUlFNS48c3IIQQASAzMxNjzLhWmuQD2c2Os4CWe6jvbZPvC+gJQGkbbv80sNEY8+e9J4wxu5u9/ne88+9bFZBhXoijZVd/jd29C3XS2fI4dBG0PK6lqLqRHb6wXlCxP7yX1DR9p21yVCiZcWEcnx1LZlw4mbFhDHz/BeI+fw+lr8I583Q/vQshhAhqy4D+WuveeHeYmQHMbNFmLjALWAJcAiwyxrQ6Mq+1vh9v6L+6xfkMY0yh73Aq3ge2tkoeGiU6HVu8E/eem6G+FnWeRl34Qwn0ImBZaymtbfKF9UbfCLs3vO+sbMDT7Ft0TJhDZnw4PeLCyYwPJzMunB7x4aTHhX1nwap1PdiXnsR+8h7qwh/hnK/98M6EECLwteWhUVrr84A/492a8jljzANa63uB5caYuVrrSOBFYDTeEfkZzRbM5gLxQDiwBzgLqMA7x34dUO+7zePGmGe01v+HN8Q3+fq6zhizrrX6JMyLTsW6Lu6f7oDtm1HDx2GXfYKaMh01daYEeuFXHtdSWNnAlrJ68srr9420F1Q2UNe0//twmKO8I+vxYb7P+8N7fETIIf8d27pa3Gf+BN9+gTpP41z0o45+a0IIEbTkCbBCBBi7eD5sWIWadSNq0ukQEYl961VQCjW15W/FAp+trIC8LdjKctT4E1GObBcYDOqaXLbtqWdLaR1by+rZWlZH7p56GnzD7I6CbjFh9IgPZ2i3aDJ8I+yZceGkxoTiHOEPnra0GPcv98OObajLrsU5bUp7vi0hhBABSMK86DTszh3Y15+H4eNQJ5zhHcH88fVgXey82bgonKmX+bvMA7KuC8U7vcE9bys2byvkbYU9zdbBNDWhTpB5z4FmT20TW8r2h/YtZfUUVDTs28YgJtyhd1IkZ/dPpE9SJL2TIsiKDycspH23JbS5G3EffwAa6rxPFB02tl37F0IIEZgkzItOwboe3H8+CqHhOJdfv28qgnIcuPxGsGDnvYKrFM4FM9rnnvm5uK+/ANWVEB2DioqBqBiIjoGoaN/nGFR07P7j6BgIi4CiAu/DZPYG9/xcqK/zduw4kJGNGjQcsnqjsnvjvvYP7II52ONPldF5P7LWklfRwJqiGtYU1bKmqIbiZgtRu8WE0jspkpN7xdM7KYLeSZGkxYR2+BQv++WnuM89AnGJOD//PapHzw69nxBCiMAhYV50Cva9/8Dmdairf4lKTPnOa8pxYNYNYC127sveQD9l+pHfq6Ee+9ar2Pfe8Ib3nn2gqhJbvAtqqqCmGjz7A16rq1KioiErB3XCGZDtDe5k9kSFhX+nmXP+dNynHsQu+y/quFOOuHZxeDyuZUtZHWuKalldVMPa4loqfNs+JkaGMKRbNBekRtEnOYLeiZHERhzbH7Sstdi3X8O+8SL0HYTzs9tR8YnHtAYhhBD+JWFeBD27Yzv2zX/BmONRE04+YBvlhMAVN3oD/Zv/8gb6I9jhw675Bvelv0LxTtQJp6Mu+QkqNv67bayFxgaorfEG+5oqqK3B1lZ7j+trUanpkN3b++TItozajp4ImT2x8w12/Eny5MgOUt/ksr6kljXF3lH39SW1+xanpseGMa5HLEO7RTEkLZqMuDC/Lqq2jY3YF5/ALlmEmnAK6oobv/dDoBBCiM5PwrwIarapyTu9ICoG54fXtRqulBMCP7kJsNj/vOQN9Odd2rb7VFZg5zyLXbIYumXg/OI+1OCRB76PUhAe4f1ISNp//rDeWcvaHdR5l2Kf+RN8vQTGnnAUvYnmdtc0sjS/iqV5lawqqqHJ9f5d9UqM4LQ+CQxJi2ZItyhSAuhpqbayAvfJ38HGNd6dmqZMl92ahBCii5IwL4Kaffs12L4Z57pb2zS9wBvob/aO0L/xojfQn3vJwfu3FrtkMXbOs1Bb4923/vxLUeER7fk22kSNP9G7kPctgzNmkoS3I7R33vvSvEqW5lexcbd3rUJmXDhTBiYzvHs0g9KiiA0PzLUJtjAf9y/3Qtlu1DW/wjnIb6OEEEJ0DRLmRdCy2zdj57/qnWIwZlKbr1NOCFx5i3dR7OsveAP9ORd/v/+iAtyXnoS133rnI//4elSPXu35Fg6LckJQ512C/cej8O0XMOo4v9USbFxrWV9Sy9K8KpbmV1JQ2QjAgJRIfjwqjYlZsWQlHPsf0A6XXfMN7lMPQWgozq8eQPUd5O+ShBBC+JmEeRGUbGMj7nN/htgE1MxrD/v6/YHexf77eW+gP/sH3r6bmrDvveHdnz40FPXDn6JOPicg5qmrCaf4RudfxRk5QUbnW9HgcVmxs4al+ZV8kV/FnjoPIQqGp8cwdVAyE7JiA2rqzKG4H72DffkpyMjGufFOVEo3f5ckhBAiAEiYF0HJznsFdmzDuekuVEzcEfWhQkLgql94+3vtn7hKofoOxn3xCdixDcZMwrnsmu/tjuNPKjQUde4l2BefgNVfgewlfkBf5Ffy588KqW50iQx1GJsZw8TsOMZkxgTs9JmDsa4HO+ef2IVvwrCxONf+GhUV7e+yhBBCBAgJ8yLo2M3rsO+87n0w1PBxR9XXvkDvutg5/8AqBQnJONffjho1sZ0qbl9q0mnY+a96R+eHjpHR+RYWbSnnL58X0icpkpkjUhmRHt3uD2g6VmxdDe7f/wQrlqFOvwB16ZXef7NCCCGEj4R5EVRsQ7334VBJKajpV7dLnyokBK7+JcQnQGgY6oLLAnrkU4WGoc65GPvy32D9Shg0wt8lBYw315by3FdFjEiP5raTexAdFrzB15YW4/7lPijYjpr5U5zJ5/m7JCGEEAFIwrwIKvaNl2DnDu/WkO0YuFVoKGrmT9utv46mTjwTO38O7luvEiJhHmst//q2hDmrd3N8dhy/PCEjaEfjAezWDbhPPAAN9Tg33oUaNsbfJQkhhAhQwft/O9Hl2A2rsB/MRU0+76B7vHcVKiwcdfZFsH4ldtOaY35/29iALSrArluB3V18zO/fnMe1PPnFLuas3s1Z/RL49YmZwR3kl/8X9w+3Q1g4zq2/lyAvhBCiVTIyL4KCravF/cej3iemXnyFv8sJCOrkc7Bvv+Ydnb/lnnbr13o8sKcUyoq9Qb2sBEpLsL7PlJVAZfn+C0JDUedcgjrvkmP+BNJGj8sjnxXy6fZKLh6SzI9HpQXtGgJrLXbBHOx/XoJ+g3F+djsqLsHfZQkhhAhwEuZFULD//ifsLsL59f+hIiL9XU5AUBERqDMvxL7+PHbrBlTvAUfcl7UWO2829pP3oLwMrPvdBlExkJwKSamonH6QlArJqaiEZOxnH2Dfmo1d+iHOzJ8es5Hk2kaXBz/O55udNfxkTBoXDg6cXYcOl21sxL7wOPbzxaiJp6Iuv+GY/2AkhBAiOClrrb9raMkWFBT4uwYRQOyab3AfuQt11oU4l17p73ICiq2rwb31Gug3mJAb7jiyPjwe7ItPYD9dCMPHoXr19Yb25FRITvOG9sjW1yfYNd/gvvw32LUDxk7CmX4NKqnjwnVFvYf7FuexqbSO649L54y+h376b6CylRW4f/0dbFqDmvZD1Pk6aH+7IIQQwSYzMxMgqL/pSpgXAc02NeHecxO4HpzfPoYKD/yndB5r7luzsW++jHPnn1E9+xzWtbahHvfpP8C3X6AumOHdyecIg6RtbMS++zp2wRxwQlDTZqJOm9LuWynurmnkt4vy2FnZyK9OzGRi9pE9ZyAQ2MI87441e0pRP7kFZ/yJ/i5JCCG6lM4Q5oN3lZjoEuxH78DOfBx9lQT5g1CnTYGoaNz55rCuszVVuH/+rXcP85k/xZk686hGhFVYGM6U6Tj3PA4DhmLNs7j3/xy7ae0R99nSjooGbn1vGyXVTdw1OSu4g/yar3H/7zdQX4fzqwckyAshhDgiEuZFwLLVldi5L8PgkTBivL/LCVgqOtYb6L/6DLtje5uusXtKvTumbNmAuubX7bqHuUpLx7nxTpzrboXqKtyH/hf3hcexVRVH1e/m0jpue28bdU2W+8/oyYj0mHaq+NhzP3wb99F7IDkV5/Y/ovoM9HdJQgghgpQsgBUBy86bDbU13lF5mUPcKnXGVOzCedgFBnXNr1pta3cV4D5yF1RV4tx0F2rIqPavRykYMwlnyGjvwtqFb2K/XoK6+ArUpNNRzuGNI6zcVc0DH+4gNtzh7tOzyYpv/9/S2MoK7PL/otJ7QHZvVGx8+/VdWwPbNmG3bsRuXA0rl8PwcTjX/uqQ6xGEEEKI1kiYFwHJFuZhF89HnXI2KivH3+UEPBUbjzr1XOx7/8FecJk3kB6A3bYZ99G7wVqcX92PyunfsXVFRqEu/Qn2+Mm4/3oK+/xfsJ8uxPnJzahumYe83lrLgg17eO6rItJjw7jn9GxSo8PavU5rLe6zf4LVX7NvFVFyKmT3QWX3RmX3huw+3q1RD/GDpW1qgh3bsFs3QO4G7JYNsDMf9q5P6paBmjLdu0bBCd4n1AohhAgMsgBWBCTPo/fA5nU4Dzwle223ka3Yg3vb1aixJ+Jcecv3X1/7rXfXlJg4nFvuOWjg77D6XBe7ZDHWPAtJKTh3PIwKPXgwr6hr4rHPd7JsRxXjMmO4eVIm8REdE37dxQuwLz+FuuQKVHYfbN5WyNuC3b4Fdu7Yv1VnVLR31D67j+9zb4iMwm7dCLkbvQF++xZobPC2j42H3gNQvg9y+rXriL8QQoij0xkWwMrIvAg4duWXsOpL1KVXSpA/DCo+0fsgqUVvYS+YgUpL3/ea/fJT3Gf+BN174NxyNyrx2O/JrhwHdcLp2JhY3CcewL7zOmrK9AO2Xbmrmoc/LaSi3sPVY7sxZWBSh021sjt3YF97DoaORp11EUqp70w9sg31sGM7Nm+LN+DnbfXux99Qz3eGQsLCoVdf1CnnQp8BqJz+bRrJF0IIIY6GhHkRUGxTE+6c57xTEU4739/lBB119kXYD9/Gvv0a6vIbAO9iS/vyU9B3EM4Nd6JiYv1b46jjUONOxM5/FTt2Eioje99rHtcye2UJc1btJiMunDtPzaJPcsc9JMx6PLjPPQKh4ThX3HTA4K3CI6B3f1Tv/VOSrOuBop3eEfzaalROP8jshQqVb6lCCNHZaK3PAR4FQoBnjDEPtng9AngBGAvsBqYbY3K11inAa8B44J/GmBuaXTMW+CcQBSwAbjbGWK11MvAqkAPkAtoYU9ZafbKbjQgo9uN3oDAP59IrW52CIQ5MJaagTjwT+9ki7O5i3LmvYP/1pHex5S33+j3I76UuuwbCI3Gf/wvW9U5hKapq5Pb3t2NW7ea0Pgk8fG5OhwZ5APv2HNi6AfWj6w7rtxXKCUGl98AZfyLOyWejevaVIC+EEJ2Q1joEeAI4FxgCXKa1HtKi2VVAmTGmH/AI8JDvfB1wJ3CgnSmeBK4F+vs+zvGdvxX4wBjTH/jAd9wqCfMiYHi3onzFuxXlyAn+LidoqXMuBsD9w23Yea+gjj8N57rbUBGBs0+/ik9CTb8aNq/DfriAz7ZXcMvbW9m2p55fnpDJTcdnEBXWsd+ebO5G7FuvoiacjDP+pA69lxBCiKA1AdhkjNlijGkAZgPTWrSZBjzv+/o14HSttTLGVBtj/os31O+jtc4A4o0xS4wxFu+o/oUH6Ov5ZucPSsK8CBh23myoqZatKI+SSklDTToNdhehzr4I9ZObA3LUWB0/mfoh4/jrN3t46JMCMuPC+fN5OZyc0/ELRG1DPe6zj0BcImrmTzv8fkIIIYJWDyCv2XG+79wB2xhjmoByoLVf9/bw9XOgPrsbYwp9fRUC3Q5VYOD9Hx5ITU31dwniWGtsgAs0zLwaktP8XU3w+/lv4fr/hYgof1dyUJtLqrlr4Cxyy2r50eBErjl9CKEhx2h8obQEbv0ddM8E2eddCCG6NK318maHTxtjnm52fKDRxZZbQbalzdG0b1VAhvmSkhJ/lyCOMc9j98KmNTgP/A3lyqh8u6ms9ncF32Ot5Z2N3r3jo8Mcfpu0g5FP/obShp/jTJzc8fdf8w3uI3ehTpuCc9m1UFXT4fcUQggRmDIzMzHGjGulST6Q3ew4C2i5h/reNvla61AgASg9RJ9ZB+lzl9Y6wxhT6JuOU3So9xCQYV50LXbVl7ByOerSn8hWlJ3chpJaZq8s4cuCasZkxHDzpAwSwvvgfvsO9tVnsEPHdOi/AVtThfvPxyC9B+oHszrsPkIIITqNZUB/rXVvYAcwA5jZos1cYBawBLgEWOSbC39AvqBeqbWeCCwFLgf+0qKvB32f3zxUgTJnXviVbWrCNXu3opzi73JEB3Ct5Yv8Sm5/fxu/fncb64pruXJMN+6cnEViZCjKCcG5/EaorcXO/nuH1mJf/huUl+Jc+YuAWhAshBAiMPnmwN8AvAus9Z4yq7XW92qtp/qaPQukaK03Ab+g2Q40Wutc4GHgCq11frOdcK4DngE2AZuBt33nHwTO1FpvBM70HbdKngAr/Mpd9Bb2ladxrv9/qFHH+bsc0Y4aPS4fbq3gP2tLya9oIC06lKmDkzmjbwLRYd9/kqs7bzZ27svevfBHjm/3etxl/8U+/XvUBZfhTL2s3fsXQggRfOQJsEIcBdmKsnOqqvfwzsY9vLW+lLI6D72TIvjFpAxO6BVPqHPw75fq3Iu9T6r915M4A4aiotpvYardsxv70l8hpz/qvEvbrV8hhBDC3yTMC7/ZvxXllbIVZSdQVNXI3HWlvL95D3VNltEZMfx8SDIjuke36e9XhYbhXH4D7oO/wb7+POqH17VLXdZa7zz5pgacq34ekNt0CiGEEEdK/q8mjor1eFAh358yccjrCvOxHy5AnXQWKqt3B1QmjpXNpXW8sWY3n26vRAEn5cRz0eBkcpIO/+mtqs9A1OlTsQvfxI4/GTVg6FHXZz96G1Z/jZr5P6j0rENfIIQQQgQRCfPiiNiaKuzcV7AfLoCEZFTfQdB3MKrvQMjqfcjRT3fOcxAegbrwh8eoYtGeKuqa+HR7JR/nVrCmuJaoUIepg5KZMjCJtJiwo+pbXfhD7Def477wOM5vH0WFhR9xX3ZXAXbOP2DIaNSp5x1VXUIIIUQgkjAvDot1XeynC7GvvwDVVaiJp0BjI3bzWlj2ifeJB+HhkDMA1Xcgqu9g6DMIFbf/qZ6yFWVwqmty+SK/io9zy/mqoBqPhaz4cGaNTuPsfonEhB/+b2gOREVE4vz4etxH7sLOm436weVH1I/1eHCffRhCw3CuuEmmcgkhhOiUJMyLNrNbN+C+/DfI3Qj9BuNcdi2qZ9/9r5cWYzevh81rsVvWY9/7D9bzb++L3Xug+gyEfoOwC+fJVpRBosm1fFNYzUe5FSzNq6TeY0mJDmXqoGROzomnd1JEh4RkNWQU6oTTse++jh13Iqpnn8Puw749B7ZuQF3zK1RSa0/VFkIIIYKXbE0pDslWlGFffwH76QfeKTWXXIE67pRDhjjbUA+5m7Cb13lH7resh8pyAJzrb0eNmngsyheHybWWtcW1fJxbwafbK6ms9xAX7jCpZzyn5MQzuFsUzjEY5bbVVbh3/QwSU3Bu/2OrazNsYwMU5GHzt0LeVmx+LmxcjRp7As61v+7wWoUQQgSnzrA1ZZvCvNb6HOBRIAR4xhjzYIvXI4AXgLHAbmC6MSZXa713s/twoAH4tTFm0SFuJ2E+QNimJuyH873bRzY0oM64ADVlOiryyLYMtNZCcSHsKWuXhY2i/Vhr2Vxaz6fbK/gkt4LimiYiQhTHZcVxck48ozJiCAs59t/r7Jef4j71EOriWTjnXOw9V17mC+xbIS/X+3lnPriu96LwCOjRC9V7AGraTFR07DGvWwghRHDoDGH+kNNstNYhwBN4n0KVDyzTWs81xqxp1uwqoMwY009rPQN4CJgOlAAXGGMKtNbD8D49q0d7vwnR/uzab3Fn/x0KtsPQ0TgzrjnqnUCUUtAt0/sh/K7JtazaVcPS/Eq+yK+ipKaJEAWjM2L48ag0JmTFERXm54dEj5kEoydi576CZ803kJ+777c7ACSnehdcj5qIys6BrN7QLR3ltM/8fSGEECLQtWXO/ARgkzFmC4DWejYwDWge5qcBd/u+fg14XGutjDFfN2uzGojUWkcYY+qPunLRIezuYuyc57Bffgqp3XGuvx1GHieLBzuJmkYPXxdU83l+FV8WVFHd4BIeohidEcMPR8Yxrkcs8RGBE4SVUjgzf4r7pzugpho1Yjxk9/ZuZ5qVg4qRUXchhBBdW1vCfA8gr9lxPnDcwdoYY5q01uVACt6R+b0uBr4+UJDXWl8LXOu7vs3Fi/ZhrfXON17+Cfa9N8DinZ5w1kWo8Ah/lyeOUmltE8vyq1iaX8m3O2toci3xESFMzIrjuOxYRqXHEBHq5xH4VqjEZELu+6u/yxBCCCECUlvC/IGGZFtOtG+1jdZ6KN6pN2cd6AbGmKeBpw/St+gAtr4O1q3ErlyGXfkllBZ7XxgzyftE1pRu/i1QHDHXWnLL6vm6sJql+ZWsL6kDID02jPMHJHJcdhyDUqMIceS3LUIIIUSwa0uYzweymx1nAS1XqO5tk6+1DgUSgFIArXUW8AZwuTFm81FXLI6YLSrErvwSu3IZrF8FTY0QEQmDR6LOvxQ1bBwqOdXfZYrDZK2loLKRFTurWbGrhpW7aqis9wDQNzmSH45I5bjsOHomhMt0KSGEEKKTaUuYXwb011r3BnYAM4CZLdrMBWYBS4BLgEXGGKu1TgTmA7cZYz5tv7JFW9jGRti4GrtyuXf0fdcO7wvde6BOPRc1fBz0H4oKO7ondopjr6SmkRU7a/YF+N01TQCkRIcyvkcMw7vHMCI9mtRo+bsVQgghOrNDhnnfHPgb8O5EEwI8Z4xZrbW+F1hujJkLPAu8qLXehHdEfobv8huAfsCdWus7fefOMsYUtfcbEV62tAS7yhfe134L9XUQGgYDh6Emn48aPgYlu8kEnYq6JlbuqmHFLm+AL6hsBCA+IoTh3aMZkR7NiO4xZMSFyei7EEII0YXIQ6M6CbthFe4rT3u37gNITkONGIcaNg4GDUdFRPq1PnF4rLXkVzSwNL+KL/Ir2VBShwWiQh2GdY9iePcYRqZH0zMx4pg8wEkIIYTojLrEPvMi8FnXxX3pSaiv9T6dddg4yMyWEdog43EtG0pq+dwX4PeOvvdLjuSyEamMyoihX3KkLFwVQgghxD4S5juDbz6HwjzU1b/EOe4Uf1cjDkN9k8s3O6v5Ir+KZflVlNd7CHVgWPcYpg5KZnxWrMx7F0IIIcRBSZgPctZa3AWvQVo6atyJ/i5HtEF5XRPLdlTxRX4VXxdW0+CxxIQ5jM2MZUJWLGMyY4gJD5wHNwkhhBAicEmYD3arv4Ztm1CX34AKkQAYaKy17KpqZG1xre+jhu3lDQCkRodyZt8EJmTFMbRbNGEhMn1GCCGEEIdHwnyQc9+eA4kpqImT/V2KwDvvfWtZPWuLa1jjC/Bltd5tI2PCHAalRXFyTjxjM2PpnRQh6xqEEEIIcVQkzAcxu3ENbFiNmn617BXvJ7WNLutLallTXMPa4lo2lNRS1+TdIapbTBgjukczOC2KwWlRsvOMEEIIIdqdhPkg5i6YA7HxqJPO8ncpXdKW0jruWpRHZb0HR0FOYgSn901kcGoUg7tFycJVIYQQQnQ4CfNBym7bDKu+RF34I9lD3g+2ltVx1wfbiQx1+MXkLAalRREdJmsWhBBCCHFsSZgPUu7bcyAqGjX5fH+X0uXkltVx5wd5hIc63H9GT9Ljwv1dkhBCCCE6iNb6HOBRIAR4xhjzYIvXI4AXgLHAbmC6MSbXOXVabwAAIABJREFU99ptwFWAB7jJGPOu1nog8GqzLvoAdxlj/qy1vhu4Bij2vXa7MWZBa/VJmA9CtjAPvlqCOvcSVHSMv8vpUrbvqeeuD/IIdxQPSJAXQgghOjWtdQjwBHAmkA8s01rPNcasadbsKqDMGNNPaz0DeAiYrrUeAswAhgKZwEKt9QBjzHpgVLP+dwBvNOvvEWPMH9tao3Pkb0/4i3373xAWhjpjqr9L6VK2l9dzxwfbcRzF/Wf0JEOCvBBCCNHZTQA2GWO2GGMagNnAtBZtpgHP+75+DThda61852cbY+qNMVuBTb7+mjsd2GyM2XakBUqYDzK2ZBd26Yeok85GxSX4u5wuI7+8njsXbscB7j8jm8x4CfJCCCFEF9ADyGt2nO87d8A2xpgmoBxIaeO1M4BXWpy7QWu9Qmv9nNY66VAFBuQ0m9TUVH+XELgcCw8/D1m9ICQg//o6ne1ltdy1eAuO4/CXi4eTkxzt75KEEEII0U601subHT5tjHm62fGB9pS2LY4P1qbVa7XW4cBU4LZmrz8J3Odrdx/wJ+DKgxZPgIb5kpISf5cQkOyeUtzbrkEdPxnn8hv8XU6XUFDRwP9buB2Pa7n/zJ7EujWUlNT4uywhhBBCtIPMzEyMMeNaaZIPZDc7zgIKDtImX2sdCiQApW249lzgK2PMrr0nmn+ttf478Nah3oNMswkiduGb4PGgzvmBv0vpEgorG7hj4XaaXMt9Z/SkZ0KEv0sSQgghxLG1DOivte7tG0mfAcxt0WYuMMv39SXAImOM9Z2fobWO0Fr3BvoDXzS77jJaTLHRWmc0O7wIWHWoAiXMBwlbXYn98B3U+BNR3TL9XU6nt9MX5Btcy32nZ9MrUYK8EEII0dX45sDfALwLrPWeMqu11vdqrffuRPIskKK13gT8ArjVd+1qwABrgHeA640xHgCtdTTeHXJeb3HL32utV2qtVwCTgZ8fqkZlbctpP35nCwpa/vZCuHNfwc57Bee3j6GycvxdTqe2q6qB//f+dmqbXO47vSd9kuWhXEIIIURnlJmZCQee2x40AnLOvPguW1eD/WAejJwgQb6DFVU1csfCPGokyAshhBAiCMg0myBgP3oXaqpwzrvU36V0asXVjdzxwXaqGzzcc1o2fSXICyGEECLAych8gLONDdj3/wODR6L6DPR3OZ2Oay1rimpZvLWcz7ZXAnDPadn0T4nyc2VCCCGEEIcmYT7A2U8XQnkZztW/9HcpnUp+RT0fbqngo9xyiqqbiAx1mNQzlmmDkslJkhF5IYQQQgQHCfMBzDY1Yd95HfoOgoHD/V1O0Kuoa+KTbZUs3lrOxt11OApGpsfwo5FpHJcdR2SozDoTQgghRHCRMB/A7Bcfw+4inMv+B6WCeqG13zR6XJbtqGLx1gq+3FGFx0LvpAh+MiaNk3MSSI6S/wSEEEIIEbwkyQQo67rYt1+DrBwY0dqDyURL9U0ua4tr+Wx7Jf/dXkF1g0tSVCgXDEpmcu94mUYjhBBCiE5Dwnyg+vpz2JmPuvbXMip/CB7Xsrm0jhU7a/h2ZzVri2tpdC0RIYqJ2XFM7pPAiO7RhDjy5yiEEEKIzkXCfACy1uIuMNAtEzV2kr/LCTjWWnZUNvBtoTe8ryqqobrBBbxTaM4bkMjI9BiGdo+WefBCCCGE6NQkzAeilcth+xbUrBtRToi/qwkIpbVNrNhZzbc7q/m2sIbdtU0AdIsJY1J2HCPTYxieHk1ipPyTFkIIIUTXIcknwNimRtw5z3lH5See6u9y/Ka8rolVu2pY6fvIr2gAIC4ihBHdoxmZHsPI9GjS48L9XKkQQgghhP9ImA8wdtF82LkD58Y7UaFh/i7nmKms97CqyBvcV+2sYVt5PQCRoQ5Du0Vxet8ERqXHkJMUgSNrCIQQQgghAAnzAcVWlGHfmg3DxqJGjPd3OR2qqsHDmqL9I++5ZfVYICJEMTgtipNz0hieHk3f5EhCZeGqEEIIIcQBdckw7770V2howLnyFn+X8h329Re9dU2/yt+ltCtrLUXVjawvqWN9SS1ri2vZWlaHayHMUQxKi+KyEakM7x5N/5QowkIkvAshhBBCtEWXC/O2qQn7+UfQUIedolHdMv1dEgA2dyP2sw9QZ16ISs/ydzlHpa7JZfPuOtaV1LK+pJYNJbWU1XkACA9R9E+J5NJhKQzvHs3A1CjCQ2THGSGEEEKII9HlwjzbNkF9LQD2w7dR2v+j4NZ1cWf/HeISUFOm+7ucw2KtZWdVI+tLallXXMuG3bVsLavHtd7XM+LCGJkew8C0KAamRtErMUKmzQghhBBCtJMuF+btuhXeLwaPxH66EDvth6gI/z4R1C79CDavQ11xEyoq2q+1tEVFXRNfFVbzVUE13xRWU17vHXWPDHUYkBLJxUNSGJgaxYDUSBJkq0ghhBBCiA7T5ZKWXb8SsnJwLrgM9/e3Ypd+hDr5bP/VU1eD/ffzkNMfdfxpfqujNa61bNpdx1cF1XxZUMXG3XVYID4ihNEZMQztFs3A1EiyEyLkKatCCCGEEMdQlwrztrEBNq1FnXIO9BsMWb2xi+djTzoL5aftDu2COVBeinPdrSgncOaOV9R7+Lqgiq8KqvnaN/qugP4pkcwYnsrYHjH0TY6UbSKFEEIIIfyoS4V5Nq+DxgbUoBEopVCnnY994XHYuAYGDD3m5diiAuz7b6KOn4zqO+iY3785j2vZUvbd0XfX7h99H5MZw5iMGOJl2owQQgghRMDoUsnMrlsBjgMDhgGgJpyCfe0f2MXzUX4I8655DkLCUD+Ydczv7XEtW8vqWVVUzcqdNawprqWm0UUB/VIi0cNSGJMZS7/kSJk6I4QQQggRoLpemO/Vb98iUxURgTrxTOwH87B7dqMSU45dLau+gm+/QP1gFioxucPv53Et2/bU73tI05qiGqobXQAy48I5qVc8w7pHMzI9WhatCiGEEEIEiS6T2mxdDeRuRJ110XfOq1POxb7/Jvbjd1FTZx6bWpqacF99BrploM6Y2iH3cK0lt6yeVb6nrK4uqqG6YW94D+OEXnEM7x7D0G5RpESHdUgNQgghhBCiY3WZMM/GNeDxoAaN+M5p1S0Dho3Ffvwu9rxLUaEdH2zt4vmwMx/nhjtRYe1zP9d6R95X7dof3qt84T0jLoxJ2XEM6x7N8O7REt6FEEIIITqJLhPm7boVEBoKfQd/7zVn8vm4j92D/WoJasLJHVtHRRl23iswbAyMGHfE/dQ1uWzwPahpbbH3Sat7p82kx4YxMTuO4d2jGdotmrQYCe9CCCGEEJ1R1wrzfQahIiK+/+LQ0ZCW7h0x7+gw/8ZL0FCPo68+rO0wd9c07gvua4tr2VJWt+8pqz0TwjmxVzyD06IY1l3CuxBCCCFEe9FanwM8CoQAzxhjHmzxegTwAjAW2A1MN8bk+l67DbgK8AA3GWPe9Z3PBSp955uMMeN855OBV4EcIBfQxpiy1urrEmHeVlVA3lbU1MsO+LpyHNTk87HmWez2zaiefTumjtyN2E8Xos6chsrIOng735SZNcX7R96LqhsBCA9RDEiJ5AdDUhicFsWg1ChiI0I6pF4hhBBCiK5Max0CPAGcCeQDy7TWc40xa5o1uwooM8b001rPAB4CpmuthwAzgKFAJrBQaz3AGOPxXTfZGFPS4pa3Ah8YYx7UWt/qO/7f1mrsEmGeDavA2u/Nl29OTTod+5+XsIsXoGbd2O4lWGtxZ/8dYuNR508/YJvS2iYWbyln4eZyCiobAEiKDGFQWjRTBiYxOC2K3kmRhIXIVpFCCCGEEMfABGCTMWYLgNZ6NjANaB7mpwF3+75+DXhca61852cbY+qBrVrrTb7+lrRyv2nAqb6vnwc+JBjDfGpqavt2OO54ePQlyO4NB5vakpoKfzVQXQHJyd796NtTdSXceDukdIPY+H2nmzwuS3LLmLd6F5/nluKxMCIznh9P6MnY7EQy4yP89nRaIYQQQojOTmu9vNnh08aYp5sd9wDymh3nA8e16GJfG2NMk9a6HEjxnf+8xbU9fF9b4D2ttQX+1uye3Y0xhb6+CrXW3Q5Vf0CG+ZKSlr9xODqeO6+H1G6E3Hx3q+1sfi7uPTejLvkJztkXtdr2cNi6Wtw7r4OEZJzb/4iqayC/op6Fm8pZvLWcPXUeEiNDmDY4mdP7JpAV75vX31jF7t1V7VaHEEIIIYTYLzMzk73z1Q/iQCOqto1tWrv2BGNMgS+sv6+1XmeM+fjQFX9fOw8/Bx67ZzfszG91is1eKqs3DBiK/ehtrOs5ZPs217BgDuwppV5fywdbK7j1vW1cP28rb64rZUBqFLef0oNnL+rHrNHd9gd5IYQQQgjhb/lAdrPjLKDgYG201qFAAlDa2rXGmL2fi4A38E6/Adiltc7w9ZUBFB2qwIAcmW9Pdt1KANSgkW1qr049H/v072HVVzBi/NHfvzCPDUuW8/6JN/Lfrx3qmnaSGRfOrFFpnNongeSoTv9XIIQQQggRrJYB/bXWvYEdeBe0tnzK6FxgFt658JcAi4wxVms9F3hZa/0w3gWw/YEvtNYxgGOMqfR9fRZwb4u+HvR9fvNQBbYpSR7pljxa6xS8CwHGA/80xtzQlvu1q3UrIDoWsnPa1FyNnohNSMZdPJ+Qowzztq6Wz16cw+9H/YyIEDihZxxn9k1gcFqUzIMXQgghhAhwvjnwNwDv4s3BzxljVmut7wWWG2PmAs8CL/oWuJbiDfz42hm8i2WbgOuNMR6tdXfgDa01eLP4y8aYd3y3fBAwWuurgO3ApYeqUVnbctrPd/m25NlAsy15gMuab8mjtf4ZMMIY81PfljwXGWOm+37aGA0MA4a1MczbgoKWv704cp5br4aefQj52e1tvsadNxs792Wc+59Cdc88ovtaayl/5jFuCp1ESkIMD1wwkOgw2UJSCCGEECJQZGZmwoHntgeNtsyZ37cljzGmAdi7JU9z0/BunwPekfjTtdbKGFNtjPkvUNduFR8GW7wTdhe1ab58c+rksyEkFPvhgiO/94cLeKayG9XhMdw8uY8EeSGEEEII0e7aEuYPtCVPj4O1McY0AXu35GkTrfW1WuvlLbYGOmp23QqAww/zCUmosZOwn36Aras9/PtuXsfS9z/jk+6juXR4GjlJkYfdhxBCCCGEEIfSljnzR7MlT5v49tbcu79mm687pHUrICEJMrIP3bYFNfl87BcfY5d+hDrlnDZfZysrKH/2MZ4acCW9E8K4ZFg775kvhBBCCCGET1tG5o9mSx6/sdZi161ADRxxZItN+w6Cnn2wi+dzqHUF++7penCf+RPPpZ1IZXgsN03qQagT1NOwhBBCCCFEAGtLmN+3JY/WOhzvCt25Ldrs3UYHmm3J035lHoHCPKjYA4OGH9HlSinUqefBjm2wcXWbrrFvvcrynbV81G0MFw9NoU+yTK8RQgghhBAd55Bh3jcHfu+WPGu9p7xb8mitp/qaPQuk+Lbk+QVw697rtda5wMPAFVrrfK31kHZ+Dwdk1x7ZfPnm1IRTIDoWu2j+oe+36kuq3n6Tp4bPpFdiOFqm1wghhBBCiA52yK0p/aBdtqb0PPE7yNtCyIPPHFU/7px/YBe+ifPgs6ikA6/ptbuLce+7hccHXMKHiYP5w9k59EuRUXkhhBBCiEDWVbamDDrW9cCGlUc1Kr+XOvVcsBb78TsHfN02NuL+7SG+is1hUcJgfjAkRYK8EEIIIYQ4JjplmCdvK9RUw+CRR92VSkuH4eOwH72DbWz83ut2zrNUb9/Ok8Nnkp0Qzozhbd6RUwghhBBCiKPSKcP8vv3lBx7Z4teWnMnnQ2U59qvPvnPeXfoRdvECXjjlZ5R5QrhpYgZhIZ3yj1QIIYQQQgSgTpk87boVkJGNSkxunw6HjIJumdjF+xfC2oLt2Bce59uhp/O+m86Fg5MZkBrVPvcTQgghhBCiDTpdmLdNjbBhNeoIt6Q8EOU4qMnnweZ12G2bsXU1uE8+SG10An/teS494sO5bITsXiOEEEIIIY6tThfm2boRGurbZfFrc2rSaRAegV38FvaFJ2BXAS+e+XNKal1unJhOuEyvEUIIIYQQx1iovwtob3bdClAK2mm+/F4qOhY1cfK+XW1WXXAd7xSHMG1QEoPTotv1XkIIIYQQQrRFpxtOtutWQHYfVExcu/etJp8HSlE78niecAeQERfGD0emtft9hBBCCCGEaItOFeZtfT1sWdfuU2z2Ulk5OHc9ysvjZ1FU3ciNEzOICO1Uf4RCCCGEECKIdK4kunkNNDV1WJgHWBPWjfmbKjh/YBJDu8n0GiGEEEII4T+dKszbdSsgJAT6D+6Q/vMr6nns80LSY8P48SiZXiOEEEIIIfyrUy2AtetWQk5/VGT7jph7XMtb68t46dtiwkMUd5yaRaRMrxFCCCGEEH7WacK8ramG3E2o8y9t134LKxt4bEkha4prGd8jlp8dl05yVKf5YxNCCCGEEEGs86TSjavBuu02X961lrc37OH5r4sIdRQ3H5/B5N7xKKXapX8hhBBCCCGOVqcJ83bttxAWDn0GHnVfu6oa+MvnO1m5q4bRGTHcMDGd1OiwdqhSCCGEEEKI9tN5wvy6FdBvMCos/Mj7sJb3NpXz3FdFKOD649I5s2+CjMYLIYQQQoiA1CnCvK3YAzu2ocafdMR9FFc38vjSnXxTWM2I7tHcODGDbrEyGi+EEEIIIQJX5wjz61cBHNF8eWsti7aU88yXRXhcy/+M7845/RNxZDReCCGEEKLL01qfAzwKhADPGGMebPF6BPACMBbYDUw3xuT6XrsNuArwADcZY97VWmf72qcDLvC0MeZRX/u7gWuAYl/3txtjFrRWX+fYX3HdCoiMgpz+h3XZ7ppGHvgon8c+30lOYgSPnt+b8wYkSZAXQgghhBBorUOAJ4BzgSHAZVrrIS2aXQWUGWP6AY8AD/muHQLMAIYC5wB/9fXXBPzSGDMYmAhc36LPR4wxo3wfrQZ56Cwj8+tWwIBhqJCQtrW3lo9yK/j78l00eCxXje3GlIES4oUQQgghxHdMADYZY7YAaK1nA9OANc3aTAPu9n39GvC41lr5zs82xtQDW7XWm4AJxpglQCGAMaZSa70W6NGizzYLyDCfmpra9saeJrj9QUhKhfjEVpu61vLFtj3M/noHy7bvYWh6HHecNYCeSVFHWbEQQgghhAhGWuvlzQ6fNsY83ey4B5DX7DgfOK5FF/vaGGOatNblQIrv/Octru3R4t45wGhgabPTN2itLweW4x3BL2ut/oAM8yUlJW1u6372AfYfj+Lc9Sgqu/cB29Q1uSzeUs5b68vIr2ggMTKEK8d4R+NDPNWUlFS3V+lCCCGEECJIZGZmYowZ10qTA03bsG1s0+q1WutY4N/ALcaYCt/pJ4H7fO3uA/4EXNlKfYEZ5g+H/XopxCVAj17fe62oqpH5G8p4f/Meqhtc+iZHcsvxGZzYK46wkM6xXEAIIYQQQnSYfCC72XEWUHCQNvla61AgASht7VqtdRjeIP8vY8zrexsYY3bt/Vpr/XfgrUMVGNRh3u4uhm+/QJ19EcrxhnNrLWuKa5m3royl+ZUAHJ8dxwUDkxiUFiV7xgshhBBCiLZaBvTXWvcGduBd0DqzRZu5wCxgCXAJsMgYY7XWc4GXtdYPA5lAf+AL33z6Z4G1xpiHm3ektc4wxhT6Di8CVh2qwOAO8x+9DYA65RwaPS6fbKvkrfWlbC6tJzbc4cLByZw3IIm0GNkvXgghhBBCHB7fHPgbgHfxbk35nDFmtdb6XmC5MWYu3mD+om+BaynewI+vncG7sLUJuN4Y49Fanwj8GFiptf7Gd6u9W1D+Xms9Cu80m1zgfw5Vo7K25bQfv7MFBS1/e3GARo0NuL+5kup+w1lw0lW8vbGMPXUesuLDuWBQEqf2TiAyVKbSCCGEEEKIA8vMzIQDz20PGkE7Mm+XfwpVFTzRawqfryxhbGYMUwclMzI9WqbSCCGEEEKILiF4w/zi+eT2Gsnn5SHMGJ7CZSPS/F2SEEIIIYQQx1RQzkOxWzfA1g28PngqUaEOUwYm+7skIYQQQgghjrngDPOL57MjIYtP6+I4b0AicRFte/KrEEIIIYQQnUnQhXlbWY5d9gn/Hq0JC1FMGyyj8kIIIYQQomsKvjD/yXvsDI3nY5XOOf0TSYgM2mn/QgghhBBCHJWgCvPW48F+9A5vjLiYEKW4UEblhRBCCCFEFxZUYZ4VyyipbmBxdD/O6JtASrQ8DEoIIYQQQnRdQRXm3cXz+U//c7BK8YMhKf4uRwghhBBCCL8KmjBvC/Mo27yZhamjmdwngW6xMiovhBBCCCG6tuAJ84vnM7fnqTThcMlQGZUXQgghhBAiKMK8ra2h/IulvNtjEiflxJMRF+7vkoQQQgghhPC74AjzSxbxVtpY6lQolwyTUXkhhBBCCCEgCMK8tZaqjxayoOfJHJ8dR8+ECH+XJIQQQgghREAI+DDPuhUsCMuhxglHy6i8EEIIIYQQ+wR8mK9e9A7zsk9mXEY0fZIj/V2OEEIIIYQQASOgw7zdXcS7u8OoCo1Gj0jzdzlCCCGEEEIElIAO83UfvsOb2ScxMiWUgalR/i5HCCGEEEKIgBKwYd42NvD+hlLKw+OYPjrT3+UIIYQQQggRcAI2zDd88V/e6D6RIbEuQ7tH+7scIYQQQgghAk7AhvlFyzdTGpGIHt/T36UIIYQQQggRkAIyzDduXs/rMUPpH1bHqIwYf5cjhBBCCCFEQArIMP/Rx99SFJXMpeOyUEr5uxwhhBBCCCECUkCG+X////buPFiysj7j+HeYgWFR1kJ0QLZA2FHBQgyyKBCxSIAYfVgiAlIhYhwtiSKKyBJSEYOAKUQdQ0VECPUUylJqHFMxIgxaMBBWSQjIhGW0UjCAgA46w80f79uTTnPn3h5mbp8+t59PVdfcPn3Oue/cp07377z9nvcsex3b8jz7bJebREVERERErMysflaSdBjwRWAm8A+2P9fz+mzgG8DewFPA0bYX1dc+BZwMLAc+Ynv+ZL9v8fqbc/rus9MrHxERERGNmoo6eGX7lLQdcA2wKXAncLzt307Uvkl75iXNBL4EvAvYFThW0q49q50MPG17B+Bi4IK67a7AMcBuwGHAZXV/E9pq2bO8dc9tJ1stIiIiImLKTEUdPMk+LwAutr0j8HTd94T6GWazD/CQ7Z/XM4NrgCN71jkSuKL+fC1wsKQZdfk1tl+0/QjwUN3fhN67zSzWSq98RERERDRrKurgcfdZt3lH3Qd1n0dN1sB+htlsCTzW9fxx4C0rW8f2MknPApvV5T/t2XbL3l8g6RTglLo9R737D5m1Vor5iIiIiJhakhZ2PZ1ne17X86mqg8fb52bAM7aXjbP+SvVTzI9XVY/1uU4/21L/aJ0/3NgzS57qo1kREREREa/cnDlzsP3mCVaZijp4vJExfdfNvfoZZvM48Pqu51sBi1e2jqRZwEbAkj63jYiIiIgYRlNRB69s+ZPAxnUfK/tdL9NPz/ztwI716tonKAP5j+tZ50bgBOAnwHuAH9oek3QjcLWki4A5wI7AbX38zoiIiIiIpk1FHTxjvH3Wbf6t7uOaus8bJmvgpD3zddzOh4H5wANlke+XdJ6kI+pqlwObSXoIOA04o257P2DgZ8D3gb+0vXyy3xkRERER0bSpqINXts+6r08Cp9V9bVb3PaEZY2OTDsUZtLHFizMSJyIiIiKm1pw5c2D8seqtMZR3gI2IiIiIiMmlmI+IiIiIaKkU8xERERERLZViPiIiIiKipVLMR0RERES0VIr5iIiIiIiWSjEfEREREdFSQznPfNMNiIiIiIiRkXnm17AZw/qQdEfTbcgj+Y3yIxm2+5H82v1Ifu17JLO+H602jMV8RERERET0IcV8RERERERLpZhfNfOabkCsluTXfsmw3ZJfuyW/9klmI2AYL4CNiIiIiIg+pGc+IiIiIqKlUsxHRERERLRUivmIGCqSWj9NWETEIOT9MiDF/MtI2klS/i4tJOk4SW+oP+cNrr1y/EU0KJ+BEe0yq+kGDAtJhwLnAz8GPgW81GyLol+SDgHOBnYCTgfutp0ru1tG0uHAqcA9kr5re0HTbYr+SToKOBg42/aSptsTq0bSEcAOti9qui0xOUmHUd4v75V0ve2FTbcpmjPSs9nU3ttZwFnAscAnbX+7+/UUhcOpZrcucAXwGuBvgSOB+2xfJmmm7eVNtjH6J2lv4MvAOcCGwDuAW21/XdJatnNyPaTqsfgnwN8ArwY+ClyXzNpB0izgryiF4dbAXrbvynvo8KnH2mzgK8AOwOcp75WzgbNsP9lg86JBI/1Vmu0x27+j9MJf2ynkJe0vae1mWxcTqdn9BrjK9kG25wO3AsfX1/Mh1C6HADfb/h5wA/BLYK6kjWy/lGFTw6t2ePwceBulkH8fsFWjjYq+2V4G/CewM3Aa8NW6PO+hQ6Z+7i2lvEceaPtG4NvAjBTyo20ke+YlfQTYA7jd9jxJrwU+B4wBbwYWAU8DN9m+PD30w6Mru9tsf61r+UxgX+Ak4FzbjzXUxOhDb46S9gGuBPa1/bSks/i/3vkzm2xrvJykE4DFtv+lPp9Vi0IkmXJifZnt3zbYzFiJevzNAe60bUlr144tJD0CnGn76u7l0ZzevLqWC/gScB9wCzDf9i3NtDKaNHI985JOBI4DvgX8maTPAC8C1wPrAO8Fjqivv1vS1inkh0NPdu+T9GlJ28OKXqRfAW8AnmmskTGpcXI8k3IC/QPgSkk3A9tTTrA3lbRBQ02NHpI2kXQtJZsv1JNogO5vT74I/DGwe8+2+XalYZJmSPoYcDSwEDi3Ho+bdK12GvB3ACnkm7WyvCRtUVf5H0qnx6HAL4ATJW3eTGujSSNXzFMu0LrA9vcp4wRnA39vPBfsAAAHa0lEQVRh+3rgFNv/UYv3eyhFYd7MhkdvdutQvtIHwPa9wG+AY5ppXvSpN8d1gffbngt8CDjP9knAUmBd2y8019ToZvtpyknXLsAdwGe7Xhur/y4A7gLeJWlnSad0vx7NqRm8HfiM7WuBj1E6QN7Ztc51wIOSPg4rJhiIBkyQ12H19R/Zvrd+K3YPsD7lMzBGzMgU811Tbf078EcA9ervBcB2kvbrKRpOANajDLeJBk2Q3U+BOZL2q+vNoBQa66YXcPhMcgzuKOltth/tDN0ADgceHnxLYzxdx9Q3bD8DXEb59nKbel3DzK6ML6HMCnYT5QL19MwPWO/fuyubhcD+APWE+kFgN0k7da1+KvB5Sb8EthxAc0feKua1i6Tf79nFOykdICnmR9C0LeYl7Sfp9zrPu2ZWWACsJemA+vw+YDFlPBqS/lTS3ZSv+U+tF5vEAK1idr+gZld7MV4DvJBewOa9gmPwdXW7AyTdBOxImbUhGjBOfp2e96X139uBf6bMYoPt5bWo3wK4FPgh8Ebb53dvHwOzXveTruPvIeDVkvaoz28CNqLMRISkNwJfowyD28v2FYNp7shb1bw2lLSOpOMl3QNsA5yRC5dH07SbZ17SXpTxnAcCb+1a3pne7r+A+4GjJS2w/Xi9ALZzNvsg8EHbPxlw00feamT3667dfDwX3TVrDRyDi4AP2b5/sC0PmDC/GZRZM7qnnLwUsKTdKON3XwU8Csy1/ejgWh0dkvYFPgH8StI/Af9qe3nXRcq3AXsCh0p6wPbPJG1JmfxhIfAU5fi7t6n/wyhZjbz2tr1Q0mOUjsfcl2OETZtivk4leSmwN2Wu6qXAQcCdPfPlPgfcTLnB0IWSTqdc/HM7rBh3HQO0BrJ7qrOvFPLNWYPHYIrABvSZ35ik9YCZtp+3/aik64B7KR0hx9l+hFLQx4BJOgi4CPgC8HrKNUV3SlrSmW3I9kOSbqdcu3IG5WaJLwL/XV9/DMhsYAOwhvL60eBbHsNmOg2zmU25e+v+tr9DmXt1l3p2uxxA0rnA1cCzlAu3NqEUFc9Sbj4UzUh200NybLd+8jsbuIoyDBFJx1IuWr4Q2MP2nY20PDr2pEy5fBXwTWBt4PnOtymSzpd0OeXi5b8H9pF0B7AEmN9Qm0fZ6uT1g4baHEOo1T3z9eupJbYfpIyTvqrr5ZnActvL6tfDe1DG4J5h++G6/QeADWw/N+i2j7pkNz0kx3Z7BfntBHyikx/wCHBQ7Y2PAevJD8rJ2DmSFlNOsh4ALpM0n9Lbvj3wWduL6vbHAbPqBc0xxZJXTJVW3jRK0saU3qEDgAuAi22/0D2mU9IOlAvtdna5Cc2KGz8pt4dvTLKbHpJju62B/LqHTcWAjZPfJbafr6/tA3wQ+K7tb0k6mXJDvUtt313XyfE3QMkrplpbh9lsQPlKcG79+QBYcavjl1SmdFpU1zmw8xrkoBgCyW56SI7ttrr5pZBvVm9++3desH0bsDl1TDVlVqGNqdMs5/hrRPKKKdWaYl7S+yUdKGlD208A8wBTLtJ6i6TO1JKd2RbWrZsu7SyH/zfdUwxIspsekmO7Jb92W4X8ZgO3UoZtQLlwctO6XvIbkOQVgzTUw2zqh8drKRfMvUS5gcwGwEdtP1nX2Q8Q5SKSb9ZlM+vUTlcCD9s+p4n2j7JkNz0kx3ZLfu22ivkttH1lXbYbcHbd9nfAh20/MPj/wWhJXtGUoe2Zrx8mY5QbWTxh+2DKmesSyhkusOLW4YuAnSVtJGn9rq+AP5APocFLdtNDcmy35NduryC/nSRtLGk9l3s0nACcaPvgFIZTL3lFk4auZ17SLOA8ykwK3wM2BN5j+4T6+gzK3SKPsX1TXfYqytyrf0C5C9qbbC9uoPkjLdlND8mx3ZJfu61mfvsBW1Pu3PpEA80fOckrhsFQ9cxLOpAyn+omlFsY/zXlK6e31yu+OxdhnUe5qUnH4ZQz4Lspcx3nQ2jAkt30kBzbLfm12xrI7y5KfikMByB5xbAYtnnmXwIu7BpH9iZgO8rNZb4M7F1nWbiOcrBs6zL/6lLgENs/bqbZQbKbLpJjuyW/dkt+7ZK8YigMVc885QzXkmbW5wuArW1/HZgpaW69snsrys1MFgHYviEHReOS3fSQHNst+bVb8muX5BVDYah65m3/umfRocA99eeTgD+X9B3KXQjnwYpp1IZr4P8ISnbTQ3Jst+TXbsmvXZJXDIuhKuY76lnuGLAFcGNd/BzwaWB34JHOGLMcFMMl2U0PybHdkl+7Jb92SV7RtKEs5inj0NYBngT2lHQJ8BQw1/YtjbYsJpPspofk2G7Jr92SX7skr2jU0E1N2SFpX8pd0W4F/tH25Q03KfqU7KaH5Nhuya/dkl+7JK9o0rD2zAM8DpwJXGT7xaYbE6sk2U0PybHdkl+7Jb92SV7RmKHtmY+IiIiIiIkN29SUERERERHRpxTzEREREREtlWI+IiIiIqKlUsxHRERERLRUivmIiIiIiJZKMR8RERER0VIp5iMiIiIiWup/AYxgq1zaUg6wAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 864x432 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [ "source": [
"ret_df = pd.DataFrame({'returns': rets, 'turn_over': turn_overs, 'leverage': leverags}, index=ref_dates)\n", "ret_df = pd.DataFrame({'returns': rets, 'turn_over': turn_overs, 'leverage': leverags}, index=ref_dates)\n",
"ret_df.loc[advanceDateByCalendar('china.sse', ref_dates[-1], freq)] = 0.\n", "ret_df.loc[advanceDateByCalendar('china.sse', ref_dates[-1], freq)] = 0.\n",
...@@ -185,7 +332,7 @@ ...@@ -185,7 +332,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.6.5" "version": "3.6.8"
}, },
"varInspector": { "varInspector": {
"cols": { "cols": {
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 1,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -43,7 +43,7 @@ ...@@ -43,7 +43,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 2,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -108,7 +108,7 @@ ...@@ -108,7 +108,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 3,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -139,7 +139,7 @@ ...@@ -139,7 +139,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 4,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -170,7 +170,7 @@ ...@@ -170,7 +170,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 5,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -217,17 +217,17 @@ ...@@ -217,17 +217,17 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 10,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"ref_date = '2017-01-31'\n", "ref_date = '2011-01-01'\n",
"ref_date = adjustDateByCalendar('china.sse', ref_date).strftime('%Y-%m-%d')" "ref_date = adjustDateByCalendar('china.sse', ref_date).strftime('%Y-%m-%d')"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 11,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -241,10 +241,12 @@ ...@@ -241,10 +241,12 @@
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"%%time \n",
"\n",
"regression_composer_sk.train(ref_date)\n", "regression_composer_sk.train(ref_date)\n",
"regression_composer_tf.train(ref_date)\n", "regression_composer_tf.train(ref_date)\n",
"print(\"\\nSklearn Regression Testing IC: {0:.4f}\".format(regression_composer_sk.ic(ref_date=ref_date)))\n", "print(\"\\nSklearn Regression Testing IC: {0:.4f}\".format(regression_composer_sk.ic(ref_date=ref_date)[0]))\n",
"print(\"Tensorflow Regression Testing IC: {0:.4f}\".format(regression_composer_tf.ic(ref_date=ref_date)))" "print(\"Tensorflow Regression Testing IC: {0:.4f}\".format(regression_composer_tf.ic(ref_date=ref_date)[0]))"
] ]
}, },
{ {
...@@ -271,15 +273,30 @@ ...@@ -271,15 +273,30 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 23,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 01:20:50,287 - ALPHA_MIND - INFO - Starting data package fetching ...\n",
"2019-02-10 01:20:51,440 - ALPHA_MIND - INFO - factor data loading finished\n",
"2019-02-10 01:20:57,333 - ALPHA_MIND - INFO - fit target data loading finished\n",
"2019-02-10 01:20:57,914 - ALPHA_MIND - INFO - industry data loading finished\n",
"2019-02-10 01:20:58,312 - ALPHA_MIND - INFO - benchmark data loading finished\n",
"2019-02-10 01:21:00,613 - ALPHA_MIND - INFO - data merging finished\n",
"2019-02-10 01:21:00,670 - ALPHA_MIND - INFO - Loading data is finished\n",
"2019-02-10 01:21:00,687 - ALPHA_MIND - INFO - Data processing is finished\n"
]
}
],
"source": [ "source": [
"start_date = '2011-01-01'\n", "start_date = '2011-01-01'\n",
"end_date = '2012-01-01'\n", "end_date = '2012-01-01'\n",
"\n", "\n",
"data_package2 = fetch_data_package(engine,\n", "data_package2 = fetch_data_package(engine,\n",
" alpha_factors=[kernal_feature],\n", " alpha_factors=regress_features,\n",
" start_date=start_date,\n", " start_date=start_date,\n",
" end_date=end_date,\n", " end_date=end_date,\n",
" frequency=freq,\n", " frequency=freq,\n",
...@@ -310,9 +327,86 @@ ...@@ -310,9 +327,86 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 24,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 01:21:00,967 - ALPHA_MIND - INFO - 2011-01-04 full re-balance: 789\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:17: FutureWarning: \n",
"Passing list-likes to .loc or [] with any missing label will raise\n",
"KeyError in the future, you can use .reindex() as an alternative.\n",
"\n",
"See the documentation here:\n",
"https://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:35: FutureWarning: \n",
"Passing list-likes to .loc or [] with any missing label will raise\n",
"KeyError in the future, you can use .reindex() as an alternative.\n",
"\n",
"See the documentation here:\n",
"https://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike\n",
"2019-02-10 01:21:01,961 - ALPHA_MIND - INFO - 2011-01-04 is finished\n",
"2019-02-10 01:21:01,977 - ALPHA_MIND - INFO - 2011-04-07 full re-balance: 779\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:17: FutureWarning: \n",
"Passing list-likes to .loc or [] with any missing label will raise\n",
"KeyError in the future, you can use .reindex() as an alternative.\n",
"\n",
"See the documentation here:\n",
"https://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:35: FutureWarning: \n",
"Passing list-likes to .loc or [] with any missing label will raise\n",
"KeyError in the future, you can use .reindex() as an alternative.\n",
"\n",
"See the documentation here:\n",
"https://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike\n",
"2019-02-10 01:21:02,027 - ALPHA_MIND - INFO - 2011-04-07 is finished\n",
"2019-02-10 01:21:02,053 - ALPHA_MIND - INFO - 2011-07-04 full re-balance: 796\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:17: FutureWarning: \n",
"Passing list-likes to .loc or [] with any missing label will raise\n",
"KeyError in the future, you can use .reindex() as an alternative.\n",
"\n",
"See the documentation here:\n",
"https://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:35: FutureWarning: \n",
"Passing list-likes to .loc or [] with any missing label will raise\n",
"KeyError in the future, you can use .reindex() as an alternative.\n",
"\n",
"See the documentation here:\n",
"https://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike\n",
"2019-02-10 01:21:02,157 - ALPHA_MIND - INFO - 2011-07-04 is finished\n",
"2019-02-10 01:21:02,191 - ALPHA_MIND - INFO - 2011-09-27 full re-balance: 784\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:17: FutureWarning: \n",
"Passing list-likes to .loc or [] with any missing label will raise\n",
"KeyError in the future, you can use .reindex() as an alternative.\n",
"\n",
"See the documentation here:\n",
"https://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:35: FutureWarning: \n",
"Passing list-likes to .loc or [] with any missing label will raise\n",
"KeyError in the future, you can use .reindex() as an alternative.\n",
"\n",
"See the documentation here:\n",
"https://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike\n",
"2019-02-10 01:21:02,307 - ALPHA_MIND - INFO - 2011-09-27 is finished\n",
"2019-02-10 01:21:02,340 - ALPHA_MIND - INFO - 2011-12-27 full re-balance: 795\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:17: FutureWarning: \n",
"Passing list-likes to .loc or [] with any missing label will raise\n",
"KeyError in the future, you can use .reindex() as an alternative.\n",
"\n",
"See the documentation here:\n",
"https://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:35: FutureWarning: \n",
"Passing list-likes to .loc or [] with any missing label will raise\n",
"KeyError in the future, you can use .reindex() as an alternative.\n",
"\n",
"See the documentation here:\n",
"https://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike\n",
"2019-02-10 01:21:02,432 - ALPHA_MIND - INFO - 2011-12-27 is finished\n"
]
}
],
"source": [ "source": [
"rets1 = []\n", "rets1 = []\n",
"rets2 = []\n", "rets2 = []\n",
...@@ -330,7 +424,7 @@ ...@@ -330,7 +424,7 @@
" \n", " \n",
" ## sklearn regression model\n", " ## sklearn regression model\n",
" \n", " \n",
" raw_predict1 = regression_composer_sk.predict(ref_date).loc[codes]\n", " raw_predict1 = regression_composer_sk.predict(ref_date, x=data_package2['predict']['x'][py_ref_date])[0].loc[codes]\n",
" er1 = raw_predict1.fillna(raw_predict1.median()).values\n", " er1 = raw_predict1.fillna(raw_predict1.median()).values\n",
" \n", " \n",
" target_pos1, _ = er_portfolio_analysis(er1,\n", " target_pos1, _ = er_portfolio_analysis(er1,\n",
...@@ -348,7 +442,7 @@ ...@@ -348,7 +442,7 @@
"\n", "\n",
" ## tensorflow regression model\n", " ## tensorflow regression model\n",
" \n", " \n",
" raw_predict2 = regression_composer_tf.predict(ref_date).loc[codes]\n", " raw_predict2 = regression_composer_tf.predict(ref_date, x=data_package2['predict']['x'][py_ref_date])[0].loc[codes]\n",
" er2 = raw_predict2.fillna(raw_predict2.median()).values\n", " er2 = raw_predict2.fillna(raw_predict2.median()).values\n",
" \n", " \n",
" target_pos2, _ = er_portfolio_analysis(er2,\n", " target_pos2, _ = er_portfolio_analysis(er2,\n",
...@@ -363,7 +457,6 @@ ...@@ -363,7 +457,6 @@
" result2 = pd.merge(target_pos2, dx_returns, on=['code'])\n", " result2 = pd.merge(target_pos2, dx_returns, on=['code'])\n",
" ret2 = result2.weight.values @ (np.exp(result2.dx.values) - 1.)\n", " ret2 = result2.weight.values @ (np.exp(result2.dx.values) - 1.)\n",
" rets2.append(np.log(1. + ret2))\n", " rets2.append(np.log(1. + ret2))\n",
" ## perfect forcast\n",
" \n", " \n",
" alpha_logger.info('{0} is finished'.format(ref_date))" " alpha_logger.info('{0} is finished'.format(ref_date))"
] ]
...@@ -377,9 +470,32 @@ ...@@ -377,9 +470,32 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 25,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x210a0c51588>"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 864x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [ "source": [
"ret_df = pd.DataFrame({'sklearn': rets1, 'tensorflow': rets2}, index=model_dates)\n", "ret_df = pd.DataFrame({'sklearn': rets1, 'tensorflow': rets2}, index=model_dates)\n",
"ret_df.loc[advanceDateByCalendar('china.sse', model_dates[-1], freq).strftime('%Y-%m-%d')] = 0.\n", "ret_df.loc[advanceDateByCalendar('china.sse', model_dates[-1], freq).strftime('%Y-%m-%d')] = 0.\n",
...@@ -414,7 +530,7 @@ ...@@ -414,7 +530,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.6.5" "version": "3.6.8"
}, },
"varInspector": { "varInspector": {
"cols": { "cols": {
......
...@@ -13,9 +13,17 @@ ...@@ -13,9 +13,17 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 1,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Using TensorFlow backend.\n"
]
}
],
"source": [ "source": [
"%matplotlib inline\n", "%matplotlib inline\n",
"\n", "\n",
...@@ -44,7 +52,7 @@ ...@@ -44,7 +52,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 2,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -88,7 +96,7 @@ ...@@ -88,7 +96,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 3,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -119,7 +127,7 @@ ...@@ -119,7 +127,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 4,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -150,7 +158,7 @@ ...@@ -150,7 +158,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 5,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -197,17 +205,17 @@ ...@@ -197,17 +205,17 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 9,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"ref_date = '2017-01-31'\n", "ref_date = '2011-01-01'\n",
"ref_date = adjustDateByCalendar('china.sse', ref_date).strftime('%Y-%m-%d')" "ref_date = adjustDateByCalendar('china.sse', ref_date).strftime('%Y-%m-%d')"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 10,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -217,14 +225,28 @@ ...@@ -217,14 +225,28 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 17,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Optimization finished ......\n",
"\n",
"Sklearn Regression Testing IC: 0.9434\n",
"Keras Regression Testing IC: 0.9439\n",
"Wall time: 29.2 s\n"
]
}
],
"source": [ "source": [
"%%time\n",
"\n",
"regression_composer_sk.train(ref_date)\n", "regression_composer_sk.train(ref_date)\n",
"regression_composer_ks.train(ref_date)\n", "regression_composer_ks.train(ref_date)\n",
"print(\"\\nSklearn Regression Testing IC: {0:.4f}\".format(regression_composer_sk.ic(ref_date=ref_date)))\n", "print(\"\\nSklearn Regression Testing IC: {0:.4f}\".format(regression_composer_sk.ic(ref_date=ref_date)[0]))\n",
"print(\"Keras Regression Testing IC: {0:.4f}\".format(regression_composer_ks.ic(ref_date=ref_date)))" "print(\"Keras Regression Testing IC: {0:.4f}\".format(regression_composer_ks.ic(ref_date=ref_date)[0]))"
] ]
}, },
{ {
...@@ -250,15 +272,30 @@ ...@@ -250,15 +272,30 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 14,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 01:21:24,492 - ALPHA_MIND - INFO - Starting data package fetching ...\n",
"2019-02-10 01:21:25,503 - ALPHA_MIND - INFO - factor data loading finished\n",
"2019-02-10 01:21:31,384 - ALPHA_MIND - INFO - fit target data loading finished\n",
"2019-02-10 01:21:31,672 - ALPHA_MIND - INFO - industry data loading finished\n",
"2019-02-10 01:21:31,881 - ALPHA_MIND - INFO - benchmark data loading finished\n",
"2019-02-10 01:21:32,966 - ALPHA_MIND - INFO - data merging finished\n",
"2019-02-10 01:21:33,066 - ALPHA_MIND - INFO - Loading data is finished\n",
"2019-02-10 01:21:33,096 - ALPHA_MIND - INFO - Data processing is finished\n"
]
}
],
"source": [ "source": [
"start_date = '2011-01-01'\n", "start_date = '2011-01-01'\n",
"end_date = '2012-01-01'\n", "end_date = '2012-01-01'\n",
"\n", "\n",
"data_package2 = fetch_data_package(engine,\n", "data_package2 = fetch_data_package(engine,\n",
" alpha_factors=[kernal_feature],\n", " alpha_factors=regress_features,\n",
" start_date=start_date,\n", " start_date=start_date,\n",
" end_date=end_date,\n", " end_date=end_date,\n",
" frequency=freq,\n", " frequency=freq,\n",
...@@ -289,9 +326,86 @@ ...@@ -289,9 +326,86 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 15,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 01:22:04,566 - ALPHA_MIND - INFO - 2011-01-04 full re-balance: 789\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:19: FutureWarning: \n",
"Passing list-likes to .loc or [] with any missing label will raise\n",
"KeyError in the future, you can use .reindex() as an alternative.\n",
"\n",
"See the documentation here:\n",
"https://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:37: FutureWarning: \n",
"Passing list-likes to .loc or [] with any missing label will raise\n",
"KeyError in the future, you can use .reindex() as an alternative.\n",
"\n",
"See the documentation here:\n",
"https://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike\n",
"2019-02-10 01:22:04,625 - ALPHA_MIND - INFO - 2011-01-04 is finished\n",
"2019-02-10 01:22:04,640 - ALPHA_MIND - INFO - 2011-04-07 full re-balance: 779\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:19: FutureWarning: \n",
"Passing list-likes to .loc or [] with any missing label will raise\n",
"KeyError in the future, you can use .reindex() as an alternative.\n",
"\n",
"See the documentation here:\n",
"https://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:37: FutureWarning: \n",
"Passing list-likes to .loc or [] with any missing label will raise\n",
"KeyError in the future, you can use .reindex() as an alternative.\n",
"\n",
"See the documentation here:\n",
"https://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike\n",
"2019-02-10 01:22:04,699 - ALPHA_MIND - INFO - 2011-04-07 is finished\n",
"2019-02-10 01:22:04,712 - ALPHA_MIND - INFO - 2011-07-04 full re-balance: 796\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:19: FutureWarning: \n",
"Passing list-likes to .loc or [] with any missing label will raise\n",
"KeyError in the future, you can use .reindex() as an alternative.\n",
"\n",
"See the documentation here:\n",
"https://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:37: FutureWarning: \n",
"Passing list-likes to .loc or [] with any missing label will raise\n",
"KeyError in the future, you can use .reindex() as an alternative.\n",
"\n",
"See the documentation here:\n",
"https://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike\n",
"2019-02-10 01:22:04,739 - ALPHA_MIND - INFO - 2011-07-04 is finished\n",
"2019-02-10 01:22:04,749 - ALPHA_MIND - INFO - 2011-09-27 full re-balance: 784\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:19: FutureWarning: \n",
"Passing list-likes to .loc or [] with any missing label will raise\n",
"KeyError in the future, you can use .reindex() as an alternative.\n",
"\n",
"See the documentation here:\n",
"https://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:37: FutureWarning: \n",
"Passing list-likes to .loc or [] with any missing label will raise\n",
"KeyError in the future, you can use .reindex() as an alternative.\n",
"\n",
"See the documentation here:\n",
"https://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike\n",
"2019-02-10 01:22:04,775 - ALPHA_MIND - INFO - 2011-09-27 is finished\n",
"2019-02-10 01:22:04,785 - ALPHA_MIND - INFO - 2011-12-27 full re-balance: 795\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:19: FutureWarning: \n",
"Passing list-likes to .loc or [] with any missing label will raise\n",
"KeyError in the future, you can use .reindex() as an alternative.\n",
"\n",
"See the documentation here:\n",
"https://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:37: FutureWarning: \n",
"Passing list-likes to .loc or [] with any missing label will raise\n",
"KeyError in the future, you can use .reindex() as an alternative.\n",
"\n",
"See the documentation here:\n",
"https://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike\n",
"2019-02-10 01:22:04,813 - ALPHA_MIND - INFO - 2011-12-27 is finished\n"
]
}
],
"source": [ "source": [
"rets1 = []\n", "rets1 = []\n",
"rets2 = []\n", "rets2 = []\n",
...@@ -311,7 +425,7 @@ ...@@ -311,7 +425,7 @@
" \n", " \n",
" ## sklearn regression model\n", " ## sklearn regression model\n",
" \n", " \n",
" raw_predict1 = regression_composer_sk.predict(ref_date).loc[codes]\n", " raw_predict1 = regression_composer_sk.predict(ref_date, x=data_package2['predict']['x'][py_ref_date])[0].loc[codes]\n",
" er1 = raw_predict1.fillna(raw_predict1.median()).values\n", " er1 = raw_predict1.fillna(raw_predict1.median()).values\n",
" \n", " \n",
" target_pos1, _ = er_portfolio_analysis(er1,\n", " target_pos1, _ = er_portfolio_analysis(er1,\n",
...@@ -329,7 +443,7 @@ ...@@ -329,7 +443,7 @@
"\n", "\n",
" ## keras regression model\n", " ## keras regression model\n",
" \n", " \n",
" raw_predict2 = regression_composer_ks.predict(ref_date).loc[codes]\n", " raw_predict2 = regression_composer_ks.predict(ref_date, x=data_package2['predict']['x'][py_ref_date])[0].loc[codes]\n",
" er2 = raw_predict2.fillna(raw_predict2.median()).values\n", " er2 = raw_predict2.fillna(raw_predict2.median()).values\n",
" \n", " \n",
" target_pos2, _ = er_portfolio_analysis(er2,\n", " target_pos2, _ = er_portfolio_analysis(er2,\n",
...@@ -358,9 +472,32 @@ ...@@ -358,9 +472,32 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 16,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x1c6a3f14828>"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 864x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [ "source": [
"ret_df = pd.DataFrame({'sklearn': rets1, 'keras': rets2}, index=model_dates)\n", "ret_df = pd.DataFrame({'sklearn': rets1, 'keras': rets2}, index=model_dates)\n",
"ret_df.loc[advanceDateByCalendar('china.sse', model_dates[-1], freq).strftime('%Y-%m-%d')] = 0.\n", "ret_df.loc[advanceDateByCalendar('china.sse', model_dates[-1], freq).strftime('%Y-%m-%d')] = 0.\n",
...@@ -395,7 +532,7 @@ ...@@ -395,7 +532,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.6.5" "version": "3.6.8"
}, },
"varInspector": { "varInspector": {
"cols": { "cols": {
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 1,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 2,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -50,7 +50,7 @@ ...@@ -50,7 +50,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 3,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -76,7 +76,7 @@ ...@@ -76,7 +76,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 4,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -111,7 +111,7 @@ ...@@ -111,7 +111,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 5,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -124,9 +124,85 @@ ...@@ -124,9 +124,85 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 6,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 00:33:29,656 - ALPHA_MIND - INFO - alpha factor data loading finished ...\n",
"2019-02-10 00:33:30,687 - ALPHA_MIND - INFO - industry data loading finished ...\n",
"2019-02-10 00:33:31,236 - ALPHA_MIND - INFO - benchmark data loading finished ...\n",
"2019-02-10 00:33:36,367 - ALPHA_MIND - INFO - risk_model data loading finished ...\n",
"2019-02-10 00:33:40,488 - ALPHA_MIND - INFO - returns data loading finished ...\n",
"2019-02-10 00:33:40,798 - ALPHA_MIND - INFO - starting backting ...\n",
"2019-02-10 00:33:41,103 - ALPHA_MIND - INFO - alpha models training finished ...\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\pandas\\core\\frame.py:4024: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame\n",
"\n",
"See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
" downcast=downcast, **kwargs)\n",
"2019-02-10 00:33:41,174 - ALPHA_MIND - INFO - 2016-01-04 00:00:00 re-balance: 799 codes\n",
"2019-02-10 00:33:41,241 - ALPHA_MIND - INFO - 2016-01-18 00:00:00 re-balance: 800 codes\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\cvxpy-1.0.10-py3.6-win-amd64.egg\\cvxpy\\problems\\problem.py:614: RuntimeWarning: overflow encountered in long_scalars\n",
" if self.max_big_small_squared < big*small**2:\n",
"2019-02-10 00:33:41,362 - ALPHA_MIND - INFO - 2016-02-01 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:41,474 - ALPHA_MIND - INFO - 2016-02-22 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:41,584 - ALPHA_MIND - INFO - 2016-03-07 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:41,694 - ALPHA_MIND - INFO - 2016-03-21 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:41,810 - ALPHA_MIND - INFO - 2016-04-05 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:41,943 - ALPHA_MIND - INFO - 2016-04-19 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:42,074 - ALPHA_MIND - INFO - 2016-05-04 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:42,190 - ALPHA_MIND - INFO - 2016-05-18 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:42,328 - ALPHA_MIND - INFO - 2016-06-01 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:42,453 - ALPHA_MIND - INFO - 2016-06-17 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:42,577 - ALPHA_MIND - INFO - 2016-07-01 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:42,704 - ALPHA_MIND - INFO - 2016-07-15 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:42,836 - ALPHA_MIND - INFO - 2016-07-29 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:42,980 - ALPHA_MIND - INFO - 2016-08-12 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:43,109 - ALPHA_MIND - INFO - 2016-08-26 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:43,274 - ALPHA_MIND - INFO - 2016-09-09 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:43,396 - ALPHA_MIND - INFO - 2016-09-27 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:43,507 - ALPHA_MIND - INFO - 2016-10-18 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:43,626 - ALPHA_MIND - INFO - 2016-11-01 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:43,766 - ALPHA_MIND - INFO - 2016-11-15 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:43,877 - ALPHA_MIND - INFO - 2016-11-29 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:43,986 - ALPHA_MIND - INFO - 2016-12-13 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:44,099 - ALPHA_MIND - INFO - 2016-12-27 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:44,212 - ALPHA_MIND - INFO - 2017-01-11 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:44,354 - ALPHA_MIND - INFO - 2017-01-25 00:00:00 re-balance: 799 codes\n",
"2019-02-10 00:33:44,483 - ALPHA_MIND - INFO - 2017-02-15 00:00:00 re-balance: 799 codes\n",
"2019-02-10 00:33:44,599 - ALPHA_MIND - INFO - 2017-03-01 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:44,726 - ALPHA_MIND - INFO - 2017-03-15 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:44,855 - ALPHA_MIND - INFO - 2017-03-29 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:44,982 - ALPHA_MIND - INFO - 2017-04-14 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:45,134 - ALPHA_MIND - INFO - 2017-04-28 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:45,248 - ALPHA_MIND - INFO - 2017-05-15 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:45,373 - ALPHA_MIND - INFO - 2017-05-31 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:45,492 - ALPHA_MIND - INFO - 2017-06-14 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:45,611 - ALPHA_MIND - INFO - 2017-06-28 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:45,736 - ALPHA_MIND - INFO - 2017-07-12 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:45,890 - ALPHA_MIND - INFO - 2017-07-26 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:46,021 - ALPHA_MIND - INFO - 2017-08-09 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:46,133 - ALPHA_MIND - INFO - 2017-08-23 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:46,280 - ALPHA_MIND - INFO - 2017-09-06 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:46,435 - ALPHA_MIND - INFO - 2017-09-20 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:46,553 - ALPHA_MIND - INFO - 2017-10-11 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:46,670 - ALPHA_MIND - INFO - 2017-10-25 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:46,803 - ALPHA_MIND - INFO - 2017-11-08 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:46,942 - ALPHA_MIND - INFO - 2017-11-22 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:47,065 - ALPHA_MIND - INFO - 2017-12-06 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:47,193 - ALPHA_MIND - INFO - 2017-12-20 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:47,336 - ALPHA_MIND - INFO - 2018-01-04 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:47,477 - ALPHA_MIND - INFO - 2018-01-18 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:47,602 - ALPHA_MIND - INFO - 2018-02-01 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:47,724 - ALPHA_MIND - INFO - 2018-02-22 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:47,859 - ALPHA_MIND - INFO - 2018-03-08 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:33:47,989 - ALPHA_MIND - INFO - 2018-03-22 00:00:00 re-balance: 800 codes\n"
]
}
],
"source": [ "source": [
"# Strategy\n", "# Strategy\n",
"strategy = Strategy(alpha_model,\n", "strategy = Strategy(alpha_model,\n",
...@@ -143,9 +219,32 @@ ...@@ -143,9 +219,32 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 7,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x215af4105c0>"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA0wAAAGNCAYAAAAitvGPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzs3Xd8leX9//HXfbL3niRh77BkKVMBBwq48OC2tGq1tVVrrdqhP1urta3WbrWuar+13E7AhSiCLGUoe28SkpC9c5JzzvX74yCCMgIkORnv5+PBI5xz7vE5ORLvd677+lyWMQYRERERERH5Noe/CxAREREREWmtFJhERERERESOQ4FJRERERETkOBSYREREREREjkOBSURERERE5DgUmERERERERI5DgUlEREREROQ4FJhERERERESOQ4FJRERERETkOBSYREREREREjiPQ3wUcg/F3ASIiIiIi0iZYzX2C1hiYOHDggL9LEBERERGRViw9Pb1FztMqA5OIiIiIiMiZcDqdLwBTgIO2bWcfeu4PwFSgHtgJzLRtu+xEx9EcJhERERERaY9eAi76xnPzgWzbtgcC24AHTnYQBSYREREREWl3bNv+FCj5xnMf2rbtPvTwMyDjZMdpE7fkGWOoq6vD6/ViWc0+r0tagDEGh8NBaGioPlMRERER8YfvArNOtlGrDEyJiYlHPf4qKOnCun0xxhwOTiIiIiIip8rpdK464uGztm0/28j9fgG4gf872batMjAVFRUd9bi6upqIiAg/VSPNSZ+tiIiIiJyO9PR0bNsedqr7OZ3Om/A1g5ho2/ZJlzRqlYHpmzSy1H7psxURERGRluJ0Oi8C7gPG27Zd05h9LGNa3Tqx5pvrMNXU1BAeHu6ncqQ56bMVERERkdNxaB2m4/723el0vgqcCyQCBcBD+LrihQDFhzb7zLbt2050HgWmRigvL+ett97iO9/5jt9qaEq1tbVcf/312LZNQEDAt16fNm0ac+bMOeExRo4cyfvvv098fPxRzy9btoygoCCGDx8OwIsvvkh4eDgzZsw45nH8/dmKiIiISNt0ssDUVDTbvhEqKip4+eWXT3k/j8fTDNWcGrfb/a3nZs2axeTJk78Vlr6q92Rh6USWL1/O6tWrDz+++uqref7550/7eCIiIiIi/tQm5jAdyfu/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\n",
"text/plain": [
"<Figure size 1008x504 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [ "source": [
"ret_df[['turn_over', 'excess_return']].cumsum().plot(figsize=(14, 7), secondary_y='turn_over')" "ret_df[['turn_over', 'excess_return']].cumsum().plot(figsize=(14, 7), secondary_y='turn_over')"
] ]
...@@ -174,7 +273,7 @@ ...@@ -174,7 +273,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.6.5" "version": "3.6.8"
}, },
"varInspector": { "varInspector": {
"cols": { "cols": {
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 1,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -31,9 +31,21 @@ ...@@ -31,9 +31,21 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 2,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 00:34:06,090 - ALPHA_MIND - INFO - alpha factor data loading finished ...\n",
"2019-02-10 00:34:06,861 - ALPHA_MIND - INFO - industry data loading finished ...\n",
"2019-02-10 00:34:07,265 - ALPHA_MIND - INFO - benchmark data loading finished ...\n",
"2019-02-10 00:34:10,637 - ALPHA_MIND - INFO - risk_model data loading finished ...\n",
"2019-02-10 00:34:13,350 - ALPHA_MIND - INFO - returns data loading finished ...\n"
]
}
],
"source": [ "source": [
"\"\"\"\n", "\"\"\"\n",
"Back test parameter settings\n", "Back test parameter settings\n",
...@@ -115,7 +127,7 @@ ...@@ -115,7 +127,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 3,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -150,9 +162,179 @@ ...@@ -150,9 +162,179 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 4,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 00:34:13,667 - ALPHA_MIND - INFO - starting backting ...\n",
"2019-02-10 00:34:13,856 - ALPHA_MIND - INFO - alpha models training finished ...\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\pandas\\core\\frame.py:4024: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame\n",
"\n",
"See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
" downcast=downcast, **kwargs)\n",
"2019-02-10 00:34:13,921 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 re-balance: 851 codes\n",
"2019-02-10 00:34:13,985 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 re-balance: 850 codes\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\cvxpy-1.0.10-py3.6-win-amd64.egg\\cvxpy\\problems\\problem.py:614: RuntimeWarning: overflow encountered in long_scalars\n",
" if self.max_big_small_squared < big*small**2:\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\cvxpy-1.0.10-py3.6-win-amd64.egg\\cvxpy\\problems\\problem.py:615: RuntimeWarning: overflow encountered in long_scalars\n",
" self.max_big_small_squared = big*small**2\n",
"2019-02-10 00:34:14,108 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:14,220 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 re-balance: 852 codes\n",
"2019-02-10 00:34:14,330 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:14,445 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:14,563 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:14,706 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:14,840 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:14,969 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:15,106 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:15,216 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:15,339 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 re-balance: 855 codes\n",
"2019-02-10 00:34:15,482 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 re-balance: 855 codes\n",
"2019-02-10 00:34:15,608 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:15,746 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:15,892 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:16,040 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:16,167 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:16,287 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:16,409 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:16,567 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:16,679 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:16,806 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:16,931 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:17,045 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:17,168 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:17,282 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:17,400 - ALPHA_MIND - INFO - 2018-02-28 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:17,520 - ALPHA_MIND - INFO - 2018-03-14 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:17,632 - ALPHA_MIND - INFO - 2018-03-28 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:17,779 - ALPHA_MIND - INFO - 2018-04-13 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:17,899 - ALPHA_MIND - INFO - 2018-04-27 00:00:00 re-balance: 859 codes\n",
"2019-02-10 00:34:18,064 - ALPHA_MIND - INFO - weight_gap: 0.005 finished\n",
"2019-02-10 00:34:18,066 - ALPHA_MIND - INFO - starting backting ...\n",
"2019-02-10 00:34:18,125 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 re-balance: 851 codes\n",
"2019-02-10 00:34:18,191 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 re-balance: 850 codes\n",
"2019-02-10 00:34:18,320 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:18,447 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 re-balance: 852 codes\n",
"2019-02-10 00:34:18,556 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:18,678 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:18,807 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:18,950 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:19,111 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:19,235 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:19,374 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:19,500 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:19,615 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 re-balance: 855 codes\n",
"2019-02-10 00:34:19,772 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 re-balance: 855 codes\n",
"2019-02-10 00:34:19,894 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:20,028 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:20,171 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:20,300 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:20,430 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:20,546 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:20,685 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:20,848 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:20,966 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:21,097 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:21,223 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:21,335 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:21,451 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:21,555 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:21,668 - ALPHA_MIND - INFO - 2018-02-28 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:21,782 - ALPHA_MIND - INFO - 2018-03-14 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:21,907 - ALPHA_MIND - INFO - 2018-03-28 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:22,054 - ALPHA_MIND - INFO - 2018-04-13 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:22,173 - ALPHA_MIND - INFO - 2018-04-27 00:00:00 re-balance: 859 codes\n",
"2019-02-10 00:34:22,327 - ALPHA_MIND - INFO - weight_gap: 0.01 finished\n",
"2019-02-10 00:34:22,328 - ALPHA_MIND - INFO - starting backting ...\n",
"2019-02-10 00:34:22,387 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 re-balance: 851 codes\n",
"2019-02-10 00:34:22,453 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 re-balance: 850 codes\n",
"2019-02-10 00:34:22,573 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:22,690 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 re-balance: 852 codes\n",
"2019-02-10 00:34:22,811 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:22,939 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:23,057 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:23,193 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:23,333 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:23,457 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:23,588 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:23,719 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:23,838 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 re-balance: 855 codes\n",
"2019-02-10 00:34:23,993 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 re-balance: 855 codes\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 00:34:24,119 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:24,250 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:24,383 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:24,513 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:24,653 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:24,774 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:24,889 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:25,036 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:25,170 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:25,298 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:25,420 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:25,531 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:25,659 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:25,782 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:25,929 - ALPHA_MIND - INFO - 2018-02-28 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:26,056 - ALPHA_MIND - INFO - 2018-03-14 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:26,167 - ALPHA_MIND - INFO - 2018-03-28 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:26,302 - ALPHA_MIND - INFO - 2018-04-13 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:26,437 - ALPHA_MIND - INFO - 2018-04-27 00:00:00 re-balance: 859 codes\n",
"2019-02-10 00:34:26,581 - ALPHA_MIND - INFO - weight_gap: 0.015 finished\n",
"2019-02-10 00:34:26,582 - ALPHA_MIND - INFO - starting backting ...\n",
"2019-02-10 00:34:26,640 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 re-balance: 851 codes\n",
"2019-02-10 00:34:26,708 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 re-balance: 850 codes\n",
"2019-02-10 00:34:26,834 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:26,954 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 re-balance: 852 codes\n",
"2019-02-10 00:34:27,072 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:27,193 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:27,321 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:27,463 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:27,618 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:27,747 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:27,890 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:28,007 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:28,122 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 re-balance: 855 codes\n",
"2019-02-10 00:34:28,277 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 re-balance: 855 codes\n",
"2019-02-10 00:34:28,409 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:28,551 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:28,682 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:28,822 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:28,961 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:29,090 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:29,218 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:29,356 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:29,480 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:29,609 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:29,738 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:29,846 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:29,989 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:30,106 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:30,221 - ALPHA_MIND - INFO - 2018-02-28 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:30,337 - ALPHA_MIND - INFO - 2018-03-14 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:30,450 - ALPHA_MIND - INFO - 2018-03-28 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:30,599 - ALPHA_MIND - INFO - 2018-04-13 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:30,764 - ALPHA_MIND - INFO - 2018-04-27 00:00:00 re-balance: 859 codes\n",
"2019-02-10 00:34:30,913 - ALPHA_MIND - INFO - weight_gap: 0.02 finished\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Wall time: 17.4 s\n"
]
}
],
"source": [ "source": [
"%%time\n", "%%time\n",
"weight_gaps = [0.005, 0.010, 0.015, 0.020]\n", "weight_gaps = [0.005, 0.010, 0.015, 0.020]\n",
...@@ -167,9 +349,169 @@ ...@@ -167,9 +349,169 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 5,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 00:34:31,018 - ALPHA_MIND - INFO - starting backting ...\n",
"2019-02-10 00:34:31,080 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 re-balance: 851 codes\n",
"2019-02-10 00:34:31,267 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 re-balance: 850 codes\n",
"2019-02-10 00:34:31,465 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:31,653 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 re-balance: 852 codes\n",
"2019-02-10 00:34:31,866 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:32,081 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:32,284 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:32,462 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:32,660 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:32,861 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:33,047 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:33,251 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:33,447 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 re-balance: 855 codes\n",
"2019-02-10 00:34:33,651 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 re-balance: 855 codes\n",
"2019-02-10 00:34:33,857 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:34,082 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:34,288 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:34,492 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:34,701 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:34,903 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:35,127 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:35,347 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:35,562 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:35,784 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:36,022 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:36,231 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:36,497 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:36,700 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:36,930 - ALPHA_MIND - INFO - 2018-02-28 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:37,144 - ALPHA_MIND - INFO - 2018-03-14 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:37,371 - ALPHA_MIND - INFO - 2018-03-28 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:37,585 - ALPHA_MIND - INFO - 2018-04-13 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:37,807 - ALPHA_MIND - INFO - 2018-04-27 00:00:00 re-balance: 859 codes\n",
"2019-02-10 00:34:38,052 - ALPHA_MIND - INFO - target_vol: 0.0150 finished\n",
"2019-02-10 00:34:38,054 - ALPHA_MIND - INFO - starting backting ...\n",
"2019-02-10 00:34:38,116 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 re-balance: 851 codes\n",
"2019-02-10 00:34:38,224 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 re-balance: 850 codes\n",
"2019-02-10 00:34:38,338 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:38,466 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 re-balance: 852 codes\n",
"2019-02-10 00:34:38,582 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:38,699 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:38,801 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:38,910 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:39,020 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:39,151 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:39,280 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:39,416 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:39,551 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 re-balance: 855 codes\n",
"2019-02-10 00:34:39,688 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 re-balance: 855 codes\n",
"2019-02-10 00:34:39,839 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:39,998 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:40,147 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:40,285 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:40,428 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:40,575 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:40,728 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:40,895 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:41,047 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:41,197 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:41,353 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:41,501 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:41,681 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:41,827 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:41,984 - ALPHA_MIND - INFO - 2018-02-28 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:42,141 - ALPHA_MIND - INFO - 2018-03-14 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:42,298 - ALPHA_MIND - INFO - 2018-03-28 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:42,462 - ALPHA_MIND - INFO - 2018-04-13 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:42,621 - ALPHA_MIND - INFO - 2018-04-27 00:00:00 re-balance: 859 codes\n",
"2019-02-10 00:34:42,813 - ALPHA_MIND - INFO - target_vol: 0.0300 finished\n",
"2019-02-10 00:34:42,815 - ALPHA_MIND - INFO - starting backting ...\n",
"2019-02-10 00:34:42,875 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 re-balance: 851 codes\n",
"2019-02-10 00:34:42,981 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 re-balance: 850 codes\n",
"2019-02-10 00:34:43,097 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:43,220 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 re-balance: 852 codes\n",
"2019-02-10 00:34:43,338 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:43,450 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:43,554 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:43,662 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:43,768 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:43,880 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:43,985 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:44,093 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:44,200 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 re-balance: 855 codes\n",
"2019-02-10 00:34:44,315 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 re-balance: 855 codes\n",
"2019-02-10 00:34:44,426 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:44,540 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:44,649 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:44,757 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:44,868 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:44,975 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:45,083 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:45,193 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:45,297 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:45,408 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 re-balance: 854 codes\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 00:34:45,521 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:45,648 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:45,800 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:45,922 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:46,036 - ALPHA_MIND - INFO - 2018-02-28 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:46,150 - ALPHA_MIND - INFO - 2018-03-14 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:46,257 - ALPHA_MIND - INFO - 2018-03-28 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:46,370 - ALPHA_MIND - INFO - 2018-04-13 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:46,483 - ALPHA_MIND - INFO - 2018-04-27 00:00:00 re-balance: 859 codes\n",
"2019-02-10 00:34:46,623 - ALPHA_MIND - INFO - target_vol: 0.0450 finished\n",
"2019-02-10 00:34:46,624 - ALPHA_MIND - INFO - starting backting ...\n",
"2019-02-10 00:34:46,685 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 re-balance: 851 codes\n",
"2019-02-10 00:34:46,792 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 re-balance: 850 codes\n",
"2019-02-10 00:34:46,910 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:47,029 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 re-balance: 852 codes\n",
"2019-02-10 00:34:47,144 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:47,257 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:47,359 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:47,467 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:47,574 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:47,684 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:47,790 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:47,898 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:48,003 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 re-balance: 855 codes\n",
"2019-02-10 00:34:48,114 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 re-balance: 855 codes\n",
"2019-02-10 00:34:48,223 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:48,336 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:48,439 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:48,543 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:48,646 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:48,750 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 re-balance: 853 codes\n",
"2019-02-10 00:34:48,856 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:48,963 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:49,065 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:49,171 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:49,283 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 re-balance: 854 codes\n",
"2019-02-10 00:34:49,389 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:49,497 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:49,603 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:49,708 - ALPHA_MIND - INFO - 2018-02-28 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:49,814 - ALPHA_MIND - INFO - 2018-03-14 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:49,917 - ALPHA_MIND - INFO - 2018-03-28 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:50,022 - ALPHA_MIND - INFO - 2018-04-13 00:00:00 re-balance: 856 codes\n",
"2019-02-10 00:34:50,131 - ALPHA_MIND - INFO - 2018-04-27 00:00:00 re-balance: 859 codes\n",
"2019-02-10 00:34:50,269 - ALPHA_MIND - INFO - target_vol: 0.0600 finished\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Wall time: 19.3 s\n"
]
}
],
"source": [ "source": [
"%%time\n", "%%time\n",
"target_vols = [0.015, 0.030, 0.045, 0.060]\n", "target_vols = [0.015, 0.030, 0.045, 0.060]\n",
...@@ -206,7 +548,7 @@ ...@@ -206,7 +548,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.6.5" "version": "3.6.8"
}, },
"varInspector": { "varInspector": {
"cols": { "cols": {
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 1,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 2,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -60,7 +60,7 @@ ...@@ -60,7 +60,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 8,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -85,15 +85,23 @@ ...@@ -85,15 +85,23 @@
" warm_start=0,\n", " warm_start=0,\n",
" data_source=data_source)\n", " data_source=data_source)\n",
" ref_date, model = params\n", " ref_date, model = params\n",
" er = predict_by_model(ref_date, model, data_meta)\n", " er, _ = predict_by_model(ref_date, model, data_meta)\n",
" return er" " return er"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 9,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Wall time: 2min\n"
]
}
],
"source": [ "source": [
"%%time\n", "%%time\n",
"\n", "\n",
...@@ -105,7 +113,7 @@ ...@@ -105,7 +113,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 10,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -143,7 +151,7 @@ ...@@ -143,7 +151,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 11,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -227,9 +235,32 @@ ...@@ -227,9 +235,32 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 12,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x1f11a5b5048>"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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pw2hb28tdCQiIiIi8a1bBPaGZp//m7OaNxNHcWyolG+feyxpSepXFxEREZH4F/eBvbS2iV/O3cLqMseMLXMx37qCBIV1EREREekm4jqwb69u5IevbKSuoYmbP3mYqeeeTCi9d9BliYiIiIh0mLgO7H9bXEJtk8+dKx9mSFot3glnBF2SiIiIiEiHitvekQ3l9by9sYrzknYwpHgZIXMdXigh6LJERERERDpU3Ab2Rz8uIS3R48K37ocJU/BGTwi6JBERERGRDheXgX1lSR3vF1Vzcd0KejfsInTptUGXJCIiIiLSKeIysP9t8U6yEh3nvvcI3lkX4/UbEHRJIiIiIiKdIu4C+5JtNXy8vZYvFL9NWnY23rkm6JJERERERDpNXAV25xyPLN5JfqiJM1f8k9CMr+ClpARdloiIiIhIp4mrwP5+UTWrS+sxq18keewkmDA16JJERERERDpV3AT2Ft/x6JIS+vvVnLLtI0IzvorneUGXJSIiIiLSqeImsL+zsYqNlQ1ctvx5Es+9BK+gX9AliYiIiIh0urgI7M2+47GPdzK0fifHeTvwzrok6JJERERERLpEXAT219dWsq26mctXvUDiZV/DS0oOuiQRERERkS4R84G9odnniSXbOaJqI5OH5uKNPSrokkREREREukzMB/Z/rq6gtMFxxebXSZh+XdDliIiIiIh0qcSgC9if2qYWnlyyjQllaxj3ual4uQVBlyQiIiIi0qVi+gz77KU72dUS4vJdi/BOvyDockREREREulzMnmGvamjhuaWlTN25jCO+cAleYlLQJYmIiIiIdLmYPcP+zMKN1DuPy3uX4R0xLuhyREREREQCEZOBvbSmiRc31PK5kk8YcukXgy5HRERERCQwMRnYn3xzKS3OY8boTLzs3KDLEREREREJTFQ97MaYs4F7gQTgfmvtnW0eTwEeBiYDpcB0a+2GyGM/Aq4DWoAbrLWvHOj5/lWexOm7VtD/8osO4kcREREREelYnZGDD7TPtg54ht0YkwDcB5wDjAEuM8aMaTPsOqDcWjscuAe4K7LtGGAGcCRwNvB/kf3tV4LvY045Ei/hgENFRERERDpFZ+TgKPf5GdG0xEwB1lhr11lrG4HHgQvbjLkQeCjy/VPAacYYL3L/49baBmvtemBNZH/7dQ5byB89KorSREREREQ6TWfk4Gj2+RnRtMQM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\n",
"text/plain": [
"<Figure size 864x432 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [ "source": [
"ret_df = create_scenario(weight_gap)\n", "ret_df = create_scenario(weight_gap)\n",
"ret_df[['returns', 'tc_cost']].cumsum().plot(figsize=(12, 6),\n", "ret_df[['returns', 'tc_cost']].cumsum().plot(figsize=(12, 6),\n",
...@@ -261,7 +292,7 @@ ...@@ -261,7 +292,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.6.5" "version": "3.6.8"
}, },
"varInspector": { "varInspector": {
"cols": { "cols": {
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 1,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 2,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 3,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -78,7 +78,7 @@ ...@@ -78,7 +78,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 4,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -87,9 +87,197 @@ ...@@ -87,9 +87,197 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 5,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 00:36:31,655 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:36:31,662 - ALPHA_MIND - INFO - 2016-01-04 00:00:00 is finished with 2772 stocks for BETA\n",
"2019-02-10 00:36:31,665 - ALPHA_MIND - INFO - 2016-01-04 00:00:00 risk_exposure: 8.780185359837276e-32\n",
"2019-02-10 00:36:34,375 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:36:34,378 - ALPHA_MIND - INFO - 2016-02-01 00:00:00 is finished with 2773 stocks for BETA\n",
"2019-02-10 00:36:34,380 - ALPHA_MIND - INFO - 2016-02-01 00:00:00 risk_exposure: 4.033049288078771e-31\n",
"2019-02-10 00:36:37,086 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:36:37,088 - ALPHA_MIND - INFO - 2016-03-07 00:00:00 is finished with 2774 stocks for BETA\n",
"2019-02-10 00:36:37,091 - ALPHA_MIND - INFO - 2016-03-07 00:00:00 risk_exposure: 2.032537819277293e-31\n",
"2019-02-10 00:36:39,868 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:36:39,870 - ALPHA_MIND - INFO - 2016-04-05 00:00:00 is finished with 2802 stocks for BETA\n",
"2019-02-10 00:36:39,873 - ALPHA_MIND - INFO - 2016-04-05 00:00:00 risk_exposure: 2.2432609700206877e-31\n",
"2019-02-10 00:36:42,305 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:36:42,308 - ALPHA_MIND - INFO - 2016-05-04 00:00:00 is finished with 2806 stocks for BETA\n",
"2019-02-10 00:36:42,310 - ALPHA_MIND - INFO - 2016-05-04 00:00:00 risk_exposure: 1.2048877817558507e-30\n",
"2019-02-10 00:36:44,923 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:36:44,925 - ALPHA_MIND - INFO - 2016-06-01 00:00:00 is finished with 2809 stocks for BETA\n",
"2019-02-10 00:36:44,928 - ALPHA_MIND - INFO - 2016-06-01 00:00:00 risk_exposure: 6.215470872434024e-31\n",
"2019-02-10 00:36:47,794 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:36:47,797 - ALPHA_MIND - INFO - 2016-07-01 00:00:00 is finished with 2825 stocks for BETA\n",
"2019-02-10 00:36:47,801 - ALPHA_MIND - INFO - 2016-07-01 00:00:00 risk_exposure: 2.6170814493214998e-31\n",
"2019-02-10 00:36:50,433 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:36:50,435 - ALPHA_MIND - INFO - 2016-07-29 00:00:00 is finished with 2836 stocks for BETA\n",
"2019-02-10 00:36:50,438 - ALPHA_MIND - INFO - 2016-07-29 00:00:00 risk_exposure: 1.8752182883590546e-31\n",
"2019-02-10 00:36:53,039 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:36:53,041 - ALPHA_MIND - INFO - 2016-08-26 00:00:00 is finished with 2847 stocks for BETA\n",
"2019-02-10 00:36:53,044 - ALPHA_MIND - INFO - 2016-08-26 00:00:00 risk_exposure: 5.6561789769353115e-31\n",
"2019-02-10 00:36:55,605 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:36:55,607 - ALPHA_MIND - INFO - 2016-09-27 00:00:00 is finished with 2859 stocks for BETA\n",
"2019-02-10 00:36:55,611 - ALPHA_MIND - INFO - 2016-09-27 00:00:00 risk_exposure: 1.299505272639475e-31\n",
"2019-02-10 00:36:58,636 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:36:58,638 - ALPHA_MIND - INFO - 2016-11-01 00:00:00 is finished with 2876 stocks for BETA\n",
"2019-02-10 00:36:58,640 - ALPHA_MIND - INFO - 2016-11-01 00:00:00 risk_exposure: 5.954053161299235e-31\n",
"2019-02-10 00:37:01,328 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:37:01,330 - ALPHA_MIND - INFO - 2016-11-29 00:00:00 is finished with 2902 stocks for BETA\n",
"2019-02-10 00:37:01,335 - ALPHA_MIND - INFO - 2016-11-29 00:00:00 risk_exposure: 2.340972343668577e-31\n",
"2019-02-10 00:37:04,010 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:37:04,012 - ALPHA_MIND - INFO - 2016-12-27 00:00:00 is finished with 2921 stocks for BETA\n",
"2019-02-10 00:37:04,014 - ALPHA_MIND - INFO - 2016-12-27 00:00:00 risk_exposure: 1.1077566431397867e-31\n",
"2019-02-10 00:37:07,198 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:37:07,200 - ALPHA_MIND - INFO - 2017-01-25 00:00:00 is finished with 2944 stocks for BETA\n",
"2019-02-10 00:37:07,202 - ALPHA_MIND - INFO - 2017-01-25 00:00:00 risk_exposure: 6.061637482612322e-31\n",
"2019-02-10 00:37:11,045 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:37:11,047 - ALPHA_MIND - INFO - 2017-03-01 00:00:00 is finished with 2983 stocks for BETA\n",
"2019-02-10 00:37:11,049 - ALPHA_MIND - INFO - 2017-03-01 00:00:00 risk_exposure: 3.2957084145960574e-31\n",
"2019-02-10 00:37:14,532 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:37:14,534 - ALPHA_MIND - INFO - 2017-03-29 00:00:00 is finished with 3024 stocks for BETA\n",
"2019-02-10 00:37:14,536 - ALPHA_MIND - INFO - 2017-03-29 00:00:00 risk_exposure: 1.6682637573515395e-31\n",
"2019-02-10 00:37:19,301 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:37:19,304 - ALPHA_MIND - INFO - 2017-04-28 00:00:00 is finished with 3080 stocks for BETA\n",
"2019-02-10 00:37:19,308 - ALPHA_MIND - INFO - 2017-04-28 00:00:00 risk_exposure: 9.48598197787303e-32\n",
"2019-02-10 00:37:33,470 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:37:33,473 - ALPHA_MIND - INFO - 2017-05-31 00:00:00 is finished with 3113 stocks for BETA\n",
"2019-02-10 00:37:33,475 - ALPHA_MIND - INFO - 2017-05-31 00:00:00 risk_exposure: 8.774776451151662e-32\n",
"2019-02-10 00:37:39,335 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:37:39,337 - ALPHA_MIND - INFO - 2017-06-28 00:00:00 is finished with 3155 stocks for BETA\n",
"2019-02-10 00:37:39,339 - ALPHA_MIND - INFO - 2017-06-28 00:00:00 risk_exposure: 1.2561838095457818e-31\n",
"2019-02-10 00:37:42,566 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:37:42,569 - ALPHA_MIND - INFO - 2017-07-26 00:00:00 is finished with 3196 stocks for BETA\n",
"2019-02-10 00:37:42,572 - ALPHA_MIND - INFO - 2017-07-26 00:00:00 risk_exposure: 1.6998937536319542e-31\n",
"2019-02-10 00:37:46,330 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:37:46,333 - ALPHA_MIND - INFO - 2017-08-23 00:00:00 is finished with 3231 stocks for BETA\n",
"2019-02-10 00:37:46,337 - ALPHA_MIND - INFO - 2017-08-23 00:00:00 risk_exposure: 1.1527077454799027e-31\n",
"2019-02-10 00:37:49,467 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:37:49,469 - ALPHA_MIND - INFO - 2017-09-20 00:00:00 is finished with 3260 stocks for BETA\n",
"2019-02-10 00:37:49,472 - ALPHA_MIND - INFO - 2017-09-20 00:00:00 risk_exposure: 4.590807376048834e-31\n",
"2019-02-10 00:37:52,887 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:37:52,889 - ALPHA_MIND - INFO - 2017-10-25 00:00:00 is finished with 3295 stocks for BETA\n",
"2019-02-10 00:37:52,891 - ALPHA_MIND - INFO - 2017-10-25 00:00:00 risk_exposure: 2.496839867689659e-31\n",
"2019-02-10 00:37:56,328 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:37:56,330 - ALPHA_MIND - INFO - 2017-11-22 00:00:00 is finished with 3332 stocks for BETA\n",
"2019-02-10 00:37:56,333 - ALPHA_MIND - INFO - 2017-11-22 00:00:00 risk_exposure: 1.5081910271866655e-31\n",
"2019-02-10 00:38:00,992 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:38:00,995 - ALPHA_MIND - INFO - 2017-12-20 00:00:00 is finished with 3362 stocks for BETA\n",
"2019-02-10 00:38:00,997 - ALPHA_MIND - INFO - 2017-12-20 00:00:00 risk_exposure: 4.678452352395579e-31\n",
"2019-02-10 00:38:04,434 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:38:04,436 - ALPHA_MIND - INFO - 2018-01-18 00:00:00 is finished with 3386 stocks for BETA\n",
"2019-02-10 00:38:04,439 - ALPHA_MIND - INFO - 2018-01-18 00:00:00 risk_exposure: 5.364881573261643e-32\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 00:38:11,308 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:38:11,311 - ALPHA_MIND - INFO - 2018-02-22 00:00:00 is finished with 3433 stocks for BETA\n",
"2019-02-10 00:38:11,313 - ALPHA_MIND - INFO - 2018-02-22 00:00:00 risk_exposure: 3.792625694052645e-06\n",
"2019-02-10 00:38:20,225 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:38:20,228 - ALPHA_MIND - INFO - 2016-01-04 00:00:00 is finished with 2772 stocks for SIZE\n",
"2019-02-10 00:38:20,230 - ALPHA_MIND - INFO - 2016-01-04 00:00:00 risk_exposure: 2.4238582429739416e-31\n",
"2019-02-10 00:38:27,864 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:38:27,866 - ALPHA_MIND - INFO - 2016-02-01 00:00:00 is finished with 2773 stocks for SIZE\n",
"2019-02-10 00:38:27,869 - ALPHA_MIND - INFO - 2016-02-01 00:00:00 risk_exposure: 5.674415515478732e-31\n",
"2019-02-10 00:38:36,504 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:38:36,507 - ALPHA_MIND - INFO - 2016-03-07 00:00:00 is finished with 2774 stocks for SIZE\n",
"2019-02-10 00:38:36,509 - ALPHA_MIND - INFO - 2016-03-07 00:00:00 risk_exposure: 1.0983663637406123e-30\n",
"2019-02-10 00:38:42,742 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:38:42,744 - ALPHA_MIND - INFO - 2016-04-05 00:00:00 is finished with 2802 stocks for SIZE\n",
"2019-02-10 00:38:42,747 - ALPHA_MIND - INFO - 2016-04-05 00:00:00 risk_exposure: 4.672276334463717e-31\n",
"2019-02-10 00:38:46,184 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:38:46,186 - ALPHA_MIND - INFO - 2016-05-04 00:00:00 is finished with 2806 stocks for SIZE\n",
"2019-02-10 00:38:46,188 - ALPHA_MIND - INFO - 2016-05-04 00:00:00 risk_exposure: 2.5351968948788832e-31\n",
"2019-02-10 00:38:49,083 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:38:49,085 - ALPHA_MIND - INFO - 2016-06-01 00:00:00 is finished with 2809 stocks for SIZE\n",
"2019-02-10 00:38:49,087 - ALPHA_MIND - INFO - 2016-06-01 00:00:00 risk_exposure: 1.4284602649215035e-31\n",
"2019-02-10 00:38:51,754 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:38:51,756 - ALPHA_MIND - INFO - 2016-07-01 00:00:00 is finished with 2825 stocks for SIZE\n",
"2019-02-10 00:38:51,758 - ALPHA_MIND - INFO - 2016-07-01 00:00:00 risk_exposure: 2.9984250483865363e-31\n",
"2019-02-10 00:38:54,796 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:38:54,798 - ALPHA_MIND - INFO - 2016-07-29 00:00:00 is finished with 2836 stocks for SIZE\n",
"2019-02-10 00:38:54,801 - ALPHA_MIND - INFO - 2016-07-29 00:00:00 risk_exposure: 3.379855469188818e-31\n",
"2019-02-10 00:38:57,422 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:38:57,425 - ALPHA_MIND - INFO - 2016-08-26 00:00:00 is finished with 2847 stocks for SIZE\n",
"2019-02-10 00:38:57,428 - ALPHA_MIND - INFO - 2016-08-26 00:00:00 risk_exposure: 2.7522205190185326e-31\n",
"2019-02-10 00:39:00,884 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:39:00,886 - ALPHA_MIND - INFO - 2016-09-27 00:00:00 is finished with 2859 stocks for SIZE\n",
"2019-02-10 00:39:00,889 - ALPHA_MIND - INFO - 2016-09-27 00:00:00 risk_exposure: 2.9462745941606107e-31\n",
"2019-02-10 00:39:04,051 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:39:04,054 - ALPHA_MIND - INFO - 2016-11-01 00:00:00 is finished with 2876 stocks for SIZE\n",
"2019-02-10 00:39:04,056 - ALPHA_MIND - INFO - 2016-11-01 00:00:00 risk_exposure: 1.8063646099617438e-31\n",
"2019-02-10 00:39:07,254 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:39:07,256 - ALPHA_MIND - INFO - 2016-11-29 00:00:00 is finished with 2902 stocks for SIZE\n",
"2019-02-10 00:39:07,258 - ALPHA_MIND - INFO - 2016-11-29 00:00:00 risk_exposure: 2.34522963155895e-31\n",
"2019-02-10 00:39:10,268 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:39:10,270 - ALPHA_MIND - INFO - 2016-12-27 00:00:00 is finished with 2921 stocks for SIZE\n",
"2019-02-10 00:39:10,273 - ALPHA_MIND - INFO - 2016-12-27 00:00:00 risk_exposure: 1.7512207226372508e-31\n",
"2019-02-10 00:39:13,599 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:39:13,601 - ALPHA_MIND - INFO - 2017-01-25 00:00:00 is finished with 2944 stocks for SIZE\n",
"2019-02-10 00:39:13,604 - ALPHA_MIND - INFO - 2017-01-25 00:00:00 risk_exposure: 5.009395301391125e-31\n",
"2019-02-10 00:39:17,167 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:39:17,170 - ALPHA_MIND - INFO - 2017-03-01 00:00:00 is finished with 2983 stocks for SIZE\n",
"2019-02-10 00:39:17,172 - ALPHA_MIND - INFO - 2017-03-01 00:00:00 risk_exposure: 6.974423870313e-31\n",
"2019-02-10 00:39:20,117 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:39:20,120 - ALPHA_MIND - INFO - 2017-03-29 00:00:00 is finished with 3024 stocks for SIZE\n",
"2019-02-10 00:39:20,122 - ALPHA_MIND - INFO - 2017-03-29 00:00:00 risk_exposure: 1.8746122397467916e-31\n",
"2019-02-10 00:39:22,817 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:39:22,819 - ALPHA_MIND - INFO - 2017-04-28 00:00:00 is finished with 3080 stocks for SIZE\n",
"2019-02-10 00:39:22,821 - ALPHA_MIND - INFO - 2017-04-28 00:00:00 risk_exposure: 2.8038442856537325e-31\n",
"2019-02-10 00:39:25,733 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:39:25,735 - ALPHA_MIND - INFO - 2017-05-31 00:00:00 is finished with 3113 stocks for SIZE\n",
"2019-02-10 00:39:25,738 - ALPHA_MIND - INFO - 2017-05-31 00:00:00 risk_exposure: 9.579696648687605e-31\n",
"2019-02-10 00:39:28,943 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:39:28,945 - ALPHA_MIND - INFO - 2017-06-28 00:00:00 is finished with 3155 stocks for SIZE\n",
"2019-02-10 00:39:28,947 - ALPHA_MIND - INFO - 2017-06-28 00:00:00 risk_exposure: 2.145768840762906e-31\n",
"2019-02-10 00:39:31,767 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:39:31,769 - ALPHA_MIND - INFO - 2017-07-26 00:00:00 is finished with 3196 stocks for SIZE\n",
"2019-02-10 00:39:31,772 - ALPHA_MIND - INFO - 2017-07-26 00:00:00 risk_exposure: 6.608292029564558e-31\n",
"2019-02-10 00:39:34,766 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:39:34,771 - ALPHA_MIND - INFO - 2017-08-23 00:00:00 is finished with 3231 stocks for SIZE\n",
"2019-02-10 00:39:34,774 - ALPHA_MIND - INFO - 2017-08-23 00:00:00 risk_exposure: 6.986067046348979e-31\n",
"2019-02-10 00:39:38,125 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:39:38,127 - ALPHA_MIND - INFO - 2017-09-20 00:00:00 is finished with 3260 stocks for SIZE\n",
"2019-02-10 00:39:38,130 - ALPHA_MIND - INFO - 2017-09-20 00:00:00 risk_exposure: 6.498744682276766e-31\n",
"2019-02-10 00:39:41,805 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:39:41,809 - ALPHA_MIND - INFO - 2017-10-25 00:00:00 is finished with 3295 stocks for SIZE\n",
"2019-02-10 00:39:41,813 - ALPHA_MIND - INFO - 2017-10-25 00:00:00 risk_exposure: 2.5636667803086236e-31\n",
"2019-02-10 00:39:48,430 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:39:48,433 - ALPHA_MIND - INFO - 2017-11-22 00:00:00 is finished with 3332 stocks for SIZE\n",
"2019-02-10 00:39:48,436 - ALPHA_MIND - INFO - 2017-11-22 00:00:00 risk_exposure: 7.884309446523115e-31\n",
"2019-02-10 00:39:51,764 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:39:51,767 - ALPHA_MIND - INFO - 2017-12-20 00:00:00 is finished with 3362 stocks for SIZE\n",
"2019-02-10 00:39:51,771 - ALPHA_MIND - INFO - 2017-12-20 00:00:00 risk_exposure: 3.4546698691358624e-31\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 00:39:55,211 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:39:55,214 - ALPHA_MIND - INFO - 2018-01-18 00:00:00 is finished with 3386 stocks for SIZE\n",
"2019-02-10 00:39:55,218 - ALPHA_MIND - INFO - 2018-01-18 00:00:00 risk_exposure: 2.2368285841177516e-31\n",
"2019-02-10 00:39:58,672 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:39:58,674 - ALPHA_MIND - INFO - 2018-02-22 00:00:00 is finished with 3433 stocks for SIZE\n",
"2019-02-10 00:39:58,677 - ALPHA_MIND - INFO - 2018-02-22 00:00:00 risk_exposure: 4.486309577858139e-07\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Wall time: 3min 30s\n"
]
}
],
"source": [ "source": [
"%%time\n", "%%time\n",
"res = [risk_factor_analysis(factor) for factor in candidates_factors]" "res = [risk_factor_analysis(factor) for factor in candidates_factors]"
...@@ -97,7 +285,7 @@ ...@@ -97,7 +285,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 6,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -110,9 +298,62 @@ ...@@ -110,9 +298,62 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 7,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>abs t.</th>\n",
" </tr>\n",
" <tr>\n",
" <th>factor</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>SIZE</th>\n",
" <td>4.764919</td>\n",
" </tr>\n",
" <tr>\n",
" <th>BETA</th>\n",
" <td>2.538497</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" abs t.\n",
"factor \n",
"SIZE 4.764919\n",
"BETA 2.538497"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"df['abs t.'] = np.abs(df['t.'])\n", "df['abs t.'] = np.abs(df['t.'])\n",
"df[['factor', 'abs t.']].groupby('factor').mean().sort_values('abs t.', ascending=False).head()" "df[['factor', 'abs t.']].groupby('factor').mean().sort_values('abs t.', ascending=False).head()"
...@@ -142,7 +383,7 @@ ...@@ -142,7 +383,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.6.5" "version": "3.6.8"
}, },
"varInspector": { "varInspector": {
"cols": { "cols": {
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 1,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 2,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -47,7 +47,7 @@ ...@@ -47,7 +47,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 3,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -58,7 +58,7 @@ ...@@ -58,7 +58,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 4,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -81,7 +81,7 @@ ...@@ -81,7 +81,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 5,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -102,9 +102,19 @@ ...@@ -102,9 +102,19 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 6,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"total weight is 1.0000\n",
"portfolio activate weight forecasting vol is 0.0250\n",
"portfolio er: 2.2232 comparing with benchmark er: 1.2359\n"
]
}
],
"source": [ "source": [
"# check the result\n", "# check the result\n",
"print(f\"total weight is {p_weight.sum(): .4f}\")\n", "print(f\"total weight is {p_weight.sum(): .4f}\")\n",
...@@ -122,7 +132,7 @@ ...@@ -122,7 +132,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 7,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -149,7 +159,7 @@ ...@@ -149,7 +159,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 8,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -174,7 +184,7 @@ ...@@ -174,7 +184,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 9,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -209,7 +219,7 @@ ...@@ -209,7 +219,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 10,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -224,9 +234,80 @@ ...@@ -224,9 +234,80 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 11,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 00:37:10,009 - ALPHA_MIND - INFO - alpha factor data loading finished ...\n",
"2019-02-10 00:37:11,605 - ALPHA_MIND - INFO - industry data loading finished ...\n",
"2019-02-10 00:37:12,757 - ALPHA_MIND - INFO - benchmark data loading finished ...\n",
"2019-02-10 00:37:23,289 - ALPHA_MIND - INFO - risk_model data loading finished ...\n",
"2019-02-10 00:37:39,142 - ALPHA_MIND - INFO - returns data loading finished ...\n",
"2019-02-10 00:37:39,427 - ALPHA_MIND - INFO - starting backting ...\n",
"2019-02-10 00:37:39,521 - ALPHA_MIND - INFO - alpha models training finished ...\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\pandas\\core\\frame.py:4024: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame\n",
"\n",
"See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
" downcast=downcast, **kwargs)\n",
"2019-02-10 00:37:39,662 - ALPHA_MIND - INFO - 2016-01-04 00:00:00 re-balance: 799 codes\n",
"2019-02-10 00:37:39,811 - ALPHA_MIND - INFO - 2016-01-18 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:39,981 - ALPHA_MIND - INFO - 2016-02-01 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:40,148 - ALPHA_MIND - INFO - 2016-02-22 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:40,314 - ALPHA_MIND - INFO - 2016-03-07 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:40,495 - ALPHA_MIND - INFO - 2016-03-21 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:40,670 - ALPHA_MIND - INFO - 2016-04-05 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:40,841 - ALPHA_MIND - INFO - 2016-04-19 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:40,987 - ALPHA_MIND - INFO - 2016-05-04 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:41,117 - ALPHA_MIND - INFO - 2016-05-18 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:41,243 - ALPHA_MIND - INFO - 2016-06-01 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:41,357 - ALPHA_MIND - INFO - 2016-06-17 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:41,480 - ALPHA_MIND - INFO - 2016-07-01 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:41,598 - ALPHA_MIND - INFO - 2016-07-15 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:41,715 - ALPHA_MIND - INFO - 2016-07-29 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:41,829 - ALPHA_MIND - INFO - 2016-08-12 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:41,951 - ALPHA_MIND - INFO - 2016-08-26 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:42,072 - ALPHA_MIND - INFO - 2016-09-09 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:42,189 - ALPHA_MIND - INFO - 2016-09-27 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:42,301 - ALPHA_MIND - INFO - 2016-10-18 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:42,416 - ALPHA_MIND - INFO - 2016-11-01 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:42,553 - ALPHA_MIND - INFO - 2016-11-15 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:42,710 - ALPHA_MIND - INFO - 2016-11-29 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:42,843 - ALPHA_MIND - INFO - 2016-12-13 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:42,967 - ALPHA_MIND - INFO - 2016-12-27 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:43,089 - ALPHA_MIND - INFO - 2017-01-11 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:43,222 - ALPHA_MIND - INFO - 2017-01-25 00:00:00 re-balance: 799 codes\n",
"2019-02-10 00:37:43,341 - ALPHA_MIND - INFO - 2017-02-15 00:00:00 re-balance: 799 codes\n",
"2019-02-10 00:37:43,466 - ALPHA_MIND - INFO - 2017-03-01 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:43,589 - ALPHA_MIND - INFO - 2017-03-15 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:43,719 - ALPHA_MIND - INFO - 2017-03-29 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:43,842 - ALPHA_MIND - INFO - 2017-04-14 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:43,958 - ALPHA_MIND - INFO - 2017-04-28 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:44,082 - ALPHA_MIND - INFO - 2017-05-15 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:44,212 - ALPHA_MIND - INFO - 2017-05-31 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:44,337 - ALPHA_MIND - INFO - 2017-06-14 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:44,457 - ALPHA_MIND - INFO - 2017-06-28 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:44,580 - ALPHA_MIND - INFO - 2017-07-12 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:44,703 - ALPHA_MIND - INFO - 2017-07-26 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:44,835 - ALPHA_MIND - INFO - 2017-08-09 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:44,939 - ALPHA_MIND - INFO - 2017-08-23 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:45,059 - ALPHA_MIND - INFO - 2017-09-06 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:45,175 - ALPHA_MIND - INFO - 2017-09-20 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:45,298 - ALPHA_MIND - INFO - 2017-10-11 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:45,417 - ALPHA_MIND - INFO - 2017-10-25 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:45,539 - ALPHA_MIND - INFO - 2017-11-08 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:45,686 - ALPHA_MIND - INFO - 2017-11-22 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:45,842 - ALPHA_MIND - INFO - 2017-12-06 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:46,005 - ALPHA_MIND - INFO - 2017-12-20 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:46,150 - ALPHA_MIND - INFO - 2018-01-04 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:46,295 - ALPHA_MIND - INFO - 2018-01-18 00:00:00 re-balance: 800 codes\n",
"2019-02-10 00:37:46,464 - ALPHA_MIND - INFO - 2018-02-01 00:00:00 re-balance: 800 codes\n"
]
}
],
"source": [ "source": [
"\"\"\"\n", "\"\"\"\n",
"Strategy run\n", "Strategy run\n",
...@@ -244,9 +325,32 @@ ...@@ -244,9 +325,32 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 12,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x192ff3d0eb8>"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 1008x504 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [ "source": [
"ret_df[['excess_return', 'turn_over']].cumsum().plot(figsize=(14, 7),\n", "ret_df[['excess_return', 'turn_over']].cumsum().plot(figsize=(14, 7),\n",
" title='Fixed freq rebalanced with target vol \\\n", " title='Fixed freq rebalanced with target vol \\\n",
...@@ -278,7 +382,7 @@ ...@@ -278,7 +382,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.6.5" "version": "3.6.8"
}, },
"varInspector": { "varInspector": {
"cols": { "cols": {
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 1,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 2,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -75,9 +75,26 @@ ...@@ -75,9 +75,26 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 3,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 00:39:31,620 - ALPHA_MIND - INFO - sh50 is finished\n",
"2019-02-10 00:39:31,648 - ALPHA_MIND - INFO - hs300 is finished\n",
"2019-02-10 00:39:31,682 - ALPHA_MIND - INFO - zz500 is finished\n",
"2019-02-10 00:39:31,738 - ALPHA_MIND - INFO - zz800 is finished\n",
"2019-02-10 00:39:31,789 - ALPHA_MIND - INFO - zz1000 is finished\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\cvxpy-1.0.10-py3.6-win-amd64.egg\\cvxpy\\problems\\problem.py:614: RuntimeWarning: overflow encountered in long_scalars\n",
" if self.max_big_small_squared < big*small**2:\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\cvxpy-1.0.10-py3.6-win-amd64.egg\\cvxpy\\problems\\problem.py:615: RuntimeWarning: overflow encountered in long_scalars\n",
" self.max_big_small_squared = big*small**2\n",
"2019-02-10 00:39:31,962 - ALPHA_MIND - INFO - ashare_ex is finished\n"
]
}
],
"source": [ "source": [
"df = pd.DataFrame(columns=u_names, index=['cvxpy', 'alphamind'])\n", "df = pd.DataFrame(columns=u_names, index=['cvxpy', 'alphamind'])\n",
"\n", "\n",
...@@ -122,18 +139,92 @@ ...@@ -122,18 +139,92 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 4,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>sh50</th>\n",
" <th>hs300</th>\n",
" <th>zz500</th>\n",
" <th>zz800</th>\n",
" <th>zz1000</th>\n",
" <th>ashare_ex</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>cvxpy</th>\n",
" <td>4.58</td>\n",
" <td>6.41</td>\n",
" <td>9.76</td>\n",
" <td>14.33</td>\n",
" <td>19.88</td>\n",
" <td>61.95</td>\n",
" </tr>\n",
" <tr>\n",
" <th>alphamind</th>\n",
" <td>1.35</td>\n",
" <td>3.50</td>\n",
" <td>4.88</td>\n",
" <td>9.03</td>\n",
" <td>4.97</td>\n",
" <td>27.62</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" sh50 hs300 zz500 zz800 zz1000 ashare_ex\n",
"cvxpy 4.58 6.41 9.76 14.33 19.88 61.95\n",
"alphamind 1.35 3.50 4.88 9.03 4.97 27.62"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"df" "df"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 5,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"text/plain": [
"-5.262849995706494"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"prob.value" "prob.value"
] ]
...@@ -148,9 +239,22 @@ ...@@ -148,9 +239,22 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 6,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 00:39:32,075 - ALPHA_MIND - INFO - sh50 is finished\n",
"2019-02-10 00:39:32,209 - ALPHA_MIND - INFO - hs300 is finished\n",
"2019-02-10 00:39:32,469 - ALPHA_MIND - INFO - zz500 is finished\n",
"2019-02-10 00:39:32,998 - ALPHA_MIND - INFO - zz800 is finished\n",
"2019-02-10 00:39:33,755 - ALPHA_MIND - INFO - zz1000 is finished\n",
"2019-02-10 00:39:40,815 - ALPHA_MIND - INFO - ashare_ex is finished\n"
]
}
],
"source": [ "source": [
"from cvxpy import pnorm\n", "from cvxpy import pnorm\n",
"\n", "\n",
...@@ -253,9 +357,92 @@ ...@@ -253,9 +357,92 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 7,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>sh50</th>\n",
" <th>hs300</th>\n",
" <th>zz500</th>\n",
" <th>zz800</th>\n",
" <th>zz1000</th>\n",
" <th>ashare_ex</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>cvxpy</th>\n",
" <td>8.49</td>\n",
" <td>13.78</td>\n",
" <td>21.18</td>\n",
" <td>33.32</td>\n",
" <td>43.27</td>\n",
" <td>176.12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>alphamind (clp simplex)</th>\n",
" <td>0.63</td>\n",
" <td>8.76</td>\n",
" <td>26.53</td>\n",
" <td>65.43</td>\n",
" <td>112.34</td>\n",
" <td>1,585.36</td>\n",
" </tr>\n",
" <tr>\n",
" <th>alphamind (clp interior)</th>\n",
" <td>19.95</td>\n",
" <td>28.48</td>\n",
" <td>46.78</td>\n",
" <td>114.66</td>\n",
" <td>170.22</td>\n",
" <td>1,462.77</td>\n",
" </tr>\n",
" <tr>\n",
" <th>alphamind (ecos)</th>\n",
" <td>10.03</td>\n",
" <td>14.87</td>\n",
" <td>33.66</td>\n",
" <td>49.57</td>\n",
" <td>52.49</td>\n",
" <td>340.38</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" sh50 hs300 zz500 zz800 zz1000 ashare_ex\n",
"cvxpy 8.49 13.78 21.18 33.32 43.27 176.12\n",
"alphamind (clp simplex) 0.63 8.76 26.53 65.43 112.34 1,585.36\n",
"alphamind (clp interior) 19.95 28.48 46.78 114.66 170.22 1,462.77\n",
"alphamind (ecos) 10.03 14.87 33.66 49.57 52.49 340.38"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"df" "df"
] ]
...@@ -272,9 +459,22 @@ ...@@ -272,9 +459,22 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 8,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 00:39:40,951 - ALPHA_MIND - INFO - sh50 is finished\n",
"2019-02-10 00:39:41,217 - ALPHA_MIND - INFO - hs300 is finished\n",
"2019-02-10 00:39:41,592 - ALPHA_MIND - INFO - zz500 is finished\n",
"2019-02-10 00:39:42,175 - ALPHA_MIND - INFO - zz800 is finished\n",
"2019-02-10 00:39:42,796 - ALPHA_MIND - INFO - zz1000 is finished\n",
"2019-02-10 00:39:45,458 - ALPHA_MIND - INFO - ashare_ex is finished\n"
]
}
],
"source": [ "source": [
"from cvxpy import *\n", "from cvxpy import *\n",
"\n", "\n",
...@@ -335,9 +535,72 @@ ...@@ -335,9 +535,72 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 9,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>sh50</th>\n",
" <th>hs300</th>\n",
" <th>zz500</th>\n",
" <th>zz800</th>\n",
" <th>zz1000</th>\n",
" <th>ashare_ex</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>cvxpy</th>\n",
" <td>19.52</td>\n",
" <td>54.76</td>\n",
" <td>83.50</td>\n",
" <td>104.39</td>\n",
" <td>143.43</td>\n",
" <td>550.83</td>\n",
" </tr>\n",
" <tr>\n",
" <th>alphamind</th>\n",
" <td>31.92</td>\n",
" <td>70.01</td>\n",
" <td>95.37</td>\n",
" <td>156.45</td>\n",
" <td>154.81</td>\n",
" <td>623.11</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" sh50 hs300 zz500 zz800 zz1000 ashare_ex\n",
"cvxpy 19.52 54.76 83.50 104.39 143.43 550.83\n",
"alphamind 31.92 70.01 95.37 156.45 154.81 623.11"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"df" "df"
] ]
...@@ -352,9 +615,22 @@ ...@@ -352,9 +615,22 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 10,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 00:39:45,561 - ALPHA_MIND - INFO - sh50 is finished\n",
"2019-02-10 00:39:45,704 - ALPHA_MIND - INFO - hs300 is finished\n",
"2019-02-10 00:39:45,943 - ALPHA_MIND - INFO - zz500 is finished\n",
"2019-02-10 00:39:46,729 - ALPHA_MIND - INFO - zz800 is finished\n",
"2019-02-10 00:39:47,099 - ALPHA_MIND - INFO - zz1000 is finished\n",
"2019-02-10 00:39:49,245 - ALPHA_MIND - INFO - ashare_ex is finished\n"
]
}
],
"source": [ "source": [
"df = pd.DataFrame(columns=u_names, index=['cvxpy', 'alphamind'])\n", "df = pd.DataFrame(columns=u_names, index=['cvxpy', 'alphamind'])\n",
"number = 1\n", "number = 1\n",
...@@ -414,9 +690,72 @@ ...@@ -414,9 +690,72 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 11,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>sh50</th>\n",
" <th>hs300</th>\n",
" <th>zz500</th>\n",
" <th>zz800</th>\n",
" <th>zz1000</th>\n",
" <th>ashare_ex</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>cvxpy</th>\n",
" <td>19.41</td>\n",
" <td>49.60</td>\n",
" <td>75.66</td>\n",
" <td>337.10</td>\n",
" <td>115.25</td>\n",
" <td>392.13</td>\n",
" </tr>\n",
" <tr>\n",
" <th>alphamind</th>\n",
" <td>7.35</td>\n",
" <td>18.63</td>\n",
" <td>34.55</td>\n",
" <td>52.96</td>\n",
" <td>46.70</td>\n",
" <td>160.48</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" sh50 hs300 zz500 zz800 zz1000 ashare_ex\n",
"cvxpy 19.41 49.60 75.66 337.10 115.25 392.13\n",
"alphamind 7.35 18.63 34.55 52.96 46.70 160.48"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"df" "df"
] ]
...@@ -431,9 +770,22 @@ ...@@ -431,9 +770,22 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 12,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 00:39:49,364 - ALPHA_MIND - INFO - sh50 is finished\n",
"2019-02-10 00:39:49,480 - ALPHA_MIND - INFO - hs300 is finished\n",
"2019-02-10 00:39:49,680 - ALPHA_MIND - INFO - zz500 is finished\n",
"2019-02-10 00:39:50,021 - ALPHA_MIND - INFO - zz800 is finished\n",
"2019-02-10 00:39:50,458 - ALPHA_MIND - INFO - zz1000 is finished\n",
"2019-02-10 00:39:52,248 - ALPHA_MIND - INFO - ashare_ex is finished\n"
]
}
],
"source": [ "source": [
"df = pd.DataFrame(columns=u_names, index=['cvxpy', 'alphamind'])\n", "df = pd.DataFrame(columns=u_names, index=['cvxpy', 'alphamind'])\n",
"number = 1\n", "number = 1\n",
...@@ -498,9 +850,72 @@ ...@@ -498,9 +850,72 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 13,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>sh50</th>\n",
" <th>hs300</th>\n",
" <th>zz500</th>\n",
" <th>zz800</th>\n",
" <th>zz1000</th>\n",
" <th>ashare_ex</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>cvxpy</th>\n",
" <td>19.20</td>\n",
" <td>39.56</td>\n",
" <td>60.21</td>\n",
" <td>104.13</td>\n",
" <td>153.07</td>\n",
" <td>628.02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>alphamind</th>\n",
" <td>10.89</td>\n",
" <td>16.91</td>\n",
" <td>43.05</td>\n",
" <td>47.43</td>\n",
" <td>45.44</td>\n",
" <td>146.20</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" sh50 hs300 zz500 zz800 zz1000 ashare_ex\n",
"cvxpy 19.20 39.56 60.21 104.13 153.07 628.02\n",
"alphamind 10.89 16.91 43.05 47.43 45.44 146.20"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"df" "df"
] ]
...@@ -515,9 +930,22 @@ ...@@ -515,9 +930,22 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 14,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 00:39:52,370 - ALPHA_MIND - INFO - sh50 is finished\n",
"2019-02-10 00:39:52,532 - ALPHA_MIND - INFO - hs300 is finished\n",
"2019-02-10 00:39:52,798 - ALPHA_MIND - INFO - zz500 is finished\n",
"2019-02-10 00:39:53,099 - ALPHA_MIND - INFO - zz800 is finished\n",
"2019-02-10 00:39:53,589 - ALPHA_MIND - INFO - zz1000 is finished\n",
"2019-02-10 00:39:55,894 - ALPHA_MIND - INFO - ashare_ex is finished\n"
]
}
],
"source": [ "source": [
"df = pd.DataFrame(columns=u_names, index=['cvxpy', 'alphamind'])\n", "df = pd.DataFrame(columns=u_names, index=['cvxpy', 'alphamind'])\n",
"number = 1\n", "number = 1\n",
...@@ -589,9 +1017,72 @@ ...@@ -589,9 +1017,72 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 15,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>sh50</th>\n",
" <th>hs300</th>\n",
" <th>zz500</th>\n",
" <th>zz800</th>\n",
" <th>zz1000</th>\n",
" <th>ashare_ex</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>cvxpy</th>\n",
" <td>19.62</td>\n",
" <td>45.64</td>\n",
" <td>58.58</td>\n",
" <td>92.44</td>\n",
" <td>152.57</td>\n",
" <td>831.04</td>\n",
" </tr>\n",
" <tr>\n",
" <th>alphamind</th>\n",
" <td>13.23</td>\n",
" <td>26.67</td>\n",
" <td>58.33</td>\n",
" <td>51.23</td>\n",
" <td>87.07</td>\n",
" <td>223.06</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" sh50 hs300 zz500 zz800 zz1000 ashare_ex\n",
"cvxpy 19.62 45.64 58.58 92.44 152.57 831.04\n",
"alphamind 13.23 26.67 58.33 51.23 87.07 223.06"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"df" "df"
] ]
...@@ -620,7 +1111,7 @@ ...@@ -620,7 +1111,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.6.5" "version": "3.6.8"
}, },
"varInspector": { "varInspector": {
"cols": { "cols": {
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 1,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -29,16 +29,24 @@ ...@@ -29,16 +29,24 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 2,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"512647@wmcloud.com 账号登录成功\n"
]
}
],
"source": [ "source": [
"_ = uqer.Client(token=os.environ['DATAYES_TOKEN'])" "_ = uqer.Client(token=os.environ['DATAYES_TOKEN'])"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 3,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -97,7 +105,7 @@ ...@@ -97,7 +105,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 4,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -109,7 +117,7 @@ ...@@ -109,7 +117,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 5,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -119,9 +127,20 @@ ...@@ -119,9 +127,20 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 6,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"text/plain": [
"800"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"len(total_data)" "len(total_data)"
] ]
...@@ -136,9 +155,17 @@ ...@@ -136,9 +155,17 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 7,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"241 ms ± 67.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
]
}
],
"source": [ "source": [
"%%timeit\n", "%%timeit\n",
"neutralized_factor_uqer = uqer.neutralize(total_data[factor],\n", "neutralized_factor_uqer = uqer.neutralize(total_data[factor],\n",
...@@ -148,31 +175,181 @@ ...@@ -148,31 +175,181 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 68,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>uqer</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>000001</th>\n",
" <td>0.103040</td>\n",
" </tr>\n",
" <tr>\n",
" <th>000002</th>\n",
" <td>-0.314564</td>\n",
" </tr>\n",
" <tr>\n",
" <th>000006</th>\n",
" <td>-0.069171</td>\n",
" </tr>\n",
" <tr>\n",
" <th>000008</th>\n",
" <td>-0.042660</td>\n",
" </tr>\n",
" <tr>\n",
" <th>000009</th>\n",
" <td>-0.018216</td>\n",
" </tr>\n",
" <tr>\n",
" <th>000012</th>\n",
" <td>0.052925</td>\n",
" </tr>\n",
" <tr>\n",
" <th>000021</th>\n",
" <td>0.073551</td>\n",
" </tr>\n",
" <tr>\n",
" <th>000025</th>\n",
" <td>-0.108673</td>\n",
" </tr>\n",
" <tr>\n",
" <th>000027</th>\n",
" <td>-0.029886</td>\n",
" </tr>\n",
" <tr>\n",
" <th>000028</th>\n",
" <td>0.367258</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" uqer\n",
"000001 0.103040\n",
"000002 -0.314564\n",
"000006 -0.069171\n",
"000008 -0.042660\n",
"000009 -0.018216\n",
"000012 0.052925\n",
"000021 0.073551\n",
"000025 -0.108673\n",
"000027 -0.029886\n",
"000028 0.367258"
]
},
"execution_count": 68,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"neutralized_factor_uqer = uqer.neutralize(total_data[factor],\n", "neutralized_factor_uqer = uqer.neutralize(total_data[factor],\n",
" target_date=ref_date.replace('-', ''),\n", " target_date=ref_date.replace('-', ''),\n",
" industry_type='short')\n", " industry_type='short').sort_index()\n",
"df = pd.DataFrame(neutralized_factor_uqer, columns=['uqer'])\n", "df = pd.DataFrame(neutralized_factor_uqer, columns=['uqer'])\n",
"df.head(10)" "df.head(10)"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 69,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"text/plain": [
"800"
]
},
"execution_count": 69,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"len(neutralized_factor_uqer)" "len(neutralized_factor_uqer)"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 70,
"metadata": {}, "metadata": {
"outputs": [], "scrolled": false
},
"outputs": [
{
"data": {
"text/plain": [
"BETA -7.105427e-14\n",
"MOMENTUM 1.025846e-13\n",
"SIZE 2.664535e-15\n",
"EARNYILD -4.263256e-14\n",
"RESVOL 2.375877e-14\n",
"GROWTH 8.881784e-14\n",
"BTOP -5.817569e-14\n",
"LEVERAGE -1.318945e-13\n",
"LIQUIDTY -4.685141e-14\n",
"SIZENL -3.108624e-15\n",
"Bank 8.881784e-16\n",
"RealEstate -1.443290e-14\n",
"Health 4.218847e-14\n",
"Transportation 4.690692e-15\n",
"Mining -4.996004e-16\n",
"NonFerMetal -1.151856e-15\n",
"HouseApp 4.996004e-16\n",
"LeiService 9.436896e-16\n",
"MachiEquip 9.436896e-16\n",
"BuildDeco -1.731948e-14\n",
"CommeTrade 2.975398e-14\n",
"CONMAT 3.108624e-15\n",
"Auto 1.154632e-14\n",
"Textile 4.773959e-15\n",
"FoodBever -3.108624e-15\n",
"Electronics 3.663736e-15\n",
"Computer 3.663736e-15\n",
"LightIndus -1.038059e-14\n",
"Utilities 2.074729e-14\n",
"Telecom -1.165734e-15\n",
"AgriForest -9.159340e-15\n",
"CHEM 1.409983e-14\n",
"Media -5.134781e-15\n",
"IronSteel -4.177214e-15\n",
"NonBankFinan -2.448042e-14\n",
"ELECEQP -1.088019e-14\n",
"AERODEF -2.303713e-15\n",
"Conglomerates -3.913536e-15\n",
"dtype: float64"
]
},
"execution_count": 70,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"risk_exposure_uqer = uqer.DataAPI.RMExposureDayGet(tradeDate=ref_date.replace('-', '')).set_index('ticker')\n", "risk_exposure_uqer = uqer.DataAPI.RMExposureDayGet(tradeDate=ref_date.replace('-', '')).set_index('ticker')\n",
"targeted_secs = risk_exposure_uqer.loc[neutralized_factor_uqer.index]\n", "targeted_secs = risk_exposure_uqer.loc[neutralized_factor_uqer.index]\n",
...@@ -194,19 +371,27 @@ ...@@ -194,19 +371,27 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 71,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"x = total_data[risk_styles + industry_styles].values\n", "x = targeted_secs[risk_styles + industry_styles].values\n",
"y = total_data[factor].values" "y = total_data[factor].values"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 72,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"119 µs ± 3.1 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n"
]
}
],
"source": [ "source": [
"%%timeit\n", "%%timeit\n",
"neutralized_factor_alphamind = neutralize(x, y, weights=np.ones(len(y)))" "neutralized_factor_alphamind = neutralize(x, y, weights=np.ones(len(y)))"
...@@ -214,9 +399,78 @@ ...@@ -214,9 +399,78 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 73,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>uqer</th>\n",
" <th>alpha-mind</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>000001</th>\n",
" <td>0.103040</td>\n",
" <td>0.103040</td>\n",
" </tr>\n",
" <tr>\n",
" <th>000002</th>\n",
" <td>-0.314564</td>\n",
" <td>-0.314564</td>\n",
" </tr>\n",
" <tr>\n",
" <th>000006</th>\n",
" <td>-0.069171</td>\n",
" <td>-0.069171</td>\n",
" </tr>\n",
" <tr>\n",
" <th>000008</th>\n",
" <td>-0.042660</td>\n",
" <td>-0.042660</td>\n",
" </tr>\n",
" <tr>\n",
" <th>000009</th>\n",
" <td>-0.018216</td>\n",
" <td>-0.018216</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" uqer alpha-mind\n",
"000001 0.103040 0.103040\n",
"000002 -0.314564 -0.314564\n",
"000006 -0.069171 -0.069171\n",
"000008 -0.042660 -0.042660\n",
"000009 -0.018216 -0.018216"
]
},
"execution_count": 73,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"neutralized_factor_alphamind = neutralize(x, y, weights=np.ones(len(y)))\n", "neutralized_factor_alphamind = neutralize(x, y, weights=np.ones(len(y)))\n",
"alphamind_series = pd.Series(neutralized_factor_alphamind.flatten(), index=total_data.index)\n", "alphamind_series = pd.Series(neutralized_factor_alphamind.flatten(), index=total_data.index)\n",
...@@ -226,13 +480,85 @@ ...@@ -226,13 +480,85 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 74,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"text/plain": [
"800"
]
},
"execution_count": 74,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"len(alphamind_series)" "len(alphamind_series)"
] ]
}, },
{
"cell_type": "code",
"execution_count": 77,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"BETA -5.773160e-15\n",
"MOMENTUM -1.065814e-14\n",
"SIZE -5.329071e-15\n",
"EARNYILD -2.309264e-14\n",
"RESVOL -6.328271e-15\n",
"GROWTH 5.329071e-15\n",
"BTOP 0.000000e+00\n",
"LEVERAGE 1.398881e-14\n",
"LIQUIDTY -1.376677e-14\n",
"SIZENL -5.551115e-15\n",
"Bank -1.776357e-15\n",
"RealEstate -2.220446e-15\n",
"Health 1.332268e-15\n",
"Transportation 1.887379e-15\n",
"Mining -1.526557e-15\n",
"NonFerMetal -1.221245e-15\n",
"HouseApp -9.992007e-16\n",
"LeiService -2.775558e-17\n",
"MachiEquip -8.604228e-16\n",
"BuildDeco 1.193490e-15\n",
"CommeTrade -2.220446e-15\n",
"CONMAT -2.220446e-16\n",
"Auto 1.332268e-15\n",
"Textile 3.330669e-16\n",
"FoodBever 1.776357e-15\n",
"Electronics -3.053113e-15\n",
"Computer -6.106227e-16\n",
"LightIndus -2.775558e-17\n",
"Utilities -9.436896e-16\n",
"Telecom -4.718448e-16\n",
"AgriForest -2.775558e-17\n",
"CHEM 6.661338e-16\n",
"Media -2.525757e-15\n",
"IronSteel -5.551115e-17\n",
"NonBankFinan -5.551115e-16\n",
"ELECEQP 4.440892e-16\n",
"AERODEF -2.081668e-16\n",
"Conglomerates -3.053113e-16\n",
"dtype: float64"
]
},
"execution_count": 77,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"style_exposure = targeted_secs[risk_styles].values.T @ neutralized_factor_alphamind\n",
"industry_exposure = targeted_secs[industry_styles].values.T @ neutralized_factor_alphamind\n",
"exposure = pd.Series(np.concatenate([style_exposure[:, 0], industry_exposure[:, 0]]), index=risk_styles+industry_styles)\n",
"exposure"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
...@@ -243,7 +569,7 @@ ...@@ -243,7 +569,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 78,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -252,9 +578,96 @@ ...@@ -252,9 +578,96 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 79,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>EPS</th>\n",
" <th>code</th>\n",
" <th>chgPct</th>\n",
" <th>secShortName</th>\n",
" <th>srisk</th>\n",
" <th>BETA</th>\n",
" <th>MOMENTUM</th>\n",
" <th>SIZE</th>\n",
" <th>EARNYILD</th>\n",
" <th>RESVOL</th>\n",
" <th>...</th>\n",
" <th>Telecom</th>\n",
" <th>AgriForest</th>\n",
" <th>CHEM</th>\n",
" <th>Media</th>\n",
" <th>IronSteel</th>\n",
" <th>NonBankFinan</th>\n",
" <th>ELECEQP</th>\n",
" <th>AERODEF</th>\n",
" <th>Conglomerates</th>\n",
" <th>COUNTRY</th>\n",
" </tr>\n",
" <tr>\n",
" <th>ticker</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" </tbody>\n",
"</table>\n",
"<p>0 rows × 44 columns</p>\n",
"</div>"
],
"text/plain": [
"Empty DataFrame\n",
"Columns: [EPS, code, chgPct, secShortName, srisk, BETA, MOMENTUM, SIZE, EARNYILD, RESVOL, GROWTH, BTOP, LEVERAGE, LIQUIDTY, SIZENL, Bank, RealEstate, Health, Transportation, Mining, NonFerMetal, HouseApp, LeiService, MachiEquip, BuildDeco, CommeTrade, CONMAT, Auto, Textile, FoodBever, Electronics, Computer, LightIndus, Utilities, Telecom, AgriForest, CHEM, Media, IronSteel, NonBankFinan, ELECEQP, AERODEF, Conglomerates, COUNTRY]\n",
"Index: []\n",
"\n",
"[0 rows x 44 columns]"
]
},
"execution_count": 79,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"total_data.loc[missed_codes]" "total_data.loc[missed_codes]"
] ]
...@@ -269,7 +682,7 @@ ...@@ -269,7 +682,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 80,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -278,7 +691,7 @@ ...@@ -278,7 +691,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 81,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -288,7 +701,7 @@ ...@@ -288,7 +701,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 82,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -305,7 +718,7 @@ ...@@ -305,7 +718,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 83,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -315,18 +728,128 @@ ...@@ -315,18 +728,128 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 84,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x2310007acf8>"
]
},
"execution_count": 84,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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z11++eUsWbKECRMmbDOr9Z73vIe1a9cyb948Go0GkyZN4pprrtnhfZg/fz7//M//zNy5c+np6eHcc89l//33Z+3atVv7LF++nJtuuone3l72339/zjzzzB3eXjfpGc00326q0d/f3+l92O319fWxfv36Tu/Gbs0adAfr0B2sQ3ewDp1nDbbf008/3fKUvB21PacXjtbatWtZuHAhq1atauu4LwTNajhlyhSA1udnFp5eKEmSJEk1MnRJkiRJAuCggw5ylqsGhi5JkiRJqpGhS5IkSZJqZOiSJEmSpBoZuiRJkiSpRoYuSZIkaTd21FFHsWHDhjH32RGXXnopP/jBD7ZrnXbty9q1a5k9e/aYxxkNPxxZkiRJUkd8/OMf7/Qu7BSGLkmSJGk38MEPfpD+/n42btzIokWLeN/73rfN82vXruW9730vhx12GKtXr2batGl8+tOfZsKECQBcc801rFy5ks2bN/PFL36RQw45hJ/85Cecf/75PPPMM+y1115cfvnlHHLIIXzta19jxYoVbNmyhQceeIAPfehDbNq0iW984xvsueeeXH/99UycOJGPfexjzJkzhz/+4z/mqKOO4l3vetfztrFhwwZOP/10Hn/8cWbOnEmj0diu4240Glx00UXccccd9PT0cMYZZ7BgwYJt+jzwwAMsWbKETZs20Wg0WLp0KQcffPDYvuGDGLokSZKkneiqe37Dw088M+Zxenp6tgaQaRP34k+PeNmw/T/1qU8xceJEfv/73/O2t72N448/nkmTJm3T58EHH+RTn/oUb3jDG1iyZAnLli3jwx/+MACTJk1ixYoVXHvttXzhC1/gsssu45BDDuGmm26it7eXH/zgB1xyySV86UtfAqogs2LFCjZu3Mib3/xm/uqv/orvfve7nH/++dx444382Z/92fP2sdk2rrjiCo488kjOPPNMbrvtNr7yla9s1/fplltuYfXq1axcuZINGzZw/PHHM2vWrG36XH/99SxatIiTTjqJTZs2sWXLlu3axki8pkuSJEnaDVxzzTXMmTOHt7/97fT39/Pwww8/r8+UKVN4wxveAMBJJ53EXXfdtfW5+fPnA/Da176WtWvXAvDb3/6WD33oQ8yePZu/+Zu/4YEHHtja/01vehMveclLmDx5Mi996UuZO3cuAIceeujW9Ydqto0777yTk046CYA5c+aw7777btdx33XXXZx44omMGzeO/fbbj1mzZnHfffdt0+fwww/n7//+7/nsZz/LunXrts7utYszXZIkSdJONNKM1Gj19vayefPmUfX94Q9/yD/+4z/y7W9/mwkTJnDyySezcePG5/Xr6elpuTx+/HgAxo0bt3Um6NJLL+VNb3oTV199NWvXruXkk0/e2n/PPffc+niPPfbYun5PT0/LmaRm22i2X0PdeuutXH755QBcdtllvO51r9v63GhOR3zHO97BYYcdxu2338573/teLr30Ut7ylreMuN5oOdMlSZIkvcD97ne/Y5999mHChAmsWbOGe++9t2m/X//619xzzz0A3HzzzVtnvYYb9+UvfzkAmdnenS5mzZrFTTfdBMCqVat48sknn9dn/vz5rFy5kpUrV24TuAbWX758OVu2bOHxxx/nxz/+MTNnztymzy9/+Ute+cpXsmjRIubOncv999/f1mMwdEmSJEkvcMcccwxbtmxhzpw5fPKTn+T1r399037Tp0/n61//OnPmzOHJJ59k4cKFw477kY98hL/9279lwYIFbb8OasCZZ57Jj3/8Y9761rfy/e9/n6lTp27X+vPnz+fQQw9l7ty5RATnnnsu+++//zZ9li9fzuzZs5k7dy4PPvjgNjN27dCzvXf/2I00+vv7O70Pu72+vj7Wr1/f6d3YrVmD7mAduoN16A7WofOswfZ7+umnefGLX9zWMbfn9MLRWLt2LQsXLmTVqlVtG/OFpFkNp0yZAjD8uY840yVJkiRJtTJ0SZIkSeKggw5ylqsmhi5JkiSpZl7Ss+sbSw0NXZIkSVLN9thjj7Zef6Wda/Pmzeyxx45HJz+nS5IkSarZXnvtxTPPPMPGjRtH/Myp0Ro/fnzTz9pSezUaDfbYYw/22muvHR7D0CVJkiTVrKenhwkTJrR1TO8iuevw9EJJkiRJqpGhS5IkSZJqZOiSJEmSpBoZuiRJkiSpRoYuSZIkSapRW+5eGBHzgCuBccBVmXnxkOfHA9cBhwOPA+/OzEfKc+cAi4AtwBmZuWK4MSNiGnADMAm4F3h/Zm6KiCuAPyqbfDGwf2buW9bZAvysPPerzDyhHcctSZIkSSMZ80xXRIwDPgvMB2YAp0bEjCHdFgFPZOYhwBXAJWXdGcApwGuAecDnImLcCGNeAlyRmdOBJ8rYZOaZmTkzM2cCfw/cNGj7vx94zsAlSZIkaWdqx+mFRwJrMvOhzNxENQu1YEifBcCy8vhG4NiI6CntN2Tmxsx8GFhTxms6ZllndhmDMuaJTfbpVOCrbTg2SZIkSRqTdpxeOBVYO2h5HXBUqz6ZuTkingIml/Y7h6w7tTxuNuZk4MnM3NykPwAR8UpgGrBqUPNeEXEPsBm4ODO/1exAImIxsLjsJ319fS0OWTtLb2+vdegwa9AdrEN3sA7dwTp0njXoDtZh19GO0NXTpK0xyj6t2pvNwA3Xf7BTgBszc8ugtldkZn9EHAysioifZeaDQwfKzKXA0oFx/YTvzvOT1jvPGnQH69AdrEN3sA6dZw26g3XovClTpoyqXztOL1wHHDRo+UCgv1WfiOgF9gE2DLNuq/b1wL5ljFbbOoUhpxZmZn/59yHge8Bhoz04SZIkSRqLdoSuu4HpETEtIvakCj3Lh/RZDiwsj08GVmVmo7SfEhHjy10JpwN3tRqzrHNHGYMy5s0DG4mI/wZMBH40qG1iuXsiEdEHvBn4eRuOW5IkSZJGNObQVa6v+iiwAri/asrVEXFBRAzcKfBqYHJErAGWAGeXdVcDSRWCvgOcnplbWo1ZxjoLWFLGmlzGHnAq1Y05Bp9yeChwT0TcRxXYLs5MQ5ckSZKknaKn0Rh6SZSKRn//0DMXtbN5rnLnWYPuYB26g3XoDtah86xBd7AOnVeu6Wp234lttOP0QkmSJElSC4YuSZIkSaqRoUuSJEmSamTokiRJkqQaGbokSZIkqUaGLkmSJEmqkaFLkiRJkmpk6JIkSZKkGhm6JEmSJKlGhi5JkiRJqpGhS5IkSZJqZOiSJEmSpBoZuiRJkiSpRoYuSZIkSaqRoUuSJEmSamTokiRJkqQaGbokSZIkqUaGLkmSJEmqkaFLkiRJkmpk6JIkSZKkGhm6JEmSJKlGhi5JkiRJqpGhS5IkSZJqZOiSJEmSpBoZuiRJkiSpRoYuSZIkSaqRoUuSJEmSamTokiRJkqQaGbokSZIkqUaGLkmSJEmqkaFLkiRJkmpk6JIkSZKkGhm6JEmSJKlGhi5JkiRJqpGhS5IkSZJqZOiSJEmSpBoZuiRJkiSpRoYuSZIkSapRbzsGiYh5wJXAOOCqzLx4yPPjgeuAw4HHgXdn5iPluXOARcAW4IzMXDHcmBExDbgBmATcC7w/MzdFxGnApcCvy2Y/k5lXlXUWAueV9osyc1k7jluSJEmSRjLmma6IGAd8FpgPzABOjYgZQ7otAp7IzEOAK4BLyrozgFOA1wDzgM9FxLgRxrwEuCIzpwNPlLEHfC0zZ5avgcA1CTgfOAo4Ejg/IiaO9bglSZIkaTTacXrhkcCazHwoMzdRzUItGNJnATAwu3QjcGxE9JT2GzJzY2Y+DKwp4zUds6wzu4xBGfPEEfbvrcDKzNyQmU8AK6kCniRJkiTVrh2nF04F1g5aXkc1q9S0T2ZujoingMml/c4h604tj5uNORl4MjM3N+kP8M6I+EPg34AzM3Nti/0bvM5WEbEYWFz2k76+vhaHrJ2lt7fXOnSYNegO1qE7WIfuYB06zxp0B+uw62hH6Opp0tYYZZ9W7c1m4IbrD/Bt4KuZuTEiPkw1CzZ7lPsHQGYuBZYO9Fm/fn2zbtqJ+vr6sA6dZQ26g3XoDtahO1iHzrMG3cE6dN6UKVNG1a8dpxeuAw4atHwg0N+qT0T0AvsAG4ZZt1X7emDfMsY228rMxzNzY2n/EtVNO0a7f5IkSZJUi3aErruB6RExLSL2pLoxxvIhfZYDC8vjk4FVmdko7adExPhyV8LpwF2txizr3FHGoIx5M0BEHDBoeycA95fHK4DjImJiuYHGcaVNkiRJkmo35tBVrq/6KFWQub9qytURcUFEnFC6XQ1Mjog1wBLg7LLuaiCBnwPfAU7PzC2txixjnQUsKWNNLmMDnBERqyPiPuAM4LSyjQ3AhVRB7m7ggtImSZIkSbXraTSaXt4kaPT3exZip3mucudZg+5gHbqDdegO1qHzrEF3sA6dV67panYPiW204/RCSZIkSVILhi5JkiRJqpGhS5IkSZJqZOiSJEmSpBoZuiRJkiSpRoYuSZIkSaqRoUuSJEmSamTokiRJkqQaGbokSZIkqUaGLkmSJEmqkaFLkiRJkmpk6JIkSZKkGhm6JEmSJKlGhi5JkiRJqpGhS5IkSZJqZOiSJEmSpBoZuiRJkiSpRoYuSZIkSaqRoUuSJEmSamTokiRJkqQaGbokSZIkqUaGLkmSJEmqkaFLkiRJkmpk6JIkSZKkGhm6JEmSJKlGhi5JkiRJqpGhS5IkSZJqZOiSJEmSpBoZuiRJkiSpRoYuSZIkSaqRoUuSJEmSamTokiRJkqQaGbokSZIkqUaGLkmSJEmqkaFLkiRJkmpk6JIkSZKkGhm6JEmSJKlGhi5JkiRJqpGhS5IkSZJq1NuOQSJiHnAlMA64KjMvHvL8eOA64HDgceDdmflIee4cYBGwBTgjM1cMN2ZETANuACYB9wLvz8xNEbEE+FNgM/AfwAcz85dlnS3Az8ru/CozT2jHcUuSJEnSSMY80xUR44DPAvOBGcCpETFjSLdFwBOZeQhwBXBJWXcGcArwGmAe8LmIGDfCmJcAV2TmdOCJMjbAT4AjMvO1wI3AJwdt//eZObN8GbgkSZIk7TTtOL3wSGBNZj6UmZuoZqEWDOmzAFhWHt8IHBsRPaX9hszcmJkPA2vKeE3HLOvMLmNQxjwRIDPvyMynS/udwIFtODZJkiRJGpN2nF44FVg7aHkdcFSrPpm5OSKeAiaX9juHrDu1PG425mTgyczc3KT/YIuAWwct7xUR91CdenhxZn6r2YFExGJgcdlP+vr6mnXTTtTb22sdOswadAfr0B2sQ3ewDp1nDbqDddh1tCN09TRpa4yyT6v2ZjNww/XfKiLeBxwBHD2o+RWZ2R8RBwOrIuJnmfng0IEycymwdGDc9evXN9mcdqa+vj6sQ2dZg+5gHbqDdegO1qHzrEF3sA6dN2XKlFH1a8fpheuAgwYtHwj0t+oTEb3APsCGYdZt1b4e2LeM8bxtRcQc4FzghMzcONCemf3l34eA7wGHbf9hSpIkSdL2a0fouhuYHhHTImJPqhtjLB/SZzmwsDw+GViVmY3SfkpEjC93JZwO3NVqzLLOHWUMypg3A0TEYcAXqQLXYwMbjoiJ5e6JREQf8Gbg5204bkmSJEka0ZhDV7m+6qPACuD+qilXR8QFETFwp8CrgckRsQZYApxd1l0NJFUI+g5wemZuaTVmGessYEkZa3IZG+BS4CXA1yPipxExEPwOBe6JiPuoAtvFmWnokiRJkrRT9DQaQy+/UtHo7x96lqR2Ns9V7jxr0B2sQ3ewDt3BOnSeNegO1qHzyjVdze47sY12nF4oSZIkSWrB0CVJkiRJNTJ0SZIkSVKNDF2SJEmSVCNDlyRJkiTVyNAlSZIkSTUydEmSJElSjQxdkiRJklQjQ5ckSZIk1cjQJUmSJEk1MnRJkiRJUo0MXZIkSZJUI0OXJEmSJNXI0CVJkiRJNTJ0SZIkSVKNDF2SJEmSVCNDlyRJkiTVyNAlSZIkSTUydEmSJElSjQxdkiRJklQjQ5ckSZIk1cjQJUmSJEk1MnRJkiRJUo0MXZIkSZJUI0OXJEmSJNXI0CVJkiRJNTJ0SZIkSVKNDF2SJEmSVCNDlyRJkiTVyNAlSZIkSTUydEmSJElSjQxdkiRJklQjQ5ckSZIk1cjQJUmSJEk1MnRJkiRJUo0MXZIkSZJUI0OXJEmSJNXI0CVJkiRJNeptxyARMQ+4EhgHXJWZFw95fjxwHXA48Djw7sx8pDx3DrAI2AKckZkrhhszIqYBNwCTgHuB92fmph3ZhiRJkiTVbcwzXRExDvgsMB+YAZwaETOGdFsEPJGZhwBXAJeUdWcApwCvAeYBn4uIcSOMeQlwRWZOB54oY2/3NsZ63JIkSZI0Gu04vfBIYE1mPpSZm6hmoRYM6bMAWFYe3wgcGxE9pf2GzNyYmQ8Da8p4Tccs68wuY1DGPHEHtyFJkiRJtWvH6YVTgbWDltcBR7Xqk5mbI+IpYHJpv3PIulPL42ZjTgaezMzNTfrvyDaG9VfXfG803VSjnp4eGo1Gp3djt2YNuoN16A7WoTtYh86zBt3BOnTetee9Z1T92hG6epq0Da1+qz6t2pvNwA3Xf0e28TwRsRhYDJCZ9PQ0W1U7VU9P0wJqJ7IG3cE6dAfr0B2sQ+dZg+5gHXYZ7Qhd64CDBi0fCPS36LMuInqBfYANI6zbrH09sG9E9JbZrsH9d2Qb28jMpcDSstj4xJ8c3fqotVP09fWxfv36Tu/Gbs0adAfr0B2sQ3ewDp1nDbqDddh1tOOarruB6RExLSL2pLppxfIhfZYDC8vjk4FVmdko7adExPhyV8LpwF2txizr3FHGoIx58w5uQ5IkSZJqN+bQVWacPgqsAO6vmnJ1RFwQESeUblcDkyNiDbAEOLusuxpI4OfAd4DTM3NLqzHLWGcBS8pYk8vY272NsR63JEmSJI1GjxfftdTo7296FqJ2IqfNO88adAfr0B2sQ3ewDp1nDbqDdei8KVOmQPN7SGyjHacXSpIkSZJaMHRJkiRJUo0MXZIkSZJUI0OXJEmSJNXI0CVJkiRJNTJ0SZIkSVKNDF2SJEmSVCNDlyRJkiTVyNAlSZIkSTUydEmSJElSjQxdkiRJklQjQ5ckSZIk1cjQJUmSJEk1MnRJkiRJUo0MXZIkSZJUI0OXJEmSJNXI0CVJkiRJNTJ0SZIkSVKNDF2SJEmSVCNDlyRJkiTVyNAlSZIkSTUydEmSJElSjQxdkiRJklQjQ5ckSZIk1cjQJUmSJEk1MnRJkiRJUo0MXZIkSZJUI0OXJEmSJNXI0CVJkiRJNTJ0SZIkSVKNDF2SJEmSVCNDlyRJkiTVyNAlSZIkSTUydEmSJElSjQxdkiRJklQjQ5ckSZIk1cjQJUmSJEk1MnRJkiRJUo0MXZIkSZJUo96xrBwRk4CvAa8CHgEiM59o0m8hcF5ZvCgzl5X2w4FrgQnALcBfZGaj1bgR0QNcCRwPPA2clpn3RsRM4PPA3sAW4BOZ+bWyjWuBo4GnyvZPy8yfjuW4JUmSJGm0xjrTdTZwe2ZOB24vy9soAep84CjgSOD8iJhYnv48sBiYXr7mjTDu/EF9F5f1oQpgH8jM15Qx/i4i9h20Gx/PzJnly8AlSZIkaacZa+haACwrj5cBJzbp81ZgZWZuKLNgK4F5EXEAsHdm/igzG8B1g9ZvNe4C4LrMbGTmncC+EXFAZv5bZv4CIDP7gceA/cZ4bJIkSZI0ZmM6vRB4WWY+CpCZj0bE/k36TAXWDlpeV9qmlsdD24cbt9VYjw40RMSRwJ7Ag4P6fSIi/poya5aZG5sdTEQspppBIzPp6+trddzaSXp7e61Dh1mD7mAduoN16A7WofOsQXewDruOEUNXRNwGvLzJU+eOchs9Tdoaw7TvyFgAlNmz64GFmflsaT4H+HeqILYUOAu4oNngmbm09AForF+/foTdUd36+vqwDp1lDbqDdegO1qE7WIfOswbdwTp03pQpU0bVb8TQlZlzWj0XEb8pp/c9WgLPY026rQOOGbR8IPC90n7gkPb+8rjVuOuAg5qtExF7A/8AnFdOPRzY/4FZsI0R8WXgL4c5XEmSJElqq7Fe07UcWFgeLwRubtJnBXBcREwsN9A4DlhRwtDvImJWuSvhBwat32rc5cAHIqInImYBT5VgtifwTarrvb4+eOMltFG2cSLwr2M8ZkmSJEkatbFe03UxkBGxCPgV8C6AiDgC+HBm/mlmboiIC4G7yzoXZOaG8vgjPHfL+FvLV8txqW4rfzywhuqOhX9S2gP4Q2ByRJxW2gZuDf+ViNiP6tTEnwIfHuMxS5IkSdKo9TQaI11Gtdtq9Pf3j9xLtfJc5c6zBt3BOnQH69AdrEPnWYPuYB06r1zT1ey+E9sY6+mFkiRJkqRhGLokSZIkqUaGLkmSJEmqkaFLkiRJkmpk6JIkSZKkGhm6JEmSJKlGhi5JkiRJqpGhS5IkSZJqZOiSJEmSpBoZuiRJkiSpRoYuSZIkSaqRoUuSJEmSamTokiRJkqQaGbokSZIkqUaGLkmSJEmqkaFLkiRJkmpk6JIkSZKkGhm6JEmSJKlGhi5JkiRJqpGhS5IkSZJqZOiSJEmSpBoZuiRJkiSpRoYuSZIkSaqRoUuSJEmSamTokiRJkqQaGbokSZIkqUaGLkmSJEmqkaFLkiRJkmpk6JIkSZKkGhm6JEmSJKlGhi5JkiRJqpGhS5IkSZJqZOiSJEmSpBpS9eqcAAAUH0lEQVQZuiRJkiSpRoYuSZIkSaqRoUuSJEmSamTokiRJkqQaGbokSZIkqUaGLkmSJEmqUe9YVo6IScDXgFcBjwCRmU806bcQOK8sXpSZy0r74cC1wATgFuAvMrPRatyI6AGuBI4HngZOy8x7y1hbgJ+VbfwqM08o7dOAG4BJwL3A+zNz01iOW5IkSZJGa6wzXWcDt2fmdOD2sryNEqDOB44CjgTOj4iJ5enPA4uB6eVr3gjjzh/Ud3FZf8DvM3Nm+TphUPslwBVlrCeARWM7ZEmSJEkavbGGrgXAsvJ4GXBikz5vBVZm5oYyC7YSmBcRBwB7Z+aPMrMBXDdo/VbjLgCuy8xGZt4J7FvGaarMjM0GbhxhHyVJkiSpFmM6vRB4WWY+CpCZj0bE/k36TAXWDlpeV9qmlsdD24cbt9VYjwJ7RcQ9wGbg4sz8FjAZeDIzNzfZxvNExGKqGTQyk76+vuGOXTtBb2+vdegwa9AdrEN3sA7dwTp0njXoDtZh1zFi6IqI24CXN3nq3FFuo6dJW2OY9h0ZC+AVmdkfEQcDqyLiZ8Bvt2cbmbkUWDrQb/369SPsjurW19eHdegsa9AdrEN3sA7dwTp0njXoDtah86ZMmTKqfiOGrsyc0+q5iPhNRBxQZqMOAB5r0m0dcMyg5QOB75X2A4e095fHrcZdBxzUbJ3MHPj3oYj4HnAY8A2qUxB7y2zX4G1IkiRJUu3Gek3XcmBhebwQuLlJnxXAcRExsdxA4zhgRTl98HcRMatce/WBQeu3Gnc58IGI6ImIWcBTJZhNjIjxABHRB7wZ+Hm5VuwO4OQR9lGSJEmSajHW0HUxMDcifgHMLctExBERcRVAZm4ALgTuLl8XlDaAjwBXAWuAB4FbhxuX6rbyD5X+XwL+vLQfCtwTEfdRhayLM/Pn5bmzgCURsYbqGq+rx3jMkiRJkjRqPY3GSJdR7bYa/f2eidhpnqvcedagO1iH7mAduoN16Dxr0B2sQ+eVa7qa3XdiG2Od6ZIkSZIkDcPQJUmSJEk1MnRJkiRJUo0MXZIkSZJUI0OXJEmSJNXI0CVJkiRJNTJ0SZIkSVKNDF2SJEmSVCNDlyRJkiTVyNAlSZIkSTUydEmSJElSjQxdkiRJklQjQ5ckSZIk1cjQJUmSJEk1MnRJkiRJUo0MXZIkSZJUI0OXJEmSJNXI0CVJkiRJNTJ0SZIkSVKNDF2SJEmSVCNDlyRJkiTVyNAlSZIkSTUydEmSJElSjQxdkiRJklQjQ5ckSZIk1cjQJUmSJEk1MnRJkiRJUo0MXZIkSZJUI0OXJEmSJNXI0CVJkiRJNTJ0SZIkSVKNDF2SJEmSVCNDlyRJkiTVyNAlSZIkSTUydEmSJElSjQxdkiRJklQjQ5ckSZIk1cjQJUmSJEk16h3LyhExCfga8CrgESAy84km/RYC55XFizJzWWk/HLgWmADcAvxFZjZajRsRPcCVwPHA08BpmXlvRPwRcMWgTb4aOCUzvxUR1wJHA0+V507LzJ+O5bglSZIkabTGOtN1NnB7Zk4Hbi/L2ygB6nzgKOBI4PyImFie/jywGJhevuaNMO78QX0Xl/XJzDsyc2ZmzgRmUwWy7w7ajY8PPG/gkiRJkrQzjTV0LQCWlcfLgBOb9HkrsDIzN5RZsJXAvIg4ANg7M3+UmQ3gukHrtxp3AXBdZjYy805g3zLOYCcDt2bm02M8NkmSJEkaszGdXgi8LDMfBcjMRyNi/yZ9pgJrBy2vK21Ty+Oh7cON22qsRwe1nQJcPmQfPhERf02ZNcvMjc0OJiIWU82gkZn09fU166adqLe31zp0mDXoDtahO1iH7mAdOs8adAfrsOsYMXRFxG3Ay5s8de4ot9HTpK0xTPuOjAVAmfX678CKQc+fA/w7sCewFDgLuKDZ4Jm5tPQBaKxfv36E3VHd+vr6sA6dZQ26g3XoDtahO1iHzrMG3cE6dN6UKVNG1W/E0JWZc1o9FxG/iYgDymzUAcBjTbqtA44ZtHwg8L3SfuCQ9v7yuNW464CDWqwDEMA3M/O/Bu3/wCzYxoj4MvCXrY5HkiRJktptrNd0LQcWlscLgZub9FkBHBcRE8sNNI4DVpQw9LuImFXuSviBQeu3Gnc58IGI6ImIWcBTg0IVwKnAVwdvfOCar7KNE4F/3eGjlSRJkqTtNNbQdTEwNyJ+Acwty0TEERFxFUBmbgAuBO4uXxeUNoCPAFcBa4AHgVuHG5fqtvIPlf5fAv58YEci4lVUs2DfH7KPX4mInwE/A/qAi8Z4zJIkSZI0aj2NxkiXUe22Gv39/SP3Uq08V7nzrEF3sA7dwTp0B+vQedagO1iHzivXdDW778Q2xjrTJUmSJEkahqFLkiRJkmpk6JIkSZKkGhm6JEmSJKlGhi5JkiRJqpGhS5IkSZJqZOiSJEmSpBoZuiRJkiSpRoYuSZIkSaqRoUuSJEmSamTokiRJkqQaGbokSZIkqUaGLkmSJEmqkaFLkiRJkmpk6JIkSZKkGhm6JEmSJKlGhi5JkiRJqpGhS5IkSZJqZOiSJEmSpBoZuiRJkiSpRoYuSZIkSaqRoUuSJEmSamTokiRJkqQaGbokSZIkqUaGLkmSJEmqkaFLkiRJkmpk6JIkSZKkGhm6JEmSJKlGhi5JkiRJqpGhS5IkSZJqZOiSJEmSpBoZuiRJkiSpRoYuSZIkSaqRoUuSJEmSamTokiRJkqQaGbokSZIkqUaGLkmSJEmqkaFLkiRJkmpk6JIkSZKkGvWOZeWImAR8DXgV8AgQmflEk34LgfPK4kWZuay0Hw5cC0wAbgH+IjMbrcaNiFcDXwZeD5ybmZcN2sY84EpgHHBVZl5c2qcBNwCTgHuB92fmprEctyRJkiSN1lhnus4Gbs/M6cDtZXkbJUCdDxwFHAmcHxETy9OfBxYD08vXvBHG3QCcAWwNW2Ub44DPAvOBGcCpETGjPH0JcEUZ6wlg0RiPWZIkSZJGbayhawGwrDxeBpzYpM9bgZWZuaHMgq0E5kXEAcDemfmjzGwA1w1av+m4mflYZt4N/NeQbRwJrMnMh8os1g3AgojoAWYDN46wj5IkSZJUizGdXgi8LDMfBcjMRyNi/yZ9pgJrBy2vK21Ty+Oh7aMdd6RtHAVMBp7MzM1NtvE8EbGYauaNzGTKlCkjbFY7g3XoPGvQHaxDd7AO3cE6dJ416A7WYdcwYuiKiNuAlzd56txRbqOnSVtjmPYd0ZZtZOZSYClARNyTmUfs4P6oTaxD51mD7mAduoN16A7WofOsQXewDruOEUNXZs5p9VxE/CYiDiizUQcAjzXptg44ZtDygcD3SvuBQ9r7y+PRjDt0Gwc1GWs9sG9E9JbZrsHbkCRJkqTajfWaruXAwvJ4IXBzkz4rgOMiYmK5gcZxwIpy+uDvImJWufbqA4PWH824g90NTI+IaRGxJ3AKsLxcK3YHcPJ2jCVJkiRJbTPW0HUxMDcifgHMLctExBERcRVAZm4ALqQKRncDF5Q2gI8AVwFrgAeBW0cY9+URsQ5YApwXEesiYu8yi/VRqoB3f7XZXF3GOgtYEhFrqK7xunqUx7Z0u78bqoN16Dxr0B2sQ3ewDt3BOnSeNegO1mEX0dNo7OhlVJIkSZKkkYx1pkuSJEmSNAxDlyRJkiTVaKyf09WVImIecCUwDrgqMy+OiGlUH5o8CbgXeH9mboqI8VQfzHw48Djw7sx8pIxzDrAI2AKckZkrWo1f2j8KfAz4A2C/zFy/kw6567SjBhHxXuDjg4Z9LfD6zPxpuWHKZ6jujPkscG5mfiMi/hD4u9L3lMy8kd3YdtZhCfCnwGbgP4APZuYvyzjfAWYB/09m/vGg8XuAi4B3Uf2cfD4zPx0Rrwa+DLyeqjaX7Zwj7k5trMMW4Gdl2F9l5gmlvdVYr6D6UPh9y7bPzsxbdspBd6GI2JfqOuL/g+rjQz4IPAB8DXgV8AgQmflE+b99JXA88DRwWmbeW8ZZCJxXhr0oM5dFxIuBr1O9/m8Bvp2ZZ5f+1qFoRw0i4pXATVTfyxcBf5+ZXxihBq8ErgH2AzYA78vMwZ8Vultp48/CK8o4B5Vxji+/v68FjgaeKps8rfzu9nfDINtZh5bfu+19X1reX51VVv9P4COZeV+tB6sX3kxXRIwDPgvMB2YAp0bEDOAS4IrMnA48QRWmKP8+kZmHAFeUfpR1TgFeA8wDPhcR44YZH+CfgDnAL2s/0C7Wrhpk5lcyc2ZmzgTeDzySmT8t65wLPJaZ/3vZxvdL+6+A04D/Ve9Rdr8dqMNPgCMy87XAjcAnBw13KVUNhjqN6pftqzPzUKo3/lC9qTkD2K1/oULb6/D7gZ+JgcBVtBrrPKobCx1G9Xr2uVoOctdxJfCdzHw18DqqGy+dDdxevne3l2Wo6jW9fC0GPg8QEZOA84GjgCOB88udeQEuK2MfBrw5IuaXduvwnDHXAHgUeFP53XAUcHZEDHw6bKsaXAZcV36uLgD+tsZj3BW0ow5Q/cH00vL6fyTbfsTPxwe9Xg387vZ3w7a2pw5Nv3c7+L70YeDo8vNwId6MY6d4Ic50HQmsycyHACLiBmABMBt4T+mzDPifVC8cC8pjqN7gfKb8VWcBcENmbgQeLnc/PLL0azb+zzPzJ6WtzuPbFbSlBuWW/wNOBb46aPmDwKsBMvNZqs9kY9As5bNtPqZd0XbVITPvGLTuncD7BhYy8/aIOKbJNj4CvKfUgMx8bNC/j0XE29p5QLuottWhmfJ61epnqwHsXdr3YTf+nMKI2Bv4Q6o/FJCZm4BNEbGA5z5LchnV50ieRVWj68rr0J0RsW/53MhjgJUDd+GNiJXAvMz8KtVHlFBmGe/luc+itA60rwblI2cGjKf8ATkzn6Z1DWYAZ5bHdwDfquEQdwlt/FmYCPRm5soyzn+OtG1/Nzxne+swzPeu1e+Ylu9LM/OHgxbvZNvPzVVNXoihayqwdtDyOqq/hD1Zbi0/0DZ1aP/M3BwRT1HdWn4q1X9EmqzTbHw9p101GHx65rupXkQGpuMBLixB4EHgo5n5m/Yfyi5te+sw2CKe+wiH4fwB8O6IeAfVqXBnZOYvdnyXX5DaWYe9IuIeqlMPL87Mb1H9rLQa638C342I/wv436j+4rm7Opjq/+iXI+J1wD8DfwG8bOBNfGY+GhH7l/7N6jZ1mPatymvU26n+ig3WYUC7avBoRBwE/ANwCNWMyjZBtkkN7gPeWZbfAbw0IiZn5uPtP8yu1646HAg8GRE3AdOA26hOnd1S+n0iIv6aMltT/oit52xvHVpp9TtmtEb7+15j9II7vRDoadI2rknbwCxKs/6NHWjXc9pVAwAi4ijg6cz819LUS/Vi/0+Z+XrgR3iqQjPbWwcAIuJ9wBFUpxSOZDzwTGYeAXyJ6poJbauddXhF+V6/B/i7iPiDFuMPjHUqcG1mHkh1Pcb1EfFCfN0fjV6qayE+X07z+/947rSdZnbod0BE9FLNyn964C/PWIcB7aoBmbm2nBp1CLAwIl420KFFDf4SODoifkJ1rdGvqf54sTtqVx16gf+T6nv7BqoQcVp5/hyqs1HeQHWt6VnPH2K3t711aGWH35dGxB9RhS7rsxO8EF/011FdYzLgQKrrfPYtL8QDbf1D+5fn96E6b7bZOP3DtOs57arBgFPY9tTCx6ku5v1mWf461QuXtrW9dSAi5lBdL3fCKP8quQ74Rnn8TaobmGhbbavDwF/zyxvJ71Fdt7J+mLEWAVnW+RGwF9DXxmPblawD1mXmj8vyjVSvG78pp0pR/n1sUP8d+R2wFPhFZv7doDbrUGlXDbYqPxOrqd78D3heDTKzPzNPKm9uzy1tT7F7aufPwk8y86Ey0/6tMg6Z+WhmNsrr15d57vIMPWd76zDcONv9vjQiXkt1E48Fu+mM7073QgxddwPTI2JaVHe4OwVYTnUO98mlz0Lg5vJ4eVmmPL+qnLe8HDglIsZHdWew6cBdw4yv57SrBpS/Br+L527QQHnu2zx3zvOxwM/rOphd2HbVISIOA75I9UZ/pBf5Ad+iup4Iqr8e/1ub9v2FpC11iIiJUd3pk4joA95Mdc5+o9VYVOHu2LLOoVRv9v+jpuPsapn578DaiPhvpWngdWPw68/Q16UPRERPRMwCniqn/KwAjiv1mAgcV9qIiIuo/mj0sSGbtw60rwYRcWBETIDq54LqZ+GBsty0BhHRN2h28Rx241n5Nv4s3A1MjIj9Sr/ZZZyBsDBwzemJwMCZKip2oA6tbPf70qjuOnkT1Z1u/b29k/Q0Gi+8M+Mi4niq24aPA67JzE9ExME8d0vln1DdLnZjROwFXE/1F+MNVLcZH7gY8VyqGzZsBj6Wmbe2Gr+0nwH8D+DlVH+ZuCUz/3QnHXZXaWMNjqG6dmXWkPFfWdbZl+rNy59k5q8i4g1UMy4TgWeAf8/M19R+wF1qO+twG/Dfqe4MBtvekvwfqU4VeQnVTOOizFxRrpv4CvAKqtvOfjgz74uIlwP3UN084Nny3IzM/O1OOfAu0446RMSbqMLYs1R/MPu7zLy6jN9qrBlUp32+hOp0k/+Rmd/dOUfdfSJiJtVfdvcEHgL+hOp7mVT/h38FvCszN5Q3i5+hunvt01SvMfeUcT4I/FUZ9hOZ+eWIOJDquor/FxiYnfxMZl5lHZ7TjhpExFzgUzx3uudnMnPpCDU4meqOhQ3gB8Dpu/M1Rm38WRioRQ/VNUmLy01MVlHdnr8H+CnV74b/9HfDtrazDi2/d9v7vjQirqK6xnHgroaby6nrqtELMnRJkiRJUrd4IZ5eKEmSJEldw9AlSZIkSTUydEmSJElSjQxdkiRJklQjQ5ckSZIk1cjQJUmSJEk1MnRJkiRJUo3+f1FBq6/ZmAWCAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 1008x504 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [ "source": [
"df[['uqer - ols', 'alphamind - ols']].plot(figsize=(14, 7), ylim=(-1e-4, 1e-4))" "df[['uqer - ols', 'alphamind - ols']].plot(figsize=(14, 7), ylim=(-1e-4, 1e-4))"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 85,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>uqer</th>\n",
" <th>alpha-mind</th>\n",
" <th>ols</th>\n",
" <th>uqer - ols</th>\n",
" <th>alphamind - ols</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>000001</th>\n",
" <td>0.103040</td>\n",
" <td>0.103040</td>\n",
" <td>0.103040</td>\n",
" <td>5.551115e-16</td>\n",
" <td>3.053113e-16</td>\n",
" </tr>\n",
" <tr>\n",
" <th>000002</th>\n",
" <td>-0.314564</td>\n",
" <td>-0.314564</td>\n",
" <td>-0.314564</td>\n",
" <td>-5.551115e-17</td>\n",
" <td>1.110223e-16</td>\n",
" </tr>\n",
" <tr>\n",
" <th>000006</th>\n",
" <td>-0.069171</td>\n",
" <td>-0.069171</td>\n",
" <td>-0.069171</td>\n",
" <td>-3.885781e-16</td>\n",
" <td>-8.326673e-17</td>\n",
" </tr>\n",
" <tr>\n",
" <th>000008</th>\n",
" <td>-0.042660</td>\n",
" <td>-0.042660</td>\n",
" <td>-0.042660</td>\n",
" <td>2.914335e-16</td>\n",
" <td>0.000000e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>000009</th>\n",
" <td>-0.018216</td>\n",
" <td>-0.018216</td>\n",
" <td>-0.018216</td>\n",
" <td>-4.579670e-16</td>\n",
" <td>1.665335e-16</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" uqer alpha-mind ols uqer - ols alphamind - ols\n",
"000001 0.103040 0.103040 0.103040 5.551115e-16 3.053113e-16\n",
"000002 -0.314564 -0.314564 -0.314564 -5.551115e-17 1.110223e-16\n",
"000006 -0.069171 -0.069171 -0.069171 -3.885781e-16 -8.326673e-17\n",
"000008 -0.042660 -0.042660 -0.042660 2.914335e-16 0.000000e+00\n",
"000009 -0.018216 -0.018216 -0.018216 -4.579670e-16 1.665335e-16"
]
},
"execution_count": 85,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"df.head()" "df.head()"
] ]
...@@ -355,7 +878,7 @@ ...@@ -355,7 +878,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.6.5" "version": "3.6.8"
}, },
"varInspector": { "varInspector": {
"cols": { "cols": {
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 2, "execution_count": 10,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -48,13 +48,13 @@ ...@@ -48,13 +48,13 @@
"\n", "\n",
" objective = cvxpy.Minimize(-w.T * er)\n", " objective = cvxpy.Minimize(-w.T * er)\n",
" prob = cvxpy.Problem(objective, constraints)\n", " prob = cvxpy.Problem(objective, constraints)\n",
" prob.solve()\n", " prob.solve(solver='ECOS')\n",
" return w, prob" " return w, prob"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 3, "execution_count": 11,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
...@@ -62,37 +62,21 @@ ...@@ -62,37 +62,21 @@
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Scale(n) time(ms) feval min(x) max(x) sum(x) x(0) + x(1)\n", "Scale(n) time(ms) feval min(x) max(x) sum(x) x(0) + x(1)\n",
"200 18.00 -0.82 -0.000021 0.011996 1.0000100.013991955470964355\n", "200 8.98 -0.82 -0.000000 0.010000 1.0000000.014999999999355636\n",
"400 21.40 -1.28 -0.000000 0.010000 1.000000 0.015\n", "400 10.97 -1.28 -0.000000 0.010000 1.0000000.014999999999977868\n",
"600 21.00 -1.64 -0.000435 0.009980 1.0001740.014845697577983343\n", "600 12.01 -1.54 -0.000000 0.010000 1.0000000.014999999999630973\n",
"800 24.01 -1.83 -0.000802 0.010028 1.0002310.01474166785085744\n", "800 11.93 -1.63 -0.000000 0.010000 1.0000000.014999999999937863\n",
"1000 44.88 -1.89 -0.000166 0.010000 1.0001490.014851819526468822\n", "1000 12.00 -1.72 -0.000000 0.010000 1.0000000.014999999999985369\n",
"1200 44.02 -2.07 -0.000571 0.009999 1.0001670.014833266833006432\n" "1200 13.97 -1.81 -0.000000 0.010000 1.0000000.014999999999661145\n",
] "1400 15.92 -1.90 -0.000000 0.010000 1.0000000.014999999999617875\n",
}, "1600 18.97 -1.96 -0.000000 0.010000 1.0000000.01499999999998295\n",
{ "1800 19.99 -2.03 -0.000000 0.010000 1.0000000.014999999999785373\n",
"name": "stderr", "2000 22.93 -2.06 -0.000000 0.010000 1.0000000.014999999999994327\n",
"output_type": "stream", "2200 21.92 -2.07 -0.000000 0.010000 1.0000000.014999999999979582\n",
"text": [ "2400 25.90 -2.13 -0.000000 0.010000 1.0000000.014999999999836155\n",
"d:\\ProgramData\\Anaconda3\\lib\\site-packages\\cvxpy-1.0.8-py3.6-win-amd64.egg\\cvxpy\\problems\\problem.py:614: RuntimeWarning: overflow encountered in long_scalars\n", "2600 29.93 -2.14 -0.000000 0.010000 1.0000000.01499999999985058\n",
" if self.max_big_small_squared < big*small**2:\n", "2800 28.87 -2.16 -0.000000 0.010000 1.0000000.014999999999853686\n",
"d:\\ProgramData\\Anaconda3\\lib\\site-packages\\cvxpy-1.0.8-py3.6-win-amd64.egg\\cvxpy\\problems\\problem.py:615: RuntimeWarning: overflow encountered in long_scalars\n", "3000 32.96 -2.19 -0.000000 0.010000 1.0000000.014999999999981861\n"
" self.max_big_small_squared = big*small**2\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"1400 57.00 -2.31 -0.000504 0.009997 1.0002170.014785380519459417\n",
"1600 47.02 -2.90 -0.001650 0.009905 1.0004330.014667925787486116\n",
"1800 79.06 -2.67 -0.000885 0.009999 1.0002300.014771011591262167\n",
"2000 68.01 -2.81 -0.000333 0.010001 1.0002410.014758149340884413\n",
"2200 72.02 -3.71 -0.000849 0.009969 1.0004940.014536311105299406\n",
"2400 94.19 -2.46 -0.000536 0.010001 1.0000810.014917972574632015\n",
"2600 135.07 -2.54 -0.000105 0.010001 1.0000900.01490885499964943\n",
"2800 106.02 -3.40 -0.000983 0.010000 1.0002670.014733268551116162\n",
"3000 109.02 -3.77 -0.001612 0.010001 1.0003180.014680802417975643\n"
] ]
} }
], ],
...@@ -138,21 +122,21 @@ ...@@ -138,21 +122,21 @@
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Scale(n) time(ms) feval min(x) max(x) sum(x) x(0) + x(1)\n", "Scale(n) time(ms) feval min(x) max(x) sum(x) x(0) + x(1)\n",
"200 2.99 -0.82 0.000000 0.010000 1.0000000.015000000005429394\n", "200 2.00 -0.82 0.000000 0.010000 1.0000000.015000000005429394\n",
"400 2.99 -1.28 0.000000 0.010000 1.0000000.015000000000751215\n", "400 4.00 -1.28 0.000000 0.010000 1.0000000.015000000000751215\n",
"600 4.00 -1.54 0.000000 0.010000 1.0000000.01500000000851949\n", "600 4.02 -1.54 0.000000 0.010000 1.0000000.01500000000851949\n",
"800 5.00 -1.63 0.000000 0.010000 1.0000000.015000000002481837\n", "800 3.99 -1.63 0.000000 0.010000 1.0000000.015000000002481837\n",
"1000 7.00 -1.72 0.000000 0.010000 1.0000000.015000000001100414\n", "1000 7.94 -1.72 0.000000 0.010000 1.0000000.015000000001100414\n",
"1200 6.00 -1.81 0.000000 0.010000 1.0000000.01500000000548405\n", "1200 5.03 -1.81 0.000000 0.010000 1.0000000.01500000000548405\n",
"1400 9.01 -1.90 0.000000 0.010000 1.0000000.015000000001956426\n", "1400 8.94 -1.90 0.000000 0.010000 1.0000000.015000000001956426\n",
"1600 10.00 -1.96 0.000000 0.010000 1.0000000.015000000000082848\n", "1600 8.02 -1.96 0.000000 0.010000 1.0000000.015000000000082848\n",
"1800 10.16 -2.03 0.000000 0.010000 1.0000000.01500000000204834\n", "1800 9.98 -2.03 0.000000 0.010000 1.0000000.01500000000204834\n",
"2000 12.05 -2.06 0.000000 0.010000 1.0000000.0150000000008303\n", "2000 9.97 -2.06 0.000000 0.010000 1.0000000.0150000000008303\n",
"2200 12.99 -2.07 0.000000 0.010000 1.0000000.01500000000729576\n", "2200 14.91 -2.07 0.000000 0.010000 1.0000000.01500000000729576\n",
"2400 12.00 -2.13 0.000000 0.010000 1.0000000.015000000004022507\n", "2400 12.97 -2.13 0.000000 0.010000 1.0000000.015000000004022507\n",
"2600 23.02 -2.14 0.000000 0.010000 1.0000000.015000000001118521\n", "2600 15.96 -2.14 0.000000 0.010000 1.0000000.015000000001118521\n",
"2800 20.99 -2.16 0.000000 0.010000 1.0000000.01500000000064263\n", "2800 19.92 -2.16 0.000000 0.010000 1.0000000.01500000000064263\n",
"3000 22.00 -2.19 0.000000 0.010000 1.0000000.015000000003030482\n" "3000 21.93 -2.19 0.000000 0.010000 1.0000000.015000000003030482\n"
] ]
} }
], ],
...@@ -189,7 +173,7 @@ ...@@ -189,7 +173,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.6.5" "version": "3.6.8"
}, },
"varInspector": { "varInspector": {
"cols": { "cols": {
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -20,9 +20,130 @@ ...@@ -20,9 +20,130 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 1,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>factor_1</th>\n",
" <th>factor_2</th>\n",
" <th>rank_1</th>\n",
" <th>rank_2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0.959453</td>\n",
" <td>0.798155</td>\n",
" <td>9.0</td>\n",
" <td>8.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0.830604</td>\n",
" <td>0.051822</td>\n",
" <td>6.0</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0.234670</td>\n",
" <td>0.157615</td>\n",
" <td>1.0</td>\n",
" <td>2.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0.652818</td>\n",
" <td>0.733896</td>\n",
" <td>4.0</td>\n",
" <td>6.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0.932201</td>\n",
" <td>0.002984</td>\n",
" <td>7.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>0.311260</td>\n",
" <td>0.708512</td>\n",
" <td>2.0</td>\n",
" <td>5.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>0.198123</td>\n",
" <td>0.665290</td>\n",
" <td>0.0</td>\n",
" <td>4.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>0.731436</td>\n",
" <td>0.915967</td>\n",
" <td>5.0</td>\n",
" <td>9.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>0.346298</td>\n",
" <td>0.754176</td>\n",
" <td>3.0</td>\n",
" <td>7.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>0.950355</td>\n",
" <td>0.196379</td>\n",
" <td>8.0</td>\n",
" <td>3.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" factor_1 factor_2 rank_1 rank_2\n",
"0 0.959453 0.798155 9.0 8.0\n",
"1 0.830604 0.051822 6.0 1.0\n",
"2 0.234670 0.157615 1.0 2.0\n",
"3 0.652818 0.733896 4.0 6.0\n",
"4 0.932201 0.002984 7.0 0.0\n",
"5 0.311260 0.708512 2.0 5.0\n",
"6 0.198123 0.665290 0.0 4.0\n",
"7 0.731436 0.915967 5.0 9.0\n",
"8 0.346298 0.754176 3.0 7.0\n",
"9 0.950355 0.196379 8.0 3.0"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"import numpy as np\n", "import numpy as np\n",
"import pandas as pd\n", "import pandas as pd\n",
...@@ -39,9 +160,108 @@ ...@@ -39,9 +160,108 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 2,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>factor_1</th>\n",
" <th>rank</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0.898683</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0.179354</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0.751189</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0.699054</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0.332965</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>0.937173</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>0.559328</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>0.753076</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>0.657790</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>0.782689</td>\n",
" <td>3</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" factor_1 rank\n",
"0 0.898683 4\n",
"1 0.179354 0\n",
"2 0.751189 3\n",
"3 0.699054 2\n",
"4 0.332965 1\n",
"5 0.937173 4\n",
"6 0.559328 0\n",
"7 0.753076 2\n",
"8 0.657790 1\n",
"9 0.782689 3"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"# 假设有10只股票,每只股票有1个因子\n", "# 假设有10只股票,每只股票有1个因子\n",
"factors = pd.DataFrame(np.random.rand(10, 1))\n", "factors = pd.DataFrame(np.random.rand(10, 1))\n",
...@@ -64,9 +284,119 @@ ...@@ -64,9 +284,119 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 3,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>factor_1</th>\n",
" <th>rank</th>\n",
" <th>quantile</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0.898683</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0.179354</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0.751189</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0.699054</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0.332965</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>0.937173</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>0.559328</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>0.753076</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>0.657790</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>0.782689</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" factor_1 rank quantile\n",
"0 0.898683 4 4\n",
"1 0.179354 0 0\n",
"2 0.751189 3 2\n",
"3 0.699054 2 2\n",
"4 0.332965 1 0\n",
"5 0.937173 4 4\n",
"6 0.559328 0 1\n",
"7 0.753076 2 3\n",
"8 0.657790 1 1\n",
"9 0.782689 3 3"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"from alphamind.data.quantile import quantile\n", "from alphamind.data.quantile import quantile\n",
"\n", "\n",
...@@ -98,7 +428,7 @@ ...@@ -98,7 +428,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.6.5" "version": "3.6.8"
} }
}, },
"nbformat": 4, "nbformat": 4,
......
...@@ -25,9 +25,21 @@ ...@@ -25,9 +25,21 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 1,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Optimization status - optimal\n",
"Optimal expect return - -0.18504428442588658\n",
"Optimial portfolio weights - [0.05 0.05 0.3 0.3 0.3 ]\n",
"Initial portfolio weights - [0. 0.1 0.3 0.3 0.3]\n",
"Turn over amount - 0.1000000000000593\n"
]
}
],
"source": [ "source": [
"import numpy as np\n", "import numpy as np\n",
"from alphamind.portfolio.linearbuilder import linear_builder\n", "from alphamind.portfolio.linearbuilder import linear_builder\n",
...@@ -169,7 +181,7 @@ ...@@ -169,7 +181,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 2,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -221,9 +233,18 @@ ...@@ -221,9 +233,18 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 3,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Optimal weight is [0.09999998 0.4 0.5 ]\n",
"Risk exposure of optimal potfolio is [0.99999998 0.59999998]\n"
]
}
],
"source": [ "source": [
"print('Optimal weight is {0}'.format(x))\n", "print('Optimal weight is {0}'.format(x))\n",
"print('Risk exposure of optimal potfolio is {0}'.format(x @ risk_exposure))" "print('Risk exposure of optimal potfolio is {0}'.format(x @ risk_exposure))"
...@@ -253,7 +274,7 @@ ...@@ -253,7 +274,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.6.5" "version": "3.6.8"
}, },
"varInspector": { "varInspector": {
"cols": { "cols": {
......
...@@ -87,7 +87,7 @@ ...@@ -87,7 +87,7 @@
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Wall time: 459 ms\n" "Wall time: 454 ms\n"
] ]
} }
], ],
...@@ -346,7 +346,7 @@ ...@@ -346,7 +346,7 @@
"2 6 房地产\n", "2 6 房地产\n",
"3 8 机械设备\n", "3 8 机械设备\n",
"4 9 综合\n", "4 9 综合\n",
"Wall time: 185 ms\n" "Wall time: 198 ms\n"
] ]
} }
], ],
...@@ -387,7 +387,7 @@ ...@@ -387,7 +387,7 @@
"2 6 0.00039\n", "2 6 0.00039\n",
"3 8 0.00071\n", "3 8 0.00071\n",
"4 9 0.00075\n", "4 9 0.00075\n",
"Wall time: 121 ms\n" "Wall time: 150 ms\n"
] ]
} }
], ],
...@@ -461,7 +461,7 @@ ...@@ -461,7 +461,7 @@
"2 6 -0.043098\n", "2 6 -0.043098\n",
"3 8 -0.174035\n", "3 8 -0.174035\n",
"4 9 -0.138300\n", "4 9 -0.138300\n",
"Wall time: 98.7 ms\n" "Wall time: 118 ms\n"
] ]
} }
], ],
...@@ -525,7 +525,7 @@ ...@@ -525,7 +525,7 @@
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Wall time: 6.98 ms\n" "Wall time: 8.97 ms\n"
] ]
} }
], ],
...@@ -574,7 +574,7 @@ ...@@ -574,7 +574,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x195c3192358>" "<matplotlib.axes._subplots.AxesSubplot at 0x2844b3c43c8>"
] ]
}, },
"execution_count": 15, "execution_count": 15,
...@@ -684,7 +684,7 @@ ...@@ -684,7 +684,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x195c36554a8>" "<matplotlib.axes._subplots.AxesSubplot at 0x284521258d0>"
] ]
}, },
"execution_count": 19, "execution_count": 19,
......
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 59, "execution_count": 2,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -56,14 +56,14 @@ ...@@ -56,14 +56,14 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 60, "execution_count": 3,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Wall time: 42.5 s\n" "Wall time: 41.8 s\n"
] ]
} }
], ],
...@@ -84,14 +84,14 @@ ...@@ -84,14 +84,14 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 56, "execution_count": 4,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Wall time: 608 ms\n" "Wall time: 1.95 s\n"
] ]
} }
], ],
...@@ -110,16 +110,16 @@ ...@@ -110,16 +110,16 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 57, "execution_count": 5,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x117925a3c50>" "<matplotlib.axes._subplots.AxesSubplot at 0x1f0d0ba2518>"
] ]
}, },
"execution_count": 57, "execution_count": 5,
"metadata": {}, "metadata": {},
"output_type": "execute_result" "output_type": "execute_result"
}, },
...@@ -142,16 +142,16 @@ ...@@ -142,16 +142,16 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 58, "execution_count": 6,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x1178d7e1358>" "<matplotlib.axes._subplots.AxesSubplot at 0x1f0e7233da0>"
] ]
}, },
"execution_count": 58, "execution_count": 6,
"metadata": {}, "metadata": {},
"output_type": "execute_result" "output_type": "execute_result"
}, },
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment