Commit 564bf716 authored by Dr.李's avatar Dr.李

update xgboost

parent f494294d
...@@ -2,10 +2,8 @@ ...@@ -2,10 +2,8 @@
"cells": [ "cells": [
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 2, "execution_count": 1,
"metadata": { "metadata": {},
"collapsed": true
},
"outputs": [], "outputs": [],
"source": [ "source": [
"%matplotlib inline\n", "%matplotlib inline\n",
...@@ -15,15 +13,17 @@ ...@@ -15,15 +13,17 @@
"from matplotlib import pyplot as plt\n", "from matplotlib import pyplot as plt\n",
"from alphamind.api import *\n", "from alphamind.api import *\n",
"from PyFin.api import *\n", "from PyFin.api import *\n",
"import xgboost as xgb\n",
"from xgboost.sklearn import XGBRegressor\n", "from xgboost.sklearn import XGBRegressor\n",
"from sklearn.model_selection import GridSearchCV\n",
"\n", "\n",
"plt.style.use('fivethirtyeight')\n", "plt.style.use('fivethirtyeight')\n",
"engine = SqlEngine('postgres+psycopg2://postgres:A12345678!@10.63.6.220/alpha')" "engine = SqlEngine('postgres+psycopg2://postgres:we083826@localhost/alpha')"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 3, "execution_count": 2,
"metadata": { "metadata": {
"collapsed": true "collapsed": true
}, },
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 4, "execution_count": 3,
"metadata": { "metadata": {
"collapsed": true "collapsed": true
}, },
...@@ -51,7 +51,7 @@ ...@@ -51,7 +51,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 5, "execution_count": 4,
"metadata": { "metadata": {
"collapsed": true "collapsed": true
}, },
...@@ -65,8 +65,10 @@ ...@@ -65,8 +65,10 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 7, "execution_count": 5,
"metadata": {}, "metadata": {
"collapsed": true
},
"outputs": [], "outputs": [],
"source": [ "source": [
"alpha_factors = coverage_report[coverage_report >= 0.98].index.tolist()\n", "alpha_factors = coverage_report[coverage_report >= 0.98].index.tolist()\n",
...@@ -78,16 +80,16 @@ ...@@ -78,16 +80,16 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 8, "execution_count": 6,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"212" "211"
] ]
}, },
"execution_count": 8, "execution_count": 6,
"metadata": {}, "metadata": {},
"output_type": "execute_result" "output_type": "execute_result"
} }
...@@ -98,7 +100,7 @@ ...@@ -98,7 +100,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 9, "execution_count": 7,
"metadata": { "metadata": {
"collapsed": true "collapsed": true
}, },
...@@ -117,16 +119,16 @@ ...@@ -117,16 +119,16 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 10, "execution_count": 8,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"name": "stderr", "name": "stderr",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"2017-10-27 13:21:53,490 - ALPHA_MIND - INFO - Starting data package fetching ...\n", "2017-10-27 18:07:43,652 - 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 18:09:02,266 - ALPHA_MIND - INFO - Loading data is finished\n",
"2017-10-27 13:23:11,172 - ALPHA_MIND - INFO - Data processing is finished\n" "2017-10-27 18:09:12,239 - ALPHA_MIND - INFO - Data processing is finished\n"
] ]
} }
], ],
...@@ -147,7 +149,7 @@ ...@@ -147,7 +149,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 11, "execution_count": 9,
"metadata": { "metadata": {
"collapsed": true "collapsed": true
}, },
...@@ -164,7 +166,7 @@ ...@@ -164,7 +166,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 18, "execution_count": 10,
"metadata": { "metadata": {
"collapsed": true "collapsed": true
}, },
...@@ -195,85 +197,61 @@ ...@@ -195,85 +197,61 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 27, "execution_count": 19,
"metadata": { "metadata": {},
"collapsed": true
},
"outputs": [], "outputs": [],
"source": [ "source": [
"from multiprocessing import set_start_method\n",
"\n",
"ref_date = list(train_x.keys())[-2]\n", "ref_date = list(train_x.keys())[-2]\n",
"sample_train_x = train_x[ref_date]\n", "sample_train_x = train_x[ref_date]\n",
"sample_train_y = train_y[ref_date].flatten()\n", "sample_train_y = train_y[ref_date].flatten()\n",
"\n", "\n",
"sample_test_x = predict_x[ref_date]\n", "sample_test_x = predict_x[ref_date]\n",
"sample_test_y = predict_y[ref_date].flatten()\n", "sample_test_y = predict_y[ref_date].flatten()"
"\n",
"n_estimators = 100\n",
"max_depth = 4"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 28, "execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.53133384563088204"
]
},
"execution_count": 28,
"metadata": {}, "metadata": {},
"output_type": "execute_result" "outputs": [],
}
],
"source": [ "source": [
"model = XGBRegressor(n_estimators=n_estimators,\n", "param = {'objective': 'reg:linear',\n",
" max_depth=max_depth,\n", " 'tree_method': 'gpu_hist'\n",
" n_jobs=-1)\n", " }\n",
"model.fit(sample_train_x, sample_train_y)\n", "\n",
"model.score(sample_train_x, sample_train_y)" "param_grid = {\n",
" 'max_depth': [3, 10],\n",
" 'min_child_weight': [1, 7]\n",
"}\n",
"\n",
"gsearch = GridSearchCV(estimator = XGBRegressor(n_estimators=50),\n",
" param_grid=param_grid,\n",
" cv=3,\n",
" n_jobs=8)\n",
"\n",
"model = gsearch.fit(sample_train_x, sample_train_y)"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 29, "execution_count": 31,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"-0.086767668507689022" "-0.24730901084637047"
] ]
}, },
"execution_count": 29, "execution_count": 31,
"metadata": {}, "metadata": {},
"output_type": "execute_result" "output_type": "execute_result"
} }
], ],
"source": [ "source": [
"model.score(sample_test_x, sample_test_y)" "gsearch.score(sample_test_x, sample_test_y)"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA5QAAAGTCAYAAABXrF3ZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XlU1OX///8Hi7ilDqYCsgoqbrlEivpxAzXLBXdQU0tN\nC800La3snbm9ccs90ywpXMolU9TUcgUNtcylUpFcyxLeISNuKQLfP/wxvyZwYQSHwfvtHM5hXtf1\nul7P11ydEw+v11xjZzQaMwUAAAAAQC7ZW7sAAAAAAIBtIlACAAAAACxCoAQAAAAAWIRACQAAAACw\nCIESAAAAAGARAiUAAAAAwCIESgAAAACARQiUwCMiISHB2iXgPjBPtoO5sg3Mk21gnmwHc2UbHuY8\nESgBAAAAABYhUAIAAAAALEKgBAAAAABYhEAJAAAAALAIgRIAAAAAYBECJQAAAADAIgRKAAAAAIBF\nCJQAAAAAAIsQKAEAAAAAFiFQAgAAAAAsQqAEAAAAAFiEQAkAAAAAsAiBEgAAAABgEUdrF4DCwRB5\n3tol4J5KSLuZp4KPebIdhXeujP3crV0CAMBGsEIJAAAAALAIgRIAAAAAYBECJQAAAADAIgRKAAAA\nAIBFCJQAAAAAAIsQKAEAAAAAFiFQAgAAAAAsQqAEAAAAAFiEQFkATJw4UU2aNHngcaKiouTl5XXf\nrwEAAADgQRAoH0BYWJg6duyYY1t8fLwMBoN27NiR59e9deuWDAaDNmzYYHa8e/fuOnDgwB3P+3d7\nXgVZAAAAAI8mAuUD6Nu3r2JiYnT27NlsbUuWLJGnp6eaN2/+0OopXry4ypcvb3E7AAAAAOQGgfIB\ntGnTRhUqVNCyZcvMjqelpWnFihXq3bu37O3t9dNPP6lDhw5ydXVVpUqVNGTIEKWmpt5x3B9++EGd\nOnWSr6+vvLy89Oyzz5qtLNauXVuS1Lt3bxkMBtWrV0/SvR9p/Wd7VFSUpk+frp9//lkGg0EGg0Er\nVqzQSy+9pF69epmdl56erurVq2vBggW5e4MAAAAAFGqO1i7Aljk6Oqpnz55avny53nzzTdnb387n\nmzZtUnJysp577jlduXJFXbt2VWBgoLZt26aLFy/q1Vdf1bBhwxQZGZnjuFeuXFHPnj01ZcoUSdJH\nH32kbt266eDBgzIYDNq+fbuqVaumDz74QK1atZKjY+6nsXv37jp27Jh27typtWvXSpLKlCkjT09P\nhYSEKCkpSRUqVJAkbd26VRcvXlRYWJglbxMAwMYkJCRYu4Q8Vdjup7BinmwHc2UbcpqnKlWq5Pl1\nCJQPqE+fPpo1a5Z27typ4OBgSdLSpUsVHBwsDw8PffLJJ7p586YWLFigkiVLSpJmzpypTp06aezY\nsfLx8ck2ZosWLcxeT58+XWvXrtW2bdvUtWtXlStXTtLtAOji4mJR3cWLF1fJkiXl4OBgNkbjxo3l\n6+urFStWaOjQoab7adeunZydnS26FgDAtuTHHxzWkpCQUKjup7BinmwHc2UbHuY88cjrA/Lz81Pj\nxo21dOlSSdKff/6pbdu2qU+fPpJub85Tq1YtU5iUpMDAQEnSiRMnchwzKSlJw4YNU0BAgLy8vOTh\n4aGLFy/q999/z+e7ua1Pnz6m+0lOTtbmzZtN9wMAAAAAWQiUeaBv377auHGjUlJStHz5cjk7O6tt\n27aSpMzMTNnZ2Zn1z3r97+NZBg0apCNHjigiIkJbtmxRbGys3NzcdPPmzfy9kf9Pr169dPr0aX3/\n/ff64osv5Orq+lA3FwIAAABgGwiUeaBjx44qWrSoVqxYoaVLl6pHjx4qUqSIJKlatWr66aefdPXq\nVVP/vXv3SpKqVq2a43h79+7VSy+9pKefflrVq1dXiRIllJiYaGp3cHCQg4OD0tPTH6juIkWKKCMj\nI9vxxx9/XG3bttXSpUu1bNky9erVy/T5UAAAAADIQkrIA8WLF1f37t01efJknT592uzx0LCwMDk5\nOSk8PFxHjx5VbGysRowYoc6dO8vb2zvH8fz8/LRixQrFx8frwIED6t+/v4oWLWpqt7Ozk4eHh2Ji\nYpSYmCij0WhR3V5eXjp79qyOHDmi5ORk3bhxw9T2/PPP6/PPP9exY8f03HPPWTQ+AAAAgMKNQJlH\n+vTpI6PRqMDAQPn7+5uOP/bYY/ryyy+VkpKi4OBg9enTR40aNdLs2bPvONb8+fN16dIlNWvWTC++\n+KL69esnd3d3sz6TJk3Sjh07VLNmTQUFBVlUc6dOnRQUFKT27dvLz8/PtNurdHtjIBcXF7Vo0eKu\nX0UCAAAA4NFlZzQaM61dBAqea9euqVq1apo1a5a6dOlyz/6GyPMPoSoAwMNg7Od+7042gh0pbQPz\nZDuYK9vwMOeJrw2BmYyMDCUmJmrevHkqXbq0QkJCrF0SAAAAgAKKQAkzZ86c0ZNPPikPDw998MEH\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)"
] ]
}, },
{ {
...@@ -286,7 +264,7 @@ ...@@ -286,7 +264,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 31, "execution_count": 32,
"metadata": { "metadata": {
"collapsed": true "collapsed": true
}, },
...@@ -294,215 +272,82 @@ ...@@ -294,215 +272,82 @@
"source": [ "source": [
"dates = sorted(train_x.keys())\n", "dates = sorted(train_x.keys())\n",
"accuray_table = pd.DataFrame(columns=['train', 'test'])\n", "accuray_table = pd.DataFrame(columns=['train', 'test'])\n",
"model_df = pd.Series()" "\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", "cell_type": "code",
"execution_count": null, "execution_count": 33,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"name": "stderr", "name": "stderr",
"output_type": "stream", "output_type": "stream",
"text": [ "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 19:02:12,689 - ALPHA_MIND - INFO - trade_date: 2012-05-02 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 19:02:12,843 - ALPHA_MIND - INFO - trade_date: 2012-05-02 00:00:00 predicting 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 19:06:49,629 - ALPHA_MIND - INFO - trade_date: 2012-05-16 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 19:06:49,793 - ALPHA_MIND - INFO - trade_date: 2012-05-16 00:00:00 predicting 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 19:11:09,707 - ALPHA_MIND - INFO - trade_date: 2012-05-30 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 19:11:09,852 - ALPHA_MIND - INFO - trade_date: 2012-05-30 00:00:00 predicting 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 19:15:35,107 - ALPHA_MIND - INFO - trade_date: 2012-06-13 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 19:15:35,247 - ALPHA_MIND - INFO - trade_date: 2012-06-13 00:00:00 predicting 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 19:20:18,175 - ALPHA_MIND - INFO - trade_date: 2012-06-27 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 19:20:18,322 - ALPHA_MIND - INFO - trade_date: 2012-06-27 00:00:00 predicting 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 19:24:50,547 - ALPHA_MIND - INFO - trade_date: 2012-07-11 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 19:24:50,684 - ALPHA_MIND - INFO - trade_date: 2012-07-11 00:00:00 predicting 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 19:29:27,860 - ALPHA_MIND - INFO - trade_date: 2012-07-25 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 19:29:28,006 - ALPHA_MIND - INFO - trade_date: 2012-07-25 00:00:00 predicting 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 19:34:06,208 - 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 19:34:06,345 - ALPHA_MIND - INFO - trade_date: 2012-08-08 00:00:00 predicting 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 19:38:45,785 - ALPHA_MIND - INFO - trade_date: 2012-08-22 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 19:38:45,930 - ALPHA_MIND - INFO - trade_date: 2012-08-22 00:00:00 predicting 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 19:43:22,542 - ALPHA_MIND - INFO - trade_date: 2012-09-05 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 19:43:22,681 - ALPHA_MIND - INFO - trade_date: 2012-09-05 00:00:00 predicting 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 19:48:21,629 - ALPHA_MIND - INFO - trade_date: 2012-09-19 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 19:48:21,788 - ALPHA_MIND - INFO - trade_date: 2012-09-19 00:00:00 predicting 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", "ename": "KeyboardInterrupt",
"output_type": "stream", "evalue": "",
"text": [ "output_type": "error",
"2017-10-27 13:45:03,159 - ALPHA_MIND - INFO - trade_date: 2015-05-13 00:00:00 training finished\n", "traceback": [
"2017-10-27 13:45:06,246 - ALPHA_MIND - INFO - trade_date: 2015-05-27 00:00:00 training finished\n", "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"2017-10-27 13:45:09,374 - ALPHA_MIND - INFO - trade_date: 2015-06-10 00:00:00 training finished\n", "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
"2017-10-27 13:45:12,490 - ALPHA_MIND - INFO - trade_date: 2015-06-24 00:00:00 training finished\n", "\u001b[1;32m<ipython-input-33-c9f42da98665>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0msample_train_y\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtrain_y\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mref_date\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mflatten\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 5\u001b[1;33m \u001b[0mgsearch\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msample_train_x\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msample_train_y\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 6\u001b[0m \u001b[0maccuray_table\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mloc\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mref_date\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'train'\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mgsearch\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mscore\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msample_train_x\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msample_train_y\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 7\u001b[0m \u001b[0malpha_logger\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0minfo\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'trade_date: {0} training finished'\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mref_date\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"2017-10-27 13:45:15,606 - ALPHA_MIND - INFO - trade_date: 2015-07-08 00:00:00 training finished\n", "\u001b[1;32md:\\ProgramData\\IntelPython3_2018\\lib\\site-packages\\sklearn\\model_selection\\_search.py\u001b[0m in \u001b[0;36mfit\u001b[1;34m(self, X, y, groups)\u001b[0m\n\u001b[0;32m 943\u001b[0m \u001b[0mtrain\u001b[0m\u001b[1;33m/\u001b[0m\u001b[0mtest\u001b[0m \u001b[0mset\u001b[0m\u001b[1;33m.\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 944\u001b[0m \"\"\"\n\u001b[1;32m--> 945\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_fit\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mX\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mgroups\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mParameterGrid\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mparam_grid\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 946\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 947\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"2017-10-27 13:45:18,746 - ALPHA_MIND - INFO - trade_date: 2015-07-22 00:00:00 training finished\n", "\u001b[1;32md:\\ProgramData\\IntelPython3_2018\\lib\\site-packages\\sklearn\\model_selection\\_search.py\u001b[0m in \u001b[0;36m_fit\u001b[1;34m(self, X, y, groups, parameter_iterable)\u001b[0m\n\u001b[0;32m 562\u001b[0m \u001b[0mreturn_times\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mreturn_parameters\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 563\u001b[0m error_score=self.error_score)\n\u001b[1;32m--> 564\u001b[1;33m \u001b[1;32mfor\u001b[0m \u001b[0mparameters\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mparameter_iterable\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 565\u001b[0m for train, test in cv_iter)\n\u001b[0;32m 566\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"2017-10-27 13:45:21,542 - ALPHA_MIND - INFO - trade_date: 2015-08-05 00:00:00 training finished\n", "\u001b[1;32md:\\ProgramData\\IntelPython3_2018\\lib\\site-packages\\sklearn\\externals\\joblib\\parallel.py\u001b[0m in \u001b[0;36m__call__\u001b[1;34m(self, iterable)\u001b[0m\n\u001b[0;32m 766\u001b[0m \u001b[1;31m# consumption.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 767\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_iterating\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;32mFalse\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 768\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mretrieve\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 769\u001b[0m \u001b[1;31m# Make sure that we get a last message telling us we are done\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 770\u001b[0m \u001b[0melapsed_time\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m-\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_start_time\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"2017-10-27 13:45:24,278 - ALPHA_MIND - INFO - trade_date: 2015-08-19 00:00:00 training finished\n", "\u001b[1;32md:\\ProgramData\\IntelPython3_2018\\lib\\site-packages\\sklearn\\externals\\joblib\\parallel.py\u001b[0m in \u001b[0;36mretrieve\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 717\u001b[0m \u001b[0mensure_ready\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_managed_backend\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 718\u001b[0m \u001b[0mbackend\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mabort_everything\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mensure_ready\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mensure_ready\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 719\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mexception\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 720\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 721\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m__call__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0miterable\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"2017-10-27 13:45:26,942 - ALPHA_MIND - INFO - trade_date: 2015-09-02 00:00:00 training finished\n", "\u001b[1;32md:\\ProgramData\\IntelPython3_2018\\lib\\site-packages\\sklearn\\externals\\joblib\\parallel.py\u001b[0m in \u001b[0;36mretrieve\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 680\u001b[0m \u001b[1;31m# check if timeout supported in backend future implementation\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 681\u001b[0m \u001b[1;32mif\u001b[0m \u001b[1;34m'timeout'\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mgetfullargspec\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mjob\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 682\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_output\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mjob\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 683\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 684\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_output\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mjob\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"2017-10-27 13:45:29,553 - ALPHA_MIND - INFO - trade_date: 2015-09-16 00:00:00 training finished\n", "\u001b[1;32md:\\ProgramData\\IntelPython3_2018\\lib\\multiprocessing\\pool.py\u001b[0m in \u001b[0;36mget\u001b[1;34m(self, timeout)\u001b[0m\n\u001b[0;32m 636\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 637\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mNone\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 638\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 639\u001b[0m \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mready\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 640\u001b[0m \u001b[1;32mraise\u001b[0m \u001b[0mTimeoutError\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"2017-10-27 13:45:32,140 - ALPHA_MIND - INFO - trade_date: 2015-09-30 00:00:00 training finished\n", "\u001b[1;32md:\\ProgramData\\IntelPython3_2018\\lib\\multiprocessing\\pool.py\u001b[0m in \u001b[0;36mwait\u001b[1;34m(self, timeout)\u001b[0m\n\u001b[0;32m 633\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 634\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mwait\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mNone\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 635\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_event\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 636\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 637\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mNone\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"2017-10-27 13:45:34,655 - ALPHA_MIND - INFO - trade_date: 2015-10-14 00:00:00 training finished\n", "\u001b[1;32md:\\ProgramData\\IntelPython3_2018\\lib\\threading.py\u001b[0m in \u001b[0;36mwait\u001b[1;34m(self, timeout)\u001b[0m\n\u001b[0;32m 549\u001b[0m \u001b[0msignaled\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_flag\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 550\u001b[0m \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0msignaled\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 551\u001b[1;33m \u001b[0msignaled\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_cond\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 552\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0msignaled\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 553\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"2017-10-27 13:45:37,224 - ALPHA_MIND - INFO - trade_date: 2015-10-28 00:00:00 training finished\n", "\u001b[1;32md:\\ProgramData\\IntelPython3_2018\\lib\\threading.py\u001b[0m in \u001b[0;36mwait\u001b[1;34m(self, timeout)\u001b[0m\n\u001b[0;32m 293\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m \u001b[1;31m# restore state no matter what (e.g., KeyboardInterrupt)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 294\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mtimeout\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 295\u001b[1;33m \u001b[0mwaiter\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0macquire\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 296\u001b[0m \u001b[0mgotit\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;32mTrue\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 297\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"2017-10-27 13:45:39,879 - ALPHA_MIND - INFO - trade_date: 2015-11-11 00:00:00 training finished\n", "\u001b[1;31mKeyboardInterrupt\u001b[0m: "
"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": [ "source": [
"for ref_date in dates:\n", "for i, ref_date in enumerate(dates):\n",
" sample_train_x = train_x[ref_date]\n", " sample_train_x = train_x[ref_date]\n",
" sample_train_y = train_y[ref_date].flatten()\n", " sample_train_y = train_y[ref_date].flatten()\n",
"\n",
" gsearch.fit(sample_train_x, sample_train_y)\n",
" accuray_table.loc[ref_date, 'train'] = gsearch.score(sample_train_x, sample_train_y)\n",
" alpha_logger.info('trade_date: {0} training finished'.format(ref_date))\n",
" \n", " \n",
" model = XGBRegressor(n_estimators=n_estimators,\n", " ##---------------------------------##\n",
" max_depth=max_depth,\n",
" n_jobs=-1)\n",
" model.fit(sample_train_x, sample_train_y)\n",
" \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_x = predict_x[ref_date]\n",
" sample_test_y = predict_y[ref_date].flatten()\n", " sample_test_y = predict_y[ref_date].flatten()\n",
" \n", " \n",
...@@ -537,13 +382,12 @@ ...@@ -537,13 +382,12 @@
" cons.set_constraints(name, benchmark_exp[k], benchmark_exp[k])\n", " cons.set_constraints(name, benchmark_exp[k], benchmark_exp[k])\n",
"\n", "\n",
" risk_table = total_risks[index]\n", " risk_table = total_risks[index]\n",
"\n", " \n",
" y = model.predict(sample_test_x)\n", " y = gsearch.predict(sample_test_x)\n",
" test_score = model.score(sample_test_x, sample_test_y)\n", " accuray_table.loc[ref_date, 'test'] = gsearch.score(sample_test_x, sample_test_y)\n",
" accuray_table.loc[ref_date, 'test'] = test_score\n",
"\n", "\n",
" is_tradable[:] = True\n", " is_tradable[:] = True\n",
" weights, analysis = er_portfolio_analysis(y,\n", " weights, analysis = er_portfolio_analysis(y.astype(float),\n",
" industry_names,\n", " industry_names,\n",
" realized_r,\n", " realized_r,\n",
" constraints=cons,\n", " constraints=cons,\n",
...@@ -553,15 +397,14 @@ ...@@ -553,15 +397,14 @@
" method=method)\n", " method=method)\n",
" \n", " \n",
" final_res[i] = analysis['er']['total'] / benchmark_w.sum()\n", " final_res[i] = analysis['er']['total'] / benchmark_w.sum()\n",
" alpha_logger.info('trade_date: {0} predicting finished'.format(ref_date))" " alpha_logger.info('trade_date: {0} predicting finished'.format(ref_date))\n",
" "
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": null,
"metadata": { "metadata": {},
"collapsed": true
},
"outputs": [], "outputs": [],
"source": [ "source": [
"last_date = advanceDateByCalendar('china.sse', dates[-1], frequency)\n", "last_date = advanceDateByCalendar('china.sse', dates[-1], frequency)\n",
...@@ -575,9 +418,7 @@ ...@@ -575,9 +418,7 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": null,
"metadata": { "metadata": {},
"collapsed": true
},
"outputs": [], "outputs": [],
"source": [ "source": [
"accuray_table.aggregate([np.mean, np.median, np.std])" "accuray_table.aggregate([np.mean, np.median, np.std])"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment