Commit 7223c542 authored by Dr.李's avatar Dr.李

FIX: bug for wrong optimal status

parent 62cd6faf
......@@ -104,7 +104,7 @@ def er_portfolio_analysis(er: np.ndarray,
risk_target=(risk_lbound, risk_ubound),
turn_over_target=turn_over_target,
current_position=current_position)
if status != 'optimal':
if status not in ("optimal", "optimal_inaccurate"):
raise ValueError('linear programming optimizer in status: {0}'.format(status))
elif method == 'rank':
......
......@@ -105,7 +105,7 @@ def linear_builder(er: np.ndarray,
current_risk_exposure <= risk_ubound.flatten(),
norm1(w - current_position) <= turn_over_target]
objective = Minimize(-w.T * er)
objective = Minimize(-w.T @ er)
prob = Problem(objective, constraints)
prob.solve(solver='ECOS', feastol=1e-10, abstol=1e-10, reltol=1e-10)
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -27,7 +27,7 @@
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
......@@ -50,7 +50,7 @@
},
{
"cell_type": "code",
"execution_count": 14,
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
......@@ -76,7 +76,7 @@
},
{
"cell_type": "code",
"execution_count": 15,
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
......@@ -111,7 +111,7 @@
},
{
"cell_type": "code",
"execution_count": 16,
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
......@@ -124,33 +124,26 @@
},
{
"cell_type": "code",
"execution_count": 17,
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2020-11-21 15:04:17,631 - ALPHA_MIND - INFO - alpha factor data loading finished ...\n",
"2020-11-21 15:04:17,780 - ALPHA_MIND - INFO - industry data loading finished ...\n",
"2020-11-21 15:04:17,875 - ALPHA_MIND - INFO - benchmark data loading finished ...\n",
"2020-11-21 15:04:18,105 - ALPHA_MIND - INFO - risk_model data loading finished ...\n",
"2020-11-21 15:04:19,012 - ALPHA_MIND - INFO - returns data loading finished ...\n",
"2020-11-21 15:04:19,134 - ALPHA_MIND - INFO - starting backting ...\n",
"2020-11-21 15:04:19,140 - ALPHA_MIND - INFO - alpha models training finished ...\n"
]
},
{
"ename": "AttributeError",
"evalue": "'DataFrame' object has no attribute 'trade_date'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-17-a539d65a51c9>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 9\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 10\u001b[0m \u001b[0mstrategy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mprepare_backtest_data\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 11\u001b[1;33m \u001b[0mret_df\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpositions\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mstrategy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mrunning_setting\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mrunning_setting\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\strategy\\strategy.py\u001b[0m in \u001b[0;36mrun\u001b[1;34m(self, running_setting)\u001b[0m\n\u001b[0;32m 258\u001b[0m \u001b[0mpositions\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'dx'\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtotal_data\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdx\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 259\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 260\u001b[1;33m \u001b[0mtrade_dates\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpositions\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtrade_date\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0munique\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 261\u001b[0m ret_df = pd.DataFrame({'returns': rets, 'turn_over': turn_overs, 'leverage': leverags},\n\u001b[0;32m 262\u001b[0m index=trade_dates)\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\pandas\\core\\generic.py\u001b[0m in \u001b[0;36m__getattr__\u001b[1;34m(self, name)\u001b[0m\n\u001b[0;32m 5137\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_info_axis\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_can_hold_identifiers_and_holds_name\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5138\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 5139\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mobject\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__getattribute__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mname\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 5140\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5141\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m__setattr__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mname\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m->\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mAttributeError\u001b[0m: 'DataFrame' object has no attribute 'trade_date'"
"2020-11-22 01:37:30,583 - ALPHA_MIND - INFO - alpha factor data loading finished ...\n",
"2020-11-22 01:37:30,745 - ALPHA_MIND - INFO - industry data loading finished ...\n",
"2020-11-22 01:37:30,878 - ALPHA_MIND - INFO - benchmark data loading finished ...\n",
"2020-11-22 01:37:31,240 - ALPHA_MIND - INFO - risk_model data loading finished ...\n",
"2020-11-22 01:37:31,909 - ALPHA_MIND - INFO - returns data loading finished ...\n",
"2020-11-22 01:37:32,006 - ALPHA_MIND - INFO - starting backting ...\n",
"2020-11-22 01:37:32,013 - ALPHA_MIND - INFO - alpha models training finished ...\n",
"2020-11-22 01:37:32,018 - ALPHA_MIND - INFO - 2020-01-02 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:32,037 - ALPHA_MIND - INFO - 2020-01-16 00:00:00 re-balance: 300 codes\n",
"D:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\cvxpy\\problems\\problem.py:1061: UserWarning: Solution may be inaccurate. Try another solver, adjusting the solver settings, or solve with verbose=True for more information.\n",
" \"Solution may be inaccurate. Try another solver, \"\n",
"2020-11-22 01:37:32,130 - ALPHA_MIND - INFO - 2020-02-07 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:32,218 - ALPHA_MIND - INFO - 2020-02-21 00:00:00 re-balance: 300 codes\n"
]
}
],
......@@ -170,27 +163,34 @@
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 7,
"metadata": {},
"outputs": [],
"outputs": [
{
"data": {
"text/plain": [
"<AxesSubplot:>"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA1EAAAGRCAYAAACE8jk3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAB9IUlEQVR4nO3dd3xV9f3H8de5N3sQSEISEhJG2HuEqUCAaF21ah3V1lFniwvbuhEEd1vrBPeu/RWtVqt1VARkL5E9w0oCZAeyk3vv+f7+uBJFgySB5Ga8n4+HD5Ock5PP/dxwct/3nO/3axljDCIiIiIiIlInDl8XICIiIiIi0pIoRImIiIiIiNSDQpSIiIiIiEg9KESJiIiIiIjUg0KUiIiIiIhIPShEiYiIiIiI1IOfrwv4KQcOHPB1CSIiIiIi0kzFx8f75OfqSpSIiIiIiEg9KESJiIiIiIjUg0KUiIiIiIhIPTTrMVEiIiIiIvVljKGyshLbtrEsy9flyAkyxuBwOAgKCmo2z6dClIiIiIi0KpWVlfj7++Pnp5e6rYXb7aayspLg4GBflwLodj4RERERaWVs21aAamX8/PywbdvXZdRQiBIRERGRVqW53PIlJ1dzel4VokREREREROpBIUpERERERKQeFKJERERERE6iw4cP8/rrr/u6jJMmJyeHK664otZt2dnZXHfddcc9Rs+ePWv9+meffcaOHTtqPp81axZLlixpWKFNSCFKREREROQkKi4u5s0336z393k8nkaopn7cbvePvvbiiy/y61//utZ94+LieOmllxr8834Yoq6++mpmz57d4OM1FU1bIiIiIiKtlv3PlzCZe07qMa3Ebjh+deyrLw8//DD79u3jtNNOY/z48UyePJnnn3++Jljde++9DBo0iEsuuYRRo0Zx7rnnsmjRIqZMmcLDDz/MRRddxBdffIHb7eaFF16gR48etf6coqIi/vjHP5KRkUFQUBB//vOf6dOnD2PGjOF///sfERERAJxyyil88MEHOBwO7rrrLvbv3w/AzJkzGTFiBI8//jh79+4lIyODhIQE5syZc9TP+eSTT7jjjjsAmDt3Lp9++illZWXYts2TTz7JlVdeyfz586moqGDq1Kls376d5ORkcnJyeOihhxg8eDAAjz76KPPmzSMoKIjXXnuNvXv38sUXX7BixQqeeuopXnrpJbp27UpRURG5ubnExMSc2BPViHQlSkRERETkJLrnnnvo0qULX3zxBffdd99x9+/QoQOff/45v/jFLwCIjIzk888/5/LLL+f5558/5vc9/vjjDBgwgHnz5nHXXXdx66234nA4+NnPfsZnn30GwNq1a+ncuTMdO3Zk+vTpXHfddXzyySe89NJL/OlPf6o51s6dO/nnP//5owCVkZFBREQEgYGBNV/buHEjL774Iu+9995R+77xxhtERESwcOFCbr/9djZs2FCzrby8nGHDhjFv3jxGjx7N22+/zYgRIzjttNOYNm0aX3zxBV27dgVg4MCBrF69+rh98yVdiRIRETnJDlW4mbspn4JyN5YFFhYOCywLHFjer1ngsIAj2wCH9e02+HZ/69vv8X58ZL+aj394vB8c2+L7x/vxxz86Xh2OXVMX/Ph4fK/mHzzuo2r44fF+cGyHty3HOd7Rx25OUx9L8/JTV4yai3PPPfeoz88880wABg0axKeffnrM71u1alXNrXSnnnoqRUVFlJSU8POf/5wnn3ySSy65hA8//LDm+IsXLz7q1rnS0lLKysoAOP3002tdyDYnJ4eoqChMRTnm66WM/3oem08dS4cOHWqt55prrgGgT58+9O3bt2ZbQEAAp512GuANSYsXLz7m44qKiiInJ+eY25sDhSgREZGTxDaGebsO8/o3uVS5DZ3bBWAAYwy24dgfG7C//fxHHxswfLffke8zeLeJ15FQ96NQ9v2wdayAxtHh8adCb32OXVswbaxjd+0QyClJ7XzSezk+Pz8/jPnuH2xVVdVR20NCQo76/MhVH6fT2aBxUikpKezdu5eCggI+//xzbr31VsC7CPFHH31EUFDQj77nhzUAGI+H6OwMbvArw/7jFeCqJjg4nPig0HrX5OfnV/Nmh9PprHXs1RFVVVW11ticKESJiIicBFmHq5izKpvNuRX0jwlmysg4OkcEHv8bT9CxApr9bQg7VkD7LpSZmnDm/Zr5dp9jHO9Hx/5+2Pvu53x/vx+HwmMc7/vf84PavF+r5Xg/ejzHON4Paqs53vce94+Od6yPv3+87/XKfVQf7aOP/f3+HufYNZ9//3moqfnYx7t4QBWXDYrWVblmIDQ0lNLS0prPExIS2LFjB1VVVVRWVrJkyRJGjBhxwj9n1KhRvP/++9x2220sW7aMyMhIwsPDATjjjDO4//77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IiIiIiIi9aAQJT9SWlqKbdsAaMhc3WzatInKykpfl9HiuN3umo/1uyZtgc6v9afza8Po/CrNVVVVVc3HLfl308/XBTSGefPmkZ+fzwUXXEBAQICvy2kxlixZwocffkiXLl2IiIjg8ssvx7IsX5fVrC1evJiPP/6YoUOH0qdPH1+X02IsWrSIzz//nG7duhEXF8c555yj37UWQufXhtH5tf50fm0YnV8b37x586iuruass87CGKP+1tGiRYv49NNP6datG507d+ass85q0b1rNSHKGIPH42H+/Pl8+OGH+Pv7M3jwYPr27evr0lqEjRs38vnnn3P11VfTvn17XnjhBQ4ePEinTp18XVqz5PF4+O9//8u///1v7r77bnr16uXrkpo9Ywwul4sPPviAzZs3c/nll+N2u3n33Xfp2rUrAwYM8HWJcgw6v54YnV/rR+fX+tP5tWlUV1fz8ccf8/nnn1NdXU1KSgoxMTG+LqtFWLVqFV9++SWXX3455eXlLF68mLFjx9K+fXtfl9ZgreJ2PrfbjWVZ+Pn50a1bN5544gnS0tJYsGABJSUlvi6v2fr+pf59+/YxbNgw+vbti8vlIjIykoiICB9W17w5nU46derEuHHj6NixI263mxUrVlBYWOjr0pqlI/9GAwICSEpK4vbbb6dPnz706dOH3r17c+jQIV+XKMeg82vD6PzacDq/1o/Or43vyC24AQEBdO/enRdeeIHJkyfzz3/+08eVNW9H+gawZcsWTj31VPr160dQUBDBwcEtOkBBK1gn6t133yUjI4Phw4eTkpJCWFgY4H234M9//jOTJk1i9OjROBytIi+eNEf6NmzYMCZMmMC2bduYO3cukZGRbNu2jaSkJCzLokePHlx44YXYtt3me/j+++8zcOBAevbsCcDhw4f56quvWLx4MbZt06VLFw4fPkz//v254IIL1LNv/fvf/2b//v3079+f0aNHExQUBHjfOXU4HDzyyCOcfvrpDB8+3MeVyg/p/NowOr/Wn86vDaPza+N75513KC4uZsCAAYwePbrmd6+yspI77riD66+/ngEDBuh38gd+2LcVK1Ywd+5cevbsyYYNG+jcuTPh4eH07duX008/vUX2r2VV+wMff/wx27dv5/TTT2fjxo28++67FBUVAd53C1JTU1myZAl5eXk+rrR5+WHfXn/9dbp27cp9991H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\n",
"text/plain": [
"<Figure size 1008x504 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ret_df[['turn_over', 'excess_return']].cumsum().plot(figsize=(14, 7), secondary_y='turn_over')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
......
......@@ -38,11 +38,11 @@
"name": "stderr",
"output_type": "stream",
"text": [
"2020-11-21 15:05:55,114 - ALPHA_MIND - INFO - alpha factor data loading finished ...\n",
"2020-11-21 15:05:55,271 - ALPHA_MIND - INFO - industry data loading finished ...\n",
"2020-11-21 15:05:55,384 - ALPHA_MIND - INFO - benchmark data loading finished ...\n",
"2020-11-21 15:05:55,871 - ALPHA_MIND - INFO - risk_model data loading finished ...\n",
"2020-11-21 15:05:56,836 - ALPHA_MIND - INFO - returns data loading finished ...\n"
"2020-11-22 01:37:39,662 - ALPHA_MIND - INFO - alpha factor data loading finished ...\n",
"2020-11-22 01:37:39,820 - ALPHA_MIND - INFO - industry data loading finished ...\n",
"2020-11-22 01:37:39,959 - ALPHA_MIND - INFO - benchmark data loading finished ...\n",
"2020-11-22 01:37:40,318 - ALPHA_MIND - INFO - risk_model data loading finished ...\n",
"2020-11-22 01:37:41,003 - ALPHA_MIND - INFO - returns data loading finished ...\n"
]
}
],
......@@ -169,22 +169,40 @@
"name": "stderr",
"output_type": "stream",
"text": [
"2020-11-21 15:06:00,110 - ALPHA_MIND - INFO - starting backting ...\n",
"2020-11-21 15:06:00,113 - ALPHA_MIND - INFO - alpha models training finished ...\n"
"2020-11-22 01:37:41,157 - ALPHA_MIND - INFO - starting backting ...\n",
"2020-11-22 01:37:41,163 - ALPHA_MIND - INFO - alpha models training finished ...\n",
"2020-11-22 01:37:41,170 - ALPHA_MIND - INFO - 2020-01-02 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:41,188 - ALPHA_MIND - INFO - 2020-01-16 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:41,233 - ALPHA_MIND - INFO - 2020-02-07 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:41,278 - ALPHA_MIND - INFO - 2020-02-21 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:41,340 - ALPHA_MIND - INFO - weight_gap: 0.005 finished\n",
"2020-11-22 01:37:41,341 - ALPHA_MIND - INFO - starting backting ...\n",
"2020-11-22 01:37:41,350 - ALPHA_MIND - INFO - 2020-01-02 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:41,362 - ALPHA_MIND - INFO - 2020-01-16 00:00:00 re-balance: 300 codes\n",
"D:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\cvxpy\\problems\\problem.py:1061: UserWarning: Solution may be inaccurate. Try another solver, adjusting the solver settings, or solve with verbose=True for more information.\n",
" \"Solution may be inaccurate. Try another solver, \"\n",
"2020-11-22 01:37:41,444 - ALPHA_MIND - INFO - 2020-02-07 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:41,526 - ALPHA_MIND - INFO - 2020-02-21 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:41,619 - ALPHA_MIND - INFO - weight_gap: 0.01 finished\n",
"2020-11-22 01:37:41,620 - ALPHA_MIND - INFO - starting backting ...\n",
"2020-11-22 01:37:41,627 - ALPHA_MIND - INFO - 2020-01-02 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:41,644 - ALPHA_MIND - INFO - 2020-01-16 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:41,730 - ALPHA_MIND - INFO - 2020-02-07 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:41,818 - ALPHA_MIND - INFO - 2020-02-21 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:41,907 - ALPHA_MIND - INFO - weight_gap: 0.015 finished\n",
"2020-11-22 01:37:41,909 - ALPHA_MIND - INFO - starting backting ...\n",
"2020-11-22 01:37:41,915 - ALPHA_MIND - INFO - 2020-01-02 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:41,931 - ALPHA_MIND - INFO - 2020-01-16 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:42,012 - ALPHA_MIND - INFO - 2020-02-07 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:42,099 - ALPHA_MIND - INFO - 2020-02-21 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:42,196 - ALPHA_MIND - INFO - weight_gap: 0.02 finished\n"
]
},
{
"ename": "AttributeError",
"evalue": "'DataFrame' object has no attribute 'trade_date'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<timed exec>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n",
"\u001b[1;32m<ipython-input-2-cc4463b9a60f>\u001b[0m in \u001b[0;36mcreate_scenario\u001b[1;34m(weights_bandwidth, target_vol, method)\u001b[0m\n\u001b[0;32m 73\u001b[0m turn_over_target=0.4)\n\u001b[0;32m 74\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 75\u001b[1;33m \u001b[0mret_df\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpositions\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mstrategy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mrunning_setting\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 76\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mret_df\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\strategy\\strategy.py\u001b[0m in \u001b[0;36mrun\u001b[1;34m(self, running_setting)\u001b[0m\n\u001b[0;32m 258\u001b[0m \u001b[0mpositions\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'dx'\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtotal_data\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdx\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 259\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 260\u001b[1;33m \u001b[0mtrade_dates\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpositions\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtrade_date\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0munique\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 261\u001b[0m ret_df = pd.DataFrame({'returns': rets, 'turn_over': turn_overs, 'leverage': leverags},\n\u001b[0;32m 262\u001b[0m index=trade_dates)\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\pandas\\core\\generic.py\u001b[0m in \u001b[0;36m__getattr__\u001b[1;34m(self, name)\u001b[0m\n\u001b[0;32m 5137\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_info_axis\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_can_hold_identifiers_and_holds_name\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5138\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 5139\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mobject\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__getattribute__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mname\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 5140\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5141\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m__setattr__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mname\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m->\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mAttributeError\u001b[0m: 'DataFrame' object has no attribute 'trade_date'"
"name": "stdout",
"output_type": "stream",
"text": [
"Wall time: 1.14 s\n"
]
}
],
......@@ -209,21 +227,37 @@
"name": "stderr",
"output_type": "stream",
"text": [
"2020-11-21 15:06:14,030 - ALPHA_MIND - INFO - starting backting ...\n"
"2020-11-22 01:37:42,295 - ALPHA_MIND - INFO - starting backting ...\n",
"2020-11-22 01:37:42,304 - ALPHA_MIND - INFO - 2020-01-02 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:42,383 - ALPHA_MIND - INFO - 2020-01-16 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:42,468 - ALPHA_MIND - INFO - 2020-02-07 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:42,576 - ALPHA_MIND - INFO - 2020-02-21 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:42,684 - ALPHA_MIND - INFO - target_vol: 0.0150 finished\n",
"2020-11-22 01:37:42,686 - ALPHA_MIND - INFO - starting backting ...\n",
"2020-11-22 01:37:42,691 - ALPHA_MIND - INFO - 2020-01-02 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:42,748 - ALPHA_MIND - INFO - 2020-01-16 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:42,813 - ALPHA_MIND - INFO - 2020-02-07 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:42,891 - ALPHA_MIND - INFO - 2020-02-21 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:42,977 - ALPHA_MIND - INFO - target_vol: 0.0300 finished\n",
"2020-11-22 01:37:42,979 - ALPHA_MIND - INFO - starting backting ...\n",
"2020-11-22 01:37:42,986 - ALPHA_MIND - INFO - 2020-01-02 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:43,025 - ALPHA_MIND - INFO - 2020-01-16 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:43,087 - ALPHA_MIND - INFO - 2020-02-07 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:43,152 - ALPHA_MIND - INFO - 2020-02-21 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:43,221 - ALPHA_MIND - INFO - target_vol: 0.0450 finished\n",
"2020-11-22 01:37:43,223 - ALPHA_MIND - INFO - starting backting ...\n",
"2020-11-22 01:37:43,230 - ALPHA_MIND - INFO - 2020-01-02 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:43,267 - ALPHA_MIND - INFO - 2020-01-16 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:43,320 - ALPHA_MIND - INFO - 2020-02-07 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:43,379 - ALPHA_MIND - INFO - 2020-02-21 00:00:00 re-balance: 300 codes\n",
"2020-11-22 01:37:43,452 - ALPHA_MIND - INFO - target_vol: 0.0600 finished\n"
]
},
{
"ename": "AttributeError",
"evalue": "'DataFrame' object has no attribute 'trade_date'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<timed exec>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n",
"\u001b[1;32m<ipython-input-2-cc4463b9a60f>\u001b[0m in \u001b[0;36mcreate_scenario\u001b[1;34m(weights_bandwidth, target_vol, method)\u001b[0m\n\u001b[0;32m 73\u001b[0m turn_over_target=0.4)\n\u001b[0;32m 74\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 75\u001b[1;33m \u001b[0mret_df\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpositions\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mstrategy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mrunning_setting\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 76\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mret_df\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\strategy\\strategy.py\u001b[0m in \u001b[0;36mrun\u001b[1;34m(self, running_setting)\u001b[0m\n\u001b[0;32m 258\u001b[0m \u001b[0mpositions\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'dx'\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtotal_data\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdx\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 259\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 260\u001b[1;33m \u001b[0mtrade_dates\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpositions\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtrade_date\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0munique\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 261\u001b[0m ret_df = pd.DataFrame({'returns': rets, 'turn_over': turn_overs, 'leverage': leverags},\n\u001b[0;32m 262\u001b[0m index=trade_dates)\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\pandas\\core\\generic.py\u001b[0m in \u001b[0;36m__getattr__\u001b[1;34m(self, name)\u001b[0m\n\u001b[0;32m 5137\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_info_axis\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_can_hold_identifiers_and_holds_name\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5138\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 5139\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mobject\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__getattribute__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mname\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 5140\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5141\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m__setattr__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mname\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m->\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mAttributeError\u001b[0m: 'DataFrame' object has no attribute 'trade_date'"
"name": "stdout",
"output_type": "stream",
"text": [
"Wall time: 1.23 s\n"
]
}
],
......
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