{
 "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",
    "import xgboost as xgb\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.metrics import mean_squared_error\n",
    "\n",
    "plt.style.use('ggplot')\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.99].index.tolist()\n",
    "\n",
    "# alpha_factors = {\n",
    "#     f: DIFF(f) / (ABS(f) + 1e-4) / (DIFF('closePrice') / (LAST('closePrice') + 1e-4))\n",
    "#         for f in alpha_factors if f != 'SIZE'\n",
    "# }\n",
    "\n",
    "alpha_factors = {\n",
    "    'eps': LAST('eps_q'),\n",
    "    'roe': LAST('roe_q'),\n",
    "    'bdto': LAST('BDTO'),\n",
    "    'cfinc1': LAST('CFinc1'),\n",
    "    'chv': LAST('CHV'),\n",
    "    'rvol': LAST('RVOL'),\n",
    "    'val': LAST('VAL'),\n",
    "    'grev': LAST('GREV'),\n",
    "    'droeafternonorecurring': LAST('DROEAfterNonRecurring')\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "9"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "alpha_factors.__len__()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "frequency = '2w'\n",
    "batch = 8\n",
    "start_date = '2012-01-01'\n",
    "end_date = '2017-11-02'\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-11-06 10:27:43,087 - ALPHA_MIND - INFO - Starting data package fetching ...\n",
      "2017-11-06 10:27:56,533 - ALPHA_MIND - INFO - Loading data is finished\n",
      "2017-11-06 10:27:57,251 - 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": {},
   "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": 9,
   "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": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "ref_date = list(train_x.keys())[-6]\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()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Wall time: 487 ms\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "\n",
    "param = {'max_depth': 3,\n",
    "         'learning_rate': 0.2,\n",
    "         'n_estimators': 500,\n",
    "         'silent': True,\n",
    "         'booster': 'gbtree',\n",
    "         'min_child_weight': 5,\n",
    "         'reg_alpha': 0.,\n",
    "         'reg_lambda': 0.,\n",
    "         'subsample': 0.5,\n",
    "         'n_jobs': 4,\n",
    "         'objective': 'reg:linear'}\n",
    "\n",
    "model = xgb.XGBRegressor(**param)\n",
    "model.fit(sample_train_x, sample_train_y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.0011586073237553108"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mean_squared_error(model.predict(sample_train_x), sample_train_y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## 1. Train and test accuracy trend （XGBRegressor）\n",
    "------------------------------------"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "dates = sorted(train_x.keys())\n",
    "accuray_table = pd.DataFrame(columns=['train', 'predict'])\n",
    "\n",
    "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": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2017-11-06 13:05:25,668 - ALPHA_MIND - INFO - trade_date: 2012-02-02 00:00:00 training finished\n",
      "2017-11-06 13:05:25,897 - ALPHA_MIND - INFO - trade_date: 2012-02-02 00:00:00 predicting finished\n",
      "2017-11-06 13:05:26,380 - ALPHA_MIND - INFO - trade_date: 2012-02-16 00:00:00 training finished\n",
      "2017-11-06 13:05:26,499 - ALPHA_MIND - INFO - trade_date: 2012-02-16 00:00:00 predicting finished\n",
      "2017-11-06 13:05:26,995 - ALPHA_MIND - INFO - trade_date: 2012-03-01 00:00:00 training finished\n",
      "2017-11-06 13:05:27,118 - ALPHA_MIND - INFO - trade_date: 2012-03-01 00:00:00 predicting finished\n",
      "2017-11-06 13:05:27,614 - ALPHA_MIND - INFO - trade_date: 2012-03-15 00:00:00 training finished\n",
      "2017-11-06 13:05:27,732 - ALPHA_MIND - INFO - trade_date: 2012-03-15 00:00:00 predicting finished\n",
      "2017-11-06 13:05:28,226 - ALPHA_MIND - INFO - trade_date: 2012-03-29 00:00:00 training finished\n",
      "2017-11-06 13:05:28,342 - ALPHA_MIND - INFO - trade_date: 2012-03-29 00:00:00 predicting finished\n",
      "2017-11-06 13:05:28,832 - ALPHA_MIND - INFO - trade_date: 2012-04-12 00:00:00 training finished\n",
      "2017-11-06 13:05:28,947 - ALPHA_MIND - INFO - trade_date: 2012-04-12 00:00:00 predicting finished\n",
      "2017-11-06 13:05:29,443 - ALPHA_MIND - INFO - trade_date: 2012-04-26 00:00:00 training finished\n",
      "2017-11-06 13:05:29,560 - ALPHA_MIND - INFO - trade_date: 2012-04-26 00:00:00 predicting finished\n",
      "2017-11-06 13:05:30,062 - ALPHA_MIND - INFO - trade_date: 2012-05-10 00:00:00 training finished\n",
      "2017-11-06 13:05:30,177 - ALPHA_MIND - INFO - trade_date: 2012-05-10 00:00:00 predicting finished\n",
      "2017-11-06 13:05:30,671 - ALPHA_MIND - INFO - trade_date: 2012-05-24 00:00:00 training finished\n",
      "2017-11-06 13:05:30,782 - ALPHA_MIND - INFO - trade_date: 2012-05-24 00:00:00 predicting finished\n",
      "2017-11-06 13:05:31,256 - ALPHA_MIND - INFO - trade_date: 2012-06-07 00:00:00 training finished\n",
      "2017-11-06 13:05:31,364 - ALPHA_MIND - INFO - trade_date: 2012-06-07 00:00:00 predicting finished\n",
      "2017-11-06 13:05:31,840 - ALPHA_MIND - INFO - trade_date: 2012-06-21 00:00:00 training finished\n",
      "2017-11-06 13:05:31,953 - ALPHA_MIND - INFO - trade_date: 2012-06-21 00:00:00 predicting finished\n",
      "2017-11-06 13:05:32,424 - ALPHA_MIND - INFO - trade_date: 2012-07-05 00:00:00 training finished\n",
      "2017-11-06 13:05:32,537 - ALPHA_MIND - INFO - trade_date: 2012-07-05 00:00:00 predicting finished\n",
      "2017-11-06 13:05:33,022 - ALPHA_MIND - INFO - trade_date: 2012-07-19 00:00:00 training finished\n",
      "2017-11-06 13:05:33,137 - ALPHA_MIND - INFO - trade_date: 2012-07-19 00:00:00 predicting finished\n",
      "2017-11-06 13:05:33,619 - ALPHA_MIND - INFO - trade_date: 2012-08-02 00:00:00 training finished\n",
      "2017-11-06 13:05:33,726 - ALPHA_MIND - INFO - trade_date: 2012-08-02 00:00:00 predicting finished\n",
      "2017-11-06 13:05:34,205 - ALPHA_MIND - INFO - trade_date: 2012-08-16 00:00:00 training finished\n",
      "2017-11-06 13:05:34,314 - ALPHA_MIND - INFO - trade_date: 2012-08-16 00:00:00 predicting finished\n",
      "2017-11-06 13:05:34,795 - ALPHA_MIND - INFO - trade_date: 2012-08-30 00:00:00 training finished\n",
      "2017-11-06 13:05:34,912 - ALPHA_MIND - INFO - trade_date: 2012-08-30 00:00:00 predicting finished\n",
      "2017-11-06 13:05:35,386 - ALPHA_MIND - INFO - trade_date: 2012-09-13 00:00:00 training finished\n",
      "2017-11-06 13:05:35,498 - ALPHA_MIND - INFO - trade_date: 2012-09-13 00:00:00 predicting finished\n",
      "2017-11-06 13:05:35,979 - ALPHA_MIND - INFO - trade_date: 2012-09-27 00:00:00 training finished\n",
      "2017-11-06 13:05:36,095 - ALPHA_MIND - INFO - trade_date: 2012-09-27 00:00:00 predicting finished\n",
      "2017-11-06 13:05:36,595 - ALPHA_MIND - INFO - trade_date: 2012-10-11 00:00:00 training finished\n",
      "2017-11-06 13:05:36,710 - ALPHA_MIND - INFO - trade_date: 2012-10-11 00:00:00 predicting finished\n",
      "2017-11-06 13:05:37,220 - ALPHA_MIND - INFO - trade_date: 2012-10-25 00:00:00 training finished\n",
      "2017-11-06 13:05:37,334 - ALPHA_MIND - INFO - trade_date: 2012-10-25 00:00:00 predicting finished\n",
      "2017-11-06 13:05:37,830 - ALPHA_MIND - INFO - trade_date: 2012-11-08 00:00:00 training finished\n",
      "2017-11-06 13:05:37,943 - ALPHA_MIND - INFO - trade_date: 2012-11-08 00:00:00 predicting finished\n",
      "2017-11-06 13:05:38,437 - ALPHA_MIND - INFO - trade_date: 2012-11-22 00:00:00 training finished\n",
      "2017-11-06 13:05:38,552 - ALPHA_MIND - INFO - trade_date: 2012-11-22 00:00:00 predicting finished\n",
      "2017-11-06 13:05:39,062 - ALPHA_MIND - INFO - trade_date: 2012-12-06 00:00:00 training finished\n",
      "2017-11-06 13:05:39,183 - ALPHA_MIND - INFO - trade_date: 2012-12-06 00:00:00 predicting finished\n",
      "2017-11-06 13:05:39,691 - ALPHA_MIND - INFO - trade_date: 2012-12-20 00:00:00 training finished\n",
      "2017-11-06 13:05:39,805 - ALPHA_MIND - INFO - trade_date: 2012-12-20 00:00:00 predicting finished\n",
      "2017-11-06 13:05:40,291 - ALPHA_MIND - INFO - trade_date: 2013-01-04 00:00:00 training finished\n",
      "2017-11-06 13:05:40,409 - ALPHA_MIND - INFO - trade_date: 2013-01-04 00:00:00 predicting finished\n",
      "2017-11-06 13:05:40,880 - ALPHA_MIND - INFO - trade_date: 2013-01-17 00:00:00 training finished\n",
      "2017-11-06 13:05:40,994 - ALPHA_MIND - INFO - trade_date: 2013-01-17 00:00:00 predicting finished\n",
      "2017-11-06 13:05:41,478 - ALPHA_MIND - INFO - trade_date: 2013-01-31 00:00:00 training finished\n",
      "2017-11-06 13:05:41,601 - ALPHA_MIND - INFO - trade_date: 2013-01-31 00:00:00 predicting finished\n",
      "2017-11-06 13:05:42,097 - ALPHA_MIND - INFO - trade_date: 2013-02-18 00:00:00 training finished\n",
      "2017-11-06 13:05:42,213 - ALPHA_MIND - INFO - trade_date: 2013-02-18 00:00:00 predicting finished\n",
      "2017-11-06 13:05:42,706 - ALPHA_MIND - INFO - trade_date: 2013-02-28 00:00:00 training finished\n",
      "2017-11-06 13:05:42,822 - ALPHA_MIND - INFO - trade_date: 2013-02-28 00:00:00 predicting finished\n",
      "2017-11-06 13:05:43,311 - ALPHA_MIND - INFO - trade_date: 2013-03-14 00:00:00 training finished\n",
      "2017-11-06 13:05:43,428 - ALPHA_MIND - INFO - trade_date: 2013-03-14 00:00:00 predicting finished\n",
      "2017-11-06 13:05:43,947 - ALPHA_MIND - INFO - trade_date: 2013-03-28 00:00:00 training finished\n",
      "2017-11-06 13:05:44,077 - ALPHA_MIND - INFO - trade_date: 2013-03-28 00:00:00 predicting finished\n",
      "2017-11-06 13:05:44,590 - ALPHA_MIND - INFO - trade_date: 2013-04-11 00:00:00 training finished\n",
      "2017-11-06 13:05:44,732 - ALPHA_MIND - INFO - trade_date: 2013-04-11 00:00:00 predicting finished\n",
      "2017-11-06 13:05:45,249 - ALPHA_MIND - INFO - trade_date: 2013-04-25 00:00:00 training finished\n",
      "2017-11-06 13:05:45,364 - ALPHA_MIND - INFO - trade_date: 2013-04-25 00:00:00 predicting finished\n",
      "2017-11-06 13:05:45,861 - ALPHA_MIND - INFO - trade_date: 2013-05-09 00:00:00 training finished\n",
      "2017-11-06 13:05:45,981 - ALPHA_MIND - INFO - trade_date: 2013-05-09 00:00:00 predicting finished\n",
      "2017-11-06 13:05:46,489 - ALPHA_MIND - INFO - trade_date: 2013-05-23 00:00:00 training finished\n",
      "2017-11-06 13:05:46,609 - ALPHA_MIND - INFO - trade_date: 2013-05-23 00:00:00 predicting finished\n",
      "2017-11-06 13:05:47,121 - ALPHA_MIND - INFO - trade_date: 2013-06-06 00:00:00 training finished\n",
      "2017-11-06 13:05:47,242 - ALPHA_MIND - INFO - trade_date: 2013-06-06 00:00:00 predicting finished\n",
      "2017-11-06 13:05:47,749 - ALPHA_MIND - INFO - trade_date: 2013-06-20 00:00:00 training finished\n",
      "2017-11-06 13:05:47,868 - ALPHA_MIND - INFO - trade_date: 2013-06-20 00:00:00 predicting finished\n",
      "2017-11-06 13:05:48,365 - ALPHA_MIND - INFO - trade_date: 2013-07-04 00:00:00 training finished\n",
      "2017-11-06 13:05:48,478 - ALPHA_MIND - INFO - trade_date: 2013-07-04 00:00:00 predicting finished\n",
      "2017-11-06 13:05:48,978 - ALPHA_MIND - INFO - trade_date: 2013-07-18 00:00:00 training finished\n",
      "2017-11-06 13:05:49,097 - ALPHA_MIND - INFO - trade_date: 2013-07-18 00:00:00 predicting finished\n",
      "2017-11-06 13:05:49,591 - ALPHA_MIND - INFO - trade_date: 2013-08-01 00:00:00 training finished\n",
      "2017-11-06 13:05:49,707 - ALPHA_MIND - INFO - trade_date: 2013-08-01 00:00:00 predicting finished\n",
      "2017-11-06 13:05:50,206 - ALPHA_MIND - INFO - trade_date: 2013-08-15 00:00:00 training finished\n",
      "2017-11-06 13:05:50,329 - ALPHA_MIND - INFO - trade_date: 2013-08-15 00:00:00 predicting finished\n",
      "2017-11-06 13:05:50,824 - ALPHA_MIND - INFO - trade_date: 2013-08-29 00:00:00 training finished\n",
      "2017-11-06 13:05:50,937 - ALPHA_MIND - INFO - trade_date: 2013-08-29 00:00:00 predicting finished\n",
      "2017-11-06 13:05:51,421 - ALPHA_MIND - INFO - trade_date: 2013-09-12 00:00:00 training finished\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2017-11-06 13:05:51,537 - ALPHA_MIND - INFO - trade_date: 2013-09-12 00:00:00 predicting finished\n",
      "2017-11-06 13:05:52,022 - ALPHA_MIND - INFO - trade_date: 2013-09-26 00:00:00 training finished\n",
      "2017-11-06 13:05:52,137 - ALPHA_MIND - INFO - trade_date: 2013-09-26 00:00:00 predicting finished\n",
      "2017-11-06 13:05:52,611 - ALPHA_MIND - INFO - trade_date: 2013-10-10 00:00:00 training finished\n",
      "2017-11-06 13:05:52,718 - ALPHA_MIND - INFO - trade_date: 2013-10-10 00:00:00 predicting finished\n",
      "2017-11-06 13:05:53,181 - ALPHA_MIND - INFO - trade_date: 2013-10-24 00:00:00 training finished\n",
      "2017-11-06 13:05:53,292 - ALPHA_MIND - INFO - trade_date: 2013-10-24 00:00:00 predicting finished\n",
      "2017-11-06 13:05:53,767 - ALPHA_MIND - INFO - trade_date: 2013-11-07 00:00:00 training finished\n",
      "2017-11-06 13:05:53,875 - ALPHA_MIND - INFO - trade_date: 2013-11-07 00:00:00 predicting finished\n",
      "2017-11-06 13:05:54,362 - ALPHA_MIND - INFO - trade_date: 2013-11-21 00:00:00 training finished\n",
      "2017-11-06 13:05:54,480 - ALPHA_MIND - INFO - trade_date: 2013-11-21 00:00:00 predicting finished\n",
      "2017-11-06 13:05:54,962 - ALPHA_MIND - INFO - trade_date: 2013-12-05 00:00:00 training finished\n",
      "2017-11-06 13:05:55,070 - ALPHA_MIND - INFO - trade_date: 2013-12-05 00:00:00 predicting finished\n",
      "2017-11-06 13:05:55,532 - ALPHA_MIND - INFO - trade_date: 2013-12-19 00:00:00 training finished\n",
      "2017-11-06 13:05:55,641 - ALPHA_MIND - INFO - trade_date: 2013-12-19 00:00:00 predicting finished\n",
      "2017-11-06 13:05:56,106 - ALPHA_MIND - INFO - trade_date: 2014-01-02 00:00:00 training finished\n",
      "2017-11-06 13:05:56,215 - ALPHA_MIND - INFO - trade_date: 2014-01-02 00:00:00 predicting finished\n",
      "2017-11-06 13:05:56,696 - ALPHA_MIND - INFO - trade_date: 2014-01-16 00:00:00 training finished\n",
      "2017-11-06 13:05:56,808 - ALPHA_MIND - INFO - trade_date: 2014-01-16 00:00:00 predicting finished\n",
      "2017-11-06 13:05:57,298 - ALPHA_MIND - INFO - trade_date: 2014-01-30 00:00:00 training finished\n",
      "2017-11-06 13:05:57,413 - ALPHA_MIND - INFO - trade_date: 2014-01-30 00:00:00 predicting finished\n",
      "2017-11-06 13:05:57,868 - ALPHA_MIND - INFO - trade_date: 2014-02-13 00:00:00 training finished\n",
      "2017-11-06 13:05:57,977 - ALPHA_MIND - INFO - trade_date: 2014-02-13 00:00:00 predicting finished\n",
      "2017-11-06 13:05:58,440 - ALPHA_MIND - INFO - trade_date: 2014-02-27 00:00:00 training finished\n",
      "2017-11-06 13:05:58,547 - ALPHA_MIND - INFO - trade_date: 2014-02-27 00:00:00 predicting finished\n",
      "2017-11-06 13:05:59,005 - ALPHA_MIND - INFO - trade_date: 2014-03-13 00:00:00 training finished\n",
      "2017-11-06 13:05:59,115 - ALPHA_MIND - INFO - trade_date: 2014-03-13 00:00:00 predicting finished\n",
      "2017-11-06 13:05:59,585 - ALPHA_MIND - INFO - trade_date: 2014-03-27 00:00:00 training finished\n",
      "2017-11-06 13:05:59,701 - ALPHA_MIND - INFO - trade_date: 2014-03-27 00:00:00 predicting finished\n",
      "2017-11-06 13:06:00,159 - ALPHA_MIND - INFO - trade_date: 2014-04-10 00:00:00 training finished\n",
      "2017-11-06 13:06:00,289 - ALPHA_MIND - INFO - trade_date: 2014-04-10 00:00:00 predicting finished\n",
      "2017-11-06 13:06:00,792 - ALPHA_MIND - INFO - trade_date: 2014-04-24 00:00:00 training finished\n",
      "2017-11-06 13:06:00,992 - ALPHA_MIND - INFO - trade_date: 2014-04-24 00:00:00 predicting finished\n",
      "2017-11-06 13:06:01,559 - ALPHA_MIND - INFO - trade_date: 2014-05-08 00:00:00 training finished\n",
      "2017-11-06 13:06:01,676 - ALPHA_MIND - INFO - trade_date: 2014-05-08 00:00:00 predicting finished\n",
      "2017-11-06 13:06:02,139 - ALPHA_MIND - INFO - trade_date: 2014-05-22 00:00:00 training finished\n",
      "2017-11-06 13:06:02,257 - ALPHA_MIND - INFO - trade_date: 2014-05-22 00:00:00 predicting finished\n",
      "2017-11-06 13:06:02,739 - ALPHA_MIND - INFO - trade_date: 2014-06-05 00:00:00 training finished\n",
      "2017-11-06 13:06:02,856 - ALPHA_MIND - INFO - trade_date: 2014-06-05 00:00:00 predicting finished\n",
      "2017-11-06 13:06:03,338 - ALPHA_MIND - INFO - trade_date: 2014-06-19 00:00:00 training finished\n",
      "2017-11-06 13:06:03,453 - ALPHA_MIND - INFO - trade_date: 2014-06-19 00:00:00 predicting finished\n",
      "2017-11-06 13:06:03,917 - ALPHA_MIND - INFO - trade_date: 2014-07-03 00:00:00 training finished\n",
      "2017-11-06 13:06:04,033 - ALPHA_MIND - INFO - trade_date: 2014-07-03 00:00:00 predicting finished\n",
      "2017-11-06 13:06:04,497 - ALPHA_MIND - INFO - trade_date: 2014-07-17 00:00:00 training finished\n",
      "2017-11-06 13:06:04,621 - ALPHA_MIND - INFO - trade_date: 2014-07-17 00:00:00 predicting finished\n",
      "2017-11-06 13:06:05,098 - ALPHA_MIND - INFO - trade_date: 2014-07-31 00:00:00 training finished\n",
      "2017-11-06 13:06:05,215 - ALPHA_MIND - INFO - trade_date: 2014-07-31 00:00:00 predicting finished\n",
      "2017-11-06 13:06:05,686 - ALPHA_MIND - INFO - trade_date: 2014-08-14 00:00:00 training finished\n",
      "2017-11-06 13:06:05,797 - ALPHA_MIND - INFO - trade_date: 2014-08-14 00:00:00 predicting finished\n",
      "2017-11-06 13:06:06,281 - ALPHA_MIND - INFO - trade_date: 2014-08-28 00:00:00 training finished\n",
      "2017-11-06 13:06:06,408 - ALPHA_MIND - INFO - trade_date: 2014-08-28 00:00:00 predicting finished\n",
      "2017-11-06 13:06:06,902 - ALPHA_MIND - INFO - trade_date: 2014-09-11 00:00:00 training finished\n",
      "2017-11-06 13:06:07,018 - ALPHA_MIND - INFO - trade_date: 2014-09-11 00:00:00 predicting finished\n",
      "2017-11-06 13:06:07,522 - ALPHA_MIND - INFO - trade_date: 2014-09-25 00:00:00 training finished\n",
      "2017-11-06 13:06:07,640 - ALPHA_MIND - INFO - trade_date: 2014-09-25 00:00:00 predicting finished\n",
      "2017-11-06 13:06:08,128 - ALPHA_MIND - INFO - trade_date: 2014-10-09 00:00:00 training finished\n",
      "2017-11-06 13:06:08,247 - ALPHA_MIND - INFO - trade_date: 2014-10-09 00:00:00 predicting finished\n",
      "2017-11-06 13:06:08,755 - ALPHA_MIND - INFO - trade_date: 2014-10-23 00:00:00 training finished\n",
      "2017-11-06 13:06:08,885 - ALPHA_MIND - INFO - trade_date: 2014-10-23 00:00:00 predicting finished\n",
      "2017-11-06 13:06:09,373 - ALPHA_MIND - INFO - trade_date: 2014-11-06 00:00:00 training finished\n",
      "2017-11-06 13:06:09,488 - ALPHA_MIND - INFO - trade_date: 2014-11-06 00:00:00 predicting finished\n",
      "2017-11-06 13:06:09,977 - ALPHA_MIND - INFO - trade_date: 2014-11-20 00:00:00 training finished\n",
      "2017-11-06 13:06:10,096 - ALPHA_MIND - INFO - trade_date: 2014-11-20 00:00:00 predicting finished\n",
      "2017-11-06 13:06:10,617 - ALPHA_MIND - INFO - trade_date: 2014-12-04 00:00:00 training finished\n",
      "2017-11-06 13:06:10,736 - ALPHA_MIND - INFO - trade_date: 2014-12-04 00:00:00 predicting finished\n",
      "2017-11-06 13:06:11,197 - ALPHA_MIND - INFO - trade_date: 2014-12-18 00:00:00 training finished\n",
      "2017-11-06 13:06:11,313 - ALPHA_MIND - INFO - trade_date: 2014-12-18 00:00:00 predicting finished\n",
      "2017-11-06 13:06:11,802 - ALPHA_MIND - INFO - trade_date: 2015-01-05 00:00:00 training finished\n",
      "2017-11-06 13:06:11,931 - ALPHA_MIND - INFO - trade_date: 2015-01-05 00:00:00 predicting finished\n",
      "2017-11-06 13:06:12,409 - ALPHA_MIND - INFO - trade_date: 2015-01-15 00:00:00 training finished\n",
      "2017-11-06 13:06:12,527 - ALPHA_MIND - INFO - trade_date: 2015-01-15 00:00:00 predicting finished\n",
      "2017-11-06 13:06:13,019 - ALPHA_MIND - INFO - trade_date: 2015-01-29 00:00:00 training finished\n",
      "2017-11-06 13:06:13,149 - ALPHA_MIND - INFO - trade_date: 2015-01-29 00:00:00 predicting finished\n",
      "2017-11-06 13:06:13,652 - ALPHA_MIND - INFO - trade_date: 2015-02-12 00:00:00 training finished\n",
      "2017-11-06 13:06:13,768 - ALPHA_MIND - INFO - trade_date: 2015-02-12 00:00:00 predicting finished\n",
      "2017-11-06 13:06:14,263 - ALPHA_MIND - INFO - trade_date: 2015-02-26 00:00:00 training finished\n",
      "2017-11-06 13:06:14,385 - ALPHA_MIND - INFO - trade_date: 2015-02-26 00:00:00 predicting finished\n",
      "2017-11-06 13:06:14,880 - ALPHA_MIND - INFO - trade_date: 2015-03-12 00:00:00 training finished\n",
      "2017-11-06 13:06:15,005 - ALPHA_MIND - INFO - trade_date: 2015-03-12 00:00:00 predicting finished\n",
      "2017-11-06 13:06:15,491 - ALPHA_MIND - INFO - trade_date: 2015-03-26 00:00:00 training finished\n",
      "2017-11-06 13:06:15,610 - ALPHA_MIND - INFO - trade_date: 2015-03-26 00:00:00 predicting finished\n",
      "2017-11-06 13:06:16,110 - ALPHA_MIND - INFO - trade_date: 2015-04-09 00:00:00 training finished\n",
      "2017-11-06 13:06:16,228 - ALPHA_MIND - INFO - trade_date: 2015-04-09 00:00:00 predicting finished\n",
      "2017-11-06 13:06:16,705 - ALPHA_MIND - INFO - trade_date: 2015-04-23 00:00:00 training finished\n",
      "2017-11-06 13:06:16,822 - ALPHA_MIND - INFO - trade_date: 2015-04-23 00:00:00 predicting finished\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2017-11-06 13:06:17,339 - ALPHA_MIND - INFO - trade_date: 2015-05-07 00:00:00 training finished\n",
      "2017-11-06 13:06:17,455 - ALPHA_MIND - INFO - trade_date: 2015-05-07 00:00:00 predicting finished\n",
      "2017-11-06 13:06:17,947 - ALPHA_MIND - INFO - trade_date: 2015-05-21 00:00:00 training finished\n",
      "2017-11-06 13:06:18,063 - ALPHA_MIND - INFO - trade_date: 2015-05-21 00:00:00 predicting finished\n",
      "2017-11-06 13:06:18,531 - ALPHA_MIND - INFO - trade_date: 2015-06-04 00:00:00 training finished\n",
      "2017-11-06 13:06:18,645 - ALPHA_MIND - INFO - trade_date: 2015-06-04 00:00:00 predicting finished\n",
      "2017-11-06 13:06:19,143 - ALPHA_MIND - INFO - trade_date: 2015-06-18 00:00:00 training finished\n",
      "2017-11-06 13:06:19,256 - ALPHA_MIND - INFO - trade_date: 2015-06-18 00:00:00 predicting finished\n",
      "2017-11-06 13:06:19,732 - ALPHA_MIND - INFO - trade_date: 2015-07-02 00:00:00 training finished\n",
      "2017-11-06 13:06:19,850 - ALPHA_MIND - INFO - trade_date: 2015-07-02 00:00:00 predicting finished\n",
      "2017-11-06 13:06:20,334 - ALPHA_MIND - INFO - trade_date: 2015-07-16 00:00:00 training finished\n",
      "2017-11-06 13:06:20,445 - ALPHA_MIND - INFO - trade_date: 2015-07-16 00:00:00 predicting finished\n",
      "2017-11-06 13:06:20,931 - ALPHA_MIND - INFO - trade_date: 2015-07-30 00:00:00 training finished\n",
      "2017-11-06 13:06:21,055 - ALPHA_MIND - INFO - trade_date: 2015-07-30 00:00:00 predicting finished\n",
      "2017-11-06 13:06:21,524 - ALPHA_MIND - INFO - trade_date: 2015-08-13 00:00:00 training finished\n",
      "2017-11-06 13:06:21,641 - ALPHA_MIND - INFO - trade_date: 2015-08-13 00:00:00 predicting finished\n",
      "2017-11-06 13:06:22,115 - ALPHA_MIND - INFO - trade_date: 2015-08-27 00:00:00 training finished\n",
      "2017-11-06 13:06:22,231 - ALPHA_MIND - INFO - trade_date: 2015-08-27 00:00:00 predicting finished\n",
      "2017-11-06 13:06:22,735 - ALPHA_MIND - INFO - trade_date: 2015-09-10 00:00:00 training finished\n",
      "2017-11-06 13:06:22,854 - ALPHA_MIND - INFO - trade_date: 2015-09-10 00:00:00 predicting finished\n",
      "2017-11-06 13:06:23,375 - ALPHA_MIND - INFO - trade_date: 2015-09-24 00:00:00 training finished\n",
      "2017-11-06 13:06:23,503 - ALPHA_MIND - INFO - trade_date: 2015-09-24 00:00:00 predicting finished\n",
      "2017-11-06 13:06:24,052 - ALPHA_MIND - INFO - trade_date: 2015-10-08 00:00:00 training finished\n",
      "2017-11-06 13:06:24,175 - ALPHA_MIND - INFO - trade_date: 2015-10-08 00:00:00 predicting finished\n",
      "2017-11-06 13:06:24,666 - ALPHA_MIND - INFO - trade_date: 2015-10-22 00:00:00 training finished\n",
      "2017-11-06 13:06:24,786 - ALPHA_MIND - INFO - trade_date: 2015-10-22 00:00:00 predicting finished\n",
      "2017-11-06 13:06:25,291 - ALPHA_MIND - INFO - trade_date: 2015-11-05 00:00:00 training finished\n",
      "2017-11-06 13:06:25,408 - ALPHA_MIND - INFO - trade_date: 2015-11-05 00:00:00 predicting finished\n",
      "2017-11-06 13:06:25,913 - ALPHA_MIND - INFO - trade_date: 2015-11-19 00:00:00 training finished\n",
      "2017-11-06 13:06:26,028 - ALPHA_MIND - INFO - trade_date: 2015-11-19 00:00:00 predicting finished\n",
      "2017-11-06 13:06:26,529 - ALPHA_MIND - INFO - trade_date: 2015-12-03 00:00:00 training finished\n",
      "2017-11-06 13:06:26,654 - ALPHA_MIND - INFO - trade_date: 2015-12-03 00:00:00 predicting finished\n",
      "2017-11-06 13:06:27,131 - ALPHA_MIND - INFO - trade_date: 2015-12-17 00:00:00 training finished\n",
      "2017-11-06 13:06:27,251 - ALPHA_MIND - INFO - trade_date: 2015-12-17 00:00:00 predicting finished\n",
      "2017-11-06 13:06:27,750 - ALPHA_MIND - INFO - trade_date: 2015-12-31 00:00:00 training finished\n",
      "2017-11-06 13:06:27,867 - ALPHA_MIND - INFO - trade_date: 2015-12-31 00:00:00 predicting finished\n",
      "2017-11-06 13:06:28,359 - ALPHA_MIND - INFO - trade_date: 2016-01-14 00:00:00 training finished\n",
      "2017-11-06 13:06:28,477 - ALPHA_MIND - INFO - trade_date: 2016-01-14 00:00:00 predicting finished\n",
      "2017-11-06 13:06:28,973 - ALPHA_MIND - INFO - trade_date: 2016-01-28 00:00:00 training finished\n",
      "2017-11-06 13:06:29,083 - ALPHA_MIND - INFO - trade_date: 2016-01-28 00:00:00 predicting finished\n",
      "2017-11-06 13:06:29,564 - ALPHA_MIND - INFO - trade_date: 2016-02-15 00:00:00 training finished\n",
      "2017-11-06 13:06:29,691 - ALPHA_MIND - INFO - trade_date: 2016-02-15 00:00:00 predicting finished\n",
      "2017-11-06 13:06:30,187 - ALPHA_MIND - INFO - trade_date: 2016-02-25 00:00:00 training finished\n",
      "2017-11-06 13:06:30,316 - ALPHA_MIND - INFO - trade_date: 2016-02-25 00:00:00 predicting finished\n",
      "2017-11-06 13:06:30,835 - ALPHA_MIND - INFO - trade_date: 2016-03-10 00:00:00 training finished\n",
      "2017-11-06 13:06:30,952 - ALPHA_MIND - INFO - trade_date: 2016-03-10 00:00:00 predicting finished\n",
      "2017-11-06 13:06:31,442 - ALPHA_MIND - INFO - trade_date: 2016-03-24 00:00:00 training finished\n",
      "2017-11-06 13:06:31,565 - ALPHA_MIND - INFO - trade_date: 2016-03-24 00:00:00 predicting finished\n",
      "2017-11-06 13:06:32,066 - ALPHA_MIND - INFO - trade_date: 2016-04-07 00:00:00 training finished\n",
      "2017-11-06 13:06:32,195 - ALPHA_MIND - INFO - trade_date: 2016-04-07 00:00:00 predicting finished\n",
      "2017-11-06 13:06:32,699 - ALPHA_MIND - INFO - trade_date: 2016-04-21 00:00:00 training finished\n",
      "2017-11-06 13:06:32,824 - ALPHA_MIND - INFO - trade_date: 2016-04-21 00:00:00 predicting finished\n",
      "2017-11-06 13:06:33,333 - ALPHA_MIND - INFO - trade_date: 2016-05-05 00:00:00 training finished\n",
      "2017-11-06 13:06:33,451 - ALPHA_MIND - INFO - trade_date: 2016-05-05 00:00:00 predicting finished\n",
      "2017-11-06 13:06:33,959 - ALPHA_MIND - INFO - trade_date: 2016-05-19 00:00:00 training finished\n",
      "2017-11-06 13:06:34,083 - ALPHA_MIND - INFO - trade_date: 2016-05-19 00:00:00 predicting finished\n",
      "2017-11-06 13:06:34,587 - ALPHA_MIND - INFO - trade_date: 2016-06-02 00:00:00 training finished\n",
      "2017-11-06 13:06:34,712 - ALPHA_MIND - INFO - trade_date: 2016-06-02 00:00:00 predicting finished\n",
      "2017-11-06 13:06:35,206 - ALPHA_MIND - INFO - trade_date: 2016-06-16 00:00:00 training finished\n",
      "2017-11-06 13:06:35,327 - ALPHA_MIND - INFO - trade_date: 2016-06-16 00:00:00 predicting finished\n",
      "2017-11-06 13:06:35,844 - ALPHA_MIND - INFO - trade_date: 2016-06-30 00:00:00 training finished\n",
      "2017-11-06 13:06:35,962 - ALPHA_MIND - INFO - trade_date: 2016-06-30 00:00:00 predicting finished\n",
      "2017-11-06 13:06:36,468 - ALPHA_MIND - INFO - trade_date: 2016-07-14 00:00:00 training finished\n",
      "2017-11-06 13:06:36,582 - ALPHA_MIND - INFO - trade_date: 2016-07-14 00:00:00 predicting finished\n",
      "2017-11-06 13:06:37,075 - ALPHA_MIND - INFO - trade_date: 2016-07-28 00:00:00 training finished\n",
      "2017-11-06 13:06:37,193 - ALPHA_MIND - INFO - trade_date: 2016-07-28 00:00:00 predicting finished\n",
      "2017-11-06 13:06:37,703 - ALPHA_MIND - INFO - trade_date: 2016-08-11 00:00:00 training finished\n",
      "2017-11-06 13:06:37,828 - ALPHA_MIND - INFO - trade_date: 2016-08-11 00:00:00 predicting finished\n",
      "2017-11-06 13:06:38,308 - ALPHA_MIND - INFO - trade_date: 2016-08-25 00:00:00 training finished\n",
      "2017-11-06 13:06:38,429 - ALPHA_MIND - INFO - trade_date: 2016-08-25 00:00:00 predicting finished\n",
      "2017-11-06 13:06:38,935 - ALPHA_MIND - INFO - trade_date: 2016-09-08 00:00:00 training finished\n",
      "2017-11-06 13:06:39,043 - ALPHA_MIND - INFO - trade_date: 2016-09-08 00:00:00 predicting finished\n",
      "2017-11-06 13:06:39,508 - ALPHA_MIND - INFO - trade_date: 2016-09-22 00:00:00 training finished\n",
      "2017-11-06 13:06:39,625 - ALPHA_MIND - INFO - trade_date: 2016-09-22 00:00:00 predicting finished\n",
      "2017-11-06 13:06:40,094 - ALPHA_MIND - INFO - trade_date: 2016-10-10 00:00:00 training finished\n",
      "2017-11-06 13:06:40,206 - ALPHA_MIND - INFO - trade_date: 2016-10-10 00:00:00 predicting finished\n",
      "2017-11-06 13:06:40,683 - ALPHA_MIND - INFO - trade_date: 2016-10-20 00:00:00 training finished\n",
      "2017-11-06 13:06:40,798 - ALPHA_MIND - INFO - trade_date: 2016-10-20 00:00:00 predicting finished\n",
      "2017-11-06 13:06:41,265 - ALPHA_MIND - INFO - trade_date: 2016-11-03 00:00:00 training finished\n",
      "2017-11-06 13:06:41,382 - ALPHA_MIND - INFO - trade_date: 2016-11-03 00:00:00 predicting finished\n",
      "2017-11-06 13:06:41,869 - ALPHA_MIND - INFO - trade_date: 2016-11-17 00:00:00 training finished\n",
      "2017-11-06 13:06:41,984 - ALPHA_MIND - INFO - trade_date: 2016-11-17 00:00:00 predicting finished\n",
      "2017-11-06 13:06:42,477 - ALPHA_MIND - INFO - trade_date: 2016-12-01 00:00:00 training finished\n",
      "2017-11-06 13:06:42,598 - ALPHA_MIND - INFO - trade_date: 2016-12-01 00:00:00 predicting finished\n",
      "2017-11-06 13:06:43,125 - ALPHA_MIND - INFO - trade_date: 2016-12-15 00:00:00 training finished\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2017-11-06 13:06:43,263 - ALPHA_MIND - INFO - trade_date: 2016-12-15 00:00:00 predicting finished\n",
      "2017-11-06 13:06:43,770 - ALPHA_MIND - INFO - trade_date: 2016-12-29 00:00:00 training finished\n",
      "2017-11-06 13:06:43,897 - ALPHA_MIND - INFO - trade_date: 2016-12-29 00:00:00 predicting finished\n",
      "2017-11-06 13:06:44,502 - ALPHA_MIND - INFO - trade_date: 2017-01-12 00:00:00 training finished\n",
      "2017-11-06 13:06:44,631 - ALPHA_MIND - INFO - trade_date: 2017-01-12 00:00:00 predicting finished\n",
      "2017-11-06 13:06:45,140 - ALPHA_MIND - INFO - trade_date: 2017-01-26 00:00:00 training finished\n",
      "2017-11-06 13:06:45,289 - ALPHA_MIND - INFO - trade_date: 2017-01-26 00:00:00 predicting finished\n",
      "2017-11-06 13:06:45,991 - ALPHA_MIND - INFO - trade_date: 2017-02-09 00:00:00 training finished\n",
      "2017-11-06 13:06:46,146 - ALPHA_MIND - INFO - trade_date: 2017-02-09 00:00:00 predicting finished\n",
      "2017-11-06 13:06:46,852 - ALPHA_MIND - INFO - trade_date: 2017-02-23 00:00:00 training finished\n",
      "2017-11-06 13:06:47,005 - ALPHA_MIND - INFO - trade_date: 2017-02-23 00:00:00 predicting finished\n",
      "2017-11-06 13:06:47,834 - ALPHA_MIND - INFO - trade_date: 2017-03-09 00:00:00 training finished\n",
      "2017-11-06 13:06:47,965 - ALPHA_MIND - INFO - trade_date: 2017-03-09 00:00:00 predicting finished\n",
      "2017-11-06 13:06:48,619 - ALPHA_MIND - INFO - trade_date: 2017-03-23 00:00:00 training finished\n",
      "2017-11-06 13:06:48,770 - ALPHA_MIND - INFO - trade_date: 2017-03-23 00:00:00 predicting finished\n",
      "2017-11-06 13:06:49,817 - ALPHA_MIND - INFO - trade_date: 2017-04-06 00:00:00 training finished\n",
      "2017-11-06 13:06:49,950 - ALPHA_MIND - INFO - trade_date: 2017-04-06 00:00:00 predicting finished\n",
      "2017-11-06 13:06:50,604 - ALPHA_MIND - INFO - trade_date: 2017-04-20 00:00:00 training finished\n",
      "2017-11-06 13:06:50,728 - ALPHA_MIND - INFO - trade_date: 2017-04-20 00:00:00 predicting finished\n",
      "2017-11-06 13:06:51,242 - ALPHA_MIND - INFO - trade_date: 2017-05-04 00:00:00 training finished\n",
      "2017-11-06 13:06:51,364 - ALPHA_MIND - INFO - trade_date: 2017-05-04 00:00:00 predicting finished\n",
      "2017-11-06 13:06:51,882 - ALPHA_MIND - INFO - trade_date: 2017-05-18 00:00:00 training finished\n",
      "2017-11-06 13:06:52,021 - ALPHA_MIND - INFO - trade_date: 2017-05-18 00:00:00 predicting finished\n",
      "2017-11-06 13:06:52,527 - ALPHA_MIND - INFO - trade_date: 2017-06-01 00:00:00 training finished\n",
      "2017-11-06 13:06:52,652 - ALPHA_MIND - INFO - trade_date: 2017-06-01 00:00:00 predicting finished\n",
      "2017-11-06 13:06:53,180 - ALPHA_MIND - INFO - trade_date: 2017-06-15 00:00:00 training finished\n",
      "2017-11-06 13:06:53,304 - ALPHA_MIND - INFO - trade_date: 2017-06-15 00:00:00 predicting finished\n",
      "2017-11-06 13:06:53,843 - ALPHA_MIND - INFO - trade_date: 2017-06-29 00:00:00 training finished\n",
      "2017-11-06 13:06:53,967 - ALPHA_MIND - INFO - trade_date: 2017-06-29 00:00:00 predicting finished\n",
      "2017-11-06 13:06:54,488 - ALPHA_MIND - INFO - trade_date: 2017-07-13 00:00:00 training finished\n",
      "2017-11-06 13:06:54,610 - ALPHA_MIND - INFO - trade_date: 2017-07-13 00:00:00 predicting finished\n",
      "2017-11-06 13:06:55,126 - ALPHA_MIND - INFO - trade_date: 2017-07-27 00:00:00 training finished\n",
      "2017-11-06 13:06:55,243 - ALPHA_MIND - INFO - trade_date: 2017-07-27 00:00:00 predicting finished\n",
      "2017-11-06 13:06:55,761 - ALPHA_MIND - INFO - trade_date: 2017-08-10 00:00:00 training finished\n",
      "2017-11-06 13:06:55,880 - ALPHA_MIND - INFO - trade_date: 2017-08-10 00:00:00 predicting finished\n",
      "2017-11-06 13:06:56,397 - ALPHA_MIND - INFO - trade_date: 2017-08-24 00:00:00 training finished\n",
      "2017-11-06 13:06:56,518 - ALPHA_MIND - INFO - trade_date: 2017-08-24 00:00:00 predicting finished\n",
      "2017-11-06 13:06:57,063 - ALPHA_MIND - INFO - trade_date: 2017-09-07 00:00:00 training finished\n",
      "2017-11-06 13:06:57,189 - ALPHA_MIND - INFO - trade_date: 2017-09-07 00:00:00 predicting finished\n",
      "2017-11-06 13:06:57,712 - ALPHA_MIND - INFO - trade_date: 2017-09-21 00:00:00 training finished\n",
      "2017-11-06 13:06:57,840 - ALPHA_MIND - INFO - trade_date: 2017-09-21 00:00:00 predicting finished\n",
      "2017-11-06 13:06:58,400 - ALPHA_MIND - INFO - trade_date: 2017-10-09 00:00:00 training finished\n",
      "2017-11-06 13:06:58,526 - ALPHA_MIND - INFO - trade_date: 2017-10-09 00:00:00 predicting finished\n",
      "2017-11-06 13:06:59,014 - ALPHA_MIND - INFO - trade_date: 2017-10-19 00:00:00 training finished\n",
      "2017-11-06 13:06:59,131 - ALPHA_MIND - INFO - trade_date: 2017-10-19 00:00:00 predicting finished\n",
      "2017-11-06 13:06:59,638 - ALPHA_MIND - INFO - trade_date: 2017-11-02 00:00:00 training finished\n",
      "2017-11-06 13:06:59,752 - ALPHA_MIND - INFO - trade_date: 2017-11-02 00:00:00 predicting finished\n"
     ]
    }
   ],
   "source": [
    "for i, ref_date in enumerate(dates):\n",
    "    sample_train_x = train_x[ref_date]\n",
    "    sample_train_y = train_y[ref_date].flatten()\n",
    "    model.fit(sample_train_x, sample_train_y)\n",
    "    \n",
    "    accuray_table.loc[ref_date, 'train'] =  mean_squared_error(model.predict(sample_train_x), sample_train_y)\n",
    "    alpha_logger.info('trade_date: {0} training finished'.format(ref_date))\n",
    "    \n",
    "    ##---------------------------------##\n",
    "    \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",
    "    accuray_table.loc[ref_date, 'predict'] = mean_squared_error(y, sample_test_y)\n",
    "\n",
    "    is_tradable[:] = True\n",
    "    weights, analysis = er_portfolio_analysis(y.astype(float),\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))\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.text.Text at 0x1ded5f30240>"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nqFgAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1df17b37198>"
      ]
     },
     "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": 25,
   "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>predict</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>0.003037</td>\n",
       "      <td>0.010489</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>median</th>\n",
       "      <td>0.001895</td>\n",
       "      <td>0.005790</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>0.003428</td>\n",
       "      <td>0.018970</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           train   predict\n",
       "mean    0.003037  0.010489\n",
       "median  0.001895  0.005790\n",
       "std     0.003428  0.018970"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "accuray_table.aggregate([np.mean, np.median, np.std])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x1df6e893630>"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nlDsKBpRcAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1dee0b74208>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "accuray_table.plot(figsize=(12, 6))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## 2. Train and test accuracy trend （XGBRegressor Cross Validation）\n",
    "------------------------------------"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%time\n",
    "\n",
    "param_grid = {\n",
    "    'max_depth': [1, 3, 7],\n",
    "    'min_child_weight': [1, 3, 10]\n",
    "}\n",
    "\n",
    "model = xgb.XGBRegressor(**param)\n",
    "model = GridSearchCV(model, param_grid=param_grid, n_jobs=4, cv=3)\n",
    "model.fit(sample_train_x, sample_train_y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "dates = sorted(train_x.keys())\n",
    "accuray_table = pd.DataFrame(columns=['train', 'predict'])\n",
    "\n",
    "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": {},
   "outputs": [],
   "source": [
    "for i, ref_date in enumerate(dates):\n",
    "    sample_train_x = train_x[ref_date]\n",
    "    sample_train_y = train_y[ref_date].flatten()\n",
    "    model.fit(sample_train_x, sample_train_y)\n",
    "    \n",
    "    accuray_table.loc[ref_date, 'train'] =  mean_squared_error(model.predict(sample_train_x), sample_train_y)\n",
    "    alpha_logger.info('trade_date: {0} training finished'.format(ref_date))\n",
    "    \n",
    "    ##---------------------------------##\n",
    "    \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",
    "    accuray_table.loc[ref_date, 'predict'] = mean_squared_error(y, sample_test_y)\n",
    "\n",
    "    is_tradable[:] = True\n",
    "    weights, analysis = er_portfolio_analysis(y.astype(float),\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": [
    "accuray_table.plot(figsize=(12, 6))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "xgb.XGBRegressor?"
   ]
  },
  {
   "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
}
