Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
A
alpha-mind
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Dr.李
alpha-mind
Commits
f494294d
Commit
f494294d
authored
Oct 27, 2017
by
Dr.李
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
added more notebooks
parent
aa8ccf84
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
2244 additions
and
400 deletions
+2244
-400
linear_regression_method.ipynb
notebooks/machine learning/linear_regression_method.ipynb
+802
-0
tree_based_method.ipynb
notebooks/machine learning/tree_based_method.ipynb
+825
-400
xgboost_method.ipynb
notebooks/machine learning/xgboost_method.ipynb
+617
-0
No files found.
notebooks/machine learning/linear_regression_method.ipynb
0 → 100644
View file @
f494294d
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import datetime as dt\n",
"import numpy as np\n",
"import pandas as pd\n",
"from matplotlib import pyplot as plt\n",
"from alphamind.api import *\n",
"from PyFin.api import *\n",
"\n",
"plt.style.use('fivethirtyeight')\n",
"engine = SqlEngine('postgres+psycopg2://postgres:A12345678!@10.63.6.220/alpha')"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"u_name = 'zz500'\n",
"benchmark = 905\n",
"universe = Universe(u_name, [u_name])\n",
"factor_coverage = engine.fetch_factor_coverage()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"flitered_coverage = factor_coverage[((factor_coverage.source == 'uqer'))\n",
" & (factor_coverage.universe == u_name) \n",
" & (factor_coverage.trade_date >= '2012-01-01')]\n",
"coverage_report = flitered_coverage.groupby(['factor'])['coverage'].mean()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"alpha_factors = coverage_report[coverage_report >= 0.98].index.tolist()\n",
"\n",
"alpha_factors = {\n",
" f: CSRank(DIFF(f) / (ABS(f) + 1e-4)) for f in alpha_factors\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"212"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"alpha_factors.__len__()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"frequency = '2w'\n",
"batch = 8\n",
"start_date = '2012-01-01'\n",
"end_date = '2017-10-25'\n",
"method = 'risk_neutral'\n",
"portfolio_risk_neutralize = ['SIZE']\n",
"neutralize_risk = industry_styles + portfolio_risk_neutralize\n",
"industry_lower = 1.\n",
"industry_upper = 1."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2017-10-27 11:25:05,511 - ALPHA_MIND - INFO - Starting data package fetching ...\n",
"2017-10-27 11:26:19,824 - ALPHA_MIND - INFO - Loading data is finished\n",
"2017-10-27 11:26:34,111 - ALPHA_MIND - INFO - Data processing is finished\n"
]
}
],
"source": [
"data_package = fetch_data_package(engine,\n",
" alpha_factors=alpha_factors,\n",
" start_date=start_date,\n",
" end_date=end_date,\n",
" frequency=frequency,\n",
" universe=universe,\n",
" benchmark=benchmark,\n",
" batch=batch,\n",
" neutralized_risk=neutralize_risk,\n",
" pre_process=[winsorize_normal],\n",
" post_process=[winsorize_normal],\n",
" warm_start=batch)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"train_x = data_package['train']['x']\n",
"train_y = data_package['train']['y']\n",
"\n",
"predict_x = data_package['predict']['x']\n",
"predict_y = data_package['predict']['y']\n",
"\n",
"features = data_package['x_names']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 0. Train Score on a specific date\n",
"------------------------------------"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"ref_date = list(train_x.keys())[-2]\n",
"sample_train_x = train_x[ref_date]\n",
"sample_train_y = train_y[ref_date].flatten()\n",
"\n",
"sample_test_x = predict_x[ref_date]\n",
"sample_test_y = predict_y[ref_date].flatten()\n",
"\n",
"n_estimators = 200\n",
"max_depth = 10\n",
"min_samples_split = 5\n",
"min_samples_leaf = 2"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.163970422399911"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model = LinearRegression()\n",
"model.fit(sample_train_x, sample_train_y)\n",
"model.impl.score(sample_train_x, sample_train_y)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"-0.033960156965980648"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model.impl.score(sample_test_x, sample_test_y)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1. Train and test accuracy trend (Linear Regression)\n",
"----------"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"dates = sorted(train_x.keys())\n",
"accuray_table = pd.DataFrame(columns=['train', 'test'])\n",
"model_df = pd.Series()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2017-10-27 12:31:29,472 - ALPHA_MIND - INFO - trade_date: 2012-01-30 00:00:00 training finished\n",
"2017-10-27 12:31:29,539 - ALPHA_MIND - INFO - trade_date: 2012-02-08 00:00:00 training finished\n",
"2017-10-27 12:31:29,574 - ALPHA_MIND - INFO - trade_date: 2012-02-22 00:00:00 training finished\n",
"2017-10-27 12:31:29,607 - ALPHA_MIND - INFO - trade_date: 2012-03-07 00:00:00 training finished\n",
"2017-10-27 12:31:29,642 - ALPHA_MIND - INFO - trade_date: 2012-03-21 00:00:00 training finished\n",
"2017-10-27 12:31:29,675 - ALPHA_MIND - INFO - trade_date: 2012-04-05 00:00:00 training finished\n",
"2017-10-27 12:31:29,709 - ALPHA_MIND - INFO - trade_date: 2012-04-18 00:00:00 training finished\n",
"2017-10-27 12:31:29,743 - ALPHA_MIND - INFO - trade_date: 2012-05-02 00:00:00 training finished\n",
"2017-10-27 12:31:29,777 - ALPHA_MIND - INFO - trade_date: 2012-05-16 00:00:00 training finished\n",
"2017-10-27 12:31:29,811 - ALPHA_MIND - INFO - trade_date: 2012-05-30 00:00:00 training finished\n",
"2017-10-27 12:31:29,852 - ALPHA_MIND - INFO - trade_date: 2012-06-13 00:00:00 training finished\n",
"2017-10-27 12:31:29,892 - ALPHA_MIND - INFO - trade_date: 2012-06-27 00:00:00 training finished\n",
"2017-10-27 12:31:29,932 - ALPHA_MIND - INFO - trade_date: 2012-07-11 00:00:00 training finished\n",
"2017-10-27 12:31:29,971 - ALPHA_MIND - INFO - trade_date: 2012-07-25 00:00:00 training finished\n",
"2017-10-27 12:31:30,012 - ALPHA_MIND - INFO - trade_date: 2012-08-08 00:00:00 training finished\n",
"2017-10-27 12:31:30,054 - ALPHA_MIND - INFO - trade_date: 2012-08-22 00:00:00 training finished\n",
"2017-10-27 12:31:30,095 - ALPHA_MIND - INFO - trade_date: 2012-09-05 00:00:00 training finished\n",
"2017-10-27 12:31:30,141 - ALPHA_MIND - INFO - trade_date: 2012-09-19 00:00:00 training finished\n",
"2017-10-27 12:31:30,181 - ALPHA_MIND - INFO - trade_date: 2012-10-08 00:00:00 training finished\n",
"2017-10-27 12:31:30,221 - ALPHA_MIND - INFO - trade_date: 2012-10-17 00:00:00 training finished\n",
"2017-10-27 12:31:30,261 - ALPHA_MIND - INFO - trade_date: 2012-10-31 00:00:00 training finished\n",
"2017-10-27 12:31:30,300 - ALPHA_MIND - INFO - trade_date: 2012-11-14 00:00:00 training finished\n",
"2017-10-27 12:31:30,341 - ALPHA_MIND - INFO - trade_date: 2012-11-28 00:00:00 training finished\n",
"2017-10-27 12:31:30,382 - ALPHA_MIND - INFO - trade_date: 2012-12-12 00:00:00 training finished\n",
"2017-10-27 12:31:30,423 - ALPHA_MIND - INFO - trade_date: 2012-12-26 00:00:00 training finished\n",
"2017-10-27 12:31:30,465 - ALPHA_MIND - INFO - trade_date: 2013-01-09 00:00:00 training finished\n",
"2017-10-27 12:31:30,505 - ALPHA_MIND - INFO - trade_date: 2013-01-23 00:00:00 training finished\n",
"2017-10-27 12:31:30,545 - ALPHA_MIND - INFO - trade_date: 2013-02-06 00:00:00 training finished\n",
"2017-10-27 12:31:30,588 - ALPHA_MIND - INFO - trade_date: 2013-02-20 00:00:00 training finished\n",
"2017-10-27 12:31:30,631 - ALPHA_MIND - INFO - trade_date: 2013-03-06 00:00:00 training finished\n",
"2017-10-27 12:31:30,672 - ALPHA_MIND - INFO - trade_date: 2013-03-20 00:00:00 training finished\n",
"2017-10-27 12:31:30,712 - ALPHA_MIND - INFO - trade_date: 2013-04-03 00:00:00 training finished\n",
"2017-10-27 12:31:30,756 - ALPHA_MIND - INFO - trade_date: 2013-04-17 00:00:00 training finished\n",
"2017-10-27 12:31:30,797 - ALPHA_MIND - INFO - trade_date: 2013-05-02 00:00:00 training finished\n",
"2017-10-27 12:31:30,840 - ALPHA_MIND - INFO - trade_date: 2013-05-15 00:00:00 training finished\n",
"2017-10-27 12:31:30,880 - ALPHA_MIND - INFO - trade_date: 2013-05-29 00:00:00 training finished\n",
"2017-10-27 12:31:30,922 - ALPHA_MIND - INFO - trade_date: 2013-06-13 00:00:00 training finished\n",
"2017-10-27 12:31:30,962 - ALPHA_MIND - INFO - trade_date: 2013-06-26 00:00:00 training finished\n",
"2017-10-27 12:31:31,009 - ALPHA_MIND - INFO - trade_date: 2013-07-10 00:00:00 training finished\n",
"2017-10-27 12:31:31,049 - ALPHA_MIND - INFO - trade_date: 2013-07-24 00:00:00 training finished\n",
"2017-10-27 12:31:31,090 - ALPHA_MIND - INFO - trade_date: 2013-08-07 00:00:00 training finished\n",
"2017-10-27 12:31:31,129 - ALPHA_MIND - INFO - trade_date: 2013-08-21 00:00:00 training finished\n",
"2017-10-27 12:31:31,172 - ALPHA_MIND - INFO - trade_date: 2013-09-04 00:00:00 training finished\n",
"2017-10-27 12:31:31,209 - ALPHA_MIND - INFO - trade_date: 2013-09-18 00:00:00 training finished\n",
"2017-10-27 12:31:31,250 - ALPHA_MIND - INFO - trade_date: 2013-10-08 00:00:00 training finished\n",
"2017-10-27 12:31:31,290 - ALPHA_MIND - INFO - trade_date: 2013-10-16 00:00:00 training finished\n",
"2017-10-27 12:31:31,333 - ALPHA_MIND - INFO - trade_date: 2013-10-30 00:00:00 training finished\n",
"2017-10-27 12:31:31,373 - ALPHA_MIND - INFO - trade_date: 2013-11-13 00:00:00 training finished\n",
"2017-10-27 12:31:31,415 - ALPHA_MIND - INFO - trade_date: 2013-11-27 00:00:00 training finished\n",
"2017-10-27 12:31:31,458 - ALPHA_MIND - INFO - trade_date: 2013-12-11 00:00:00 training finished\n",
"2017-10-27 12:31:31,499 - ALPHA_MIND - INFO - trade_date: 2013-12-25 00:00:00 training finished\n",
"2017-10-27 12:31:31,541 - ALPHA_MIND - INFO - trade_date: 2014-01-08 00:00:00 training finished\n",
"2017-10-27 12:31:31,586 - ALPHA_MIND - INFO - trade_date: 2014-01-22 00:00:00 training finished\n",
"2017-10-27 12:31:31,626 - ALPHA_MIND - INFO - trade_date: 2014-02-07 00:00:00 training finished\n",
"2017-10-27 12:31:31,668 - ALPHA_MIND - INFO - trade_date: 2014-02-19 00:00:00 training finished\n",
"2017-10-27 12:31:31,707 - ALPHA_MIND - INFO - trade_date: 2014-03-05 00:00:00 training finished\n",
"2017-10-27 12:31:31,747 - ALPHA_MIND - INFO - trade_date: 2014-03-19 00:00:00 training finished\n",
"2017-10-27 12:31:31,787 - ALPHA_MIND - INFO - trade_date: 2014-04-02 00:00:00 training finished\n",
"2017-10-27 12:31:31,830 - ALPHA_MIND - INFO - trade_date: 2014-04-16 00:00:00 training finished\n",
"2017-10-27 12:31:31,867 - ALPHA_MIND - INFO - trade_date: 2014-04-30 00:00:00 training finished\n",
"2017-10-27 12:31:31,906 - ALPHA_MIND - INFO - trade_date: 2014-05-14 00:00:00 training finished\n",
"2017-10-27 12:31:31,946 - ALPHA_MIND - INFO - trade_date: 2014-05-28 00:00:00 training finished\n",
"2017-10-27 12:31:31,985 - ALPHA_MIND - INFO - trade_date: 2014-06-11 00:00:00 training finished\n",
"2017-10-27 12:31:32,022 - ALPHA_MIND - INFO - trade_date: 2014-06-25 00:00:00 training finished\n",
"2017-10-27 12:31:32,064 - ALPHA_MIND - INFO - trade_date: 2014-07-09 00:00:00 training finished\n",
"2017-10-27 12:31:32,106 - ALPHA_MIND - INFO - trade_date: 2014-07-23 00:00:00 training finished\n",
"2017-10-27 12:31:32,150 - ALPHA_MIND - INFO - trade_date: 2014-08-06 00:00:00 training finished\n",
"2017-10-27 12:31:32,194 - ALPHA_MIND - INFO - trade_date: 2014-08-20 00:00:00 training finished\n",
"2017-10-27 12:31:32,238 - ALPHA_MIND - INFO - trade_date: 2014-09-03 00:00:00 training finished\n",
"2017-10-27 12:31:32,280 - ALPHA_MIND - INFO - trade_date: 2014-09-17 00:00:00 training finished\n",
"2017-10-27 12:31:32,321 - ALPHA_MIND - INFO - trade_date: 2014-10-08 00:00:00 training finished\n",
"2017-10-27 12:31:32,362 - ALPHA_MIND - INFO - trade_date: 2014-10-15 00:00:00 training finished\n",
"2017-10-27 12:31:32,404 - ALPHA_MIND - INFO - trade_date: 2014-10-29 00:00:00 training finished\n",
"2017-10-27 12:31:32,446 - ALPHA_MIND - INFO - trade_date: 2014-11-12 00:00:00 training finished\n",
"2017-10-27 12:31:32,487 - ALPHA_MIND - INFO - trade_date: 2014-11-26 00:00:00 training finished\n",
"2017-10-27 12:31:32,525 - ALPHA_MIND - INFO - trade_date: 2014-12-10 00:00:00 training finished\n",
"2017-10-27 12:31:32,566 - ALPHA_MIND - INFO - trade_date: 2014-12-24 00:00:00 training finished\n",
"2017-10-27 12:31:32,605 - ALPHA_MIND - INFO - trade_date: 2015-01-07 00:00:00 training finished\n",
"2017-10-27 12:31:32,645 - ALPHA_MIND - INFO - trade_date: 2015-01-21 00:00:00 training finished\n",
"2017-10-27 12:31:32,688 - ALPHA_MIND - INFO - trade_date: 2015-02-04 00:00:00 training finished\n",
"2017-10-27 12:31:32,732 - ALPHA_MIND - INFO - trade_date: 2015-02-25 00:00:00 training finished\n",
"2017-10-27 12:31:32,776 - ALPHA_MIND - INFO - trade_date: 2015-03-04 00:00:00 training finished\n",
"2017-10-27 12:31:32,824 - ALPHA_MIND - INFO - trade_date: 2015-03-18 00:00:00 training finished\n",
"2017-10-27 12:31:32,868 - ALPHA_MIND - INFO - trade_date: 2015-04-01 00:00:00 training finished\n",
"2017-10-27 12:31:32,909 - ALPHA_MIND - INFO - trade_date: 2015-04-15 00:00:00 training finished\n",
"2017-10-27 12:31:32,952 - ALPHA_MIND - INFO - trade_date: 2015-04-29 00:00:00 training finished\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2017-10-27 12:31:32,991 - ALPHA_MIND - INFO - trade_date: 2015-05-13 00:00:00 training finished\n",
"2017-10-27 12:31:33,031 - ALPHA_MIND - INFO - trade_date: 2015-05-27 00:00:00 training finished\n",
"2017-10-27 12:31:33,072 - ALPHA_MIND - INFO - trade_date: 2015-06-10 00:00:00 training finished\n",
"2017-10-27 12:31:33,115 - ALPHA_MIND - INFO - trade_date: 2015-06-24 00:00:00 training finished\n",
"2017-10-27 12:31:33,157 - ALPHA_MIND - INFO - trade_date: 2015-07-08 00:00:00 training finished\n",
"2017-10-27 12:31:33,191 - ALPHA_MIND - INFO - trade_date: 2015-07-22 00:00:00 training finished\n",
"2017-10-27 12:31:33,225 - ALPHA_MIND - INFO - trade_date: 2015-08-05 00:00:00 training finished\n",
"2017-10-27 12:31:33,259 - ALPHA_MIND - INFO - trade_date: 2015-08-19 00:00:00 training finished\n",
"2017-10-27 12:31:33,291 - ALPHA_MIND - INFO - trade_date: 2015-09-02 00:00:00 training finished\n",
"2017-10-27 12:31:33,323 - ALPHA_MIND - INFO - trade_date: 2015-09-16 00:00:00 training finished\n",
"2017-10-27 12:31:33,355 - ALPHA_MIND - INFO - trade_date: 2015-09-30 00:00:00 training finished\n",
"2017-10-27 12:31:33,385 - ALPHA_MIND - INFO - trade_date: 2015-10-14 00:00:00 training finished\n",
"2017-10-27 12:31:33,417 - ALPHA_MIND - INFO - trade_date: 2015-10-28 00:00:00 training finished\n",
"2017-10-27 12:31:33,451 - ALPHA_MIND - INFO - trade_date: 2015-11-11 00:00:00 training finished\n",
"2017-10-27 12:31:33,484 - ALPHA_MIND - INFO - trade_date: 2015-11-25 00:00:00 training finished\n",
"2017-10-27 12:31:33,515 - ALPHA_MIND - INFO - trade_date: 2015-12-09 00:00:00 training finished\n",
"2017-10-27 12:31:33,550 - ALPHA_MIND - INFO - trade_date: 2015-12-23 00:00:00 training finished\n",
"2017-10-27 12:31:33,584 - ALPHA_MIND - INFO - trade_date: 2016-01-06 00:00:00 training finished\n",
"2017-10-27 12:31:33,619 - ALPHA_MIND - INFO - trade_date: 2016-01-20 00:00:00 training finished\n",
"2017-10-27 12:31:33,656 - ALPHA_MIND - INFO - trade_date: 2016-02-03 00:00:00 training finished\n",
"2017-10-27 12:31:33,693 - ALPHA_MIND - INFO - trade_date: 2016-02-17 00:00:00 training finished\n",
"2017-10-27 12:31:33,727 - ALPHA_MIND - INFO - trade_date: 2016-03-02 00:00:00 training finished\n",
"2017-10-27 12:31:33,760 - ALPHA_MIND - INFO - trade_date: 2016-03-16 00:00:00 training finished\n",
"2017-10-27 12:31:33,795 - ALPHA_MIND - INFO - trade_date: 2016-03-30 00:00:00 training finished\n",
"2017-10-27 12:31:33,828 - ALPHA_MIND - INFO - trade_date: 2016-04-13 00:00:00 training finished\n",
"2017-10-27 12:31:33,861 - ALPHA_MIND - INFO - trade_date: 2016-04-27 00:00:00 training finished\n",
"2017-10-27 12:31:33,893 - ALPHA_MIND - INFO - trade_date: 2016-05-11 00:00:00 training finished\n",
"2017-10-27 12:31:33,926 - ALPHA_MIND - INFO - trade_date: 2016-05-25 00:00:00 training finished\n",
"2017-10-27 12:31:33,964 - ALPHA_MIND - INFO - trade_date: 2016-06-08 00:00:00 training finished\n",
"2017-10-27 12:31:34,002 - ALPHA_MIND - INFO - trade_date: 2016-06-22 00:00:00 training finished\n",
"2017-10-27 12:31:34,041 - ALPHA_MIND - INFO - trade_date: 2016-07-06 00:00:00 training finished\n",
"2017-10-27 12:31:34,076 - ALPHA_MIND - INFO - trade_date: 2016-07-20 00:00:00 training finished\n",
"2017-10-27 12:31:34,113 - ALPHA_MIND - INFO - trade_date: 2016-08-03 00:00:00 training finished\n",
"2017-10-27 12:31:34,148 - ALPHA_MIND - INFO - trade_date: 2016-08-17 00:00:00 training finished\n",
"2017-10-27 12:31:34,182 - ALPHA_MIND - INFO - trade_date: 2016-08-31 00:00:00 training finished\n",
"2017-10-27 12:31:34,215 - ALPHA_MIND - INFO - trade_date: 2016-09-14 00:00:00 training finished\n",
"2017-10-27 12:31:34,247 - ALPHA_MIND - INFO - trade_date: 2016-09-28 00:00:00 training finished\n",
"2017-10-27 12:31:34,283 - ALPHA_MIND - INFO - trade_date: 2016-10-12 00:00:00 training finished\n",
"2017-10-27 12:31:34,316 - ALPHA_MIND - INFO - trade_date: 2016-10-26 00:00:00 training finished\n",
"2017-10-27 12:31:34,351 - ALPHA_MIND - INFO - trade_date: 2016-11-09 00:00:00 training finished\n",
"2017-10-27 12:31:34,383 - ALPHA_MIND - INFO - trade_date: 2016-11-23 00:00:00 training finished\n",
"2017-10-27 12:31:34,417 - ALPHA_MIND - INFO - trade_date: 2016-12-07 00:00:00 training finished\n",
"2017-10-27 12:31:34,454 - ALPHA_MIND - INFO - trade_date: 2016-12-21 00:00:00 training finished\n",
"2017-10-27 12:31:34,489 - ALPHA_MIND - INFO - trade_date: 2017-01-04 00:00:00 training finished\n",
"2017-10-27 12:31:34,522 - ALPHA_MIND - INFO - trade_date: 2017-01-18 00:00:00 training finished\n",
"2017-10-27 12:31:34,555 - ALPHA_MIND - INFO - trade_date: 2017-02-03 00:00:00 training finished\n",
"2017-10-27 12:31:34,588 - ALPHA_MIND - INFO - trade_date: 2017-02-15 00:00:00 training finished\n",
"2017-10-27 12:31:34,621 - ALPHA_MIND - INFO - trade_date: 2017-03-01 00:00:00 training finished\n",
"2017-10-27 12:31:34,655 - ALPHA_MIND - INFO - trade_date: 2017-03-15 00:00:00 training finished\n",
"2017-10-27 12:31:34,688 - ALPHA_MIND - INFO - trade_date: 2017-03-29 00:00:00 training finished\n",
"2017-10-27 12:31:34,717 - ALPHA_MIND - INFO - trade_date: 2017-04-12 00:00:00 training finished\n",
"2017-10-27 12:31:34,749 - ALPHA_MIND - INFO - trade_date: 2017-04-26 00:00:00 training finished\n",
"2017-10-27 12:31:34,780 - ALPHA_MIND - INFO - trade_date: 2017-05-10 00:00:00 training finished\n",
"2017-10-27 12:31:34,813 - ALPHA_MIND - INFO - trade_date: 2017-05-24 00:00:00 training finished\n",
"2017-10-27 12:31:34,846 - ALPHA_MIND - INFO - trade_date: 2017-06-07 00:00:00 training finished\n",
"2017-10-27 12:31:34,879 - ALPHA_MIND - INFO - trade_date: 2017-06-21 00:00:00 training finished\n",
"2017-10-27 12:31:34,914 - ALPHA_MIND - INFO - trade_date: 2017-07-05 00:00:00 training finished\n",
"2017-10-27 12:31:34,952 - ALPHA_MIND - INFO - trade_date: 2017-07-19 00:00:00 training finished\n",
"2017-10-27 12:31:34,991 - ALPHA_MIND - INFO - trade_date: 2017-08-02 00:00:00 training finished\n",
"2017-10-27 12:31:35,029 - ALPHA_MIND - INFO - trade_date: 2017-08-16 00:00:00 training finished\n",
"2017-10-27 12:31:35,070 - ALPHA_MIND - INFO - trade_date: 2017-08-30 00:00:00 training finished\n",
"2017-10-27 12:31:35,108 - ALPHA_MIND - INFO - trade_date: 2017-09-13 00:00:00 training finished\n",
"2017-10-27 12:31:35,147 - ALPHA_MIND - INFO - trade_date: 2017-09-27 00:00:00 training finished\n",
"2017-10-27 12:31:35,190 - ALPHA_MIND - INFO - trade_date: 2017-10-11 00:00:00 training finished\n",
"2017-10-27 12:31:35,230 - ALPHA_MIND - INFO - trade_date: 2017-10-25 00:00:00 training finished\n"
]
}
],
"source": [
"for ref_date in dates:\n",
" sample_train_x = train_x[ref_date]\n",
" sample_train_y = train_y[ref_date].flatten()\n",
" \n",
" model = LinearRegression()\n",
" model.fit(sample_train_x, sample_train_y)\n",
" \n",
" train_score = model.impl.score(sample_train_x, sample_train_y)\n",
" accuray_table.loc[ref_date, 'train'] = train_score\n",
" model_df.loc[ref_date] = model\n",
" alpha_logger.info('trade_date: {0} training finished'.format(ref_date))"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"portfolio_industry_neutralize = True\n",
"\n",
"settlement = data_package['settlement']\n",
"industry_dummies = pd.get_dummies(settlement['industry'].values)\n",
"risk_styles = settlement[portfolio_risk_neutralize].values\n",
"total_risks = settlement[neutralize_risk].values\n",
"final_res = np.zeros(len(dates))\n",
"method = 'risk_neutral'"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2017-10-27 12:32:07,215 - ALPHA_MIND - INFO - trade_date: 2012-01-30 00:00:00 predicting finished\n",
"2017-10-27 12:32:07,346 - ALPHA_MIND - INFO - trade_date: 2012-02-08 00:00:00 predicting finished\n",
"2017-10-27 12:32:07,480 - ALPHA_MIND - INFO - trade_date: 2012-02-22 00:00:00 predicting finished\n",
"2017-10-27 12:32:07,613 - ALPHA_MIND - INFO - trade_date: 2012-03-07 00:00:00 predicting finished\n",
"2017-10-27 12:32:07,737 - ALPHA_MIND - INFO - trade_date: 2012-03-21 00:00:00 predicting finished\n",
"2017-10-27 12:32:07,869 - ALPHA_MIND - INFO - trade_date: 2012-04-05 00:00:00 predicting finished\n",
"2017-10-27 12:32:08,004 - ALPHA_MIND - INFO - trade_date: 2012-04-18 00:00:00 predicting finished\n",
"2017-10-27 12:32:08,142 - ALPHA_MIND - INFO - trade_date: 2012-05-02 00:00:00 predicting finished\n",
"2017-10-27 12:32:08,275 - ALPHA_MIND - INFO - trade_date: 2012-05-16 00:00:00 predicting finished\n",
"2017-10-27 12:32:08,406 - ALPHA_MIND - INFO - trade_date: 2012-05-30 00:00:00 predicting finished\n",
"2017-10-27 12:32:08,540 - ALPHA_MIND - INFO - trade_date: 2012-06-13 00:00:00 predicting finished\n",
"2017-10-27 12:32:08,664 - ALPHA_MIND - INFO - trade_date: 2012-06-27 00:00:00 predicting finished\n",
"2017-10-27 12:32:08,790 - ALPHA_MIND - INFO - trade_date: 2012-07-11 00:00:00 predicting finished\n",
"2017-10-27 12:32:08,930 - ALPHA_MIND - INFO - trade_date: 2012-07-25 00:00:00 predicting finished\n",
"2017-10-27 12:32:09,062 - ALPHA_MIND - INFO - trade_date: 2012-08-08 00:00:00 predicting finished\n",
"2017-10-27 12:32:09,189 - ALPHA_MIND - INFO - trade_date: 2012-08-22 00:00:00 predicting finished\n",
"2017-10-27 12:32:09,317 - ALPHA_MIND - INFO - trade_date: 2012-09-05 00:00:00 predicting finished\n",
"2017-10-27 12:32:09,458 - ALPHA_MIND - INFO - trade_date: 2012-09-19 00:00:00 predicting finished\n",
"2017-10-27 12:32:09,601 - ALPHA_MIND - INFO - trade_date: 2012-10-08 00:00:00 predicting finished\n",
"2017-10-27 12:32:09,723 - ALPHA_MIND - INFO - trade_date: 2012-10-17 00:00:00 predicting finished\n",
"2017-10-27 12:32:09,846 - ALPHA_MIND - INFO - trade_date: 2012-10-31 00:00:00 predicting finished\n",
"2017-10-27 12:32:09,972 - ALPHA_MIND - INFO - trade_date: 2012-11-14 00:00:00 predicting finished\n",
"2017-10-27 12:32:10,093 - ALPHA_MIND - INFO - trade_date: 2012-11-28 00:00:00 predicting finished\n",
"2017-10-27 12:32:10,215 - ALPHA_MIND - INFO - trade_date: 2012-12-12 00:00:00 predicting finished\n",
"2017-10-27 12:32:10,343 - ALPHA_MIND - INFO - trade_date: 2012-12-26 00:00:00 predicting finished\n",
"2017-10-27 12:32:10,473 - ALPHA_MIND - INFO - trade_date: 2013-01-09 00:00:00 predicting finished\n",
"2017-10-27 12:32:10,599 - ALPHA_MIND - INFO - trade_date: 2013-01-23 00:00:00 predicting finished\n",
"2017-10-27 12:32:10,726 - ALPHA_MIND - INFO - trade_date: 2013-02-06 00:00:00 predicting finished\n",
"2017-10-27 12:32:10,852 - ALPHA_MIND - INFO - trade_date: 2013-02-20 00:00:00 predicting finished\n",
"2017-10-27 12:32:10,976 - ALPHA_MIND - INFO - trade_date: 2013-03-06 00:00:00 predicting finished\n",
"2017-10-27 12:32:11,095 - ALPHA_MIND - INFO - trade_date: 2013-03-20 00:00:00 predicting finished\n",
"2017-10-27 12:32:11,223 - ALPHA_MIND - INFO - trade_date: 2013-04-03 00:00:00 predicting finished\n",
"2017-10-27 12:32:11,355 - ALPHA_MIND - INFO - trade_date: 2013-04-17 00:00:00 predicting finished\n",
"2017-10-27 12:32:11,487 - ALPHA_MIND - INFO - trade_date: 2013-05-02 00:00:00 predicting finished\n",
"2017-10-27 12:32:11,616 - ALPHA_MIND - INFO - trade_date: 2013-05-15 00:00:00 predicting finished\n",
"2017-10-27 12:32:11,737 - ALPHA_MIND - INFO - trade_date: 2013-05-29 00:00:00 predicting finished\n",
"2017-10-27 12:32:11,860 - ALPHA_MIND - INFO - trade_date: 2013-06-13 00:00:00 predicting finished\n",
"2017-10-27 12:32:11,977 - ALPHA_MIND - INFO - trade_date: 2013-06-26 00:00:00 predicting finished\n",
"2017-10-27 12:32:12,100 - ALPHA_MIND - INFO - trade_date: 2013-07-10 00:00:00 predicting finished\n",
"2017-10-27 12:32:12,229 - ALPHA_MIND - INFO - trade_date: 2013-07-24 00:00:00 predicting finished\n",
"2017-10-27 12:32:12,356 - ALPHA_MIND - INFO - trade_date: 2013-08-07 00:00:00 predicting finished\n",
"2017-10-27 12:32:12,481 - ALPHA_MIND - INFO - trade_date: 2013-08-21 00:00:00 predicting finished\n",
"2017-10-27 12:32:12,601 - ALPHA_MIND - INFO - trade_date: 2013-09-04 00:00:00 predicting finished\n",
"2017-10-27 12:32:12,730 - ALPHA_MIND - INFO - trade_date: 2013-09-18 00:00:00 predicting finished\n",
"2017-10-27 12:32:12,861 - ALPHA_MIND - INFO - trade_date: 2013-10-08 00:00:00 predicting finished\n",
"2017-10-27 12:32:12,988 - ALPHA_MIND - INFO - trade_date: 2013-10-16 00:00:00 predicting finished\n",
"2017-10-27 12:32:13,111 - ALPHA_MIND - INFO - trade_date: 2013-10-30 00:00:00 predicting finished\n",
"2017-10-27 12:32:13,232 - ALPHA_MIND - INFO - trade_date: 2013-11-13 00:00:00 predicting finished\n",
"2017-10-27 12:32:13,353 - ALPHA_MIND - INFO - trade_date: 2013-11-27 00:00:00 predicting finished\n",
"2017-10-27 12:32:13,480 - ALPHA_MIND - INFO - trade_date: 2013-12-11 00:00:00 predicting finished\n",
"2017-10-27 12:32:13,610 - ALPHA_MIND - INFO - trade_date: 2013-12-25 00:00:00 predicting finished\n",
"2017-10-27 12:32:13,744 - ALPHA_MIND - INFO - trade_date: 2014-01-08 00:00:00 predicting finished\n",
"2017-10-27 12:32:13,869 - ALPHA_MIND - INFO - trade_date: 2014-01-22 00:00:00 predicting finished\n",
"2017-10-27 12:32:13,994 - ALPHA_MIND - INFO - trade_date: 2014-02-07 00:00:00 predicting finished\n",
"2017-10-27 12:32:14,122 - ALPHA_MIND - INFO - trade_date: 2014-02-19 00:00:00 predicting finished\n",
"2017-10-27 12:32:14,254 - ALPHA_MIND - INFO - trade_date: 2014-03-05 00:00:00 predicting finished\n",
"2017-10-27 12:32:14,378 - ALPHA_MIND - INFO - trade_date: 2014-03-19 00:00:00 predicting finished\n",
"2017-10-27 12:32:14,508 - ALPHA_MIND - INFO - trade_date: 2014-04-02 00:00:00 predicting finished\n",
"2017-10-27 12:32:14,638 - ALPHA_MIND - INFO - trade_date: 2014-04-16 00:00:00 predicting finished\n",
"2017-10-27 12:32:14,767 - ALPHA_MIND - INFO - trade_date: 2014-04-30 00:00:00 predicting finished\n",
"2017-10-27 12:32:14,895 - ALPHA_MIND - INFO - trade_date: 2014-05-14 00:00:00 predicting finished\n",
"2017-10-27 12:32:15,033 - ALPHA_MIND - INFO - trade_date: 2014-05-28 00:00:00 predicting finished\n",
"2017-10-27 12:32:15,173 - ALPHA_MIND - INFO - trade_date: 2014-06-11 00:00:00 predicting finished\n",
"2017-10-27 12:32:15,304 - ALPHA_MIND - INFO - trade_date: 2014-06-25 00:00:00 predicting finished\n",
"2017-10-27 12:32:15,440 - ALPHA_MIND - INFO - trade_date: 2014-07-09 00:00:00 predicting finished\n",
"2017-10-27 12:32:15,578 - ALPHA_MIND - INFO - trade_date: 2014-07-23 00:00:00 predicting finished\n",
"2017-10-27 12:32:15,714 - ALPHA_MIND - INFO - trade_date: 2014-08-06 00:00:00 predicting finished\n",
"2017-10-27 12:32:15,846 - ALPHA_MIND - INFO - trade_date: 2014-08-20 00:00:00 predicting finished\n",
"2017-10-27 12:32:15,974 - ALPHA_MIND - INFO - trade_date: 2014-09-03 00:00:00 predicting finished\n",
"2017-10-27 12:32:16,101 - ALPHA_MIND - INFO - trade_date: 2014-09-17 00:00:00 predicting finished\n",
"2017-10-27 12:32:16,230 - ALPHA_MIND - INFO - trade_date: 2014-10-08 00:00:00 predicting finished\n",
"2017-10-27 12:32:16,358 - ALPHA_MIND - INFO - trade_date: 2014-10-15 00:00:00 predicting finished\n",
"2017-10-27 12:32:16,486 - ALPHA_MIND - INFO - trade_date: 2014-10-29 00:00:00 predicting finished\n",
"2017-10-27 12:32:16,612 - ALPHA_MIND - INFO - trade_date: 2014-11-12 00:00:00 predicting finished\n",
"2017-10-27 12:32:16,736 - ALPHA_MIND - INFO - trade_date: 2014-11-26 00:00:00 predicting finished\n",
"2017-10-27 12:32:16,856 - ALPHA_MIND - INFO - trade_date: 2014-12-10 00:00:00 predicting finished\n",
"2017-10-27 12:32:16,986 - ALPHA_MIND - INFO - trade_date: 2014-12-24 00:00:00 predicting finished\n",
"2017-10-27 12:32:17,120 - ALPHA_MIND - INFO - trade_date: 2015-01-07 00:00:00 predicting finished\n",
"2017-10-27 12:32:17,249 - ALPHA_MIND - INFO - trade_date: 2015-01-21 00:00:00 predicting finished\n",
"2017-10-27 12:32:17,382 - ALPHA_MIND - INFO - trade_date: 2015-02-04 00:00:00 predicting finished\n",
"2017-10-27 12:32:17,515 - ALPHA_MIND - INFO - trade_date: 2015-02-25 00:00:00 predicting finished\n",
"2017-10-27 12:32:17,637 - ALPHA_MIND - INFO - trade_date: 2015-03-04 00:00:00 predicting finished\n",
"2017-10-27 12:32:17,765 - ALPHA_MIND - INFO - trade_date: 2015-03-18 00:00:00 predicting finished\n",
"2017-10-27 12:32:17,894 - ALPHA_MIND - INFO - trade_date: 2015-04-01 00:00:00 predicting finished\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2017-10-27 12:32:18,024 - ALPHA_MIND - INFO - trade_date: 2015-04-15 00:00:00 predicting finished\n",
"2017-10-27 12:32:18,151 - ALPHA_MIND - INFO - trade_date: 2015-04-29 00:00:00 predicting finished\n",
"2017-10-27 12:32:18,280 - ALPHA_MIND - INFO - trade_date: 2015-05-13 00:00:00 predicting finished\n",
"2017-10-27 12:32:18,403 - ALPHA_MIND - INFO - trade_date: 2015-05-27 00:00:00 predicting finished\n",
"2017-10-27 12:32:18,528 - ALPHA_MIND - INFO - trade_date: 2015-06-10 00:00:00 predicting finished\n",
"2017-10-27 12:32:18,650 - ALPHA_MIND - INFO - trade_date: 2015-06-24 00:00:00 predicting finished\n",
"2017-10-27 12:32:18,782 - ALPHA_MIND - INFO - trade_date: 2015-07-08 00:00:00 predicting finished\n",
"2017-10-27 12:32:18,911 - ALPHA_MIND - INFO - trade_date: 2015-07-22 00:00:00 predicting finished\n",
"2017-10-27 12:32:19,041 - ALPHA_MIND - INFO - trade_date: 2015-08-05 00:00:00 predicting finished\n",
"2017-10-27 12:32:19,174 - ALPHA_MIND - INFO - trade_date: 2015-08-19 00:00:00 predicting finished\n",
"2017-10-27 12:32:19,305 - ALPHA_MIND - INFO - trade_date: 2015-09-02 00:00:00 predicting finished\n",
"2017-10-27 12:32:19,433 - ALPHA_MIND - INFO - trade_date: 2015-09-16 00:00:00 predicting finished\n",
"2017-10-27 12:32:19,572 - ALPHA_MIND - INFO - trade_date: 2015-09-30 00:00:00 predicting finished\n",
"2017-10-27 12:32:19,698 - ALPHA_MIND - INFO - trade_date: 2015-10-14 00:00:00 predicting finished\n",
"2017-10-27 12:32:19,824 - ALPHA_MIND - INFO - trade_date: 2015-10-28 00:00:00 predicting finished\n",
"2017-10-27 12:32:19,948 - ALPHA_MIND - INFO - trade_date: 2015-11-11 00:00:00 predicting finished\n",
"2017-10-27 12:32:20,072 - ALPHA_MIND - INFO - trade_date: 2015-11-25 00:00:00 predicting finished\n",
"2017-10-27 12:32:20,198 - ALPHA_MIND - INFO - trade_date: 2015-12-09 00:00:00 predicting finished\n",
"2017-10-27 12:32:20,330 - ALPHA_MIND - INFO - trade_date: 2015-12-23 00:00:00 predicting finished\n",
"2017-10-27 12:32:20,458 - ALPHA_MIND - INFO - trade_date: 2016-01-06 00:00:00 predicting finished\n",
"2017-10-27 12:32:20,587 - ALPHA_MIND - INFO - trade_date: 2016-01-20 00:00:00 predicting finished\n",
"2017-10-27 12:32:20,709 - ALPHA_MIND - INFO - trade_date: 2016-02-03 00:00:00 predicting finished\n",
"2017-10-27 12:32:20,830 - ALPHA_MIND - INFO - trade_date: 2016-02-17 00:00:00 predicting finished\n",
"2017-10-27 12:32:20,951 - ALPHA_MIND - INFO - trade_date: 2016-03-02 00:00:00 predicting finished\n",
"2017-10-27 12:32:21,072 - ALPHA_MIND - INFO - trade_date: 2016-03-16 00:00:00 predicting finished\n",
"2017-10-27 12:32:21,199 - ALPHA_MIND - INFO - trade_date: 2016-03-30 00:00:00 predicting finished\n",
"2017-10-27 12:32:21,326 - ALPHA_MIND - INFO - trade_date: 2016-04-13 00:00:00 predicting finished\n",
"2017-10-27 12:32:21,451 - ALPHA_MIND - INFO - trade_date: 2016-04-27 00:00:00 predicting finished\n",
"2017-10-27 12:32:21,581 - ALPHA_MIND - INFO - trade_date: 2016-05-11 00:00:00 predicting finished\n",
"2017-10-27 12:32:21,720 - ALPHA_MIND - INFO - trade_date: 2016-05-25 00:00:00 predicting finished\n",
"2017-10-27 12:32:21,854 - ALPHA_MIND - INFO - trade_date: 2016-06-08 00:00:00 predicting finished\n",
"2017-10-27 12:32:21,981 - ALPHA_MIND - INFO - trade_date: 2016-06-22 00:00:00 predicting finished\n",
"2017-10-27 12:32:22,107 - ALPHA_MIND - INFO - trade_date: 2016-07-06 00:00:00 predicting finished\n",
"2017-10-27 12:32:22,233 - ALPHA_MIND - INFO - trade_date: 2016-07-20 00:00:00 predicting finished\n",
"2017-10-27 12:32:22,356 - ALPHA_MIND - INFO - trade_date: 2016-08-03 00:00:00 predicting finished\n",
"2017-10-27 12:32:22,479 - ALPHA_MIND - INFO - trade_date: 2016-08-17 00:00:00 predicting finished\n",
"2017-10-27 12:32:22,604 - ALPHA_MIND - INFO - trade_date: 2016-08-31 00:00:00 predicting finished\n",
"2017-10-27 12:32:22,732 - ALPHA_MIND - INFO - trade_date: 2016-09-14 00:00:00 predicting finished\n",
"2017-10-27 12:32:22,859 - ALPHA_MIND - INFO - trade_date: 2016-09-28 00:00:00 predicting finished\n",
"2017-10-27 12:32:22,988 - ALPHA_MIND - INFO - trade_date: 2016-10-12 00:00:00 predicting finished\n",
"2017-10-27 12:32:23,115 - ALPHA_MIND - INFO - trade_date: 2016-10-26 00:00:00 predicting finished\n",
"2017-10-27 12:32:23,263 - ALPHA_MIND - INFO - trade_date: 2016-11-09 00:00:00 predicting finished\n",
"2017-10-27 12:32:23,385 - ALPHA_MIND - INFO - trade_date: 2016-11-23 00:00:00 predicting finished\n",
"2017-10-27 12:32:23,516 - ALPHA_MIND - INFO - trade_date: 2016-12-07 00:00:00 predicting finished\n",
"2017-10-27 12:32:23,645 - ALPHA_MIND - INFO - trade_date: 2016-12-21 00:00:00 predicting finished\n",
"2017-10-27 12:32:23,782 - ALPHA_MIND - INFO - trade_date: 2017-01-04 00:00:00 predicting finished\n",
"2017-10-27 12:32:23,909 - ALPHA_MIND - INFO - trade_date: 2017-01-18 00:00:00 predicting finished\n",
"2017-10-27 12:32:24,029 - ALPHA_MIND - INFO - trade_date: 2017-02-03 00:00:00 predicting finished\n",
"2017-10-27 12:32:24,147 - ALPHA_MIND - INFO - trade_date: 2017-02-15 00:00:00 predicting finished\n",
"2017-10-27 12:32:24,272 - ALPHA_MIND - INFO - trade_date: 2017-03-01 00:00:00 predicting finished\n",
"2017-10-27 12:32:24,401 - ALPHA_MIND - INFO - trade_date: 2017-03-15 00:00:00 predicting finished\n",
"2017-10-27 12:32:24,531 - ALPHA_MIND - INFO - trade_date: 2017-03-29 00:00:00 predicting finished\n",
"2017-10-27 12:32:24,661 - ALPHA_MIND - INFO - trade_date: 2017-04-12 00:00:00 predicting finished\n",
"2017-10-27 12:32:24,780 - ALPHA_MIND - INFO - trade_date: 2017-04-26 00:00:00 predicting finished\n",
"2017-10-27 12:32:24,907 - ALPHA_MIND - INFO - trade_date: 2017-05-10 00:00:00 predicting finished\n",
"2017-10-27 12:32:25,029 - ALPHA_MIND - INFO - trade_date: 2017-05-24 00:00:00 predicting finished\n",
"2017-10-27 12:32:25,164 - ALPHA_MIND - INFO - trade_date: 2017-06-07 00:00:00 predicting finished\n",
"2017-10-27 12:32:25,287 - ALPHA_MIND - INFO - trade_date: 2017-06-21 00:00:00 predicting finished\n",
"2017-10-27 12:32:25,410 - ALPHA_MIND - INFO - trade_date: 2017-07-05 00:00:00 predicting finished\n",
"2017-10-27 12:32:25,542 - ALPHA_MIND - INFO - trade_date: 2017-07-19 00:00:00 predicting finished\n",
"2017-10-27 12:32:25,675 - ALPHA_MIND - INFO - trade_date: 2017-08-02 00:00:00 predicting finished\n",
"2017-10-27 12:32:25,808 - ALPHA_MIND - INFO - trade_date: 2017-08-16 00:00:00 predicting finished\n",
"2017-10-27 12:32:25,934 - ALPHA_MIND - INFO - trade_date: 2017-08-30 00:00:00 predicting finished\n",
"2017-10-27 12:32:26,058 - ALPHA_MIND - INFO - trade_date: 2017-09-13 00:00:00 predicting finished\n",
"2017-10-27 12:32:26,184 - ALPHA_MIND - INFO - trade_date: 2017-09-27 00:00:00 predicting finished\n",
"2017-10-27 12:32:26,309 - ALPHA_MIND - INFO - trade_date: 2017-10-11 00:00:00 predicting finished\n",
"2017-10-27 12:32:26,436 - ALPHA_MIND - INFO - trade_date: 2017-10-25 00:00:00 predicting finished\n"
]
}
],
"source": [
"for i, ref_date in enumerate(dates):\n",
" model = model_df[ref_date]\n",
" sample_test_x = predict_x[ref_date]\n",
" sample_test_y = predict_y[ref_date].flatten()\n",
" \n",
" cons = Constraints()\n",
" index = settlement.trade_date == ref_date\n",
" benchmark_w = settlement[index]['weight'].values\n",
" realized_r = settlement[index]['dx'].values\n",
" industry_names = settlement[index]['industry'].values\n",
" is_tradable = settlement[index]['isOpen'].values\n",
"\n",
" cons.add_exposure(['total'], np.ones((len(is_tradable), 1)))\n",
" cons.set_constraints('total', benchmark_w.sum(), benchmark_w.sum())\n",
"\n",
" if portfolio_industry_neutralize:\n",
" ind_exp = industry_dummies[index]\n",
"\n",
" risk_tags = ind_exp.columns\n",
" cons.add_exposure(risk_tags, ind_exp.values)\n",
" benchmark_exp = benchmark_w @ ind_exp.values\n",
"\n",
" for k, name in enumerate(risk_tags):\n",
" cons.set_constraints(name, benchmark_exp[k]*industry_lower, benchmark_exp[k]*industry_upper)\n",
"\n",
" if portfolio_risk_neutralize:\n",
" risk_exp = risk_styles[index]\n",
"\n",
" risk_tags = np.array(portfolio_risk_neutralize)\n",
" cons.add_exposure(risk_tags, risk_exp)\n",
"\n",
" benchmark_exp = benchmark_w @ risk_exp\n",
" for k, name in enumerate(risk_tags):\n",
" cons.set_constraints(name, benchmark_exp[k], benchmark_exp[k])\n",
"\n",
" risk_table = total_risks[index]\n",
"\n",
" y = model.predict(sample_test_x)\n",
" test_score = model.impl.score(sample_test_x, sample_test_y)\n",
" accuray_table.loc[ref_date, 'test'] = test_score\n",
"\n",
" is_tradable[:] = True\n",
" weights, analysis = er_portfolio_analysis(y,\n",
" industry_names,\n",
" realized_r,\n",
" constraints=cons,\n",
" detail_analysis=True,\n",
" benchmark=benchmark_w,\n",
" is_tradable=is_tradable,\n",
" method=method)\n",
" \n",
" final_res[i] = analysis['er']['total'] / benchmark_w.sum()\n",
" alpha_logger.info('trade_date: {0} predicting finished'.format(ref_date))"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x1f26fdd7668>"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAxcAAAFqCAYAAABoA6cKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl4TFcfB/DvrNn3HVnEvitCLLWExlpUixalSsXWRUsp\nVV5LVZW2lNKmvFRbpeUlkdaaWCKJUimlKhpbZCH7Put9/9AZmcxklcji+3keT5sz9945986dO/d3\nz/mdI8rMzBRARERERET0iMQ1XQEiIiIiIqofGFwQEREREVGVYHBBRERERERVgsEFERERERFVCQYX\nRERERERUJRhcEBERERFRlWBwQQSgXbt2sLe3r9A64eHhGDRoEHx8fGBvb4+hQ4dWU+2oOn333Xew\nt7fHqlWrHmk7p06dqpLtmHLr1i3Y29tjxowZVb5tqpuq83yrCm+88Qa8vb2RmZlZofXatWuHdu3a\nVfp9K3Mtp4ox9Xv3+eefw9nZGX///XcN1YpqEwYX9FjY29sb/HN0dIS3tzcGDRqEbdu2QaPR1HQV\nK+TWrVt46aWXcOXKFYwePRrz58/HuHHjqv19q+pGmGqe7ubwSQxKdedx0X8uLi5o1aoVJk6ciKio\nqJquIj2CixcvYufOnXjrrbd4o1/Nhg4dCnt7e9y6datG6zFt2jQ4Oztj0aJFNVoPqh2kNV0BerLM\nnz8fAKDRaHDjxg2EhoYiOjoaERER2L59ew3XrvxOnDiBwsJCzJ8/H3PmzKnp6lA916BBA5w9exa2\ntrY1XZUq1bZtW31wlZubi99//x0HDhxAaGgotm3bhhEjRtRwDWuvzp074+zZs3BycqrpqhhZvnw5\nLC0tMW3atAqve+DAgWqoEVU3CwsLzJgxA0uWLMGZM2fQo0ePmq4S1SAGF/RYvffeewZ/X758GQMG\nDMD+/fvr1AUpKSkJAODq6lrDNaEngUwmQ/PmzWu6GlWuXbt2RteE1atXY9WqVfjggw8YXJTC0tKy\nVp4T8fHxOHr0KMaNGwcrK6sKr9+4ceNqqBU9DmPHjsWyZcsQHBxcZ37LqXqwWxTVqDZt2qBnz54A\ngPPnz+vLdf1mCwsLsWLFCjz11FNwcXHBggUL9MtkZ2dj+fLl8PPzg5ubG7y8vDBs2DCEhISYfC9B\nEPDVV1/B398fbm5uaNWqFebOnYusrKxy17d4P+dZs2bpu3WcOnUKABAbG4t3330XPXr0gLe3N9zc\n3NCpUycsXLgQGRkZJW57//79GDVqFHx9feHq6oo2bdpg3LhxiIiIAADMmDEDs2bNAvDgBqxolxLd\newOAQqHA559/jp49e8LDwwONGjXCgAEDsGPHDgiCYPS+9vb2aNeuHTIzMzFv3jy0adMGTk5O2LRp\nEwAgJSUFixYtQpcuXdCgQQN4enqiU6dOmDp1Ki5dulSu46Zrur9586b+M3B3d0e7du2wdu1afb1+\n/vln9OvXDw0aNEDTpk0xb948FBYWmtzmyZMnMXr0aDRu3Biurq7o0KED5s+fj/v375tcPj4+HpMm\nTYK3tzcaNGiAwMBA/Prrr6XWOysrCytXrkT37t31x3LQoEH43//+V679riol5VzMmDFD//nv378f\nAQEB8PDwgI+PDyZPnoy7d++a3F5F9kupVOKrr77CCy+8gLZt28LV1RXe3t4YPnw4Dh06ZHL75fn+\nluTVV1/V73NaWprR61qtFjt27MDAgQPh5eUFNzc3dO/eHevWrYNSqTS5zV27duHpp5+Gu7s7mjZt\nimnTpiEpKclklxLdsR46dCgSExMxffp0NG/eHI6OjggNDa3UMRQEATt37kRgYCCaNGkCNzc3tG7d\nGs8++6xRi218fDzeeOMNPPXUU3B3d4e3tze6du2KWbNm4c6dO/rlSsu5iI+Px8yZM9G6dWu4uLig\nWbNmeOWVV0x+X4t2tbx48SLGjBkDLy8veHh4YPDgwYiOjjZ5TEuiu848//zzRq/p6jxjxgxcvXoV\nEyZMgK+vL+zt7XHx4kUApnMuFAoFNm3ahN69e8PHxwfu7u5o27YtXnjhhXK3dERFRaFx48bw9fXF\n2bNnK7RPunrZ29tDrVZj7dq16NSpk/46vXjxYigUCpPrxcfH4/XXX9d/d5o0aYLx48cjNjbWaFnd\n99lUFydT1wB7e3tERkYCADp06KD/PSh6/Ipeezds2KD//dN1483KysLnn3+OYcOGoVWrVnBxcUGT\nJk3w4osvIiYmpkLHyN3dHT169EBISEiFc22ofmHLBdVqEydOxMWLF9G/f384ODjAx8cHAJCZmYlB\ngwbh6tWraN++PaZPn46srCz873//w8svv4x3330XCxcuNNjWggULsGXLFri5uWHixIkwMzNDWFgY\nzp8/D5VKVa76eHl5Yf78+Th9+jQiIyMxZMgQ/YXcy8sLALB9+3aEhoaiZ8+e6NevHzQaDWJjY7Fp\n0yYcOXIEx48fh42NjcF2Z8+ejZ07d8LOzg5DhgyBh4cHEhMTERMTgx9//BF9+/bF0KFDkZWVhbCw\nMPTs2RO9evUyqBcAqFQqPP/88zh9+jSaNm2KV199FUqlEqGhoXjjjTdw5swZbN682Wi/lEolhg8f\njuzsbAQGBkIul6NBgwbIz89HYGAgbt26hT59+mDQoEEAgLt37yIiIgK9e/euUPLl4sWLERUVhYED\nB+Lpp5/GgQMHsHz5cigUCtja2mL16tUYPHgw/P39cejQIXz99dfQaDRYt26dwXa2bduGt99+GxYW\nFhgxYgTc3d0RExODLVu24ODBg/jll1/g6empX/6ff/7BM888g/T0dAwYMADt27fHjRs3MGHCBAwY\nMMBkXRMTE/Hss8/in3/+Qffu3fHKK68gPz8fhw8fxiuvvIL58+cbPXWvKd988w1++eUXDBkyBD17\n9sS5c+ewb98+XLp0CZGRkTAzM9MvW9H9ysjIwIIFC9CtWzf069cPzs7OSE5ORlhYGMaOHYvPPvsM\nr7zyisl6lfT9LY1IJNL/v1Rq+BOlVqsxYcIE/Prrr2jatCmef/55mJmZITIyEsuWLcOJEyfw888/\nG6y3bt06LFu2DHZ2dnjxxRdhb2+PiIgIDBw4sNRuZhkZGQgMDIStrS1GjhwJtVoNBweHSh3DpUuX\n4vPPP4eXlxdGjhwJOzs7pKSk4M8//8SuXbswadIkAA9aRAMCApCbm4v+/fvj2WefhVKpREJCAkJC\nQjB69GiD89qUCxcuYMSIEcjOzsbAgQPRpk0b3LhxAyEhIfjll1+wc+dOPPPMM0brxcbGYv369ejW\nrRsmTpyIhIQEHDhwACNGjMDJkyfRokWLUt9XJzw8HGKxGH5+fiUuc+PGDQQGBqJFixZ48cUXkZWV\nBUtLyxKXnz59Ovbt24eWLVtizJgxsLKyQlJSEn7//XeEhoZi+PDhpdZp//79CAoKgru7O3766Sc0\nbdq0XPtiytSpUxEVFYUBAwbAxsYGR44cwYYNG3D//n2ja+uJEycwfvx4FBYWYuDAgWjSpAmSkpIQ\nEhKCo0eP4vvvv0f//v0rXZf58+fj+++/x507dzB9+nTY2dkBgP6/Rb377ruIiYnBwIEDERgYCGtr\nawDAtWvXsGLFCvTo0QMDBw6Evb097ty5g7CwMBw5cgQ//PADAgMDy12nbt264dSpUzh16hSeffbZ\nSu8b1W0MLqhG/fXXX/onL506dTJ6PSEhAZGRkUb9ipcuXYqrV69i/Pjx+OKLL/Q3JPPmzUNAQADW\nrFmDgQMHonPnzgCgv/H08vJCeHi4fnuLFy/GiBEjkJycXK76ent747333sOqVasQGRmJoUOHYvz4\n8QbLzJkzB5988gkkEolB+bZt2zBnzhwEBwcb5Gls374dO3fuRJs2bXDgwAGDfRUEAYmJiQCAYcOG\n6YOLXr16mbyx3bBhA06fPo2AgADs2rULcrkcAPD+++9j0KBB2LVrFwYNGoSRI0carJeSkoKWLVvi\n119/NfiRDwsLw61btxAUFITVq1cbrKPRaJCTk1Ou46Zz+fJlnDlzRt+dbPbs2fDz88OGDRtga2uL\nkydP6rtFLFiwAJ06dcLOnTvx3nvvwcXFBQBw+/ZtzJ8/H5aWljh69ChatWql3/6KFSvwySef4J13\n3sHu3bv15XPnzkV6ejqWL1+O119/XV9+6NAhjB071mRdZ8yYgfj4eAQHB+OFF17Ql2dnZ2PYsGH4\n+OOPMXToULRv375Cx6A6HD9+HCdOnEDLli31ZVOnTsVPP/2EgwcPYtSoUfryiu6Xvb09Ll26hIYN\nGxq8Z2ZmJgYOHIilS5di7NixsLCwMKpXSd/f0mzbtg0A0Lp1a6ObpE8//RS//vorXnvtNXz00Uf6\n75hWq8WcOXOwfft2BAcHY/r06QAe3MR++OGHcHBwwIkTJ/RBuCAICAoKMjhHirty5QrGjh2LjRs3\nGgU5FT2G27dvh4eHB6Kiooy6ChVtndm/fz8yMzOxcuVKfSuljkKhKPMhiCAImD59OrKzs7Fp0yaD\nQSYiIiLw3HPPYfr06bh06ZLRzfyhQ4ewZcsWg++D7pq1ZcsWowDflLy8PFy6dAnNmjUzeoBSVHR0\nNN5++2188MEHZW5T99CoQ4cOOHbsmNFnYap1q6iNGzfi/fffx1NPPYUff/xRfx2prFu3biEmJkaf\nqL548WL06tULu3fvxtKlS+Hu7q6v9+TJkyGTyXD06FGD7+bff/+N/v37Y9asWfjjjz8Mgv+KeO+9\n93D69GncuXMHM2bMgLe3d4nLXrp0CSdPnjRapnnz5rh69arRd/T27dsYMGAAFi1aVKHg4qmnngIA\nnDlzhsHFE4zdouixWrVqFVatWoUVK1bgtddeQ79+/VBQUIBhw4bpu0cVtXDhQqOLnkqlwu7du2Fp\naYn//Oc/Bk86GzZsiLfffhuCIGDHjh368u+++w4A8M477xhsz8zMDIsXL67SffTy8jIKLADglVde\nga2tLY4fP25QvmXLFgDAZ599ZrSvIpHI6KauNDt37gQArFy5Uh9YAA+eZOl+yEtKnNclYRYlFj+4\nRJh6qiiRSCo8EszcuXMN8lS8vb3h7++PgoICvPrqqwb9re3s7DB48GAolUqD4Q13794NpVKJKVOm\nGAQWwIPg0sPDA4cPH9YHZXfv3kV4eDgaNWpk1K1I14JS3OXLl3HixAkMHTrU4OYRAGxtbbFgwQII\ngoA9e/ZUaP+rS1BQkMHNCwD90/Dff/9dX1aZ/TIzMzN5Dtrb22PChAnIzMw0eI+iTH1/i7p06ZL+\nmvD+++9j6NChWLlyJWxtbfHZZ58ZLKvVarF582a4uLhg1apVBt8xsViMZcuWQSQS4ccff9SX79mz\nB2q1GlOnTtUHFsCD79XixYtNfk915HI5VqxYYXQzW5ljKBaLIZPJjLYFwOD4lPZ9MzMz0z9tLklM\nTAz+/vtvdOrUyWj0ur59+2LYsGFIS0vDwYMHjdbt3r27UaA9YcIESKXSEj/f4pKSkqDVasvMRXN1\nddUP7lEWsVgMQRBgZmZm8vMq6fzSarWYP38+Fi1ahIEDByI0NPSRAwvgwYOtotc9KysrjBkzBlqt\n1qCr065du5Ceno758+cbfTdbtGiBiRMnIjk5Wd/ttbq9/vrrJoMPOzs7k8fQy8sLI0aMQFxcnEF3\nvLK4ubkBQIldMunJwJYLeqx0T79FIhFsbGzQoUMHjB49usRuFV26dDEqu3btGvLz89GlSxc4Ozsb\nvd63b18AwB9//KEv0/2/qQDG398fUqkUarW6ortjkkqlwrZt27B371789ddfyMnJgVar1b+uSwYH\nHoyQc+XKFTg4OJTajaA8cnJyEB8fD1dXV6ObbgDo06cPAMPjomNmZmaye1PPnj3RqFEjfPbZZ7hw\n4QICAwPRrVs3dOjQweSNUllMPeXXPekz9f6613SBQtH69+7d2+R++Pv7Y9++fbh48SIaNGig78ut\n+5xN7WPRnBUA+r7GOTk5Jvu0656WXrt2zcRePn4dO3Y0KtMFBEX7Pld2v/766y+sX78eZ86cQXJy\nslH/8qLndFGmvr9F/fnnn/jzzz8NyhwcHBAaGoo2bdoYlF+/fh1paWlo3Lgx1qxZY3J7FhYWiIuL\n0/+t++y7d+9utKynpycaNmyI27dvm9yWl5eXyZvRyhzDMWPGYPPmzejatStGjhyJ7t27o1u3bvpu\nVjqDBw/G8uXLMW/ePBw9ehT9+/eHn58f2rRpow88SlPadwN4cG0MCQnBH3/8gdGjRxu8Zuockslk\ncHV1LXf/+fT0dAAo86FD27Zty/203sbGBkOGDNF3Bx02bBi6d+8OPz+/UoOtiRMnIjQ0FFOmTMHH\nH39caiBZERX9rl2+fNnkeXL9+nUAD86TgQMHVkndSlPadzE6OhqbN2/Gb7/9hvv37xvlLiUlJZXZ\nHU9Hd06X1aJE9RuDC3qsKprkpXsKUlR2djaAkkdq0q2jW67o/5u6WZBIJHB0dMS9e/cqVLeSTJ48\nGaGhofDx8cHQoUPh5uamb0X48ssvDW7MdPVq0KDBI79vWcfF0tIStra2BsdFx8XFxaAFSEfXp3j1\n6tUICwvTP2Wzs7PDhAkTsGjRolL7SpvaXnG6H/3SXivaHaSin39pn31J29HdJJ04cQInTpwwuR7w\noBtIbWAqd0B37IrOIVOZ/frtt98wfPhwqNVq9OnTB4MHD4aNjQ3EYjEuXbqEsLCwEpNZTX1/i3rp\npZfw5ZdfAgBSU1OxZ88eLF68GC+99BKOHz9u8PBAV/cbN24YddEria7bXmmffUnBRUnnV2WO4cqV\nK+Hr64udO3di/fr1+PzzzyEWi9GnTx8sW7ZMH1h7enri+PHjWL16NY4cOaJvYXB1dcW0adMwZ86c\nUm+SK3Nt1Ckp/0QikZR7HiJzc3MAKPF80KnoKHtbt27Fhg0bsGfPHnz88ccAHgQ+gwYNwooVK0w+\nkY+MjIREIsHgwYOrLLAATOczlPZd+/bbb0vd3uO6hpR0zENCQjBp0iSYm5ujX79+8PHxgaWlJcRi\nsT63sKzPs6iCggIAMNlNkp4cDC6oVjN1w6v7ESwpGEhJSTFYruj/379/3+jHQaPR6H8IHtWFCxcQ\nGhqKPn364KeffoJMJtO/ptVqsX79eoPldXUp6clvRZR1XPLz85GdnQ1HR0ej10wdZx0PDw989tln\n+PTTT3Ht2jVERkZi69at2LhxI7KysvDFF188ct0roqKff9HP3hRT29Gts2LFCsyePfvRKlyLVGa/\nPvnkExQUFCAkJMSoC9m6desQFhZW4rqlnVfFOTs7Y8aMGVAqlViyZAneeecdgy58urrrcofKQxew\nVuSz1ymp7pU5hhKJBNOmTcO0adOQnp6OqKgohISE4Mcff8Rzzz2Hs2fP6r+XzZo1Q3BwMDQaDS5f\nvoyTJ08iODgYK1asgFarxbvvvlvi+1Tm2liVdDewZV1PK3JeAA+Clnnz5mHevHlISkpCVFQUdu/e\njZCQEFy9ehVnzpwxuNYCQGhoKEaOHIlx48Zh69atGDZsWMV25hHpjnFERITJ1g5TdK1TpoK5ioxq\naEpJx/zDDz+EXC5HeHi4UdL+W2+9pc+JLC/dZ2+qVwE9OZhzQXVO8+bNYWlpiStXrphsetU9TSx6\nQe/QoQMAmLxQRkdHV1mXqPj4eADAkCFDjH7szp8/r3+qo2NlZYXWrVsjPT0d586dK3P7pp6Q6djY\n2MDX1xf37t3D1atXjV4/efIkANPN+uUhEonQokULvPrqq/jll19gZmZmMDTn46L7LIt3ZQIePDHV\ndUfQLafrihUTE2PyczZ1TnTt2hUA6t1M0ZXZr/j4eDg4OJjMTanojUd5zJw5E02bNsX+/fsN6tm8\neXPY2dnh/PnzJQ45W5zusze1v3fu3KlUv/BHPTccHR0xdOhQbN68Gc8//zxSU1NNDvcqkUjQvn17\nzJ49Gz/99BMAlPl9K+27AZi+NlYld3d3uLi44Pr16yaHva4KHh4eGDVqFHbt2oWuXbsiLi7OICdL\np02bNggLC4OzszNeeeUV/Pzzz9VSn5LourlW5DzRdSdLSEgweu3ChQsm1yk6qEFlxMfHo0WLFkaB\nhVarrfAwxAD03RIrMoog1T8MLqjOkclkGDt2LPLz8/Gf//zH4EcsKSkJn376KUQiESZMmKAv1yU3\nrl271uCpmkKhwPLly6usbrqk0dOnTxuU379/H3PnzjW5jm5kmzlz5picB6NovoEu8c7Ujw8AvPzy\nywAejA5VvCvRsmXLADzoi1xeV65cwc2bN43K09PToVKp9N0gHqcxY8ZALpfjm2++McoNWLduHRIT\nExEYGAgPDw8AD/pD9+vXD3fu3NF3wdE5dOiQyRuxjh07omfPnggLC8P27dtN3ihdv369QomOtUFl\n9svLywsZGRlGuRE7duzAsWPHqryOMplMPxKa7pwFHgxLO336dP13KT8/32jdtLQ0fZ4FAIwePRpS\nqRTBwcEG3Z8EQcDy5cvL3d2nqIoeQ4VCgYiICKObP0EQ9C0quu/R+fPn9a0LRenKyvq+devWDS1a\ntMD58+cNEtuBB4FFSEgInJycMGTIkHLubcX16tULmZmZBrkvjyI1NRW//fabUblCodA/zS/puDRr\n1gxhYWFo2LAhXnvtNf3AHo/DhAkTYG9vjzVr1picV0MQBERFRRkEyrqA5L///a/BeXX79u0SuwLq\nfhMqey3y8vJCfHy8we+MIAj46KOPTD6kKovuszL1MIKeHOwWRXXSkiVLEBUVhR07duDixYvo27ev\nfsjCjIwMvPvuuwYJbP7+/pg2bRq++uordO/eHcOHD9fPc2FnZwd3d/dyD0dbmk6dOsHf3x8hISEI\nDAyEv78/7t27h6NHj6JZs2b6G96iJk6ciJiYGHz33Xd46qmnMHToULi7uyMlJQXR0dHw8/PT3xR3\n7doV1tbW2Lt3L+RyORo1agSRSISxY8fCy8sLs2bNwtGjR3H06FH9uOUqlQohISFITEzEiy++aDQM\nbWkiIiKwaNEi+Pn5oXnz5nB1dUVKSgrCwsKg1Wrx1ltvPfIxqygvLy+sXr0ab7/9Nvr164eRI0fC\nzc0NMTExiIyMRMOGDbF27VqDdT755BM888wzWLx4MU6cOIH27dvj5s2bOHDgAAYNGmRyMr3g4GCM\nGDECb775JrZs2QI/Pz84ODggMTERV69excWLF7Fz585yJzqWJC4uzmgUKx0nJyesWLHikbZfXEX3\na8aMGTh27BgGDx6MkSNHwtbWFhcuXEB0dDRGjBiB/fv3V2n9AGDUqFFYt24doqKicOTIEf28DPPm\nzcOVK1ewY8cOHD58GL1790bDhg2RmpqKGzduIDo6GlOnTtW3WDRu3BgLFy7EsmXL8PTTT2PUqFGw\ns7NDREQE0tPT0bZtW/z555/lSpYuqiLHsKCgACNHjkSjRo3g5+cHT09PqFQqnD59GpcuXUKXLl30\nCdh79uxBcHAwunfvjiZNmsDR0VE/54BYLMYbb7xRar1EIhG+/PJLjBw5Uj83hG6eiwMHDkAul2Pz\n5s0VypOqqBEjRmDfvn04evRolcwgnpiYiGeeeQbNmjVDx44d0bBhQ+Tl5eH48eP4559/8Oyzz5Y6\nb4WPjw/CwsIwYsQIzJ49G4WFhZgyZcoj16ssDg4O2LFjByZMmIDAwED07t0bLVu2hEwmw927d3Hu\n3DkkJCTg5s2b+py8wYMHo0WLFti7dy/u3r2Lrl27Ijk5Gb/88gsGDhxosvWlX79+2LdvH958802M\nGDECVlZWsLOzw7Rp08pVz5kzZ2LOnDno06cPhg8fDqlUqh91rKRrY0m0Wi1OnDgBX19ftlw84Rhc\nUJ1kb2+PQ4cO4fPPP8eBAwewadMmmJmZoX379ggKCjI5qdLq1avRtGlTBAcHY/v27XB0dMSwYcP0\n45RXBYlEgh9++AErVqzA4cOHsWXLFnh4eGDixImYO3cuunXrZnK9jRs3IiAgAP/9738RGhqKgoIC\nuLq6omPHjnjxxRf1y9nZ2eG7777DqlWrsHfvXuTm5gJ4EDx5eXlBLpdj7969+PLLL7F7924EBwdD\nLBajVatWWLBggb5lo7z69++PhIQEREVF4ddff0V2djZcXV3RtWtXTJ8+Hf369av8wXoEkydPhq+v\nLzZs2ICDBw8iLy8PHh4emDZtmtFwtwDQpEkTHD16FEuXLkVERATOnDmDNm3a4LvvvkNqaqrJH1AP\nDw+Eh4fj66+/xv79+/Hzzz9DpVLB1dUVTZs2xUcffVQl5829e/fwww8/mHzN09OzyoOLiu7XgAED\nsGvXLnzyySfYt28fxGIxOnfujJCQENy8ebNagguRSIRFixZh3LhxWL58OQYMGACRSASpVIodO3bg\n559/xnfffYcjR44gNzcXjo6O8PT0xJw5cwy+LwDw9ttvo0GDBti4cSO+//57WFtbo3///vjPf/6j\nn/+jojkIFTmGVlZWWLZsGU6dOoXffvsNv/zyCywsLODt7Y0VK1Zg8uTJ+lHMXnjhBahUKsTExGD/\n/v3Iz8+Hm5sbBg4ciFmzZunn7SlNp06dEBERgTVr1iAiIgLHjh2DnZ0dhg4dinfeeafa52UZNmwY\nPDw88P3332PmzJmPvD0vLy8sXLgQp06dQmRkJFJTU2FnZwdfX1+8+eabRkPumtKwYUOEhYVh5MiR\neOedd5Cfn28w30116d27NyIjI/HFF1/g2LFjOHv2LKRSKdzc3ODn54clS5YYnHtmZmbYv38/Pvjg\nAxw5cgSxsbFo0qQJPvzwQ/Tp08dkcDFhwgTcvXsXu3fvxsaNG6FSqeDp6Vnu4GLy5MmQy+X48ssv\n8cMPP8Dc3Bzdu3fHxo0bceDAgQoFF+Hh4UhKSsLy5csrnFdD9YsoMzOzejpGEhER1VLZ2dlo3rw5\n7O3tK9X9g0q2YcMGLF68GIcPH9bnqFD9N378eERGRiI2NrbCcyBR/cKcCyIiqrfS0tKMZrZWq9V4\n//33UVhYaLKVkx5NUFAQGjduXOWtblR7xcbG4uDBg1iwYAEDC2K3KCIiqr8OHjyIZcuWoW/fvmjY\nsCEyMjIrjqEOAAAgAElEQVRw5swZXL9+HT4+PliwYEFNV7He0eV2HD9+HJmZmbzZfAKkpKTg/fff\nx9SpU2u6KlQLsFsUERHVW5cuXcK6detw/vx53L9/H1qtFo0aNcKgQYPw9ttv60fboSdHZmam0chx\nJRk6dGi156kQ1TcMLoiIiOiJcevWLf2cIGXZuHEjxo8fX801IqpfGFwQEREREVGVYEI3ERERERFV\nCQYXRERERERUJRhcULWIi4ur6SpQLcFzgXR4LhDA84Ae4rlQPzG4ICIiIiKiKsHggoiIiIiIqgSD\nCyIiIiIiqhIMLoiIiIiIqEowuCAiIiIioirB4IKIiIiIiKoEgwsiIiIiIqoSDC6IiIiIiKhKSGu6\nAkREREREBOSptPg4NgdRKUo87SHH621tYG9W/W0BgiDgVLIS5+4rYSERwdNa8uCflQQ2cjGuZKhw\nIVWF8/eV+D1ViciRbiVui8EFEREREVENy1BoMeZIKn67rwIAnL2vxPZr+Vj0lC0mNreERCwqdf2L\naUqsvZiDC6kqDGxkjg+62MJGVnZgciJRgZW/Z+PsfaXJ10UAhArsB4MLIiIiIqIalJinwfOHU/FX\nptqgPLVQizlRmfjm7zys6mqHpz3MjNa9nqXCqgs5+PlGgb7s66t5CE9UYHs/R7RxlJl8z+iUB0HF\nqWTTQYVORQILoALBRXBwMNavX4+UlBS0bNkSq1atQo8ePUwue+rUKTz77LNG5WfPnkXz5s0rWEUi\nIiIiovrpepYKzx1Ow51cTYnL/JmuwrO/psLHRoLGNlL9f69nq/FdXD40JiKA69lqDAi9j0+622F8\nMysAQI5KiwM3C/DD9XycLiOoqKxyBRd79+7FggULsHbtWvj7+yM4OBijR49GdHQ0PD09S1wvOjoa\nDg4O+r+dnZ0fvcZERERERPVAbKoSLxxJQ2qh1qC8tYMUN7I1KCgWNdzM0eBmTslBSHEFGgGzTmfi\nRKICAoDQW4VG2ywqsJEZGlhKcCdPgzu5D/4VaAS4W4jRyUWOTs5ydHY23RKiU67gYuPGjRg3bhwm\nTZoEAFizZg2OHTuGrVu3YsmSJSWu5+LiAicnp/K8BRERERFRvacVBJxKUmDHtXyE3CqA0jCuwFAv\nc3zTxxFpCi3+cy4Lu+MLTG/IhLaOMrSwkxp0kQJQ5jb6NTDDok626OIiNygXBAGFGsBCWnq+R1Fl\nBhdKpRKxsbF4/fXXDcoDAgIQExNT6rp9+/aFUqlEixYtMHfuXPTu3bvcFSMiIiIiqi+S8jX4Pi4f\n38blldj6ML6ZJT7vYQ+pWISGUgm+6uOIqa0UWHouG2dSSu7G1NRWikWdbDDCxwJikQj9G+bhnais\nUlspAKCHmxwLO9mil7txLgcAiEQiWFQwQ1uUmZlZ6rsmJSWhVatWOHjwIHr27KkvX716Nfbs2YNz\n584ZrRMXF4dTp06hU6dOUCqV+PHHH7F161aEhoYabMPUekREREREdYVaC6SqRHCUCZAXG5xJLQBn\n0iXYnyJBZLoEGpTcAvByQxVe91FBVMIi+RogsVCEu4ViJBSKcLdQBKVWhKdsNRjoqkHxxoXreSIs\nuGqGWwWGlXI302KwiwZDXNXwsaxouvYDzZo1K/G1csciomJ7KgiCUVnRNyz6pl27dsXt27exYcOG\nUoOL0ipKdUtcXBw/TwLAc4Ee4rlAAM8Deqiunwvx2Wp8/Vcuvruej2ylAIkIaGIrRUt7KVo5yKDS\nCvjhej6S8rWlbqexjQRzO9jok65L06EC9WsGoFcbLT66kIPTyQq0d5RhbFNL9HCTQ1xSBFMFygwu\nnJycIJFIcO/ePYPy1NRUuLi4lPuNOnfujL1791a8hkREREREtYBWEBCeqMBXV3JxOEFhMEyrRgCu\nZalxLUuNA7cKS92OmQQY7m2Bic2t0NO9+m72bWRirOxqVy3bLkmZwYVcLkfHjh0RHh6OkSNH6svD\nw8MxfPjwcr/RpUuX4OZW8mx+RERERES11d+ZKkw5kYE/01WV3kZreykmtrDC2CaWcHgMM2/XhHJ1\ni5o1axaCgoLQuXNndOvWDVu3bkVycjImT54MAAgKCgIAbNmyBQCwadMmeHl5oVWrVlAqldi9ezcO\nHjyIHTt2VNNuEBERERFVj2N3CzE5PB3ZKtM5ChYSUYnJ01ZSEZ73fdBK0dlZVmJaQX1RruBi1KhR\nSE9Px5o1a5CSkoJWrVph9+7d8PLyAgAkJCQYLK9SqbB48WIkJSXB3Nxcv3xgYGDV7wERERERUTUQ\nBAFf/ZWH985mQWsidujoJMO0VlYY1dgSSq2AvzPV+CtThb8yVMhTC+jiIsdzjS1gI6ufrRSmlDla\nFFFl1PUkLao6PBdIh+cCATwP6KHafi6otALejc7Etr/zjV4b4mWOt9pZw89FXu9bIiqqgiPXEhER\nERHVb7kqLcYdS8fJJIVBuQjAMj9bzG5jzaCiBAwuiIiIiIiKWHg2yyiwsJaKENzXAYM8LWqoVnUD\ngwsiIiIion+dvafAjmuGXaG8rCXYNcAJrR1kNVSruoPBBRERERERALVWwNtRWQZlTW2l+HWoM5zN\nJTVUq7rlyUldJyIiIiIqxVd/5RnNY7Guhz0DiwpgcEFERERET7zEPA0+/D3boGyMrwV6e5jVUI3q\nJgYXRERERPTEW3Q2C7nqhzM02MpFWO5nV4M1qpsYXBARERHRE+343ULsu1lgULa4ky3cLNkdqqIY\nXBARERHREytbqcXcqEyDso5OMrzawqqGalS3cbQoIiIiInriZCm1+OpKLjZdyUWG4mF3KBGAdd3t\nIRFzkrzKYHBBRERERE+MTIUWW/7KxabLuchSCkavv9rSCp1c5DVQs/qBwQURERERPRH+SFNi9JE0\n3CvQmny9tb0UizvZPuZa1S8MLoiIiIio3ksr1GD8sXSTgYWtXIQZra0xs4017ORMSX4UDC6IiIiI\nqF7TaAVMOZGBhDyNQbmdXISZbawR1Moa9mYMKqoCgwsiIiIiqtc+vJCNiESFQdn4ZpZY1dUOtmyp\nqFIMLoiIiIiozlBoBEQmK3A3TwNfWynaOcpKDRAO3irA2ou5BmXd3eT4rIc9ZBwRqsoxuCAiIiKi\nWi1PpcWxuwqE3CrAoTuFyFYZjvLkayNBByc52jvJ0NROCl8bKXxsJEjK12DGqQyDZd0txPhvX0cG\nFtWEwQURERER1SpphRrE3FMiJkWJmHtKXEhTQqEpefn4HA3icwqMZtk2k8BgPakI2NbPkTNvVyMG\nF0RERERU4wrVAj6KzcbB24WIy1JXyTaLByQrutqhu5tZlWybTGNwQUREREQ1bvFvWfj6al65lnUx\nF6Orqxz/ZKtxLUsNrfFceEZG+1ogqJXVI9aSysLggoiIiIhqVFyWClv/Lj2w8LSWYKiXOYZ7W6Cb\nqxySf3Mm8tVaXE5XIzZNiWuZasTnqBGfrcbtXA00/wYdvdwfJHCLRMyzqG4MLoiIiIioRi0/n60P\nBABALALaOsjQzU0Of1c5urnK0cja9G2rpVQMP1c5/FzlBuUqrYA7uRootQKa2Ur1wQhVLwYXRERE\nRFRjzt1X4sCtQoOy4N4OGOVr+UjblYlF8LXlre7jxllDiIiIiKhGCIKAJeeyDMqecpZhZGOLGqoR\nPSoGF0RERERUI47eVSAyWWlQtrSzHcTMjaizGFwQERER0WOnEWDUahHQwAx9GnCo2LqMwQURERER\nPXaH7ktwJcNwPoslXWxrqDZUVZjlQkRERERVRisIuJmjwdVMFf7OVOv/m6HQwslcDFcLCdwsxPjl\npsxgvdG+FujgJC9hq1RXMLggIiIiolLdzdNgdWw27uZp0MfDDGOaWMLdUmKwTFK+Bluv5mHHtTyk\nFGhNbudWrgaA6t+/HnagkYmBRZ3YalEfMLggIiIiohLtv1mANyMzkKl8MBHFsbsKLD2fjYAGZnip\n6YMg45ureThwswDqcsyUbcqrLazgY8Pb0vqAnyIRERERGclVafFeTBa+jcs3ek0rPBjp6ehdxSO/\nj4elGHM72Dzydqh2YHBBRERERAYupCox9UQ6/snWVGp9a6kIHZxlaGkvQws7KVrYy+BhKUaaQot7\nBVrcK9Dg6t1UNHBxwvO+FnCxkJS9UaoTGFwQEREREQrVAn65U4CdcfkIT1RAW6yLk0wMTGxuhZh7\nSvyZrjK5jeZ2UrzWygovNrWEjaz0QUnjpElo1owtFvUNgwsiIiKieqhQLeBOnhr3C7S4X6jF/QIN\n7hdqUagWYCkTwUoqgrVMDEupCL/dV2LPP/n6vIrimtlJ8XVvB3R0fjCa06V0FX64noef4guQXqjF\nM43MEdTaCn08zCDiBHhPNAYXRERERPVEnkqLIwkK7LuZj8N3FCjQVDLDuojJLSyxsqsdLKUPWyLa\nOcrQrqs9VvrZQaUF5BIGFPQAgwsiIiKif2m0AqLuKZGvEhDQ0AxScfXfNBeqBcTcU+J0sgIqrYCJ\nza3ga1v+WzSNVkDYnULsjS/AoYRC5Fd2yKZi2jvK8N5TNhjsZVHiMiKRCHKmS1ARDC6IiIiIANzO\nVeO1ExmIuacEAHR0kmHXACej+Rx08lRaqAXATl5ybsG5+0ps/zsPd/I0cPl3Ajl3CzFcLSVIztcg\nIlGBqBQFCovkTX95JRfzO9ri9bbWkJUS3BSqBfxwPR/r/8zBjZzKJV4X52gmxmhfC4xvZon2nNCO\nKoHBBRERET3x9t8swBuRGcgqknMQm6bCgND72POME1o5PJxNOk+lxZo/crD5Si4KNUB3NzleamqJ\nET4W+kAjOkWBj2NzcDyx4kO1KjTAsvPZ+Dk+H+t7OqCzi+FNfpZSi21X87DpSi7ulTBZnY6rhRje\n1hI4m0vgaiGGi7kEVjIR8tQC8lTaf/8rwFwqQmAjcwzyNIcZuzjRI2BwQURERE+sArWAhWczse1v\n47kcACAhT4OBB+9jR4Aj+niYIfR2Id6LyUJC3sOWgqgUJaJSlHg3OhNDvCyQWqjFyaRHn//hcoYa\nA0Lv48WmlhABuJmjxq0cDRLzNSit41NDSwlGNDbHcz6W6Owig5gJ1vQYMbggIiKiJ9I/WWq8fDwN\nVzLVpS6XrRLwwuE0dHGRI/rfLlOmFGqAvTcKKlWXRlYS9HCT4+hdBdIVD1sjBAA/XDcd+BQlEwNj\nmlhiUnNLdHGRM6CgGsPggoiIiJ44iXkajDiUatACATy4Sf+gsy1uZGuw9e88fblaQKmBRWm6u8kx\npaUVFBoB9wq0SM7XIKVAC5kY8HeTo6+HOXxtJRCJREgt1GDh2Szs/qd8QYqVVIRXWlhhZhtrNLRi\nZjXVPAYXRERE9ETJVmox+ohxYOFrI8HWvo7o6CyHIAhobCPB4nPZJrchEQEzWltjbFNLHLhZgB//\nycftXMPt9fYww7sdbdDL3azcdXM2l+Cr3o4Y26QQc85kGm0TAEQAGttI8GJTS7zWyhoOZqVPVkf0\nOJU7uAgODsb69euRkpKCli1bYtWqVejRo0eZ60VFRWHYsGFo3rw5oqKiHqmyRERERI9CqREwMTwd\nlzMMu0I952OB9b3s9bNKi0QivN7OBl42UgSdTDcYzam7mxxru9uj9b9J3u3+HbI1OkWJ/TcLUKgR\n8FJTS/i7lT+oKK5/Q3NEjXTFjmv5SM7XwNNaAh8bKXxsJPC0ljLpmmqtcgUXe/fuxYIFC7B27Vr4\n+/sjODgYo0ePRnR0NDw9PUtcLzMzE9OnT0efPn2QlJRUZZUmIiIiqihBEPBGZAYiio3gNNjTHMF9\nHCAxMezrCB8LeFq54MML2SjUCJjQzApjm1gYzUItFonQw90MPSrQSlEWK5kYM9pYV9n2iB6HcrWj\nbdy4EePGjcOkSZPQokULrFmzBm5ubti6dWup682ePRsvvfQS/Pz8qqSyRERERJW18kIOdhXLZeji\nIsM3fU0HFjqdXOT4KdAZoYNdHozcxGRpohKVGVwolUrExsYiICDAoDwgIAAxMTElrhccHIx79+5h\n3rx5j15LIiIiIhNyVVp88kcOPrqQjUvpKpPLpORrMC86E5/8kWNQ7msjwa4BTrCUMmeBqKqU2S0q\nLS0NGo0GLi4uBuUuLi64d++eyXUuX76M1atX48iRI5BIyj9yQVxcXLmXpdqPnyfp8FwgHZ4LBFTd\neVCoAaZcNMe1vAfBwUexOehgq8FoDzUCnDTI1QDfJsiwO0kKhdawtcFeKuCT5rnIuJODjCqpDVUG\nrwl1U7NmzUp8rdwJ3cWbAAVBMNksqFAoMGXKFCxfvhw+Pj7lryVKryjVLXFxcfw8CQDPBXqI5wIB\nVXceCIKAmaczcS3PcA6IP7Il+CP7wWzUeSoBeWrj6eYsJCL8NMgFXYrNfE2PF68J9VOZwYWTkxMk\nEolRK0VqaqpRawYAJCcn4+rVq5g1axZmzZoFANBqtRAEAU5OTtizZ49RFysiIiKiithxLb/UyeXu\nFWhNlje0lGDT0w4MLIiqSZnBhVwuR8eOHREeHo6RI0fqy8PDwzF8+HCj5Rs0aIAzZ84YlH3zzTcI\nDw/Hzp074eXlVQXVJiIioidVbKoS86IzDcpsZSJkq4xbKXTcLcR4u70NJja3grmUCdlE1aVc3aJm\nzZqFoKAgdO7cGd26dcPWrVuRnJyMyZMnAwCCgoIAAFu2bIFMJkPr1q0N1nd2doaZmZlROREREZEg\nCLidq8HtXA2czMVwNhfD0UwMqYkRnDIUWkwMT4eySMOElVSEw8NcIAIQfDUPu67nI+ffQMPFXIy3\n2tvg1RZWsGBQQVTtyhVcjBo1Cunp6VizZg1SUlLQqlUr7N69W98KkZCQUK2VJCIiovpr7cVcrPjd\neCZse7kIHpYS+NpK0dRWiiZ2Uuy/WWA0a/XnPe3R0v7BhHZr/O3xQWdbHL5TCI0ADPUyh5WMo0ER\nPS6izMzMktsQiSqJSVqkw3OBdHguEGB8HiTla9BmdzK0lbwbea2VFdb421dR7ehx4jWhfmIoT0RE\nRDXmh+v5lQ4surjIsNLPrmorRESPhMEFERER1QitIODba3kGZR6WYjiYlZ0b4WQmxn/7OkIuYR4F\nUW1S7nkuiIiIiKpSZLISN3Ie5k/IxUDkCFc4mkug1gpIV2hxO1eD61lqXM9WI/7ff45mYizzs0Mj\na97GENU2/FYSERFRjfg2zrDVYpi3BRzNJQAAqVgEVwsJXC0knJOCqA5htygiIiJ67DIVWhy4WWBQ\n9nIzyxqqDRFVFQYXRERE9Nj9fCMfhUVGlPW0lqBPA7OaqxARVQkGF0RERPTYfXst3+Dv8U0tIRYx\nOZuormNwQURERI/VxTQlYtNU+r9FAMazSxRRvcDggoiIiB6rb+MMWy0CGprBkyM/EdULDC6IiIjo\nsVFogT3/GAYXLzezqqHaEFFVY3BBREREj01EmgSZyodTcjuaiTHYy7wGa0REVYnBBRERET02+5MN\nuz+NbWIBM86yTVRvMLggIiKix+JGthq/ZUkMyl5uzi5RRPUJgwsiIiJ6LLZfM5yRu7OzDK0dZDVU\nGyKqDgwuiIiIqNopNQK+KzZK1Cst2GpBVN8wuCAiIqJqF3a7EPcLtfq/bWUijGpsUYM1IqLqwOCC\niIiIqt1/i3WJGtvEElYy3oYQ1TecsYaIiIge2c0cNYL/yoO5RITZba1hb/YwcIjPViMiUWGw/CR2\niSKqlxhcEBER0SPZf7MAs09nIEf1YP6KXxMK8csQZ9j82zKxo1irhZ+LDG0dmchNVB+xPZKIiIgq\nRaERMC86E5PC0/WBBQD8ma7Cq+HpUGsFk4ncbLUgqr/YckFEREQmCYKAS+kqRCQqUKgR4G0jRWMb\nCXxspMhXC5gckY4LqSqT6x65q8D8mCz0cpcbJHJbSwQmchPVYwwuiIiISE8QBFxMV2H/zQL870YB\n4nM0ld7WN1fzsO9GgUHZEFc1LKXsOEFUXzG4ICIiIgBAVIoCb0Zm4lqWusLrellL8LG/HeZGZSEh\n72FAkq7QGiz3nHvFt01EdQeDCyIiIsLldBVGHUpDgUYoe+FihniZY1MvB9ibieFpJcWgsPsGORg6\nXV3kaGqVb2ILRFRfMLggIiKqRy6lq/DZxRzYm4nxeltr+NiU/VOfo9LilYh0k4GFXAz0a2iOprZS\n3MpR42auBjez1chVC7CSirCwky1mtraCSCQCALRxlGF7P0eMPpKG4pub1MISQGZV7CYR1VIMLoiI\niOqJ1EINRvyaqu+K9H1cPhZ2ssGM1taQikUm1xEEAW9FZiKuWFeowEZmGNXYEoO9zGEnFxutk6HQ\nwkIqhoXUeLsBDc2xrrs93jzzMJCwk4vwXGML3L3xqHtJRLUZgwsiIqJ6YsX5bIMchwKNgMW/ZePn\n+AKs72mP9k5yo3W2/Z2Pn4slXY9vZomNvRxKfB+RSARHc0mpdZnUwgo5Ki1W/p4DAQK29HZgIjfR\nE4DBBRERUT0Qm6rE9mum8xli01ToF3IfM1pb4wVfC7RzlEEiFiE2VYkFMYbdlFrbS7HG365K6jS7\nrQ0mNreClVQESQktJ0RUvzC4ICIiquO0goB3o7NQWiq2RgC+uJyLLy7nwk4uQk93M/yZroKyyGBO\n1lIRtgc4VmkLg62crRVETxJ+44mIiOq43f8U4Ox9pUHZl087lDhZXZZSQNjtQtzONZzD4rOe9mhm\nJ6u2ehJR/cfggoiIqA7LVmqx5FyWQdlgT3O81NQSW/s64vv+jmhgWfbP/ZSWVnjB17K6qklETwh2\niyIiIqrDPvkjBykFD/s2mUmAD7s+zJkY4mWBpz3MsPuffEQkKnA6WYEMhWEHqg5OMqz0q5o8CyJ6\nsjG4ICIiqqPislT48kquQdnrbWzQ2Nbw591GJsaUltaY0tIaWkHAn+kqnEpWIjZVCWdzMeZ3tIW5\niSFliYgqisEFERFRHbUwJguqIgnZDS0lmNPeutR1xCIR2jvJTQ5LS0T0qJhzQUREVAfdylHjyF2F\nQdlyP1tYyfjTTkQ1h1cgIiKiOigqxXB0qI5OMjxXwuhQRESPC4MLIiKiOig6xbDVYkAjc4hEzJsg\noprF4IKIiKgOir5n2HLR3Y05FERU8xhcEBER1THphRpczVTr/xaLAD8XBhdEVPMYXBAREdUxMcVa\nLdo4yGAr5086EdU8XomIiIgeE0EQEJ2iwK0cddkLlyK6WDK3P7tEEVEtwXkuiIiIHpNJ4ek4cKsQ\nALCjnyOG+1RudCejfAtXBhdEVDuUu+UiODgY7du3h5ubG/r06YMzZ86UuOzp06cRGBiIxo0bw93d\nHX5+ftiwYUOVVJiIiKguis9W6wMLAFh4NgtaQajwdgrUAn5PNQwuurmZPXL9iIiqQrlaLvbu3YsF\nCxZg7dq18Pf3R3BwMEaPHo3o6Gh4enoaLW9tbY2goCC0bt0aFhYWiImJwZw5c2BhYYGpU6dW+U4Q\nERHVdtezDLtCJeRpcCZFiV7uFQsMfk9VGszK7WUtQUMrSVVUkYjokZWr5WLjxo0YN24cJk2ahBYt\nWmDNmjVwc3PD1q1bTS7fsWNHPP/882jVqhV8fHwwduxYBAQEICoqqkorT0REVFfczdMYle3+J7/C\n2ymeb8EhaImoNikzuFAqlYiNjUVAQIBBeUBAAGJiYsr1Jn/88QfOnj2Lnj17Vq6WREREdZyp4OJ/\nNwtQqK5Y16jik+d1Z5coIqpFyuwWlZaWBo1GAxcXF4NyFxcX3Lt3r9R1W7dujdTUVKjVasyfPx+v\nvvpqqcvHxcWVo8pUV/DzJB2eC6TzJJ8LfyXLUfxnN1spYPtvNxDgbBx4mKIRgKhkCwAPZ+L2KExC\nXFzFczdq0pN8HpAhngt1U7NmzUp8rdyjRYlEIoO/BUEwKisuLCwMeXl5OHfuHJYsWQJvb2+8+OKL\nlaoo1S1xcXH8PAkAzwV66Ek/F7Kv3wegNCo/mW+HoGZO5drGn+kq5GoePthzMBPhmfZNIC7j97g2\nedLPA3qI50L9VGZw4eTkBIlEYtRKkZqaatSaUZyPjw8AoE2bNrh37x4++uijUoMLIiKi+spUtygA\nOJxQiAyFFg5mZadBFu8S1c3VrE4FFkRU/5V5JZPL5ejYsSPCw8MNysPDw9GtW7dyv5FWq4VSafzE\nhoiIqL4TBAGJ+aaDC5UW+N+NgnJtx2h+CyZzE1EtU65uUbNmzUJQUBA6d+6Mbt26YevWrUhOTsbk\nyZMBAEFBQQCALVu26P/r7e2tb+qKjIzEF198gSlTplTHPhAREdVqaQotCktJq9gdn4/JLa3K3I7R\nzNycPI+IaplyBRejRo1Ceno61qxZg5SUFLRq1Qq7d++Gl5cXACAhIcFgeY1Gg6VLl+L27duQSqXw\n8fHBkiVLykzoJiIiqo8Scg0jCwczETIUD5Owo1KUuJWjhrdNyT/Ld3LVSCjStcpMAnR0ZnBBRLVL\nuRO6p06dWuIEeAcPHjT4e+bMmZg5c+aj1YyIiKieKJ5v8ZSTHLkqAWfvP2yJ+Cm+AO90sClxG8Vb\nLTo7y2EmYb4FEdUu5ZpEj4iIiCqveHDR0EqCMU0sDMp+/CcfglDykLLMtyCiuoDBBRERUTUzFVw8\n19gC0iIND9ey1PgjTVXiNqKKjRTlz8nziKgWYnBBRERUze7mGwcXTuYS9G9kblC+My7f5PoX05T4\nK0Ot/1sEwM+FLRdEVPswuCAiIqpmxVsuGllJAABjfQ27Rn1zNQ8nEgsNygrUAqadzEDRDlPtnWSw\nL8e8GEREjxuvTERERNXMVLcoABjsZQF3i4c/xQKAqScykFSkpWPpuSxczVQbrP9O+5ITv4mIahKD\nCyIiomqkFQSDYAF4GFxYSEXY3NsBRcd8ul+oxZSIdKi1Ao7dLcSWv/IM1h3X1BLDfQxbPIiIagsG\nF0RERNXoXoEWKu3Dv+3lIljJHv789m1gjvkdDVsizqQoMT8mCzNPZRiU+9hIsNrfrlrrS0T0KBhc\nEBh5YOgAACAASURBVBERVaOSukQVNa+DDfo2MBz96ZureUgpeBiViEXAlqcdYCPjTzcR1V68QhER\nEVWjhBKSuYuSiEX4urcDPCxL/ll+p70NunH4WSKq5RhcEBERVSPjlgupyeVcLCT4po8jTE263dlZ\nhnc7MombiGo/BhdERETVqDzdonR6uJvhg862BmWWUhG+6u0ImdhE1EFEVMswuCAiIqpGFQkuAOD1\nttZ4tYUVgAeBxeanHdDEznRrBxFRbcOrFRERUTW6m2c4R0VZwYVYJMK6HvZ4u701rGRiOHCyPCKq\nQxhcEBERVaOSZucuSyNr/kQTUd3DxyFERETVRK0VkFxkOFkAaFDO4IKIqC5icEFERPWeQiNAEITH\n/r5J+Rpoi7yti7kYZqaGgyIiqicYXBARUb0lCAIWxGSi4beJ6PhTCvbfLHis71/RZG4iorqOwQUR\nEdVb26/lY/OVPKgF4FauBpPC0/Hy8TSk5GvKXrkKMLggoicNgwsiIqqXbuaosehsllF5yK1CdNuX\ngh+u51d7VykGF0T0pGFwQURE9Y5WEDDzVAby1KaDh0ylgBmnMjD2aBqylFqTy1SFhEqOFEVEVFcx\nuCAionpn85U8nElRGpSZurE/nKDA1Ij0amvBKN5ywZGiiKi+Y3BBRET1yrVMFZadN+wOFdDADLEv\nuGF5F1uYF7u/P3JXga/+yquWurBbFBE9aRhcEBFRvaHWCph+KgOFRe7pbeUibOjlAKlYhNfb2eD0\nCFe0d5QZrPfBuSxcyVBVeX0YXBDRk4bBBRER1RufXcrF76mGQcIaf3uDm/qmdjJ8G+AIW9nD+SYU\nGmDqiXQUlpCjURkKjYD7hQ/zOUQAPCwZXBBR/cbggoiIHhu1tvoms7uYpsTq2GyDsmFe5hjja2G0\nrLeNFOt62BuUXclQY+l549GlKiuxWKuFu6UYMjEn0COi+o3BBRERVTuVVsDyODlctiei5//uGXUX\nelQKzYPuUKoiAz85mYnxaQ97iESmb+hf8LXEmCaGgcfmK3k4mlBYJXUqPlIUu0QR0ZOAwQUREVW7\nhWezcCBFCgHAlUw1Fv9WdS0EALA6NhtXMtQGZZ/2sIeLRek39Gv87eFlbbjMzNMZOHynEEqN6RaW\nPJUWsalKJJcxER/zLYjoSSSt6QoQEVH99t+/8/B1sdGYQv7f3p2HR1Xfexx/zz7ZdxL2CIZNRQRl\nVUCEilJxxbpRRLnGiliUXkRrQatcryJWUau4oHJbq7Rise4KUTZBUBCUxQCyk4Ts+6zn/oFJGJKQ\nABOyfV7Pw4OcOTPzG/lycj7z2/aUkVPuI+7YpZtOwrosN89sLg44dn3XEMYmVx8Odawou5mXh8Zw\n+cfZ+H/JElllfq7/IocYh4krOodwdXIIHj+sznSxKsPFhmwPXgNCLCZeGhrDlbW8j8KFiLRGChci\nItJgVma4+MPX+dWOe/zwjx2l3H12xCm9fqnXz+9W5FUGA4C2oWaeHBBd+5OOMTDRwR/OjeDJjUUB\nx/NcBgt/KmXhT6U1Pq/MZ3Dn8jzOjLRy1jGrT0FN4UI/ckWk5dOwKBERaRC7i7z8dlkutS3A9H8/\nldY4uftwmY+/p5fw9/QSVma42F/sxeev+UUeWV/IjsLA4VDPDYkh2nFiP96mnxvB1fXo6ThWmc9g\nQlouRZ7qu3wfKAlsl3bnFpHWQF+jiIhI0BV5/Nz0RQ65rsCbbrOJyl6G7QVe1ma5GZjoqHw8u9zH\nJR8cZm9x4Lf+djN0DLeQHGGlc7iVDuEWPH6D+ccMt7q1WygjOzhPuL1Ws4kFw2OYmBHG4l2lLNlT\nRp6rfqta7Sj0cs/KfBYMjwmYPK4J3SLSGilciIhIUPkNg9TleWzJD/zm/o5Obg6ZIvnPnqrVmBb+\nVBoQLv60rrBasABw+2FnoY+dhT7AVeP7dg638Gj/qJNut8lkYmhbB0PbOpgzKJqvDrp49+cy1ma6\ncFpNDEp0MCTRzqAkB7O/K+Rv6VXDpd7bXcbArXZSe4VXHtOcCxFpjRQuREQkqGZ/V8hHewOXc70q\nOYTb25eyNzQsIFy893MZjw+IIspuZmWGi3/sqHl+Q11MwAsXxRBhC85oX5vZxMgOzlp7QeYMjGZD\ntpsfj1qh6qF1BZwTa8MAvjrkIt9d1fNhNUEbp0Yii0jLpyudiIgEzb92lTJ3U+DKTb1jbfz1omjM\nJhjRzhEw96DMZ/CvXaW4fQbTVgdO/G4Xaua8eBux9Zg/cffZ4VyY5KjzvGAJsZpYeHFcwC7fHj9c\n/nE2Yz7OrjY5vG2YBYs20BORVkA9FyIiEhTfHXZz98q8gGNtQsy8dUksodYjAcFiNnFzSihPHHXz\nvfCnUgrcBtsLAodRLRgeWzlkqsDtZ0+Rlz3FPnYXeckq81PqNSj3GfSLt3Nr99AG/nTVdY2y8vyF\nMfw2LbfOcy9IsJ+GFomIND6FCxEROWWHSn3ctDSH8qOmGdjN8LcRsXQID/xRc0tKKE9uLKJi0ND3\nOR625HkCzhmfEhowFyPKbqZ3nJ3ecQ31CU7O2OQQJp8Vzgs/Ftd6zoA2dh7qG3kaWyUi0ngULkRE\npBrDMFj8cxlLdpfRLcrGbT3CaFfLhOQyr8HNS3PIKAtcGeqZwdH0b1N9qFLHcCuXtHfwxYGqidlH\nr+Qa6zDzyPnN52b84fMj+bnIWznPJCnEzNB2Doa1PfLr2HAlItKS6YonIiIB8lx+fr8qj/crJ16X\n8+wPRdzQNZR7zgknJerIhnG55T4+P+Bi4U8lfJcd2PMw5exwbkoJq/U9xncLCwgXR/vzBZHEBmHn\n7tPFZjbx9xGxbMnz4rBA10hrwJK0IiKticKFiIhUWpXh4o6v8jhQGriMqscP/5deyt/SSxnd0UmB\n28+aLDc17W33qw4OHu53/J6Hyzo6SXCaOVwe2NsxKNHOTWee/vkTp8pkMtW4S7eISGuj1aJERASv\n32D2d4Vc8Ul2tWBxNAP4eF85qzNrDhbdo6y8Miy2zpWR7BYTNx4TIqwmmDsoGrO+9RcRabYULkRE\nWrmvM12M+vAwc74vqhYYzo61kRxRvyFKfeJsvDMqjih7/X603NYjjDBrVZD4/Tnh9IrRt/8iIs2Z\nhkWJiDSSfJefT/aVc6jUR3a5n+xyHznlfgrcfsJtZmIdv/xyVv133C//HeMwE+80E3YKm8btLvIy\na30BS3aX1/j4PWeH81DfSMwmeH93GX/ZXMzm3MC5Fb1irFzeMYTLOjk5L952Qr0OyRFW3v1VHG/t\nKOWsGBv/1bP2ORoiItI81DtcvPrqq8ybN4/MzEx69OjB448/zuDBg2s89/333+f1119n06ZNuFwu\nunfvzrRp07j88suD1nARkebso71lpC7Po8hTw9iiE3BxOwdzB0XTJbL+3xXlu/zM3VTE/C3FuP3V\nH08MMTN/aAzD21XtTn1Nl1CuPiOEtIMulh5w0THcwuiOTpIjTu07qoGJjoAlZ0VEpHmr11deixcv\nZsaMGUybNo3ly5fTv39/xo0bx759+2o8f9WqVQwdOpRFixaxfPlyRo0axS233MLq1auD2ngRkebG\nMAye3lTEzUtzTzlYAKQddDH8/Sze311Wr/O35Xu4cEkWz/1Qc7C4MtnJqqvaBASLCiaTiRHtnczu\nH8WdvcJPOViIiEjLY8rPz6/zp9sll1zCWWedxbx58yqP9e3blyuvvJJZs2bV641GjBjBoEGDmD17\n9sm3VpqN9PR0UlJSGrsZ0gSoFqqUeQ2mrMrjX7vqFwRO1F1nhfHI+VHYaplM/d1hN9d9nkOuq3qq\nOC/exuwLohic1HC9CKoFAdWBVFEttEx1fu3kdrvZuHEjU6ZMCTg+YsQI1q5dW+83Ki4uJjo6+sRb\nKCLSAhwsObKD9cacwDkLFhPc2j2MjmEW4pxH5lFEO8wUewxyXX5yyv3kuvzk/vJ7TrmPXJef7HI/\nmcdsWvfXH0tYn+Vh8tnhHC7zcajUx6FSPxmlPjJKfews8uI6ZiGo9qEWZp0fyXVdQrRKk4iInLI6\nw0VOTg4+n4+EhISA4wkJCWRlZdXrTV555RUOHjzIb37zm+Oel56eXq/Xk+ZBf59SobXXwv4yE3ds\ndnDYHTgSNdJq8L89XFwQXVp10HXkVzyQDGD/5VdE4GsaBrxzyMqzP9vwGlWh4JvDbr5Jy61Xu65K\n9DKtSylOfxE7d5z45zoZrb0W5AjVgVRQLTRPx+txqveA2WN3GzUMo147kC5ZsoSZM2fy2muv0alT\np+Oeq66xlkNdnVKhtdfC4TIf1394mMPuwC6D7lFW3h4ZxxknMBH7WH/qBqN7upn4ZS77S2rfm6Im\n9/UO5099I0/rTtKtvRbkCNWBVFAttEx1TuiOi4vDYrFU66XIzs6u1ptxrCVLlnDnnXfy0ksvaaUo\nEWl1ij1+rv8ih5+LAm/8L+3g4PNfJ5xSsKhwQRs7y8cmMLJ9/eZKJIWYeXpQNDP7RZ3WYCEiIq1D\nnT/Z7HY7ffr0IS0tjauuuqryeFpaGmPHjq31ee+99x6/+93vePHFF7nyyiuD01oRkWbC4ze4NS2X\nDdmBcyyu7xLCixfF1LmD9YmIdVpYNCqOl7eWsGR3GeFWE0mhFtqGWWgbYiEp1EzbUAttQy3EO81B\nfW8REZGj1etrs8mTJ5Oamkq/fv0YMGAACxYsICMjg4kTJwKQmpoKwPz58wF49913SU1N5dFHH2Xw\n4MFkZmYCR4JKTExMQ3wOEZEmwzAMpqzM44sDroDjI9o5eP7C4AaLCmaTiTt7hXNnr/Cgv7aIiEh9\n1StcXHPNNeTm5jJnzhwyMzPp2bMnixYtqpxDsX///oDzFyxYgNfr5YEHHuCBBx6oPD5kyBA+/PDD\nIDZfRKRpMQyDR74t5O2dgcvN9omz8eaIWOwW9RqIiEjLVe8Bv5MmTWLSpEk1PnZsYFCAEJHWaE+R\nl9+vzufLg4E9FskRR4YtRdjqtW+piIhIs6XtVUVETpHfMHhtWwkPry+kxBu4L2m808ziX8XTJsTS\nSK0TERE5fRQuREROwa5CL3evzGN1prvaY5E2E4tGxtElCKtCiYiINAf6iSciLZZhGJR6DUKspqDv\nPl3g9vP090W8uKUYt7/640PbOpg3JJrkCF1mRUSk9dBPPRFpkQ6X+fjNFzl8l+0h3mlmZHsHozuG\ncHF7B1H22uc+5Jb7WJnhZsUhF3uLvXSKsDIk0cHgJDttQix4/QYLfyrlfzYUkl1ePVVE2Ew8ekEU\nE7qFah8JERFpdRQuRKRBGQYs2FbCygwXTouJaIeJaLuZaLuZNiEWhrdzEO0I/kTn+77O57tf9pjI\nLvfz9s4y3t5ZhtUEAxLtdAizEGo1EWI1EWoxU+L1syrDzeZcD4GzJly8srUEgJSoI5fM9AJvje85\nsr2DZwZH0yFcl1YREWmd9BNQRBrUi3tsvL4/v9bH24Wa+fCy4OxWXeHz/eX8Z095jY95DViVUX1+\nRH3UFirahpqZ1S+K33QNUW+FiIi0aloXUUQazId7ynh9v+245xws9XPd59nklPuC8p5lXoP/XlN7\nmAmmUKuJGX0iWH9NIjecqWFQIiIi6rkQkQaxo8DD71bk1evcnYU+blqay78vjSfEWnWDXuj2M3Nd\nAWuz3PSKsTE2OYRRHRyEWmv/XuSZzUXsLqoKKmYTzBsSzbY8L5/tL+enWnofjnZ2rI2hbe30jrXz\nY56H1RkuNuZ48P0yXsoE3HhmKA/1jaRdmJaYFRERqaBwISJBV+LxM35ZLoWeqtkLVhPM7BcJQJ7L\nz/rDblYcNTxpbZabO1fk8vrwWMwmE3kuP9d9ls23v8yb2Jrv5d2fywi1mhjVwcGVnUMY3ckZEDR2\nFXp5ZnNRQFtu7x7GLSlhADzWP4qfC71syvVQ4vFT5juymlSZ18BrwFkxNi5MshPnrB4Yijx+1mW5\n2VnoZUiSg14xx++RERERaY0ULkSkks9v8NG+cl7eUszOQi/ju4Uxo0/ECQ33MQyD36/OZ2t+YA/B\nY/2juLNXeOWfXT6Daz/LZuVRAWPJ7nJmrivknnPCufrTbH7Mq97LUOo1WLK7nCW7y4lxmEjtGc4d\nPcOIcZj57zX5uI4aXZXgNPPHvpEBzz8j0npS8zsibGZGtHcyov0JP1VERKTVULgQEcq9Bm/vLOW5\nH4rYWVh1d/7ExiKSI6zceGZovV9r/tYS/rWrLODYdV1CSO0ZFnDMYTHxtxFxjP7oMNuOCiLP/1jM\nOztLOVzDMq/HynMZ/O/GIp77oZgR7R0sPeAKePyx/lENshKViIiI1EzhQqSVyHf5+XhfOVvyPLh8\nBh6/gdsPbp/Blwddtd7M//GbAkZ1cBBfw1ChCi6fwcd7y/l7eglfHHOD3zXUz7ODo2vs/Yh2mFk0\nKo5RHxwms6zq/Y9ty6BEO33ibLy/u5wDpdUnfpd4jWqrQw1JsnN9l5Ba2ywiIiLBp3Ah0gL5DYP9\nJT7SC7ykF3hZccjF5/vLa9xJui65Lj8Pri3g5WGx1R7blu/htW0l/GtXKXkuo9rjkTYTT/Z0EWar\nvfegU7iVd0bGMebjbEq81V9jZHsHC0fEEmo1M7u/wXfZHt77uYy/pZdQ4K5+PhyZ3zF3UM2BRkRE\nRBqOwoVIM2cYBit+2VF6R4GXnwo87Cr0Uear+ca7LlYT9Im3sf6wp/LYol1lXN+1nJEdnJXH5m8p\n5sFvCjje27x4UQyd3CV1vmefeDuvD4/lhqU5+I96vV93cvLa8FgcliMhwWwycX6CnfMT7NzfJ4I3\nt5fwwo/FZJQFpqa7zw6nR7QmXIuIiJxuGows0kwZhkHagXJGfXiYsZ9kM+f7It7bXcaPed6TChYR\nNhNTzg7n+3FJfHx5AmfHBt6c3/t1PsUePz6/wfQ1+dy/tvZgcXasjUUj4xjTuf7Dkn7V0clfL4wh\n5JcgcWu3UN64uCpYHCvSbmbKORF8Py6JZwdHV+6efWkHB9P7RNT7fUVERCR41HMhEkS7i7zsL/Ex\nONGO+RSH5Pj8Bq9sK+HHXA/twiykRFlJibJyZqSV77I9/M+GQr7OPLGdprtEWLgyOYTEUAt2swmb\nGWxmE1F2E4OTHETZq75vmDc4mpEfHq7sSdhX7GPmukIOlHj5dL+r2mvHOEyM6xLKzSmhnBtnP6nP\nfMOZoYzu6KTcZ5AUWr/9IxwWExO6hzGhexilXv9x98AQERGRhqVwIRIkH+0tY/yyXHwGXJBg45+j\n4k9ppaJpX+fzxk+lJ/38GIeJlEgbKdFWUiKtDGvnoE+crd7zEPom2EntGcaLW6qGNS3YXn2IU7jV\nxJxB0VxzRkitvQwn4lT+nylYiIiINC6FC5EgcPkM/vB1fuUwoXWHPdyyLId3fxVf7YbbMI5MSt5R\n6OXyTk4iapjs/PaO0hMOFpd1dHJZJycpUVa6RVlr3AjuRP2xbyQf7C1nX3H1FZoA2oWaeWdUPOfE\nan6DiIiIKFyIBMU7O0s5WBo4qXhlhps7l+fx2vCYyiFSBW4/U1fl897uI/tAtAkxs2hkHH3iq4YR\nbcv3cN/X+fV+71HtHTzYN5Lz4k9uKNLxhNvMPD0omnGf51R77Nw4G2+PjKNtPYcviYiISMunMQQi\np8jnN3h2c1GNj723u4yH1hUAsDHbzfD3syqDBUBWmZ8xH2fz2b4jezSUePxMWJZL6VFLsjotcGev\nMC7t6KRLhAWzCSwmGN7OwaeXx/PPX8U3SLCoMKqDk3HH7BdxWUcnH10Wr2AhIiIiAdRzIXKK3t9T\nFrCr9bH++mMJB0v8fLS3rMZ9Jkq8BjcuzeEvg6NZleFie4E34PE5A6MZ361qd2uXz8AE2IMwv6G+\n/jI4GqvZxPfZbsZ1DeWes8OxmLWHhIiIiARSuBA5BYZh8PSm4oBjl3ZwsDHHE7Dj9L+P6q2oic+A\ne1ZVHwp145mh3JISGnAsGJOmT1S4zcyLF8Wc9vcVERGR5kXDokROwRcHXGzOrdpszgQ81j+KRaPi\niLDVHgJu7xHG//SP4ngxoWe0lacGRmmXaREREWk21HMhcgqe3hQ41+KKzk5Soo6snPR/I2K57rMc\njpo+QYTNxLwh0Vx9xpHeiI7hFv7rq1zKjxlVFWY18cbFsYTVsJKUiIiISFOlOxeRk/R1pqvaJnb3\n9a7aGXp4Oyfzh8ZQsSJsnzgbX41tUxksAK7oHML7o+OJPWZvh78MjqZ7tJZ3FRERkeZFPRciJyG3\n3McTGwN7LUa0cwQsKQtwbZdQhiQ5yCj10TvOVuOu3f3bOPhsTDzT1xSwq8jL73qFc33X0GrniYiI\niDR1Chci9VDo9rMyw8WKQy5WZLj54ah5FhXuParX4mhJoRaS6liy9cwoG4svjQ9KW0VEREQai8KF\nyHGUePzM+6GY534oDth74lgXJNi4MKnh9poQERERaQ4ULkRq4DcM3t5RyqPfFXKotIbNKY5iNsGs\n87Wqk4iIiIjChchRDMNgRYabmesK2JhTfehTBRNwduyR3orfdA2tNtdCREREpDVSuJBWz28YfJPl\nZsnuMv6zp5z9JTXvth3vNHPNGSFc1NbBhUkOYhxabE1ERETkaAoX0ioYhsG32R5+zPVwuNzP4TIf\nOS4/h8v8bMsP3E37WHYz3HVWOPf1jiDSrkAhIiIiUhuFC2nRyr0G7/5cyotbSmpc4akuVyWH8PD5\nkSRH6J+KiIiISF10xyTN2rID5dy/toCDJT66RFrpGW2le7SN7tFWNud6WLCthMPlx5+QfawQi4mR\nHRzcdVY4gxIdDdRyERERkZZH4UKaJZ/f4PGNRcz9voiKBWI353rYnOsByk749cKtJi7t6GRscggj\n2zsIs2n4k4iIiMiJUriQZiej1Mekr3JZmeE+oeeZTTCqg5MeUVbinWbiQyzEO80kOM30iLbhtGop\nWREREZFToXAhzcpXB8v5r+V5ZB1nAvaxIm0mxncL4796hmnuhIiIiEgD0p2WNAuGYfD8D8XMXF/I\nsftkJ4aYmTckhlCriW35Hrbne9mW78FuPjLU6aaUUCI0zElERESkwSlcSJPn9RtMX1PAgu0l1R4b\n2tbBq8NiaBNiAeCitpqALSIiItJYFC6kSSj2+Cn3GcQ7LQHHizx+bkvL5fMDroDjJmB6nwimnxuB\nxay5EiIiIiJNgcKFNKpij5+nNxXx1x+LKfdB53ALF7Z1cFGSgx7RVu5elV9tf4pIm4k3Lo5lRHtn\nI7VaRERERGqicCGNwjAM3v25jJnrCjhYWjU5e0+xjz3ppfw9vbTG53UIs7BoVBy9Ymynq6kiIiIi\nUk/1nuX66quv0rt3bxITExk2bBirV6+u9dyMjAwmTZrEBRdcQGxsLL/73e+C0lhp/gzDYGO2mzEf\nZzPpq7yAYFGXPnE2vvh1goKFiIiISBNVr56LxYsXM2PGDObOncvAgQN59dVXGTduHGvWrKFjx47V\nzne5XMTGxjJ16lTefPPNoDdamo/dRV7WZrnZlONhU46bzbke8t3HrvdUt9Ednbw2LEab24mIiIg0\nYfUKFy+88AI33XQTEyZMAGDOnDksXbqUBQsWMGvWrGrnd+7cmSeffBKA999/P4jNleZiY4GZP36e\nzWf7XXWeazPD5LPCmXxWOFvyPKw45GZlhov1h49sknfXWeHM6hepidsiIiIiTVyd4cLtdrNx40am\nTJkScHzEiBGsXbu2wRomzY9hGHxxwMXTm4r4OtMJ1B0sRrV38PiAKM6MOjLUaViIhWHtjkzUdvkM\nfIZBqFW9FSIiIiLNQZ3hIicnB5/PR0JCQsDxhIQEsrKygtqY9PT0oL6enD7pJSYe+cnB9pK6g0Co\nxaBXuJ8b23m5KLYUIyuP9OCWkjQx+rctFVQLAqoDqaJaaJ5SUlJqfazeq0WZTIFDUgzDqHbsVB2v\nodLwdhR4+HBvOX4DJnQLJfaYPSdqs/6wmzu/yaawlrkU58XbGN7WQe84G71j7ZwRacEc5NqRpis9\nPV3/tgVQLcgRqgOpoFpomeoMF3FxcVgslmq9FNnZ2dV6M6T5KfL4ee/nMt5KL2VNlrvy+ILtJSz+\nVRwpUcdfmWl1hovrP8+h2Fs9WIxo5+De3hFcmGQPehAVERERkaanzjEsdrudPn36kJaWFnA8LS2N\nAQMGNFjDpGHtKfIyeWUe3d/O4J5V+QHBAmBfsY9LP8zm28PuWl4BvjpYznU1BIsxnZws7FPG4kvj\nuaitQ8FCREREpJWo17CoyZMnk5qaSr9+/RgwYAALFiwgIyODiRMnApCamgrA/PnzK5+zadMmAAoL\nCzGZTGzatAm73U6PHj2C/RnkBPj8Bi9vLeGx7wopqaG34Wi5Lj9XfJLNwotjGdkhcDfsz/aVMz4t\nB5cv8Dn394lgRp8IduzIDXbTRURERKSJq1e4uOaaa8jNzWXOnDlkZmbSs2dPFi1aRKdOnQDYv39/\ntecMHTo04M+ffPIJHTt2ZPPmzUFotpyMLXke7lmVx/rDnlrP6RppYWdhVWIo9Rrc8EUO/zsgilCr\nie9zPGzK9bAuy82x2WRWv0ju7R3RUM0XERERkSau3hO6J02axKRJk2p87MMPP6x2LD8//+RbJUHl\n9hk8tamIv2wqwlPDhtjtQs3cdGYYN6WEckaEhce+K2TupuLKx70G/GFNwXHf43/6R3HXWeHBbrqI\niIiINCP1DhfSPBV5/Ny8NJflh6rvORFpN/Hn86MYnxIasEHdn/pFkRBiYcba4weKCnMHRXF7DwUL\nERERkdZO4aIFy3P5ue6zbL7Nrj4MakwnJ08NiqZtaM3Lzd7ZK5wEp5k7V+TV2NsB0CHMwmMXRHHV\nGSHBbLaIiIiINFMKF81YnsvP4p9L2V3kw2YGi8mE1QzWX35/Z0cpW/K9Ac9pE2JmzsBoxnZ21rmK\n07VdQkkIsfDgNwXklfvpFWPl3Hg758bZODfORscwi1aCEhEREZFKChdNVKnXjwkTIdbqN+8euk1n\nzQAAFR5JREFUv8GCbSU8vqGQ/Fo2rqtJ33gb/xwVR1w9N8cDGNrWwcor29T7fBERERFpvRQumhif\n3+DJ74uYt7kYl9/gggQ7I9s7GNnByblxNj7f7+JP6wr4qcBb94sd5cIkO/8YGUeErc6tTURERERE\nTorCRRNyqNTHpK9yWZVRtXHd2iw3a7PczN5QRITNRJGn/j0VFUZ3dPL68Ngae0FERERERIJF4aKJ\nWHagnDuW55FdXsvsaagxWIRbTdzWI4wouxmvYeD1g++X372GQc9oGzeeGYrVrGAhIiIiIg1L4aIR\nefwGuwq9vLOzlL9sKuZE+iRMwPhuofzxvEgSa1nxSURERETkdFK4OE1cPoN1h92sOOTix1wPPxV4\n2VXorbbLdYVhbR08ekEkG3M8fLG/nC8Puij8pefioiQ7s/tH0TvOfho/gYiIiIjI8SlcBInPb1Dk\nMSjzGZR5DUq9BsUeP+sOu/nqoIvVmW5Ka0sSRzGbYEafCKb1jsBiNtE7zs5vu4Xh8RtszvFgNcM5\nsTYtASsiIiIiTY7CRRD8c2cp968tINdV+3yJ+kgMMfPqsFguauuo9pjNbKJvgnoqRERERKTpUrg4\nRTsLvExemYf7JHNF21Az3aJs9G9jJ7VXGPEnsAeFiIiIiEhTonBxih78Jr/ewaJtqJnh7ZwMTrTT\nM8ZGSpSVKLv2nRARERGRlkHh4hR8uq+cT/e7Ao4lOM2E2UyEWkw4rSbahloY2tbB8HYOukVZNVdC\nRERERFoshYuT5PIZPLA2P+DYoEQ7H10WrwAhIiIiIq2SxuScpL/+WMyuIl/ln80meGJAlIKFiIiI\niLRaChcn4WCJj6e+Lwo4NrF7mPadEBEREZFWTeHiKLnlPoo8dc/OnrW+gJKj9qyIcZj443kRDdk0\nEREREZEmT+HiF49vKKTLPzI48x+HeHh9AeW1bHi3OsPFP3eVBRx7qG8ksVpCVkRERERaOYULYGWG\niyc2Hhnm5PLBM5uLuej9LNZkVq0Ele/y89h3hYz7PCfguWfH2ri1W9hpba+IiIiISFPU6leL8vgN\n/vvr/GrH0wu8XPZRNnf0DCMp1MKzm4vId1fvzXhyQBQWsyZxi4iIiIi0+nAxf0sxW/O9NT5mAPO3\nltT63Nu6hzE4ydFALRMRERERaV5a9bCoQ6U+/ndD4KpPZ0TUPXci3mnm8f5RPDUoqqGaJiIiIiLS\n7LTqnos/rSug+KiJ25F2E5+NSWBLnod7VuWzp9gXcH6k3cQ9Z0dwZ68wwm2tOpeJiIiIiFTTasPF\nVwdd/OuYVZ/+1DeShBALw0IsrL6qDY99V8ibP5ViNcOkHmFMOTuCGIdChYiIiIhITVpluHD7DKav\nCZzE3TvWxm3dq1Z9CrOZeXxANLP6RWG3gFk7b4uIiIiIHFerCxd7irz8ZVMR2wsCJ3E/NajmVZ+c\nVoUKEREREZH6aBXhIt/l59+7y3hnZylfZ7qrPT4+JZT+bbTqk4iIiIjIqWix4cJvGHx10MX/pZfy\n4d4yXL6az4u2m5h1fuTpbZyIiIiISAvUIsKFYRiUeg1yXX5yyv18ur+cv6eXsre4lkTxi0i7iTcu\njiXeWffysyIiIiIicnzNNlwsPVDOkxuL2FfsJdflp/z4OSJA/wQ7vzkzhKuTQ4hVsBARERERCYpm\nGS4+3FPGhLRcjtqiok7JERZ+0zWU33QNpUtks/zYIiIiIiJNWrO7y/5sXzm3flm/YOG0wNjkEMan\nhDEkya7lZEVEREREGlCzChfLDpQzPi0Hj7/6Yw4LxDrMxDjMtA21cHknJ9eeEUq0Nr0TERERETkt\nmmS4KPb4KfcZxDrMlb0NKw65uGlpTrVVn54ZHM11XUIIs5owqWdCRERERKTRNKlwYRgGD68v5Nkf\nigEwmyDeaSbeaWZ3ka/apO2/DIrm1qN21RYRERERkcbTpMLFi1tKKoMFgN+ArDI/WWXVx0E9MSCK\niT0ULEREREREmoomNSHhT+sK6nXeo+dHktorvIFbIyIiIiIiJ6JJhQvfUStA1TR7wgQ83C+SKedE\nnK4miYiIiIhIPTWpYVEVTMDbI+MY3s5Bdrmfw2U+cl1+OoVbODPK1tjNExERERGRGjTJcPFQ30gu\n7egEoH2YhfZh2kVbRERERKSpa1LDogCuSg7hvt6aTyEiIiIi0tzUO1y8+uqr9O7dm8TERIYNG8bq\n1auPe/7KlSsZNmwYiYmJnHvuuSxYsKDO9zgrxsoLF0ZrvwoRERERkWaoXuFi8eLFzJgxg2nTprF8\n+XL69+/PuHHj2LdvX43n7969m+uvv57+/fuzfPly7rvvPqZPn86SJUuO+z5vXRJHmK3JdaaIiIiI\niEg91OtO/oUXXuCmm25iwoQJdO/enTlz5pCYmFhrb8Trr79OUlISc+bMoXv37kyYMIEbb7yR559/\n/rjv0zmiSU4BERERERGReqgzXLjdbjZu3MiIESMCjo8YMYK1a9fW+Jxvvvmm2vmXXHIJGzZswOPx\nnEJzRURERESkqaqzqyAnJwefz0dCQkLA8YSEBLKysmp8TlZWFsOHD692vtfrJScnh6SkpBqfl56e\nXs9mS3Ogv0+poFqQCqoFAdWBVFEtNE8pKSm1PlbvcUjHTrI2DOO4E69rOr+m40c7XkOleUlPT9ff\npwCqBamiWhBQHUgV1ULLVOewqLi4OCwWS7Veiuzs7Gq9GRXatGlT4/lWq5XY2NhTaK6IiIiIiDRV\ndYYLu91Onz59SEtLCzielpbGgAEDanxO//79+fLLL6udf95552GzaYdtEREREZGWqF6rRU2ePJm3\n3nqLhQsXsn37du6//34yMjKYOHEiAKmpqaSmplaeP3HiRA4ePMiMGTPYvn07Cxcu5K233uLuu+9u\nmE8hIiIiIiKNrl5zLq655hpyc3OZM2cOmZmZ9OzZk0WLFtGpUycA9u/fH3B+cnIyixYt4sEHH2TB\nggUkJSXxxBNPcOWVVwb/E4iIiIiISJNgys/PNxq7EdLyaJKWVFAtSAXVgoDqQKqoFlombYctIiIi\nIiJBoXAhIiIiIiJBoWFRIiIiIiISFOq5EBERERGRoFC4EBERERGRoFC4EBERERGRoFC4EBERERGR\noFC4EBERERGRoFC4EBERERGRoFC4kBNmGFq9WERERI6vuLi4sZsgjUDhQk5Ibm4uJSUllQHD7/c3\ncouksezatYuNGzcCCpyt2datW3nuuefIzMxs7KZII9uxYwczZsxg3bp1jd0UaWQ7duxgzJgxPPHE\nE4DuFVobhQupF7fbzX333ccVV1zBuHHjuOeee/D5fJjNKqHWaN26dfTr14+bbroJn8+HyWRq7CbJ\naeZ2u5k8eTKDBw8mIyODuLi4xm6SNBK/38/06dMZMmQIOTk55OfnN3aTpJG43W7uvPNOBg4cyLff\nfsvq1asBdK/QyuhvW+q0ePFi+vXrx/bt23nkkUe48MILWbVqFXPnzm3spkkjycrKYtiwYbhcLp56\n6ilAvRetyfz58znzzDPZsWMHK1asYPbs2VitVkB10BotWrSIzZs38+9//5tXXnmFUaNGVT6memg9\n5s6dS3JyMnv37mXNmjXce++9AAqbrZC1sRsgTVt5eTlpaWlMmDCB++67D7PZzNChQ1m/fj0Oh6Ox\nmyenmWEYmEwmtm3bRrt27bj22muZPn0648ePp127do3dPDlNnnnmGdq3b8+nn34KwA8//EBpaSkd\nO3YkPj4em81WWSvSsvl8Pt5++22GDh3KoEGDWL16NV9//TVdu3Zl8ODBtGnTprGbKKfB0qVL+eCD\nD3jhhRe4+uqrAejRowdPPfWUrgOtkHoupEYV3zY5nU7uvfdexo8fX9mteeDAAQoLC4mPj2fHjh2N\n2Uw5DY7+5rHih0RpaSnnn38+V1xxBR06dODPf/4zAEVFRY3SRml4hmHg9XoBePHFF9mzZw9vvvkm\nt9xyC7fccguTJ0/msssu4+GHHwbQDUULdvQ1IScnh4MHDzJ69Ghmz57Nrbfeytdff83999/Pr3/9\n68phMdIyVcylGDRoEGlpaZXBAiA6OprExETWrFnTWM2TRqJwIQHS0tKAwMlXXbp0ITExETjS7dmv\nXz9MJhMvvPACY8eO5c0332yUtkrDqqkWKuzdu5eysjKio6OZM2cO77zzDr/97W9JTU1l7969p7up\n0oCOrgOr1YphGAwfPpyBAwcydepUYmJiWLBgAc8//zx33HEHL730En//+98rnyMtR03XhDZt2mAy\nmZg3bx579+7lX//6F3/729/YuHEjISEhvPrqq+zbt6+xmiwNpKIWKoJmaGhotXPatWtHYWEhPp8v\n4Fxp+RQuBIBPPvmEHj16cM0117B161YsFkvlBeFoFouFJUuW8Mknn/DRRx9x2223MWvWLEpKShqh\n1dIQ6qoFv9/PTz/9xGWXXQbAli1bcDgcfPzxx9x111106tSpsZouQVRbHVTcWL744ovccccd/PGP\nf6Rv374MGDCAO+64g9tuu405c+YAmsTZUhzvmuDxeLjyyiv56KOP2LVrF127dsVutxMSEsLMmTP5\n4osvtBxpC1LfewXDMEhJSSEpKYlvvvmmEVoqjUlXfuHTTz/lueeeY8yYMQwcOJD77rsPOBIkKlTc\nUEydOpWLLroIq9VKdHQ0ffv2xeVysXXr1kZpuwRXXbXg9/sxm8107dqVRYsWMWzYMJ5++mkmTpyI\n1WolIyOj8jxpvo5XBxaLBb/fT2JiIjNnziQpKanyeVarlfbt22MymdSD1ULUdU2w2WwMGTKELl26\nYLVaCQsLqxwS169fPzwej3ouWoj63CtUMJlMFBYW0r59ezIyMnC73Roq2YpYZsyY8XBjN0IaR8WE\ny/LyctxuN7fffjs9evTg2WefpVu3bvTo0QOv14vZbK71orBw4ULCwsKYMmWKLhzNWH1rwWKxkJ+f\nz8MPP8zy5cu57LLLeO211xg7diyZmZk88sgj3Hvvvdhstsb+SHISTqQOAOx2e7Xnv/baa3Tu3Jmb\nb765MT6CBEl9asHtdmOxWGjbti0+n4+FCxfSvn37yt6LxYsXk5mZydSpU3E6nY39keQknci9wtHP\ncTqdfP755xw6dIjx48fj9/t1n9BKmPLz8zUIrpXZuHEjZ5xxBlFRUZXHvF4vVquVwsJCHnzwQZYu\nXVrZG3Hsqi/Z2dmUlJQwd+5cli1bxqOPPsrVV1+t1WGaoROtBY/Hg81mY+nSpcTHx3PuuedWPm/H\njh289957TJs2TcNhmplTvSZkZWVRVlbGU089xYoVK3jmmWcYPny4rgnN0InWgs/nw2KxUFJSwtNP\nP80rr7xCr169SEpKYunSpUyfPp0pU6aoFpqhU7kuVPRyv/zyy8yePZtvv/2W+Pj4Rvkccvqp56IV\nWbJkCddeey0ffPABr7zyCvn5+XTv3j2gG9vpdNKuXTv+8Y9/UFpaykUXXVR5kYAjm6e9/vrrPPTQ\nQ5hMJt544w2GDBkCaHWY5uRUasFisdClS5eA4TAAsbGxDBkyRHXQjATjmvDNN9/w8ssv88ADD2Cx\nWHjjjTfo27cvoGtCc3KqtWC32xk2bBjdu3cnOjoawzCYN29e5dws1ULzEYzrQsV5q1evJj4+ntGj\nR1fr6ZSWS+GildiwYQPTp08nNTWV3//+97Rv355nn32W3NxcBgwYQEhISOWO29HR0fj9fp566inu\nuOMOQkNDKS8vrxxP6/V6ueGGG5gxYwaxsbGN/dHkBJ1KLYSFheF2uwFN1m3ugn1NuPnmm3nggQd0\nTWiGTrUWXC5X5RcPKSkpDBo0iFGjRmnX9mYoGLVgMpkqfz6cf/75jBkzRsGilVG4aOEquik//vhj\nvvzyS+bNm0enTp3o168fTqeTpUuXUlhYyJAhQyovBhWTMr/88ks2bNhA9+7dufvuu+nYsSMpKSn0\n6NFDKwI1Q8GqhcmTJ9O5c2c6duzYyJ9ITkZDXBN69uxJ586dG/mTyYkKZi0kJyfrmtCMNdTPB30J\n1Trpb72Fq+ia3LNnD2eccUZA1/T48eM599xz+fzzz9m2bRtA5ZJyycnJ3Hzzzbz77rsMHjwYk8nE\neeedd/o/gASNakFAdSBVglULgGqhmdN1QYJJ4aKFWbZsGX/4wx949tlnWbVqVeXxAQMGsH79ejIz\nM4Ejk63CwsL49a9/jWEYLF26FDiypFxZWRkvvfQSs2bNYsiQIaxcuZJ//vOfWu2jmVEtCKgOpIpq\nQSqoFqQhKVy0EBkZGdxwww2kpqZSXFzMu+++y/XXX8+yZcswDINLLrmEzp07M2/evIDnXXLJJZjN\nZnbt2lV5LCsri9WrV/P888/zwQcf0LNnz9P9ceQUqBYEVAdSRbUgFVQLcjpoKdoWoLS0lGnTpuFy\nuZg5cybJyckAXH755SQkJPDmm2/i9/tZtGgRd911F//5z38qV3gCmDRpEpmZmfznP/9ppE8gwaJa\nEFAdSBXVglRQLcjpop6LFiA0NBS73c6NN95IcnJy5Wo+o0ePJj09vXJ5uKuvvpoxY8YwdepUvvrq\nKwzDIDMzk127djFu3LhG/hQSDKoFAdWBVFEtSAXVgpwu6rloISo2N4OqVR/uvvtuPB4P8+fPD9hh\n87rrrmPr1q307t2bbdu20aFDB15//XU6dOjQyJ9CgkG1IKA6kCqqBamgWpDTQeGiBbviiiu4+uqr\nue222zAMo3Id8qysLH788Uc2bNhAx44d9U1EK6BaEFAdSBXVglRQLUiwWRu7AdIw9uzZw7Zt2zjn\nnHOAI8vMeTweLBYLbdq0oU2bNlx88cWN3Eo5HVQLAqoDqaJakAqqBWkImnPRwhjGkY6oNWvWEBIS\nwgUXXADAk08+ye233x6w0oO0bKoFAdWBVFEtSAXVgjQk9Vy0MBUb33z77beMHTuWZcuWMXXqVFwu\nF3/961/p0qVLI7dQThfVgoDqQKqoFqSCakEakuZctEDl5eUMHjyYn3/+GbvdzgMPPMDUqVMbu1nS\nCFQLAqoDqaJakAqqBWko6rlogZxOJ506dWLEiBE89thj2i2zFVMtCKgOpIpqQSqoFqShqOeihfL5\nfFgslsZuhjQBqgUB1YFUUS1IBdWCNARN6G6hdLGQCqoFAdWBVFEtSAXVgjQEhQsREREREQkKhQsR\nEREREQkKhQsREREREQkKhQsREREREQkKhQsREREREQkKhQsREREREQkKhQsREREREQmK/wenD/56\n29N8XAAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1f294e82e10>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"last_date = advanceDateByCalendar('china.sse', dates[-1], frequency)\n",
"\n",
"df = pd.Series(final_res, index=dates[1:] + [last_date])\n",
"df.sort_index(inplace=True)\n",
"df['2012-01-01':].cumsum().plot(figsize=(12, 6))\n",
"plt.title('Prod factors model {1} ({0})'.format(method, model.__class__.__name__))"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>train</th>\n",
" <th>test</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>0.299600</td>\n",
" <td>-2.977376</td>\n",
" </tr>\n",
" <tr>\n",
" <th>median</th>\n",
" <td>0.273046</td>\n",
" <td>-0.599503</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>0.130248</td>\n",
" <td>17.599132</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" train test\n",
"mean 0.299600 -2.977376\n",
"median 0.273046 -0.599503\n",
"std 0.130248 17.599132"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"accuray_table.aggregate([np.mean, np.median, np.std])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"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.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
notebooks/machine learning/tree_based_method.ipynb
View file @
f494294d
This source diff could not be displayed because it is too large. You can
view the blob
instead.
notebooks/machine learning/xgboost_method.ipynb
0 → 100644
View file @
f494294d
{
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import datetime as dt\n",
"import numpy as np\n",
"import pandas as pd\n",
"from matplotlib import pyplot as plt\n",
"from alphamind.api import *\n",
"from PyFin.api import *\n",
"from xgboost.sklearn import XGBRegressor\n",
"\n",
"plt.style.use('fivethirtyeight')\n",
"engine = SqlEngine('postgres+psycopg2://postgres:A12345678!@10.63.6.220/alpha')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"u_name = 'zz500'\n",
"benchmark = 905\n",
"universe = Universe(u_name, [u_name])\n",
"factor_coverage = engine.fetch_factor_coverage()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"flitered_coverage = factor_coverage[((factor_coverage.source == 'uqer'))\n",
" & (factor_coverage.universe == u_name) \n",
" & (factor_coverage.trade_date >= '2012-01-01')]\n",
"coverage_report = flitered_coverage.groupby(['factor'])['coverage'].mean()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"flitered_coverage = factor_coverage[((factor_coverage.source == 'uqer'))\n",
" & (factor_coverage.universe == u_name) \n",
" & (factor_coverage.trade_date >= '2012-01-01')]\n",
"coverage_report = flitered_coverage.groupby(['factor'])['coverage'].mean()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"alpha_factors = coverage_report[coverage_report >= 0.98].index.tolist()\n",
"\n",
"alpha_factors = {\n",
" f: CSRank(DIFF(f) / (ABS(f) + 1e-4)) for f in alpha_factors\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"212"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"alpha_factors.__len__()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"frequency = '2w'\n",
"batch = 8\n",
"start_date = '2012-01-01'\n",
"end_date = '2017-10-25'\n",
"method = 'risk_neutral'\n",
"portfolio_risk_neutralize = ['SIZE']\n",
"neutralize_risk = industry_styles + portfolio_risk_neutralize\n",
"industry_lower = 1.\n",
"industry_upper = 1."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2017-10-27 13:21:53,490 - ALPHA_MIND - INFO - Starting data package fetching ...\n",
"2017-10-27 13:22:59,650 - ALPHA_MIND - INFO - Loading data is finished\n",
"2017-10-27 13:23:11,172 - ALPHA_MIND - INFO - Data processing is finished\n"
]
}
],
"source": [
"data_package = fetch_data_package(engine,\n",
" alpha_factors=alpha_factors,\n",
" start_date=start_date,\n",
" end_date=end_date,\n",
" frequency=frequency,\n",
" universe=universe,\n",
" benchmark=benchmark,\n",
" batch=batch,\n",
" neutralized_risk=neutralize_risk,\n",
" pre_process=[winsorize_normal],\n",
" post_process=[winsorize_normal],\n",
" warm_start=batch)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"train_x = data_package['train']['x']\n",
"train_y = data_package['train']['y']\n",
"\n",
"predict_x = data_package['predict']['x']\n",
"predict_y = data_package['predict']['y']\n",
"\n",
"features = data_package['x_names']"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def plot_model_importance(model, features):\n",
" features = np.array(features)\n",
" n_features = len(features)\n",
" features_importance = model.feature_importances_\n",
" order = features_importance.argsort().argsort()\n",
" features = features[order >= n_features - 10]\n",
" features_importance = features_importance[order >= n_features - 10]\n",
" n_features = len(features)\n",
" plt.figure(figsize=(12, 6))\n",
" plt.barh(range(n_features), features_importance, align='center')\n",
" plt.yticks(np.arange(n_features), features)\n",
" plt.xlabel('Feature importance')\n",
" plt.ylabel('Feature')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 0. Train Score on a specific date\n",
"------------------------------------"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"ref_date = list(train_x.keys())[-2]\n",
"sample_train_x = train_x[ref_date]\n",
"sample_train_y = train_y[ref_date].flatten()\n",
"\n",
"sample_test_x = predict_x[ref_date]\n",
"sample_test_y = predict_y[ref_date].flatten()\n",
"\n",
"n_estimators = 100\n",
"max_depth = 4"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.53133384563088204"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model = XGBRegressor(n_estimators=n_estimators,\n",
" max_depth=max_depth,\n",
" n_jobs=-1)\n",
"model.fit(sample_train_x, sample_train_y)\n",
"model.score(sample_train_x, sample_train_y)"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"-0.086767668507689022"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model.score(sample_test_x, sample_test_y)"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\ncnTkPxEAAAAAOSMtwIyvr6/Fm/wAAAAAeLSwKQ8AAAAAwCIESgAAAACARXjkFXmiMO0IWFixK5tt\nYJ5sB3MFAAArlAAAAAAACxEoAQAAAAAWIVACAAAAACxCoAQAAAAAWIRACQAAAACwCIESAAAAAGAR\nvjYEecIQed7aJeCeSki7maeCj3myHczVnfBVUgDw6GCFEgAAAABgEQIlAAAAAMAiBEoAAAAAgEUI\nlAAAAAAAixAoAQAAAAAWIVACAAAAACxCoAQAAAAAWIRAmU8GDRqkXr16WbsMAAAAAMg3j2ygDAsL\nU8eOHXNsi4+Pl8Fg0I4dOywef9q0aZo/f77F5+eH5ORkvfHGG3rqqafk5uamWrVq6fXXX5fRaDTr\nd/HiRQ0cOFCenp7y8vLSyy+/rEuXLlmpagAAAAAF1SMbKPv27auYmBidPXs2W9uSJUvk6emp5s2b\n53rctLQ0SVKZMmVkMBgeuM68dP78eSUmJmr8+PHas2eP5s+fr5iYGA0cONCsX//+/fXLL79ozZo1\nWrlypQ4cOKDBgwdbqWoAAAAABdUjGyjbtGmjChUqaNmyZWbH09LStGLFCvXu3Vv29vZ65513FBAQ\nIFdXV9WuXVvvvfeebty4Yeo/ceJENWnSRFFRUapTp45cXFz0999/Z3vk9ZtvvtEzzzwjLy8v+fj4\nqFu3bkpISDC1nzp1SgaDQevXr1dISIjc3NzUsGFD7dq1y6y+48ePKywsTJ6ennJ3d9fTTz+t48eP\nm9qjoqLUoEEDubi46KmnntKCBQuUmZkpSapdu7aioqLUtm1b+fr6qlmzZnrvvfe0bds2Xb16VZL0\nyy+/aOfOnZozZ47q16+vhg0basaMGdq4caNOnz6ddxMAAAAAwOY9soHS0dFRPXv21PLly5WRkWE6\nvmnTJiUnJ+u5556TJJUqVUrz58/Xvn37NG3aNK1cuVIzZ840G+v06dNat26doqKiFBsbKycnp2zX\nu3btmgYPHqwdO3Zo/fr1Kl68uHr06GFa0cwyYcIEDRkyRLt371bt2rXVv39/Xbt2TZL0+++/65ln\nnlGRIkW0bt067dq1S/3799etW7ckSZ988on++9//asyYMdq3b5/GjRun6dOnKzIy8o7vw+XLl1Ws\nWDEVK1ZMkvT999+rdOnSeuqpp0x9/u///k/FihXTvn37cvMWAwAAACjkHK1dgDX16dNHs2bN0s6d\nOxUcHCxJWrp0qYKDg+Xh4SFJGj16tKm/t7e3hg8frkWLFunNN980Hb9586YWLlyocuXK3fFanTp1\nMnv9wQcfyNvbW4cOHVL9+vVNx1955RW1adNGkvTOO+9o5cqV+uWXX1S/fn0tWrRIZcqUUWRkpIoU\nKSJJqly5sunc6dOna+LEiabPhvr4+OjUqVP6+OOP1b9//2w1GY1GRURE6IUXXpCDg4MkKTExUeXL\nlzfrZ29vr3LlyikpKemO9wcAQJZ/PoFTEBS0epAz5sl2MFe2Iad5qlKlSp5f55EOlH5+fmrcuLEp\nRP7555/atm2bFi9ebOqzZs0aLVy4UKdPn9bVq1d169Yt2dubL+x6enreNUxK0smTJ/Xf//5XP/zw\ngy5evKiMjAxlZmbq999/NwuUtWrVMv3u5uYmSfrf//4nSTpy5IgaNWpkCpP/dOHCBf35558aOnSo\nhg0bZjp+69YtU1j8p8uXLyssLExeXl4aO3asWZudnV22/pmZmTkeBwDg3/LjDxZLJSQkFKh6kDPm\nyXYwV7bhYc7TIx0opdub8wwbNkwpKSlavny5nJ2d1bZtW0lSXFycBg4cqLfeekvBwcEqU6aMNmzY\noPHjx5uNUaJEiXteJzQ0VN7e3pozZ45cXV1lb2+vwMBA3bx506yfo+P/PyVZAS7rkdysz0LmJKvP\n7NmzzR5X/ec4WS5fvqxu3brJwcFBX3zxhYoWLWpqc3FxybYSmZGRoeTk5GwrlwAAAAAebY/sZyiz\ndOzYUUWLFtWKFSu0dOlS9ejRw7QCuG/fPnl6eur111/Xk08+KT8/P507dy7X10hKStLJkyf1+uuv\nq3nz5vL391dqaqrZZzfvR506dRQXF5ftc5fS7dXMChUq6MyZM/L19TX7qVSpkqlfamqqunTpInt7\ne61atSpbGK5fv75SU1N14MAB07G4uDj9/fffCgwMzOWdAwAAACjMHvkVyuLFi6t79+6aPHmyjEaj\n+vTpY2rz8/PT77//rtWrVysgIEDffvutvvrqq1xf4/HHH5ezs7M+/fRTubq66vz583r33XezPTp7\nLwMHDtSnn36qfv36aeTIkSpTpowOHDig6tWrq1atWnrzzTc1ZswYlSpVSq1atVJaWpoOHTqkpKQk\nDR8+XJcuXVKXLl10/fp1LV26VFeuXNGVK1ckSWXLllWRIkVUs2ZNtWjRQq+++qpmz56t9PR0jRgx\nQu3atTMLpgAAAADwyK9QSrc35zEajQoMDJS/v7/peIcOHTR48GCNHj1aTZs21e7du/XWW2/lenwH\nBwdFRkaaPgM5evRojR07NsfPQt6Nh4eHvv76a12/fl3t27dXs2bN9PHHH5sek+3fv79mzZql5cuX\nq0mTJmrbtq2WLFkib29vSdLBgwd14MABHT16VE8++aT8/f1NPz/88IPpOosXL1b16tXVqVMnde/e\nXfXq1dP8+fNzfd8AAAAACjc7o9F45w/mAffJEHne2iUAAAoIYz93a5dgwgYitoF5sh3MlW14mPPE\nCiUAAAAAwCIESgAAAACARQiUAAAAAACLECgBAAAAABYhUAIAAAAALEKgBAAAAABYxNHaBaBwKEhb\nxCNnbPNtG5gn28FcAQDACiUAAAAAwEIESgAAAACARQiUAAAAAACLECgBAAAAABYhUAIAAAAALMIu\nr8gThsjz1i4B91RC2s08FXzMk+1grmwD82Qbss8TO8gDtoEVSgAAAACARQiUAAAAAACLECgBAAAA\nABYhUAIAAAAALEKgBAAAAABYhEAJAAAAALAIgRIAAAAAYBECJQAAAADAIgRKG/LEE09o7ty51i4D\nAAAAACQRKB9YeHi4DAaDDAaDypUrpzp16uidd97R1atXdfbsWVPbv3+2bt0qSVq2bJnc3d1zHNvd\n3V3Lli0zvd6xY4cGDBhw33WFhYWZHTt79qxeeeUV1alTR66urqpTp47GjRun69evm/X77bffFBYW\npooVK8rX11ejRo3SzZs3c/O2AAAAAHgEOFq7gMKgRYsWWrhwodLS0hQXF6dXX31V165d07BhwyRJ\nX375pWrVqmV2jrOzc66vU65cuQeqMyEhQenp6ZoxY4b8/PwUHx+v4cOH6+LFi5o9e7YkKT09XWFh\nYXJ2dtbXX3+tlJQUhYeHKzMzU9OmTXug6wMAAAAoXFihzANFixaVi4uLPDw81L17d3Xv3l0bN240\ntZctW1YuLi5mP05OTrm+zr8feY2MjFRAQIBcXFzk5+enLl266NatW4qIiNDnn3+uLVu2mFZEY2Nj\n1apVK3344Ydq2bKlfHx81KZNG40cOVLR0dGmMbdv365jx45p4cKFqlu3roKCgjRu3DhFRUUpNTX1\nwd4oAAAAAIUKK5T5oFixYkpLS8vXaxw8eFCvv/66PvzwQzVs2FCXLl1STEyMJGno0KE6ceKEUlJS\n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\nOXJE27ZtU0xMjMLDw1WrVi2tXbv2jqHSz89PJ06cuGvNd2NnZ2f6PSwsTMOHD9f777+v1atXy93d\nXY0aNbrv+rM8rF17AQAAANiWXG/KM2HCBPn5+Wnfvn2mzyL+U9OmTe+5KmgtTk5OSk9PNztWp04d\nHT9+XJ6envL19TX7KVWq1B3Hql27tjIzM5WYmJjtvIoVK5r6lSpVSp06ddKMGTO0cuVKxcTE6NSp\nU3esp3v37jp58qSio6NzvK7RaFTp0qXl5uamvXv3mrXFxcXJ39/f9Lpt27aSpC1btmjVqlUKDQ01\nBc77rR8AAAAA7iTXgfLHH39U7969VaxYMbPVsCzu7u5mO6QWJF5eXjpw4IDOnj2r5ORkZWRk6MUX\nX1Rqaqr69eunH374QWfOnNHOnTs1bNgwXb58+Y5jVa5cWaGhoRo8eLDWrVunM2fO6ODBg5o7d64p\nDM6bN0+rV69WfHy8Tp06pVWrVql06dKmwObl5aW4uDj98ccfSk5OliR17txZXbt21aBBgzR16lT9\n+OOPOnfunLZu3arQ0FDTTq5Dhw41jf/rr79q0qRJiouL0yuvvGKqsVixYmrfvr2mTZumw4cPKzQ0\nNFf1AwAAAMDd5PqRV3t7+7t+BjAxMVHFixd/oKLyy9ChQxUeHq6GDRvq+vXrOnz4sLy9vbVlyxaN\nGzdOXbt21Y0bN+Th4aGgoCCzz0zm5IMPPtD06dP17rvv6o8//pCzs7OefPJJNW3aVNLt1ck5c+bo\n1KlTsrOz0xNPPKFVq1apRIkSkqS3335bw4cPV7169XTjxg0ZjUbZ2dnp448/1meffaYlS5Zo9uzZ\nsre3l4+Pj7p162ba/fXll1/WlStXNHbsWCUlJalKlSqKiopS7dq1zWoMCwvT8uXLVadOHbPVy/up\nHwAAAADuxs5oNN57F5h/6NChgxwdHfXVV1/p4sWL8vPz09q1a9W8eXPdvHlTTZo0ka+vr7744ov8\nqhkFkCHyvLVLAIBCwdgv+yZxsBwbiNgG5sl2MFe24WHOU64feR0xYoRiYmL0yiuv6KeffpIkXbhw\nQVu3blVISIhOnz6tkSNH5nmhAAAAAICCJdePvAYFBWnhwoV64403tHz5cklSeHi4MjMzVaZMGX38\n8ceqX79+nhcKAAAAAChYLPoeym7duqlt27bavn27Tp06pYyMDFWqVEktW7bUY489ltc1AgAAAAAK\noPsKlCNHjlTv3r3NvuD+xo0bevbZZ+Xg4JBvxQEAAAAACq77+gzl4sWL9euvv5peZ23Gs3v37nwr\nDAAAAABQsOV6U54smZm52hwWAAAAAFDIWPQZSuDf2Oa+4GObb9vAPNkO5goAgAdYoQQAAAAAPNru\ne4XyzJkzOnDggCQpNTVV0u1/nb3Trq4BAQF5UB4AAAAAoKC670AZERGhiIgIs2OjRo3K1i8zM1N2\ndna6ePHig1cHAAAAACiw7itQfvDBB/ldBwAAAADAxtxXoOzVq1d+1wEAAAAAsDHs8oo8YYg8b+0S\ncE8lpN3MU8HHPNmOwjtX7NwNALhf7PIKAAAAALAIgRIAAAAAYBECJQAAAADAIgRKAAAAAIBFCJQA\nAAAAAIsQKAEAAAAAFiFQAgAAAAAsUigCZWxsrAwGg5KTk61diklUVJS8vLysXQYAAAAA5BurB8qk\npCS99dZbevLJJ+Xi4qLKlSvr6aef1sKFC3XlypX7GiMwMFDx8fEqW7bsffWfO3euvLy8dO3atWxt\n6enpqlatmiZMmJCr+/i37t2768CBAw80Rn6YPn26WrRoIQ8PD/n5+alHjx46fvy4WZ+MjAxNmjRJ\n1apVk6urq9q3b6/4+HgrVQwAAACgoLJqoDx79qyaN2+ubdu2acyYMdq1a5eio6P1yiuvaNeuXdq0\nadN9jePk5CQXFxfZ2dndV/+ePXvq77//1tq1a7O1ffvtt0pMTFTv3r1zdS9ZMjMzlZaWpuLFi6t8\n+fIWjZGfdu/erYEDB+rbb7/VunXrZGdnp06dOsloNJr6zJgxQwsXLtTUqVO1bds2OTs7q0uXLrp6\n9aoVKwcAAABQ0Fg1UI4cOVL29vbasWOHunbtqmrVqqlGjRoKCQnR8uXL1a1bN0nSvHnz1LhxY1Ws\nWFHVq1fX0KFDzQLQvx95XbZsmdzd3bVr1y41atRIFStWVPv27XXmzBlJUrly5fTss89q6dKl2Wpa\nsmSJmjRpokqVKkmSli9fblrRq1Klivr166cLFy6Y+u/cuVMGg0Fbt25VixYtVKFCBe3atSvbI68n\nT55Ujx49VKVKFbm7u6t58+b69ttvza5do0YNzZgxQ0OHDpWnp6dq1qypefPmmfUxGo0aPny4qlat\nKhcXFwUGBmrdunWm9ri4OD377LNydXVVjRo19Prrr+vy5cum9rVr1+q5555T9erVVatWLS1YsECJ\niYn6/vvvJd1enVywYIFGjBihkJAQ1axZUwsWLFBKSoq+/PLL+59cAAAAAIWe1QJlSkqKtm3bphdf\nfFElS5bMsU/WiqO9vb0iIiIUFxenRYsW6cCBAxo1atRdx79x44ZmzJihefPm6ZtvvtGlS5c0YsQI\nU3ufPn303Xff6dSpU6ZjSUlJ2rJli/r06WM6duvWLY0ZM0a7d+/W559/rsTERL344ovZrjd27FiN\nHTtW33//verVq5et/fLly2rTpo3Wrl2rmJgYtW3bVr169dLJkyfN+s2dO1d16tTRrl27NHjwYL3z\nzjumR2czMjLUrVs37du3TwsWLNC+ffs0YcIEOTo6SpKOHDmirl27qkOHDtqzZ48+++wzHTx4UMOG\nDbvj+3TlyhVlZmbKYDBIkk6dOqW//vpLQUFBpj4lS5ZUw4YNtX///ru+5wAAAAAeLY7WuvDJkyeV\nmZmpypUrmx2vUaOGLl26JEkKDQ3VzJkzNXjwYFO7t7e3xo8fr169emnBggWyt885E9+6dUvTp09X\nlSpVJElDhw7VkCFDlJGRIXt7ewUHB8vDw0NLly7Vu+++K0n64osv9NhjjykkJMQ0Tt++fU2/+/j4\naPr06WrcuLESExPl4uJianv77bfNQti/1a1bV3Xr1jW9Hj16tDZt2qTo6Gi99tprpuOtW7c2BdYh\nQ4Zo4cKFiomJUUBAgLZt26Yff/xR+/fvN71vPj4+pnPnzJmj0NBQ0/vl5+en6dOnKygoSO+//76c\nnZ3NasrMzNTo0aNVt25dBQQESJISExMlSRUqVDDrW758eSUlJd3x/gAAhUdCQoK1S8hThe1+Civm\nyXYwV7Yhp3nKykZ5yWqB8k6+/vprZWRkaNiwYfr7778lSbt27dLMmTN14sQJpaamKj09XTdv3lRi\nYqLc3NxyHKdo0aJmb5irq6vS0tJ06dIlOTs7y97eXr169dKSJUs0ZswYOTg4aNmyZerevbuKFStm\nOu/gwYOaMmWKfv75ZxmNRmVkZEiSfv/9d7NAmdOq5D9duXJFkydP1jfffKMLFy4oPT1df//9tynI\nZalVq5bZazc3N/3vf/+TdHsFsmLFitlCeJZDhw7p3LlzWrVqlelYZmamJOn06dPZAuXo0aP1448/\natOmTdmC+b8/j5qZmXnfn1EFANi2/PiDw1oSEhIK1f0UVsyT7WCubMPDnCerBUpfX1/Z2dllS85Z\n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\nERERERGRIEwoiYiIiIiISBAmlERERERERCQIE0oiIiIiIiIShAklERERERERCcKEkoiIiIiIiARh\nQklERERERESCMKEkIiIiIiIiQZhQEhERERERkSBMKImIiIiIiEgQJpREREREREQkCBNKIiIiIiIi\nEoQJJREREREREQnChJKIiIiIiIgEEUmlUrm6B0FERERERETdD3coiYiIiIiISBAmlERERERERCQI\nE0oiIiIiIiIShAklERERERERCcKEkoiIiIiIiARhQklERERERESCMKHsxeLi4jBmzBgYGRnhqaee\nQn5+fpv1jx8/jqeeegpGRkYYO3Ys9u7d2+E27969i+DgYAwbNgympqbw9/dHWVlZp86rJ1JHrGbN\nmgV9fX2ln8DAwE6dV0/T2XH67rvv4O/vj9GjR0NfXx/Jyckt2pDL5YiIiMCoUaNgbGyMWbNm4ezZ\ns506r55IHbFatmxZizXl6uraqfPqaTo7Tlu3bsXTTz8NCwsLiMVi+Pn54cyZM0p1uKY6Th1x4noS\nprNjtXv3bjg7O8PCwgIWFhZwc3NDVlaWUh2uqY5TR5weZE0xoeyl0tPTERISgrfffhvHjh2Do6Mj\nfHx8cOnSJZX1//jjD/j6+sLR0RHHjh3DW2+9hXfeeQcHDx7sUJuhoaE4dOgQ9uzZg8zMTNy+fRt+\nfn6QyWRdPufuSl2xAoC5c+fi3Llzip/o6OgunWt31hVxqqmpgUQiQWRkJLS0tFS2s23bNsTExCAq\nKgrffvstBg8ejNmzZ+P27dtdMs+eQF2xAoDp06crrakDBw50+vx6iq6I0/Hjx7Fw4UJkZWUhIyMD\nffv2hbe3N/766y9FHa6pjlFXnACup47qiliZmppi3bp1yM3NRXZ2NqZNm4a5c+fi119/VdThmuoY\ndcUJEL6mRFKpVC58ytRdubi4wNbWFh999JGi7IknnoCXlxfCw8Nb1A8PD8ehQ4fw008/KcpWrlyJ\noqIifPPNN+1qs7KyEjY2NoiJiYGvry8A4PLly7C3t0dqaipcXFy6arrdmjpiBTTtUEokEmzZsqWr\nptajdEWc/s7MzAybN2/G3LlzFWVyuRyjRo3C4sWLERQUBACora3F8OHDsWHDBgQEBHTmFHsMdcQK\naPr099atW/j88887cTY9V1fHCQCqq6thaWmJ5ORkzJw5k2tKAHXECeB6EuJhxAoArK2tER4ejoCA\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x26393671550>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_model_importance(model, features)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1. Train and test accuracy trend (XGBRegressor)\n",
"----------"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"dates = sorted(train_x.keys())\n",
"accuray_table = pd.DataFrame(columns=['train', 'test'])\n",
"model_df = pd.Series()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2017-10-27 13:40:39,403 - ALPHA_MIND - INFO - trade_date: 2012-01-30 00:00:00 training finished\n",
"2017-10-27 13:40:42,340 - ALPHA_MIND - INFO - trade_date: 2012-02-08 00:00:00 training finished\n",
"2017-10-27 13:40:45,284 - ALPHA_MIND - INFO - trade_date: 2012-02-22 00:00:00 training finished\n",
"2017-10-27 13:40:48,237 - ALPHA_MIND - INFO - trade_date: 2012-03-07 00:00:00 training finished\n",
"2017-10-27 13:40:51,172 - ALPHA_MIND - INFO - trade_date: 2012-03-21 00:00:00 training finished\n",
"2017-10-27 13:40:54,051 - ALPHA_MIND - INFO - trade_date: 2012-04-05 00:00:00 training finished\n",
"2017-10-27 13:40:56,926 - ALPHA_MIND - INFO - trade_date: 2012-04-18 00:00:00 training finished\n",
"2017-10-27 13:40:59,831 - ALPHA_MIND - INFO - trade_date: 2012-05-02 00:00:00 training finished\n",
"2017-10-27 13:41:02,785 - ALPHA_MIND - INFO - trade_date: 2012-05-16 00:00:00 training finished\n",
"2017-10-27 13:41:05,704 - ALPHA_MIND - INFO - trade_date: 2012-05-30 00:00:00 training finished\n",
"2017-10-27 13:41:08,662 - ALPHA_MIND - INFO - trade_date: 2012-06-13 00:00:00 training finished\n",
"2017-10-27 13:41:11,695 - ALPHA_MIND - INFO - trade_date: 2012-06-27 00:00:00 training finished\n",
"2017-10-27 13:41:14,812 - ALPHA_MIND - INFO - trade_date: 2012-07-11 00:00:00 training finished\n",
"2017-10-27 13:41:17,908 - ALPHA_MIND - INFO - trade_date: 2012-07-25 00:00:00 training finished\n",
"2017-10-27 13:41:21,028 - ALPHA_MIND - INFO - trade_date: 2012-08-08 00:00:00 training finished\n",
"2017-10-27 13:41:24,125 - ALPHA_MIND - INFO - trade_date: 2012-08-22 00:00:00 training finished\n",
"2017-10-27 13:41:27,116 - ALPHA_MIND - INFO - trade_date: 2012-09-05 00:00:00 training finished\n",
"2017-10-27 13:41:30,151 - ALPHA_MIND - INFO - trade_date: 2012-09-19 00:00:00 training finished\n",
"2017-10-27 13:41:33,225 - ALPHA_MIND - INFO - trade_date: 2012-10-08 00:00:00 training finished\n",
"2017-10-27 13:41:36,301 - ALPHA_MIND - INFO - trade_date: 2012-10-17 00:00:00 training finished\n",
"2017-10-27 13:41:39,325 - ALPHA_MIND - INFO - trade_date: 2012-10-31 00:00:00 training finished\n",
"2017-10-27 13:41:42,339 - ALPHA_MIND - INFO - trade_date: 2012-11-14 00:00:00 training finished\n",
"2017-10-27 13:41:45,337 - ALPHA_MIND - INFO - trade_date: 2012-11-28 00:00:00 training finished\n",
"2017-10-27 13:41:48,425 - ALPHA_MIND - INFO - trade_date: 2012-12-12 00:00:00 training finished\n",
"2017-10-27 13:41:51,502 - ALPHA_MIND - INFO - trade_date: 2012-12-26 00:00:00 training finished\n",
"2017-10-27 13:41:54,553 - ALPHA_MIND - INFO - trade_date: 2013-01-09 00:00:00 training finished\n",
"2017-10-27 13:41:57,594 - ALPHA_MIND - INFO - trade_date: 2013-01-23 00:00:00 training finished\n",
"2017-10-27 13:42:00,579 - ALPHA_MIND - INFO - trade_date: 2013-02-06 00:00:00 training finished\n",
"2017-10-27 13:42:03,577 - ALPHA_MIND - INFO - trade_date: 2013-02-20 00:00:00 training finished\n",
"2017-10-27 13:42:06,641 - ALPHA_MIND - INFO - trade_date: 2013-03-06 00:00:00 training finished\n",
"2017-10-27 13:42:09,674 - ALPHA_MIND - INFO - trade_date: 2013-03-20 00:00:00 training finished\n",
"2017-10-27 13:42:12,733 - ALPHA_MIND - INFO - trade_date: 2013-04-03 00:00:00 training finished\n",
"2017-10-27 13:42:15,732 - ALPHA_MIND - INFO - trade_date: 2013-04-17 00:00:00 training finished\n",
"2017-10-27 13:42:18,696 - ALPHA_MIND - INFO - trade_date: 2013-05-02 00:00:00 training finished\n",
"2017-10-27 13:42:21,628 - ALPHA_MIND - INFO - trade_date: 2013-05-15 00:00:00 training finished\n",
"2017-10-27 13:42:24,668 - ALPHA_MIND - INFO - trade_date: 2013-05-29 00:00:00 training finished\n",
"2017-10-27 13:42:27,635 - ALPHA_MIND - INFO - trade_date: 2013-06-13 00:00:00 training finished\n",
"2017-10-27 13:42:30,751 - ALPHA_MIND - INFO - trade_date: 2013-06-26 00:00:00 training finished\n",
"2017-10-27 13:42:33,819 - ALPHA_MIND - INFO - trade_date: 2013-07-10 00:00:00 training finished\n",
"2017-10-27 13:42:36,881 - ALPHA_MIND - INFO - trade_date: 2013-07-24 00:00:00 training finished\n",
"2017-10-27 13:42:39,945 - ALPHA_MIND - INFO - trade_date: 2013-08-07 00:00:00 training finished\n",
"2017-10-27 13:42:43,033 - ALPHA_MIND - INFO - trade_date: 2013-08-21 00:00:00 training finished\n",
"2017-10-27 13:42:46,069 - ALPHA_MIND - INFO - trade_date: 2013-09-04 00:00:00 training finished\n",
"2017-10-27 13:42:49,166 - ALPHA_MIND - INFO - trade_date: 2013-09-18 00:00:00 training finished\n",
"2017-10-27 13:42:52,266 - ALPHA_MIND - INFO - trade_date: 2013-10-08 00:00:00 training finished\n",
"2017-10-27 13:42:55,317 - ALPHA_MIND - INFO - trade_date: 2013-10-16 00:00:00 training finished\n",
"2017-10-27 13:42:58,430 - ALPHA_MIND - INFO - trade_date: 2013-10-30 00:00:00 training finished\n",
"2017-10-27 13:43:01,547 - ALPHA_MIND - INFO - trade_date: 2013-11-13 00:00:00 training finished\n",
"2017-10-27 13:43:04,631 - ALPHA_MIND - INFO - trade_date: 2013-11-27 00:00:00 training finished\n",
"2017-10-27 13:43:07,721 - ALPHA_MIND - INFO - trade_date: 2013-12-11 00:00:00 training finished\n",
"2017-10-27 13:43:10,812 - ALPHA_MIND - INFO - trade_date: 2013-12-25 00:00:00 training finished\n",
"2017-10-27 13:43:13,962 - ALPHA_MIND - INFO - trade_date: 2014-01-08 00:00:00 training finished\n",
"2017-10-27 13:43:17,091 - ALPHA_MIND - INFO - trade_date: 2014-01-22 00:00:00 training finished\n",
"2017-10-27 13:43:20,443 - ALPHA_MIND - INFO - trade_date: 2014-02-07 00:00:00 training finished\n",
"2017-10-27 13:43:23,662 - ALPHA_MIND - INFO - trade_date: 2014-02-19 00:00:00 training finished\n",
"2017-10-27 13:43:27,260 - ALPHA_MIND - INFO - trade_date: 2014-03-05 00:00:00 training finished\n",
"2017-10-27 13:43:30,571 - ALPHA_MIND - INFO - trade_date: 2014-03-19 00:00:00 training finished\n",
"2017-10-27 13:43:33,666 - ALPHA_MIND - INFO - trade_date: 2014-04-02 00:00:00 training finished\n",
"2017-10-27 13:43:36,747 - ALPHA_MIND - INFO - trade_date: 2014-04-16 00:00:00 training finished\n",
"2017-10-27 13:43:39,762 - ALPHA_MIND - INFO - trade_date: 2014-04-30 00:00:00 training finished\n",
"2017-10-27 13:43:42,745 - ALPHA_MIND - INFO - trade_date: 2014-05-14 00:00:00 training finished\n",
"2017-10-27 13:43:45,728 - ALPHA_MIND - INFO - trade_date: 2014-05-28 00:00:00 training finished\n",
"2017-10-27 13:43:48,808 - ALPHA_MIND - INFO - trade_date: 2014-06-11 00:00:00 training finished\n",
"2017-10-27 13:43:51,852 - ALPHA_MIND - INFO - trade_date: 2014-06-25 00:00:00 training finished\n",
"2017-10-27 13:43:54,980 - ALPHA_MIND - INFO - trade_date: 2014-07-09 00:00:00 training finished\n",
"2017-10-27 13:43:58,086 - ALPHA_MIND - INFO - trade_date: 2014-07-23 00:00:00 training finished\n",
"2017-10-27 13:44:01,181 - ALPHA_MIND - INFO - trade_date: 2014-08-06 00:00:00 training finished\n",
"2017-10-27 13:44:04,292 - ALPHA_MIND - INFO - trade_date: 2014-08-20 00:00:00 training finished\n",
"2017-10-27 13:44:07,356 - ALPHA_MIND - INFO - trade_date: 2014-09-03 00:00:00 training finished\n",
"2017-10-27 13:44:10,420 - ALPHA_MIND - INFO - trade_date: 2014-09-17 00:00:00 training finished\n",
"2017-10-27 13:44:13,516 - ALPHA_MIND - INFO - trade_date: 2014-10-08 00:00:00 training finished\n",
"2017-10-27 13:44:16,593 - ALPHA_MIND - INFO - trade_date: 2014-10-15 00:00:00 training finished\n",
"2017-10-27 13:44:19,621 - ALPHA_MIND - INFO - trade_date: 2014-10-29 00:00:00 training finished\n",
"2017-10-27 13:44:22,673 - ALPHA_MIND - INFO - trade_date: 2014-11-12 00:00:00 training finished\n",
"2017-10-27 13:44:25,753 - ALPHA_MIND - INFO - trade_date: 2014-11-26 00:00:00 training finished\n",
"2017-10-27 13:44:28,886 - ALPHA_MIND - INFO - trade_date: 2014-12-10 00:00:00 training finished\n",
"2017-10-27 13:44:32,012 - ALPHA_MIND - INFO - trade_date: 2014-12-24 00:00:00 training finished\n",
"2017-10-27 13:44:35,100 - ALPHA_MIND - INFO - trade_date: 2015-01-07 00:00:00 training finished\n",
"2017-10-27 13:44:38,173 - ALPHA_MIND - INFO - trade_date: 2015-01-21 00:00:00 training finished\n",
"2017-10-27 13:44:41,317 - ALPHA_MIND - INFO - trade_date: 2015-02-04 00:00:00 training finished\n",
"2017-10-27 13:44:44,450 - ALPHA_MIND - INFO - trade_date: 2015-02-25 00:00:00 training finished\n",
"2017-10-27 13:44:47,592 - ALPHA_MIND - INFO - trade_date: 2015-03-04 00:00:00 training finished\n",
"2017-10-27 13:44:50,695 - ALPHA_MIND - INFO - trade_date: 2015-03-18 00:00:00 training finished\n",
"2017-10-27 13:44:53,808 - ALPHA_MIND - INFO - trade_date: 2015-04-01 00:00:00 training finished\n",
"2017-10-27 13:44:56,911 - ALPHA_MIND - INFO - trade_date: 2015-04-15 00:00:00 training finished\n",
"2017-10-27 13:45:00,044 - ALPHA_MIND - INFO - trade_date: 2015-04-29 00:00:00 training finished\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2017-10-27 13:45:03,159 - ALPHA_MIND - INFO - trade_date: 2015-05-13 00:00:00 training finished\n",
"2017-10-27 13:45:06,246 - ALPHA_MIND - INFO - trade_date: 2015-05-27 00:00:00 training finished\n",
"2017-10-27 13:45:09,374 - ALPHA_MIND - INFO - trade_date: 2015-06-10 00:00:00 training finished\n",
"2017-10-27 13:45:12,490 - ALPHA_MIND - INFO - trade_date: 2015-06-24 00:00:00 training finished\n",
"2017-10-27 13:45:15,606 - ALPHA_MIND - INFO - trade_date: 2015-07-08 00:00:00 training finished\n",
"2017-10-27 13:45:18,746 - ALPHA_MIND - INFO - trade_date: 2015-07-22 00:00:00 training finished\n",
"2017-10-27 13:45:21,542 - ALPHA_MIND - INFO - trade_date: 2015-08-05 00:00:00 training finished\n",
"2017-10-27 13:45:24,278 - ALPHA_MIND - INFO - trade_date: 2015-08-19 00:00:00 training finished\n",
"2017-10-27 13:45:26,942 - ALPHA_MIND - INFO - trade_date: 2015-09-02 00:00:00 training finished\n",
"2017-10-27 13:45:29,553 - ALPHA_MIND - INFO - trade_date: 2015-09-16 00:00:00 training finished\n",
"2017-10-27 13:45:32,140 - ALPHA_MIND - INFO - trade_date: 2015-09-30 00:00:00 training finished\n",
"2017-10-27 13:45:34,655 - ALPHA_MIND - INFO - trade_date: 2015-10-14 00:00:00 training finished\n",
"2017-10-27 13:45:37,224 - ALPHA_MIND - INFO - trade_date: 2015-10-28 00:00:00 training finished\n",
"2017-10-27 13:45:39,879 - ALPHA_MIND - INFO - trade_date: 2015-11-11 00:00:00 training finished\n",
"2017-10-27 13:45:42,569 - ALPHA_MIND - INFO - trade_date: 2015-11-25 00:00:00 training finished\n",
"2017-10-27 13:45:45,281 - ALPHA_MIND - INFO - trade_date: 2015-12-09 00:00:00 training finished\n",
"2017-10-27 13:45:48,128 - ALPHA_MIND - INFO - trade_date: 2015-12-23 00:00:00 training finished\n",
"2017-10-27 13:45:51,006 - ALPHA_MIND - INFO - trade_date: 2016-01-06 00:00:00 training finished\n",
"2017-10-27 13:45:53,928 - ALPHA_MIND - INFO - trade_date: 2016-01-20 00:00:00 training finished\n",
"2017-10-27 13:45:56,825 - ALPHA_MIND - INFO - trade_date: 2016-02-03 00:00:00 training finished\n",
"2017-10-27 13:45:59,808 - ALPHA_MIND - INFO - trade_date: 2016-02-17 00:00:00 training finished\n",
"2017-10-27 13:46:02,790 - ALPHA_MIND - INFO - trade_date: 2016-03-02 00:00:00 training finished\n",
"2017-10-27 13:46:05,812 - ALPHA_MIND - INFO - trade_date: 2016-03-16 00:00:00 training finished\n",
"2017-10-27 13:46:08,798 - ALPHA_MIND - INFO - trade_date: 2016-03-30 00:00:00 training finished\n",
"2017-10-27 13:46:11,726 - ALPHA_MIND - INFO - trade_date: 2016-04-13 00:00:00 training finished\n",
"2017-10-27 13:46:14,540 - ALPHA_MIND - INFO - trade_date: 2016-04-27 00:00:00 training finished\n",
"2017-10-27 13:46:17,420 - ALPHA_MIND - INFO - trade_date: 2016-05-11 00:00:00 training finished\n",
"2017-10-27 13:46:20,239 - ALPHA_MIND - INFO - trade_date: 2016-05-25 00:00:00 training finished\n",
"2017-10-27 13:46:23,054 - ALPHA_MIND - INFO - trade_date: 2016-06-08 00:00:00 training finished\n",
"2017-10-27 13:46:25,927 - ALPHA_MIND - INFO - trade_date: 2016-06-22 00:00:00 training finished\n",
"2017-10-27 13:46:28,750 - ALPHA_MIND - INFO - trade_date: 2016-07-06 00:00:00 training finished\n",
"2017-10-27 13:46:31,553 - ALPHA_MIND - INFO - trade_date: 2016-07-20 00:00:00 training finished\n",
"2017-10-27 13:46:34,374 - ALPHA_MIND - INFO - trade_date: 2016-08-03 00:00:00 training finished\n",
"2017-10-27 13:46:37,197 - ALPHA_MIND - INFO - trade_date: 2016-08-17 00:00:00 training finished\n",
"2017-10-27 13:46:39,959 - ALPHA_MIND - INFO - trade_date: 2016-08-31 00:00:00 training finished\n",
"2017-10-27 13:46:42,710 - ALPHA_MIND - INFO - trade_date: 2016-09-14 00:00:00 training finished\n",
"2017-10-27 13:46:45,489 - ALPHA_MIND - INFO - trade_date: 2016-09-28 00:00:00 training finished\n",
"2017-10-27 13:46:48,238 - ALPHA_MIND - INFO - trade_date: 2016-10-12 00:00:00 training finished\n",
"2017-10-27 13:46:50,995 - ALPHA_MIND - INFO - trade_date: 2016-10-26 00:00:00 training finished\n",
"2017-10-27 13:46:53,789 - ALPHA_MIND - INFO - trade_date: 2016-11-09 00:00:00 training finished\n",
"2017-10-27 13:46:56,544 - ALPHA_MIND - INFO - trade_date: 2016-11-23 00:00:00 training finished\n",
"2017-10-27 13:46:59,321 - ALPHA_MIND - INFO - trade_date: 2016-12-07 00:00:00 training finished\n",
"2017-10-27 13:47:02,093 - ALPHA_MIND - INFO - trade_date: 2016-12-21 00:00:00 training finished\n",
"2017-10-27 13:47:04,888 - ALPHA_MIND - INFO - trade_date: 2017-01-04 00:00:00 training finished\n",
"2017-10-27 13:47:07,659 - ALPHA_MIND - INFO - trade_date: 2017-01-18 00:00:00 training finished\n",
"2017-10-27 13:47:10,411 - ALPHA_MIND - INFO - trade_date: 2017-02-03 00:00:00 training finished\n",
"2017-10-27 13:47:13,174 - ALPHA_MIND - INFO - trade_date: 2017-02-15 00:00:00 training finished\n",
"2017-10-27 13:47:15,948 - ALPHA_MIND - INFO - trade_date: 2017-03-01 00:00:00 training finished\n",
"2017-10-27 13:47:18,690 - ALPHA_MIND - INFO - trade_date: 2017-03-15 00:00:00 training finished\n",
"2017-10-27 13:47:21,406 - ALPHA_MIND - INFO - trade_date: 2017-03-29 00:00:00 training finished\n",
"2017-10-27 13:47:24,165 - ALPHA_MIND - INFO - trade_date: 2017-04-12 00:00:00 training finished\n",
"2017-10-27 13:47:26,949 - ALPHA_MIND - INFO - trade_date: 2017-04-26 00:00:00 training finished\n",
"2017-10-27 13:47:29,859 - ALPHA_MIND - INFO - trade_date: 2017-05-10 00:00:00 training finished\n",
"2017-10-27 13:47:32,799 - ALPHA_MIND - INFO - trade_date: 2017-05-24 00:00:00 training finished\n",
"2017-10-27 13:47:35,822 - ALPHA_MIND - INFO - trade_date: 2017-06-07 00:00:00 training finished\n",
"2017-10-27 13:47:38,830 - ALPHA_MIND - INFO - trade_date: 2017-06-21 00:00:00 training finished\n",
"2017-10-27 13:47:41,924 - ALPHA_MIND - INFO - trade_date: 2017-07-05 00:00:00 training finished\n",
"2017-10-27 13:47:44,946 - ALPHA_MIND - INFO - trade_date: 2017-07-19 00:00:00 training finished\n"
]
}
],
"source": [
"for ref_date in dates:\n",
" sample_train_x = train_x[ref_date]\n",
" sample_train_y = train_y[ref_date].flatten()\n",
" \n",
" model = XGBRegressor(n_estimators=n_estimators,\n",
" max_depth=max_depth,\n",
" n_jobs=-1)\n",
" model.fit(sample_train_x, sample_train_y)\n",
" \n",
" train_score = model.score(sample_train_x, sample_train_y)\n",
" accuray_table.loc[ref_date, 'train'] = train_score\n",
" model_df.loc[ref_date] = model\n",
" alpha_logger.info('trade_date: {0} training finished'.format(ref_date))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"portfolio_industry_neutralize = True\n",
"\n",
"settlement = data_package['settlement']\n",
"industry_dummies = pd.get_dummies(settlement['industry'].values)\n",
"risk_styles = settlement[portfolio_risk_neutralize].values\n",
"total_risks = settlement[neutralize_risk].values\n",
"final_res = np.zeros(len(dates))\n",
"method = 'risk_neutral'"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"for i, ref_date in enumerate(dates):\n",
" model = model_df[ref_date]\n",
" sample_test_x = predict_x[ref_date]\n",
" sample_test_y = predict_y[ref_date].flatten()\n",
" \n",
" cons = Constraints()\n",
" index = settlement.trade_date == ref_date\n",
" benchmark_w = settlement[index]['weight'].values\n",
" realized_r = settlement[index]['dx'].values\n",
" industry_names = settlement[index]['industry'].values\n",
" is_tradable = settlement[index]['isOpen'].values\n",
"\n",
" cons.add_exposure(['total'], np.ones((len(is_tradable), 1)))\n",
" cons.set_constraints('total', benchmark_w.sum(), benchmark_w.sum())\n",
"\n",
" if portfolio_industry_neutralize:\n",
" ind_exp = industry_dummies[index]\n",
"\n",
" risk_tags = ind_exp.columns\n",
" cons.add_exposure(risk_tags, ind_exp.values)\n",
" benchmark_exp = benchmark_w @ ind_exp.values\n",
"\n",
" for k, name in enumerate(risk_tags):\n",
" cons.set_constraints(name, benchmark_exp[k]*industry_lower, benchmark_exp[k]*industry_upper)\n",
"\n",
" if portfolio_risk_neutralize:\n",
" risk_exp = risk_styles[index]\n",
"\n",
" risk_tags = np.array(portfolio_risk_neutralize)\n",
" cons.add_exposure(risk_tags, risk_exp)\n",
"\n",
" benchmark_exp = benchmark_w @ risk_exp\n",
" for k, name in enumerate(risk_tags):\n",
" cons.set_constraints(name, benchmark_exp[k], benchmark_exp[k])\n",
"\n",
" risk_table = total_risks[index]\n",
"\n",
" y = model.predict(sample_test_x)\n",
" test_score = model.score(sample_test_x, sample_test_y)\n",
" accuray_table.loc[ref_date, 'test'] = test_score\n",
"\n",
" is_tradable[:] = True\n",
" weights, analysis = er_portfolio_analysis(y,\n",
" industry_names,\n",
" realized_r,\n",
" constraints=cons,\n",
" detail_analysis=True,\n",
" benchmark=benchmark_w,\n",
" is_tradable=is_tradable,\n",
" method=method)\n",
" \n",
" final_res[i] = analysis['er']['total'] / benchmark_w.sum()\n",
" alpha_logger.info('trade_date: {0} predicting finished'.format(ref_date))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"last_date = advanceDateByCalendar('china.sse', dates[-1], frequency)\n",
"\n",
"df = pd.Series(final_res, index=dates[1:] + [last_date])\n",
"df.sort_index(inplace=True)\n",
"df['2012-01-01':].cumsum().plot(figsize=(12, 6))\n",
"plt.title('Prod factors model {1} ({0})'.format(method, model.__class__.__name__))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"accuray_table.aggregate([np.mean, np.median, np.std])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"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.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment