Commit 38c1a6a9 authored by Dr.李's avatar Dr.李

FEATURE: update notebooks

parent 63634fd2
......@@ -35,10 +35,11 @@
"Back test parameter settings\n",
"\"\"\"\n",
"\n",
"start_date = '2020-01-01'\n",
"start_date = '2020-01-02'\n",
"end_date = '2020-02-21'\n",
"\n",
"frequency = '10b'\n",
"\n",
"ref_dates = makeSchedule(start_date, end_date, frequency, 'china.sse')\n",
"industry_lower = 1.0\n",
"industry_upper = 1.0\n",
"method = 'risk_neutral'\n",
......@@ -52,7 +53,7 @@
"benchmark_code = 300\n",
"universe_name = 'hs300'\n",
"universe = Universe(universe_name)\n",
"ref_dates = makeSchedule(start_date, end_date, frequency, 'china.sse')\n",
"\n",
"\n",
"executor = NaiveExecutor()\n",
"data_source = os.environ['DB_URI']\n",
......@@ -63,6 +64,25 @@
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[datetime.datetime(2020, 1, 2, 0, 0), datetime.datetime(2020, 1, 16, 0, 0), datetime.datetime(2020, 2, 7, 0, 0), datetime.datetime(2020, 2, 21, 0, 0)]\n",
"9\n"
]
}
],
"source": [
"print(ref_dates)\n",
"print(horizon)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"\"\"\"\n",
......@@ -96,7 +116,7 @@
},
{
"cell_type": "code",
"execution_count": 4,
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
......@@ -111,7 +131,8 @@
" codes_return = engine.fetch_dx_return_range(universe,\n",
" dates=ref_dates,\n",
" horizon=horizon,\n",
" offset=1)\n",
" offset=1,\n",
" benchmark=benchmark_code)\n",
" return_groups = codes_return.groupby('trade_date')\n",
" \"\"\"\n",
" Model phase: we need 1 constant linear model and one linear regression model\n",
......@@ -129,7 +150,7 @@
" weights=const_weights)\n",
"\n",
" const_model_factor_data = engine.fetch_data_range(universe,\n",
" const_features,\n",
" factors=const_features,\n",
" dates=ref_dates,\n",
" benchmark=benchmark_code)['factor'].dropna()\n",
"\n",
......@@ -228,7 +249,7 @@
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
......@@ -237,82 +258,89 @@
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2020-11-15 02:48:08,589 - ALPHA_MIND - INFO - 2020-01-02 00:00:00: 299\n",
"2020-11-15 02:48:11,898 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-15 02:48:11,900 - ALPHA_MIND - INFO - 2020-01-02 00:00:00 full re-balance\n",
"2020-11-15 02:48:11,921 - ALPHA_MIND - INFO - 2020-01-02 00:00:00 is finished\n",
"2020-11-15 02:48:11,929 - ALPHA_MIND - INFO - 2020-01-16 00:00:00: 300\n",
"2020-11-15 02:48:11,933 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-15 02:48:11,936 - ALPHA_MIND - INFO - 2020-01-16 00:00:00 full re-balance\n",
"2020-11-15 02:48:11,960 - ALPHA_MIND - INFO - 2020-01-16 00:00:00 is finished\n",
"2020-11-15 02:48:11,969 - ALPHA_MIND - INFO - 2020-02-07 00:00:00: 300\n",
"2020-11-15 02:48:11,975 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-15 02:48:11,978 - ALPHA_MIND - INFO - 2020-02-07 00:00:00 full re-balance\n",
"2020-11-15 02:48:12,002 - ALPHA_MIND - INFO - 2020-02-07 00:00:00 is finished\n",
"2020-11-15 02:48:12,012 - ALPHA_MIND - INFO - 2020-02-21 00:00:00: 300\n",
"2020-11-15 02:48:12,018 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-15 02:48:12,020 - ALPHA_MIND - INFO - 2020-02-21 00:00:00 full re-balance\n",
"2020-11-15 02:48:12,044 - ALPHA_MIND - INFO - 2020-02-21 00:00:00 is finished\n",
"2020-11-15 02:48:13,897 - ALPHA_MIND - INFO - 2020-01-02 00:00:00: 300\n",
"2020-11-15 02:48:13,901 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-15 02:48:13,903 - ALPHA_MIND - INFO - 2020-01-02 00:00:00 full re-balance\n",
"2020-11-15 02:48:13,932 - ALPHA_MIND - INFO - 2020-01-02 00:00:00 is finished\n",
"2020-11-15 02:48:13,940 - ALPHA_MIND - INFO - 2020-01-16 00:00:00: 300\n",
"2020-11-15 02:48:13,946 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-15 02:48:13,949 - ALPHA_MIND - INFO - 2020-01-16 00:00:00 full re-balance\n",
"2020-11-15 02:48:13,976 - ALPHA_MIND - INFO - 2020-01-16 00:00:00 is finished\n",
"2020-11-15 02:48:13,987 - ALPHA_MIND - INFO - 2020-02-07 00:00:00: 300\n",
"2020-11-15 02:48:13,992 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-15 02:48:13,994 - ALPHA_MIND - INFO - 2020-02-07 00:00:00 full re-balance\n",
"2020-11-15 02:48:14,019 - ALPHA_MIND - INFO - 2020-02-07 00:00:00 is finished\n",
"2020-11-15 02:48:14,027 - ALPHA_MIND - INFO - 2020-02-21 00:00:00: 300\n",
"2020-11-15 02:48:14,032 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-15 02:48:14,034 - ALPHA_MIND - INFO - 2020-02-21 00:00:00 full re-balance\n",
"2020-11-15 02:48:14,062 - ALPHA_MIND - INFO - 2020-02-21 00:00:00 is finished\n",
"2020-11-15 02:48:15,881 - ALPHA_MIND - INFO - 2020-01-02 00:00:00: 299\n",
"2020-11-15 02:48:15,885 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-15 02:48:15,888 - ALPHA_MIND - INFO - 2020-01-02 00:00:00 full re-balance\n",
"2020-11-15 02:48:15,918 - ALPHA_MIND - INFO - 2020-01-02 00:00:00 is finished\n",
"2020-11-15 02:48:15,927 - ALPHA_MIND - INFO - 2020-01-16 00:00:00: 300\n",
"2020-11-15 02:48:15,931 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-15 02:48:15,934 - ALPHA_MIND - INFO - 2020-01-16 00:00:00 full re-balance\n",
"2020-11-15 02:48:15,964 - ALPHA_MIND - INFO - 2020-01-16 00:00:00 is finished\n",
"2020-11-15 02:48:15,973 - ALPHA_MIND - INFO - 2020-02-07 00:00:00: 300\n",
"2020-11-15 02:48:15,978 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-15 02:48:15,982 - ALPHA_MIND - INFO - 2020-02-07 00:00:00 full re-balance\n",
"2020-11-15 02:48:16,007 - ALPHA_MIND - INFO - 2020-02-07 00:00:00 is finished\n",
"2020-11-15 02:48:16,016 - ALPHA_MIND - INFO - 2020-02-21 00:00:00: 300\n",
"2020-11-15 02:48:16,022 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-15 02:48:16,025 - ALPHA_MIND - INFO - 2020-02-21 00:00:00 full re-balance\n",
"2020-11-15 02:48:16,055 - ALPHA_MIND - INFO - 2020-02-21 00:00:00 is finished\n",
"2020-11-15 02:48:17,917 - ALPHA_MIND - INFO - 2020-01-02 00:00:00: 300\n",
"2020-11-15 02:48:17,921 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-15 02:48:17,924 - ALPHA_MIND - INFO - 2020-01-02 00:00:00 full re-balance\n",
"2020-11-15 02:48:17,954 - ALPHA_MIND - INFO - 2020-01-02 00:00:00 is finished\n",
"2020-11-15 02:48:17,962 - ALPHA_MIND - INFO - 2020-01-16 00:00:00: 300\n",
"2020-11-15 02:48:17,967 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-15 02:48:17,969 - ALPHA_MIND - INFO - 2020-01-16 00:00:00 full re-balance\n",
"2020-11-15 02:48:17,995 - ALPHA_MIND - INFO - 2020-01-16 00:00:00 is finished\n",
"2020-11-15 02:48:18,003 - ALPHA_MIND - INFO - 2020-02-07 00:00:00: 300\n",
"2020-11-15 02:48:18,008 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-15 02:48:18,010 - ALPHA_MIND - INFO - 2020-02-07 00:00:00 full re-balance\n",
"2020-11-15 02:48:18,034 - ALPHA_MIND - INFO - 2020-02-07 00:00:00 is finished\n",
"2020-11-15 02:48:18,041 - ALPHA_MIND - INFO - 2020-02-21 00:00:00: 300\n",
"2020-11-15 02:48:18,046 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-15 02:48:18,048 - ALPHA_MIND - INFO - 2020-02-21 00:00:00 full re-balance\n",
"2020-11-15 02:48:18,078 - ALPHA_MIND - INFO - 2020-02-21 00:00:00 is finished\n"
"2020-11-21 14:57:36,283 - ALPHA_MIND - INFO - 2020-01-02 00:00:00: 299\n",
"2020-11-21 14:57:36,293 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-21 14:57:36,301 - ALPHA_MIND - INFO - 2020-01-02 00:00:00 full re-balance\n",
"2020-11-21 14:57:36,369 - ALPHA_MIND - INFO - 2020-01-02 00:00:00 is finished\n",
"2020-11-21 14:57:36,381 - ALPHA_MIND - INFO - 2020-01-16 00:00:00: 300\n",
"2020-11-21 14:57:36,386 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-21 14:57:36,390 - ALPHA_MIND - INFO - 2020-01-16 00:00:00 full re-balance\n",
"2020-11-21 14:57:36,419 - ALPHA_MIND - INFO - 2020-01-16 00:00:00 is finished\n",
"2020-11-21 14:57:36,429 - ALPHA_MIND - INFO - 2020-02-07 00:00:00: 300\n",
"2020-11-21 14:57:36,435 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-21 14:57:36,438 - ALPHA_MIND - INFO - 2020-02-07 00:00:00 full re-balance\n",
"2020-11-21 14:57:36,464 - ALPHA_MIND - INFO - 2020-02-07 00:00:00 is finished\n",
"2020-11-21 14:57:36,475 - ALPHA_MIND - INFO - 2020-02-21 00:00:00: 300\n",
"2020-11-21 14:57:36,481 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-21 14:57:36,484 - ALPHA_MIND - INFO - 2020-02-21 00:00:00 full re-balance\n",
"2020-11-21 14:57:36,510 - ALPHA_MIND - INFO - 2020-02-21 00:00:00 is finished\n",
"2020-11-21 14:57:40,013 - ALPHA_MIND - INFO - 2020-01-02 00:00:00: 300\n",
"2020-11-21 14:57:40,022 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-21 14:57:40,026 - ALPHA_MIND - INFO - 2020-01-02 00:00:00 full re-balance\n",
"2020-11-21 14:57:40,062 - ALPHA_MIND - INFO - 2020-01-02 00:00:00 is finished\n",
"2020-11-21 14:57:40,070 - ALPHA_MIND - INFO - 2020-01-16 00:00:00: 300\n",
"2020-11-21 14:57:40,076 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-21 14:57:40,078 - ALPHA_MIND - INFO - 2020-01-16 00:00:00 full re-balance\n",
"2020-11-21 14:57:40,105 - ALPHA_MIND - INFO - 2020-01-16 00:00:00 is finished\n",
"2020-11-21 14:57:40,112 - ALPHA_MIND - INFO - 2020-02-07 00:00:00: 300\n",
"2020-11-21 14:57:40,119 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-21 14:57:40,121 - ALPHA_MIND - INFO - 2020-02-07 00:00:00 full re-balance\n",
"2020-11-21 14:57:40,146 - ALPHA_MIND - INFO - 2020-02-07 00:00:00 is finished\n",
"2020-11-21 14:57:40,154 - ALPHA_MIND - INFO - 2020-02-21 00:00:00: 300\n",
"2020-11-21 14:57:40,159 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-21 14:57:40,162 - ALPHA_MIND - INFO - 2020-02-21 00:00:00 full re-balance\n",
"2020-11-21 14:57:40,189 - ALPHA_MIND - INFO - 2020-02-21 00:00:00 is finished\n",
"2020-11-21 14:57:42,233 - ALPHA_MIND - INFO - 2020-01-02 00:00:00: 299\n",
"2020-11-21 14:57:42,256 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-21 14:57:42,267 - ALPHA_MIND - INFO - 2020-01-02 00:00:00 full re-balance\n",
"2020-11-21 14:57:42,347 - ALPHA_MIND - INFO - 2020-01-02 00:00:00 is finished\n",
"2020-11-21 14:57:42,357 - ALPHA_MIND - INFO - 2020-01-16 00:00:00: 300\n",
"2020-11-21 14:57:42,364 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-21 14:57:42,367 - ALPHA_MIND - INFO - 2020-01-16 00:00:00 full re-balance\n",
"2020-11-21 14:57:42,394 - ALPHA_MIND - INFO - 2020-01-16 00:00:00 is finished\n",
"2020-11-21 14:57:42,405 - ALPHA_MIND - INFO - 2020-02-07 00:00:00: 300\n",
"2020-11-21 14:57:42,411 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-21 14:57:42,414 - ALPHA_MIND - INFO - 2020-02-07 00:00:00 full re-balance\n",
"2020-11-21 14:57:42,439 - ALPHA_MIND - INFO - 2020-02-07 00:00:00 is finished\n",
"2020-11-21 14:57:42,447 - ALPHA_MIND - INFO - 2020-02-21 00:00:00: 300\n",
"2020-11-21 14:57:42,452 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-21 14:57:42,455 - ALPHA_MIND - INFO - 2020-02-21 00:00:00 full re-balance\n",
"2020-11-21 14:57:42,478 - ALPHA_MIND - INFO - 2020-02-21 00:00:00 is finished\n",
"2020-11-21 14:57:44,519 - ALPHA_MIND - INFO - 2020-01-02 00:00:00: 300\n",
"2020-11-21 14:57:44,537 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-21 14:57:44,547 - ALPHA_MIND - INFO - 2020-01-02 00:00:00 full re-balance\n",
"2020-11-21 14:57:44,630 - ALPHA_MIND - INFO - 2020-01-02 00:00:00 is finished\n",
"2020-11-21 14:57:44,641 - ALPHA_MIND - INFO - 2020-01-16 00:00:00: 300\n",
"2020-11-21 14:57:44,647 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-21 14:57:44,649 - ALPHA_MIND - INFO - 2020-01-16 00:00:00 full re-balance\n",
"2020-11-21 14:57:44,673 - ALPHA_MIND - INFO - 2020-01-16 00:00:00 is finished\n",
"2020-11-21 14:57:44,684 - ALPHA_MIND - INFO - 2020-02-07 00:00:00: 300\n",
"2020-11-21 14:57:44,690 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-21 14:57:44,694 - ALPHA_MIND - INFO - 2020-02-07 00:00:00 full re-balance\n",
"2020-11-21 14:57:44,720 - ALPHA_MIND - INFO - 2020-02-07 00:00:00 is finished\n",
"2020-11-21 14:57:44,730 - ALPHA_MIND - INFO - 2020-02-21 00:00:00: 300\n",
"2020-11-21 14:57:44,735 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-21 14:57:44,737 - ALPHA_MIND - INFO - 2020-02-21 00:00:00 full re-balance\n",
"2020-11-21 14:57:44,767 - ALPHA_MIND - INFO - 2020-02-21 00:00:00 is finished\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Wall time: 10.3 s\n"
]
}
],
"source": [
"# %%time\n",
"%%time\n",
"\n",
"res1 = [worker_func_positive(factor) for factor in factors]\n",
"res2 = [worker_func_negative(factor) for factor in factors]\n",
......@@ -331,7 +359,7 @@
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
......@@ -344,7 +372,7 @@
},
{
"cell_type": "code",
"execution_count": 9,
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
......@@ -355,6 +383,20 @@
" ic_res.to_excel(writer, sheet_name='ic_stat')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
......
......@@ -9,7 +9,7 @@
},
{
"cell_type": "code",
"execution_count": 9,
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
......@@ -32,7 +32,7 @@
},
{
"cell_type": "code",
"execution_count": 14,
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
......@@ -60,7 +60,7 @@
},
{
"cell_type": "code",
"execution_count": 15,
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
......@@ -80,22 +80,14 @@
},
{
"cell_type": "code",
"execution_count": 18,
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Wall time: 976 µs\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"D:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\ipykernel\\ipkernel.py:287: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n",
" and should_run_async(code)\n"
"Wall time: 1.98 ms\n"
]
}
],
......@@ -118,7 +110,7 @@
},
{
"cell_type": "code",
"execution_count": 19,
"execution_count": 5,
"metadata": {},
"outputs": [
{
......@@ -142,17 +134,17 @@
" warm start: on, polish: on, time_limit: off\n",
"\n",
"iter objective pri res dua res rho time\n",
" 1 -7.8878e+03 4.61e+00 6.68e+04 1.00e-01 1.04e-03s\n",
" 125 -2.4830e+02 3.58e-07 2.76e-05 5.82e-01 3.81e-03s\n",
" 1 -7.8878e+03 4.61e+00 6.68e+04 1.00e-01 1.10e-03s\n",
" 125 -2.4830e+02 3.58e-07 2.76e-05 5.82e-01 3.80e-03s\n",
"\n",
"status: solved\n",
"solution polish: unsuccessful\n",
"number of iterations: 125\n",
"optimal objective: -248.2989\n",
"run time: 4.41e-03s\n",
"run time: 4.54e-03s\n",
"optimal rho estimate: 1.87e+00\n",
"\n",
"Wall time: 42 ms\n"
"Wall time: 48 ms\n"
]
},
{
......@@ -161,7 +153,7 @@
"-248.29894124530716"
]
},
"execution_count": 19,
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
......@@ -173,7 +165,7 @@
},
{
"cell_type": "code",
"execution_count": 20,
"execution_count": 6,
"metadata": {},
"outputs": [
{
......@@ -182,7 +174,7 @@
"('optimal', -248.29894124530716)"
]
},
"execution_count": 20,
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
......@@ -193,7 +185,7 @@
},
{
"cell_type": "code",
"execution_count": 21,
"execution_count": 7,
"metadata": {},
"outputs": [
{
......@@ -219,9 +211,9 @@
"12 -2.483e+02 -2.483e+02 +3e-07 5e-13 2e-15 1e-10 8e-10 0.9775 1e-04 1 1 1 | 0 0\n",
"\n",
"OPTIMAL (within feastol=5.3e-13, reltol=1.3e-09, abstol=3.2e-07).\n",
"Runtime: 0.008978 seconds.\n",
"Runtime: 0.013942 seconds.\n",
"\n",
"Wall time: 40 ms\n"
"Wall time: 51.3 ms\n"
]
},
{
......@@ -230,7 +222,7 @@
"-248.2989614228091"
]
},
"execution_count": 21,
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
......@@ -242,7 +234,7 @@
},
{
"cell_type": "code",
"execution_count": 22,
"execution_count": 8,
"metadata": {},
"outputs": [
{
......@@ -251,7 +243,7 @@
"('optimal', -248.2989614228091)"
]
},
"execution_count": 22,
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
......@@ -262,7 +254,7 @@
},
{
"cell_type": "code",
"execution_count": 23,
"execution_count": 9,
"metadata": {},
"outputs": [
{
......@@ -285,7 +277,7 @@
"12: -2.4829e+02 -2.4831e+02 1e-02 2e-16 4e-16\n",
"13: -2.4830e+02 -2.4830e+02 1e-04 2e-16 1e-15\n",
"Optimal solution found.\n",
"Wall time: 62 ms\n"
"Wall time: 108 ms\n"
]
}
],
......@@ -316,14 +308,14 @@
},
{
"cell_type": "code",
"execution_count": 24,
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Wall time: 18 ms\n"
"Wall time: 24 ms\n"
]
},
{
......@@ -332,7 +324,7 @@
"0"
]
},
"execution_count": 24,
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
......@@ -369,7 +361,7 @@
},
{
"cell_type": "code",
"execution_count": 25,
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
......@@ -378,7 +370,7 @@
},
{
"cell_type": "code",
"execution_count": 26,
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
......@@ -390,18 +382,9 @@
},
{
"cell_type": "code",
"execution_count": 36,
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"D:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\ipykernel\\ipkernel.py:287: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n",
" and should_run_async(code)\n"
]
}
],
"outputs": [],
"source": [
"def cvxpy(n):\n",
" w = Variable(n)\n",
......@@ -423,7 +406,7 @@
},
{
"cell_type": "code",
"execution_count": 37,
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
......@@ -455,7 +438,7 @@
},
{
"cell_type": "code",
"execution_count": 38,
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
......@@ -474,7 +457,7 @@
},
{
"cell_type": "code",
"execution_count": 39,
"execution_count": 16,
"metadata": {},
"outputs": [
{
......@@ -482,9 +465,9 @@
"output_type": "stream",
"text": [
"Scale(n) cvxpy cvxopt ipopt\n",
"100 0.0230 0.0200 0.0050\n",
"200 0.0290 0.0360 0.0110\n",
"300 0.0360 0.0500 0.0150\n"
"100 0.0527 0.0660 0.0142\n",
"200 0.0710 0.3040 0.0601\n",
"300 0.1614 0.0690 0.0155\n"
]
}
],
......
......@@ -15,7 +15,7 @@
{
"data": {
"text/plain": [
"datetime.datetime(2020, 11, 15, 2, 56, 3, 86969)"
"datetime.datetime(2020, 11, 21, 14, 58, 25, 169575)"
]
},
"execution_count": 1,
......@@ -39,7 +39,7 @@
},
{
"cell_type": "code",
"execution_count": 2,
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
......@@ -49,7 +49,7 @@
"freq = '10b'\n",
"horizon = map_freq(freq)\n",
"neutralized_risk = risk_styles + industry_styles\n",
"universe = Universe('zz500')\n",
"universe = Universe('hs300')\n",
"data_source = os.environ['DB_URI']\n",
"offset = 1\n",
"method = 'ls'\n",
......@@ -64,7 +64,7 @@
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
......@@ -96,22 +96,32 @@
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"D:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\model\\data_preparing.py:412: FutureWarning: DataFrame.mean and DataFrame.median with numeric_only=None will include datetime64 and datetime64tz columns in a future version.\n",
" lambda x: x.fillna(x.median())).reset_index(\n",
"D:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\model\\data_preparing.py:412: FutureWarning: DataFrame.mean and DataFrame.median with numeric_only=None will include datetime64 and datetime64tz columns in a future version.\n",
" lambda x: x.fillna(x.median())).reset_index(\n",
"D:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\model\\data_preparing.py:412: FutureWarning: DataFrame.mean and DataFrame.median with numeric_only=None will include datetime64 and datetime64tz columns in a future version.\n",
" lambda x: x.fillna(x.median())).reset_index(\n",
"D:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\model\\data_preparing.py:412: FutureWarning: DataFrame.mean and DataFrame.median with numeric_only=None will include datetime64 and datetime64tz columns in a future version.\n",
" lambda x: x.fillna(x.median())).reset_index(\n"
]
},
{
"ename": "IndexError",
"evalue": "index -1 is out of bounds for axis 0 with size 0",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mIndexError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-7-fe9f95d31cfa>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# %%time\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mpredicts\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[0mpredict_worker\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0md\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstrftime\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'%Y-%m-%d'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0malpha_model\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0md\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mref_dates\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m<ipython-input-7-fe9f95d31cfa>\u001b[0m in \u001b[0;36m<listcomp>\u001b[1;34m(.0)\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# %%time\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mpredicts\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[0mpredict_worker\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0md\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstrftime\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'%Y-%m-%d'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0malpha_model\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0md\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mref_dates\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m<ipython-input-6-a84bced2d505>\u001b[0m in \u001b[0;36mpredict_worker\u001b[1;34m(params)\u001b[0m\n\u001b[0;32m 21\u001b[0m data_source=data_source)\n\u001b[0;32m 22\u001b[0m \u001b[0mref_date\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmodel\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mparams\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 23\u001b[1;33m \u001b[0mer\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0m_\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpredict_by_model\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mref_date\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdata_meta\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 24\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mer\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\model\\composer.py\u001b[0m in \u001b[0;36mpredict_by_model\u001b[1;34m(ref_date, alpha_model, data_meta, x_values, codes)\u001b[0m\n\u001b[0;32m 165\u001b[0m codes: Iterable[int] = None):\n\u001b[0;32m 166\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mx_values\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 167\u001b[1;33m \u001b[0mpredict_data\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mdata_meta\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfetch_predict_data\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mref_date\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0malpha_model\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 168\u001b[0m \u001b[0mcodes\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mx_values\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpredict_data\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'predict'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'code'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpredict_data\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'predict'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'x'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 169\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\model\\composer.py\u001b[0m in \u001b[0;36mfetch_predict_data\u001b[1;34m(self, ref_date, alpha_model)\u001b[0m\n\u001b[0;32m 140\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwarm_start\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 141\u001b[0m \u001b[0mfillna\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 142\u001b[1;33m fit_target=alpha_model.fit_target)\n\u001b[0m\u001b[0;32m 143\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 144\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\model\\data_preparing.py\u001b[0m in \u001b[0;36mfetch_predict_phase\u001b[1;34m(engine, alpha_factors, ref_date, frequency, universe, batch, neutralized_risk, risk_model, pre_process, post_process, warm_start, fillna, fit_target)\u001b[0m\n\u001b[0;32m 444\u001b[0m \u001b[0mdates\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0munique\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdate_label\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 445\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 446\u001b[1;33m \u001b[1;32mif\u001b[0m \u001b[0mdates\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m==\u001b[0m \u001b[0mdt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdatetime\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstrptime\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mref_date\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'%Y-%m-%d'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 447\u001b[0m \u001b[0mend\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mdates\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 448\u001b[0m \u001b[0mstart\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mdates\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m-\u001b[0m\u001b[0mbatch\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mbatch\u001b[0m \u001b[1;33m<=\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdates\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32melse\u001b[0m \u001b[0mdates\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mIndexError\u001b[0m: index -1 is out of bounds for axis 0 with size 0"
]
}
],
"source": [
......@@ -121,24 +131,9 @@
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2020-11-15 02:56:56,585 - ALPHA_MIND - INFO - 2020-01-02 full re-balance: 500\n",
"2020-11-15 02:56:57,007 - ALPHA_MIND - INFO - 2020-01-02 is finished\n",
"2020-11-15 02:56:57,011 - ALPHA_MIND - INFO - 2020-01-16 full re-balance: 500\n",
"2020-11-15 02:56:57,289 - ALPHA_MIND - INFO - 2020-01-16 is finished\n",
"2020-11-15 02:56:57,293 - ALPHA_MIND - INFO - 2020-02-07 full re-balance: 500\n",
"2020-11-15 02:56:57,493 - ALPHA_MIND - INFO - 2020-02-07 is finished\n",
"2020-11-15 02:56:57,496 - ALPHA_MIND - INFO - 2020-02-21 full re-balance: 500\n",
"2020-11-15 02:56:57,737 - ALPHA_MIND - INFO - 2020-02-21 is finished\n"
]
}
],
"outputs": [],
"source": [
"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",
......@@ -191,24 +186,15 @@
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<AxesSubplot:title={'center':'Fixed freq rebalanced: 10b'}>"
"ename": "NameError",
"evalue": "name 'rets' is not defined",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-8-659ccccfe657>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mret_df\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m{\u001b[0m\u001b[1;34m'returns'\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mrets\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'turn_over'\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mturn_overs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'leverage'\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mleverags\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mindex\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mref_dates\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[0mret_df\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mloc\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0madvanceDateByCalendar\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'china.sse'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mref_dates\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfreq\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m0.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0mret_df\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mret_df\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshift\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[0mret_df\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0miloc\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m0.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0mret_df\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'tc_cost'\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mret_df\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mturn_over\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;36m0.002\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mNameError\u001b[0m: name 'rets' is not defined"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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b4KCgsy//vWvStv07Nmz0tds6dKlpl27dmbp0qUnPYYjTnS8s2bNMoApKSmp9PnHHnvMdOzYsVLd/fv3r7TN2LFjTVxcXLXeX0TkdNWeZQlEpNbr06cPb731Vvnjk62MMnDgQB599FH+8pe/cN999zFkyJDy59LS0liyZAnTpk075nWbNm2iVatW7Nq165iJqv379+ejjz46rdp79uyJw1HxR8y0tDRWrFhBeHh4pe2KiorYtGkTABs2bGDw4MHH1FAdHTp0qLTvtLQ09uzZQ8OGDSttV1JSQkhISKXPXXTRReUf+/v707t3b9avX1/+uX//+9+88cYbbNu2jYKCAtxu90mHgdi2zd///nfee+89MjIyKC4upqysjBYtWlTarn379gQFBZU/jomJqTS0ZsWKFUycOPG477Fv3z62b9/OI488Uukqvjn8F5b09HSCgoIoKSk57td17ty55Y979+7NTz/9dMLjOReO7jlAv379eO6558jNzSUiIuK81iIi9YeCvIicNyEhIdVeJtDj8ZCSkoKfnx+bN2/GGINlWYA3WD7++OPcdtttx7wuOjr6nIxNDgsLq/TYtm0GDx583F8mGjRocE7er0OHDsyZM+eYbUNDQ6u93w8++IAHH3yQiRMncumllxIREcEHH3zAE088ccLXvPTSSzz33HNMnjyZ7t2743Q6mTx5Mp9++mml7X45MdiyrErj6E/myNdsypQpDBw48Jjn4+Li2LhxY7X2dbY0a9YMgD179pTPiwDYu3dv+XMiIr6kIC8iNdJf/vIX0tPTSUlJ4YorruDvf/87jz/+OACJiYmsX7/+pL8UxMbGkpqayjXXXFP+uZSUlLNWX2JiIjNnziQuLo7g4ODjbtOxY0dSU1Mrfe50a0hMTOTtt98mIiKCqKiok267ZMkSOnbsCHjXxV+2bFn5Lz3fffcd3bt355FHHinfftu2bSfd33fffceVV17JyJEjyz935K8Op6Jnz5589dVXjBo16pjnmjZtSvPmzfn555+55557jvv6hIQEAgMDSU1NpVOnTuWfP5tf11/WGxQUxJdffllek23bzJs3j3vvvbfStr9cPjU1NZXY2FhdjReRc0qTXUWkxvn222+ZOHEib731Fn369OFf//oXTz75JMuWLQPg6aef5uOPP+aRRx5h9erVbN68mS+++IK77rqLoqIiAB599FGmTJnCO++8w6ZNm3jppZeYN2/eWavxoYcewuPxcP3117No0SK2bdvG4sWLeeKJJ8rD+8MPP8z333/PE088wcaNG5kzZw4vvfTSab3fLbfcwgUXXMA111zDV199xbZt21i6dCnPPffcMcOFJk6cyGeffcaPP/7I/fffz759+8qXWGzXrh1r167l448/ZvPmzUyZMoUPP/zwpO/drl07Fi5cyIIFC9i4cSPjx49n6dKlp3wMTz75JJ9//jmjR4/mhx9+4Oeff2bmzJn8/PPPAEyYMIGXX36ZCRMmsG7dOn7++Wc++ugjfve73wHev1Lcd999jB8/nk8++YSff/6ZP/3pT+WvP2LZsmW0b9++/PvlRNLT01m9ejU7duwAYPXq1axevZr8/HwAIiIiuO+++xg3bhxz585l/fr1jBw5kqKiovKajli9ejV/+ctf2LhxI++++y5Tpkzh0UcfPeUeiYicEh+P0ReReuKOO+4wgwcPPu5zR08wzc7ONnFxcebRRx+ttM0999xjWrVqZXJzc40xxnz33Xdm8ODBJjw83ISGhpr27dubP/zhD+WTQT0ejxk7dqyJjIw0oaGh5oYbbjCTJk067cmud9111zHbbtu2zdx8882mcePGJjAw0MTHx5tbbrnFbNmypXyb//znP6ZVq1YmMDDQ9O7d23z00UfVmux6vF7t37/f3HfffSYmJsYEBASYmJgYM2TIELNy5UpjTMVk148//tj06NHDBAYGmg4dOpivvvqqfB+lpaXm3nvvNY0aNTJOp9PcdNNN5RNwj/jl5M+DBw+aYcOGGafTaVwul3nggQfM+PHjTYsWLU5a8zvvvGN++WPmiy++MH379jXBwcEmIiLCDBgwwGzevLn8+Tlz5pi+ffuakJAQ43Q6TdeuXc1f//rX8ucLCwvNvffeayIiIkxERIS55557zJgxYyp9zY70YcGCBSfssTHerytwzH9Hv660tNT88Y9/NE2bNjVBQUEmKSnJpKWlVdpPixYtzLhx48yIESPKe/T4449XmhwtInIuWMZUcwCjiIicsW3btnHBBRewaNGiak98FREROR4NrRERERERqYUU5EVEREREaiENrRERERERqYV0RV5EREREpBZSkBcRERERqYVq3Q2hdu/e7esSRERERKQOi4mJqXKb1atXM2PGjPI7fQ8ZMqTS82VlZUybNo0t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9qEunptOtxf17dz0y3P5Ed9//z1vvPEG8fHxtGvXju7du+Pn58eXX37JHXfcUd4f27Zxu911Yuy3enHmasTQGmMMc+fO5fvvvychIYEPPviAhQsXUlBQUL7NHXfcwTvvvFP+uGXLljzwwAOEh4dXmuRX2384qBdeZ9qHI3++TkhIqPU/KM/W98S1115bb35Qni2/7P3777/PwoULKS4uLl9pZP/+/ZSWlpaPAa6L/x5BvTjiTPtQl89Np/s9UV/OTSc6lx86dAiAiIgInnrqKcaPH4/L5WLBggU0btyYBx98sFK/HA5HrQ+u6sXZUyOCvGVZrF+/nuHDh9O3b1/uuOMOtm/fzpo1a8q36d27NzExMXzyyScA/PDDDwCVJvjVBeqF15n2wc/Pzyd1nwv6nvCdE/V+9erV5dvs2LGDZs2aERoaSk5ODlu3bgXqXu/VC68z7UN9ODfVt++J6jpRv1atWgVAp06diI+Px8/Pj/j4eIqLiwkODsYYU+f6pV6cPT7vxJHfqhISEvjpp58A6NatG82aNWPnzp2V1ki9++67mTVrFvfcc0/5DUPq0hdTvfBSHyqoF75TVe937twJQG5uLoGBgXz++edMmDCB7OxsoG71Xr3wUh8qqBen5mT92rVrV6VzOcCaNWsICgoiMDCw/G63dYV6cXad924c+QIeGZp/5AsSHR1NUVERO3bsAKBjx44UFhaW35Fr27ZtvP766/Tp04fnn3++Tqwpq154qQ8V1AvfOdXel5aWAt61v7/++mv27NnDE088QWJiog+qP7vUCy/1oYJ6cWpO51zudrv57rvveOyxx9i3bx8333xznQit6sW55X++3uinn35i3rx5NG3alKuuuqp8PNyRCXutW7dmx44drFmzhtjYWOLi4sjJyWHz5s0kJCQQHh7O3XffTXx8/Pkq+ZxRL7zUhwrqhe+cbu/T09NJSEjgkksu4aqrrqJz584+PpIzp154qQ8V1ItTc7r92rJlCwkJCURGRnL33XfTvn17Hx/JmVMvzo/z8uvN3r17mT59Op07d2bfvn289957rFy5EqB81Y3o6GhatWrF3r17+eijjwDvhKgmTZoA3jVS60JIUS+81IcK6oXvnEnvmzZtCkCfPn3qREhRL7zUhwrqxak5G+fyTp061Yngql6cP+clyKenpxMbG8uAAQO4/fbbadmyJStWrCi/tfB7773HP//5T1q1asVVV11Feno6jz/+OOHh4XTt2vV8lHjeqBde6kMF9cJ3zqT3Xbp08XH1Z5d64aU+VFAvTo36VUG9OH/OydCa5cuXs3//flq1akXbtm1p3bo1X3zxBfv376dx48a0b9+evXv3kpKSQuvWrdm7dy/Dhw8vv6PdH/7wBzweT61fmgvUiyPUhwrqhe+o9xXUCy/1oYJ6cWrUrwrqhe+c1RtCHThwgNdff53CwkK6dOlCSkoKd9xxB926dePtt9+mUaNGXHfdddi2zeLFi9m7dy/XXHNN+a1069KSQuqFl/pQQb3wHfW+gnrhpT5UUC9OjfpVQb3wvbPavc2bN9OhQweefvppbrzxRq666irmzZsHQIcOHdixYwebNm3C4XDgcrn48ccf6+wXU73wUh8qqBe+o95XUC+81IcK6sWpUb8qqBe+d8Yd/Pbbb1m/fj1lZWVceOGFXHLJJeXPOZ1OYmJiAGjTpg0XXHABb7/9NsXFxezcuZPGjRtTUlLiLaQOfDHVCy/1oYJ64TvqfQX1wkt9qKBenBr1q4J6UbOc1hh5YwwHDx7k5ZdfxrIsmjZtyjfffMOIESNo1KhR+dJCBw4cID8/H4CGDRty9dVXs2/fPl599VX279/PQw89RFBQ0Fk9oPNNvfBSHyqoF76j3ldQL7zUhwrqxalRvyqoFzWYOUUej8cYY8yuXbvMlClTyj83ffp088ILL1Ta5rnnnjNr1qwxxhhz8OBBY4wxbrfbFBYWnurb1kjqhZf6UEG98B31voJ64aU+VFAvTo36VUG9qNmq/XcN27Z59913effdd9mwYQO7d+8u/7OIw+FgxIgR/Pzzz2zYsAGHw4Hb7SYiIoKYmBj+85//8Le//Y38/Hz8/PwICQk5Z7+YnA/qhZf6UEG98B31voJ64aU+VFAvTo36VUG9qB2qFeQ3bNjA448/TkFBAdHR0cyePRt/f3/Wr19Penq6d0cOB8OGDeP9998HoLS0lG+//Zann36aoqIinnzyyfK7etVm6oWX+lBBvfAd9b6CeuGlPlRQL06N+lVBvag9qjVG3rIsrrvuuvIJDdu2bSMrK4vhw4fz73//m+effx7btunduzfr1q0jOzubAwcOcPHFF3PttdfSsmXLc3kM55V64aU+VFAvfEe9r6BeeKkPFdSLU6N+VVAvao9qXZFv1aoVF110EbZtA9CuXTv279/PgAEDsG2bzz//HIfDQXZ2Ng6Hg8jISFq3bs1DDz1U576Y6oWX+lBBvfAd9b6CeuGlPlRQL06N+lVBvag9qhXkg4KCCAgIKB8b9cMPPxAREQHAAw88wK5du5g4cSJTpkyhVatWgHeGc12kXnipDxXUC99R7yuoF17qQwX14tSoXxXUi9rjlJafPPKb2aFDh0hMTAQgJCSEm266iZ07dxIVFYXL5QK8f5apy9QLL/WhgnrhO+p9BfXCS32ooF6cGvWrgnpR851SkLcsC7fbjdPpZPv27cycOZPw8HBGjhxJ+/btz1WNNZJ64aU+VFAvfEe9r6BeeKkPFdSLU6N+VVAvar5TDvJbt25l8eLFZGVlMfD/t3fHNgyEQBQFcUBhR0zV9EMNdkCwqQlOsNJMBasX/QCJ5ymttbduu5oWiw5Bi3O0D1osOgQt9ugVtLjf57v5qGnOWcYYpfdeaq1v3ZWCFosOQYtztA9aLDoELfboFbS42/aQBwAAzvv7Z1cAAOAehjwAACRkyAMAQEKGPAAAJGTIAwBAQoY8AAAkZMgDAEBCP03NxTnZ/pMCAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 864x432 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
......@@ -223,13 +209,6 @@
" secondary_y='tc_cost')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* 本例展示如何在alpha-mind中使用深度学习模型。\n",
" - 为方便比较,使用的数据参数与[机器学习模型示例](https://github.com/alpha-miner/alpha-mind/blob/master/notebooks/Example%2012%20-%20Machine%20Learning%20Model%20Prediction.ipynb)一致。\n",
" - 本例以tensorflow实现深度学习模型,故需要预装tensorflow。\n",
"\n",
"* 请在环境变量中设置`DB_URI`指向数据库"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"\n",
"import os\n",
"import datetime as dt\n",
"import numpy as np\n",
"import pandas as pd\n",
"from alphamind.api import *\n",
"from PyFin.api import *\n",
"import tensorflow as tf\n",
"from alphamind.model.modelbase import create_model_base"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 使用Tensorflow构建模型(以线性回归为例)\n",
"\n",
"### 构建Tensorflow的接口模型\n",
"\n",
"- alpha-mind中所有的模型算法都是通过底层接口模型实现的。在接口模型中都有统一的训练与预测方法,即*fit* 和 *predict*。\n",
"- 下面的代码就是创建一个接口类,使用tensorflow实现线性回归的算法。*fit* 和 *predict* 分别对应拟合与预测功能。"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"class LinearRegressionImpl(object):\n",
" def __init__(self, **kwargs):\n",
" self.learning_rate = kwargs.get('learning_rate', 0.1)\n",
" self.training_epochs = kwargs.get('training_epochs', 100)\n",
" self.display_steps = kwargs.get('display_steps', None)\n",
" self.W = None\n",
" self.b = None\n",
"\n",
" def result(self):\n",
" with tf.Session() as sess:\n",
" ret = [sess.run(self.W), sess.run(self.b)]\n",
" return ret\n",
"\n",
" def fit(self, x, y):\n",
" num_samples, num_features = x.shape\n",
"\n",
" X = tf.placeholder(\"float\", shape=[None, num_features])\n",
" Y = tf.placeholder(\"float\", shape=[None, 1])\n",
" W = tf.Variable(np.random.randn(num_features, 1).astype(np.float32), name=\"weight\")\n",
" b = tf.Variable(np.random.randn(), name=\"bias\")\n",
" pred = tf.add(tf.matmul(X, W), b)\n",
"\n",
" # Mean squared error\n",
" cost = tf.reduce_sum(tf.pow(pred - Y, 2)) / (2 * num_samples)\n",
" # Gradient descent\n",
" optimizer = tf.train.GradientDescentOptimizer(self.learning_rate).minimize(cost)\n",
"\n",
" with tf.Session() as sess:\n",
" sess.run(tf.global_variables_initializer())\n",
"\n",
" for epoch in range(self.training_epochs):\n",
" for (train_x, train_y) in zip(x, y):\n",
" sess.run(optimizer, feed_dict={X: train_x.reshape(1, -1), Y: train_y.reshape(1, -1)})\n",
"\n",
" if self.display_steps is not None and (epoch + 1) % self.display_steps == 0:\n",
" c = sess.run(cost, feed_dict={X: x, Y: y})\n",
" print(\"Epoch: {0}, cost = {1}, W = {2}, b = {3}\".format(epoch + 1, c, W, b))\n",
"\n",
" print('Optimization finished ......')\n",
" training_cost = sess.run(cost, feed_dict={X: x, Y: y.reshape(-1, 1)})\n",
" self.W = sess.run(W)\n",
" self.b = sess.run(b)\n",
" print('Training cost = {0}, W = {1}, b = {2}'.format(training_cost, self.W, self.b))\n",
"\n",
" def predict(self, x):\n",
" num_features = x.shape[1]\n",
" X = tf.placeholder(\"float\", shape=[None, num_features])\n",
" with tf.Session() as sess:\n",
" ret = sess.run(tf.add(tf.matmul(X, self.W), self.b), feed_dict={X: x})\n",
" return np.squeeze(ret)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"为了与alpha-mind的框架对接,还需要定义如下一个wrapper。这个wrapper需要实现*load* 和*save* 两种方法。"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"class LinearRegressionTF(create_model_base()):\n",
" def __init__(self, features, fit_target, **kwargs):\n",
" super().__init__(features=features, fit_target=fit_target)\n",
" self.impl = LinearRegressionImpl(**kwargs)\n",
"\n",
" @classmethod\n",
" def load(cls, model_desc: dict):\n",
" return super().load(model_desc)\n",
"\n",
" def save(self):\n",
" model_desc = super().save()\n",
" model_desc['weight'] = self.impl.result()\n",
" return model_desc\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 测试Tensorflow模型\n",
" \n",
"### 数据配置\n",
"------------"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"freq = '60b'\n",
"universe = Universe('zz800')\n",
"batch = 1\n",
"neutralized_risk = industry_styles\n",
"risk_model = 'short'\n",
"pre_process = [winsorize_normal, standardize]\n",
"post_process = [standardize]\n",
"warm_start = 3\n",
"data_source = os.environ['DB_URI']\n",
"horizon = map_freq(freq)\n",
"\n",
"engine = SqlEngine(data_source)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"我们使用当期的`roe_q`因子,来尝试预测未来大概一个月以后的`roe_q`因子。\n",
"\n",
"* 训练的股票池为`zz800`;;\n",
"* 因子都经过中性化以及标准化等预处理;\n",
"* 预测模型使用线性模型,以20个工作日为一个时间间隔,用过去4期的数据作为训练用特征。"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"\n",
"kernal_feature = 'ROE'\n",
"regress_features = {kernal_feature: LAST(kernal_feature),\n",
" kernal_feature + '_l1': SHIFT(kernal_feature, 1),\n",
" kernal_feature + '_l2': SHIFT(kernal_feature, 2),\n",
" kernal_feature + '_l3': SHIFT(kernal_feature, 3)\n",
" }\n",
"fit_target = [kernal_feature]\n",
"\n",
"data_meta = DataMeta(freq=freq,\n",
" universe=universe,\n",
" batch=batch,\n",
" neutralized_risk=neutralized_risk,\n",
" risk_model=risk_model,\n",
" pre_process=pre_process,\n",
" post_process=post_process,\n",
" warm_start=warm_start,\n",
" data_source=data_source)\n",
"\n",
"regression_model_tf = LinearRegressionTF(features=regress_features, fit_target=fit_target, training_epochs=400, learning_rate=0.01)\n",
"regression_composer_tf = Composer(alpha_model=regression_model_tf, data_meta=data_meta)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 模型对比(sklearn线性回归模型 v.s. tensorflow线性回归模型): IC 系数\n",
"------------------"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### model train and predict\n",
"- train: 给定ref_date, 模型提取ref_date之前的所有训练日期的因子数据,以及ref_date当日的收益率数据进行训练。\n",
"- predict: 给定ref_date, 模型提取ref_date当日的因子数据,预测下一期的收益率数据。\n",
"- ic:给定ref_date, 模型用预测的结果与下一期真实的收益率数据求相关性。"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"ref_date = '2011-01-01'\n",
"ref_date = adjustDateByCalendar('china.sse', ref_date).strftime('%Y-%m-%d')"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"regression_model_sk = LinearRegression(features=regress_features, fit_target=fit_target)\n",
"regression_composer_sk = Composer(alpha_model=regression_model_sk, data_meta=data_meta)"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Optimization finished ......\n",
"Training cost = 0.06224982067942619, W = [[ 0.6762214 ]\n",
" [ 0.40109447]\n",
" [-0.4262993 ]\n",
" [ 0.28896013]], b = 0.014891502447426319\n",
"\n",
"Sklearn Regression Testing IC: 0.9434\n",
"Tensorflow Regression Testing IC: 0.9242\n",
"Wall time: 3min 26s\n"
]
}
],
"source": [
"%%time \n",
"\n",
"regression_composer_sk.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)[0]))\n",
"print(\"Tensorflow Regression Testing IC: {0:.4f}\".format(regression_composer_tf.ic(ref_date=ref_date)[0]))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 回测( simple long short strategy)\n",
"--------------------------"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 策略的初始化\n",
"\n",
"#### 加载数据: \n",
"使用函数 *fetch_data_package* 加载\n",
"- 因子数据\n",
"- 行业数据\n",
"- 风险模型数据\n",
"- 数据的预处理"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"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": [
"start_date = '2011-01-01'\n",
"end_date = '2012-01-01'\n",
"\n",
"data_package2 = fetch_data_package(engine,\n",
" alpha_factors=regress_features,\n",
" start_date=start_date,\n",
" end_date=end_date,\n",
" frequency=freq,\n",
" universe=universe,\n",
" benchmark=906,\n",
" warm_start=warm_start,\n",
" batch=1,\n",
" neutralized_risk=neutralized_risk,\n",
" pre_process=pre_process,\n",
" post_process=post_process)\n",
"\n",
"model_dates = [d.strftime('%Y-%m-%d') for d in list(data_package2['predict']['x'].keys())]\n",
"\n",
"\n",
"industry_name = 'sw_adj'\n",
"industry_level = 1\n",
"\n",
"industry_names = industry_list(industry_name, industry_level)\n",
"industry_total = engine.fetch_industry_matrix_range(universe, dates=model_dates, category=industry_name, level=industry_level)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 运行策略:(sklearn线性回归模型 v.s. tensorflow线性回归模型)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"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": [
"rets1 = []\n",
"rets2 = []\n",
"\n",
"for i, ref_date in enumerate(model_dates):\n",
" py_ref_date = dt.datetime.strptime(ref_date, '%Y-%m-%d')\n",
" industry_matrix = industry_total[industry_total.trade_date == ref_date]\n",
" dx_returns = pd.DataFrame({'dx': data_package2['predict']['y'][py_ref_date].flatten(),\n",
" 'code': data_package2['predict']['code'][py_ref_date].flatten()})\n",
" \n",
" res = pd.merge(dx_returns, industry_matrix, on=['code']).dropna()\n",
" codes = res.code.values.tolist()\n",
" \n",
" alpha_logger.info('{0} full re-balance: {1}'.format(ref_date, len(codes)))\n",
" \n",
" ## sklearn regression model\n",
" \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",
" \n",
" target_pos1, _ = er_portfolio_analysis(er1,\n",
" res.industry_name.values,\n",
" None,\n",
" None,\n",
" False,\n",
" None,\n",
" method='ls')\n",
" \n",
" target_pos1['code'] = codes\n",
" result1 = pd.merge(target_pos1, dx_returns, on=['code'])\n",
" ret1 = result1.weight.values @ (np.exp(result1.dx.values) - 1.)\n",
" rets1.append(np.log(1. + ret1))\n",
"\n",
" ## tensorflow regression model\n",
" \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",
" \n",
" target_pos2, _ = er_portfolio_analysis(er2,\n",
" res.industry_name.values,\n",
" None,\n",
" None,\n",
" False,\n",
" None,\n",
" method='ls')\n",
" \n",
" target_pos2['code'] = codes\n",
" result2 = pd.merge(target_pos2, dx_returns, on=['code'])\n",
" ret2 = result2.weight.values @ (np.exp(result2.dx.values) - 1.)\n",
" rets2.append(np.log(1. + ret2))\n",
" \n",
" alpha_logger.info('{0} is finished'.format(ref_date))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 收益图对比"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"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": [
"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 = ret_df.shift(1)\n",
"ret_df.iloc[0] = 0.\n",
"\n",
"ret_df[['sklearn', 'tensorflow']].cumsum().plot(figsize=(12, 6),\n",
" title='Fixed freq rebalanced: {0}'.format(freq))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 2
}
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* 本例展示如何在alpha-mind中使用深度学习模型。 \n",
" - 为方便比较,使用的数据参数与[机器学习模型示例](https://github.com/alpha-miner/alpha-mind/blob/master/notebooks/Example%2012%20-%20Machine%20Learning%20Model%20Prediction.ipynb)一致。\n",
" - 本例以Keras实现深度学习模型,故需要预装Keras。\n",
"\n",
"* 请在环境变量中设置`DB_URI`指向数据库"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Using TensorFlow backend.\n"
]
}
],
"source": [
"%matplotlib inline\n",
"\n",
"import os\n",
"import datetime as dt\n",
"import numpy as np\n",
"import pandas as pd\n",
"from alphamind.api import *\n",
"from PyFin.api import *\n",
"from keras.models import Sequential\n",
"from keras.layers import Dense \n",
"from alphamind.model.modelbase import create_model_base"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 使用Keras构建模型(以线性回归为例)\n",
"\n",
"### 构建Keras的接口模型\n",
"\n",
"- alpha-mind中所有的模型算法都是通过底层接口模型实现的。在接口模型中都有统一的训练与预测方法,即*fit* 和 *predict*。\n",
"- 下面的代码就是创建一个接口类,使用Keras实现线性回归的算法。*fit* 和 *predict* 分别对应拟合与预测功能。"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"class LinearRegressionImpl(object):\n",
" def __init__(self, **kwargs):\n",
" self.learning_rate = kwargs.get('learning_rate', 0.01)\n",
" self.training_epochs = kwargs.get('training_epochs', 10)\n",
" self.display_steps = kwargs.get('display_steps', None)\n",
" self.W = None\n",
" self.b = None\n",
"\n",
" def result(self):\n",
" with tf.Session() as sess:\n",
" ret = [sess.run(self.W), sess.run(self.b)]\n",
" return ret\n",
"\n",
" def fit(self, x, y):\n",
" num_samples, num_features = x.shape\n",
"\n",
" output_dim = 1\n",
" input_dim = num_features\n",
" model = Sequential()\n",
" model.add(Dense(output_dim, input_dim=input_dim, kernel_initializer='normal', activation='linear'))\n",
" model.compile(loss='mean_squared_error', optimizer='adam')\n",
" model.fit(x, y, epochs=self.training_epochs, verbose=False)\n",
"\n",
" print('Optimization finished ......')\n",
" self.model = model\n",
"\n",
" def predict(self, x):\n",
" ret = self.model.predict(x)\n",
" return np.squeeze(ret)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"为了与alpha-mind的框架对接,还需要定义如下一个wrapper。这个wrapper需要实现*load* 和*save* 两种方法。"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"class LinearRegressionKS(create_model_base()):\n",
" def __init__(self, features, fit_target, **kwargs):\n",
" super().__init__(features=features, fit_target=fit_target)\n",
" self.impl = LinearRegressionImpl(**kwargs)\n",
"\n",
" @classmethod\n",
" def load(cls, model_desc: dict):\n",
" return super().load(model_desc)\n",
"\n",
" def save(self):\n",
" model_desc = super().save()\n",
" model_desc['weight'] = self.impl.result()\n",
" return model_desc\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 测试Keras模型\n",
" \n",
"### 数据配置\n",
"------------"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"freq = '60b'\n",
"universe = Universe('zz800')\n",
"batch = 1\n",
"neutralized_risk = industry_styles\n",
"risk_model = 'short'\n",
"pre_process = [winsorize_normal, standardize]\n",
"post_process = [standardize]\n",
"warm_start = 3\n",
"data_source = os.environ['DB_URI']\n",
"horizon = map_freq(freq)\n",
"\n",
"engine = SqlEngine(data_source)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"我们使用当期的`roe_q`因子,来尝试预测未来大概一个月以后的`roe_q`因子。\n",
"\n",
"* 训练的股票池为`zz800`;;\n",
"* 因子都经过中性化以及标准化等预处理;\n",
"* 预测模型使用线性模型,以20个工作日为一个时间间隔,用过去4期的数据作为训练用特征。"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"\n",
"kernal_feature = 'ROE'\n",
"regress_features = {kernal_feature: LAST(kernal_feature),\n",
" kernal_feature + '_l1': SHIFT(kernal_feature, 1),\n",
" kernal_feature + '_l2': SHIFT(kernal_feature, 2),\n",
" kernal_feature + '_l3': SHIFT(kernal_feature, 3)\n",
" }\n",
"fit_target = [kernal_feature]\n",
"\n",
"data_meta = DataMeta(freq=freq,\n",
" universe=universe,\n",
" batch=batch,\n",
" neutralized_risk=neutralized_risk,\n",
" risk_model=risk_model,\n",
" pre_process=pre_process,\n",
" post_process=post_process,\n",
" warm_start=warm_start,\n",
" data_source=data_source)\n",
"\n",
"regression_model_ks = LinearRegressionKS(features=regress_features, fit_target=fit_target, training_epochs=400)\n",
"regression_composer_ks = Composer(alpha_model=regression_model_ks, data_meta=data_meta)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 模型对比(sklearn线性回归模型 v.s. keras线性回归模型): IC 系数\n",
"------------------"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### model train and predict\n",
"- train: 给定ref_date, 模型提取ref_date之前的所有训练日期的因子数据,以及ref_date当日的收益率数据进行训练。\n",
"- predict: 给定ref_date, 模型提取ref_date当日的因子数据,预测下一期的收益率数据。\n",
"- ic:给定ref_date, 模型用预测的结果与下一期真实的收益率数据求相关性。"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"ref_date = '2011-01-01'\n",
"ref_date = adjustDateByCalendar('china.sse', ref_date).strftime('%Y-%m-%d')"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"regression_model_sk = LinearRegression(features=regress_features, fit_target=fit_target)\n",
"regression_composer_sk = Composer(alpha_model=regression_model_sk, data_meta=data_meta)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"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": [
"%%time\n",
"\n",
"regression_composer_sk.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)[0]))\n",
"print(\"Keras Regression Testing IC: {0:.4f}\".format(regression_composer_ks.ic(ref_date=ref_date)[0]))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 回测( simple long short strategy)\n",
"--------------------------"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 策略的初始化\n",
"\n",
"#### 加载数据: fetch_data_package\n",
"- 因子数据\n",
"- 行业数据\n",
"- 风险模型数据\n",
"- 数据的预处理"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"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": [
"start_date = '2011-01-01'\n",
"end_date = '2012-01-01'\n",
"\n",
"data_package2 = fetch_data_package(engine,\n",
" alpha_factors=regress_features,\n",
" start_date=start_date,\n",
" end_date=end_date,\n",
" frequency=freq,\n",
" universe=universe,\n",
" benchmark=906,\n",
" warm_start=warm_start,\n",
" batch=1,\n",
" neutralized_risk=neutralized_risk,\n",
" pre_process=pre_process,\n",
" post_process=post_process)\n",
"\n",
"model_dates = [d.strftime('%Y-%m-%d') for d in list(data_package2['predict']['x'].keys())]\n",
"\n",
"\n",
"industry_name = 'sw_adj'\n",
"industry_level = 1\n",
"\n",
"industry_names = industry_list(industry_name, industry_level)\n",
"industry_total = engine.fetch_industry_matrix_range(universe, dates=model_dates, category=industry_name, level=industry_level)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 运行策略:(sklearn线性回归模型 v.s.keras线性回归模型)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"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": [
"rets1 = []\n",
"rets2 = []\n",
"\n",
"\n",
"\n",
"for i, ref_date in enumerate(model_dates):\n",
" py_ref_date = dt.datetime.strptime(ref_date, '%Y-%m-%d')\n",
" industry_matrix = industry_total[industry_total.trade_date == ref_date]\n",
" dx_returns = pd.DataFrame({'dx': data_package2['predict']['y'][py_ref_date].flatten(),\n",
" 'code': data_package2['predict']['code'][py_ref_date].flatten()})\n",
" \n",
" res = pd.merge(dx_returns, industry_matrix, on=['code']).dropna()\n",
" codes = res.code.values.tolist()\n",
" \n",
" alpha_logger.info('{0} full re-balance: {1}'.format(ref_date, len(codes)))\n",
" \n",
" ## sklearn regression model\n",
" \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",
" \n",
" target_pos1, _ = er_portfolio_analysis(er1,\n",
" res.industry_name.values,\n",
" None,\n",
" None,\n",
" False,\n",
" None,\n",
" method='ls')\n",
" \n",
" target_pos1['code'] = codes\n",
" result1 = pd.merge(target_pos1, dx_returns, on=['code'])\n",
" ret1 = result1.weight.values @ (np.exp(result1.dx.values) - 1.)\n",
" rets1.append(np.log(1. + ret1))\n",
"\n",
" ## keras regression model\n",
" \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",
" \n",
" target_pos2, _ = er_portfolio_analysis(er2,\n",
" res.industry_name.values,\n",
" None,\n",
" None,\n",
" False,\n",
" None,\n",
" method='ls')\n",
" \n",
" target_pos2['code'] = codes\n",
" result2 = pd.merge(target_pos2, dx_returns, on=['code'])\n",
" ret2 = result2.weight.values @ (np.exp(result2.dx.values) - 1.)\n",
" rets2.append(np.log(1. + ret2))\n",
" ## perfect forcast\n",
" \n",
" alpha_logger.info('{0} is finished'.format(ref_date))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 收益图对比"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"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": [
"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 = ret_df.shift(1)\n",
"ret_df.iloc[0] = 0.\n",
"\n",
"ret_df[['sklearn', 'keras']].cumsum().plot(figsize=(12, 6),\n",
" title='Fixed freq rebalanced: {0}'.format(freq))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 2
}
......@@ -27,13 +27,13 @@
},
{
"cell_type": "code",
"execution_count": 2,
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"# Back test parameter settings\n",
"start_date = '2016-01-01'\n",
"end_date = '2018-03-30'\n",
"start_date = '2020-01-01'\n",
"end_date = '2020-02-21'\n",
"\n",
"freq = '10b'\n",
"industry_name = 'sw'\n",
......@@ -42,22 +42,22 @@
"batch = 1\n",
"horizon = map_freq(freq)\n",
"weights_bandwidth = 0.01\n",
"universe = Universe('zz800')\n",
"universe = Universe('hs300')\n",
"data_source = os.environ['DB_URI']\n",
"benchmark_code = 905\n",
"benchmark_code = 300\n",
"method = 'risk_neutral'"
]
},
{
"cell_type": "code",
"execution_count": 3,
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"# Model settings\n",
"alpha_factors = {\n",
" 'f01': CSQuantiles(LAST('EPS'), groups='sw1'),\n",
" 'f02': CSQuantiles(LAST('ROE'), groups='sw1'),\n",
" 'f01': CSQuantiles(LAST('EMA5D')),\n",
" 'f02': CSQuantiles(LAST('EMV6D')),\n",
" }\n",
"\n",
"weights = dict(f01=1.,\n",
......@@ -76,7 +76,7 @@
},
{
"cell_type": "code",
"execution_count": 4,
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
......@@ -111,7 +111,7 @@
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
......@@ -124,82 +124,33 @@
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 17,
"metadata": {},
"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"
"2020-11-21 15:04:17,631 - ALPHA_MIND - INFO - alpha factor data loading finished ...\n",
"2020-11-21 15:04:17,780 - ALPHA_MIND - INFO - industry data loading finished ...\n",
"2020-11-21 15:04:17,875 - ALPHA_MIND - INFO - benchmark data loading finished ...\n",
"2020-11-21 15:04:18,105 - ALPHA_MIND - INFO - risk_model data loading finished ...\n",
"2020-11-21 15:04:19,012 - ALPHA_MIND - INFO - returns data loading finished ...\n",
"2020-11-21 15:04:19,134 - ALPHA_MIND - INFO - starting backting ...\n",
"2020-11-21 15:04:19,140 - ALPHA_MIND - INFO - alpha models training finished ...\n"
]
},
{
"ename": "AttributeError",
"evalue": "'DataFrame' object has no attribute 'trade_date'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-17-a539d65a51c9>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 9\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 10\u001b[0m \u001b[0mstrategy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mprepare_backtest_data\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 11\u001b[1;33m \u001b[0mret_df\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpositions\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mstrategy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mrunning_setting\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mrunning_setting\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\strategy\\strategy.py\u001b[0m in \u001b[0;36mrun\u001b[1;34m(self, running_setting)\u001b[0m\n\u001b[0;32m 258\u001b[0m \u001b[0mpositions\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'dx'\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtotal_data\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdx\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 259\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 260\u001b[1;33m \u001b[0mtrade_dates\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpositions\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtrade_date\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0munique\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 261\u001b[0m ret_df = pd.DataFrame({'returns': rets, 'turn_over': turn_overs, 'leverage': leverags},\n\u001b[0;32m 262\u001b[0m index=trade_dates)\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\pandas\\core\\generic.py\u001b[0m in \u001b[0;36m__getattr__\u001b[1;34m(self, name)\u001b[0m\n\u001b[0;32m 5137\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_info_axis\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_can_hold_identifiers_and_holds_name\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5138\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 5139\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mobject\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__getattribute__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mname\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 5140\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5141\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m__setattr__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mname\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m->\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mAttributeError\u001b[0m: 'DataFrame' object has no attribute 'trade_date'"
]
}
],
......@@ -219,35 +170,26 @@
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x215af4105c0>"
"outputs": [],
"source": [
"ret_df[['turn_over', 'excess_return']].cumsum().plot(figsize=(14, 7), secondary_y='turn_over')"
]
},
"execution_count": 7,
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
"outputs": [],
"source": []
},
{
"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/f2H2727SY1qZXXFcfctxX3/00UfZu3cv559/PuPGjWPixIk8/fTTh0PUL37xCwYOHMiMGTMYOXIkV199NYsWLWLmzJm88sorDBkyhGXLllFeXs4TTzzByJEjj3meuro6HnjgAdatW0dAQAAPPfQQo0ePZsqUKTzxxBP07t0bgOnTp/Pggw/So0cPfvnLX7Jlyxbcbjf33HMPF154IbNmzeLjjz/G5XJRU1PDa6+9dtR53nzzTf7+978DvhGhJ598kpSUFDZu3MjChQvp2bMn27dvx+v18otf/ILPPvuMzMxMjDHMmDGDKVOmAPDCCy8wf/583G43zzzzDCEhIbzyyisEBATwxhtv8MgjjzBy5EgyMzP58ssvGTJkyBl/ViIiIiIiLanNBSZ/+PnPf87WrVuZP38+4AsZJxISEsLbb78NwCuvvILb7ebdd9/l448/5sknn2TWrGO3e3/ppZcA+Pjjj9mxYwfXXHMNixcvZtq0acydO5fevXtTUFBAfn4+AwcO5LHHHmP06NE8+eSTlJeXc8kllzB27FgAVq9ezUcffURcXNxR56ivr2ffvn1kZmYefm7NmjUsWLCArKyso7Z97733yMnJ4eOPP6aoqIhzzz33qFvr4uPjmTdvHi+99BJPP/00f/zjH7nhhhuIiIjgttu+vhV04MCBfP755wpMIiIiItLmtLnAdKKRoNZi2rRpRz2++OKLAV9wyMnJOe5+K1euZObMmQD06NGDjIwMdu3axdSpU7nmmmv46U9/yty5cw+P8Hz66afMnz+fp59+GgCXy0Vubi4A48aN+1ZYAigpKSE6Ovqo5wYPHvytsASwYsUKpkyZgsPhIDk5mVGjRh31+uTJkw+/r/fff/+47ysxMZEdO3Yc93URERGRjqrBY1i8twILGNclmgCHOgifiKmrgW0bMZvXwd2/apFztrnA1BoEBgZyZLMMl8t11OvfbGIQHBwMQEBAwDHnFH3leA040tLSiIuLY9OmTcyZM4fHH3/88PbPPvssPXr0OGr7L7744riNFEJDQ09ab2OFhIQAvvd1ovlaLpeL0NDQ0zqHiIiISHvkcnv5cEcZb20uobjGd334ztZSbh+RSo+EtnHd5PEadpbUEeiwCA9y+P4EBxDYhKHPuBtg1zbMlrWYzWth9zbweCAwSIGpNYmIiKCqqurw406dOrFt2zZcLhcul4slS5Yc7gp3JkaOHMlbb73FmDFj2LlzJ7m5uXTv3h2ASy+9lH/+859UVlbSt29fAMaPH8+LL77II488gmVZbNiwgezs7BOeIzY2Fo/HQ11d3UlDzPDhw3nttde46qqrKC4uZvny5Vx22WUn3Oeb3yuAXbt2Ncn3R0RERKStq2nw8N62MuZsLqHc5aFfUhh3jEylqt7LC6sLuHfeHib3jOW6QUlEBH+7m3FrUeHy8IcluazL//ZSRsEBFmFBDiKCHIQFBRz6+nWgigx2cE5mFF3jvn0tarxeOLAXs+lQQNq+EVx1YDmgc3esCy7H6jsIuvdpibcJKDA1Snx8PMOHD2fChAmcd955/OpXv2Lq1KlMmjSJrl27njSkNNZNN93E/fffz8SJEwkICOBPf/rT4VGcSy65hAcffJC77rrr8PZ33XUXDz30EJMmTcIYQ0ZGRqO6+Y0fP54VK1Ywbty4E253ySWXsGTJEiZMmEC3bt0YMmTIt27n+6bzzz+f73//+8ybN+9w04eVK1fyk5/8pBHfAREREZH2qcLlYe6WEt7dVkp1vZchaRFclZ1A/+Sv7/QZmh7B/60t5L1tZSzbV8l3h6YwtnMUltW6btPbW+bi0UU5FNW4uXloMkkRQdQ0eKlp8Pi+1nupafBS2+ClusFDbYOXgqqGr19v8DJrfTFD0iK4ol882QGVsGUdbF6L2bIOKst9J0rthDVqAlafQdB7AFZEpF/er9Zh6oA2bNjAM888w1//+teTbltdXU1ERAQlJSVMmTKFt99+m+Tk5CY7lz5bERERac9Kat3M3lzCB9tLqXMbzs6MZHr/BHomhB13n+3FtfxzRQE7S+oYlBrObcNTSY8ObsGqj2/5/kqeWnaAsKAAHhjXid6Jx38fx1NVXMq6RcupXb+GPkXbSK0r8b0QE4fVdzD0HYjVZxBWfOIJj9NS6zApMHVQ//vf/7jqqquOuXDtkaZPn055eTkNDQ3cfvvtx12A9ng+/fRTunbtelRXviPpsxUREZH2qKCqnrc2lfDRznI8xjC2czTT+yeQFRvSqP09XsMH28v4z9pC6j2GK/vHM71/AsEB/llG1WsM9vpiXl1fRM+EUB4Y14mE8KBG7288HtjwBd7F82D9KvB6MaHhFGb0YWFoZxaHdcOb0onL+iUwoVtMo96nAtMR2ttF9cKFC/ntb3971HNZWVkdcoHX9vbZioiISPPZVVJHaa2bIekROJr5NrWcChe1Dd5T3q/eY/hoZxmLdldgWTChWwxX9EsgLer0RohKat28uPogn+6tIC0qiO8PT2VIWsRpHet01TR4+PPyPD7bX8WEbtHcPiK10cHNFB/ELJmPWfIRlBVDdCzWqIlYQ86Gzj2wAgLweA2f5VTy5sYSdpTUERsawJTecUzuGUdkyPF/ua/AdARdVLdf+mxFRETkZEpr3by8ppAFu3xzW7rGhXDj4CSGpEU0+fyebUW1/GdtIWuP0cygsYIDLC7sEctl/eJJPIVRmBNZk1fNMysLOFBZz+isKL43NPmURnhOV35lPY8uymV/hYuZZyUztXfcSb/nxu2GtSt8o0mb1vie7H8WjrEXwMDhWIHHbqNgjGF9QQ1vbirhy7xqQgMdXNQzlql94o75fVRgOoIuqtsvfbYiIiJyPA0eL3O3lDJrQzFur5epvePJig3hf+uLKKhqYGBKODcOSTrhfKDG2lNax/+tK2JFThXRIQFc3je+0bfPfVPPhFBiQpu+t1qDx8ubm0p4bUMxgQ6L6f0TGJQWTufYkGa5VW9tfjV/WJyLAe4d04nBJxnZMgcPYBbPxyz9yNe4IS4Ra/QkrDGTsBIaPwceYHdpHW9uKmHJ3gocFozrEsPl/eLJivn6M1FgOoIuqtsvfbYiIiLyTcYYVuRW8cLqg+RXNTC8UyTfPSv5cOODBo9h3o5SZq0vpsLlYXRWFNcNSqLTaTRGyK2o59V1hSzZW0lYkIPL+sYztU8c4UGtt6V3XmU9z6ws4Mu8agACLMiKDaF7fOjhP11iQwgJPL0QZYzhna2lvPDFQTKig/n5+Izj3lJoGuoxXyzHLP4Qtq4HhwMGDveNJmWfheU4s+9jQVU9s7eUMn9HGfUew/BOkVzRL55+yeEKTEfSRXX7pc9WREREjrSvzMXzqwtYk19DRnQwNw9LOe6cnZoGD29vLmH25hLqPYYLesQyY0Ai8WEnH905WNXArA1FLNhVTpDDYmqfeC7rG0/UCebMtDYFVfXsLKljZ4mLHSV17Cypo9LlAcBhQVbM1yGqR0LjQlSDx8s/VhSwYFc5IzMiuWtU2rfCo/F6YPsmzMrFmFVLoboSElOwxpyPNXoiVmxCk7/Xijo3720r451tpVS6PPRJDOOVmeeAApOPLqqbxqxZsxg/fjypqan+LuUwfbYiIiICUOny8Or6It7fVkpYkINrBiQyuVccgY6TXw+X1bqZtaGIedvLCHRYTOsTz+X94o+58GtprZvXNhQxb4dvPtTknrFM759AbCNCVmtnjKGw2n0oRH39p/yIEJUZHUL3hK+DVLe40MMhqqTWze8+zWFrUR1XD0hgxoDEw801jNcLu7b6QtLqpVBeCsEhWINGYI05H/oMxHI0fwe/OreXj3eW8/bmEt79wVhQYPLRRXXjeTye47YKnz59Or/61a8YNGhQo4/ndrsJPM7EvKagz1ZERKRj83gN83aU8d+1hVQ3eLmwRyzXDkwk+jTmAOVV1vN/awtZvLeSqJAAruqfwOResQQHOKhweXhrUzHvbC3F7TVM6h6DMzuRpIjmb5zgT8YYimq+HaLK6r4OURnRwXSLD2Vdfg01DR7uOiedc7KiMMbAnh2YVYsxq5ZASREEBsHAYVjDxmINHIYVEuqX9+XxGjIzOoECk09ruah+4403eOGFF6ivr2fIkCH8+Mc/ZsaMGcydO5fY2FiuvPJK7rrrLsaPH89rr73GM888A0Dfvn3561//SnFxMffffz+5ubkAPPzwwwwfPpzly5fz4IMPAmBZFm+++SbV1dXcfvvtVFZW4vF4eOyxxxg5cuQx6+rZsye33norixYt4sEHHyQ0NJSHH36Y6upq4uPj+dOf/sTKlSu5++67SU1NJTQ0lDlz5nDuuefy/vvvEx8fz9q1a/nNb37D66+/zhNPPEFBQQH79+8nPj6ecePGMX/+fGpra9mzZw+TJ0/ml7/8ZZN8T1vLZysiIiItb11+Nc+tOsjechfZKeHcMjSZLnFnfgG+o7iOV9YcZE1+DUnhgYzIjOKTXeXUNngZ2yWaawYktpqFYP3BGENJrfvwbXw7i31fI4IDuHd0Gp2r8w/dbrcECvMhIBD6D8EaPgZr0EissNZx7dZSc5ja3Njjc6sK2F1a16TH7BoXys3DUk64zfbt25kzZw5vv/02QUFBPPDAAyxfvpwf/vCH3HfffZx11ln07NmT8ePHs3XrVv7yl78we/Zs4uPjKS0tBeDBBx/klltuYcSIEeTm5nLttdeyaNEinn76aR599FGGDx9OdXU1ISEh/Oc//2H8+PHceeedeDweamtrj1tbTU0NvXv35t5776WhoYErr7ySF198kYSEBGbPns3jjz/Ok08+yUsvvdToEaZ169bx1ltvERYWxqxZs9i4cSPz5s0jODiYcePGMXPmTDp16nRq32gRERHp8FxuLytyqliwq5wv8qpJjgji/rGdODszsslahPdICOXhiVmsyavm5TUHeXdrKWdnRnLtwCQ6n2bnu/bEsiwSwoNICA9iRHqEb32kg6WYbRswf1qMNz/X17yhzyCsS5xYg8/Gioj0d9l+06jA5HQ6LwL+DAQAz9m2/btvvP4T4GbADRQC37Vte++h124CvhqOeMS27X83Ue0tasmSJaxfv56LL74YgLq6OhITE7nnnnt45513eOWVV/jwww8BWLp0KZdccgnx8fEAxMXFAbB48WK2bdt2+JhVVVVUVVUxfPhwHn74YS6//HImT55Meno6gwcP5p577sHtdnPhhReSnZ193NoCAgK45JJLANi5cydbt27l6quvBsDr9ZKcfGptHAEuuOACwsK+btE5ZswYoqOjAejVqxe5ubkKTCIiItIoHq9vfZ1Fe8pZtq+KOreX+LBArh+UyKV945ulJTbA4LQIBqZ2obre26aaOTQ14/X4bqc7mIc5mAeFh74ezPONIDXU+za0LOiVjTXpUqyzzsGKivFv4a3ESQOT0+kMAP4OnA/kACudTucc27Y3HbHZl8Aw27ZrnE7n7cDvgRlOpzMeeAgYBhhg9aF9S0+34JONBDUXYwxXXXUVDzzwwFHP19bWkpeXB0B1dTWRkZEYY475GxKv18ucOXOOCiIAd9xxBxMnTmTBggVMnTqVWbNmcfbZZ/PGG2/w8ccfc+edd3Lbbbdx1VVXHbO2kJCQw/OWjDH06tWLuXPnnvQ9BQYG4vX6VrB2uVxHvfbN2+SCg78etnY4HLjd7pMeX0RERDouYww7SupYtKeCJXsqKK3zEB7kYEznKMZ3iaZ/cjgBjWjocKYcltUhwpLxeKD4oC8UFfrCkCk4AIV5UFgAniOu3YKCISkVktOwss+CpDSs5DTI6IwVHee/N9FKNWaEaQSww7btXQBOp/N/wKXA4cBk2/YnR2z/GXD9ob9fCMy3bbvk0L7zgYuAV8+89JY1ZswYZs6cyS233EJiYiKlpaVUV1fz9NNPc/nll5ORkcG9997Lyy+/zJgxY/je977HLbfccviWvLi4OMaPH89LL73E7bffDsCGDRvIzs5mz5499O3bl759+7J69Wp27NhBaGgoqampXHfdddTU1LB+/frjBqYjde/enZKSElatWsWwYcNoaGhg165d9O7dm4iICKqqqg5vm5GRwbp165gwYQLvvvtus33vREREpOPIq6xn0Z4KPt1TQW5FPYEOi2GdIhjfJZphnSKbbTSpozB1NZCzF5OzBw7sOxyOKD4IHs/XG4aEQlIapHfGGny2Lxwlp/mei41vkY527UVjAlMnYP8Rj3OAY3cf8Pke8P4J9m2T93H16tWLn/3sZ1xzzTUYYwgMDOShhx5izZo1zJ49m4CAAN577z1mzZrFjBkz+PGPf8z06dNxOBxkZ2fz1FNP8Zvf/Iaf//znTJo0CbfbzciRI3n88cd57rnnWLZsGQ6Hg169enHeeecxe/Zsnn76aQIDA4mIiODPf/5zo+oMDg7mmWee4cEHH6SiogKPx8PNN99M7969cTqd3H///YebPvzkJz/hnnvu4a9//StDhgxp5u+giIiItFfldW6W7K1k0Z5ythbVYQH9U8K5rG88ozKjiOwAIzxNzXi9UFQAObsxOXt8ASlnj+8Wuq+EhkFyOlZWdxg2xheKktIgJR2iY5tsTlhHd9IueU6n8yrgQtu2bz70+AZghG3bPzrGttcDdwDjbdt2OZ3Oe4EQ27YfOfT6r4Aa27af+MZ+twK3Ati2PbS1dsmTpqfPVkREpG3bWFDDw5/sx+UxdIkNYXzXaMZ2jm737bqbknHVwf5dvlC0fw8mdw/k7AXXoaZflgNS0rA6dYHMrlgZXSCjK8QnduhQ1Jq65OUAmUc8zgAOfHMjp9M5CfgFh8LSEfue+419F35zX9u2nwWePfSw1fU5FxEREZFv211ax28X5ZAYEcTPxqQ3SUvwjsAYA3n7MRtWYzZ8Ads3wlfzw8MjIKMr1uiJkNEFK6MrpGdhhai7n780JjCtBHo6nc6uQC5wNXDtkRs4nc4hwDPARbZtHzzipXnAo06n86vZYxcAR3dNkEabMmXKt5oz/OUvf6Fv375+qkhEREQ6qvzKeh5esJ/QQAcPT8jUiNJJmNoa2LzWF5I2fuHrWge+MDRhClavAZDZBeI69qhRa9SohWudTufFwFP42oq/YNv2b51O56+BVbZtz3E6nR8BA4C8Q7vss2172qF9vwv8/NDzv7Vt+8WTnK7VLlwrTU+frYiISNtTVuvm/vl7qXR5eOyCzmTFaPTjm4wxsH83ZuMXmA2rYecWX1OG0DDoNxir/1m+PwlJ/i61zWqpW/IaFZha2LcCU3V1NREREX4qR5qTPlsREZG2pabBwy/m7yO3op5fT8yiT1LYyXfqIIwxsHYF5svPfKNI5YdW0snsipV9Flb2UOjWByuwUUuhykm0pjlMfvfVuj+B+o+rXXG73TjU0lJERKTNqPd4eXRRLnvLXPxifIbC0hHM1vV4X38J9myH8Eis/kOg/1lY/Ydgxcb7uzw5A20igYSGhlJXV4fL5dI9ne2EMQaHw0FoqCaHioiItAUer+HJpXmsL6jh7lFpDO0U6e+SWgWTsxvvGy/DhtW++UffuRPr7HOxAtRKvb1oE4HJsizCwvQbDBERERF/MMbwzMoClu+v5HtDkzm3a4y/S/I7U1yImf1/mM8+gbBwrOnfwTrvEqxgzedqb9pEYBIRERER/3l1fRHzdpRxZb94pvXp2LeXmepKzHuvYxa8A4B1wWVYk6/CitCIW3ulwCQiIiIix/Xu1lJmrS9mUvcYbhjccTu6mXoXZsE7mPdfh9oarHMmYE27Vl3uOgAFJhERERE5psV7KvjXqgJGZkTygxGpHXIuufF6MMs/wcz+L5QWwYBhOK64ESuji79LkxaiwCQiIiIi37Imr5qnlh+gX3IY94xOJ8DRscKSMQbWr8L75suQuxe69sLxvbuxeg/wd2nSwhSYREREROQo24treezTHDKiQ/j5+AxCAjvOMiDGVedbR+nTD2D7JkhOx3HbfXDWqA45wiYKTCIiIiJyhJwKF7/+JIeY0EAempBJZHD7b49tPB7YvBbz+ULMl5+Bqw4SkrGuvQ1r7AVaaLaD06cvIiIiIhhj2FxYy5NLD2BZ8PCETOLD2u+lojEG9u3CfLYQs/JTKC+F8AiskeOxRp4LPfpiOTrOyJocX/v9VyAiIiIiJ+XxGpbuq2TOlhK2F9cRExLA/5uQSVpUsL9Laxam+KAvJH2+CPL2Q0AgDByG4+xzYcBwrKAgf5corYwCk4iIiPhVTYOH6novSRG6UG1J1fUe5u8s450tpRTWuEmPCua24SlM6BbT7uYsmeoqzOqlmM8XwraNvid79sO64QdYQ0djRUT5tT5p3RSYRERExG/q3F5+Pn8fe8tcjMqKYnr/BLrGhfq7rHatoKqeuVtLmb+jnDq3l+yUcG4dnsKwTpE42klTA1NdCTu2YHZuwmzfDHu2gdsNqZ2wLrsea8Q4rKRUf5cpbYQCk4iIiPiFMYa/fpbHnlIXE7rFsGxfJUv2VjIsPYKrshPpkxTm7xJblDEGtxeCApontGwtquXtzSV8tr8SCxjbOZppfePpHt+2A6oxBgrzMDs2w47Nvq95+30vBgRAVnesCVOxRoz1/b2dhEJpOZYxxt81fJM5cOCAv2sQERGRZvb6xmJeWVPIjYOTuLJ/AlX1Ht7bWsqcraVUujxkp4RzVf8EBqWGt/uL3E0Ha3hlTSFbimrpnxzO6KwozsmMIvYMmy54vIbPciqZvbmUrUW1RAQ7uLBHLFN6x5EQ3jZvgTTuBl+zhh2bMTt9IYmKMt+LYRHQvQ9Wj75YPfpBl55YISH+LViaTXp6OkCz/3BQYBIREZEWtyq3ikcW5jCmcxT3jE4/KhDVub3M217G25tLKKl10zMhlOn9ExiR0X5uGfvKntI6/rO2kJW51cSFBjAqK4o1+TXkVtRjAf2TwxiVFc2orCjiTiE81TR4+GhnOXO3lHKwuoHUyCCm9YlnQrcYwoLa5vwkU+/CvP4iZslH0FDvezIxBatHX+jeF6tnP0jLVGe7DkSBSURERNql3Ip67v1gD8mRQTx+QefjNhho8Hj5ZHcFb2wsJr+qgayYYK7sn8DYztEEONp2cMqvrOfVdUUs2lNBeJCDK/onMLV3HCGBDowx7C1zsWx/JUv3VpJzKDz1Sw5j1KGRp+ONDhVWN/DO1lI+3FFGTYOXfklhXNo3nuGdItv098zk7cf7zO8hdy/W6IlY2UN9bb9jE/xdmviRApOIiIi0OzUNHu79YC8VLg9PXNSF5MiT3xbm8RqW7K3g9Y3F7CuvJzUyiCv6JTChWzRBAW1rNKGs1o29oYh5O8pwWBZTesdxRb8EokKOvzjsvjIXS/dVsGxfJfvKfeGpb5IvPI3K8oWn7cW1zN5cwtJ9lQCMzopiWp94eiW27XlgxhjMsgWY/z4NwSE4vns31oCh/i5LWomTBSan0/kCMAU4aNt29qHn4oFZQBdgD+C0bbv0ROdR0wcRERFpEV5jeHJpHnmV9fx6YlajwhJAgMNifNcYxnaJZmVOFa9tLOYfK/L53/oipvaO44KesUQGHz9wtAbV9R7e3lzCnC0l1HsM53ePZcaAhEbNI8qKDSErNolrBiaxv9zF0n2VLNtbyXOrD/Lc6oOkRgaRX9VAeJCDaX3imdI7rl20aDd1NZj/exrz2ULoPQDHzT/RiJKcqpeAvwEvH/Hc/cDHtm3/zul03n/o8X0nOogCk4iIiLSIV9cVsTK3iluHpZCdEn7K+zssi5GZUYzIiGRtfg1vbCrm32sKsTcUc0GPGKb2iW91QcHl9vL+9lJe31BMZb2XMZ2juG5gEunRp7cobGZMCFcPCOHqAYnklLtYtq+SjYW1XNI7jkndYwgPat3BsbHMvl2+W/AK87GmXoM1xYnlaB/vTVqObdufOp3OLt94+lLg3EN//zewEAUmERHReNYRAAAgAElEQVQR8bel+yqwNxQzqXsMF/eKPaNjWZbF4LQIBqdFsKukjrc3lzB3aylzt5YytnM0l/WNp5ufW2V7vIYFu8p5dX0RxTVuhqRFcMPgpCZt4Z0RE4JzQPvqAGeMwSx8D2M/D5HROO55BKt3tr/LkvYlxbbtPADbtvOcTmfyyXZolYEpMTHR3yWIiIhIE6n3GAY4IpnVI4NO0cFNOkM7MRFG9MrA7TWU1XmocHnwGkN9kIPY0EDC/dQRrqCqgeG9ohjbL4uEsMA225muJXmrKqj422O4Pl9E8FnnEPPjX+KIifN3WdLKOZ3OVUc8fNa27Web+hytMjAVFRX5uwQRERFpAhUuDz/9YA8NHsMTk7tQXN+8lx6Oeg8fbS9j7tZSSmrddI4N4bK+8YztHN1sC8J+057SOu58bw+X9Y3nO0OSqK63qG6RM7ddZucWvP/6I5QVY02fifv8Sylp8ICuCeUE0tPTsW172CnuVuB0OtMOjS6lAQdPtoN+3SEiIiLNwuM1/GFxLsU1bu4f14n4M1yEtTEigwO4on8Cz17anTvPSQMDf16ex/dn7+TNTcVU13uavYZZG4oJD3JwVf+Edr/g7pkyXi/eD97A+/v7AXD87Hc4LrxcaylJc5oD3HTo7zcBs0+2g9qKi4iISLN4bnUBc7eU8uOzU5nY/czmLZ0uYwxf5lXz1uYS1uXXEB7k4KHzMumT1Dzttr8aXXJmJ3DdoKRmOUd7YSrK8L7wJ9j4JQwdhePGO7DCI/1dlrQhjWgr/iq+Bg+JQAHwEPA2YANZwD7gKtu2S050HgUmERERaXILdpXz5+V5TOkdxy3DUvxdDgC7Sur47aIcokMCeGJyFxzNMPrz+8W5fHGgmn9d1v2Eayt1ZKakCLPgHcyn86ChHmvGzVjjL9JonJyyllq4tlXOYRIREZG2a1tRLf/4PJ8BKeHMPOukDahaTLf4UG4cnMSTy/L4ZFd5k4967S3ztfme3v/EC9F2VGbfLsz8tzErF4PXYJ11DtbUq7E6dfZ3aSInpMAkIiIiTaa01s3vPs0lLiyQn41JJ9DRukYNxnWJ5p2tpbyytohRWdFN2r1u1voiQgIdTOsb32THbOuMMbDxC7wfvg2b10JIKNa5F2NNnIqVlOrv8kQaRYFJREREmoTHa/j94lyq6j08fmFnokNb32WGZVl8d2gy93+4j7c2F3PtwKaZZ7Tv0CKyV/ZPIFqjS5iGBsznCzHzZ8OBfRAbj3XFTVjjLsSK0DwlaVta308yERERaZPe21bKpsJa7jwnja5x/l049kT6JoUzpnMUb20q4YIesSSGB53xMe1Do0uXdvDRJVNVgVn0AeaTd6G8FDK6YM28C2vEWKzAM/8+i/iDApOIiIicsYKqev6ztpCh6RGc1zXa3+Wc1I2Dk/h8fxWvrCnk7lHpZ3SsfeUuluyt5Ip+8R1ydMl4vVBwAPPJO5ilH0O9C7LPwvHdu6HvIDVzkDZPgUlERETOiDGGf6woACxuG57aJi6QUyKDmdYnjjc2lTCldxw9E06/zfhr64sJCbS4rB2PLhmPB0oKoTAPczAPDuZhCvPhYB4U5kNDPQQGYo0cj3X+ZWrkIO2KApOIiIickU92V7Amr5pbh6WQHNl2bruanp3AR7vKeWH1QR49P+u0gl5OuYvFeyu4vF98q5yz1VimoR4qy6GyAspKMIW+IPRVOKK4ADxHLPobFAzJaZCcjpV9FiSlYQ0eiRXbfkOjdFxt91+2iIiI+F1ZrZvnVxfQNymMyb38szjt6QoPCuC6gUn8Y0U+y/ZXMjrr1G8ltDcUExzQ+kaXjNcDVZW+EFRRhqksPxSIfH9MRTlUln39XG3Ntw8SGgbJaViZXWHoKN/fk9J8QSkmDsvRdB0GRVozBSYRERE5bc+uKqDObbhjZGqzLATb3CZ1j+HdraX8+8tCRnSKJCig8SEgp8I3unRZ33hi/DS6ZKoqMB+8CcUHjw5FVRVgzLd3sBwQFQ1RMRAdi9W5B0TH+h5HxWBFx0BULCSl+h63wc9UpKkpMImIiMhp+Xx/JUv3VXLdoEQyYkL8Xc5pCXD42ow/tGA/c7eWckW/hEbv+9r6YoIc/htdMjm78f79USgtOhxwSO2E1bOfL/REx2BFHQpAUdG+rxGRGhkSOUUKTCIiInLKquo9PL2ygC6xIacUMlqjwWkRDE2P4LUNxUzsFtOo0aLcino+3VvBtD7+GV0yq5fifeEpCI/Acd/jWF17tXgNIh2FfsUgIiIip+zfXx6krM7NHWenEuho+7dtzTwrmTq3l1fXFTVqe3tDEYEOi8v7tezokvF68b71H7xPPw6ZXXH84kmFJZFmphEmEREROSXr8qv5cEc5l/WNP6N23K1JZkwIF/WM5YPtZVzcK46s2OPfYnigop5P9/hGl2JbcHTJ1FTjff5JWLcSa+wFWNd8Hyuo7XQlFGmrNMIkIiIijeZye/n75/mkRgZx7cBEf5fTpK4ZkEhYoIMXvzh4wu1e23hodKkF5y6Z/By8j/0UNn6Bdd1tWDf8UGFJpIUoMImIiEijvbquiPyqBn44MpWQwPZ1GREdGsiMAYl8kVfNFweqjrlNXmU9C3dXMLlnLLFhLTO6ZNatxPvoT6G6CsdPfoPj3IvVvU6kBbWvn3QiIiLSbLYX1zJ7SwkX9IhhYGqEv8tpFhf3iiU1MogXvjiIx/vtttz2huJDc5eav9GFMQbvuzbevz0CSWm++Uq9spv9vCJyNAUmEREROSm31/C3z/KJCQ3kpiHJ/i6n2QQFOPjOWcnsL6/nwx1lR73mG10q58KescQ18+iScdVhnvk95u3/YA0fh+Nnv8NKSGrWc4rIsSkwiYiIyEm9uamYPWUubh+eQmRwgL/LaVZnZ0SSnRzGf9cVUV3vOfz8a4dGl5q7jbopzMf7u59hvliONX0m1s0/wQppm+tcibQHCkwiIiJyQjnlLmatL2Z0VhQjM6P8XU6zsyyL7w5NodLl4bUNxQDkV9bzye5yLuwRS3wzji6ZzWvxPnoPlBTi+PGDOC68XPOVRPxMbcVFRETkuLzG8LfP8wkNtLh1WIq/y2kx3eNDOa9bNHO3lnJRz1he21hMgNV86y4ZYzAfz8W89gKkZuD44c+xktOb5VwicmoUmEREROS43t9WxubCWu48J63FusK1FtcPSmLp3kr++lkemwtrmdwrjoTwpm/lbRrqMa/8A7N8AQw+G8f37sIKDW/y84jI6elYP/lERESk0QqrG3h5TSGD0yI4r2u0v8tpcQnhQVzRL4FX1xcR5LC4ohlGl0xpMd5/Pga7t2FNvQZrygwsh2ZMiLQmCkwiIiLyLV8tUAuGH4xI6bDzaC7rF88nu8s5JzOqyUeXzI7NvrDkcuH4wc+xhpzdpMcXkaahwCQiIiKHldW6eXdbKe9vL6PS5eHWYSmkRAb7uyy/CQ108M9p3WjquOj9dB7mv89AQhKOnzyC1Smric8gIk1FgUlERETYV+5i9uYSFu2uwO01DM+I5LI+8fRP0VwaRxOOrhl3A2bW85iF70H/IThuuRcrIrLJji8iTU+BSUREpIMyxrCuoIbZm0tYfaCa4ACLSd1jmNonnk7RHXdUqbmYijK8T/8Otm/CuvByrCtuxHK07zWtRNoDBSYREZEOpsFjWLK3gtlbSthd6iI2NIDrBiZyUc9YokN1adAczN4deP/xKFRWYN18D46R4/1dkog0kn4qioiIdBBVLg/zdpTxztZSSmrdZMYE86OzUxnXJZrgAHVmay7ezxZiXv4bRMXguO9xrM7d/V2SiJwCBSYREZF2rqCqnjlbSvloZxl1bsOg1HB+dHYqQ9IiOmz3u5ZgvB7MGy9jPnwLevXH8f37sKJj/V2WiJwiBSYREZF2an+5i1fXFbF8fyUOC8Z2jubSvvF0jQv1d2ntnqmswPvcE7DpS6zzLsZy3owVqMsukbZI/3JFRETamUqXh/+tL+K9baWEBjq4vG88l/SOa/J1hORopqgAs3YlZu3nsG0DYGHdeAeOsRf4uzQROQMKTCIiIu2Ex2v4YHsZr64rpLrBy/ndY7luUCIxauTQLIzXC3u2Y9auwKxdAbl7fS+kZmBNmoZ19nlYGV38WqOInDn9BBUREWkHvsyr5vnVBewvr2dgSjjfG5pMF9161+SMywWb1/hC0rqVUFEGDgf06Id11XexBo3ASkn3d5ki0oQUmERERNqw3Ip6XvyigJW51aRGBvHAuE6MzIhUM4cmZMpLvx5F2rwWGuohLBwreygMHI41YChWRJS/yxSRZqLAJCIi0gZV1XuYtb6Id7eWEhzg4KYhSUztHUeQ2oM3CeNyYdZ8hlm+ADatBeOFhGSscRdiDRwOvfpjBWpOmEhHoMAkIiLShni8hg93lPHfdUVUujxM6h7D9YOSiA3T/9LPlPF6YfsmzPIFmNVLoa4W4pOwLp6ONWwMdOqskTuRDkg/XUVERNqItfnVPL/6IHvLXPRPDuPmoSl0i9c8pTNlCg74QtJnC6H4IISEYQ0bhXXOBOjZH8uhUTuRjkyBSUREpJXLq6znxS8O8nlOFckRQdw3Np1zMqM02nEGTHUVZuVizGefwM4tYDmg7yCsy67HGnIOVkiIv0sUkVaiUYHJ6XReBPwZCACes237d994fRzwFDAQuNq27dePeM0DrD/0cJ9t29OaonAREZH2rt7j5b9ri5i7tYRAh4MbBiUxrW8cwZqndFqMMbDhC7xL58PaFeB2Q1om1pU3YY08Fysuwd8likgrdNLA5HQ6A4C/A+cDOcBKp9M5x7btTUdstg/4DvDTYxyi1rbtwU1Qq4iISIfyzMoCPtpZzsRuMVw/OIl4zVM6bcbjwcz6F+aT9yAyGmv8ZN8td1ndNFInIifUmJ+8I4Adtm3vAnA6nf8DLgUOBybbtvcces3bDDWKiIh0OIv3VPDRznKm90/ghsFJ/i6nTTOuOrzP/gHWrcS64HKsy2/AClT4FJHGacxPi07A/iMe5wAjT+EcoU6ncxXgBn5n2/bbp7CviIhIh1NQVc8/VuTTOzGUawYm+rucNs2UleD92yOwbxfWtbfhOO9if5ckIm1MY26CPtY4tTmFc2TZtj0MuBZ4yul0dv/mBk6n81an07nqULASERHpsNxewxNLDwBwz+h0Ah26Xex0mdx9eB+7F/JzcNzxC4UlETktjRlhygEyj3icARxo7Als2z5w6Osup9O5EBgC7PzGNs8Czx56eCphTEREpF15dV0RW4vq+OnodFIig/1dTptlNq/F+8/fQXAwjnsfxercw98liUgb1ZjAtBLo6XQ6uwK5wNX4RotOyul0xgE1tm27nE5nIjAa+P3pFisiItKerc2v5o2NxUzqHsPYLtH+LqfN8i5bgHn5b5CSjuPHD2ElaA6YiJw+y5iTD+g4nc6L8bUNDwBesG37t06n89fAKtu25zidzuHAW0AcUAfk27bd3+l0jgKeAbz4bv97yrbt509yOnPgQKMHsERERNqF8jo3d767m4jgAJ6Y3IXQQLUOP1XGGMzc/2Hmvgp9B+G47X6s8Ah/lyUizSQ9PR2OPX0IAKfTeTdwM7472NYDM23brjvV8zQqMLUwBSYREelQvMbwyMIc1uXX8IeLOtM1LtTfJbU5xt2AefnvmOULsEZNxLrhB1iBQf4uS0Sa0YkCk9Pp7AQsAfrZtl3rdDpt4D3btl861fOop6aIiIifvbO1lNUHqrl1WIrC0mkwNVW++Upb1mFdei3WJTO0tpKIgC/rhDmdzgYgnFPow3AkjfeLiIj40c6SOv795UFGZkRyca9Yf5fT5pjig3gfvx+2b8L67t04plytsCQi2LadC/wR2AfkAeW2bX94Osdqlbfk1dfX+7sGERGRZuc1kFPuwgtkxoQQoOv8U9Kwcwtlv70X43IRe9+jBA8c5u+SRKQFBQcH43Q6Vx/x1LOHum9/1XzuDWAGUAa8Brxu2/Z/TvU8rfKWvKKiIn+XICIi0uz+vPwAC3dX8JuJWUS6w/1dTqtm3G4ozIe8fZi8HDiwH7P2c4iMxnHf76hIzwJdP4h0KOnp6Rxa7/VYJgG7bdsuBHA6nW8Co4D2EZhERETau4W7y1mwq4IZAxLITlFY+oppaICCXEzefl8oytsHeTlQcAA87q83TEiG7LNwXPN9rJg4/xUsIq3VPuBsp9MZDtQCE4FVp3MgBSYREZEWlldZzz9XFNAvKYwZ2Yn+LscvTF0N5B0KRvn7D48aUZgPxuvbyHJAUgqkZWINGg5pWVhpGZCagRUa5t83ICKtmm3bnzudzteBLwA38CXw7Okcq1XOYVJbcRERaa8aPIb7P9xLflU9T13claSI9tv62hgDlWVHBKMc39e8HCg94va5gABITof0TKy0TF9ASs+ElE5YQcH+ewMi0qqdbB2mpqIRJhERkRb0n7WF7Cip4/5xndpdWDLVlZhVS2HP9q+DUU3V1xuEhPpGh3oPgLQMrNQMSMuEpFSsQF2SiEjrpJ9OIiIiLeSLA1W8vbmEyT1jOSczyt/lNAnjboANq/Eu/wTWrvTNM4qK8QWiYWN8X9MyIS0D4hLV8ltE2hwFJhERkRZQWuvmqeV5dI4JYeZZyf4u54wYY2DfTsyyBZgVn0JVBUTFYJ13MdY5EyCzq4KRiLQbCkwiIiLNrKbBw28X5VDb4OWRiemEBLbNdeNNaTHm84WY5Z/AgX0QGIg1aKQvJPUfotvqRKRd0k82ERGRZlTb4OXXn+Swq6SO+8Z1Iis2xN8lnRLjcmG+XO4LSZvX+jrYde+Ddf0PsIaNwYqI9HeJIiLNSoFJRESkmbjcXh5ZlMPWolp+OiadkRltZ96SqSzHvPUKZuViqKuF+CSsi6djnTMBKyXd3+WJiLQYBSYREZFmUO/x8uiiHDYW1HD3qDRGZ0X7u6RGM+tX433pz1BThTViPNaoCdCzP5ajbd5KKCJyJhSYREREmliDx/D4p7msya/hR2enMr5rjL9LahRT78K8/hLmk3chPQvHXQ9jZXb1d1kiIn6lwCQiItKE3F7DH5bksupANbePSGFS91h/l9QoZt8uvM89AXn7sSZOxbryJi0aKyKCApOIiEiT8XgNTy49wOc5VdwyLJmLesb5u6STMl4vZv5szNuvQEQUjjv/H1b2Wf4uS0Sk1VBgEhERaQIer+Evn+WxdF8l3xmSxJTe8f4u6aRMSRHeF5+CLetg8Nk4brwDK6rtzLUSEWkJCkwiIiJnyGsM/1iRz8LdFVw3KJHL+yX4u6STMquX4n357+BuwLrxDqwx52uxWRGRY1BgEhEROQPGGJ5dWcBHO8txZifgzE70d0knZOpqMK/+C7PsY+jSE8fN96hNuIjICSgwiYiInCZjDM9/cZD3t5dxed94rh3YysPSzi14n38Sig5iXezEmno1VqAuBURETkQ/JUVERE6DMYaX1xQyd0spU3vHcdOQpFZ7S5vxeDDvzsK8a0NcIo57H8Xq2c/fZYmItAkKTCIiIqfhf+uLeHNTCRf1jOV7Q5Nbb1g6mOcbVdq1Fevsc7Gu+T5WeIS/yxIRaTMUmERERE7R6xuK+d/6YiZ2i+H7w1NaZVgyxmAWz8PYL0KAA+uWn+IYMc7fZYmItDkKTCIiIqdg9uYSXllbyPgu0fxwZCqO1hiWig/i/fdfYfNa6DMQx3fuxEpI8ndZIiJtkgKTiIhII+RV1vPB9jLe3lzC6Kwo7jwnjQBH6wpLxhjMp/Mwr70IgHX9D7DGXdgqR8BERNoKBSYREZHjqHR5WLK3goW7K9hSVIsFnNslmh+1xrB05KhS30G+RWgTU/xdlohIm6fAJCIicoQGj2H1gSoW7i5nZW41bq8hMyaYGwYnMb5LNEkRQf4u8SjGGMyiDzCvvwRoVElEpKkpMImISIdnjGFbcR2f7Cpnyb5KKl0eYkIDmNwrlvO6xtAtLqRVBhBTVOAbVdqyzjeqdNOPsBKS/V2WiEi7osAkIiIdVkFVPQt3V7BwdzkHKhsIDrAYmRHJuV1jGJIW0epuu/uK8Xp9c5W+GlW64QdYYzWqJCLSHBSYRESkw2nwGH6/JJcVOVUAZKeEc2X/BEZlRREeFODn6k7MFObjfflvvlGlfoN9c5U0qiQi0mwUmEREpMN5ec1BVuRU4cxO4IIesa1uXtKx+EaVDs1VsiysG36INfYCjSqJiDQzBSYREelQVuRUMmdLKZf0juO6QW1jbSJTmO+bq7R1/aFRpR9pXSURkRaiwCQiIh1GYXUDf1meR7e4EGYOaf2Bw3i9vg54b7ykUSURET9RYBIRkQ7B4zU8sfQADV64d0wnggIc/i7phEx5Kd4Xn4KNX2pUSUTEjxSYRESkQ3h1XRGbC2v5yag00qOD/V3OCZl1K/G+9Beoq8W67jas8ZM1qiQi4icKTCIi0u6tyavm9Y3FTOoew/iuMf4u57hMQz3m9ZcwC96BjC44fvpbrPQsf5clItKhKTCJiEi7Vlrr5sllB8iICebWYSn+Lue4TO5evP/6I+TuxZo0DeuKG7GCWvdImIhIR6DAJCIi7ZbHa3hy2QFqG7w8MjGLkMDWN2/JGIP55F3May9CWDiOOx/Cyh7q77JEROQQBSYREWm33thUzLr8Gu4YmUpWbIi/y/kWU1num6u0biVkD8Ux88dY0XH+LktERI6gwCQiIu3SxoM1vLquiHGdo5nUvfXNWzIbv/R1wauuwrr6VqwJl6ixg4hIK6TAJCIi7U6Fy8MTSw+QEhnE7SNTWlUQMQ0NmLdexsyfDWmZOO76f1gZXf1dloiIHIcCk4iItCvGGP6y/ADldR5+f2FnwoMC/F3SYSZvv6+xw/7dWOddjDV9JlZw67tVUEREvqbAJCIi7cqcLaWszK3mlmHJdI8P9Xc5AJiaal9jh/dsCA7FcccvsQaN8HdZIiLSCApMIiLSbmwvruXlNQcZmRHJJb383zzBlJdiPpqDWfQ+1NbAoBE4rv8BVmy8v0sTEZFGUmASEZF2obrewx+WHCAuNJAfnZ3m13lLpjAfM+9NzNKPwePGGjoa66IrsTp391tNIiJyehSYRESkzTPG8PfP8ymsbuCx8zsTFeKfeUsmZzfm/TcwK5dAgAPrnAlYF16BlZLul3pEROTMKTCJiEibN29HGUv3VXLj4CT6JIW1+PnN9k14338d1q+CkDCs8y/FOn8aVmxCi9ciIiJNS4FJRETatEW7y3lu1UGGpEVweb+WmxtkjIH1q3xBacdmiIzGuvQ6rPMuwYqIbLE6RESkeSkwiYhIm1TT4OGZlQUs3F1Bn8Qw7h6VhqMF5i0Zjwezagnm/dchdy/EJ/kWnh1zPlaIWoSLiLQ3CkwiItLmbC2q5cmlBzhY3cA1AxK5KjuBAEfzhiVTXYX57BPMR3OgqADSMrFm3oU1YhxWoP53KiLSXuknvIiItBker+GNTcW8uq6IxPBAHp2URd/k8GY7nzEGdmzGfDoPs3opNNRDt944ZnwPBo7Acjia7dwiInJmnE5nLPAckA0Y4Lu2bS8/1eMoMImISJtQWN3An5YdYOPBWsZ2juK2EalEBjdPNzxTXYlZ/gnm03mQtx9Cw7BGT8QaewFWllqDi4i0EX8GPrBte7rT6QwGTus3bJYxpmnLOnPmwIED/q5BRERakWX7Kvj75/m4vfD94Smc1zW6yddZMsbA9k2YxfMwq5aCuwG69sIadyHWsDFYoS3ffU9ERI4vPT0d4Jj/M3A6ndHAWqCbbdtnFHg0wiQiIq1WndvLc6sKmL+znJ4JodwzOp20qOAmPYepqvh6NCk/B8LCfQ0cxl6AldWtSc8lIiItphtQCLzodDoHAauBO23brj7VA7XKwJSY+P/Zu+84uat6/+Ov72zvPdlsSW8khECAJAQICU1AxAIcEEGwYcEGVxG8gIii4PXyAxXvFfHKVbjgERRBmggEkBKSUFJJL1vStvcyM+f3x3dClpCEzWZnZ3b3/Xw89rFTvjPzmZNvvjvvOd9zTmGsSxARkRjrDDnamru4bF423zgtkfy0xP1/jdgHrqOdrneX0/HCU3S8+gIEu0maPJ20Cz5L6omnqTdJRGSQMMYs7XH1HmvtPZHLicAs4BvW2sXGmLuA64AbD/U14jIw1dTUxLoEERGJkbBzPPZuHX98ezc5KYlcfeIockZmUHvI3wnu5Vqb/dPt1q/GrV8F2zZCKARpGX5P0vwzCZeNoxVobWmFlsN4MRERGRAlJSVYa487wN2VQKW1dnHk+sP4gemQxWVgEhGRocs55/cedYdp6wrR2h2mvTtMa3eItq4w/9raxNs72jihPJOvzRlFdsqhT+zg6nbj1q+G9av839Xb/DsSE2HsJLwzP4E3aTpMnqG1k0REhiBr7Q5jTIUxZoq1di1wGrC6L8+lwCQiIn3mnGPVrnZq2rojoccPQW3d4cjP3sutXWHau/2AFD7I8NuUBI+r5hRzxoScXk3s4EIh2FmF27Am0ou0Cmp3+XempsGEqf5aSZOm+WEpWQFJRGSY+AbwQGSGvE3A5/ryJJolT0RE+uzJdfX8ZsnO992W4EF6cgIZSQHS9/wkJ+y9nOTfl5YUION9t/vXs1MSSEn84PpGLtgNu7bD9gpcdUXk9zbYWQXBoL9RVg5MmoY3aZrfg1Q2Di8hOlOPi4hIbB1slrz+pB4mERHpk7buEA8tr2FaURpfnzvqvdCTnOAd1pTfrrsLV1nVIxT5v9lV7Y87AvA8KBwJo8rxjjwWSsrxxk+BkaX9Pt24iIgMbwpMIiLSJ4+uqaOxM8QNs0ZQmt23qb5dsBsqt+C2rIct63FbNkB1Bbiwv4EXgKJiPxAdPQdKRuOVlMPIMo09EhGRAaHAJCIih6y+Pcjf1tRx4ugsJhf2bgpuFw7B9qoe4Wg9VG7eezpdZpY/xmjmHCjdE4xK8ZL6d90lERGRQ6R8DokAACAASURBVKHAJDKIdATDNLQHqe8I0tAe8n/3vNweJOTgS8eO4IgR6bEuV4awP62ooTvkuHRm0X7vd85Bzc73h6Otm6Cz3d8gJQ3GTMA79WN+SBo7EQpH6nQ6ERGJOwpMInHqjcpmXtjcRH27H4rq20N0BMMf2M4DslMTyEtNJDctkeqmLm56voLvnlTC7LKsgS9chryqpi6e2dDARybmUhI5Fc811r8XjPaEJFqa/QckJkL5eLx5CyPhaBIUl+IFNBmDiIjEv14FJmPMWcBdQAJwr7X2tn3unw/cCRwFXGytfbjHfZcDN0Su/tha+7/9UbjIUNXWHeLepbt4blMjBemJlGQlMyk/jdy0BHJTE8lLSyQ3de/l7JQEEgJ7v5Vv7AhyywuV/PSlKq6aU8zpE3Jj+G5kKLr/nd0kJ3hcPKOQ8JKXcY/8795pvL2AP95o5hw/HI2bBKVj8BKTYlu0iIhIH33otOLGmARgHXAG/oq5S4BPW2tX99hmLJANfAd4bE9gMsbkA0uB4wAHLAOOtdbWH+QlNa24DFsrd7Zx12vV1LQFOX9aARfNKCQp4dBPUWrvDnPby1W8vb2Vy2YWcf70fJ3qJP1ibU071z6zlc9MzeSClX/F/etZPxjNno83dhKMHo+XkhrrMkVEZBiIp2nFZwMbrLWbAIwxDwEfp8dKudbaLZH79j1f6CPAs9bausj9zwJnAQ8eduUiQ0hXKMz9b+/msXfrKc5K4rYzxzCllwPp9yctKcANp5Txi9e388d3dlPfEeQLx44goNAkh8E5x/++tYvp3Tv55F/vwu2qxjv7ArzzLsFL1BneIiIyNPXmL1wpUNHjeiUwp5fPv7/HlvbysSLDwqa6Du54tZqKxi7OnpTLFbNGkLqfRTsPVVKCx9XzRpGTmsDj79bT2BHkWyeU9KnHSgRgaWUL5W89xxc2PUEgM5PAt3+IN+3oWJclIiISVb0JTPv7dHXw8/gO8bHGmCuBKwGstb18apHBLRR2PLK6loeW15CdmsgPFpYxqySzX18j4Hl8YdYI8lIT+cPbu2nqrOC6+aWkJ2mwvRyaUHMTCb/9GVduX46bPovA57+Nl63xcSIiMvT1JjBVAuU9rpcBvR1kVAks2Oexi/bdyFp7D3BP5Gpvw5jIoFXd1MWdr1WztqaDk8dk8eXji8lKiU6I8TyP86cXkJuawK8W7+CGf1Zw08IyclMH/hSqjmCYisZOtjV0sq2xi20NnWQkB5hdlsVxpRkKcnHKrV9Nx3//jOnNDWw9/RLGXWjwAoffCyoiIjIY9OYT0xJgkjFmHFAFXAxc0svnfwb4iTEmL3L9TOD6Q65SZIhwzvHU+gbue3MXSQke/3ZiCfPHZg/Ia582IZfslER+9q8qrvvHVm5eWE5xVnQWBO0OOaqa9oaibY2dbG3oZGdL93vfiCQFPMpyktlYF+Tlrc0kBuCokRnMLc9idlkmeWkaExNrLhzCPfkw4ccepCktjz8tuJpvmfmaQERERIaVD50lD8AYcw7+tOEJwP9Ya281xtwCLLXWPmaMOR74K5AHdAA7rLXTI4/9PPD9yFPdaq39/Ye8nGbJkyGptq2bX7y+g7e3t3LMqAy+MbeYgvSBn2r53d3t/GhRBUkBj5sWljM+v+8zmoXCjp0t3WyN9BptjYSj6qYuQpFDS8CDkqxkxuSmMDo3hTE5/u/izCQSAh6hsGNtTTuLK1t4vaKZHS3deMCUwjTmlGcytyzrvbV+ZOC4hlrC994Ba1dQOWUO3yv6KDecNZkjR2pBZBERiQ8DNUterwLTAFNgkiHnlW1N/HrxDrpDjs/NGsFZk3Jj+i39tsZObn6+gvbuMN8/pZQZIzMOun1bd4iqpq73/VQ3+7+7QnuPIcWZSYzOTWF0ToofkHKSKc1OJimhd6dvOefY2tDJ65UtLK5oZlN9JwCjc5KZU5bF3PIsJuSnHHbb1bZ1886ONpbvaGX5zjYK0xO55bTR/TLZxlDgli8h/Pu7oKuTzgu/xBd3jeGIonRuXFj+4Q8WEREZIApMIkOAc44/rajlwRU1TCpI5Zp5JXHTW7K7tZubn69gR0s315w4ijllWexs6aaqqfO9MFTV1EV1Uxf1HaH3HhfwYERGEqXZyZRlJ/u9RrkplGWnkJbUv4FjV0s3iyubeb2yhdW72gg7KExPZE55FnPLMpk+Iv19i/YeSEtniBU723gnEpCqmroAyEpJYGphGkurWphbnsW1J5cM26nXXTgMzY24p/+C++ffoGwsgSuv5b7tyfxtTR13njOWsXlaX0lEROKHApPIINcVCvPL13bw0tYmTh2fzddmF/e6p2WgNHeG+NGiStbVtBPwoEdnEdkpCZRk+T1EpdnJlER+j8pMisn7aOoIsqSqhdcrW3h7eytdIUdWcoDjSjOZW57FMaMySIn0EHUGw6ze3c7yHa28s6ONTXUdOCA10WP6iHSOKk7nqJEZjM1LIeB5PLqmlt+/uZuLZxTw6aOKBvy9RZtzDlqaoK4G6nfj6mv9y3U1uPrd/uWGOggFAfAWfhTvws+xu9Pjq49vYv7YbL51wqgYvwsREZH3U2ASGcQa2oP85KUq1ta0c9nRRZw/LT9uB8p3BsP8eWUtDijJSqI0O4XS7OSozdrXHzqCYd7a3srrFc0srWqhpStMcoLHzOIM2rtDvFvTQTDsSAzA5II0ZhZncFRxOpMK0va7DpVzjl+8voPnNzXy3ZNKOGnMwEzE0d9cZwdsWY/bsAZ2VOHqa6C+Buprobvr/RsnJEJeAeQX4uUWQr7/442egDdhKgB3vlrNK9ua+fXHxlOUMfDj7URERA5GgUlkkNra0MmPF1XQ0BHi6nmjmDd6cH74HiyCYceqXW0srmhmaXUrGUkBjirOYGZxOtNGpPd6XFJ3KMwN/6xgU30HPz1jDBML+vf0s+6Q442qZo4tyeyXsVLOOajZidu0FjauwW1cC5WbIRz2N8gvhPwivLxCyIuEochv8gohK+egU4Nvru/g6ie38Mlp+Vx+zIjDrldERKS/KTCJDEJvVrfws5erSU30+PcFZUwqSIt1SXIIGtqDfOfpLYQd/PzsseT309TmLV0hbn+piuU725hSmMaNC8oOuQfPdXfB1o24je/iNq6BTWuhsd6/MyUVxk3GGz8Vb+JUGD8FLyPrsGr+4fMVrKtt5zfnTSAzjnsbRURk+FJgEhlknlhbz73LdjImN4V/P6VMpzANUpvrO/jeM1sZnZvCraePfm9cVF/tbOnilhcq2dHSxdmT83hqXQOlWcncfFr5+wKZP86oGRrroKEO11gPDbX+5W0bYevG98YYUVTsnzY3fqr/u3QMXkL/hZrlO1q58bkKrjimiE9OK+i35xUREelPCkwig0Qo7Lh32U6eXNfA7LJMrplX0u+zxcnAeq2imdtequKUsdlcPW9Un8efra1p59YXKwl0d3L99GQmey1s27adV5ZvZWSwhbnZXaS2NvoTLjTVQzD4wSdJy/AD0YQpeBOOgAlT8LLzPrhdPwk7x3ef3kpjR5Bfnzee5DibqERERGSPgQpM/XO+icgw1doV4uf/qubN7a184oh8Pnt0Ua+muZb4dkJ5Fp+ZWcgD79QwJjeF86cfvJfFtbVC7S6o3YWr3Q11u6jdVoVXtZ1fdDaQ1dUCz0EYKAMuAloS06itzaFgVBFpU46EnHzIzcfLyYPcfP96Th5ecspAvOX3vLK1mQ11HXzrhFEKSyIiIigwifTZzpYufryokqqmLq6aU8yZE3NjXZL0owunF7CtoZM/vr2bssjCuXu4dasIP/so1OyE2t3Q3vq+x4YSkmhLySOUlU/qUUfgFY2EwpF4+UV+GMrNp7HNcfNzFXSEwty4oIwjitIH+i1+QHfIcf87uxmTm8IpYzVZiYiICOiUPJE+eXd3Oz95sZKgc1x3cilHFWfEuiSJgs5gmO8/u43Kpi5uP3M0Y3JTcIuexP3pXsjKgTET/RBUMAKvcAThvCL+UAGPVoQ4cYy/dtHBxkDtbOniB89XUNcW5Lr5pcwqyRzAd/d+VU1dPLh8Ny9vbeamBWUcWxq7WkRERHpDY5hEYsg5R3fY0dEdpiPo6AiGaQ+G6QiGqWjs5L43d1OQnsiNC8soyx7YU6ZkYNW2dfOdp7eS6kL8v8anSXrtOTjqeAJfuAYvfW9Qbuv2T89cVt3K+dPyufToIgK9GPvU0B7k5hcqqGjs5Op5A78G1Lqadv6yupbXK1pISvA4d0oenz26KG7XDRMREdlDgUkkyhrag/xu2S5q2rrpDIVp7/aD0Z6f8EH+a0wfkcZ188vI1nTLw8KmzdV03v1TJjduxZ19IQmf+Mz71jCqaevmRy9Usq2xk6/OPvTTM1u7Qvx4USVrdrfz1dnFfGRSdE/vdM7x1vZWHlldx8qdbWQkBzhnUh7nTs0jN1VnaouIyOCgwCQSZb98fTuLNjcytSid1ASP1KQAqYkB0hIDpER+pyZ5pCYG3veTnhRgTG6KJncYJtymtYT/66eEWlu5Y9KFZJxwMl+fU/xeD8ymug5+tKiSjmCY751cytGj+nZ6ZmcwzM9ermJpdSuXHV3E+dPy+72XJxR2/GtrE39dU8fm+k4K0hL5+BH5nDExh/QkhX8RERlcNEueSBRtqe/guY2NnDc1j88fOzLW5UicCr/yHO7+uyG3gKTv/4zy2kzsylrG5qbwsan5LKls4eevVJGZnMBtZ45hTG7fT89MSQxw/Sll3PXadv749m6aO0NccUz/nBrXGQzz7MYG/ramjl2tQcqyk/nm3GLmj80hKUHBX0RE5GAUmGRYuu+t3WQkB7jwyMJYlyJxyAWDuId/j3vucThiJoErv4uXmc2nSx3bGjv5nzd3UdXUxTMbGhiXl8oNC8retwhtXyUGPK6eN4qs5ACPrqmjpSvE12YX97k3s6kzxJNr6/n7unqaO0NMLUzji8eN5PjSzF6NrxIREREFJhmG3qxu4a3trXx+1giyNAZJ9uGamwj/5nZYuwLv9I/jXXAFXoK/nwQ8j2+fUML1z27lqfUNzCnL5JoTS0g9yEx4hyrgeXzpuJFkpiTwpxW1tHaF+MzMIhzgnL+wrP87chn/d9jtvT/sYElVC89uaKAz5Di+NINPTStg2ojYT10uIiIy2GgMkwwrobDj6qe20BEMc/e540jSwpzSg6vYTPjuW6GxHu+yqwjMO3W/29W3B3l7eyvzx2ZHdSzb4+/Wce+yXX16bIIH88dm88lpBYd1qqCIiEi80hgmkSh4YXMjWxs6+e5JJQpL8j7hJS/j7rsL0rMIXHsb3rhJB9w2Ly2RheNzol7Tx6bmM7kwjZ0t3QQ88Dy/BypAj8seeJ6HBwQit3keFGcmUZCeFPUaRUREhjoFJhk2OoJhHninhskFqZw4OivW5UiccOEQ7tH7cU89AhOmEvjq9Xg5ebEu6z1TCtOYUpgW6zJERESGLQUmGTb+tqaOuvYg155UokU5hzEXDsOOStyGNbDxXdz6VbB7B97JZ+J9+st4SeqVERERkb0UmGRYqG8P8pfVtZxQnskRGvg+rLjOTtiyDrdhDW7ju7DxXWhr8e/MzIYJU/HOu4TA3AUxrVNERETikwKTDAsPLq+hO+T47NEjYl2KRJlrqIUNa/YGpIpNEAr5d44qxzt2nh+SJhwBI9XbKCIiIgenwCRD3rbGTp7d2MA5k/MoyU6OdTnSR667CxrrIz91uPcu10cu10FDHTQ1+A9IToaxk/HO/CTexCNg/BS8zOzYvgkREREZdBSYZMj73zd3kZYY4KIjC2JdiuzDOQftbfsNQR+4vuc0up68AGTnQk4u5OTjjZ4ApaP93qPycXiJGo8kIiIih0eBSYa05TtaWVrdyuVHF5Gdqt09XrjKLbg3XsS98TLU7medocQkyMmD3HwYVYY3dQbk5EN2Ll5uvn9fTj5kZeMFtPiwiIiIRI8+QcqQFXaO37+5i6L0RM6dGj/TRA9XrnYX7o2XcItfhKqtEAjAtGPwFp7j9w7tCUg5eZCWobFFIiIiEhcUmGTIenFzE5vqO7lm3iiStUhtTLjmJtyyV/yQtGG1f+OEqXiXfBnvuJPwsqK/+KuIiIjI4VBgkiGpMxjm/nd2MyE/lZPHaqD/QHKdHbi3F+PeeAlWvenPUDeqHO8Tl+LNno9XVBzrEkVERER6TYFJhqTH19ZT0xbk2/NGEdCpXVHngkFY8w5u8SLc24uhswPyCvFOPw9vzgIoG6tT7ERERGRQUmCSIaexI8jDK2uZXZbJjJEZsS5nyHLOwcZ3/ckblr4CzY2QnuH3Is1ZAJOm4QV0KqSIiIgMbgpMMuQ8tKKGzlCYy48uinUpQ5ar3UX4v26DrRsgKRlv5my8OafA9Fl4SZrKW0RERIYOBSYZUiqbOnlmfQMfmZhLWU5KrMsZktzalYT/+zYIBfE++3W840/CS02PdVkiIiIiH2CMSQCWAlXW2nP78hwKTDKk/OGt3SQnBLj4qMJYlzLkOOdwi57E/eleKComcNW/4xWXxbosERERkYP5FrAG6PMsYBpgIEPGql1tLK5s4fzp+eRqkdp+5bq7cX/4Fe7/fgPTjiFw/c8VlkRERCSuGWPKgI8C9x7O8+hTpQwJexapLUhL5Lyp+bEuZ0hxDXX+KXgb38U7x+B9/NN4gYRYlyUiIiLyYe4ErgWyDudJ4jIwFRbqdCo5NC1dIW44J4uRGUlkpejDfH/pXreKhtuvh9YWcr77Y1LnnRrrkkRERETeY4xZ2uPqPdbaeyK3nwvsstYuM8YsOJzX8Jxzh/P4aHDV1dWxrkEGka5QmKse30RGcgL/edZYEgJa76c/hF95Dnf/3ZBbQOCq7+OVjYt1SSIiIiLvKSkpAdjvBz9jzE+By4AgkIo/hukv1tpLD/V1FJhk0Pvr6lrue2s3t5xWzsxirbt0uFwwiHv497jnHoepRxH48rV4mX0eJykiIiISFQcLTD1Fepi+o1nyZFhq7Ajy51W1HFuSobDUD1xzE+Hf3A5rV+Cdfh7eBZ/DS9ApjiIiIjJ8qYdJBq2lVS38evEOGjuD3HH2OMbkat2lw+EqNhO++1ZorMe77CoCGq8kIiIicay3PUyHSz1MMui0dIb43Zs7eX5TE6Nzkrn+lDEKS4fBOYd74yXcH34F6ZkErr0Nb9ykWJclIiIiEhcUmGRQeaOymV+/sZPGjiDmyALMkQUkJWg5sb5w7W24V5/HLXoSdlTChKkEvno9Xk5erEsTERERiRsKTDIoNHeGuHfpThZtaWJsbgo3LihjQn5qrMsalFzVVtwLT+BeXwSdHTBuMt7nvoU3ez5eYlKsyxMRERGJKwpMEvder2jmv97YQXNniItnFHDB9EKSEjR1+KFwwSDurddxi56AdasgMckPSAvPwRur0+9EREREDkSBSeJWU0eQ3y7dxUtbmxiXl8IPFpYzXr1Kh8Q11OJeegb30j+gsQ4KR+JdcAXeiadrqnARERGRXlBgkrj0yrYmfrNkJ61dIS45qpDzpxeQqAVpe8U5B+tW+afdvf06hMMwfRaBz14FR87CC2iacBEREZHeUmCSuNLQEeSeJTt5ZVszE/JTuOXUcsbmqVepN1xHO+71Rf4kDlVbIT0T77SP4Z1yNt6IUbEuT0RERGRQUmCSuLGsqoU7X9tOW3eYS2cW8slp6lXqDbejErfoKdyrz0F7G4wej3f5N/COn4+XounWRURERA6HApPEhbe3t/KTl6ooz0nm1nkljNa6SgflwiFYvpTwC0/A6rchIRHvuBPxFn4Uxk/B8xQ0RURERPqDApPE3JrdbfzkxUrKspP50WmjyUrRGJsDcc1NuH89i3vxKajdBbkFeJ+4FO/kM/CytX6SiIiISH9TYJKY2lTXwY9eqKQgPZEfnlqusHQAbst63PNP4Ja8DMFumDKDwIWfh6Pn4CWozURERESiRYFJYqayqZObn68gLSnALaeNJjdNu2NPrrUFt3wJ7oUnYPM6SEnFO+kMvAXn4JWOjnV5IiIiIsOCPqFKTOxq6eam5yrAg1tOG01RRlKsS4oZFwrBrmpc5Rao2Oz/rtoCdTX+BsWleBdfiXfCQrz0jBhWKiIiIjL8KDDJgKtvD3LT89voCIa59fTRlGYnx7qkAeOam6ByM65qC1Rs8cNR9Tb/NDuAhAQoLsObNB3KxuKNmwKTp2sSBxEREZEYUWCSAdXcGeIHz1VQ3x7kh6eOZtwwWGPJVWzG/eNR3Jp3oLFu7x3ZuX4oOvWjUDYOr2ysH5aShm9vm4iIiEi8UWCSAdPWHeKHL1RQ1dzFjQvKmFqUFuuSosY5B2tXEH76EVj1FqSk4R0zB8ojwahsrGa1ExERERkEFJhkQHSFwvzkxSo21nVw3cmlHD1qaI7FceEQvLXYD0pb1kNWjj/t94Jz8DIyY12eiIiIiBwiBSaJumDY8bOXq1m5s41vzxvFnPKsWJfU71x3F+6153HPPAq7qqGoGO/Sr/kTNSRrEV4RERGRwUqBSaIqFHbc9ep2llS18JXjR7JgXE6sS+pXrq0F9+LTuH8+Bk0NMGYigS9fC7NOwAtofSQRERGRwU6BSaLGOcd/L9nBS1ub+OzRRZw9eeiM2XH1tbh/PoZ76WnoaIdpxxA461Mw9SjNaCciIiIyhCgwSVQ457jvrd38Y0MjF0wv4PzpBbEu6bC4jnZ/OvBtm2Dju7hlr0I4jHfciXhnfQpv9IRYlygiIiIiUaDAJP2qtSvE+toOXqto5un1DZwzOZdLZxbGuqxD4lqbYdsm3LaNe3/vrAbn/A2ycvBOPhPvzE/gFRXHtlgRERERiSoFJumzUNixtaGTdbXtrKvpYG1NO1VNXURiBWdOzOFLx42M21PUnHPQUAcVfihyWzdBxSao3bV3o/xCGD0Bb/YpeKPHw+gJkJsft+9JRERERPqXApP0Wm1bN+tqOlhX287amnY21HbQGfLjUXZKApMLUpk/NpsphWlMLEglMzk+Jj1wnR2wswq3sxp2VMGOKtzOKn82u/a2vRuOLMUbPwUWnO2Ho/IJeFnZsStcRERERGKuV4HJGHMWcBeQANxrrb1tn/tTgD8AxwK1wEXW2i3GmLHAGmBtZNPXrbVf6afaJcqcczy7sZE3q1tZV9tObVsQgMQAjMtL5YyJuUwuSGVyYRrFmUkx7XVx4RDU7vaD0Y6qHr+rob7m/RvnF0FxKd7chX5IKh/nLyiblh6b4kVEREQkbn1oYDLGJAB3A2cAlcASY8xj1trVPTb7AlBvrZ1ojLkYuB24KHLfRmvt0f1ctwyA/1teg11Zy4iMJKYXpTO50A9H4/NSSEoIxLo8f+2jRU/hXvmnH4yC3XvvTMvwQ9GUGf7vkSVQXApFJXgpWhdJRERERHqnNz1Ms4EN1tpNAMaYh4CPAz0D08eBmyOXHwZ+ZYzRII9B7Kl19diVtZwxIYer5hTH1ZgdFwziXv0n7vE/QUMtTJyGd9q5fm/RyFI/GGXlxFXNIiIiIjI49SYwlQIVPa5XAnMOtI21NmiMaQT2zCM9zhjzFtAE3GCtffnwSpZoW1zRzD1Ld3JcSQZfnR0/YcmFQ7g3XsI99iDs3gETphL44jV+L5KIiIiISBT0JjDt79Oy6+U224HR1tpaY8yxwKPGmOnW2qaeGxpjrgSuBLDW9qIkiZY1u9v4+SvVTMhP5bsnl5IQiH1Ycs7BW68T/tsDUL0NyscR+MaNMOO4uAlzIiIiIjI09SYwVQLlPa6XAdUH2KbSGJMI5AB11loHdAJYa5cZYzYCk4GlPR9srb0HuCdydd8wJgOksrGTWxdVUpCeyI0LykhNjO04JeccrHqL8KP3w9YNUFxK4MvXwqx5eIHYj6ESERERkaGvN4FpCTDJGDMOqAIuBi7ZZ5vHgMuB14ALgOettc4YU4QfnELGmPHAJGBTv1Uv/aauPcgPX6ggEPC4eWE5OamxnXHerV9N+NE/wrpVUDAC74pv4c1dgJcQH1OVi4iIiMjw8KGfiiNjkr4OPIM/rfj/WGtXGWNuAZZaax8Dfgf80RizAajDD1UA84FbjDFBIAR8xVpbF403In3X1h3ilhcqaOoMcevpYyjOSo5ZLW7rRr9HaeUyyMnDu+TLeCediZeUFLOaRERERGT48pyLuzPgXHX1vmf8SbR0hxy3LKpg1c42blhQxqySzJjU4bq7cQ/9FvfS05CRhXfWp/AWnqspwEVERERkv0pKSmD/cyn0q9iedyUxFXaOX76+neU72vjWCaNiF5Ya6gj/922w8V28Mz+B99GL8NIzYlKLiIiIiEhPCkzD2B/e2s2LW5q4bGYRp47PiUkNbtNawv/1U2hvI/CV7+Ede2JM6hARERER2R8FpmHq8Xfr+OuaOs6elMv50/NjUkP4ledw998NuQUErvsZXtnYmNQhIiIiInIgCkzD0Ctbm/jdsl3MLc/kS8eNHPC1jFwwiHv497jnHocjZhK48rt4mdkDWoOIiIiISG8oMA0zK3e2ccer25lalMY180oGfGFa19xE+De3w9oVeKd/HO+CKzRVuIiIiIjELQWmYWRrQyc/ebGS4swk/v2UMlIGeGFaV7GZ8N23QmM93ue+TWDeqQP6+iIiIiIih0qBaYgLO0dFYxcrd7bxyKpaUhID/GBhOVkpA9urE17yMu6+uyA9i8C1t+GNmzSgry8iIiIi0hcKTENM2Dm2NnSycmcbK3e1sWpXO82dIQBGZSXxvZNLGZE5cIvAunAI9+gDuKceholHEPjKdXg5eQP2+iIiIiIih0OBaZALhf2AtGJnG6t2+T8tXWEARmYmcXxpJjNGpjN9RBojM5MHtDbX1kL43jtgxVK8+R/B+/SVeIkDF9ZERERERA6XAtMg45xjY10nK3e1snJnO6t3tdHa7Qek4swk5pZnceSIdI4cmU5RRuzCidteQfjuimZw4gAAHBFJREFUn0DNDrzPfJXAgrNjVouIiIiISF8pMA0yj6yq44/v7AagJCuJE8dkMT0SkArTY99741pbcE/+Gff845CWQeCaH+NNnh7rskRERERE+kSBaRBp7gzx8Kpaji3J4Ko5xRTEQUDaw3V34V54AvfEn6G9FW/eqXifuBQvtyDWpYmIiIjIMGOMKQf+ABQDYeAea+1dfXmugZ1XWg7Lo2vq6AiGufyYEXETllw4TPj1Fwjf8FXcn38P46cQuOkuAld8S2FJRERERGIlCPybtfYIYC5wlTFmWl+eSD1Mg0RjR5C/r63jpDFZjMlNiXU5ALjVbxN+5D7YtglGTyBwxTfxjpgZ67JEREREZJiz1m4HtkcuNxtj1gClwOpDfS4FpkHir6vr6Ao5Lp5RGOtS/AVoH7kPVr0FBSPwvvhveMefjBdQh6WIiIiIxBdjzFjgGGBxXx7vOef6taB+4Lq6umJdQ1zZM3V4RnICIwdwDaUP1FGzk5b/+y0di57Cy8gk44IrSD/nfLykgZ2uXEREREQkOTkZY8yyHjfdY629p+c2xphM4EXgVmvtX/ryOnEZmKqrq2NdQ1y5d9lOnlhbz93njqcke+DDiWtrwT31CO6fjwHgnfYxvLMvwMvIHPBaREREREQASkpKALwD3W+MSQL+Djxjrb2jr6+jU/LiXG1bN0+va2DhuJwBD0suHMK98CTu8YegrQVv7gK8j1+KV1A0oHWIiIiIiBwKY4wH/A5YczhhCRSY4t7Dq2oJO8dFMwZ2xjlXX0v4d3fA2hVwxEwCF1yBN3rCgNYgIiIiItJHJwKXASuMMW9Hbvu+tfbJQ30iBaY4tru1m39saOT0CbmMzBy43iX3zhLC990JXV14V3wTb95peN4BeztFREREROKKtfZfHOR0vUOhwBTH/ryyFnBceOTA9C657m7cI/fhnnscysYRuPK7eKPKBuS1RURERETikQJTnNrZ0sU/NzZw5sRcijKiPzOe215J+Lf/ARWb/Ukdzr9cs9+JiIiIyLCnwBSn7MpaAp4X9d4l5xzulX/iHrwHkpMJfP1GvJnHR/U1RUREREQGCwWmOLS9uYvnNzXy0cl5FKRHr3fJtbXi7v81bsnLMGUGgS9eg5c7sJNLiIiIiIjEMwWmOPSnFTUkBjzOnx698OI2vkv4tz+H+hq8T1yKd/b5eIGEqL2eiIiIiMhgpMAUZyobO3lxSxPnTc0nL63//3lcOIx7+hHc3x6AvEIC196GN2Fqv7+OiIiIiMhQoMAUZ/60opbkBI9PTcvv9+d2DbWE/+dOWPMO3nEn4V32Nbz0zH5/HRERERGRoUKBKY5sa+jk5a1NfGpaPjmp/fNP4zo7Yd0K3Kq3cIsX+WsrffbreCedobWVREREREQ+hAJTHHlwRQ0piQE+Ma3vY5ecc7C9ArfyTdyqN2HdKgh2Q1IyTD2KwIWfwxtV3o9Vi4iIiIgMXQpMcWJzfQevbmvGHFlAdsqhTb7g2lrh3Xf2hqS6Gv+OUeV4C87BO3IWTJqGl5wShcpFRERERIYuBaY48eDyGjKSAnx86oePXXLhMFRsxq1c5gekje9COAxp6XDETLyPGrzps/AKRgxA5SIiIiIiQ5cCUxzYUNvB4soWPn1UIZn76V1yDXWwbSNu20bc1k2wcQ00N/p3jp6Ad9b5eNNnwfgpeIn6JxURERER6S/6dB0HHly+m8zkAB+bnIur3QVbI+Fo2ybYthEa6/0NPQ9GluBNPwamHYM3/Wi87LzYFi8iIiIiMoQpMMWIcw5276B65Rqm/uttvuDtJvXVbYRbmv0NvACUlONNOwbGTMAbPQHKx+Klpse2cBERERGRYUSBaYC4hlrYsh63eQNuy3rYugFamykGzvMSCJSNwTvmBBg93g9HpWPxUjRJg4iIiIhILCkwRYFrbYYtfjByW9bDlvXQUOffGQhAyRi8WSewI380/1GZzvwTZ/DJGSNjW7SIiIiIiHyAAtNhcG0tULMTdu/E1eyAbZv8gLRr+96NRpTgTZkBYyfhjZ0E5ePxUlLY3drNrc9X0FwU4uwjimL2HkRERERE5MAUmA7CdXdD7S6oiQSimp24SECiZie0tbz/AXmFMHYi3omn442d5F9Oz/zA826q6+CWRZV0BcNcf0opqYmBgXlDIiIiIiJySIZ1YHLhMDTV+0FoTwjavQNXGwlFDbXg3N4HJCZC4UgoHIk3fjIUFuMVjoSiyG37CUf7erO6hdtfriYzOcBPzxzDmFyNUxIRERERiVfDIjC5rk7YUYXbXgE7Kv3f2yth9w7o7nr/xrkFfviZOiMSjvaEomLIycML9L036J8bG7h78Q5G56Rw08IyCtKTDvOdiYiIiIhINA2pwOTaWmB7Ja56WyQYVcL2Cv+0uj09RV7ADz+jyvCOnOUHokgPEQUj8JKS+78u53hoRQ0Prajl6OJ0vje/lPSkDy5QKyIiIiIi8WXQByYX7Mb9/i7c2hV7F3gFSEyC4lK8cZNh3ml4o8pgVLk/CUPSwPXsBMOOuxfv4PlNjZw6Poer5hSTGPAG7PVFRERERKTvBn9geuU53Bsv4R1/sr/Aa3E5jCqDwhF4gdj24rR1h7j9pSre3tHGxTMKuHhGIZ6nsCQiIiIiMlgM6sDkgt24J/8M46fgfek7cRVGatu6+dGiSrY2dPKNucWcPiE31iWJiIiIiMghGtyB6bUXoG43gUu/FldhaWtDJz98oYLWrjA3LihjVsmHz54nIiIiIiLxZ9AGJhcM4p6wMHYSHDkr1uW8Z/mOVm57qYrkxAA/PWM04/NTY12SiIiIiIj00eANTIsXQe0uApd8OW56lxZtbuSXr29nVFYyP1hYTlGGpg0XERERERnMBmVgcqGQ37s0ZiLMOC7W5bC9uYtnNzTwyOo6jhyZzvUnl5KZomnDRUREREQGu8EZmBYvgt07CFz17zHpXeoOOVbvbmNpVQtLq1qpbvYXv10wNpuvzy0mKaHvi9uKiIiIiEj8GHSBye9d+jOUj4OZswfsdevagyyramFpdQtvb2+jIxgmMeBx5Mh0zpmcy3GlmYzK6v9Fb0VEREREJHYGX2Ba8hLsqibw1euj2rsUCjvW13awrLqFpVUtbKrvBKAgPZFTxmZzbGkGM4szSE1Ub5KIiIiIyFA1qAKTC0fGLpWNhaPn9PvzN3eGeGt7K8uqWnhzeytNnSECHkwtTOOymUUcV5rBmNyUuJlkQkREREREomtwBaYl/4IdVQS+ch1e4PB7dpxzbG3oZGm1H5LerWkn7CArJYFjR2VwbGkmx4zKIEsTOIiIiIiIDEuDJjC917tUOgaOmXtYz9UZDGNX1rJocyM1bUEAxuelcMH0Ao4rzWRifioJAfUiiYiIiIgMd4MnMC17FbZX4F157WH1Lq2vbefOV7dT2dTF7LJMLp6RyaySDArStWaSiIiIiIi836AITC4cxv39TzCqHO/YeX16jmDY8eeVNdiVteSlJnLzqeUcMyqjnysVEREREZGhZFAEJt56Daq34X3x3/rUu7StsZM7X93OxroOFozN5kvHjdTCsiIiIiIi8qHiPjC5cJjw4w9BcRne8Scd0mNDYcfja+u4/+0a0pICXHdyKSeMzopSpSIiIiIiMtTEfWDi7cVQtRXvC9fgBXrfK7SzpYu7XtvOql3tzCnL5Guzi8lNi/+3KyIiIiIi8SOuE4RzjvDfH4IRJXjHn9zrxzy7sZHfLdtFwINvzi3m1PE5WjtJREREREQOWVwHJt5ZDBWb8T73bbyED+9dqm3r5u7FO1hW3cpRI9P55gmjKMrQ7HciIiIiItI3cRuYnHOEH/8TFBXjzTnlQ7d/aUsTv1myg66Q40vHjeCcyXkE1KskIiIiIiKHIW4DE8uXwraNeFd886C9S5vqOrAra3mtoplJBal8e94oyrJTBrBQEREREREZquIyMPm9Sw9C4Ui8OQs+cH8w7HhtWzNPrqtn9e52khM8PjOzkPOnFZAQUK+SiIiIiIj0j7gMTKx8E7ZuwPvs1/ES95bY0B7kmQ0NPL2+gbr2IMWZSXx+1ghOG5+jdZVERERERKTf9SowGWPOAu4CEoB7rbW37XN/CvAH4FigFrjIWrslct/1wBeAEPBNa+0zH/Z64ccfhIIReCcsBGBtTTtPrK3nlW1NBMNwzKgMvja7mFklGepREhERERGRD/iwDNNbgV68UAJwN3A2MA34tDFm2j6bfQGot9ZOBP4fcHvksdOAi4HpwFnAryPPd3Cb1xE+63xe2NbGd57ewrXPbOWNyhY+MimPuz82jptPLef4skyFJRERERER+YBeZphe6U0P02xgg7V2U+TFHwI+Dqzusc3HgZsjlx8GfmWM8SK3P2St7QQ2G2M2RJ7vtYO9YGtmPt/aNZa6qu2UZidz5XEjWTg+m/QknXYnIiIiIiIfqjcZplc+tIcJKAUqelyvjNy2322stUGgESjo5WM/4IFRpzBhRBY/PLWcu88dx0en5CksiYiIiIhIb/Uph+xPb3qY9nfem+vlNr15LMaYK4ErAay1fO9H3yQ5RVODi4iIiIjIgRljlva4eo+19p7I5V7lkN7oTWCqBMp7XC8Dqg+wTaUxJhHIAep6+Vgib2zPm3NNzc3Q3NyrNyAiIiIiIsNPSUkJ1trjDnB3r3JIb/QmMC0BJhljxgFV+JM4XLLPNo8Bl+OPTboAeN5a64wxjwH/Z4y5AygBJgFv9KVQERERERGRXupNhumVDx3DFBmT9HXgGWCNf5NdZYy5xRhzXmSz3wEFkUkdrgGuizx2FWDxB1c9DVxlrQ31pVAREREREZHeOFCG6ctzec716VS+aHLV1X3qLRMRERERkWGipKQE9j9WqV/1ZpY8ERERERGRYUmBSURERERE5AAUmERERERERA5AgUlEREREROQAFJhEREREREQOQIFJRERERETkABSYREREREREDkCBSURERERE5AAUmERERERERA5AgUlEREREROQAPOdcrGvYV9wVJCIiIiIiccmL9gvEYw+Tp5/++zHGLIt1DUPxR+2qth2MP2pbtelg+VG7qm0H44/aNmZtGnXxGJhERERERETiggKTiIiIiIjIASgwDX33xLqAIUrtGj1q2+hR2/Y/tWl0qF2jR20bPWrb/hcXbRqPkz6IiIiIiIjEBfUwiYiIiIiIHIAC0yBnjBmQ2UFE+ov2WRlstM/KYKN9VgaTwbC/KjANfrkAxpjEWBcylBhjLjHGzIxcjvv/yINM6p4LalsZJHScjQIdZ6NKx9koMsbo83P/ygQwxiTEupAD0RimQcoYkwP8Gcix1s6JdT1DhTHmdOAHwBTgWmvtfbGtaOgwxpwJ3AysAZ631j4Q24qGDmPMJ4BjrbU3xrqWoUTH2ejQcTZ6dJyNHmPMecBEa+0dxpiAtTYc65oGs0iQLwIssNNae1GMSzooJeTBqwOoB440xlwI8Z3M45kxxjPGpBljLHAD8GPgYSA9cr/a9TAZY4qAW4CfAf8HXGSMuT5yn45DfRDZbxOMMV8Efg5cZ4w5OdZ1DTE6zvYTHWejT8fZ6DDGJBpjvgf8Avi5MeZoa21Y++zhsdY6/GNsB3CUMeZsiN99NS6LkoOL/CfNBV4HLgJ+CWCtDanr/dBZa521th14wFq7wFr7DPAqcFnk/lBMCxzkIvvkSOAda+2j1trngOuA7xhjCiN/eLTfHqLIfhsCNgDHAF8DfhTbqoYOHWf7l46z0aXjbPRYa4PAWmAqcA3wm8jt2mcPQyQYlQFv4++rNwHEa8+dAtMgYIz5pjHmt8aYzxtjvMh/0ibgo9bavwPLjTE3GWOOtNY6HRR7p0e7fgnAWvu3yO0JwGZglTGmPJY1DlbGmMuNMWfAe98itQDzjDH5kdtW45/q9MvYVTk49dhvvxi56UVrbbO19rdAhjHmC5HtdHw/BDrORoeOs9Gj42z0RPbb24wxJnLTE9baDmvtncAIY8wlke2SYlfl4NKjTc+H94JRNTAZeAXYboz5ijFmUizrPBD9QY1zxpgrgEuAR4DLgeuNMROALPxvPgEewk/m90Wua2Dyh9inXS81xnzfGDMe3vvWqAmYCTTErMhByBiTZ4x5GLgN+M89pyxYa7cAbwF39dj8emC8MWZc5I+9fIh99tvLIqfbjO+xyU3ANcaYvHj9li4e6TgbHTrORoeOs9ETOXX0avxe5aXADyP7cV6Pza4B/gPAWts94EUOMvtp0x8bY66IBPuJ+L2iNfg9zv8J3BF5XFwdYxWY4t9pwO3W2qeBf8Of+eZCoB042xjzD+CbwPPA1shjgrEodJDZt12TgUv33GmtXYHfxhfHprzByVpbD/wDOAJYRqSLPeLrwFnGmOMj11uBd4CuAS1ycNvf8eAze+601j6FP9j7SmNM1p5xN/KhdJyNDh1no0DH2eiJhMqFwA3W2oeBq/FD/Ud6bPNXYJ0x5jvw3iQmcgAHaNOjgTOAHcB8Y8yTwOfwe5o2RR4aV6c8KjDFqR6n07wFnAtgrV2Kn8DHAScBzwJvWGuPttaeCSzQt0gHd5B2fR0oMcacGNnOw/+DlKpTb3qnRzv9wVrbAPwa+JQxZgyAtbYJ+CFwozHmcvyB30fin0YiB3GQ/fY1euy3Ed8DfgqsB4oHss7BRsfZ6NBxNnp0nO0/++5zPfbbpcDJAJGwvw6YboyZ0mPzrwI/M8bsAEoHoNxB4RDadC1wFH5wqgCWWGun4395ssAYUxpvx1gFpjhhjJlujHlv3YQep9O8AgSMMfMj11cBVfinitxkrb2hx9OMttZuHpCCB4lDaNeVwHagJLKdA0YArfH2nzZe7KdtXeR3R+T3EuAp4NYe2/wKuBM4FhgDXGCtbRzIugcDY8yJkVPCgN7vt8aYifgfoB4FZllrNXahh0NoVx1nD0Ff91cdZz/cftpWx9n+k9bzSo/9dgOQZYyZEbn+IpCDfzzAGHM08Fv8U01nWWv/d2DKHRR626YvAdnAbuAr1tofRLavA0601lYNUL29psAUY8aYo4wx/8KfYrWgx+17/m3W4//xvsgYk2CtrcD/YzPGWttl/GmFAwDW2tYBLj9u9aFdK/G/jR/b42m+Y639nwEqedA4SNt65oMTDfwKmBgJVyONMROttc8DV1trL7fWVg9g6XHPGDMrcvrX8/h/oPfc3tv9thH4urX2U2rbvfrQrjrO9kI/7K+g4+x+HaRtdZw9TMaYucaYR4C7jTFn7hkD1mPMzBv4p4OdYYxJjEyeUQocF7m/FviatfZCta2vD226Cj/MH2Ot7YgcYz0Aa21c9obG1YCqYeoG4OHIzCuAP3tQj+kqm4GX8Rf4+7kx5lr8qW5rQdNaHkRf2jWPSLsCWGt1zvf+HaxtnTEmDUiw1rZYa7cZY/4KrMA/reES0H67L+PPtPQr/G+Eb8Zfl2IB8Oah7LfW2t3439gJh92uOs4eQH/tr6Dj7L562bY6zvaRMWYB/qQC/wmU44+pe9MYU2f96cOx1m4wxizBH4N3Hf6Xg51Exi9GvlCpGPjq49NhtumWyP1xv6+qhylGjDGBSDd7y54PnsaYM4wxuYAXuf5j/MXnGvEHdebh//FpBNQFvB9q1+jpZdv+CHiAyMxtxphP468P9HNghrX2zZgUH/9S8E9RONn6U1j/BTgi8k1cCMAY80O03x4qtWt0qF2jpzdt+wN0nO2ro/DHyzwA3A8k4f9NC4P/+cAY8zv8yTR+Acw2xiwD6oBnYlRzvDucNv1HjGo+ZOphGkDGmLlAnbV2nfUXkdsFnGyMORf4Iv65nzuBNcaYB/EPhtdbazdEHv95IMNa2xyjtxCX1K7R04e2nQBcu6dt8ddZWaAxHx/Us23xx3A80OPuBCBkrQ1GTlOYAUwCrrPWbow8Xvvtfqhdo0PtGj19aNspwHf3tC06zh7QPm0Lfhi92RhTjR8y1wC/NsY8g99rNB5/3OKWyOMvARKtP8GGMHzb1HNO4yyjLfIN/APAfOB24P/tOQ/eGPN94ALgZmvtY8YfHPtvwG3W2tci2wSs1lT5ALVr9PRD2/Y8LUd6OFDbRj4MeZFgOhF/wPxUa2298RdSdZHHa7/dD7VrdKhdo6cf2lbH2QPYT9veuWdsjDFmNvAV/MVoHzH+Yt9zgV9Za9+JbKP9dh/DvU11St7AyMDvyv1G5PL8Hvf9HX8AbH7k+lL8eek7YPDvYFGmdo2ew21b/RE/sP22rbXWRT4gBfDP634GOGXPfaD99kOoXaND7Ro9h9u2Os4e2L5te/KeO6y1bwBF7F1T7Xn8MYv1oP32IIZ1myowRYkx5rPGmFOMMdnWnx7xHsDif6icY4wpBbDWLge+C1xljCnEHyw3g72DjQf1Dtbf1K7Ro7aNnl607Z5pwb1I++2Zrn1PCN0ze5Datge1a3SoXaNHbRs9h9C2KfhrrX0t8tDT8L8A3DNVu9o2Qm26l07J60eRA1kx/kDXMLARP4V/y1pbE9nmRMAAS621f+zx2Gvwz/OchD8V6OoBLj9uqV2jR20bPYfYtkustfdHbkuw1oaMMX8ENlprb45F/fFK7RodatfoUdtGT1//hhljpgM/iDy2G385hjUD/w7ij9p0/9TD1E8iBzaHv7BZlbX2NPykXYefyAGw1r6C38U+xRiTY4zJitx+B/6Hzo/og+deatfoUdtGTx/admqkbdN7nGbzeX1Aej+1a3SoXaNHbRs9ffwblmuMSbP+OkCXA1dYa08bSh/sD4fa9MDUw3SYjL8o1y34M9k8ib9y8QXW2ssj93tANXCxtfbFyG2Z+HPQz2Pvwl1a/KwHtWv0qG3/f3t3yCJVFMZx+A8LdpNFFu0iqEUwiKDJfrrBuF9Am1aRbYIgmk8RxU8gahPULGgw2gTRshrOrCzCXUbnvozuPk+amXT5cRnm5dw5p462NXStoWsdbeus2PZCks0kZxePmBFNl2GFaQWttYsZ+8ofTfI+ye2MZchLbewYsvsHzVsZB9Dtupoxsb/NODPBF+IeutbRto62NXStoWsdbevM0PZNRtsD+8P+T2m6HOcwrWYnyZ09z2+eSXIy45C+e0nOtbHLzeOMG+9EH/vQf0tyuff+fD2X/c/TtY62dbStoWsNXetoW0fb+Wm6BCtMq3mdpLfWNhbvXybZ7L0/SrLRWtvqY2eQ4xkHz31Mkt77k8Nyg/0lXetoW0fbGrrW0LWOtnW0nZ+mS7DCtILe+9ffPrqS5N3i9bUk11trzzJO5b6f/Noq1B/H9qFrHW3raFtD1xq61tG2jrbz03Q5BqYZLKbyH0mOJXm6+PhLkhtJTiX5sPts52G7wVahax1t62hbQ9cautbRto6289N0fwameewkOZLkc5LTrbXtjEM8t3rvL9Z6Zf83XetoW0fbGrrW0LWOtnW0nZ+m+7Ct+Exaa+czTjl+leRh7/3Bmi/pQNC1jrZ1tK2haw1d62hbR9v5aTrNCtN8PiW5meRu7/37ui/mANG1jrZ1tK2haw1d62hbR9v5aTrBChMAAMAE24oDAABMMDABAABMMDABAABMMDABAABMMDABAABMMDABAABMMDABAABMMDABAABM+Aly2jfdVhDLbgAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 1008x504 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"ret_df[['turn_over', 'excess_return']].cumsum().plot(figsize=(14, 7), secondary_y='turn_over')"
]
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
......@@ -259,9 +201,9 @@
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"display_name": "Python [conda env:alpha-mind]",
"language": "python",
"name": "python3"
"name": "conda-env-alpha-mind-py"
},
"language_info": {
"codemirror_mode": {
......@@ -273,7 +215,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.3"
"version": "3.7.9"
},
"varInspector": {
"cols": {
......@@ -306,5 +248,5 @@
}
},
"nbformat": 4,
"nbformat_minor": 2
"nbformat_minor": 4
}
......@@ -38,11 +38,11 @@
"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"
"2020-11-21 15:05:55,114 - ALPHA_MIND - INFO - alpha factor data loading finished ...\n",
"2020-11-21 15:05:55,271 - ALPHA_MIND - INFO - industry data loading finished ...\n",
"2020-11-21 15:05:55,384 - ALPHA_MIND - INFO - benchmark data loading finished ...\n",
"2020-11-21 15:05:55,871 - ALPHA_MIND - INFO - risk_model data loading finished ...\n",
"2020-11-21 15:05:56,836 - ALPHA_MIND - INFO - returns data loading finished ...\n"
]
}
],
......@@ -51,17 +51,17 @@
"Back test parameter settings\n",
"\"\"\"\n",
"\n",
"benchmark_code = 905\n",
"universe = Universe('zz800') + Universe('cyb')\n",
"benchmark_code = 300\n",
"universe = Universe('hs300')\n",
"\n",
"start_date = '2017-01-01'\n",
"end_date = '2018-04-27'\n",
"start_date = '2020-01-01'\n",
"end_date = '2020-02-21'\n",
"freq = '10b'\n",
"neutralized_risk = None\n",
"\n",
"alpha_factors = {\n",
" 'f01': CSQuantiles(LAST('EPS'), groups='sw1'),\n",
" 'f02': CSQuantiles(LAST('ROE'), groups='sw1'),\n",
" 'f01': CSQuantiles(LAST('EMA5D')),\n",
" 'f02': CSQuantiles(LAST('EMV6D')),\n",
"}\n",
"\n",
"weights = dict(\n",
......@@ -169,169 +169,22 @@
"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"
"2020-11-21 15:06:00,110 - ALPHA_MIND - INFO - starting backting ...\n",
"2020-11-21 15:06:00,113 - ALPHA_MIND - INFO - alpha models training finished ...\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"
"ename": "AttributeError",
"evalue": "'DataFrame' object has no attribute 'trade_date'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<timed exec>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n",
"\u001b[1;32m<ipython-input-2-cc4463b9a60f>\u001b[0m in \u001b[0;36mcreate_scenario\u001b[1;34m(weights_bandwidth, target_vol, method)\u001b[0m\n\u001b[0;32m 73\u001b[0m turn_over_target=0.4)\n\u001b[0;32m 74\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 75\u001b[1;33m \u001b[0mret_df\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpositions\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mstrategy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mrunning_setting\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 76\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mret_df\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\strategy\\strategy.py\u001b[0m in \u001b[0;36mrun\u001b[1;34m(self, running_setting)\u001b[0m\n\u001b[0;32m 258\u001b[0m \u001b[0mpositions\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'dx'\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtotal_data\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdx\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 259\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 260\u001b[1;33m \u001b[0mtrade_dates\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpositions\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtrade_date\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0munique\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 261\u001b[0m ret_df = pd.DataFrame({'returns': rets, 'turn_over': turn_overs, 'leverage': leverags},\n\u001b[0;32m 262\u001b[0m index=trade_dates)\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\pandas\\core\\generic.py\u001b[0m in \u001b[0;36m__getattr__\u001b[1;34m(self, name)\u001b[0m\n\u001b[0;32m 5137\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_info_axis\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_can_hold_identifiers_and_holds_name\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5138\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 5139\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mobject\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__getattribute__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mname\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 5140\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5141\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m__setattr__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mname\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m->\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mAttributeError\u001b[0m: 'DataFrame' object has no attribute 'trade_date'"
]
}
],
......@@ -356,159 +209,21 @@
"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"
"2020-11-21 15:06:14,030 - ALPHA_MIND - INFO - starting backting ...\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"
"ename": "AttributeError",
"evalue": "'DataFrame' object has no attribute 'trade_date'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<timed exec>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n",
"\u001b[1;32m<ipython-input-2-cc4463b9a60f>\u001b[0m in \u001b[0;36mcreate_scenario\u001b[1;34m(weights_bandwidth, target_vol, method)\u001b[0m\n\u001b[0;32m 73\u001b[0m turn_over_target=0.4)\n\u001b[0;32m 74\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 75\u001b[1;33m \u001b[0mret_df\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpositions\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mstrategy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mrunning_setting\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 76\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mret_df\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\strategy\\strategy.py\u001b[0m in \u001b[0;36mrun\u001b[1;34m(self, running_setting)\u001b[0m\n\u001b[0;32m 258\u001b[0m \u001b[0mpositions\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'dx'\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtotal_data\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdx\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 259\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 260\u001b[1;33m \u001b[0mtrade_dates\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpositions\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtrade_date\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0munique\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 261\u001b[0m ret_df = pd.DataFrame({'returns': rets, 'turn_over': turn_overs, 'leverage': leverags},\n\u001b[0;32m 262\u001b[0m index=trade_dates)\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\pandas\\core\\generic.py\u001b[0m in \u001b[0;36m__getattr__\u001b[1;34m(self, name)\u001b[0m\n\u001b[0;32m 5137\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_info_axis\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_can_hold_identifiers_and_holds_name\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5138\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 5139\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mobject\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__getattribute__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mname\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 5140\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5141\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m__setattr__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mname\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m->\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mAttributeError\u001b[0m: 'DataFrame' object has no attribute 'trade_date'"
]
}
],
......@@ -534,9 +249,9 @@
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"display_name": "Python [conda env:alpha-mind]",
"language": "python",
"name": "python3"
"name": "conda-env-alpha-mind-py"
},
"language_info": {
"codemirror_mode": {
......@@ -548,7 +263,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.3"
"version": "3.7.9"
},
"varInspector": {
"cols": {
......@@ -581,5 +296,5 @@
}
},
"nbformat": 4,
"nbformat_minor": 2
"nbformat_minor": 4
}
......@@ -9,7 +9,7 @@
},
{
"cell_type": "code",
"execution_count": 1,
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
......@@ -26,7 +26,7 @@
},
{
"cell_type": "code",
"execution_count": 2,
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
......@@ -34,8 +34,8 @@
"Back test parameter settings\n",
"\"\"\"\n",
"\n",
"start_date = '2016-01-01'\n",
"end_date = '2018-02-14'\n",
"start_date = '2020-01-01'\n",
"end_date = '2020-02-21'\n",
"\n",
"freq = '10b'\n",
"industry_lower = 1.0\n",
......@@ -48,9 +48,9 @@
"benchmark_total_upper = 1.0\n",
"batch = 1\n",
"horizon = map_freq(freq)\n",
"universe = Universe('zz800')\n",
"universe = Universe('hs300')\n",
"data_source = os.environ['DB_URI']\n",
"benchmark_code = 905\n",
"benchmark_code = 300\n",
"weight_gap = 0.01\n",
"\n",
"executor = NaiveExecutor()\n",
......@@ -60,7 +60,7 @@
},
{
"cell_type": "code",
"execution_count": 8,
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
......@@ -91,14 +91,31 @@
},
{
"cell_type": "code",
"execution_count": 9,
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"name": "stderr",
"output_type": "stream",
"text": [
"Wall time: 2min\n"
"D:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\model\\data_preparing.py:412: FutureWarning: DataFrame.mean and DataFrame.median with numeric_only=None will include datetime64 and datetime64tz columns in a future version.\n",
" lambda x: x.fillna(x.median())).reset_index(\n"
]
},
{
"ename": "IndexError",
"evalue": "index -1 is out of bounds for axis 0 with size 0",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mIndexError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<timed exec>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n",
"\u001b[1;32m<timed exec>\u001b[0m in \u001b[0;36m<listcomp>\u001b[1;34m(.0)\u001b[0m\n",
"\u001b[1;32m<ipython-input-5-ec80423ad50f>\u001b[0m in \u001b[0;36mpredict_worker\u001b[1;34m(params)\u001b[0m\n\u001b[0;32m 20\u001b[0m data_source=data_source)\n\u001b[0;32m 21\u001b[0m \u001b[0mref_date\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmodel\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mparams\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 22\u001b[1;33m \u001b[0mer\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0m_\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpredict_by_model\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mref_date\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdata_meta\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 23\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mer\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\model\\composer.py\u001b[0m in \u001b[0;36mpredict_by_model\u001b[1;34m(ref_date, alpha_model, data_meta, x_values, codes)\u001b[0m\n\u001b[0;32m 165\u001b[0m codes: Iterable[int] = None):\n\u001b[0;32m 166\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mx_values\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 167\u001b[1;33m \u001b[0mpredict_data\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mdata_meta\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfetch_predict_data\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mref_date\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0malpha_model\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 168\u001b[0m \u001b[0mcodes\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mx_values\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpredict_data\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'predict'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'code'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpredict_data\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'predict'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'x'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 169\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\model\\composer.py\u001b[0m in \u001b[0;36mfetch_predict_data\u001b[1;34m(self, ref_date, alpha_model)\u001b[0m\n\u001b[0;32m 140\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwarm_start\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 141\u001b[0m \u001b[0mfillna\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 142\u001b[1;33m fit_target=alpha_model.fit_target)\n\u001b[0m\u001b[0;32m 143\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 144\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\model\\data_preparing.py\u001b[0m in \u001b[0;36mfetch_predict_phase\u001b[1;34m(engine, alpha_factors, ref_date, frequency, universe, batch, neutralized_risk, risk_model, pre_process, post_process, warm_start, fillna, fit_target)\u001b[0m\n\u001b[0;32m 444\u001b[0m \u001b[0mdates\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0munique\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdate_label\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 445\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 446\u001b[1;33m \u001b[1;32mif\u001b[0m \u001b[0mdates\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m==\u001b[0m \u001b[0mdt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdatetime\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstrptime\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mref_date\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'%Y-%m-%d'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 447\u001b[0m \u001b[0mend\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mdates\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 448\u001b[0m \u001b[0mstart\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mdates\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m-\u001b[0m\u001b[0mbatch\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mbatch\u001b[0m \u001b[1;33m<=\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdates\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32melse\u001b[0m \u001b[0mdates\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mIndexError\u001b[0m: index -1 is out of bounds for axis 0 with size 0"
]
}
],
......@@ -113,7 +130,7 @@
},
{
"cell_type": "code",
"execution_count": 10,
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
......@@ -151,7 +168,7 @@
},
{
"cell_type": "code",
"execution_count": 11,
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
......@@ -235,30 +252,20 @@
},
{
"cell_type": "code",
"execution_count": 12,
"execution_count": 9,
"metadata": {},
"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>"
"ename": "NameError",
"evalue": "name 'predicts' is not defined",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-9-b2513dd9cb9a>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mret_df\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcreate_scenario\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mweight_gap\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m ret_df[['returns', 'tc_cost']].cumsum().plot(figsize=(12, 6),\n\u001b[0;32m 3\u001b[0m \u001b[0mtitle\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'Fixed freq rebalanced: {0} with benchmark {1}'\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfreq\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m905\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m secondary_y='tc_cost')\n",
"\u001b[1;32m<ipython-input-8-aa06d4654124>\u001b[0m in \u001b[0;36mcreate_scenario\u001b[1;34m(weight_gap)\u001b[0m\n\u001b[0;32m 33\u001b[0m \u001b[0mubound\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mweight_gap\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0mbenchmark_w\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 34\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 35\u001b[1;33m \u001b[0mer\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpredicts\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mi\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mloc\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mcodes\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 36\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 37\u001b[0m target_pos, _ = er_portfolio_analysis(er,\n",
"\u001b[1;31mNameError\u001b[0m: name 'predicts' is not defined"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
......@@ -268,6 +275,13 @@
" secondary_y='tc_cost')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
......@@ -278,9 +292,9 @@
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"display_name": "Python [conda env:alpha-mind]",
"language": "python",
"name": "python3"
"name": "conda-env-alpha-mind-py"
},
"language_info": {
"codemirror_mode": {
......@@ -292,7 +306,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.3"
"version": "3.7.9"
},
"varInspector": {
"cols": {
......@@ -325,5 +339,5 @@
}
},
"nbformat": 4,
"nbformat_minor": 2
"nbformat_minor": 4
}
......@@ -11,7 +11,7 @@
},
{
"cell_type": "code",
"execution_count": 1,
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
......@@ -21,7 +21,6 @@
"import numpy as np\n",
"import pandas as pd\n",
"from matplotlib import pyplot as plt\n",
"import statsmodels.api as sm\n",
"from alphamind.api import *\n",
"from PyFin.api import *\n",
"from alphamind.analysis.crosssetctions import cross_section_analysis\n",
......@@ -31,7 +30,7 @@
},
{
"cell_type": "code",
"execution_count": 2,
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
......@@ -39,12 +38,12 @@
"Back test parameter settings\n",
"\"\"\"\n",
"\n",
"start_date = '2016-01-01'\n",
"end_date = '2018-02-28'\n",
"start_date = '2020-01-01'\n",
"end_date = '2020-02-21'\n",
"category = 'sw'\n",
"level = 1\n",
"freq = '20b'\n",
"universe = Universe('ashare_ex')\n",
"freq = '10b'\n",
"universe = Universe('hs300')\n",
"\n",
"horizon = map_freq(freq)\n",
"ref_dates = makeSchedule(start_date, end_date, freq, 'china.sse')"
......@@ -52,7 +51,7 @@
},
{
"cell_type": "code",
"execution_count": 3,
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
......@@ -78,7 +77,7 @@
},
{
"cell_type": "code",
"execution_count": 4,
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
......@@ -87,194 +86,44 @@
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": 14,
"metadata": {},
"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"
"2020-11-21 15:10:18,028 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-21 15:10:18,038 - ALPHA_MIND - INFO - 2020-01-02 00:00:00 is finished with 300 stocks for BETA\n",
"2020-11-21 15:10:18,041 - ALPHA_MIND - INFO - 2020-01-02 00:00:00 risk_exposure: 3.25829145513029e-31\n",
"2020-11-21 15:10:18,510 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-21 15:10:18,513 - ALPHA_MIND - INFO - 2020-01-16 00:00:00 is finished with 300 stocks for BETA\n",
"2020-11-21 15:10:18,516 - ALPHA_MIND - INFO - 2020-01-16 00:00:00 risk_exposure: 4.602789610027951e-31\n",
"2020-11-21 15:10:19,244 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-21 15:10:19,248 - ALPHA_MIND - INFO - 2020-02-07 00:00:00 is finished with 300 stocks for BETA\n",
"2020-11-21 15:10:19,252 - ALPHA_MIND - INFO - 2020-02-07 00:00:00 risk_exposure: 7.380374200927195e-31\n",
"2020-11-21 15:10:20,041 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-21 15:10:20,046 - ALPHA_MIND - INFO - 2020-02-21 00:00:00 is finished with 300 stocks for BETA\n",
"2020-11-21 15:10:20,052 - ALPHA_MIND - INFO - 2020-02-21 00:00:00 risk_exposure: 1.425987166389731e-31\n",
"2020-11-21 15:10:21,151 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-21 15:10:21,159 - ALPHA_MIND - INFO - 2020-01-02 00:00:00 is finished with 300 stocks for SIZE\n",
"2020-11-21 15:10:21,169 - ALPHA_MIND - INFO - 2020-01-02 00:00:00 risk_exposure: 1.626600676017078e-31\n",
"2020-11-21 15:10:21,952 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-21 15:10:21,961 - ALPHA_MIND - INFO - 2020-01-16 00:00:00 is finished with 300 stocks for SIZE\n",
"2020-11-21 15:10:21,970 - ALPHA_MIND - INFO - 2020-01-16 00:00:00 risk_exposure: 7.114752841729456e-31\n",
"2020-11-21 15:10:22,823 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-21 15:10:22,831 - ALPHA_MIND - INFO - 2020-02-07 00:00:00 is finished with 300 stocks for SIZE\n",
"2020-11-21 15:10:22,839 - ALPHA_MIND - INFO - 2020-02-07 00:00:00 risk_exposure: 2.894999049336361e-31\n",
"2020-11-21 15:10:23,345 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2020-11-21 15:10:23,348 - ALPHA_MIND - INFO - 2020-02-21 00:00:00 is finished with 300 stocks for SIZE\n",
"2020-11-21 15:10:23,350 - ALPHA_MIND - INFO - 2020-02-21 00:00:00 risk_exposure: 3.207077036087234e-31\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Wall time: 3min 30s\n"
"Wall time: 6.91 s\n"
]
}
],
......@@ -285,7 +134,7 @@
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
......@@ -298,7 +147,7 @@
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": 16,
"metadata": {},
"outputs": [
{
......@@ -331,12 +180,12 @@
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>SIZE</th>\n",
" <td>4.764919</td>\n",
" <th>BETA</th>\n",
" <td>1.283202</td>\n",
" </tr>\n",
" <tr>\n",
" <th>BETA</th>\n",
" <td>2.538497</td>\n",
" <th>SIZE</th>\n",
" <td>0.941047</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
......@@ -345,11 +194,11 @@
"text/plain": [
" abs t.\n",
"factor \n",
"SIZE 4.764919\n",
"BETA 2.538497"
"BETA 1.283202\n",
"SIZE 0.941047"
]
},
"execution_count": 7,
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
......@@ -369,9 +218,9 @@
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"display_name": "Python [conda env:alpha-mind]",
"language": "python",
"name": "python3"
"name": "conda-env-alpha-mind-py"
},
"language_info": {
"codemirror_mode": {
......@@ -383,7 +232,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.3"
"version": "3.7.9"
},
"varInspector": {
"cols": {
......@@ -423,5 +272,5 @@
}
},
"nbformat": 4,
"nbformat_minor": 2
"nbformat_minor": 4
}
......@@ -40,25 +40,25 @@
"metadata": {},
"outputs": [],
"source": [
"ref_date = '2018-01-08'\n",
"ref_date = '2020-01-02'\n",
"engine = SqlEngine(os.environ['DB_URI'])\n",
"universe = Universe('zz800')"
"universe = Universe('hs300')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"codes = engine.fetch_codes(ref_date, universe)\n",
"total_data = engine.fetch_data(ref_date, 'EPS', codes, 906, industry='sw', risk_model='day')\n",
"total_data = engine.fetch_data(ref_date, 'EMA5D', codes, 300, industry='sw', risk_model='short')\n",
"all_styles = risk_styles + industry_styles + ['COUNTRY']"
]
},
{
"cell_type": "code",
"execution_count": 4,
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
......@@ -81,11 +81,25 @@
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": 10,
"metadata": {},
"outputs": [],
"outputs": [
{
"ename": "PortfolioBuilderException",
"evalue": "-13",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mPortfolioBuilderException\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-10-ccd216424e89>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 9\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 10\u001b[0m \u001b[0mstatus\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mp_er\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mp_weight\u001b[0m \u001b[1;33m=\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m\\\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 11\u001b[1;33m \u001b[0mtarget_vol_builder\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mer\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mrisk_model\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mbm\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlbound\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mubound\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcons_mat\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mrisk_targets\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtarget_vol\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 12\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 13\u001b[0m \u001b[0msec_cov\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mrisk_exposure\u001b[0m \u001b[1;33m@\u001b[0m \u001b[0mrisk_cov\u001b[0m \u001b[1;33m@\u001b[0m \u001b[0mrisk_exposure\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mT\u001b[0m \u001b[1;33m/\u001b[0m \u001b[1;36m10000.\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdiag\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mspecial_risk\u001b[0m \u001b[1;33m**\u001b[0m \u001b[1;36m2\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m/\u001b[0m \u001b[1;36m10000\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\portfolio\\meanvariancebuilder.py\u001b[0m in \u001b[0;36mtarget_vol_builder\u001b[1;34m(er, risk_model, bm, lbound, ubound, risk_exposure, risk_target, vol_target, linear_solver)\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\portfolio\\meanvariancebuilder.py\u001b[0m in \u001b[0;36m_create_result\u001b[1;34m(optimizer, bm)\u001b[0m\n",
"\u001b[1;31mPortfolioBuilderException\u001b[0m: -13"
]
}
],
"source": [
"er = factor['EPS'].values\n",
"er = factor['EMA5D'].values\n",
"bm = factor['weight'].values\n",
"lbound = np.zeros(len(er))\n",
"ubound = bm + 0.01\n",
......@@ -102,16 +116,18 @@
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 11,
"metadata": {},
"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"
"ename": "NameError",
"evalue": "name 'p_weight' is not defined",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-11-d3dba2152982>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# check the result\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34mf\"total weight is {p_weight.sum(): .4f}\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34mf\"portfolio activate weight forecasting vol is {np.sqrt((p_weight - bm) @ sec_cov @ (p_weight - bm)):.4f}\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34mf\"portfolio er: {p_weight @ er:.4f} comparing with benchmark er: {bm @ er:.4f}\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mNameError\u001b[0m: name 'p_weight' is not defined"
]
}
],
......@@ -132,7 +148,7 @@
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
......@@ -159,7 +175,7 @@
},
{
"cell_type": "code",
"execution_count": 8,
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
......@@ -184,7 +200,7 @@
},
{
"cell_type": "code",
"execution_count": 9,
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
......@@ -219,7 +235,7 @@
},
{
"cell_type": "code",
"execution_count": 10,
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
......@@ -234,77 +250,21 @@
},
{
"cell_type": "code",
"execution_count": 11,
"execution_count": 16,
"metadata": {},
"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"
"ename": "ValueError",
"evalue": "factors in <{'EPS'}> can't be find",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-16-9dbce5b29567>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 9\u001b[0m \u001b[0mfreq\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mfreq\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 10\u001b[0m benchmark=benchmark_code)\n\u001b[1;32m---> 11\u001b[1;33m \u001b[0mstrategy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mprepare_backtest_data\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 12\u001b[0m \u001b[0mret_df\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpositions\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mstrategy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mrunning_setting\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\strategy\\strategy.py\u001b[0m in \u001b[0;36mprepare_backtest_data\u001b[1;34m(self)\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\data\\engines\\sqlengine\\sqlengine_rl.py\u001b[0m in \u001b[0;36mfetch_factor_range\u001b[1;34m(self, universe, factors, start_date, end_date, dates, external_data, used_factor_tables)\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\data\\engines\\utilities.py\u001b[0m in \u001b[0;36m_map_factors\u001b[1;34m(factors, used_factor_tables)\u001b[0m\n",
"\u001b[1;31mValueError\u001b[0m: factors in <{'EPS'}> can't be find"
]
}
],
......@@ -325,30 +285,19 @@
},
{
"cell_type": "code",
"execution_count": 12,
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x192ff3d0eb8>"
"ename": "NameError",
"evalue": "name 'ret_df' is not defined",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-17-abc77a7db1b9>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m ret_df[['excess_return', 'turn_over']].cumsum().plot(figsize=(14, 7),\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[0mtitle\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0;31m'\u001b[0m\u001b[0mFixed\u001b[0m \u001b[0mfreq\u001b[0m \u001b[0mrebalanced\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0mtarget\u001b[0m \u001b[0mvol\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m\\\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0mat\u001b[0m \u001b[1;33m{\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m:\u001b[0m \u001b[1;33m{\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m}\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0mbenchmark\u001b[0m \u001b[1;33m{\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m}\u001b[0m\u001b[0;31m'\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfreq\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mbenchmark_code\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtarget_vol\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m secondary_y='turn_over')\n",
"\u001b[1;31mNameError\u001b[0m: name 'ret_df' is not defined"
]
},
"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": [
......@@ -368,9 +317,9 @@
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"display_name": "Python [conda env:alpha-mind]",
"language": "python",
"name": "python3"
"name": "conda-env-alpha-mind-py"
},
"language_info": {
"codemirror_mode": {
......@@ -382,7 +331,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.3"
"version": "3.7.9"
},
"varInspector": {
"cols": {
......@@ -415,5 +364,5 @@
}
},
"nbformat": 4,
"nbformat_minor": 2
"nbformat_minor": 4
}
......@@ -2,9 +2,7 @@
"cells": [
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"metadata": {},
"source": [
"* 比较不同组合组合优化器在不同规模问题上的性能;\n",
"\n",
......@@ -46,15 +44,15 @@
},
{
"cell_type": "code",
"execution_count": 2,
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"ref_date = '2018-02-08'\n",
"u_names = ['sh50', 'hs300', 'zz500', 'zz800', 'zz1000', 'ashare_ex']\n",
"b_codes = [16, 300, 905, 906, 852, None]\n",
"ref_date = '2020-01-02'\n",
"u_names = ['hs300']\n",
"b_codes = [300]\n",
"risk_model = 'short'\n",
"factor = 'EPS'\n",
"factor = 'EMA5D'\n",
"lb = 0.0\n",
"ub = 0.1\n",
"data_source = os.environ['DB_URI']\n",
......@@ -75,23 +73,19 @@
},
{
"cell_type": "code",
"execution_count": 3,
"execution_count": 5,
"metadata": {},
"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"
"ename": "PortfolioBuilderException",
"evalue": "3",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mPortfolioBuilderException\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-5-5d07b462ee32>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 13\u001b[0m \u001b[0mrisk_target\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0marray\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1.\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0marray\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1.\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 14\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 15\u001b[1;33m \u001b[0mstatus\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mx1\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mlinear_builder\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mer\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlbound\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mubound\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mrisk_constraints\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mrisk_target\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 16\u001b[0m \u001b[0melasped_time1\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtimeit\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtimeit\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"linear_builder(er, lbound, ubound, risk_constraints, risk_target)\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mnumber\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mnumber\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mglobals\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mglobals\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m/\u001b[0m \u001b[0mnumber\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;36m1000\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 17\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\portfolio\\linearbuilder.py\u001b[0m in \u001b[0;36mlinear_builder\u001b[1;34m(er, lbound, ubound, risk_constraints, risk_target, turn_over_target, current_position, method)\u001b[0m\n\u001b[0;32m 46\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[1;34m'optimal'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mprob\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfeval\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mprob\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mx_value\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 47\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 48\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mPortfolioBuilderException\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mprob\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstatus\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 49\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 50\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mmethod\u001b[0m \u001b[1;32min\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;34m\"simplex\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m\"interior\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mPortfolioBuilderException\u001b[0m: 3"
]
}
],
......@@ -139,90 +133,28 @@
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"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,
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"outputs": [],
"source": [
"df"
]
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"-5.262849995706494"
"ename": "NameError",
"evalue": "name 'prob' is not defined",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-6-3b5570823a9d>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mprob\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalue\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;31mNameError\u001b[0m: name 'prob' is not defined"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
......@@ -239,19 +171,19 @@
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 8,
"metadata": {},
"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"
"ename": "PortfolioBuilderException",
"evalue": "3",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mPortfolioBuilderException\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-8-0fed6a1bf8d5>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 27\u001b[0m \u001b[0mturn_over_target\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mturn_over_target\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 28\u001b[0m \u001b[0mcurrent_position\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mcurrent_position\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 29\u001b[1;33m method='interior')\n\u001b[0m\u001b[0;32m 30\u001b[0m elasped_time1 = timeit.timeit(\"\"\"linear_builder(er,\n\u001b[0;32m 31\u001b[0m \u001b[0mlbound\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\portfolio\\linearbuilder.py\u001b[0m in \u001b[0;36mlinear_builder\u001b[1;34m(er, lbound, ubound, risk_constraints, risk_target, turn_over_target, current_position, method)\u001b[0m\n\u001b[0;32m 90\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[1;34m'optimal'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mprob\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfeval\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mprob\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mx_value\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m:\u001b[0m\u001b[0mn\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 91\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 92\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mPortfolioBuilderException\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mprob\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstatus\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 93\u001b[0m \u001b[1;32melif\u001b[0m \u001b[0mmethod\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlower\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m'ecos'\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 94\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mcvxpy\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mProblem\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mPortfolioBuilderException\u001b[0m: 3"
]
}
],
......@@ -357,101 +289,16 @@
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"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,
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"outputs": [],
"source": [
"df"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"metadata": {},
"source": [
"## 3. Mean - Variance 优化 (无约束)\n",
"-----------------------"
......@@ -459,19 +306,44 @@
},
{
"cell_type": "code",
"execution_count": 8,
"execution_count": 9,
"metadata": {},
"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"
"D:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\cvxpy\\expressions\\expression.py:550: UserWarning: \n",
"This use of ``*`` has resulted in matrix multiplication.\n",
"Using ``*`` for matrix multiplication has been deprecated since CVXPY 1.1.\n",
" Use ``*`` for matrix-scalar and vector-scalar multiplication.\n",
" Use ``@`` for matrix-matrix and matrix-vector multiplication.\n",
" Use ``multiply`` for elementwise multiplication.\n",
"\n",
" warnings.warn(__STAR_MATMUL_WARNING__, UserWarning)\n",
"D:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\cvxpy\\expressions\\expression.py:550: UserWarning: \n",
"This use of ``*`` has resulted in matrix multiplication.\n",
"Using ``*`` for matrix multiplication has been deprecated since CVXPY 1.1.\n",
" Use ``*`` for matrix-scalar and vector-scalar multiplication.\n",
" Use ``@`` for matrix-matrix and matrix-vector multiplication.\n",
" Use ``multiply`` for elementwise multiplication.\n",
"\n",
" warnings.warn(__STAR_MATMUL_WARNING__, UserWarning)\n"
]
},
{
"ename": "SolverError",
"evalue": "Solver 'ECOS' failed. Try another solver, or solve with verbose=True for more information.",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mSolverError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-9-07e9404e845e>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 26\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 27\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 28\u001b[1;33m lam=1)\n\u001b[0m\u001b[0;32m 29\u001b[0m elasped_time1 = timeit.timeit(\"\"\"mean_variance_builder(er,\n\u001b[0;32m 30\u001b[0m \u001b[0mrisk_model\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\portfolio\\meanvariancebuilder.py\u001b[0m in \u001b[0;36mmean_variance_builder\u001b[1;34m(er, risk_model, bm, lbound, ubound, risk_exposure, risk_target, lam, linear_solver)\u001b[0m\n\u001b[0;32m 75\u001b[0m \u001b[0mobjective\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcvxpy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mMinimize\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m-\u001b[0m\u001b[0mw\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mT\u001b[0m \u001b[1;33m*\u001b[0m \u001b[0mer\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;36m0.5\u001b[0m \u001b[1;33m*\u001b[0m \u001b[0mlam\u001b[0m \u001b[1;33m*\u001b[0m \u001b[0mrisk\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 76\u001b[0m \u001b[0mprob\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcvxpy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mProblem\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mobjective\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 77\u001b[1;33m \u001b[0mprob\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msolve\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msolver\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'ECOS'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfeastol\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m1e-9\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mabstol\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m1e-9\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mreltol\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m1e-9\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 78\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 79\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mprob\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstatus\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m'optimal'\u001b[0m \u001b[1;32mor\u001b[0m \u001b[0mprob\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstatus\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m'optimal_inaccurate'\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\cvxpy\\problems\\problem.py\u001b[0m in \u001b[0;36msolve\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 394\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 395\u001b[0m \u001b[0msolve_func\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mProblem\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_solve\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 396\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0msolve_func\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 397\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 398\u001b[0m \u001b[1;33m@\u001b[0m\u001b[0mclassmethod\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\cvxpy\\problems\\problem.py\u001b[0m in \u001b[0;36m_solve\u001b[1;34m(self, solver, warm_start, verbose, gp, qcp, requires_grad, enforce_dpp, **kwargs)\u001b[0m\n\u001b[0;32m 752\u001b[0m solution = solving_chain.solve_via_data(\n\u001b[0;32m 753\u001b[0m self, data, warm_start, verbose, kwargs)\n\u001b[1;32m--> 754\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0munpack_results\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msolution\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msolving_chain\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0minverse_data\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 755\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalue\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 756\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\cvxpy\\problems\\problem.py\u001b[0m in \u001b[0;36munpack_results\u001b[1;34m(self, solution, chain, inverse_data)\u001b[0m\n\u001b[0;32m 1066\u001b[0m raise error.SolverError(\n\u001b[0;32m 1067\u001b[0m \u001b[1;34m\"Solver '%s' failed. \"\u001b[0m \u001b[1;33m%\u001b[0m \u001b[0mchain\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msolver\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m+\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1068\u001b[1;33m \u001b[1;34m\"Try another solver, or solve with verbose=True for more \"\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1069\u001b[0m \"information.\")\n\u001b[0;32m 1070\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0munpack\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msolution\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mSolverError\u001b[0m: Solver 'ECOS' failed. Try another solver, or solve with verbose=True for more information."
]
}
],
......@@ -535,72 +407,9 @@
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"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,
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"outputs": [],
"source": [
"df"
]
......@@ -622,12 +431,21 @@
"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"
"D:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\ipykernel\\ipkernel.py:287: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n",
" and should_run_async(code)\n"
]
},
{
"ename": "PortfolioBuilderException",
"evalue": "-13",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mPortfolioBuilderException\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-10-8f6e73d51fb2>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 24\u001b[0m \u001b[0mubound\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 25\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 26\u001b[1;33m None)\n\u001b[0m\u001b[0;32m 27\u001b[0m elasped_time1 = timeit.timeit(\"\"\"mean_variance_builder(er,\n\u001b[0;32m 28\u001b[0m \u001b[0mrisk_model\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\portfolio\\meanvariancebuilder.py\u001b[0m in \u001b[0;36mmean_variance_builder\u001b[1;34m(er, risk_model, bm, lbound, ubound, risk_exposure, risk_target, lam, linear_solver)\u001b[0m\n\u001b[0;32m 95\u001b[0m linear_solver=linear_solver)\n\u001b[0;32m 96\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 97\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0m_create_result\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0moptimizer\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mbm\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 98\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 99\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\portfolio\\meanvariancebuilder.py\u001b[0m in \u001b[0;36m_create_result\u001b[1;34m(optimizer, bm)\u001b[0m\n\u001b[0;32m 45\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[1;34m'optimal'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0moptimizer\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfeval\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0moptimizer\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mx_value\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0mbm\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 46\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 47\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mPortfolioBuilderException\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0moptimizer\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstatus\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 48\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 49\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mPortfolioBuilderException\u001b[0m: -13"
]
}
],
......@@ -693,6 +511,14 @@
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"D:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\ipykernel\\ipkernel.py:287: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n",
" and should_run_async(code)\n"
]
},
{
"data": {
"text/html": [
......@@ -714,41 +540,26 @@
" <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",
" <td>NaN</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",
" <td>NaN</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"
" hs300\n",
"cvxpy NaN\n",
"alphamind NaN"
]
},
"execution_count": 11,
......@@ -777,12 +588,21 @@
"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"
"D:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\ipykernel\\ipkernel.py:287: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n",
" and should_run_async(code)\n"
]
},
{
"ename": "PortfolioBuilderException",
"evalue": "-13",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mPortfolioBuilderException\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-12-0c4eaa49b968>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 27\u001b[0m \u001b[0mubound\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 28\u001b[0m \u001b[0mrisk_constraints\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 29\u001b[1;33m risk_target)\n\u001b[0m\u001b[0;32m 30\u001b[0m elasped_time1 = timeit.timeit(\"\"\"mean_variance_builder(er,\n\u001b[0;32m 31\u001b[0m \u001b[0mrisk_model\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\portfolio\\meanvariancebuilder.py\u001b[0m in \u001b[0;36mmean_variance_builder\u001b[1;34m(er, risk_model, bm, lbound, ubound, risk_exposure, risk_target, lam, linear_solver)\u001b[0m\n\u001b[0;32m 95\u001b[0m linear_solver=linear_solver)\n\u001b[0;32m 96\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 97\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0m_create_result\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0moptimizer\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mbm\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 98\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 99\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\portfolio\\meanvariancebuilder.py\u001b[0m in \u001b[0;36m_create_result\u001b[1;34m(optimizer, bm)\u001b[0m\n\u001b[0;32m 45\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[1;34m'optimal'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0moptimizer\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfeval\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0moptimizer\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mx_value\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0mbm\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 46\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 47\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mPortfolioBuilderException\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0moptimizer\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstatus\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 48\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 49\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mPortfolioBuilderException\u001b[0m: -13"
]
}
],
......@@ -874,41 +694,26 @@
" <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",
" <td>NaN</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",
" <td>NaN</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"
" hs300\n",
"cvxpy NaN\n",
"alphamind NaN"
]
},
"execution_count": 13,
......@@ -937,12 +742,21 @@
"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"
"D:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\ipykernel\\ipkernel.py:287: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n",
" and should_run_async(code)\n"
]
},
{
"ename": "PortfolioBuilderException",
"evalue": "-13",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mPortfolioBuilderException\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-14-d727a7f2ff85>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 32\u001b[0m \u001b[0mrisk_constraints\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 33\u001b[0m \u001b[0mrisk_target\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 34\u001b[1;33m vol_target=target_vol)\n\u001b[0m\u001b[0;32m 35\u001b[0m elasped_time1 = timeit.timeit(\"\"\"target_vol_builder(er,\n\u001b[0;32m 36\u001b[0m \u001b[0mrisk_model\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\portfolio\\meanvariancebuilder.py\u001b[0m in \u001b[0;36mtarget_vol_builder\u001b[1;34m(er, risk_model, bm, lbound, ubound, risk_exposure, risk_target, vol_target, linear_solver)\u001b[0m\n\u001b[0;32m 123\u001b[0m linear_solver=linear_solver)\n\u001b[0;32m 124\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 125\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0m_create_result\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0moptimizer\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mbm\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\portfolio\\meanvariancebuilder.py\u001b[0m in \u001b[0;36m_create_result\u001b[1;34m(optimizer, bm)\u001b[0m\n\u001b[0;32m 45\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[1;34m'optimal'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0moptimizer\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfeval\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0moptimizer\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mx_value\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0mbm\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 46\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 47\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mPortfolioBuilderException\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0moptimizer\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstatus\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 48\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 49\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mPortfolioBuilderException\u001b[0m: -13"
]
}
],
......@@ -1041,41 +855,26 @@
" <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",
" <td>NaN</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",
" <td>NaN</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"
" hs300\n",
"cvxpy NaN\n",
"alphamind NaN"
]
},
"execution_count": 15,
......@@ -1097,9 +896,9 @@
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"display_name": "Python [conda env:alpha-mind]",
"language": "python",
"name": "python3"
"name": "conda-env-alpha-mind-py"
},
"language_info": {
"codemirror_mode": {
......@@ -1111,7 +910,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
"version": "3.7.9"
},
"varInspector": {
"cols": {
......@@ -1151,5 +950,5 @@
}
},
"nbformat": 4,
"nbformat_minor": 2
"nbformat_minor": 4
}
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* 请在环境变量中设置`DB_URI`指向数据库\n",
"* 请在环境变量中设置`DATAYES_TOKEN`作为通联数据登陆凭证"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import os\n",
"from matplotlib import pyplot as plt\n",
"import uqer\n",
"import numpy as np\n",
"import pandas as pd\n",
"from uqer import DataAPI as api\n",
"from alphamind.api import *\n",
"from alphamind.data.neutralize import neutralize\n",
"\n",
"plt.style.use('ggplot')"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"512647@wmcloud.com 账号登录成功\n"
]
}
],
"source": [
"_ = uqer.Client(token=os.environ['DATAYES_TOKEN'])"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"ref_date = '2017-06-23'\n",
"factor = 'EPS'\n",
"\n",
"engine = SqlEngine(os.environ['DB_URI'])\n",
"universe = Universe('zz800')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Algorithm Description\n",
"--------------------------"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"猜测的 ``neutralize`` 残差$\\bar Res$计算公式:\n",
"\n",
"$$\\bar Res_{i,k} = \\bar f_{i,k} - \\sum_j \\beta_{j,k} \\times \\bar Ex_{i, j, k}$$\n",
"\n",
"其中:$k$为行业分类,$i$为该行业中第$i$只股票,$j$为第$j$个风险因子。$\\bar f$为因子序列,$\\bar Ex$为风险暴露矩阵。系数$\\beta_{j,k}$由OLS确定。\n",
"\n",
"下面的章节,我们分别比较三种``neutralize``的方法差别:\n",
"\n",
"* **UQER Neutralize**\n",
"\n",
" 使用优矿的SDK计算因子残差。\n",
"\n",
"\n",
"* **Alpha-Mind Neutralize**\n",
"\n",
" 使用alpha-mind计算因子残差,alpha-mind可以由以下地址安装:\n",
" \n",
" ```\n",
" https://github.com/wegamekinglc/alpha-mind\n",
" ```\n",
"\n",
"* **Direct Weighted Least Square Fit Implementation**\n",
"\n",
" 直接使用scikit-learn的线性回归功能来计算因子残差。\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Raw Data\n",
"---------------------------"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"codes = engine.fetch_codes(ref_date, universe)\n",
"factor_data = engine.fetch_factor(ref_date, factor, codes)\n",
"risk_cov, risk_expousre = engine.fetch_risk_model(ref_date, codes)\n",
"total_data = pd.merge(factor_data, risk_expousre, on=['code']).dropna()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"total_data['ticker'] = total_data.code.apply(lambda x: '{0:06}'.format(x))\n",
"total_data.set_index('ticker', inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"800"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(total_data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# UQER Neutralize\n",
"-----------------------"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"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": [
"%%timeit\n",
"neutralized_factor_uqer = uqer.neutralize(total_data[factor],\n",
" target_date=ref_date.replace('-', ''),\n",
" industry_type='short')"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {},
"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": [
"neutralized_factor_uqer = uqer.neutralize(total_data[factor],\n",
" target_date=ref_date.replace('-', ''),\n",
" industry_type='short').sort_index()\n",
"df = pd.DataFrame(neutralized_factor_uqer, columns=['uqer'])\n",
"df.head(10)"
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"800"
]
},
"execution_count": 69,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(neutralized_factor_uqer)"
]
},
{
"cell_type": "code",
"execution_count": 70,
"metadata": {
"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": [
"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",
"\n",
"style_exposure = neutralized_factor_uqer.values @ targeted_secs[risk_styles].values\n",
"industry_exposure = neutralized_factor_uqer.values @ targeted_secs[industry_styles].values\n",
"\n",
"exposure = pd.Series(np.concatenate([style_exposure, industry_exposure]), index=risk_styles+industry_styles)\n",
"exposure"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Alpha-Mind Neutralize\n",
"--------------------------"
]
},
{
"cell_type": "code",
"execution_count": 71,
"metadata": {},
"outputs": [],
"source": [
"x = targeted_secs[risk_styles + industry_styles].values\n",
"y = total_data[factor].values"
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {},
"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": [
"%%timeit\n",
"neutralized_factor_alphamind = neutralize(x, y, weights=np.ones(len(y)))"
]
},
{
"cell_type": "code",
"execution_count": 73,
"metadata": {},
"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": [
"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",
"df['alpha-mind'] = alphamind_series\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 74,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"800"
]
},
"execution_count": 74,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"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",
"metadata": {},
"source": [
"# The Ticker Missing in UQER but Still in Alpha-Mind\n",
"-----------------------------------"
]
},
{
"cell_type": "code",
"execution_count": 78,
"metadata": {},
"outputs": [],
"source": [
"missed_codes = [c for c in alphamind_series.index if c not in neutralized_factor_uqer.index]"
]
},
{
"cell_type": "code",
"execution_count": 79,
"metadata": {},
"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": [
"total_data.loc[missed_codes]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Direct Weighted Least Square Fit Implementation\n",
"------------------------"
]
},
{
"cell_type": "code",
"execution_count": 80,
"metadata": {},
"outputs": [],
"source": [
"import statsmodels.api as sm"
]
},
{
"cell_type": "code",
"execution_count": 81,
"metadata": {},
"outputs": [],
"source": [
"mod = sm.WLS(y, x, weights=np.ones(len(y))).fit()\n",
"lg_series = pd.Series(mod.resid, index=total_data.index)"
]
},
{
"cell_type": "code",
"execution_count": 82,
"metadata": {},
"outputs": [],
"source": [
"df['ols'] = lg_series"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Comparison\n",
"------------------"
]
},
{
"cell_type": "code",
"execution_count": 83,
"metadata": {},
"outputs": [],
"source": [
"df['uqer - ols'] = df['uqer'] - df['ols']\n",
"df['alphamind - ols'] = df['alpha-mind'] - df['ols']"
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x2310007acf8>"
]
},
"execution_count": 84,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA10AAAGfCAYAAACkxLjJAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3X+YXWV99/v3kJEQjwJJBpQE1FByHonn0SAI8ccpNCSYYCWI+BX8FWraqMVDJVd9gMJVngKegiAU688ISODyEb8iSrwKxkBQe6oIFKU2cqjhhyYOlYYA2oMkTdjnj3VPmAx7z0wye2XvkPfruubKXve+173Wmm9mz/7MvdbaPY1GA0mSJElSPfbo9A5IkiRJ0guZoUuSJEmSamTokiRJkqQaGbokSZIkqUaGLkmSJEmqkaFLkiRJkmrU245BImIecCUwDrgqMy8e8vx44DrgcOBx4N2Z+Uh57hxgEbAFOCMzVww3ZkR8FPgY8AfAfpm5vrT3lP7HA08Dp2XmveW5hcB5ZXcuysxl7ThuSZIkSRrJmGe6ImIc8FlgPjADODUiZgzptgh4IjMPAa4ALinrzgBOAV4DzAM+FxHjRhjzn4A5wC+HbGM+ML18LQY+X7YxCTgfOAo4Ejg/IiaO9bglSZIkaTTacXrhkcCazHwoMzcBNwALhvRZAAzMLt0IHFtmphYAN2Tmxsx8GFhTxms5Zmb+ZGCWrMk2rsvMRmbeCewbEQcAbwVWZuaGzHwCWEkV8CRJkiSpdu04vXAqsHbQ8jqqWaWmfTJzc0Q8BUwu7XcOWXdqeTzSmKPZj6nDtD9PRCymmiUjMw8fYXuSJEmS1DNSh3aErmYbaYyyT6v2ZjNwQ8cc7X6MZv8AyMylwNKBPv39/SNsUnXr6+tj/fr1nd6N3Zo16A7WoTtYh+5gHTrPGnQH69B5U6ZMGVW/dpxeuA44aNDygcDQtLK1T0T0AvsAG4ZZdzRjjnY/dmQsSZIkSWqLdsx03Q1Mj4hpwK+pbozxniF9lgMLgR8BJwOrMrMREcuB/xURlwNTqG6CcRfV7NRIYw61HPhoRNxAdSriU5n5aESsAP7vQTfPOA44Z0xHLEmSJEmjNOaZrszcDHwUWAHcXzXl6oi4ICJOKN2uBiZHxBpgCXB2WXc1kMDPge8Ap2fmllZjAkTEGRGxjmrG6l8i4qqyjVuAh6huxvEl4M/LNjYAF1KFw7uBC0qbJEmSJNWup9EY6VKp3ZbXdHUBz1XuPGvQHaxDd7AO3cE6dJ412H6NRoNnnnmGZ599lp6eEe+7MCrjx49n48aNbRlLrTUaDfbYYw/22muv59WuXNO1U26kIUmSJGkYzzzzDC960Yvo7W3f2+/e3l7GjRvXtvHU2ubNm3nmmWeYMGHCDq3fjhtpSJIkSRrGs88+29bApZ2rt7eXZ599dofXN3RJkiRJNWvXKYXqnLHU0NAlSZIkSTUydEmSJEnqmLVr1zJ79uxO70atDF2SJEmSdsiWLVs6vQu7BEOXJEmS9AI3dDbpC1/4Ap/61KcA+Jd/+RfmzJnD29/+di688MKt/bZs2cKFF17I8ccfz5w5c7j++usB+OEPf8jJJ5/M6aefzrHHHjvqfWg0GlvHP/bYY7n55puf1+eBBx7gbW97G3PnzmXOnDk89NBDYznsruEtVCRJkqSd6NkbvkRj7cNjH6enh4HP3O05aBp7nPJnOzTOkiVLuPDCC3njG9/IhRdeuLX9q1/9Ki996Uu55ZZb2LhxIyeeeCJHH300AD/96U9ZtWoVr3jFK0a9nVtuuYXVq1ezcuVKNmzYwPHHH8+sWbO26XP99dezaNEiTjrpJDZt2vSCmUkzdEmSJEm7qd/+9rc89dRTvPGNbwTgne98J3fccQcA3//+97n//vv5h3/4BwB+97vf8fDDD/OiF72ImTNnblfgArjrrrs48cQTGTduHPvttx+zZs3ivvvu49BDD93a5/DDD+fTn/40jz76KPPnz+fggw9u05F2lqFLkiRJ2ol2dEZqqN7eXjZv3jyqvuPGjdvmc6aeeeYZoDrlb7hboV900UUcc8wx27T98Ic/5MUvfnHT/rfeeiuXX345AJdddhmve93rtj43MCs3nHe84x0cdthh3H777bz3ve/l0ksv5S1vecuI63U7r+mSJEmSXuD2228/1q9fz4YNG9i4cSO33XYbAPvssw977703d911FwDf/OY3t65z9NFHc9111/Ff//VfADz44IM8/fTTw25n/vz5rFy5kpUrV24TuABmzZrF8uXL2bJlC48//jg//vGPmTlz5jZ9fvnLX/LKV76SRYsWMXfuXO6///4xH3s3cKZLkiRJeoF70YtexJlnnsnb3/52DjroIA455JCtz11++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": [
"df[['uqer - ols', 'alphamind - ols']].plot(figsize=(14, 7), ylim=(-1e-4, 1e-4))"
]
},
{
"cell_type": "code",
"execution_count": 85,
"metadata": {},
"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": [
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 2
}
......@@ -14,7 +14,7 @@
},
{
"cell_type": "code",
"execution_count": 10,
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
......@@ -46,7 +46,7 @@
" np.random.seed(1)\n",
" er = np.random.randn(n)\n",
"\n",
" objective = cvxpy.Minimize(-w.T * er)\n",
" objective = cvxpy.Minimize(-w.T @ er)\n",
" prob = cvxpy.Problem(objective, constraints)\n",
" prob.solve(solver='ECOS')\n",
" return w, prob"
......@@ -54,7 +54,7 @@
},
{
"cell_type": "code",
"execution_count": 11,
"execution_count": 5,
"metadata": {},
"outputs": [
{
......@@ -62,21 +62,21 @@
"output_type": "stream",
"text": [
"Scale(n) time(ms) feval min(x) max(x) sum(x) x(0) + x(1)\n",
"200 8.98 -0.82 -0.000000 0.010000 1.0000000.014999999999355636\n",
"400 10.97 -1.28 -0.000000 0.010000 1.0000000.014999999999977868\n",
"600 12.01 -1.54 -0.000000 0.010000 1.0000000.014999999999630973\n",
"800 11.93 -1.63 -0.000000 0.010000 1.0000000.014999999999937863\n",
"1000 12.00 -1.72 -0.000000 0.010000 1.0000000.014999999999985369\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",
"2000 22.93 -2.06 -0.000000 0.010000 1.0000000.014999999999994327\n",
"2200 21.92 -2.07 -0.000000 0.010000 1.0000000.014999999999979582\n",
"2400 25.90 -2.13 -0.000000 0.010000 1.0000000.014999999999836155\n",
"2600 29.93 -2.14 -0.000000 0.010000 1.0000000.01499999999985058\n",
"2800 28.87 -2.16 -0.000000 0.010000 1.0000000.014999999999853686\n",
"3000 32.96 -2.19 -0.000000 0.010000 1.0000000.014999999999981861\n"
"200 23.15 -0.82 -0.000000 0.010000 1.0000000.014999999999355636\n",
"400 29.00 -1.28 -0.000000 0.010000 1.0000000.014999999999977868\n",
"600 31.04 -1.54 -0.000000 0.010000 1.0000000.014999999999630973\n",
"800 37.00 -1.63 -0.000000 0.010000 1.0000000.014999999999937863\n",
"1000 42.99 -1.72 -0.000000 0.010000 1.0000000.014999999999985369\n",
"1200 83.97 -1.81 -0.000000 0.010000 1.0000000.014999999999661145\n",
"1400 121.77 -1.90 -0.000000 0.010000 1.0000000.014999999999617875\n",
"1600 125.93 -1.96 -0.000000 0.010000 1.0000000.01499999999998295\n",
"1800 75.05 -2.03 -0.000000 0.010000 1.0000000.014999999999785373\n",
"2000 45.95 -2.06 -0.000000 0.010000 1.0000000.014999999999994327\n",
"2200 68.05 -2.07 -0.000000 0.010000 1.0000000.014999999999979582\n",
"2400 144.36 -2.13 -0.000000 0.010000 1.0000000.014999999999836155\n",
"2600 140.00 -2.14 -0.000000 0.010000 1.0000000.01499999999985058\n",
"2800 145.48 -2.16 -0.000000 0.010000 1.0000000.014999999999853686\n",
"3000 125.97 -2.19 -0.000000 0.010000 1.0000000.014999999999981861\n"
]
}
],
......@@ -91,7 +91,7 @@
},
{
"cell_type": "code",
"execution_count": 4,
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
......@@ -114,7 +114,7 @@
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": 7,
"metadata": {},
"outputs": [
{
......@@ -122,21 +122,21 @@
"output_type": "stream",
"text": [
"Scale(n) time(ms) feval min(x) max(x) sum(x) x(0) + x(1)\n",
"200 2.00 -0.82 0.000000 0.010000 1.0000000.015000000005429394\n",
"400 4.00 -1.28 0.000000 0.010000 1.0000000.015000000000751215\n",
"600 4.02 -1.54 0.000000 0.010000 1.0000000.01500000000851949\n",
"800 3.99 -1.63 0.000000 0.010000 1.0000000.015000000002481837\n",
"1000 7.94 -1.72 0.000000 0.010000 1.0000000.015000000001100414\n",
"1200 5.03 -1.81 0.000000 0.010000 1.0000000.01500000000548405\n",
"1400 8.94 -1.90 0.000000 0.010000 1.0000000.015000000001956426\n",
"1600 8.02 -1.96 0.000000 0.010000 1.0000000.015000000000082848\n",
"1800 9.98 -2.03 0.000000 0.010000 1.0000000.01500000000204834\n",
"2000 9.97 -2.06 0.000000 0.010000 1.0000000.0150000000008303\n",
"2200 14.91 -2.07 0.000000 0.010000 1.0000000.01500000000729576\n",
"2400 12.97 -2.13 0.000000 0.010000 1.0000000.015000000004022507\n",
"2600 15.96 -2.14 0.000000 0.010000 1.0000000.015000000001118521\n",
"2800 19.92 -2.16 0.000000 0.010000 1.0000000.01500000000064263\n",
"3000 21.93 -2.19 0.000000 0.010000 1.0000000.015000000003030482\n"
"200 4.00 -0.82 0.000000 0.010000 1.0000000.015000000005429394\n",
"400 5.38 -1.28 0.000000 0.010000 1.0000000.015000000000751215\n",
"600 5.02 -1.54 0.000000 0.010000 1.0000000.01500000000851949\n",
"800 7.89 -1.63 0.000000 0.010000 1.0000000.015000000002481837\n",
"1000 7.97 -1.72 0.000000 0.010000 1.0000000.015000000001100414\n",
"1200 14.04 -1.81 0.000000 0.010000 1.0000000.01500000000548405\n",
"1400 13.85 -1.90 0.000000 0.010000 1.0000000.015000000001956426\n",
"1600 20.96 -1.96 0.000000 0.010000 1.0000000.015000000000082848\n",
"1800 26.95 -2.03 0.000000 0.010000 1.0000000.01500000000204834\n",
"2000 25.59 -2.06 0.000000 0.010000 1.0000000.0150000000008303\n",
"2200 27.25 -2.07 0.000000 0.010000 1.0000000.01500000000729576\n",
"2400 13.10 -2.13 0.000000 0.010000 1.0000000.015000000004022507\n",
"2600 19.00 -2.14 0.000000 0.010000 1.0000000.015000000001118521\n",
"2800 30.60 -2.16 0.000000 0.010000 1.0000000.01500000000064263\n",
"3000 25.00 -2.19 0.000000 0.010000 1.0000000.015000000003030482\n"
]
}
],
......@@ -159,9 +159,9 @@
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"display_name": "Python [conda env:alpha-mind]",
"language": "python",
"name": "python3"
"name": "conda-env-alpha-mind-py"
},
"language_info": {
"codemirror_mode": {
......@@ -173,7 +173,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
"version": "3.7.9"
},
"varInspector": {
"cols": {
......@@ -206,5 +206,5 @@
}
},
"nbformat": 4,
"nbformat_minor": 2
"nbformat_minor": 4
}
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -2,9 +2,7 @@
"cells": [
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"metadata": {},
"source": [
"alpha-mind的data文件夹提供了对于因子数据进行排序和求分位数的工具函数"
]
......@@ -53,71 +51,71 @@
" <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",
" <td>0.161516</td>\n",
" <td>0.400066</td>\n",
" <td>0.0</td>\n",
" <td>5.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",
" <td>0.713214</td>\n",
" <td>0.742485</td>\n",
" <td>9.0</td>\n",
" <td>8.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",
" <td>0.613470</td>\n",
" <td>0.492425</td>\n",
" <td>7.0</td>\n",
" <td>6.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0.652818</td>\n",
" <td>0.733896</td>\n",
" <td>0.440124</td>\n",
" <td>0.701836</td>\n",
" <td>4.0</td>\n",
" <td>6.0</td>\n",
" <td>7.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",
" <td>0.301544</td>\n",
" <td>0.180132</td>\n",
" <td>2.0</td>\n",
" <td>2.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>0.505832</td>\n",
" <td>0.069305</td>\n",
" <td>5.0</td>\n",
" <td>1.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>0.513519</td>\n",
" <td>0.354891</td>\n",
" <td>6.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",
" <td>0.206737</td>\n",
" <td>0.061027</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>0.346298</td>\n",
" <td>0.754176</td>\n",
" <td>0.437573</td>\n",
" <td>0.916369</td>\n",
" <td>3.0</td>\n",
" <td>7.0</td>\n",
" <td>9.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>0.950355</td>\n",
" <td>0.196379</td>\n",
" <td>0.670278</td>\n",
" <td>0.299662</td>\n",
" <td>8.0</td>\n",
" <td>3.0</td>\n",
" </tr>\n",
......@@ -127,16 +125,16 @@
],
"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"
"0 0.161516 0.400066 0.0 5.0\n",
"1 0.713214 0.742485 9.0 8.0\n",
"2 0.613470 0.492425 7.0 6.0\n",
"3 0.440124 0.701836 4.0 7.0\n",
"4 0.301544 0.180132 2.0 2.0\n",
"5 0.505832 0.069305 5.0 1.0\n",
"6 0.513519 0.354891 6.0 4.0\n",
"7 0.206737 0.061027 1.0 0.0\n",
"8 0.437573 0.916369 3.0 9.0\n",
"9 0.670278 0.299662 8.0 3.0"
]
},
"execution_count": 1,
......@@ -191,53 +189,53 @@
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0.898683</td>\n",
" <td>0.990521</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.366384</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0.751189</td>\n",
" <td>3</td>\n",
" <td>0.098782</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0.699054</td>\n",
" <td>0.644139</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.790434</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>0.937173</td>\n",
" <td>4</td>\n",
" <td>0.775871</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>0.559328</td>\n",
" <td>0</td>\n",
" <td>0.871524</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>0.753076</td>\n",
" <td>2</td>\n",
" <td>0.910101</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>0.657790</td>\n",
" <td>0.863434</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>0.782689</td>\n",
" <td>3</td>\n",
" <td>0.923118</td>\n",
" <td>4</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
......@@ -245,16 +243,16 @@
],
"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"
"0 0.990521 4\n",
"1 0.366384 1\n",
"2 0.098782 0\n",
"3 0.644139 2\n",
"4 0.790434 3\n",
"5 0.775871 0\n",
"6 0.871524 2\n",
"7 0.910101 3\n",
"8 0.863434 1\n",
"9 0.923118 4"
]
},
"execution_count": 2,
......@@ -316,63 +314,63 @@
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0.898683</td>\n",
" <td>0.990521</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.366384</td>\n",
" <td>1</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",
" <td>0.098782</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0.699054</td>\n",
" <td>2</td>\n",
" <td>0.644139</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0.332965</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0.790434</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>0.937173</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>0.775871</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>0.559328</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0.871524</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>0.753076</td>\n",
" <td>2</td>\n",
" <td>0.910101</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>0.657790</td>\n",
" <td>1</td>\n",
" <td>0.863434</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>0.782689</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>0.923118</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
......@@ -380,16 +378,16 @@
],
"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"
"0 0.990521 4 4\n",
"1 0.366384 1 0\n",
"2 0.098782 0 0\n",
"3 0.644139 2 1\n",
"4 0.790434 3 2\n",
"5 0.775871 0 1\n",
"6 0.871524 2 3\n",
"7 0.910101 3 3\n",
"8 0.863434 1 2\n",
"9 0.923118 4 4"
]
},
"execution_count": 3,
......@@ -414,9 +412,9 @@
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"display_name": "Python [conda env:alpha-mind]",
"language": "python",
"name": "python3"
"name": "conda-env-alpha-mind-py"
},
"language_info": {
"codemirror_mode": {
......@@ -428,9 +426,9 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
"version": "3.7.9"
}
},
"nbformat": 4,
"nbformat_minor": 1
"nbformat_minor": 4
}
......@@ -2,9 +2,7 @@
"cells": [
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"metadata": {},
"source": [
"alpha-mind的portfolio文件夹提供了构建组合的工具函数。\n",
"- 不同的构建方式实质上对应了不同的优化问题。\n",
......@@ -33,10 +31,24 @@
"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"
"Optimal expect return - 0.750529042208698\n",
"Optimial portfolio weights - [0.1 0.2 0.05 0.4 0.25]\n",
"Initial portfolio weights - [0.1 0.2 0. 0.4 0.3]\n",
"Turn over amount - 0.10000000000050759\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"D:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\cvxpy\\expressions\\expression.py:550: UserWarning: \n",
"This use of ``*`` has resulted in matrix multiplication.\n",
"Using ``*`` for matrix multiplication has been deprecated since CVXPY 1.1.\n",
" Use ``*`` for matrix-scalar and vector-scalar multiplication.\n",
" Use ``@`` for matrix-matrix and matrix-vector multiplication.\n",
" Use ``multiply`` for elementwise multiplication.\n",
"\n",
" warnings.warn(__STAR_MATMUL_WARNING__, UserWarning)\n"
]
}
],
......@@ -183,7 +195,16 @@
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"D:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\importlib\\_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n",
" return f(*args, **kwds)\n"
]
}
],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
......@@ -260,9 +281,9 @@
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"display_name": "Python [conda env:alpha-mind]",
"language": "python",
"name": "python3"
"name": "conda-env-alpha-mind-py"
},
"language_info": {
"codemirror_mode": {
......@@ -274,7 +295,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
"version": "3.7.9"
},
"varInspector": {
"cols": {
......@@ -307,5 +328,5 @@
}
},
"nbformat": 4,
"nbformat_minor": 1
"nbformat_minor": 4
}
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
......@@ -23,13 +23,13 @@
},
{
"cell_type": "code",
"execution_count": 33,
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"universe_name = 'zz1000'\n",
"formula = CSTopN(LAST('ROE'), 3, groups='sw1')\n",
"ref_date = '2019-02-14'"
"universe_name = 'hs300'\n",
"formula = CSTopN(LAST('EMA5D'), 3)\n",
"ref_date = '2020-01-02'"
]
},
{
......@@ -42,7 +42,7 @@
},
{
"cell_type": "code",
"execution_count": 35,
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
......@@ -54,7 +54,7 @@
},
{
"cell_type": "code",
"execution_count": 43,
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
......@@ -73,7 +73,7 @@
},
{
"cell_type": "code",
"execution_count": 44,
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
......@@ -82,7 +82,7 @@
},
{
"cell_type": "code",
"execution_count": 45,
"execution_count": 6,
"metadata": {},
"outputs": [
{
......@@ -114,381 +114,30 @@
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>16</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>34</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>43</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>55</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>429</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>516</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>520</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>639</td>\n",
" <td>2010000438</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>672</td>\n",
" <td>2010001184</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>789</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>881</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>885</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>892</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>918</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>968</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>2016</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>2033</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>2035</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>2061</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>2071</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>2168</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>2182</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>2234</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>2327</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>2343</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>2396</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>2518</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>2597</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>2626</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>2677</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>600231</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>600382</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>600569</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>600581</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>600596</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>600677</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>600681</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>600740</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>600763</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>600803</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>600828</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>603043</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>603055</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>603113</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>603165</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>603180</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>603305</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>603323</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>603399</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>603517</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>603587</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>603595</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>603596</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>603609</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>603660</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>603666</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>603708</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>603730</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>603773</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>603848</td>\n",
" <td>2010019213</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>82 rows × 2 columns</p>\n",
"</div>"
],
"text/plain": [
" factor code\n",
"1 1.0 16\n",
"1 1.0 34\n",
"1 1.0 43\n",
"1 1.0 55\n",
"1 1.0 429\n",
"1 1.0 516\n",
"1 1.0 520\n",
"1 1.0 639\n",
"1 1.0 672\n",
"1 1.0 789\n",
"1 1.0 881\n",
"1 1.0 885\n",
"1 1.0 892\n",
"1 1.0 918\n",
"1 1.0 968\n",
"1 1.0 2016\n",
"1 1.0 2033\n",
"1 1.0 2035\n",
"1 1.0 2061\n",
"1 1.0 2071\n",
"1 1.0 2168\n",
"1 1.0 2182\n",
"1 1.0 2234\n",
"1 1.0 2327\n",
"1 1.0 2343\n",
"1 1.0 2396\n",
"1 1.0 2518\n",
"1 1.0 2597\n",
"1 1.0 2626\n",
"1 1.0 2677\n",
".. ... ...\n",
"1 1.0 600231\n",
"1 1.0 600382\n",
"1 1.0 600569\n",
"1 1.0 600581\n",
"1 1.0 600596\n",
"1 1.0 600677\n",
"1 1.0 600681\n",
"1 1.0 600740\n",
"1 1.0 600763\n",
"1 1.0 600803\n",
"1 1.0 600828\n",
"1 1.0 603043\n",
"1 1.0 603055\n",
"1 1.0 603113\n",
"1 1.0 603165\n",
"1 1.0 603180\n",
"1 1.0 603305\n",
"1 1.0 603323\n",
"1 1.0 603399\n",
"1 1.0 603517\n",
"1 1.0 603587\n",
"1 1.0 603595\n",
"1 1.0 603596\n",
"1 1.0 603609\n",
"1 1.0 603660\n",
"1 1.0 603666\n",
"1 1.0 603708\n",
"1 1.0 603730\n",
"1 1.0 603773\n",
"1 1.0 603848\n",
"\n",
"[82 rows x 2 columns]"
"1 1.0 2010000438\n",
"1 1.0 2010001184\n",
"1 1.0 2010019213"
]
},
"execution_count": 45,
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
......@@ -507,9 +156,9 @@
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"display_name": "Python [conda env:alpha-mind]",
"language": "python",
"name": "python3"
"name": "conda-env-alpha-mind-py"
},
"language_info": {
"codemirror_mode": {
......@@ -521,9 +170,9 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
"version": "3.7.9"
}
},
"nbformat": 4,
"nbformat_minor": 2
"nbformat_minor": 4
}
......@@ -32,22 +32,22 @@
},
{
"cell_type": "code",
"execution_count": 2,
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"factor_name = 'ROE'\n",
"factor_name = 'EMA5D'\n",
"neutralized_styles = risk_styles + industry_styles\n",
"start_date = '2010-01-01'\n",
"end_date = '2019-02-01'\n",
"start_date = '2020-01-02'\n",
"end_date = '2020-02-21'\n",
"engine = SqlEngine(os.environ['DB_URI'])\n",
"universe_name = 'ashare_ex'\n",
"universe_name = 'hs300'\n",
"freq = '5b'"
]
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
......@@ -71,21 +71,68 @@
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 8,
"metadata": {},
"outputs": [],
"outputs": [
{
"ename": "KeyError",
"evalue": "\"Passing list-likes to .loc or [] with any missing labels is no longer supported. The following labels were missing: Int64Index([253], dtype='int64'). See https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#deprecate-loc-reindex-listlike\"",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-8-77fe2e758e19>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m neutralized_factors = neutralize(total_data[neutralized_styles].values.astype(float),\n\u001b[0;32m 2\u001b[0m \u001b[0mtotal_data\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mfactor_name\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m groups=total_data['trade_date'])\n\u001b[0m\u001b[0;32m 4\u001b[0m \u001b[0mtotal_data\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'neutralized_factors'\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mneutralized_factors\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\data\\neutralize.py\u001b[0m in \u001b[0;36mneutralize\u001b[1;34m(x, y, groups, detail, weights)\u001b[0m\n\u001b[0;32m 38\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mgroups\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 39\u001b[0m \u001b[0mres\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mzeros\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 40\u001b[1;33m \u001b[0mindex_diff\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0morder\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mutils\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mgroupby\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mgroups\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 41\u001b[0m \u001b[0mstart\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 42\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mdetail\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\utilities.py\u001b[0m in \u001b[0;36mgroupby\u001b[1;34m(groups)\u001b[0m\n\u001b[0;32m 39\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mgroupby\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mgroups\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 40\u001b[0m \u001b[0morder\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mgroups\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0margsort\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 41\u001b[1;33m \u001b[0mt\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mgroups\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0morder\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 42\u001b[0m \u001b[0mindex_diff\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwhere\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdiff\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mt\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 43\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mconcatenate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mindex_diff\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m[\u001b[0m\u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mgroups\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0morder\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\pandas\\core\\series.py\u001b[0m in \u001b[0;36m__getitem__\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 904\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_get_values\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 905\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 906\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_get_with\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 907\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 908\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m_get_with\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\pandas\\core\\series.py\u001b[0m in \u001b[0;36m_get_with\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 939\u001b[0m \u001b[1;31m# (i.e. self.iloc) or label-based (i.e. self.loc)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 940\u001b[0m \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_should_fallback_to_positional\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 941\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mloc\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 942\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 943\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0miloc\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\pandas\\core\\indexing.py\u001b[0m in \u001b[0;36m__getitem__\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 877\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 878\u001b[0m \u001b[0mmaybe_callable\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcom\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mapply_if_callable\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mobj\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 879\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_getitem_axis\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmaybe_callable\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0maxis\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 880\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 881\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m_is_scalar_access\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mTuple\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\pandas\\core\\indexing.py\u001b[0m in \u001b[0;36m_getitem_axis\u001b[1;34m(self, key, axis)\u001b[0m\n\u001b[0;32m 1097\u001b[0m \u001b[1;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Cannot index with multidimensional key\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1098\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1099\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_getitem_iterable\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0maxis\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1100\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1101\u001b[0m \u001b[1;31m# nested tuple slicing\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\pandas\\core\\indexing.py\u001b[0m in \u001b[0;36m_getitem_iterable\u001b[1;34m(self, key, axis)\u001b[0m\n\u001b[0;32m 1035\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1036\u001b[0m \u001b[1;31m# A collection of keys\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1037\u001b[1;33m \u001b[0mkeyarr\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mindexer\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_get_listlike_indexer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mraise_missing\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mFalse\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1038\u001b[0m return self.obj._reindex_with_indexers(\n\u001b[0;32m 1039\u001b[0m \u001b[1;33m{\u001b[0m\u001b[0maxis\u001b[0m\u001b[1;33m:\u001b[0m \u001b[1;33m[\u001b[0m\u001b[0mkeyarr\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mindexer\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mallow_dups\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\pandas\\core\\indexing.py\u001b[0m in \u001b[0;36m_get_listlike_indexer\u001b[1;34m(self, key, axis, raise_missing)\u001b[0m\n\u001b[0;32m 1252\u001b[0m \u001b[0mkeyarr\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mindexer\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mnew_indexer\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0max\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_reindex_non_unique\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkeyarr\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1253\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1254\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_validate_read_indexer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkeyarr\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mindexer\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mraise_missing\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mraise_missing\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1255\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mkeyarr\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mindexer\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1256\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\pandas\\core\\indexing.py\u001b[0m in \u001b[0;36m_validate_read_indexer\u001b[1;34m(self, key, indexer, axis, raise_missing)\u001b[0m\n\u001b[0;32m 1314\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0moption_context\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"display.max_seq_items\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m10\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m\"display.width\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m80\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1315\u001b[0m raise KeyError(\n\u001b[1;32m-> 1316\u001b[1;33m \u001b[1;34m\"Passing list-likes to .loc or [] with any missing labels \"\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1317\u001b[0m \u001b[1;34m\"is no longer supported. \"\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1318\u001b[0m \u001b[1;34mf\"The following labels were missing: {not_found}. \"\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mKeyError\u001b[0m: \"Passing list-likes to .loc or [] with any missing labels is no longer supported. The following labels were missing: Int64Index([253], dtype='int64'). See https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#deprecate-loc-reindex-listlike\""
]
}
],
"source": [
"neutralized_factors = neutralize(total_data[neutralized_styles].values.astype(float),\n",
" total_data['ROE'].values,\n",
" total_data[factor_name].values,\n",
" groups=total_data['trade_date'])\n",
"total_data['neutralized_factors'] = neutralized_factors"
]
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 9,
"metadata": {},
"outputs": [],
"outputs": [
{
"ename": "KeyError",
"evalue": "'neutralized_factors'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\pandas\\core\\indexes\\base.py\u001b[0m in \u001b[0;36mget_loc\u001b[1;34m(self, key, method, tolerance)\u001b[0m\n\u001b[0;32m 2894\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2895\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcasted_key\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2896\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mpandas\\_libs\\index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[1;34m()\u001b[0m\n",
"\u001b[1;32mpandas\\_libs\\index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[1;34m()\u001b[0m\n",
"\u001b[1;32mpandas\\_libs\\hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[1;34m()\u001b[0m\n",
"\u001b[1;32mpandas\\_libs\\hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[1;34m()\u001b[0m\n",
"\u001b[1;31mKeyError\u001b[0m: 'neutralized_factors'",
"\nThe above exception was the direct cause of the following exception:\n",
"\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-9-261fdeb1279a>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mic_series\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtotal_data\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mgroupby\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'trade_date'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mapply\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcorrcoef\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'neutralized_factors'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'dx'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[0mic_series\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrolling\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mwindow\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m7\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmean\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfigsize\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m14\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m7\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\pandas\\core\\groupby\\groupby.py\u001b[0m in \u001b[0;36mapply\u001b[1;34m(self, func, *args, **kwargs)\u001b[0m\n\u001b[0;32m 857\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0moption_context\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"mode.chained_assignment\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 858\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 859\u001b[1;33m \u001b[0mresult\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_python_apply_general\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mf\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_selected_obj\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 860\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 861\u001b[0m \u001b[1;31m# gh-20949\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\pandas\\core\\groupby\\groupby.py\u001b[0m in \u001b[0;36m_python_apply_general\u001b[1;34m(self, f, data)\u001b[0m\n\u001b[0;32m 890\u001b[0m \u001b[0mdata\u001b[0m \u001b[0mafter\u001b[0m \u001b[0mapplying\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 891\u001b[0m \"\"\"\n\u001b[1;32m--> 892\u001b[1;33m \u001b[0mkeys\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvalues\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmutated\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mgrouper\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mapply\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mf\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0maxis\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 893\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 894\u001b[0m return self._wrap_applied_output(\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\pandas\\core\\groupby\\ops.py\u001b[0m in \u001b[0;36mapply\u001b[1;34m(self, f, data, axis)\u001b[0m\n\u001b[0;32m 211\u001b[0m \u001b[1;31m# group might be modified\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 212\u001b[0m \u001b[0mgroup_axes\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mgroup\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0maxes\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 213\u001b[1;33m \u001b[0mres\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mgroup\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 214\u001b[0m \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0m_is_indexed_like\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mres\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mgroup_axes\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 215\u001b[0m \u001b[0mmutated\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;32mTrue\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m<ipython-input-9-261fdeb1279a>\u001b[0m in \u001b[0;36m<lambda>\u001b[1;34m(x)\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mic_series\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtotal_data\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mgroupby\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'trade_date'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mapply\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcorrcoef\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'neutralized_factors'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'dx'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[0mic_series\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrolling\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mwindow\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m7\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmean\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfigsize\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m14\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m7\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\pandas\\core\\frame.py\u001b[0m in \u001b[0;36m__getitem__\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 2900\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mnlevels\u001b[0m \u001b[1;33m>\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2901\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_getitem_multilevel\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2902\u001b[1;33m \u001b[0mindexer\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2903\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mis_integer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mindexer\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2904\u001b[0m \u001b[0mindexer\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[0mindexer\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\pandas\\core\\indexes\\base.py\u001b[0m in \u001b[0;36mget_loc\u001b[1;34m(self, key, method, tolerance)\u001b[0m\n\u001b[0;32m 2895\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcasted_key\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2896\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2897\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0merr\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2898\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2899\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mtolerance\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mKeyError\u001b[0m: 'neutralized_factors'"
]
}
],
"source": [
"ic_series = total_data.groupby('trade_date').apply(lambda x: np.corrcoef(x['neutralized_factors'], x['dx'])[0, 1])\n",
"ic_series.rolling(window=7).mean().plot(figsize=(14, 7))"
......@@ -101,7 +148,7 @@
},
{
"cell_type": "code",
"execution_count": 95,
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
......@@ -111,19 +158,32 @@
},
{
"cell_type": "code",
"execution_count": 96,
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\numpy\\lib\\function_base.py:2392: RuntimeWarning: Degrees of freedom <= 0 for slice\n",
" c = cov(x, y, rowvar)\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\numpy\\lib\\function_base.py:2326: RuntimeWarning: divide by zero encountered in true_divide\n",
" c *= np.true_divide(1, fact)\n",
"D:\\ProgramData\\anaconda3\\lib\\site-packages\\numpy\\lib\\function_base.py:2326: RuntimeWarning: invalid value encountered in multiply\n",
" c *= np.true_divide(1, fact)\n"
"ename": "KeyError",
"evalue": "'neutralized_factors'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\pandas\\core\\indexes\\base.py\u001b[0m in \u001b[0;36mget_loc\u001b[1;34m(self, key, method, tolerance)\u001b[0m\n\u001b[0;32m 2894\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2895\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcasted_key\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2896\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mpandas\\_libs\\index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[1;34m()\u001b[0m\n",
"\u001b[1;32mpandas\\_libs\\index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[1;34m()\u001b[0m\n",
"\u001b[1;32mpandas\\_libs\\hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[1;34m()\u001b[0m\n",
"\u001b[1;32mpandas\\_libs\\hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[1;34m()\u001b[0m\n",
"\u001b[1;31mKeyError\u001b[0m: 'neutralized_factors'",
"\nThe above exception was the direct cause of the following exception:\n",
"\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-11-bf23261b6bdb>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mindustry_ic\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtotal_data\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mgroupby\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'trade_date'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'industry'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mapply\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcorrcoef\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'neutralized_factors'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'dx'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\pandas\\core\\groupby\\groupby.py\u001b[0m in \u001b[0;36mapply\u001b[1;34m(self, func, *args, **kwargs)\u001b[0m\n\u001b[0;32m 857\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0moption_context\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"mode.chained_assignment\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 858\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 859\u001b[1;33m \u001b[0mresult\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_python_apply_general\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mf\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_selected_obj\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 860\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 861\u001b[0m \u001b[1;31m# gh-20949\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\pandas\\core\\groupby\\groupby.py\u001b[0m in \u001b[0;36m_python_apply_general\u001b[1;34m(self, f, data)\u001b[0m\n\u001b[0;32m 890\u001b[0m \u001b[0mdata\u001b[0m \u001b[0mafter\u001b[0m \u001b[0mapplying\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 891\u001b[0m \"\"\"\n\u001b[1;32m--> 892\u001b[1;33m \u001b[0mkeys\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvalues\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmutated\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mgrouper\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mapply\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mf\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0maxis\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 893\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 894\u001b[0m return self._wrap_applied_output(\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\pandas\\core\\groupby\\ops.py\u001b[0m in \u001b[0;36mapply\u001b[1;34m(self, f, data, axis)\u001b[0m\n\u001b[0;32m 211\u001b[0m \u001b[1;31m# group might be modified\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 212\u001b[0m \u001b[0mgroup_axes\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mgroup\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0maxes\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 213\u001b[1;33m \u001b[0mres\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mgroup\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 214\u001b[0m \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0m_is_indexed_like\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mres\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mgroup_axes\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 215\u001b[0m \u001b[0mmutated\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;32mTrue\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m<ipython-input-11-bf23261b6bdb>\u001b[0m in \u001b[0;36m<lambda>\u001b[1;34m(x)\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mindustry_ic\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtotal_data\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mgroupby\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'trade_date'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'industry'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mapply\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcorrcoef\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'neutralized_factors'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'dx'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\pandas\\core\\frame.py\u001b[0m in \u001b[0;36m__getitem__\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 2900\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mnlevels\u001b[0m \u001b[1;33m>\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2901\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_getitem_multilevel\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2902\u001b[1;33m \u001b[0mindexer\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2903\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mis_integer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mindexer\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2904\u001b[0m \u001b[0mindexer\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[0mindexer\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\pandas\\core\\indexes\\base.py\u001b[0m in \u001b[0;36mget_loc\u001b[1;34m(self, key, method, tolerance)\u001b[0m\n\u001b[0;32m 2895\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcasted_key\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2896\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2897\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0merr\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2898\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2899\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mtolerance\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mKeyError\u001b[0m: 'neutralized_factors'"
]
}
],
......@@ -133,30 +193,19 @@
},
{
"cell_type": "code",
"execution_count": 97,
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x1509ad17390>"
"ename": "NameError",
"evalue": "name 'industry_ic' is not defined",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-12-78cdd5c2e13c>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;33m(\u001b[0m\u001b[0mindustry_ic\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mgroupby\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlevel\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmean\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m/\u001b[0m \u001b[0mindustry_ic\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mgroupby\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlevel\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstd\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msort_values\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mascending\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mFalse\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkind\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'bar'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfigsize\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m14\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m7\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;31mNameError\u001b[0m: name 'industry_ic' is not defined"
]
},
"execution_count": 97,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA1kAAAHzCAYAAADSGdeSAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzs3XfcZFV9+PHPFxZYQKouKgisGESKRGCDig2NKBEVjahEkQSjxiT2qIANFIkg5GcXS6RYsBAgKiCKKBasYAFRIVEBY6eI4FJ3v78/zhmeu7PzPM/MPGe28Xm/XvOamTvnnntm5rbvPeVGZiJJkiRJamOtlV0ASZIkSVqTGGRJkiRJUkMGWZIkSZLUkEGWJEmSJDVkkCVJkiRJDRlkSZIkSVJDBlmSJEmS1JBBliRJkiQ1ZJAlSZIkSQ0ZZEmSJElSQ/NWdgH6RcQCYN/M/MiKXO497nGPXLhw4YpcpCRJkqTVyMUXX3xNZi6YLd3EgqyI2A04DngIcBvwGeAVmXndgLT3BJ4P7AfsSalhWy7IiogjgSMGLO5VmXn8XMq7cOFCLrroorlkIUmSJGkNFhFXDZNuIkFWRGwPXAD8CDgE2Bo4ClgI7D1glocCrwA+TwnIHjlD9r8H/r5v2k/nUl5JkiRJamVSNVlHALdSmv3dCBARdwDviIhHZuZX+9KfB2yRmXdExNuZOci6OTPPnUipJUmSJGmOmg98ERFrAU8GTu8FWNXHgAQe3z9PZv45M+8YfhGxYV2OJEmSJK1SJhGo3BfYCLikOzEzrwV+B2w/x/y3AW4Cbo+IiyPiqeNmVOe/OCIunmOZJEmSJAmYTJDVG23jmgGfXQdsOoe8T6PUhD0W+GdgfeCMuQRakiRJktTSJIKsXj+vpQM+y2mmDyUzL8vML2Tm+Zn5AWAv4DfAa8fMb4/eY9wySZIkSVLXJIKsG+rzJgM+2xS4ttWCMvOPwBeBXVrlKUmSJElzMYkg62fAEmCn7sSI2AzYkr6+Wg2sB9zcOE9JkiRJGkvzICszF1PukfX0iJjf+ehZlOaCZ0IZInDUvCNinb7396b00frKuOWVJEmSpJYmeZ+sC4CzIuIEyk2I3wickJlXRMSLgWMi4hGZ+b2I2BzYs867LUBE7FvfX5eZ36mvvx4RnwMuBe4D/BuwNmP2yZIkSZKk1iYSZGXmhRGxP3A0cCpl6Pbj6nuAO4DbmBoEY1fgc33Z9N5/Bdi7vv428HzKCIY3UQK512fmZc2/hCRJkiSNITJzZZdhlbBo0aK86KKLVnYxJEmSJK2iIuLizFw0W7pJDHwhSZIkSXdZBlmSJEmS1JBBliRJkiQ1NKnRBdcYCw87e6T0Vx6z34RKIkmSJGl1YE2WJEmSJDVkkCVJkiRJDRlkSZIkSVJDBlmSJEmS1JBBliRJkiQ1ZJAlSZIkSQ0ZZEmSJElSQwZZkiRJktSQQZYkSZIkNWSQJUmSJEkNGWRJkiRJUkMGWZIkSZLUkEGWJEmSJDVkkCVJkiRJDRlkSZIkSVJDBlmSJEmS1JBBliRJkiQ1ZJAlSZIkSQ0ZZEmSJElSQwZZkiRJktSQQZYkSZIkNWSQJUmSJEkNGWRJkiRJUkMGWZIkSZLUkEGWJEmSJDVkkCVJkiRJDc1b2QW4q1t42NlDp73ymP0mWBJJkiRJLViTJUmSJEkNGWRJkiRJUkMGWZIkSZLUkEGWJEmSJDVkkCVJkiRJDRlkSZIkSVJDBlmSJEmS1JBBliRJkiQ1ZJAlSZIkSQ0ZZEmSJElSQwZZkiRJktSQQZYkSZIkNWSQJUmSJEkNGWRJkiRJUkMGWZIkSZLUkEGWJEmSJDVkkCVJkiRJDRlkSZIkSVJDBlmSJEmS1JBBliRJkiQ1ZJAlSZIkSQ0ZZEmSJElSQwZZkiRJktSQQZYkSZIkNWSQJUmSJEkNGWRJkiRJUkOrXJAVEQsi4jkruxySJEmSNI6JBVkRsVtEfDEiboqI6yLi5IjYfJq094yI10XEN4HfAh+eId8DI+IHEXFLRFwdEa+PiFUuWJQkSZJ01zSR4CQitgcuANYHDgHeDDwdOGOaWR4KvAK4Evj6DPk+E/g48H3g74BPA28C3tCm5JIkSZI0N/MmlO8RwK3Avpl5I0BE3AG8IyIemZlf7Ut/HrBFZt4REW8HHtmfYa2tOg74fGYeUiefGRFbAa+MiLdm5uIJfR9JkiRJGkrzmqwaDD0ZOL0XYFUfAxJ4fP88mfnnzLxjlqz3ALYGTuqb/lFgQ+BhYxdakiRJkhqZRHPB+wIbAZd0J2bmtcDvgO3HzHfX+nxJ3/TL6vO4+UqSJElSM5MIshbU52sGfHYdsGnjfK+rzyPnGxEX9x5jlkmSJEmSljGJPlm9PJcO+CynmT6XfHOG5d2lLTzs7JHSX3nMfhMqiSRJknTXMYmarBvq8yYDPtsUuLZxvr0arJHzzcw9eo8xyyRJkiRJy5hEkPUzYAmwU3diRGwGbMnyfaqGdXl93qlv+s71edx8JUmSJKmZ5kFWHUb9AuDpETG/89GzKE37zgSIiBgx668BNwIH900/CPgl8N1xyitJkiRJLU3yPlkXAGdFxAnAQuCNwAmZeUVEvBg4JiIekZnfi4jNgT3rvNsCRMS+9f11mfmdzLw5Io6u872bcm+txwIHAM/ITPtkSZIkSVrpJhJkZeaFEbE/cDRwKmXo9uPqe4A7gNuYGqxiV+Bzfdn03n8F2Lvme2xELAFeBDyf0oTwmZl52iS+hyRJkiSNalI1WWTmOcA503x2AnBC5/0FwFDNBzPzeOD4BkWUJEmSpOYmFmRpzecQ8ZIkSdLyJjG6oCRJkiTdZRlkSZIkSVJDBlmSJEmS1JBBliRJkiQ1ZJAlSZIkSQ0ZZEmSJElSQwZZkiRJktSQQZYkSZIkNWSQJUmSJEkNGWRJkiRJUkMGWZIkSZLUkEGWJEmSJDVkkCVJkiRJDRlkSZIkSVJDBlmSJEmS1JBBliRJkiQ1ZJAlSZIkSQ0ZZEmSJElSQwZZkiRJktSQQZYkSZIkNWSQJUmSJEkNGWRJkiRJUkPzVnYBpOksPOzsodNeecx+EyyJJEmSNDxrsiRJkiSpIYMsSZIkSWrIIEuSJEmSGjLIkiRJkqSGDLIkSZIkqSGDLEmSJElqyCBLkiRJkhoyyJIkSZKkhgyyJEmSJKkhgyxJkiRJasggS5IkSZIaMsiSJEmSpIYMsiRJkiSpIYMsSZIkSWrIIEuSJEmSGjLIkiRJkqSGDLIkSZIkqSGDLEmSJElqyCBLkiRJkhoyyJIkSZKkhgyyJEmSJKmheSu7ANLKsPCws0dKf+Ux+02oJJIkSVrTWJMlSZIkSQ0ZZEmSJElSQwZZkiRJktSQQZYkSZIkNWSQJUmSJEkNGWRJkiRJUkMGWZIkSZLUkEGWJEmSJDVkkCVJkiRJDRlkSZIkSVJDBlmSJEmS1JBBliRJkiQ1ZJAlSZIkSQ1NLMiKiN0i4osRcVNEXBcRJ0fE5jOkX1DTXBMRf46I8yPigX1pjoyIHPB45aS+hyRJkiSNYt4kMo2I7YELgB8BhwBbA0cBC4G9B6RfF/gicHfgMOA24A3A+RGxc2b+oZP898Df92Xx06ZfQJIkSZLGNJEgCzgCuBXYNzNvBIiIO4B3RMQjM/OrfekPBnYFHpqZ36rpfwD8EPhn4E2dtDdn5rkTKrckSZIkzUnz5oIRsRbwZOD0XoBVfQxI4PEDZnsq8NNegAWQmZcAlw5IHxGxYV2OJEmSJK1SJhGo3BfYCLikOzEzrwV+B2w/YJ5d+9NXlw1Ivw1wE3B7RFwcEU8dt6B1/osj4uJx85AkSZKkrkkEWQvq8zUDPrsO2HSaeYZJfxqlZuuxlGaE6wNnzCXQkiRJkqSWJhFk9fp5LR3wWU4zfd4w6TPzssz8Qmaen5kfAPYCfgO8dpyCZuYevcc480uSJElSv0kMfHFDfd5kwGebUgazGDTPdOmvnW5BmfnHiPgi8IxRCylN0sLDzh4p/ZXH7DehkkiSJGlFm0RN1s+AJcBO3YkRsRmwJYP7Xl3en77aeZr0XesBN49eTEmSJElqr3mQlZmLKffIenpEzO989CxK878zoQwR2PnsHGD3iNi5NyEidgH+Eji9M22d7rIi4t6UPlpfafstJEmSJGk8kxoG/QhKrdVZEfG0iPg34FjghMy8IiJeDNwUEbvX9O+h9K36TET8fUQcDPw3pWnhKZ18vx4RR9Y8Xwp8G1ibMftkSZIkSVJrE7kZcWZeGBH7A0cDp1KGbj+uvge4A7iNOqhFZl4fEY8G3gm8l3Ij488Cr8zM2ztZfxt4PmU0wpsoNWavz8zLJvE9pFXVKH2+7O8lSZK0Yk0kyALIzHMozQAHfXYCcELftCuAfWfJ8yXAS1qVUdLyHLRDkiRpbibVXFCSJEmS7pIMsiRJkiSpIYMsSZIkSWpoYn2yJGkQ+3xJkqQ1nTVZkiRJktSQQZYkSZIkNWSQJUmSJEkN2SdL0hrFPl+SJGllsyZLkiRJkhqyJkuShmQtmSRJGoY1WZIkSZLUkEGWJEmSJDVkkCVJkiRJDRlkSZIkSVJDBlmSJEmS1JBBliRJkiQ1ZJAlSZIkSQ15nyxJWkV4Hy5JktYM1mRJkiRJUkMGWZIkSZLUkM0FJekuwuaIkiStGNZkSZIkSVJDBlmSJEmS1JDNBSVJc2ZTREmSpliTJUmSJEkNGWRJkiRJUkMGWZIkSZLUkEGWJEmSJDXkwBeSpFWeA2tIklYnBlmSpLs8gzhJUksGWZIkTZABnCTd9dgnS5IkSZIaMsiSJEmSpIYMsiRJkiSpIYMsSZIkSWrIIEuSJEmSGnJ0QUmSVmOOXihJqx5rsiRJkiSpIYMsSZIkSWrIIEuSJEmSGjLIkiRJkqSGDLIkSZIkqSGDLEmSJElqyCBLkiRJkhoyyJIkSZKkhrwZsSRJmpY3O5ak0VmTJUmSJEkNGWRJkiRJUkMGWZIkSZLUkEGWJEmSJDXkwBeSJGmlcFANSWsqa7IkSZIkqSGDLEmSJElqyCBLkiRJkhoyyJIkSZKkhgyyJEmSJKkhRxeUJElrJEcvlLSyWJMlSZIkSQ1NLMiKiN0i4osRcVNEXBcRJ0fE5jOkX1DTXBMRf46I8yPigQPSHRgRP4iIWyLi6oh4fUQYLEqSJElaJUykuWBEbA9cAPwIOATYGjgKWAjsPSD9usAXgbsDhwG3AW8Azo+InTPzDzXdM4GPAycDbwQeA7wJWBs4chLfRZIkaRCbI0qazqT6ZB0B3Arsm5k3AkTEHcA7IuKRmfnVvvQHA7sCD83Mb9X0PwB+CPwz8KZaW3Uc8PnMPKTOd2ZEbAW8MiLempmLJ/R9JEmSJGkozZvZ1WDoycDpvQCr+hiQwOMHzPZU4Ke9AAsgMy8BLu2k34NSI3ZS37wfBTYEHtbkC0iSJEnSHEyiL9N9gY2AS7oTM/Na4HfA9gPm2bU/fXVZJ/2u9bk/3WX1eVC+kiRJkrRCTaK54IL6fM2Az64DNp1mntnST5fvdfV5UL4zioiLe6/32GOPUWeXJEmaCPt7Sau3yMy2GUY8HPgacEBmnt732Y+A/8vMffum3wGckJkv7pv+buB5mTk/Il5HGTzjHrVWrJfmHsAfgMMz85gRy9oNsna/6KKLRpldkiRptTTpIG6S+a/OZZ90/qtz2Sedf6u8I+LizFw02/yTaC54Q33eZMBnmwLXDph+wxDpp8u3V4M1KN8ZZeYevceo80qSJEnSIJMIsn4GLAF26k6MiM2ALRnc9+ry/vTVzp30l9fn/nQ71+dB+UqSJEnSCtU8yKrDqF8APD0i5nc+ehZldMEzASIiOp+dA+weEb2AiYjYBfhLoNfk8GvAjZTh3rsOAn4JfLfdt5AkSZKk8UzyPlkXAGdFxAmUmxC/kdLv6oqIeDFwTEQ8IjO/B7yHcj+sz0TEmyjB2Bso98k6BSAzb46Io+t87wbOAx4LHAA8IzOXTui7SJIkrVEcKEOarIkEWZl5YUTsDxwNnEoZuv24+h7gDuA2YGlNf31EPBp4J/Beyo2MPwu8MjNv7+R7bEQsAV4EPJ/ShPCZmXnaJL6HJEmSJI1qUjVZZOY5lGaAgz47ATihb9oVwL6D0velOx44vkUZJUmS1J41Zbqrm8TAF5IkSZJ0l2WQJUmSJEkNGWRJkiRJUkMGWZIkSZLUkEGWJEmSJDVkkCVJkiRJDRlkSZIkSVJDBlmSJEmS1JBBliRJkiQ1ZJAlSZIkSQ0ZZEmSJElSQwZZkiRJktSQQZYkSZIkNWSQJUmSJEkNGWRJkiRJUkMGWZIkSZLUkEGWJEmSJDVkkCVJkiRJDRlkSZIkSVJD81Z2ASRJkqRhXXnMfiu7CNKsrMmSJEmSpIasyZIkSZIqa8rUgjVZkiRJktSQQZYkSZIkNWSQJUmSJEkNGWRJkiRJUkMGWZIkSZLUkEGWJEmSJDVkkCVJkiRJDRlkSZIkSVJDBlmSJEmS1JBBliRJkiQ1ZJAlSZIkSQ0ZZEmSJElSQwZZkiRJktSQQZYkSZIkNWSQJUmSJEkNGWRJkiRJUkMGWZIkSZLUkEGWJEmSJDVkkCVJkiRJDRlkSZIkSVJDBlmSJEmS1JBBliRJkiQ1ZJAlSZIkSQ0ZZEmSJElSQwZZkiRJktSQQZYkSZIkNWSQJUmSJEkNzVvZBZAkSZLuKq48Zr+VXQStANZkSZIkSVJDBlmSJEmS1JBBliRJkiQ1ZJAlSZIkSQ0ZZEmSJElSQwZZkiRJktSQQZYkSZIkNWSQJUmSJEkNeTNiSZIkaQ3gjY5XHROpyYqIv46Ib0bE4oj4XUS8LSLmzzLPdhFxZkTcEBE31tfb9KU5OSJywOOASXwPSZIkSRpV85qsiHg4cG59HAT8JfBaYDPgH6aZ5+7AV4EbgH8FNgSOAs6LiF0z89ZO8kuBV/dl8f2GX0GSJEmSxjaJ5oLHAJcDT8nMJcAZEbER8LKIODIzrxwwz8uBLYC9MvNqgIj4DfBp4JnAhztpr8vMcydQbkmSJEmas6bNBSNiC2Av4CM1wOr5KBDAPtPM+lTg/F6AVZ1Fqdl6fF/atSNiw4iIRsWWJEmSpGZa98l6ICWYuqRv+o/r8/b9M0TEusAO/fNk5lLgJwPmeThwE3BrRHw1Ih41bmEj4uLeY9w8JEmSJKmrdZC1oD5f052YmbcAi4FNB8yzObB2/zzVdX3zvAd4XH28Crgvpd/WnnMrtiRJkiS1MVSfrIjIGT6+NTN7Iwf28ls6IF1OM33oeTLzu53PzouIzwA/ogyEMfIIg5m5R+/1okWLZvqOkiRJkjSUYQe+2HGGz7rB0Q31eZNugtokcAPg2gHzD5yn2nSaeQDIzF/Upn67zFA+SZIkSVphhgqyMvOnQ+Z3eX3eCfhSZ/qODO6rRWbeWEcS3Kk7vQ5ssSPwqVmWuR5w85DlkyRJkqSJatonKzOvAH4GHNQ3+t9BwJ8p984C7gyies4B9o2IBZ1pT6D01zq9M8863eVFxK7A7sBXWn0HSZIkSZqL1gNfQLnx8IOBT0TEUyLijZT7YB2ZmTcARMTxwDURsVWd5xhK/6tzI+LAiPgn4CTg7Mz8YifvyyPi0Ij424g4DPgy8Afg2Al8D0mSJEkaWfObEWfmJyNiPnA48BTgauBlmfnuTrLbgdsogRWZ+b8R8VjgP4CTKf20TqUEbF3fB14BbAZcD5wNvDYzf9P6e0iSJEnSOJoHWQCZeQpwygyfH04JwrrTvk25B9ZM+T6tSQElSZIkaUIm0VxQkiRJku6yDLIkSZIkqSGDLEmSJElqyCBLkiRJkhqayMAXkiRJktYsVx6z38ouwmrDmixJkiRJasggS5IkSZIaMsiSJEmSpIYMsiRJkiSpIYMsSZIkSWrIIEuSJEmSGnIId0mSJEkr3Zo0RLw1WZIkSZLUkEGWJEmSJDVkkCVJkiRJDRlkSZIkSVJDBlmSJEmS1JBBliRJkiQ1ZJAlSZIkSQ0ZZEmSJElSQwZZkiRJktSQQZYkSZIkNWSQJUmSJEkNGWRJkiRJUkMGWZIkSZLUkEGWJEmSJDVkkCVJkiRJDRlkSZIkSVJDBlmSJEmS1JBBliRJkiQ1ZJAlSZIkSQ0ZZEmSJElSQwZZkiRJktSQQZYkSZIkNWSQJUmSJEkNGWRJkiRJUkMGWZIkSZLUkEGWJEmSJDVkkCVJkiRJDRlkSZIkSVJDBlmSJEmS1JBBliRJkiQ1ZJAlSZIkSQ0ZZEmSJElSQwZZkiRJktSQQZYkSZIkNWSQJUmSJEkNGWRJkiRJUkMGWZIkSZLUkEGWJEmSJDVkkCVJkiRJDRlkSZIkSVJDBlmSJEmS1JBBliRJkiQ1ZJAlSZIkSQ0ZZEmSJElSQwZZkiRJktTQKhdkRcTWEfGMlV0OSZIkSRrHRIKsiPjriPhmRCyOiN9FxNsiYv4M6e8XEUdHxA+Bq4G3zpD2RRFxeUTcEhH/ExEvnMR3kCRJkqRxNA+yIuLhwLnANcBBwPuAF9fn6TwJeC5wMXDJDHkfCrwT+AxwIHARcEJE/EOLskuSJEnSXE2iJusY4HLgKZl5RmYeQQmMDo6IhdPM8yFgy8x8LvCLQQkiYhPg9cAHMvNVmfnfwLMogdkb2n4FSZIkSRpP0yArIrYA9gI+kplLOh99FAhgn0HzZeaNmZmzZP84YEPgpM58CZwK3Dcitp9L2SVJkiSphdY1WQ+kBFP9Tf5+XJ/nEgjtWp8v7Zt+WYO8JUmSJKmJeY3zW1Cfr+lOzMxbImIxsOkc816cmYv7pl9Xn0fOOyIu7r3eY4895lA0SZIkSauqK4/Zb4Uub6ggKyJmasp3a2b2Rg7s5bd0QLqcZvqw5s2Q73TLlCRJkqQVatiarB1n+Kwb3NxQnzfpJoiIdYENgGuHL9pybgA2iIh5mXlHZ3qvBmvkvDPzzuqrRYsWzdYnTJIkSZJmNVSQlZk/HTK/y+vzTsCXOtN3ZHBfrVFcTulD9gDgR53pO9fn/r5akiRJkrTCNR34IjOvAH4GHBQR0fnoIODPlPtnAdD3+TA+T6k1O7gvj2cDF2bmb8cttyRJkiS10nrgC4DXAp8APhERHwd2A14OHJaZNwBExPHAIRGxa2b+KiK2ooxMCLAFsH5E7Fvf/yozL83MqyLiA8ArIuJWyv2xngk8CNh7At9DkiRJkkbWPMjKzE9GxHzgcOApwNXAyzLz3Z1ktwO3MTVoxT507n9Vfa4+nwL8Q339UuCPwPOAVwE/APbNzG80/hqSJEmSNJaY/R7Adw2LFi3Kiy66aGUXQ5IkSdIqKiIuzsxFs6VrfTNiSZIkSbpLM8iSJEmSpIYMsiRJkiSpIYMsSZIkSWrIIEuSJEmSGjLIkiRJkqSGDLIkSZIkqSGDLEmSJElqyCBLkiRJkhqKzFzZZVglRMQfgKuGTL5jff7JhIozyfxX57JPOv/VueyTzn91Lvuk81+dyz7p/Ffnsk86/9W57JPOf3Uu+6TzX53LPun8V+eyTzr/1bnsk85/nLy3zcwFsyUyyBpDRFwMkJl7rG75r85ln3T+q3PZJ53/6lz2See/Opd90vmvzmWfdP6rc9knnf/qXPZJ5786l33S+a/OZZ90/qtz2Sed/yTztrmgJEmSJDVkkCVJkiRJDdlcUJIkSZIasiZLkiRJkhoyyJIkSZKkhgyyJEmSJKkhgyxJkiRJasggS5IkSZIaMsiSJEmSpIYMsiRJkiSpIYMsSZIkSWrIIEuSJEmSGjLIkiRJkqSGDLIkSZIkqSGDLEmSJElqyCBrSBHx9Ij4i9V5GRFxcBTrRcSrImLemPlsFhFfal2+EZa/SURcFREXRcQnImLfBnluPYnvNMn/NCJeFhF3m0TeQyz77hHxhgnku21EbFcfW40x/8aDHp3P50fEYyLidRFx9hj5rzNEmntGxJeG3b4i4uERcULn/doR8cgBjz0jYt1RyzzNMvePiGc3ymteRHx4hs/v/C0iYpeI+Pio623N495zLes0ea8VEbv2TTs9ItYfkPbfI2JB4+VvGhEvaZTXxI9TrUTE+hFxYuf93et/sXFEnDog/YERsVmjZT8wIk5ukVfNb+uI+Gqr/Caprm8n9k3bMyJiJZXnxNlTzTx/RMyf4fPtIuL1c8i/2b6yL9/1I+I9EbFR67xXtLluTxGxefcxTZrt63p652PsAk/lOZH/dpllZOYk819jRMRHgHtn5mNXh2VExBP6Jv0S+AGwPrAR8HvgBcAfuoky8zND5H1P4NeZuXZEXAI8FAjgG5m5a0R8atB8mfmMkb/I4OVvBjwC2KIu+yDK73bdEPPOA7YBfpGdlT8idgB+nJlrtyhjJ9+JrDcR8VDg68DfZebA33uMPE8EDs/M3w2RdujfKyLWAq7sTPoOcEtmHhQR2wLr1em/Aq4Gltb3dwO+lJn7jfAdlgJJWR97lgLrAp8GHgv8H7AdcGRmHjVs3jX/dwF7Ae8DPpaZiwek2Rb4ObB+Zt42RJ77A4dm5l71/SbA9cBv+77HpsBlmblolDJPs8wjgedl5n3mmM88YANKeeezbHkBbgfuoP4WEXEOsBmwV45w8Kn/619k5s/nUt5p8t4EuA5YJzOX1ml/Au6TmX/qpDsU+HfgqcPsJzvz/Rj4m8y8aprPm+17Jri/2QW4GbgJuCkz/9wgz2V+94j4NWX7vJap48s2mXl1TX8Z8MnMfFODZd8f+HZmjhy0RcR2wAWZuU1n2kSOHyOU6e7Avw7z29SLV1f3yhoR6wGLgc2663ujcr13liSvBG4c5XerF2i+l5n3r++XUMtejzVdCewEXAJsmJm3DF/6O5d3JA32lQPyfTXwauANwNGUsg5yM/CfmXnEHJa1MfA24E/ADdRtDPhWZv5q3Hw7+Y+9PdX5e8ftnl2AF/clWxf46/p6G+CqzNxunOV1lnskE/hvu8aqyVjTRblCf1pm/qQzeWvg8pjh6v0oO/8VsIzPAhdTTnp2A7ob6OaUDfc9wPfrtL+inPwOffJQ7QKsXZezc512APB24Nb6/lDKBt5EZl5PLWc9aTuE8p1mDbKA+wE/Bt4IzPlg3bUi1puONwLf6QVYEXHwDPlPW8vQ5++BY4BzXyDuAAAgAElEQVRZg6wRBbAO5QTqAsqBtVdreC7l5HxL4InA7zNzx3rg355yYWBUdwY3NQi4jbIDfyvwPMqB5s/ApWPkfSrlIsX/A95aA9N3TncCPUcLu0FaL3iLiE0z84/DZlJrmU7OzG5N7X2By+pV1EOBP1IOvL+lrFfXDpn9N4HdKf9x9wQmKMHt0zrleBmwCHjIbAFWPWn9+77Jr4yImb73Ukqg/rExThb7g8M730fE2sBRlN/p0FECrOoBTF1I6J0QfyQz+y+EjWQF72++BmxM+V0yIpJyYn4jZXv6U339W8rFnw9l5u3DfI3pXkfEQcAxEbENcHdgR+ALs2ZYajwfOkuy9YGNI+JZLLvekplnzDLvOsDIteyjGuWiF3APyjF+3GNas1qsiNi4s/29kHJMCUpAcRxlX/xq4FiWvyA2jLWBbm1t1OX2gvauPwN71DSzLmfC+8rucnYBjqQcC08GZmpV8WDgIyx7Djcoz+la4pwMfJ5ynvQJyjnQAmBb4O4R8YLMPGWGfCe9PVHnWQBcQ1mX5zN1HvIE4A+Z+cROmZaOGmCtqP92OZnpo+9BOVhfD/xVZ9pVwL9QVoaT6uPG+nwLcOKqtAzg5u5r4OHAEsrVgKcDXwUWD0o/RN73BJZ0vsfGwCb90/q+68ZD5r1DLecoj18C642Q/1JKAPjg/uWu6utNzfMgSu3ApyhX53rLvhr4ReexhHK1Z5Ty33+U/2nItGtTrpxCuUIN8CNKTdWP6/uf9J6B51Bqvl4ALJ0l75cC53QeSyiBW+/95+q0zw1I96o5/NcbAs+nBGq3UQ6CvZYB2/a2tSHz2p9SC9x7v0mdf52+dOvV/2jTMdbLW4H9O9O+Sbl6ulX9/KuUiw/X17TPHjLvezG1zW5b89oGWFinrV+nvYYSAO0+ZL6LKBeKeo+lNb8/9k3vf1wFfHnE36f3e0dn2o31exwCXF7L/tQx15Vltqv6my8B1hp1WxqQ78T3NzXf6ylBzhaUE5MHUmp0Hw88k7KtHg68i3JydOqovzvwG0qtwz3r9A1rXk8HXkvdhwyR774sux+c7nEb5Wp+d9rPh8h/uf+LqePKF6Z5fBJ46Ii/+RImsz/urX8bUvYp69X3Qx2jhyz3x6nbft/62lvnu9NHWvfpnGt08u2dgywF/pLS0mUp5cLvNr3vO+Q2NZF9ZSe/hZRj9RnAbXXak4FX9D/qZ1swy3GwU/ajgDfX73tofX4cnXO2vnmOYJZzhElvT3UZi+vzcuehlH3Kv/SvY2OslxP/bwc9rMma3teBz0XE7pS+a/cBvk1ZCQ4BiIi/zsxDIuIpmfncVWwZ/VeKX9V5vS9wPuVEZrr0K1MAjx4y7W3ApZl566wpl3US8LGIeFBm3jTivDOZ6HoTpb/F2ylNDI4CXka5Wgewd3aaU9Uq+NmuQK0siykH+Z7u+rcu5QD9UcoV7Jl8h3LiDWW9eTzwX5RmalACvMdRAtKlnfkeRKkpG0uW5lIfBD4YEfsAe2bda48rInYGHkb57gDPj4g7OknmUQ6gz4gIMvMDI2T/IeDjEbEX5UR8EeVKKkBm5iM75TiccvX5Y7Nlmpm/jYjr6+urarl6zbvIzJujdPXYDViUmb8ZprCZeRHwpE6ZlgIfAA6kBHavy8zP989Xf8Pv908fkG5HyvdPyjoC8JGIuJVyUWpd4H8pQf+7gJOyQRO5CVgRx6medwNXUH6XyyhXepdrPRAR/00JeAeqV8ZfT/mNAd5ba8aW6ZuSmX+OiGMoJ5zbUQL1WWXmuZRAsLe8dXJArVpEfBd4U2ZOW9Yx/GzAtKBc5Dy1W64hTLKPVACvoxxnn9l4WUG5gPYdlj+vyL7n1jIzf1hrtTIzL4uIe3XKNYyJ7Ctr+qdT9ifnUlpV3Fw/2gyYrs/pWgy57te816LUgB4bEW+htAaZ7rufTjmXmNaK3p4i4imUoLPnwcAeEdE7X53Lujqx/3Y6BlmDJeVq+ucpV2Q+TKmGnvXgvYoto7us/6Q0x9oaeAblCs+ho2ZUm6W9vGnplpeZ+ZVJ5k85cH+fcuLwDw3zndh/GqVD6FmUK/X/HhFvbpHvSrKYqWCiKzPzQxHxqvrmLTNlkpnfpFyNAu5sYnM1paYPppqy/k9mfr2T7oWUq78zqs0Nh+rzFhG9ZhEbDJN+gAcAf8fUfvmZLBsYdiUl6BhGb33fitJc5C2Uq3QXUJpm9DsDeHNErJ2ZS4ZcxiBR+0tAaTb4tzXgCsr/PGr/leOAwygnHGdFxCeBF+WyTSf/CKwdETFL0HsrpQYcptbDmygn/vegnKjcSmla82BK7Wfz/mBztCKPIVCaDK5DaVp+CPCA2k/qNOCEnGpa83tgvYiYl5l3DMgnmWqFQH1OBp94v5dyEngFMPIACRGxEyUIfXRm/jwiNqDs819O2U9sM2MGo8nM/OdpyrEHJehYVSTlt30w8A3aBj2ZmU+KiNcAR0XEc5gaZO3gGHN8jYg4kNIccq36/ore8maZtbcODrPgSe8rXwOcn5n/ABARWfuRLXMc66l9nW7LzGOGyLv7HQaJiPgmZT9xYr0wvd40aafLYEVsT3+gtB7o2aFv2rhB1ko5DhpkTW8x5QB2CeVPPitL59zVZRnr1Z1QUDakHevr04F3Z+bVUUZy6p04zI+IK7J2Jh2kXh06gnIFf9fp0q0OMnNxlFFlLoyIsxivf84gzf/TuhO+D+Xq15U1/0lZUTWaN1MO7nePiKuBe/Y9b0Fp/rHcwBKzuBp4f9+0qyjt/x/WmXYNy9bkzuSGEcsw1A45SgfuO6/eZ+bpwOkRsSmlXfg+OcTAGcMsihKsvQD4KfBO4NOZees062WTEQwp69J2lGYjn6JcMbx5phlmzTDzBuDQiPgv4BTgRxHxpMzsBRZ3q+lmXI9rje8r4c792gspTVJ6A1/cWMu+J+Uk/9KIeEVm9q9bw9qo1jZBWbcBdq81dAvrMnejnkBk5veGzHdFHKd6vgRc2DvhiDIA0f6U3+7QetHnrZS+FTdNE2CRmb8FXlzX8+cBL6llPqCbrl7g+H+UwLl3UeSnwxY2St+3zwJndGr4300JnG+i7Be2Hja/OZruYsnKMA8gM38JPCYi/o3yv7XSW4d7FwL/jqkT4wPnkO9FlL7IGwIn1NdB2Q/MpHcxZ5j98qT3lW8H3h8RP8jM4+q0e1Fqm66kHOd/Tzlnm085Tt0tIr6cmdP2ux7BqZTmxC+pwe+GlG1hVitqe8rMC4ELO8u9D6U7wXs7044eI+uVchw0yBqst5O4IiKOp7Q1/0j9bH5MdSreuL4e6WrAClrGI/ve90ZPuZDSTABKu+XuaDyznZjcUK+s3IPSjnVSIgZ33L6VcqX2WsroQlfOZSGZeVFEvJHSLO2GuuBf9yejdII8PDNn63Q9qf90EXAeJcg6aFBVfUPHRRlZbTYbz55kRrdQdnZvowyIcT5l5KDe88cpJ2uzNi+LiGdl5qkAmbmw77OHUUbl6x9x8wLKSHEzqieKh8yWrm+ZC4G/HSLpYyhXy37GVJNPmFCTmsz8XT04HUup2Z7OZiX57Ffv6onwevX1uvV5Hep+pdeEkKnmn0+sJ9lzkpnfjTKE72nAVyPiwMw8m3KgHzgE8ICyr0c5SegFNN3fO4FbM/PsKIPrvIbSrG1+Zr5jjCI/uC6rq79m4+LOsoep5ZvoMaRepV6/U0N1PrAkIi4FvgL8d2aeDJwcEX9LOfF9HPCMzNxkiEUMWr93ouwXglIjdw3lWLYLpTnnFr1AeAgvAX6QmS+v3+cASnPiB2XmknoxZ87DQA9pI6YGghpF031AlMFE+vd776ZBkBURj6M0T1+mzFkHeKkXFParAfXIQWdm/i/wv/WiyAmZ+bGa72wDO/XOc4e+YDWJfWXN95SIuBY4I8qAOlDW9csy868i4nOULgAPoqynh9eLrN8YtuwzLz7fFWXExzcDXwaeMOS2Citwe4oyAuZ/UtalHYGfRBkhcdqh+oc1qf92OgZZs9uxPm9Zn9eiXHkMyoHwvsz9fmOTWMZP+t4/g7LC/rSz0lzJslWvs+7Q68Y0zPL7T1iGPVgsphzAB/XJWocS4G0JbFgDopOAtw/qGzCkt1CqorehnEj1B49BGd3mg5SO/cNq+Z9eS9lWb2XIWpI5WMCyfaWmM26TuJ5bKJ1Lb68n4rf1PV9L6aw7jI8Ap9Yr692ahq9TrpzeRG2ixtT6fm/gWZSRp1obal3PzM9EGYr/IODZEfEjysHvC7WcV02zrT08xx/KvBdobh+l+emgA+wVwEOGzO/7lBNjmKqluoWpUej2p/wez6Ac1L4SEXvl6KM2/YzOSVKUH2Z9ShPokyg1gE/KzPPoG91qBptQAvDX1/J+I0oTxBPp7BdrrdjRUZo+Hh8R38vMr41Y/vMp+y8oF7x+Xsu/hNJM9BLmduV0EseQfYBPRMTplLI/oD7vTPndPxMRV1Fqos6IiG9RB3qIiEflcH1duyv4rZR+eL11Y0Ngt8y8IyJ+T/l99qJs18M4kmV/069QOr33blvyE2DalhsjlHsY36LWso6o9UWvJ1Mu1v3jGGWZzfXAwQARsaDzO3fN6QJSRHyAmWvDIyIeTW0hEBGPoLRuyOlqVmfQel8JpSBnRcS/UJp7v683ufPcG848a/qlEfEfI5Z9kIiI+2Xmz4DDI+IW4MyI2D1rP9pZHMnktqd+N1Ka9PV8i9I3aujbucxiIv/tQNlgNJk17cHUKHzPpGzQX6COWAVc30l3df+0VWUZTI3G1Xs+rr7+LfDcmuZmlh2l77Yh855udMGlnWm3dR5Lh827s4wAtumbtnt9XotyZfhdTJ2s/82Q+Q4chWm66fWznaf7bEX9p5TarP+jDF2/bud33rLzersB68CWI64zw45m9YBhfpOadtDogidTaqx6owv2P79/hP+0t95tRTmgPpuyk34Y5Wrd4+s6e3Vnns2GWScpwe2HR3yc3lsXRvjtN6YEWNdRgpZHzfCYP+K21Fsv/41SM3Ai5cropyhNsXr7hSMZcpTOTt73ZmpktW0oFyK6jw3qZ7119jRK3561RljGOpS+GL081q5l/0bn/dmUWs/1Ryl/3/p8FOVEYVNKH6wNOp+vW9eFLwPvHyK/fSi1pX9D3yhxtBtdcEUcp3ahHDuuoYy8tV/ns/UozccXU04Y16YMVHMFpRnObHmvCxw1YPo9mRrp6x2d6adRLqgNW/a/rdvUdvX9BpSmTr3PHwc8ZozfZD06I9N2/sNZR4AbcTlLKS1PzhviceGw6xAlyO8dvxcwNfLwnEcXpATGp1EuIjygfocHUkb8W0Kpoem9fiDlWD70uk9pNvo1Sj+rszt5bVwff6ScD/QeV9dyLB4y/4ntKwcs62OUi0e936l3vtZ/7rZ0mPLXdFuw/PlZb9pSyvnSu4F59fPzgDNX5vZU572d0iy79/wGSourl1EuCDyRcqEoxsl/Rf+3yyy3VUZrwoNS1fmc+mc8jXLg+se6E7qdUosy15PliS+jpr+ZsgObRzkI9tqj7ldXsPXoG+Z9hLzvydSJ7T/WZawD/GOd9uBBjxHL3z9M6xMpNRI796W7P2WH/m2GOPlkvCBr0XSfreD/9P6UIY0/XN+vzCBrrkO4f6Cuiz+hBI5/qr/jj0f5TWpevQPKVsAl9fV19fnLlKDr0rodbEQ5GG8FfHCIvOdRThpGeZzN6EHWbZQr9M+jb+j2TprnAceOkOffUPotLKEMGHEzpYni/SgnKVtSTriWUobC/z9K07kFI/7+8yht9Z9NaVLyNEqfzd6B/LN1HTiQcsHiV3RO1ofIf0OmTqTWAc4E/odyc+Jemg2AncZYd9al7D/m1/dv6by+Atikvv4i8B+UbXnWA339bd9BCfaXUPeNnfV07CCLFbS/6VvmfOBFdR35FiW4Xqf+fjtTTmbPr//V/YGHzZDXDpRO/t/oPPceFzI1hPsCypDQp1FOiL5LOQka9nYdD6NcDb+xlm0rpvYVB1JOrEYelh/YtW/df30t67bj/r7TLGdSF716698ulP6Sn6ZRkNVZxtspF4x6F0EHPa6jXOwa5wLDDpQg5YXMcosYSu3djEOJs4L2lZ3lvbwu71JglzrtiZSaW+r3evgY68ugIOsgykWfJZR9x08ptZnrUO5xeAuw9RD5T2R7qvOfzNQtJ7qPj1OOp9+r/8l1dV+w9wh5r9D/drnlt9qo1oQH5YB1U/2xb2IqaAjKzv5g6slbnT5OkDXxZdT0i/tfMxXJ/5Byo8/l0syS5zzK/YaeBzx+wv9Ft2ZsLcp9lZ4wTdrNGPLKOOMFWY8Cvr+y/9M6zyJKsPBylg+y7tuXdglw7xHyXpFB1rsoV8b2qb/f0ygnbn9kqma1dyVvi1nynzHIqs/bU/o9/ZpS4/GbXlkarKt7A0/uvF/I6EHWUsp9t75HGZ58UJr7UA5wjxihXD+ref+achPg3meX1u24e6C8V903XDjs9tS3vPMoB98f1HLeQglyX0IJCm4HXgxsNURem1H64jySUhO5lHKwfAblhP6AzufLPUYoc+/eYxt0tpnNOv9J7/VfUPptDrV99H2PpUzd/Ppp9X+cS5C1wvY3fcu9jhJMvJSyT74E+PfOuvmKIfPZnHL86T3OowS0vffdk8TeCJvvo3RUPwvYfJb816cMWtJ7PIgyqliv1mM7SqB4YF+67ei7UDUg7+0pJ2bvoBxLt69l/y3lZHaDmR4j/t6T2h/37gn0XuA9lAtPMwYqI5Z7Xt1eTqDcdHvW7znGMhYAa9fX+/deT5P2y8B/zpLf3qzYfeVRwGv6pp0IPL++PpoBtbxDrC8LWD7IOqs+96bdh9J39fjeOr2ytqe+5TyBzj6EMkDHsZ33a1POxU6iHEs+NmS+K/S/7X/YJ6sjM0+PiIsp0fo9KFcvycyMiLMp/YTWH9CheH5EvD4zj1oVljGDXjvyM+jcg2YEG1BW1jcCa0XE+5gaBnlWmTnjELx1kIKzmOo7kxHR62s1D/joLP3BhurwPqosw8nvNsPnK+w/zTJYx6spA0ZcxLIDJpwaEd326gH8V+0fMWp79NbWjoht6vPWlHXwd5ST8ZuBG7OM8rMNff0dsowoN7Y64MURlP5fW86Wfsg8t6XUHjyH0kzuQkqNHAzZ3yAi7gs8lXJVMTOzd9+tJ0e5VcIg3wHeGRF75CwDAGTmBVHuG/UOSkDb7fh9LuVq3uc66X8bEU+iXNB4KWUdm+07PI1yoP0R5X97UmYurp/tQAmi/5VSu/G1zHzXbHlWe1Lud9Z1Vn1eQl+/qT7JLH1UooyU9TLKNtv9vwL4fEzdn6z7GuCkUbanzLy+7rMeTdnnnkQ50I9tRe1v6jr+151Jm1ICvBspt724EnhuRPxv/fyPEXHnfbim299n6T97SpTRBY+k/A/fo9Q2fC0i7tlJ+8mIeCklQDx8mHJTTtZOo3McYWpdSUotKEzd/6a/X/K0g45k5v9ExH6U9e8RlO13Z8oV8g8x/Eh3K1tS+tLdUQeASeDeEbE+pW/cDVnPOMfwIco6uH3dp29LCRbPi4jtKfvMT2dmb6CXUe4dRt1HfZByD6O3U37TZ09zbnAApfn1jCPzrYh9ZS37cynHvbsBN0fEcZT1H8qFi4Mj4j1MDVN/KFO3vBimz+ad90Ot23xSLt69FHh1RLw8M98WEc8HzomI0zLz27PkObHtqZZzP8rFrocBCyPiyvrRAuBlEfFDlu1n+1nKeejZs5S7FGAF/bfTifG3ozVXlNGxTqL8+PtkuaHd84FXM32n28wRbvQ46WXUE4PPUE98KE0a3ky5KvFQygnMRpR2/FA2pHMy88nL57Zc3kGpgn8R5SCclBVypg66mZ0bvU2T74aUK2BQTpK+QrmX13Pq9NMo1coDB7nIzB8OUfYdKMOBrjVg+o9z9Hv3dPOY+HrTWdbnKVesdqsnV0cy/cn9UbOdkNc8lwIPyMwrhkg79O8VZXSkP1GuJA06Eq5fp99MWY++T+nXdP4wB/qIWJKZa0cZkegHlP/gxcBzKQeYV1KahH06Mx81W36zLOuJlCtsj6M0efkk5Wrttztptq3LWz9nGII9yr1zPkC5MhiU0eFOpJx4TneLhI0oJw375Aj3kqsdrd9Mac7xlYh4MqVt/kOBX3a3h4h4BWW72yZnucl3RJxCqWnagrL+nU85Yb6YEnjeQLlaeD5lFMmfA8/KzN+NUPa7UdafAylXJQ+gNB17P3B2jjH6Uz3ZO5mp0dAeU3+XpZS+AIspzQNfz9SFjC0oA6U8O0cYuKMOmLFjllEAF1BOyHevy8xx9z0r4BiyN6X5ZM+elAs73X3J7pSTxl8NWM5es5T9fEqLhUdT1vlHZuaDapD1697vUU94TqXUgA4zCAQxNXIblFqeXSk1Zn+gXIV/ESVIPJYyNH234MOMqnl3yj5qW0rTpauiDNF/Rv1Oz6/LWsaI2+yk9sdbUWo3e7/vepR9b3dfu5TSlPDzlFu+XL5cRoPzfjll9MInZub59X++kDJS5yOi3Ovq3ym1/b+mnDB/GvjSTPvKTv5vp/x37wEOy3Kz81/UsvffLHxdynnDa3OE+0xNal9Z0x9LOR/bgXLfp1Mp/T8vp9TWfodyDHgUZd28c+CFnOVm6BFxLoPPAQ7MMjL0aykXyJ+emWdGua/jepk562ASk9yeooyouCmlP+cGLHvhfmvKueBlfbNtAfw5M0e6ldAk/9tp5RyrwtbkB+Vqye8oO4TdKVdQN1kdlgH8U99jX2oHdKaaBxxBuRp/52OM5TycckD/P0boZzFEvnc2F6zvHwj8N2VH+jpqf48x895wwLSxOp+vxPVmB8oVmX9tmOeZDNm8kMYdvZlqkrA/cHxdn64EnjbEvL1mpXcDXtt5PIXSV+83TDUT/HX39Rjl/Dilo+yTplsHKSdedw72MESe96QME/8FysnOqcAeM6Uf8zc+pG4/u1KaRCylnIS8pS/dRpTailH6TW1U9wOvogQvl9b1/hrgpJpmY8qFn8uHXc/qfBvSac5Euer5PErAdjllhKtx17u/qOvbYsqFpy8z1XRwKbM0TRtyGTM2+5rrvmfS+xtKf5/Na74b9H32KUoN5ah5/hXlgsjm9f0WdZ17AZ0+v/WzoDRvGqo5Yme+x1EGSbiZEhBt1tlXBCVo/y3lJP9eY3yHDSkBxJXUptr1e1xU1/859emYbb0Zdx2iNhccMP8OlFq5PSn9g15LaTZ1O3DEkHl/CTig8/54yn2f7jNgnXo15YLaEuBNQ+b/H8Cj+qb9AnjcNOnfTGne+bIRf/uJ7SvrfEdTAvL/pByPLqX0lXpB/fx+lCBi7PVnmuWeSBm9cytKAHfbsOtp3Z6+OsHt6ZkDft99GNBnjLKvW8oYA2FM+r9dbnmt/8Q16UGpsv2nugLNo94ZenVbRmdZj+q8fnfL5VBOek5hwEkJpTnA4SPmtz715Kxv+mMptQcPGbWMsyxvS4YcZWdl/ac131fXx0MoQ87vXZfxqb60T+7faQy7jBk+uzelNvEYSu3ih1r+B33LWptywn7sTGWqaR81w2f3YvkR7+58TKjsCygB67T9BGaYdxfKgXesDsRD5L935/VHB22v9bO9Rsx3d8oJ1XxKX53NKFcmn9j9HSidrU+n3Etp2LzXodSorNs3fV1KDcjxwKZj/BbzKU09t6E0/Tqxfo/etNdQmjlu03mM1G+FUsu00SxpHkKpMXgf5YrwqAOPTPQYUv/PXh/Jcyg1cX9ZP3ti/WznMfJdq+/945gaJe6kvs9eyJB9ETvzPLrup3rB+XLHFEpzyw9Q7j84zm+zcV0Ht+xM26zm+aDOtKOA+42Y90QuelGCw5eOUI5/pNQaDZM2+t4/D3j0LPPsBNx9Duvn+3vr4zSfv7juI0YdOXXvzutm+8o6z99Rg9G63T6GUsO3Z522HuWi8t3G/V2mWe4GlNr53kitu48w70S3J0pwf0DftOMozcQfU9+vTelLuBsjXnRZUf/tcnm0/APXxAflStiMI7RRDtZvZczalRWxjGnyfFpdiZ/KNCOaTTPfG5i6AvmBzuODfe/fRhlZcGfKgXiooaeBI4dMd+4E//exfptJ/qf8//bOO9yuomrjv5VKEhIgIUFqCCI9VAER6QLKRxeQIh1EqkgHqQGkCiIKSC/SkSaKoHRCUZoioPSOCEIIhBRy7/r+eGfn7LvvKXufe869517mfZ79nF1n5syePTNrzVrvKjnp34xW8y5PnU+cNpdEk6wZ4R3k1vQgge0ZKhATIJvp25FJ30xgYhfqdwE08FVc7UGTrkLO4gXTzk33TQ3a7q60xTBYXZo6HoUmziOAa8rcvy2BkKEZG3Jo3qfgM7MISkIbHR32nyfj4F1nmdYnRS5S5b7FqUAcUubezegYwqK9ypZcnwkcXGe9lCVwQRrVQ5BC4VHglTrqp6ljCLIsWAn5j9yDTMigRKefK9xCD7TLY8lJ0oRWSVbJcd9SaFJcaTsGmTon9y8a2s3WTaybMcC5DUzvZGT2exUyuy6kMEJjSVVChdS930Hmrk1tP02q98JtMvP8moTVqwrXhyHlT0MtYVLp16MIvJcClgg50kt8GhfJjmt0Dn+xQTi3eau/21npNLugvX1LXjIhbhNlJq3IJ6GNKtqUns6jQr6nIFaY6cCDBZ5rB45N7R8XynZsav84ZP70Qfhv7eSc1JLTjIucsS+6s26a+U4JQlbY/zolJr3BIZ2Bob5vJkVvXaDMiyEn1rdrlQmZ+7SRgymuwvNnIp+mhCJ7FuV3tg5bIe1KbQ0JQ/0phUnoV+5d10h7Djqyzb2LJnJplqiFUvc/l3x/OdIejvwerkAT5MHh/JPI9HFHMuazyHG9kABNR8GqnY4C1xQ6m2IUUlwgu/8JmXPfQILDBMJgGN51W553gISsv1JaNV087Ge3FVEQ3P5o5VIcAUgAACAASURBVObvBeslqYs2ZHaXBAoeiybgy6O+4BAklD5cR5vvkTGkTB4D0SSsFiNod7bLaYgevmIMH0pU4DUF9FC+D5CZ2n+QQuu1sH2BhKw3KJl+3UToqwvW44ph+yqZmJGZe2+mjpVL5Oz/PjJ3fB75Od6O/LM3Df/jauRXWTPcRSbtW8gxQUUrry8CN+W4d/1Qx68W2F5BiouNc6Tf9DaJrEFuSB3/GLg9c08/tIp+QmgH7QSa9xppj0R+7L9HJtsnIV/Qas8cA1xfxzeVmzUwR3obo1Aul4a6njOTV1rIug34Vx15dEt/UzbvRlVUX9mQ9ni3sB2NBqWxSLvcjuxmN8888wvgmRbLY5EcnU9iR74mBSbMoYyvIg38LKrQ9PXwOzakmwTb6+QLVSH998LvcDSAlNt2pk4hqxl1003vNL1itRIZISvs1yX0pPKYC/mlfEINrS4FfAYyz80T0j82da4NTZC/2pX0m5U2pTAIN6S2JIhnmm6+DfhvwTLPEZ5PhKz3KAlZ7Yga+m00+I4O53KZy6ba3/HI/+Gy1P8/F01aJiNTleGhXU2nuGlWVrBK72+M/ADOCee2C2Wp6bOGzOg+D2WaEfanIPO+p5BAcSIlIatIvKBEyBqMFEIz0MA6f6otXYQmzkm9LQC83IV6GZl6r+nVs4/RZPBYapgXhrSa3t9knu2HhP+0sD8XcFjmvmS1vaJQ0APtciW0Svg5ZQRMNNFsI6zO5UjzWkoC1MaEGExIYPgg7K8R2vyZiGY/t1lWeH5sqo3cRyaOFWLLS4cdqFrfFfI4DPmsbo78YfZAplNTSX2byJpjUsG0bwnl/zDkcS6wNZ19+o5G33OeOE0L0pH6P8+2CzJx/yBH+k1vk2R858gIWeH6E0gx8KNwbgap2GxV0k76laNDu3sg1P9QFEYjuw1H/cTZOcr8s9TWjkz2flZlOwnYmxzm1WiO9SYlsrMnKSlIZ43TSNHVToVQPj39bivm3dUE+toWGlQ7kqyfB67IvKSzQqO/BgkZc6HYPvu1aB77hu3o1PF+dF6GLeJk245MAfejvJCVnFsCTQ7nC8/ksi9Gk8yT0KTjA+Q/dhFindkLaQ+/iwbNIRSMQdKMumn2O0X+J9tTWchqR3Fk0tsE6tA4hbz+Et5DxcGvSJvJPHcV6lTvpOME9NfISXq1etNvVtqUhKwPQzv5AMXImYSciD8Pv5Mo6PRLaSUrYXtNC1ltyGTkfTRJ+Skh7lHOtEel2szXgNdS/z8R6r6FzM3eRCuZZ9TxTqsJWWOQDf2HwJXhv+Sd0N6HhKFT0cC+HpoYDEGDZVbIWoSCQlbqeFWkyf+Mkgb/PlKBddN1WGe9pIWskYhVqx5z5KaPIZn8+pPRYFOGbIFiQlZ3tcuFwv58mWuron5uKrB/gTTTQtb/URKy+hMULGiF9REkQNQzKUyErKGUnPPTQlZb6n/VrO8KeSwR2sSA1LkF02220nvOkfYtiC31m0gRcAkavycjH6oFkK/XTGCnetpkgbIsQ47V7e5ok9m6JCVkIUbKT1G/9n7qnknkWH0mZfmQao8fIwVjOyJpuS9s9yIFQc1VMmQ18/vUlgj/kzLns9sbhDiVNdJfAfgw7A9GY/cjqbpfDAlgL1Mj3llPvtuKeTezcffGrVKHknlJSyKTnYlIO/gixXyauj0PUsHWUo2rXiGrDU1uJof9CeH5CWjCk5ybgJxO5w7XazmAj051DLeiDv81ZL7wfUpCxUtooEtrg4sE82x43TTznaJJ9pPIrKOakHVRarsYOaw/V+d3MAxp+Z+hPBvj3KHuxxVMd0ukIfpmeH6RVB1/DWmSpiD2vqImfc1MOxGyXs38fpS5XiQw+bxIcLg4lOf8cPwZnc0Ff4KUDu9TgAU00/7mB95J1Um/1H2bIs37THKYpoRnBhJMO6huLpjsL4smES+S33T43vDcwag/GZtq9+WErIXJ2ReQEbLCuZXRavYUJGRtnbk+hgJshmXqIhGyusRkSjeMIZl0mylkNbRdlqn/cUhQGYn8LA5GfqvTEYlSIUUU1YWsSUgR8hYyN98QKWWKmhCPTdVPooQZkflfhYUsRC6Q3v6LFJfJ8XeREPQtYOVqba1GPreQ8TVCpqwJ4+PnaIW4sNCPvvd/1NpS968MtUlBuqNNZuuSIGQhZcsrSPCcH1HeJ/f8B4VqqZV2p34FjRcrkhGcw7UzyfR/Bb6p89E87W9U8HlEvlYzcqS3BCkmRaTkXT+V10pIGXI39fMedEt/U26LwYjrgLu/YGbrognA/oji8YvelkdX4O5vmtmbaCAfHU6PTt2S7M+kFIyuVvyRjdCq0nR33xygQoBBD/dtTimuVsuj3nfq7lPM7Dq0SpONR5O6zfdMnzCzxYAXzMw89CDlYAoCXS5A6SA0wX3SzLIBVBdFHfibtcqfymc8shU/0t0fsc4vt83djzKzl5AWrGrk6e5Ku4lwSiaGhF+nfKyT85Ap2YvIdr0ejEQDdoLxZrYBsA0SVo5Fg/1NZraCu08tk0YaCwEvmtmzoczrmNlt4Vq5/zA70vDvUittMxuDnOfHoInqeKTV3xiYw8y2QZPPTVAfNK+ZbY1MCAvDzIYiIXx3RHhzJvpGrzCzPZBg+7a7/xf5BbQ8Wn0MSaHR7TINR8qMhym1SUNC9P6IcKaRgdpnR5PL3dDEcDYUy+xjtKrY03iszLnz6Nwf7onG7jwBcGfBzJZw939VuWUIUuB9gt5pPcHh/4RWNRIk89hK7/FVKscdrIRmtslOcPdJZraYu7eFgNADzWx2d/8MCs3TLfRXLyNh9gE0TpfDVnSMg1cEZyCyiqOAO8zseiQwT0rdMwnoX2v+gQTuwanjRdz9z6nj36F2u2uDvtVufbdRyKof86KXBRrse2se9cDMbGVko7+ku+9tZnu5+97h4g+T/XA8PxrgagUbvB7950PN7AY0CFbCJAB3ryR0tCrqeqfufkYIGlkVpijv17kCWBrSoFbr4ECrC5WCTf4NxZWYSscB+jHgSs8XuDMhD/gjYsA6K3XZs/vufll4rlbSTU272XD3/wD7m9mcyB/iAHdvN7Ot0veZ2QBk/jUJOegvjkzmiub3LNIKJrgLrY79ErjR3aeF/DZAA82RNZJ8AylGVkeTmKuRL4ED2wfFgIc0DTgHuNDdH8lR3K+G/MciwWd2pKxJlDpHotWJfdD3NBO1g+2RdrIo/hLKvqK7vxTOnRaExkuBR81sUc8ZlNLM5kMa0TRqfYfNQKuOIbPQ6HZpZiORH+MN4VRifjsQCe3j0Gr3qcBxZnagu9/YoL/zkbtvnzqeamYnASea2Q0NFugKtydPBVsFCEL4pe6+cFcLY2aLAM+Z2StIuHzYzIahut4YWRqAFBi/QQF3bzezD9z97AL/YaIpwP2briDQpyAig4PMbB1kAYOZ7YSE6Xvc/Z9F/ksT+spqGG9mq7v7xJD3VDObgb7bz1C7LRJwfWe0OjQT2Nnd38mOd2a2CupH6xb83f0T4HAzuwkRSvzTzDZx96fDLbOH+2q102kqkg1CBBTnmtkh4T+A2tJ/UX+cLcMBdZS7O99tFLIqwcxWAt5w9w/LXNsNTXouQZPP083s5qJawmbkESZkg5DWl6AVscxx0tEOCRrc5VGH/XGB4m+H/LLWy3HvAPStVR1gQuM+1czeRx3FSTRwYtIdddMN7cbMbG80kbTMhdmQmccxYYL7MzquLpaFu/8DOalWyvBzRGl/UJ1anf9DJjZnuPvxmWunm9mnZfYh37tvZtqY2TikrRtgZhcCozK/Q8LvgMzxRyiO2EsVE69elqVQYFZDZnEfIgfhZYCrzGyMu+cWJsxsDTq2F0ffcDJ4r5IawG5FJhXVC63v+S7gLjP7KRKAVkDKkuNQW0+wG9ISfjtPed39UWAFM7sPsUF9GwkJlwC/d/cVzOxptJq9ByLLOc/MlqKYkDU8TDQvQea4C5rZgpl7jkWrE6sndeTu99ZI90S0yuaUtLQNl+y7Y5zKoKGCYjPaJZpkH4go2UHO61dm7rnYzPYFDgd+a2YbAnvmmBAm2N3M1g7lGWNm14T/MSLspzEYCXYHIQr9emDAAma2cOrcumb2QdhfJ9l39z8WSPchYKSZLVNFEJmb2gpS3P3VIOCuiQSqo9FKyUzkE7st8rVJ6vguMzsIOMvM7nb35wqU+0jgOuTjmcYBqI9MvoeF0AR9hbwJN6lNVsMY4MGg0DnY3V9DK31zI0uRQkKWu68R5jr7ALeEdurAwmb2c6Qc+xrwO3f/tHJKufP7WxDabgz/Y1t3/0PIZ2T1pwGZ7Rp6pz9Bc7/3gNVS98xJA/rPHni3Ucgqg8Rc56+Am9kfkSa1HU1wn0VOeD9y9+vMbC5kc70z8q3o6TzODvc6akyfpa5lj9OmNTe7+wfkg6MI8J+acBgq+GEhj1nnAm5DH1JenIwa90Aqr7DUg2bWTXe0mzZk+rMFGlzSnZAFIXUD0yrj6Wi1aYGcaVfDUci04FDkF1MUCTPeqArXLfVbtCNtZtqgCcInYf8T9I7L/Wavr4ne0+I580mXbTqaoCcrIcOQTf5MM/svUhR8E5lA1UI7Wqm8PXN+MmLprARHlOJ5YcAn7n5jEPCXRv998ZCXISH9kyppVCpHpYlvuWtzU3oftfA50pJeTPm24anz2f1FaqS9L2JV2x94ysxOR/4uyeSpq2h6f2NmW6BVvHQdP21miRDbL9z3UZmy1ULT2qW7/x1YxMy+BewA/Mq0wn8aWrVpC/dNBY43s4nIh2gQYu2rhZvQRB40PqUF7nLmV4YYy2bPkXY1rIvGsATJe/TMfk0Tv9Aek/JMAX5pZuVWx/sjBUee1edkdeP3wO/NbD/E7nc4Mvk9OSvEuvuvQztL/MDyolpffmIiVJvZV5EPdx50V1+ZxT2Irv1EtBp0CnonY8L1vELWZBQwmDBWPIVIw34Urk9HAufXkXL8bjPrV0RZF/AKKaHbJJUMQauVlwG/Cytaf0arVLWQpPUYYjR+MRw/bGY7UPJ1PLCOsiboqXcbiS8qbajRJGZSL1Bi3dmJzjF3TqdA7JRm5oF8ZdYKabSF/bUQM1lyvHbIZ0c0GVy6YLnfSu3/FvkKVdu+Q4EAmwQK97D/Gp2JL15EGpKpBcvdHXXTHe1mTyTs9E+dG00qQGCor1wBHkMZ16pxz76og67XcX5VZAd9furcLEd6Mk71qXM1ySmamXbq/kLEF4R4TTnTHoQmBtnzCQvdgwT683D+RuAX9byHZm3I2X9Iqm6rxkkqkO59dCa+eDZcK0d88RPg8YJ5nBi+W0PECAnL40UE0hdkfrZ8nf/h+6F9vhj6l9EUIEipkXbT+hskSO4Vtn0o0UMn545D/eZeqS1hZy3MdtekdjkCKWBORhO1fSvctylSqOxdIO0/IkFlILBN6vwjBJIn5OfxKMXjwo2lCcQXqed/iSbElyFCgcmp4/R2KaK9Hl1H3b+LlBiDUUy7PZCJefa+8chsrQix153AjmH/FOCssH9Lcj4cjwLO7Ol2mCrP4nRkYs5SuG+IBPc2ZF0yJLzfsTnSvgA4KewfE97piqGNZhkjV0LWFocWLP9A1A8PCsdJMPJHUsd/QCtRecmN+oXydQo/E86viQi4rujp91fXO+/pArT6Fhr6+8jvYPfU+RHIB2ENtBTdRg4GmO7Kg4IMenWU2YCROe+9Dvli5E37PaS1uxw5rZZjFzwTDYp7kCPeTnfWTTPeKRL6Eia3zUMH+Tdg8XBuM1KCLNJwb5ezrD8M//npkE+nwQ6ten+ti3WyItImHZKq53Gp/UQo2ppS7Ki8jJdNSzs8V1TIWokajFahHT6KJmXJb7JNpEThPhpNWG5Ek56/oUn74Bzlng9p2otsfwDWyZH2MMRedxSpARIpK+pigSqTx1DU1+yBVsKgJPishiZw+xBYAEO9dRJYa+TRhijOh4X9IenzqXbzH2oE9yyTdhLjZSRi5FqpEfVSJp+mjlM0nl2wae2yzLt9LtTPguW+GWRu/CPko/VAwbRHkmIuK9Nu+oXv9fiC5R4b6nEfNHkuJ2QtmNqvS6hFgvQ2iA1xWOr8/HRROAnlGpI6XgkxChYKcZF6fkPUx0+mFDNvMlotmVbmfLJ9CkzOkX7T22RoD6NSxz9G5s/pe+ZEKy7rIQXiVPKxEB+OTLUPRRYeaYbFToovZFr5PillbY48kj5yBBK4bkHzsUVT9wwFlqqjrSRj9EYE4Y8Shft84T+dXmfb6Zb+ptwWzQUrwMwOQKw7v0FEAh+jARwAd59sZq8jQWBZRLFdk5igu/NoBsxsbiQ4TQK2MrNvU5klaAU06fp6jnSXCmkOQX4ERyItRjn8GXUSPwV2NrP1PTgs9iSa8U7DcvyBwJlmdoS7X2ZmzyAB9Ekz2wdN0sea2UCXz8U/kFb+2lpldvcLzewJpBE/Dzjf5Hhbrizlns9jd427P2VmPwBuNLPE/CTrV3YYJZY3z5Nus9OuE9NCXtXwAZpAJfgBmlydnL7J3T8ws5+gd3khJSr3YdQ2wx2CTJt+Eo43RANXwt5k6FvbLfXMCmh1p5b5zkBkGrQrcIKZ/RWZuSjhGuQi7r5BjfRBA91wFFj3bTMbAXxgZm8Bf0ffz9UuB/itkA/l92olavK3HI8mwGlTUkPO3DPC/sEmn0TQIH+vma3j1RnUkjyWAh4P3+yvgb3N7Otm9gvgCHefZmZXIt+Fm73kMJ4bvXUMobntMg1DWv0DgJnuflGZey5H39Z4ZLZVOTGzeZHJ5UV07F/MzBJTagOOMrPEf/Ut1KZudvm/5oWjNp4QQG1FR2bRRvj4rYNYJ7N+iP8BdjKz+1z+NTVhZovTkcXRgTcy/UB/xHjbyS/Q3cdkz2XwBFIwGupb70OrcLujvugC9P4mhvNF0fQ26TJ3+5+JJOR19D6vydwzCa2sYmZXAbd6Pj/KF5HAvD+qi/vMbAt3vyVJOnP/5ciE9tvIt7Ysgqnx+HCYrPivTilo70HAfCayn/Rza4b/82COsrchRsXvIeunQ9MX3f1dM9sWuN/M7vdifodJubujv+mEKGSVgZkdhbSzd6OG9N0qE4YFUcTob3oB5qDuyKMZMLPlkZblXWS2BtKgfKXCI4sDh3s+FsAlEEvNVLRqMtPMzkeTz8HIwXgC0joPQStZK6CJw9Fh6zE06526u5vZ11E9HG9m2yHNPkgQPRdplBxpfZ4DnkWkELng7k8h35HjUKf5E2TG9iu0VN8QuPttZnY1es9309EPbreQ9w9cfiSXtUraKcwZ3vMcYRJdqSzPUaM9uvtHiCJ8TmSScyDyBXzV3R8ys3lS915vZj9GK2VF2Y4+c/erYZaC5IvkOJy7MHP8HFr5qIowGTgCOMLkXL0v8kMztOr2QsFyVoIBT4QB+J9oQrUvIgdZCxG9PIy0vnu5WBtrYUkUK+kz9N0sh1Z/CekmdPpLUvIZeBX1OwegFYbKBRaJzg3Iz+A34dwcqF4+AfqZmNcc9aNHmUJi3IwErollE+6YR3eMU1ujfuciGq+YaEq7NLOxSBv+R9R93gzcbGZbmchAyuEjtHKzXY3kRyFh5zhUH3NT8p38CmqrjlahEwXI5HDP+kj5lRsuJr1vIYXMz02MefsWSSON0L8PS51aFhgXfLSymITMP3MJWUiYTJhRDfka7YTG8wTboD6iVj13grv/z8yeR5Pj/6EYkPcEJe/gsL9fcr5o+gFNaZNpmFjrrkOmq9ea2TkVvttEiMk7yX8NrQb9N+RzJmqniZD1hJmlfbu2QFYTG1BFyELx027KnLsj/LYhQbFSx+No1asWZiKLjfORVUKnNufuD5vZRcBFJrr7Kdl7aqDp77YcopCVgYk04FhgY3f/l4mB6DiksS03yDyHNKcnII1kS+SRyuu76AMYlTl2YC1TLIYisWVmoInC4enB2t3Hl7vZzL6PJpJt7v7Lagm7+81mNg1NBq4yxXv4beqWG5GAdS0lSu5JJkfRk83sWC/GuNawumn2O3WteV9lIhU4EQk+jiZld6COtB/S5D+HKL4LC51h4n+0mf0G2e3vHf7XGaEMjcCByO78sWRACLgJuMnduyLUNTNtUH2PC7/Du5gWZjYQKS3mQLbuv0Htf/kyt58CXGNmp7j75ALZJIIhyMSuPQh2CQaY2cFoMvhv5Ni8JwXg7vcjLeOSiBV0SxRL5bgGKIZOQBPYP1FiHP2zu99lZhcjbWwS12d5M7vRa1Ctu/uTZjYKmeRsjL7Tf6O4Mtu54tV8HzHOdSB2sCqSTArLo77ye6n//ws0wV3L3ZPVsZ1DeqsgkoYd0cRq7WqJd+MY8joSam8Nx+ORsNkINKtdzoME4V8jUpB9EVHQ5miluBzakJA61t0r1o+Lge/rZrYi8hN8Cmne/+LuPwQws92Rk/6sdmNmA7rwHcxE73RltILzNPULvHPQsd8ait7vXGXu/TuwhZl91d1fqZVwaNMPmNkPQ5og/8lZClZTvMW9kXn13+oo/4/QyuR0KsfE+0FQSiaY7u6HVrg3i6b2lWa2P2K9PBMJWiBykFvpTNgzGq0o5mV9fgsp/36LBNGBiB5+FyRQZfEGWvWryhDt7ncR2oyZzY7++3aoj9oKWQP8BviD5wjpUgGXIrPDJbL9bQZHI6XPUciKqQiaPg6WhXfR3rAvbqTs5pHWqI1UVOgy98/VankQHCxzbDc3oL6Or3F9F9Sp1PQhCfcPQ6YAj1f73wTiC8TCc2S1+uuOuumOdpN69ptoMp74aQ1DE4tFw/H8yGQgV51XyWdnJOiO7Wo7yaR7ILKVny8cr0rG7pw6feOakTYVSFYIhBSptnhxwbKujATmUam2/Cnyk5uHjk7ShgbGgwqkP5ryDu3Z7XpEsDEJafWP7uL73QiZsY3rYjr3AZuG/dWRv2ZbaO/XowHx3lCPyyCTor+S0180lc/cyEzzHEo+WZcBQ7tQdsscn4ToxKs9M4AUgU2Ne7uzv1kKKSra0UrxnIhI6OPMfXl9spreLlGstR+jyfjk0B4r+pVSB1kL6ofvANbMtNnhXWz3Y8P7XDlss3yykALjqqSN56nvKvnsToVxDint3gbOLpjmMUgh8hJSNDyHxqJlwvW/UrCfzKS/AlI4fYLME0+lRHyxBxoX01su37JuapOnE/qz1LmyYxGyJHk6b3tC48Mpqe3nyKKlIpkLWll8p0D5h4XyJm1xcKjzV5FgsllX2n2Z/C4D5smc2x9YtmA6PTIOunsUsnK8nA1RgLJenUdv2xAr0RnIsfheygyAFCDT6IHyx3davX4GIe1VRdYqZAo2WyuknQziVa7X3RbJTIyR+caIsF2WufYjakzUu/heBiCN/zbNyqNgeQ4nxeqHgutuFvb3JkNEgTTzv6FOJsDeunVXfxPyeQNpeZcrcz2XkFVHvkm73LrO59dGq89ddmTvpvc5NtRjG5pkz5rYlrm3K0LWGsgkcDbgvDLXDwUmdOF/zBHe2xmUGBc3AfZvQB2NQszFe1KBNbLJ76hLbTKVTidBInVtMWSSXbeyp0beI6uNk2XuH4gEuEGZ84OQyfsZBMVvb97C/9yiEeNgQlUbUQFmthZicLuwwvVhSFvyEy8eA6ZW3oOQKdGbSEvwW3d/v5F59AaY4rIs7O5v9nRZGgGT8/7FSJtXj4Nun0UwER0CTPRiZqy10p3NU8QoZnYicLnnMINpNoKfyNVexcQt+H9dgWj03wCudfeHGlyOlmuXrVI3rQozmx+tENxlZkO9ZIaYXDekcPgEjSG3ez7/2Gp5jiYEmvWM/5spCOpVwH7u/r9yz3ch302A1dz9qJo39wGYWUJQ4mgVsuzYH/yszvacJsRmdl7m1IOIEv0jd+9fb3nL5LMm8KiXIW0ws2WR6eoujZ43ZfIZhQSwQvEdQ1/YCUkdm9lsaBXzm6hN5vZ/LgozGwds6+7lYrBVemZguXrP3DMPcr3YwHOYssa+uD5EISsDE3vQOe6+TTj+MbCeu2+auqcf0i4MRiYg09HyZaWI6eXy+RyZYFUMcmtmwxF18HxoiXy8uy+WI+1FgL/kLUvAZ+h/X1LwuaajLwlZYXC5FTkDb+PFotz3eZjZTcg8ZgHgKnffJcczS1GZeAXkOLyWu68X7l8U+axt5+435ki/qd9TcEae1zv6kGXvGYcYOkci88ct3L2cH0VdaNV2WWfdbO45GS97K4KgczYiJdjb3dc0s8OR2eC16Nv5Z5gsbk+IhYcIPsa5+4cF8roUhUao5itRtPxzIGGsGk7zQABiCiZ8LApsv5V3YeIS6q5ikPtWajumgLKbN3LsC+PpNYhOfSdkmnwTQcgys08pmUv9F7GZnuUiuimSTxuimX83c35jZIL+OrCluxfy8Qvt8cg8CmcT4+HzRYXHUEdOR0KHdrRicxsiMXkLUeAf7+4nFkj7WOBX7v6RmZVV3gdMQX5bnyHClGGek0HZzM5FAuAFSDD6vMw9YwlkPu5elk04c3+Pj1P1wsy+hnwM88KRP9xB7n5bV/KOxBedMYIqFMDho70a2f8f6O5fmNlMZL9cBLMpORuIfI9WKaNNcMROtTKKG5XX2X0gsDCiVgbZo55GiZ4yewxadj8H0VhG1AEzq0rsgehCj0Dmj/vl7TD7Isys3MB6j7tvFa5vAtxqZgfn0Igfg2hoP0OrYCOBRFu/ACKUWNTMfhhWpE9FA29NASsgz/d0euo6FPueZg3kwbE4IWQohy9Q5z9bvqL3+nZZT90M6YZy9RiCku93aJKaZtg6E/kfbYdCO1yDqOIvCMrDZdHkuSgr187IFOgjM1sITfy+SG0zUMiCqcCHwEM5JiazIcKRcpTpx4X/8nFYMbgSme781N1Py1NgEwtfOdyOxuo5EX15ggHoO/h2nvS7EcsTvnUzG4l8qKaHLanzKUgger7AqtA+Lnr/nRGhVFqYGIYCTdBpcQAAIABJREFUSw9G5rk/QMQs3ylY9mwIjblQv/kD1F+eUm1VpAp2Rn14s616ZgkfYYV2BpqTnY78kCajun+2YLrHh98JIZ0TkAIhWW1L9ldH/n6rQ4cwE3lwDSKrOAs4PQimv/QqpC450NRxqsnoh8qyTq0bAwwREZ2LhOr60Whbxt6+0TlQ7ayI3Mj291PkjPh+6p5JlLFPr5FPO3JyT2zYB4Xjz1HHORPZY7ch+/fTyB/8N/sfxlY7DufGhbxyB6ZrQt3Pjhyss1s7+pjLXZu1tUDbaUcaustCXWZ/t0Mf+krI1r0pgUl7wxbq6mA0YO4SjrdOXbdwrmYAZKS5/2HY35hSoOABwAdhfw1E+3smEsZWLFDWpn5P4b5F0WTyUaTkmQw8VGG7G5nZ9Pl22ey66a0bYvXqh8I0PJi5NhrYFpGEfIKotKchmuZF6shrls8PJdKgs9Hk8GTkh/Gr0J7+FPL6WY0058l+M5n8xoT9R9Bkbe06yvwmorV+DQmkbWis6JQ3it9UlTikh97zLFKEVN3/Fc1BnkcrEf9FAsAUcgSgD2kMT+2PQL5TbalzQ1P3rwpMq7Ps8yKl19EEEg1Sgcu7Wic57u0UMLvCfT9GlP/J1hbacnJ8Zzh3Z5n7Dq2j/Ek4iFl1nr4efseG9JcIzwwrkk9IYxiatz4b2shVlCzYkvQH5Uyr1/bF5doBUlgsmDl3AnIPAjGp1mw7tba4kpUTgerxCMRc9ic60thOo/hKVtls0GTnO0hT9QnwhivAZLPRD3189VJwNgIbIq1aOVOQaj4iCe16w+zJu4BEQ7iTu++a+t0ZUZxOC6ZZ2wE/M7MzvXjco16JYCZxs5fMam/0YAYTNG2PJ/e6u8udpHDATc/sJ8d/QyZCeyNhrmH+XhVQ5HsyZBY8Dmk2lwD+5e6zYnSY2ZHAS+6ejVeSF721XXZH3fQqhPe0K5o8fQVYxMxeRDTcc6K29wkSLJ5HCqpHEd17nqCmteDAuV7BzMvMdkAa9Eb4Tp2DVsberXlnZ3zdSzGDZkMKzLfp3Sud7u6rZE8G/+1TkDK2ZgB6OvarjiahlTCVEiV75QRLIRHSuAitHjyGVnAmA6tb+aD2N9TKo4n4K1KWg+pmQ2RCmXwv/REh0Q1I4EmwPPC1OvK7DU3yyyEZs4YgRUliwVQ4+LQrllQSW2p9ZDFVr6ltX+uLD0YKmLcATIHdD0e09v+mMXP6KGTlhSse02Ku+ClDUHTq2d39M7pejx0mht4zTudTEMtQT+JuSpHFExiyR/4OCoDc6qjZgbn7ZcBlpkCf5yP6+S8DjgcOMLOmOQmXwSAz+yli5XsH0R8vambWhcEmD2p+T6EelkVt5lIPjs1mtkTmvp+imCCVTKDyoFe1y26um96Gj5AZ0TQULPm7iNb4E7Ra+yFaYTrUFdB9IeS7daeZbeY5g3gG36XEn2IRM3uvyr0rufuT4fAZYO5GfGPufn1Xnk8nReYbMLMFKU1cEwXdQkg47VEEf+wdyBkPy91nmNnlSAlcLd2FyqR5LFrJqYTRecqAVkZOzpzbKOS3EHAYlQUFRwJMj8DdH0WKCGCW0u9NZFEEah+GBIiHU/f9iOoCatns0IreP0MaE1K/lj6HhObEX6qikBXMGXPVn5ndHHaH5ry/r/bFafPHNZAZ6Lap+bchZs8uIQpZ+TDezFb34ITr7lPNbAZaBv8MaXl6cgWoy3CxRGVZh7q7DJ+imBodELRe//beQXxRU9tkZlsiE55HKR8Esi/jPCRMdxfjzuzA0sh/6i9opfgyFODxmmZlmvN7+h/SZhpwiJmd5BmfCjM7CJnwbZAe3OtAb2uX3Vk3vQru/jYSgpMJ0Dfc/f5AKJAoqQ4AngvjFMCFaNK+HWKQzIMJyDcH1C6SAMsdYGanAgeb2Yru/iwyUaIRSgwzWxX4mxcIMl8tucz+63T+Ll6hhy0izGwFOq6i5EXV1SZTcO1yRAtPI3KUSgLtP9GqRVUE64BZqzqBPGIrtPqxDCJhuMQb4/PZ7PHjTRQKIo03kNCzeurch4jooRDc/U0zexMpSRIhNi3MJvszKbXHWnPMoiyNeeesfbovDr6O1wDHunsSdB13f4YG+GhGISsfxgAPmtltwMHu/hpq0HOjj7EVhSwLbDB5jwGmuHtZ6tKIhqC/mZ2NTNa2RSZsXyY48t14HnVqJ5uYrJJrzcBH7r596niqmZ0EnGhmN3gO6tqAhn9P7v6YifVoN6SB3s3MDiGYh5i0C/cCD6RWCZqBlmuXLVQ3vQnrIlMe0IRoUzqOS++hlYW8QtaP0cTpEzRJPoKS8O1Be34lsjLYNAhYIIf7T+kakvRvBl4zs22DcNmlNAHc/f1AwtCqmIZWKo9AK+Ibmdl45EuGmS0NvOadGeNmQwyhlfAJcAgSdtK4g0CsYGY/R/W0gpk94sL71E8y8Zi732xinTsFONLMTgYu6KIQfoaZ5SECyz2fMbPt3f0aAHdfOHNtdWSKi5ltlLp0P/CzvHmUkrOVkWXOku6+t5nt5e57h4s/TPbD8fzonVRkAAzj2K6VrlcoxMLIsqMq+lpfbGZnhd0xaMx7F3EifCV1DeBPjbAqi0JWPtyDHOJOBP5pZqegzm9MuN6KQhZo0AU5n15d5ThBK/6HsjDFeLgROKqnNSdmtg2wGrUFhcORVm8td388dJ5fJhiAu19nYj6bjZI5Rlexu5mtDcwPjAnpGzAi7KcxGE1GD0ImAnnR8O8p+J5diExt9kAU2w8h7WhSN+1m9hGinb8HxbGqaTrb29tlM+umL8LdD0r2g8C/bZmJeJH0ZgAzwiRqCvB7NPE3RCBzONLur+wd4809RL6VULPKzJenIIXMWoi05e9mtl2jTOmzmvhWgru/QDDfC1YcR4dLA9C3/CwSQt9BQugV7v60uz+CiEIqpfunkGZ2hSaNUYgg5XpgsJn9AtG3T63jr7xB+E6DYnpbk1/QhWiivrO7P19HuqCVnmE57stlEhdwFXBNEMDTdfQwUj59Rsn/O1kBnRetAq5UIB/QivLZVGbnS2MA6g4bNVYmyC3k9rG+eHj47YcUUf2RcmJ45r5BjcgsClnl0cm0JkjoG5nZhsAvUWMbZ/LP6o+cQ1sJ7u4PAEk8BCod9wLcRaZ+gzbyKeBiM1vWc8R5aCL+gyKz18LP0YBVMc5EX4SZDavgB3Kwl4gvdu5CFjchTTvIYfXe1LVyARwNdaizF8ijmd+TATPc/XgTPffsSCuZKA8SKuVdkfnNUUHjdoxXJ9boC+2yWXXT52BmE+no0/qSmX0AvAA8gAKD1i1cBGf2m8xsHdRmngVOyghY5OyLp6KgpdmJDeF8f2Cgu78cVhFOBX5vZnu7+6V1/oXE32Ueqvj3egMD8jYI33T3F5MDU4yxccgM+jvARDO7DjjA5SNeL9xTcQlDvZ8FbGVmmxRZSTSz/oiK/8Nw3A+ZuPZD/j1XAn81s03d/d6KCVXGruk6qVKOJSjjglDp9vA7FPgG8km9AJGvbIHa/DPIfHWhkP5cFF/lc+A4d//UhMNCWonP2qxzAbchIrTKBdeqb9HvIo+Q2iEbendfnCh59wQws2+hNvo9FFPsB82YE0chqzNeorOj5yyhy93vMtmJXwm8iDqM6fQOUoZeAzObL9GCuPt3K9z2U2BztMrYY0767v4gMiet5TcwHUgc0UEDZKEAj70UB5vZ8jTJJNDdfwf8zsz+CGyD6nkLD2xVZvYIsGEY1LYBfgKs6Y1hWmsEHOhnYmb6Pgp0eWlmsve8mV2MAofOgSYsDyKm0/KJ9o122ZS66UN4BsXMAvWFI5FlxT+QlnYY0jpvhuLlHO/uZ5VLKAszmw+ZxAMsaWYfhpWxpVAb2QZYwMwGo+/rdjP7HloRPaBa2u4+mWDeZCJs+KWnGD9NAcbnDYfj0KrIUcB5Znavu7+e5z9U+3vACqnjoYhVbNUuptt0BEH5mbBdHUy3zgeeMLPVvH424g7KZXefaCIEuBn4s5mtGt5bHiS+rzeZ2TQ0X1oZMVx+avL/PBix+jUTRcac9L2T3P1qMzs31APoW/gLInUZjuprKFIKFMG7Lv9zkNn8eGQJkShI0vugb/k/OdItyppZNIZVb+6LE/bVLD509++b2T7AH8zsCHf/VUNz9hbgsG/FDUXy7oc0baOr3HcV0hDmTfdAxMDThoS5dJysirFDCpa9cFyfVtqQ3fhkxEg0F1qZqLS9gRyEV2uBcqfjj7RlfpN4JLuH/XZke39QT5e7G+plOaT1bgNWSNXHQpm6WyjzXK44Wan729Akc1SmvbcBc4X9fsjn6PgC6TblewK+igbudmQe9CaaDM8Rzo1HSpxkuxs4MTw7oi+3y+6qm76whfY9BK1sPI9MmzrFOgvf4c4F0j0/1SbakDns4NDvvg18K9zXH/mLLAysDbyTI+3lwu8gNKmcAfwCmD2c3xqtdvUH5kN9/Ahg0QJ1Mjp1PDicG0H5OFnDKBAzqBve6VaIOOc8YN7MtUWRYvF3iDXyaDRhPhuxoVWN9RXe59KU4iQtHdI8Onxf/TL3z46EiyVrpDsIzZsWCd9nks/ewMsooPEilbYCddPwOFlJmwm/8wP/CPsfhd/7wu/XkOnsu8jH8T0kNBV9v0b+uKfXARc2oE2tjXwnk+OF87R5+khfjEh8NksdvwCsmzreMLzbYxuZb1zJKgMz2wA17H3d/VozO8fKxHVAAthKwLcKJP8pciA01IGeijR6jdaqm5ltF/KZO5zYGg1miQPnQsBbHlpYK8DMjkFLuIe7GHjmQZ3DyZT333kS2AR15o+Wud7dOMLMpgNJXCgLv6B2ciUybwP4zFtjGb2pcPe/m9nXkWbzjuA7BbCqyfkWpCVLH6+AOvCqJmxmNi8KaHwRGfYwK9HgGjJdSExO3wION7Ob3f0fOf9GM76ntYBfo//+R2TDPiWYA4E06+n/1J+gffT8GuUEva1ddmfd9CqY2VcQe+CsU4gJcFmknFoWWDasKnUF+yBq+BlocrkYmoiua2a7Avea2QHufoGZvYUmtE8B85rZXF5hRcXMRgCPmtlDyGR4h6D9vgfYMqT9LyQYLebuL5iY2NZw9z/kLLuhlZ221DHAAogtrdWxElotHATsYWaPIYFqQRQf7TFEuuDoHeHuPzGzn3g+Jsak3zOCj1fYPwHAzN5G7/Iu4Dp3z8OytjLy00nS8lQ+oPE5G5/LUvutZqbZASbCi+OAL9x9vi6kMzeaX05CppjfRoqEclgB9YWFGQxDXmORAm1HpLSeCNweLrfiONUUmNleSImzber0r0jFu3VZqW0J3GhmV7j7G43IOwpZGZjZ/sj29kz0IQDsghzjsvbso9Eybu7leXe/BLgkmE/9GDmq3gv8HWlFCgecK4MvkKYl7dT/LrKvHkDJGfQ1xLb2EFqRK8K21nAEu+L1UNT6GzOXT/TKtv6HNrdkufFHNMFJ9ldGA2PyOypc/y6ism1Z5+tGw92nA9ubHKkTG/wsZXD6+GNky12rjkYhre9xaBCYm9Ik6iuUBvt5KNm1Tw73rE/HSUAlNOV7cvdLzewTpEF+BLXjy0uXOzITmtkqyPxviBdzRO917bIb66Y3oh+dTYM2QnTQoEnORMpPogo5uyMzUkft/GJgkpntiQLeXgjsZ2aLosnKkmGi8hHykXyoQrqTzWxxFDfp8SBgnYCCBZ+JCI1uC2UdjzTOE5GyLa+QVYlp7V0kvCWxcZLxNqnPNZCw1wq41d0PCnW1AdK0D0VEI7P6LVMg4pUA3P3sHOkuWOF8YrkzB2pLK6F+9Swz+xlwao35wSOUfOxmR/OZHVH/vDqa3F+JFKOtjnnN7HRgSFCuOZrrbYjaZl0I877bUTvcM5w+HI1V5bA4Uji/UzCfjZGSZAM0ll4PXOXujxctc2/vi81sIFJKbYEUL2uGS88CC6XM5EGr57sBY63ka/1glwrQ00t4rbahidSmmXNll6eRlulptEQ/vM78vooGlRlIuKu6JN/A/zkALRd/H9kFT0emJvN2R/4FyjkncCfQv6fL0qD/swayQ5+BJipz93SZeqAOLkEEFbnMJXKmuSJiIfsMmTndnbrWns0LGNDg/9Sl7wkFLp4Wnp0HaC9zz6CQ7vpNeCct2y57um5afQvteyiaPO+LVgzeRBPkUQ1KfyE0gT4FWWOcQcnk/aFQ9xeF+x8F9suZ9kJoBfXdkJ4hrf6dId+Twn37Ak81qL5Go1WEj8tsH/X0+wxlPAX5+iyJfOCqbSch1selgKUaXI5+iE3u1iL9NTK/bAeGhuO5kE/dJILA3IUy3VKgX128XH9RqZ2H39mRv3eybQ48TjANTP3O2gqUfSk0z+ufOvfnKvd/P/R9BxSso2tRcOJNqDDWIXPRdgqYyPbWvjipAyTwT62xfZ7e73LePf3nW3VDUdBHhv3LQoOarcx9i4V75+9ifpsidphVG1T+2YA1wza2xr1JILnderree/MWBpJ7c967ItLqtYQPQDfVz3zIiXogMu8b1uD0t0csQXcgE4eFkFb/PoJvJXB7A/PbDNiowrXFin5PSLN/CJpojq1wz5Zh4nB0gXR7fbtsVt30hQ2FFhmQObc2WpGZjlYOrgO+U2f6Wf/JZVCA2na0CjocCeiXhutXAmfnTPsRJBxuhWizB6aubUHwyQx5/rLO8s+OBJGG9jdNfqenUPKHK7K1hK81sig4i+Bjlzo/CgkZp6EVs/WA8Q3I73jKzMFQmJ0Ls+WokMZameMF0MrqILTSNLbMthd1CLZ0nF8eH347zS/D+QPQeDk4R7q3E/yPc9w7GgmshRTYvb0vRnODsnWJlANXAgs0Kj8LCUdkEGy5l/RAE2oKxnYfchy+J3Pvz1Gk6/GdU+pSGb6HqEQfAe7wAmxowcTgBbTMfbK7H2tm/Txjrx3s+/+FNP/bNK70Xz4E/7F33b2/mf0DxSgy4BF3X9bMbij33Jel3kObfN6bRJEcvtlxXqKFzx6PBV5tRP7hXf8TeNndV6twzwAvYH5rZgcBc7r7salz30AsYj8F3nP388xsWbSCPsBzdOB9oV02q276Mkz00muiydRqwA/QCsBHBdKYA40jS3rKjNTMZkPmpo9lxyUzuwQ4wt0/yJF+O7CEu78YGNs2RoLhdKQxn4qc0T9y97fyljuTx27I/3lJV7ymSvftgL6JivdE1IaVKPIN+Je7L2VmS3kmJpbJ0f0pxPC2fhfyWxuZkY5HfmyXuvu01PU21O4LhagwszORP9PC7v5J6FueT/fp2XligbSbMr8M6S7o7u+aWD/3qvHIR8BtXmI7zFP2Xt0XZ+cFqfPDkZC6GrCDi7W4y4g+WZUxyzfKzEYhX4Z30LJxFqsjn6pG4+vIjOeAkO+a1W/vBA8TqytN8SJuMcW7eBlm2aregEys9mtguSOkee2P2tHS4dxWyPky8Q06LBx/6WBmI6lO6+rILONIV3DOXMnWOG4IzGwYWpFzxIJW7p4fIbKJVWoN7mZ2F/rO++vQDglpfwfFaNk888gMmOUzUxS9ql12c930KbiIJ24DMIU32BWxb+YWspAGf54wyZwD+LG7T3D3aWZ2P6JXT5QYP0Xj5C5opaKmkJXBfIhp8D9otXswssgYENL/L7CTFw9IvD9y1u8kPJnZjYhu+gvk3L8f8q3sUZjZGMToVxTu7ss1ujx1wFDb+CIIXU+Y2S4ewmoE7Iv6oNyBfM1sObQye5K7Hx9OnxGOXzWzc5H56bT0Y4ULrzLvCfw8pVx4GljBzKZ4KTZcvWNMs+aX6fLMjvrxSj6Ghnxx90J9bPWE+05f3Omdmdl4xNY5AoUZqOfbK4soZNVAIGP4HdKmbeCZYH9hJWhl9KEXSXcRqneiDnzb3Y8Mjnr3mdn8XtABMmAH5LT4OlrC39TMRqOJ4qLAOkW1PBF143gPjDtmdjiBzelLiIFIiXAocjo/AU3uzwCOQaYvuyKzmWzn3WMI2q7bgCWQ+dXbmevzIF+K9ZD2/PMcyQ4CtkMatBGov/k18ATlB/FmBN5u1XbZCnXTckhWhQs+9g5i1qwXcyI/rzRrZ1Ke5VGbeZf6J56gOVkHprVA7DAP8DP07r+WNzEz2x6ZDQ80xcvLYiya7H+IVs2uK3NPT2AgUohUIvDIwpC7wU+aVqJicE+xs5nZGcAvzexud59kZisiZuWz3f3ZgmlPAbYxMdHeg/qFZP7VKMXamYjobDUzGxPmR4YEkq3NbDN37zKbcbPmlym4u69vZvuF/V9n0v8mYqnMgz7XFweF6TGIhO5WYH93/7CReUQhqzbOQYLID5Hf1FWZ69siprKijDMDkaP8/uF4LjR47Y8a7DnhHtz9wbC0XjRCd4LkA9gbeM7MLkQOlX8DVnT39+pMNyKiK3B3/7mZzQmcEPbPAM51MZD9BzEktQRMQcivQRr2tbOTAzNbH/UPA4AP3P3HOZN2pD1fFA1MLwMz3H2qlQ8dkYeiua8g1k1lGLBOzntnAM+6WD6bgTOQqd1lwVywKsxsKApmXFPL7WKVfSuYTT2Rt0BhheAMNIG6Eo3hMxHxzm5IKNkDKXI+AM4rYt7bDXB3v8LMbkbmS1PNbCfgmqScJjr81919pJldiki0WhET0PzpZDM7D/nN/gERdhTFFBR24i/ID3ezzHtb28zSwdQLraSYaLy3Qd/WQ2hFKFFC/wIJX38xs22Lpl0GzZhfLhEsKc6DWUqKI4FfmdlimXtHInKTPOhLffH8ZrYHWq18CoWHyN23FEEUsirD0ce1BrITXxr4tZkdhqTd+82sPxKKzq+zc56lWTCz+dFEMzn+ZSP+RCaz100U2ocAW3r+mCMRNRAGv1bRIvY2VBqo+lFjAAjfze6pUwdmBtj0cRLPapYtubtPoAbMbBlKk4QbgX08EwPIzPZFA3BirnJXjnTHIIKCMYgaeDxiidsYmMPMtkHO4ZsglrF5TbG5nqqVdiqPXtkuu6Nu+gDc3R/o6UIEn5i1geVz3j8efUcD68muwL2XIp+x35rZlcCV7j7DzC4JwsulyDzxQERUc0Ed5ekObI7qaioi4bo1rIAcimL9zFHl2ZaAu7eZYhU9jASje1ColrqEFHf/yMw2RYriuTKXz6DOCX5om5cjM/VHrLP00ObuR5nZS8Ab1L9y1sz55VrAwUhQBCkUnkXkL8em7hsU7ruoWmK9vS82s6WQSWMaDyE3mauBV4A1rUTt3gHuflZX8o9CVhmYWT/08XwGLO8ii3jGzO5Ek627TEFz29HErUsvoUkYXuH8aUhrsoUp3skC6H88Cpzm7u92U/n6DIKvwnGos1q2xu0R+TGN2qYMIyhp8x9AwRupcAzwYOp+p2T6VA1fQ3boa7v7wxXumYgoa+8P2sKhZmY1JhFfRRrGsUhQnD3ksyQiKzgS+cTsgzSOMxH73/bkmET08nbZ1LqJqB9m1t8VrDpp28chn6fncibh6Ns8GMWsWz601YVC+nNXMNmZk5wrWWb2K2Qpsnq128Lvk8Df8xB1tAAMCbPXothkZUlrWg1mtjKa5E9D5lm/BjY3sxn1Knvd/e2wGnGFmd3j7u+HSyun3R9M5Cq1ytcf9R9/RJYU6TmdZ/fd/bLwXOFyd8P88jeozz8JKQ/WQQL53919Vnw9M2t39zy+t729L54fxYBMox+q/yTIeiU4XZ3fewtQKrbKhrRFR6BOt40ysbHCfRugeA9taBm/nrwWJ0W3GhpC+rhDbK7scZV0ByHt1rtJeuHZBcP+T1FH14a0SXsgCveXgId7+h301g11OvNk6nwE0vB0OJd5pyO6u6w9WEeLp+oiXVcV66iVN6BfhfMLhO9rjpzp3AcshyadE9Bg9o9w7elwfCJaQQPFWpmeM+1e3S6bWTe9eQvfUjvSTGe3w5EZzJaIGa2r+STtZGzIcyYipWlDpncfkYrHlXesSt3bRoaGPIxR/0STxW8XLPPPERnHgkiheEFIc1C4nvyftvAdTAI27Ol3mvkP89Px+xyeKvNoxEJXru+crwfL/DVEWnJ9KOciaJXwAeSbehVhHhLu3yG0oyJxmpYjE5cKmdL9JlUHY8q0sTE10t0UmSEeX+bZG9GqaHo/2SrOE8vk0bT5Zaj7W8Mz84Vzc4fjful2n3qmEN0/faQvDu9xAorV+TCwdTPzy2uL+WXB8kjiv7LGfYOoc5nYzAYEe/Sh4XhImePE92qImQ0NzomOgiXWwtzARnRmBzs0mEdMQB/64cAqwNMurc1ewKr1/KcImUPkvTWz32rMO01BsF+v16ewVXGwmf3RQmT4FKag/mFEznSqtYNy1+ZGfgG1E+797bJpddPL8TmavK5TZtsETYQuB14xs7fMbIKJ0bMR+AZivDVkkjQTabvrxQrI8mIOpKAYj0zkLkHCxp/M7Ckzy65KV8IrIb1xwI/Q5LAcDAmi7wPLmNgSWxVnB18mQz5kq4bjVrKieQcJ+cNQOV8CTkYECfO7+47ekYb/WrSasFPBfLJzr+OAncv0wwny9GVvo9WNUTXytMxWBM2cX+6NzPnSSFbdGrWa1Jf64osRedWvgNPN7MlK5oJdRTQXTMHd/2Zm41xO92eDeCo9iL9B+DkaDWCnocHlF2Z2u+ePM3A2YjNySkvGCbLHaZvWmz2HOYMrPsJiaNA7JXVph5D2z9Fq1upoKfpWM1sasSv1s4KxfSJyId1h/i9lYmDIqXVQt5eoG2Fi5LuQ4INhit/T4ZYupL0kMj2pC+6+bo48+iOWr8sz38aLlMhkJiC63zbkOwHyFcjD5lbu/1uVayvRGJrp3tAue6puWhphsrpO8BlZ0FMxX8xsRXd/KpglrYziYx0G7G9m27v7nQWzs2DuFbL2JxAl9/VoHDkOuNvMVnX3f9fxd6a6+5Sw/ymywngehXg428y+ilajHjazbbyGeZkrRs9otKKyssus7NoKt6+OhLmJwPE5THzu33VzAAAOP0lEQVR7CtMpsbXNoBRuoWXg7p8DF5rZ7egdnoJIRxIfrI8z97ebYlEdGvzk8tT7y8D3zOyb7v5ISOcZM7sY9VejgeFm9g13fyw8U3N8Cd/L2sBtYQ60d+ry4S56+J2Bw9z91eRCOJcLTZ5fHo3GnbaQ1khkzmdmdgHBLD70F/UIiFR4pjf2xYnw6cB1ZnYLCmZ9j5mdj97xtCrPF8ytBZbvWnFDjXUp5MOxCXJQfB8tMW4U7hmENCC5o1ojZpa1kPamLeyvheLtJMdroyXNHVFsrKXrKH/azKMd2AxpFRIH3ycQS9pDSOO5JmKK6fG6760bMstqD/u7IyXGQGD3cG7VcltPl7ub6mYYIlxpR+ZFP6OyueDwAunOjyZ5x4Vnz65yfHb4xpLj43LmsSxanXoJxdBIXxuIJrCTgceARVL/Y62c6Q9Fg9QewEFJfYXf1cJ3ug/BrAFNCE/8MrTLZtdNb9/S30443hgp05bO3LcY8uF5HJitQPqJWeK1aHKfNrtrR35UA9A48lh4V0XMBXdBviMrZM7Pi2JW9UM+IDsBvw3f4co5074amQP1D2UaGM6n+5okFtcgZKI4vqffaShb1lxwRHY/HM9Ji5gLpsqUNk+eJ7y36WjV7YDMdgQSJrYpkP5gOpu+fR8Rm4DCZzyZurY0FUy7y6S9IhL0D0nV6bjUftK/bx2+vdxtPZNPs+aX7ag/fC+k1YZCitxFyRS3LbU/tEDafaIvDv99oTLn1wz1/QSwQMPy6+k/3Kpb8vEgDcBU1Mn/EOifue8wpLXpXzD9Qj5ZdZQ/K2QthCa2d6JB5V+h7IuEDnANCgy+cetQ1wNCve5Bi9n2t9JGacK2B6LEbUOO27eE8zeE31vC/g3ADQXS79B5ljlemIJ26Kln50P+IW1IKTE8c30BREk8Ga16TUUMnnnSvi/dsSMzw+lIa/s74ChgbLi2FZpofuXL0C6bVTd9ZSNM9MJ+P+THtFGFe+ci52Qz9Ux6HNkVTUIeQSsGs74vpDWfjia7Vf1UwjucP+xb+M5nAOcDI8P5xJ8kIZ35BDGbnZb3/aJJ4QuhjbQhX5f1wv66ofwbhP11kRJlz55+p6Hs1Xyy0kJWy/hkpco0S8hKndsFCS9tof3cF7aJ4Zt9pkD6g8N/HYnmMIchQe7JsH8WWjU7LL0VSH+z0B6/SUfBqh3Nlw5DguHOtdp6lTyaMr8M6R6EYpAtHMo3NLTtCaFdzdoKlrlX9sVo4eJ1ZMo6b3hvZYXLUC/PACc3Kv9oLlgD7n5sMBe6ALGLZX0cLkd2x5sgx8NWxqlokFwRMcJchAa2yxBl6UY9WLbejKHID+AEZHJ5AQWCfrr7pc0qWAvC3f1iM7sNOUJvhQbHc8L1cyo+2YC8635QrJt7mlni+PyImW3sIeCmKyjx/5mCPl6ABJx5C2RhyATre2iiPBCZFS+FBoljzOxhtMq0l7v/J0eafaVdNqNuei3MbHUUZ8hR3biZfRQuDwB+W4P1rC7fLFcMrD8goei4zLUXwreRx79mK+A8U7zGk919GzNbFvUD3zOzH7v7teE/LePuL5nZYyiWzeEFyvu5me2NFA2TkFkgaNJ6BfIhSs4NQMLBFtSgtO4hVDPLanm4++Vm9i9kAvoBsIUHX6FgDlrTdyf4zOwP3Iva/mAk3IOUXHOE48QfdjlKJpa5+353v83MrkZt5G46unDshoSYH7j7dWZ2Wd50K+TVjPnldS63kVEhj8/N7CDgp+5+bI1na6E39sUvom96ezTvvRZRz1e6/xpgmpkdAODuXQun1NNSZqtudGb3uwJ1zp2WEVEnfl3B9LtlJQutYJ1LydzgAuCKsP9P1GktTHBe7ul6780b6oA2A/5MaTn+78iUptL2YE+Xuxvrp0ObD+dORxrO5RuQfhsdV66yx2Oz+deZzwLAPxCT1uJlrv9fyPvMnOndh9itfhjq4nA6skINR4Elv0BazzOBwV+GdtnsuumNGzK9XS5sa4R3emhok5+HsWqd1D0dtoJ5lftm+6MJbQeNMFp1+go5tPto5egONIE9Mfynz5BJ8ZvA79Eq1DHh/qOAiXXW13XAnTnuW46cjKDd8I7TK1mXEaxMgO+RWtUI7f+1sN9KK1mJu8NOwLypa6sggffiOtJdBJmWTgxt7G/I3HAcKXPBcO8kyvTNBfKaA/Xvx6fOtSPyiuUz5+peyUodN2R+mW4DiMSjHbg5bHel9rPb2Bxp9/q+GK2G30NpHHyS0qpque3eLufZ03+6VbcyH8Hg8EJ+Vube/dDydG5TDEpC0HcRG+COmeM2RMO7Yp3lT0yz2oAJmUb2GTAkdFBPhPMPlPtvcau7/XwL+QO8BfxfT5enFbakTZY5f2iop3m7mH4tc8Gx5fKvM68RiLb2LWCeMtfXztsfJINX2F+dEj32MOS8Pxlpb1cGlkEmG38lmFYVLHevapfdWTe9cSNlLhiOxyON9xTkDD+gi+kn48i9BbYitNYrotWCd5BP1GrIB+u3Id8bwn1roFWJwkIQ8slpI6f5bitsSMhKCyp5tnbggBYo+0hkcvU0Iu/6Rub6lqGsu9aZ/mzh+e8jM7UpyEInLWQ9TxdNpBH9/KeUhJZVCX59qXsaJWQ1ZH5JRyFrNkRylmcbnSPtPtMXI0XovxExx5rNzCuaC1bGCYhxDwB3n25m61OeRv1WJKwUpco05MeRRvr4NyHtLQumCzITGhf2J6XO34+c96eGpe4bw/kDUATziAbAFbT2W6aAz9uY2aPu/lGt5/o43kN+HR3g7meYmaPJVVewNfL1SjAakWwkSCK8dxkuhqgNgQO9FAQzff3+Asn9CWnvcfeJZrYisIq7Twm00se7+wvJzcFs5my0Sl2oTfXCdtltddNLMQNpwQFw92dRkNdvIyXd1xEhRb34H/KDKoLHw3M14e5PARuY2VbAdsB/3f0z4AfBpDj5th5HK18jKUgL7e7PmdkJaEzsLfgCCQqHFXjmOWAPMzvXw0yyJxD6k+WrXL/ZzE5CPoL1YCayxrkeuN7MZge+Q8c2dzslltd6cR4iPfoCwN0fL3PPOoT+qSCaNb+8AgmduBjyTq6jbJXQZ/pid/+Dmd2D6mdbM3vCxY7ZcFgPfosRERERERERERERERF9DjEYcURERERERERERERERAMRhayIiIiIiIiIiIiIiIgGIgpZEREREREtCTM73sw+NLNlGpjmEWbmZrZ2o9KMiIiIiIjIIgpZERERERGtigWQg3y9TvLdDjP7ipn9ysw6kbxERERERHx5EIWsiIiIiIhWxY+A+d39oZ4uSAEsgQJ0ztPTBYmIiIiI6DlEISsiIiIioiXh7jPd/T89XY5mwcz693QZIiIiIiKagyhkRURERES0JMzsguA/tXA4ft3M/mVmY8zsGjP72Mwmm9m1ZjZnmee3M7OnzGyamb1jZsdSZtxL0q2Vfzi3sJldZmZvh3RfNLNtk3RQ0E6AU8Kz94dra4fjI8zsADN7H3gl/A83s06xhczsKjP7wszmLVp3ERERERE9ixiMOCIiIiKiN2E24C/ACyjY5SbAtij46G7JTWZ2AHAOCkL7C6A/sD9Qd9BJMxuJgvsOAS5Cgd6XQ0FLrwMmACsic8E7gHuAtzPJrAksA1wItAEPoEC82wHPpPIaBmwO/MHd36u3zBERERERPYMoZEVERERE9CaMBY5w99MAzOw04CVgRzPb192nmtlXgNOB54HV3X1SuPdc4O9dyHs95Gu1v7v/KjmZmP25+6Vm9ioSsia6+y/KpLEusKS7vxaeNeBlYFszO8LdPdy3BTA7EuYiIiIiInoZorlgRERERERvwnS0ggWAu08H7kRKw4XC6S2BwcCpiYAV7n0TuKYLeSf+Yeua2dBUum0F0vh9ImCFZx24GJV99dR9O6JVsD/VX9yIiIiIiJ5CFLIiIiIiInoT3nL3GZlz74ffxC9ryfD7dLnn6804sBxeiVaZXjezk8KqWRH8u8y5y4EvkMkgIc31gEsLCnARERERES2CKGRFRERERPQmlBM62sOvhd/B4XdamXsHlTnnZc6VhbvvDKwFPAIcAbxkZt/J+zzwWZk03wd+D2xtZgOA7dF/ubRAuhERERERLYQoZEVERERE9DW8G36XKnNt6TLnpgKjypyfr1zi7v6gu2+OSC5mAufWU8gMLgJGoxWsHYG73f2NBqQbEREREdEDiEJWRERERERfw5/D7+FmlqxqYWYrIn+tLF4E5jazJVP3jgHWSd9kZvOY2cDk2N3/gUg30sLYp+F3TMEy3w28ARwKLE8kvIiIiIjo1YjsghERERERfQruPtHMbgc2Bf5qZrcCc6MVonuBDTKPXAZsBlxnZscgU73jgQ8Qw1+C7wLHmtkdwDvACsDKwCWpe/4NTAZ2M7PJwMfufk6OMreb2aXACcjH7PeF/nREREREREshrmRFRERERPRFbIviY80DHAasAnyfUrDgWXD324D9gBHATcBpwFlodSmNJ1HcrR2AY5Hp4SHA3qm0PgN2Af6HfLaWLVDmhEnwcnf/osBzEREREREtBiuF5IiIiIiIiIjoKZjZmcBBwGLu/nJPlyciIiIion5EISsiIiIiIqKHYWZzI/+uBwKpRkREREREL0b0yYqIiIiIiOghmNkmyK9rKzQmH9mzJYqIiIiIaASiT1ZERERERETP4WvIr2sKsKG7v9DD5YmIiIiIaACiuWBEREREREREREREREQDEVeyIiIiIiIiIiIiIiIiGogoZEVERERERERERERERDQQUciKiIiIiIiIiIiIiIhoIKKQFRERERERERERERER0UBEISsiIiIiIiIiIiIiIqKBiEJWREREREREREREREREA/H/nTZX/D6lhKoAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 1008x504 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
......@@ -173,9 +222,9 @@
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"display_name": "Python [conda env:alpha-mind]",
"language": "python",
"name": "python3"
"name": "conda-env-alpha-mind-py"
},
"language_info": {
"codemirror_mode": {
......@@ -187,9 +236,9 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.3"
"version": "3.7.9"
}
},
"nbformat": 4,
"nbformat_minor": 2
"nbformat_minor": 4
}
......@@ -24,22 +24,22 @@
},
{
"cell_type": "code",
"execution_count": 36,
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"factor_name = 'ETOP'\n",
"factor_name = 'EMA5D'\n",
"neutralized_styles = industry_styles\n",
"start_date = '2010-01-01'\n",
"end_date = '2019-03-01'\n",
"start_date = '2020-01-02'\n",
"end_date = '2020-02-21'\n",
"engine = SqlEngine(os.environ['DB_URI'])\n",
"universe_name = 'ashare_ex'\n",
"freq = '21b'"
"universe_name = 'hs300'\n",
"freq = '10b'"
]
},
{
"cell_type": "code",
"execution_count": 37,
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
......@@ -53,7 +53,7 @@
},
{
"cell_type": "code",
"execution_count": 38,
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
......@@ -69,7 +69,7 @@
},
{
"cell_type": "code",
"execution_count": 39,
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
......@@ -81,20 +81,9 @@
},
{
"cell_type": "code",
"execution_count": 40,
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"d:\\ProgramData\\Anaconda3\\lib\\site-packages\\numpy\\lib\\function_base.py:2530: RuntimeWarning: invalid value encountered in true_divide\n",
" c /= stddev[:, None]\n",
"d:\\ProgramData\\Anaconda3\\lib\\site-packages\\numpy\\lib\\function_base.py:2531: RuntimeWarning: invalid value encountered in true_divide\n",
" c /= stddev[None, :]\n"
]
}
],
"outputs": [],
"source": [
"values = {}\n",
"for f in factors_names:\n",
......@@ -105,32 +94,9 @@
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x2b949dca240>"
]
},
"execution_count": 41,
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 1008x576 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"outputs": [],
"source": [
"values.plot(kind='bar', figsize=(14, 8))"
]
......@@ -145,9 +111,9 @@
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"display_name": "Python [conda env:alpha-mind]",
"language": "python",
"name": "python3"
"name": "conda-env-alpha-mind-py"
},
"language_info": {
"codemirror_mode": {
......@@ -159,9 +125,9 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.3"
"version": "3.7.9"
}
},
"nbformat": 4,
"nbformat_minor": 2
"nbformat_minor": 4
}
This source diff could not be displayed because it is too large. You can view the blob instead.
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