Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
A
alpha-mind
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Dr.李
alpha-mind
Commits
7194823b
Commit
7194823b
authored
Mar 28, 2018
by
Dr.李
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of
https://git.coding.net/wegamekinglc/Alpha-Mind
parents
daecb8c6
35776ac2
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
239 additions
and
171 deletions
+239
-171
Example 7 - Portfolio Optimizer Performance.ipynb
notebooks/Example 7 - Portfolio Optimizer Performance.ipynb
+239
-171
No files found.
notebooks/Example 7 - Portfolio Optimizer Performance.ipynb
View file @
7194823b
...
...
@@ -8,7 +8,7 @@
"source": [
"* 比较不同组合组合优化器在不同规模问题上的性能;\n",
"\n",
"* 下面的结果主要比较``alphamind``和``
sicpy``中内置优化器的性能差别
;\n",
"* 下面的结果主要比较``alphamind``和``
python``中其他优化器的性能差别,我们将尽可能使用``cvxopt``中的优化器,其次选择``scipy``
;\n",
"\n",
"* 由于``scipy``在``ashare_ex``上面性能太差,所以一般忽略``scipy``在这个股票池上的表现;\n",
"\n",
...
...
@@ -24,6 +24,8 @@
"import timeit\n",
"import numpy as np\n",
"import pandas as pd\n",
"import cvxpy\n",
"from cvxopt import solvers\n",
"from scipy.optimize import linprog\n",
"from scipy.optimize import minimize\n",
"from alphamind.api import *\n",
...
...
@@ -49,8 +51,8 @@
"outputs": [],
"source": [
"ref_date = '2018-02-08'\n",
"u_names = ['sh50', 'hs300', 'zz500', 'zz800', 'ashare_ex']\n",
"b_codes = [16, 300, 905, 906, None]\n",
"u_names = ['sh50', 'hs300', 'zz500', 'zz800', '
zz1000', '
ashare_ex']\n",
"b_codes = [16, 300, 905, 906,
852,
None]\n",
"risk_model = 'short'\n",
"factor = 'EPS'\n",
"lb = 0.0\n",
...
...
@@ -80,46 +82,55 @@
"name": "stderr",
"output_type": "stream",
"text": [
"2018-03-26 22:21:59,192 - ALPHA_MIND - INFO - sh50 is finished\n",
"2018-03-26 22:21:59,346 - ALPHA_MIND - INFO - hs300 is finished\n",
"2018-03-26 22:21:59,940 - ALPHA_MIND - INFO - zz500 is finished\n",
"2018-03-26 22:22:02,388 - ALPHA_MIND - INFO - zz800 is finished\n",
"2018-03-26 22:22:02,396 - ALPHA_MIND - INFO - ashare_ex is finished\n"
"2018-03-28 12:46:50,110 - ALPHA_MIND - INFO - sh50 is finished\n",
"2018-03-28 12:46:50,131 - ALPHA_MIND - INFO - hs300 is finished\n",
"2018-03-28 12:46:50,156 - ALPHA_MIND - INFO - zz500 is finished\n",
"2018-03-28 12:46:50,193 - ALPHA_MIND - INFO - zz800 is finished\n",
"2018-03-28 12:46:50,244 - ALPHA_MIND - INFO - zz1000 is finished\n",
"2018-03-28 12:46:50,830 - ALPHA_MIND - INFO - ashare_ex is finished\n"
]
}
],
"source": [
"df = pd.DataFrame(columns=u_names, index=['
sci
py', 'alphamind'])\n",
"df = pd.DataFrame(columns=u_names, index=['
cvx
py', 'alphamind'])\n",
"\n",
"number = 1\n",
"\n",
"for u_name, sample_data in zip(u_names, data_set):\n",
" factor_data = sample_data['factor']\n",
" er = factor_data[factor].values\n",
" lbound = np.ones(len(er)) * lb\n",
" ubound = np.ones(len(er)) * ub\n",
"\n",
" risk_constraints = np.ones((len(er), 1))\n",
" n = len(er)\n",
" lbound = np.ones(n) * lb\n",
" ubound = np.ones(n) * ub\n",
" \n",
" risk_constraints = np.ones((n, 1))\n",
" risk_target = (np.array([1.]), np.array([1.]))\n",
"\n",
" status, y, x1 = linear_builder(er, lbound, ubound, risk_constraints, risk_target)\n",
" elasped_time1 = timeit.timeit(\"linear_builder(er, lbound, ubound, risk_constraints, risk_target)\", number=number, globals=globals()) / number * 1000\n",
"\n",
" c = -er\n",
" A_eq = risk_constraints.T\n",
" b_eq = np.array([1.])\n",
" \n",
" if u_name != 'ashare_ex':\n",
" res = linprog(c, A_ub=None, b_ub=None, A_eq=A_eq, b_eq=b_eq, bounds=list(zip(lbound, ubound)))\n",
" elasped_time2 = timeit.timeit(\"linprog(c, A_ub=None, b_ub=None, A_eq=A_eq, b_eq=b_eq, bounds=list(zip(lbound, ubound)))\",\n",
" number=number, globals=globals()) / number * 1000\n",
" x2 = res['x']\n",
" np.testing.assert_array_almost_equal(x1, x2, 4)\n",
" else:\n",
" elasped_time2 = np.nan\n",
" solvers.options['glpk'] = {'msg_lev': 'GLP_MSG_OFF'}\n",
" w = cvxpy.Variable(n)\n",
" curr_risk_exposure = risk_constraints.T @ w\n",
" \n",
" constraints = [w >= lbound,\n",
" w <= ubound,\n",
" curr_risk_exposure == risk_target[0]]\n",
" \n",
" objective = cvxpy.Minimize(-w.T * er)\n",
" prob = cvxpy.Problem(objective, constraints)\n",
" \n",
" prob.solve(solver='GLPK')\n",
" elasped_time2 = timeit.timeit(\"prob.solve(solver='GLPK')\",\n",
" number=number, globals=globals()) / number * 1000\n",
"\n",
" np.testing.assert_almost_equal(x1 @ er, np.array(w.value).flatten() @ er, 4)\n",
"\n",
" df.loc['alphamind', u_name] = elasped_time1\n",
" df.loc['
sci
py', u_name] = elasped_time2\n",
" df.loc['
cvx
py', u_name] = elasped_time2\n",
" alpha_logger.info(f\"{u_name} is finished\")"
]
},
...
...
@@ -153,34 +164,37 @@
" <th>hs300</th>\n",
" <th>zz500</th>\n",
" <th>zz800</th>\n",
" <th>zz1000</th>\n",
" <th>ashare_ex</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>scipy</th>\n",
" <td>20.94</td>\n",
" <td>73.66</td>\n",
" <td>295.75</td>\n",
" <td>1,207.40</td>\n",
" <td>NaN</td>\n",
" <th>cvxpy</th>\n",
" <td>2.69</td>\n",
" <td>6.37</td>\n",
" <td>7.28</td>\n",
" <td>12.55</td>\n",
" <td>20.09</td>\n",
" <td>325.88</td>\n",
" </tr>\n",
" <tr>\n",
" <th>alphamind</th>\n",
" <td>0.32</td>\n",
" <td>0.31</td>\n",
" <td>0.38</td>\n",
" <td>0.59</td>\n",
" <td>2.66</td>\n",
" <td>0.34</td>\n",
" <td>0.58</td>\n",
" <td>0.70</td>\n",
" <td>0.92</td>\n",
" <td>1.08</td>\n",
" <td>3.08</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"
sh50 hs300 zz500 zz8
00 ashare_ex\n",
"
scipy 20.94 73.66 295.75 1,207.40 NaN
\n",
"alphamind
0.32 0.31 0.38 0.59 2.66
"
"
sh50 hs300 zz500 zz800 zz10
00 ashare_ex\n",
"
cvxpy 2.69 6.37 7.28 12.55 20.09 325.88
\n",
"alphamind
0.34 0.58 0.70 0.92 1.08 3.08
"
]
},
"execution_count": 4,
...
...
@@ -209,24 +223,28 @@
"name": "stderr",
"output_type": "stream",
"text": [
"2018-03-26 22:22:02,962 - ALPHA_MIND - INFO - sh50 is finished\n",
"2018-03-26 22:22:02,986 - ALPHA_MIND - INFO - hs300 is finished\n",
"2018-03-26 22:22:03,063 - ALPHA_MIND - INFO - zz500 is finished\n",
"2018-03-26 22:22:03,254 - ALPHA_MIND - INFO - zz800 is finished\n",
"2018-03-26 22:22:08,004 - ALPHA_MIND - INFO - ashare_ex is finished\n"
"2018-03-28 12:46:51,048 - ALPHA_MIND - INFO - sh50 is finished\n",
"2018-03-28 12:46:51,157 - ALPHA_MIND - INFO - hs300 is finished\n",
"2018-03-28 12:46:51,442 - ALPHA_MIND - INFO - zz500 is finished\n",
"2018-03-28 12:46:52,102 - ALPHA_MIND - INFO - zz800 is finished\n",
"2018-03-28 12:46:53,172 - ALPHA_MIND - INFO - zz1000 is finished\n",
"2018-03-28 12:47:04,916 - ALPHA_MIND - INFO - ashare_ex is finished\n"
]
}
],
"source": [
"df = pd.DataFrame(columns=u_names, index=['alphamind'])\n",
"from cvxpy import pnorm\n",
"\n",
"df = pd.DataFrame(columns=u_names, index=['cvxpy', 'alphamind'])\n",
"turn_over_target = 0.5\n",
"number = 1\n",
"\n",
"for u_name, sample_data in zip(u_names, data_set):\n",
" factor_data = sample_data['factor']\n",
" er = factor_data[factor].values\n",
" lbound = np.ones(len(er)) * lb\n",
" ubound = np.ones(len(er)) * ub\n",
" n = len(er)\n",
" lbound = np.ones(n) * lb\n",
" ubound = np.ones(n) * ub\n",
" \n",
" if 'weight' in factor_data:\n",
" current_position = factor_data.weight.values\n",
...
...
@@ -238,10 +256,25 @@
"\n",
" status, y, x1 = linear_builder(er, lbound, ubound, risk_constraints, risk_target, turn_over_target=turn_over_target, current_position=current_position)\n",
" elasped_time1 = timeit.timeit(\"linear_builder(er, lbound, ubound, risk_constraints, risk_target, turn_over_target=turn_over_target, current_position=current_position)\", number=number, globals=globals()) / number * 1000\n",
"\n",
" np.testing.assert_almost_equal(np.abs(x1 - current_position).sum(), 0.5)\n",
" \n",
" w = cvxpy.Variable(n)\n",
" curr_risk_exposure = risk_constraints.T @ w\n",
" \n",
" constraints = [w >= lbound,\n",
" w <= ubound,\n",
" curr_risk_exposure == risk_target[0],\n",
" pnorm(w - current_position, 1) <= turn_over_target]\n",
" \n",
" objective = cvxpy.Minimize(-w.T * er)\n",
" prob = cvxpy.Problem(objective, constraints)\n",
" \n",
" prob.solve(solver='GLPK')\n",
" elasped_time2 = timeit.timeit(\"prob.solve(solver='GLPK')\",\n",
" number=number, globals=globals()) / number * 1000\n",
" np.testing.assert_almost_equal(x1 @ er, np.array(w.value).flatten() @ er, 4)\n",
"\n",
" df.loc['alphamind', u_name] = elasped_time1\n",
" df.loc['cvxpy', u_name] = elasped_time2\n",
" alpha_logger.info(f\"{u_name} is finished\")"
]
},
...
...
@@ -275,25 +308,37 @@
" <th>hs300</th>\n",
" <th>zz500</th>\n",
" <th>zz800</th>\n",
" <th>zz1000</th>\n",
" <th>ashare_ex</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>cvxpy</th>\n",
" <td>4.26</td>\n",
" <td>28.31</td>\n",
" <td>67.48</td>\n",
" <td>164.81</td>\n",
" <td>256.14</td>\n",
" <td>2,561.17</td>\n",
" </tr>\n",
" <tr>\n",
" <th>alphamind</th>\n",
" <td>0.89</td>\n",
" <td>11.30</td>\n",
" <td>36.35</td>\n",
" <td>93.81</td>\n",
" <td>2,372.76</td>\n",
" <td>1.22</td>\n",
" <td>20.28</td>\n",
" <td>67.10</td>\n",
" <td>154.95</td>\n",
" <td>267.17</td>\n",
" <td>3,314.10</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" sh50 hs300 zz500 zz800 ashare_ex\n",
"alphamind 0.89 11.30 36.35 93.81 2,372.76"
" sh50 hs300 zz500 zz800 zz1000 ashare_ex\n",
"cvxpy 4.26 28.31 67.48 164.81 256.14 2,561.17\n",
"alphamind 1.22 20.28 67.10 154.95 267.17 3,314.10"
]
},
"execution_count": 6,
...
...
@@ -324,16 +369,19 @@
"name": "stderr",
"output_type": "stream",
"text": [
"2018-03-26 22:22:14,212 - ALPHA_MIND - INFO - sh50 is finished\n",
"2018-03-26 22:22:14,523 - ALPHA_MIND - INFO - hs300 is finished\n",
"2018-03-26 22:22:14,973 - ALPHA_MIND - INFO - zz500 is finished\n",
"2018-03-26 22:22:16,365 - ALPHA_MIND - INFO - zz800 is finished\n",
"2018-03-26 22:23:11,227 - ALPHA_MIND - INFO - ashare_ex is finished\n"
"2018-03-28 12:47:05,225 - ALPHA_MIND - INFO - sh50 is finished\n",
"2018-03-28 12:47:06,047 - ALPHA_MIND - INFO - hs300 is finished\n",
"2018-03-28 12:47:07,931 - ALPHA_MIND - INFO - zz500 is finished\n",
"2018-03-28 12:47:13,124 - ALPHA_MIND - INFO - zz800 is finished\n",
"2018-03-28 12:47:20,586 - ALPHA_MIND - INFO - zz1000 is finished\n",
"2018-03-28 12:50:28,528 - ALPHA_MIND - INFO - ashare_ex is finished\n"
]
}
],
"source": [
"df = pd.DataFrame(columns=u_names, index=['alphamind', 'direct'])\n",
"from cvxpy import quad_form\n",
"\n",
"df = pd.DataFrame(columns=u_names, index=['cvxpy', 'alphamind'])\n",
"number = 1\n",
"\n",
"for u_name, sample_data in zip(u_names, data_set):\n",
...
...
@@ -344,22 +392,32 @@
" special_risk = factor_data.srisk.values\n",
" sec_cov = risk_exposure @ risk_cov @ risk_exposure.T / 10000 + np.diag(special_risk ** 2) / 10000\n",
" er = factor_data[factor].values\n",
" n = len(er)\n",
"\n",
" bm = np.zeros(
len(er)
)\n",
" lbound = -np.ones(
len(er)
) * np.inf\n",
" ubound = np.ones(
len(er)
) * np.inf\n",
" bm = np.zeros(
n
)\n",
" lbound = -np.ones(
n
) * np.inf\n",
" ubound = np.ones(
n
) * np.inf\n",
"\n",
" status, y, x1 = mean_variance_builder(er, sec_cov, bm, lbound, ubound, None, None, lam=1)\n",
" elasped_time1 = timeit.timeit(\"mean_variance_builder(er, sec_cov, bm, lbound, ubound, None, None, lam=1)\",\n",
" number=number, globals=globals()) / number * 1000\n",
" x2 = np.linalg.inv(sec_cov) @ er\n",
" elasped_time2 = timeit.timeit(\"np.linalg.inv(sec_cov) @ er\",\n",
" \n",
" w = cvxpy.Variable(n)\n",
" risk = quad_form(w, sec_cov)\n",
" objective = cvxpy.Minimize(-w.T * er + 0.5 * risk)\n",
" prob = cvxpy.Problem(objective)\n",
" prob.solve(solver='CVXOPT')\n",
" elasped_time2 = timeit.timeit(\"prob.solve(solver='CVXOPT')\",\n",
" number=number, globals=globals()) / number * 1000\n",
"\n",
" np.testing.assert_array_almost_equal(x1, x2, 4)\n",
" \n",
" u1 = -x1 @ er + 0.5 * x1 @ sec_cov @ x1\n",
" x2 = np.array(w.value).flatten()\n",
" u2 = -x2 @ er + 0.5 * x2 @ sec_cov @ x2\n",
" \n",
" np.testing.assert_array_almost_equal(u1, u2, 4)\n",
"\n",
" df.loc['alphamind', u_name] = elasped_time1\n",
" df.loc['
direct
', u_name] = elasped_time2\n",
" df.loc['
cvxpy
', u_name] = elasped_time2\n",
" alpha_logger.info(f\"{u_name} is finished\")"
]
},
...
...
@@ -393,34 +451,37 @@
" <th>hs300</th>\n",
" <th>zz500</th>\n",
" <th>zz800</th>\n",
" <th>zz1000</th>\n",
" <th>ashare_ex</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>alphamind</th>\n",
" <td>42.10</td>\n",
" <td>114.71</td>\n",
" <td>175.51</td>\n",
" <td>561.04</td>\n",
" <td>25,991.58</td>\n",
" <th>cvxpy</th>\n",
" <td>13.26</td>\n",
" <td>166.37</td>\n",
" <td>493.95</td>\n",
" <td>1,635.71</td>\n",
" <td>2,359.22</td>\n",
" <td>51,708.15</td>\n",
" </tr>\n",
" <tr>\n",
" <th>direct</th>\n",
" <td>0.14</td>\n",
" <td>2.63</td>\n",
" <td>10.06</td>\n",
" <td>37.57</td>\n",
" <td>1,722.59</td>\n",
" <th>alphamind</th>\n",
" <td>68.57</td>\n",
" <td>205.78</td>\n",
" <td>317.68</td>\n",
" <td>670.81</td>\n",
" <td>915.77</td>\n",
" <td>32,733.73</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" sh50 hs300 zz500
zz8
00 ashare_ex\n",
"
alphamind 42.10 114.71 175.51 561.04 25,991.58
\n",
"
direct 0.14 2.63 10.06 37.57 1,722.59
"
" sh50 hs300 zz500
zz800 zz10
00 ashare_ex\n",
"
cvxpy 13.26 166.37 493.95 1,635.71 2,359.22 51,708.15
\n",
"
alphamind 68.57 205.78 317.68 670.81 915.77 32,733.73
"
]
},
"execution_count": 8,
...
...
@@ -448,22 +509,17 @@
"name": "stderr",
"output_type": "stream",
"text": [
"2018-03-26 22:23:11,862 - ALPHA_MIND - INFO - sh50 is finished\n",
"2018-03-26 22:23:13,992 - ALPHA_MIND - INFO - hs300 is finished\n",
"2018-03-26 22:25:38,790 - ALPHA_MIND - INFO - zz500 is finished\n",
"2018-03-26 22:29:08,827 - ALPHA_MIND - INFO - zz800 is finished\n",
"2018-03-26 22:29:10,259 - ALPHA_MIND - INFO - ashare_ex is finished\n"
"2018-03-28 12:50:29,489 - ALPHA_MIND - INFO - sh50 is finished\n",
"2018-03-28 12:50:30,295 - ALPHA_MIND - INFO - hs300 is finished\n",
"2018-03-28 12:50:33,286 - ALPHA_MIND - INFO - zz500 is finished\n",
"2018-03-28 12:50:39,842 - ALPHA_MIND - INFO - zz800 is finished\n",
"2018-03-28 12:50:55,691 - ALPHA_MIND - INFO - zz1000 is finished\n",
"2018-03-28 12:57:46,604 - ALPHA_MIND - INFO - ashare_ex is finished\n"
]
}
],
"source": [
"def func(x):\n",
" return 0.5 * x @ sec_cov @ x - er @ x\n",
"\n",
"def con_func(x):\n",
" return x.sum() - 1.\n",
"\n",
"df = pd.DataFrame(columns=u_names, index=['alphamind', 'scipy'])\n",
"df = pd.DataFrame(columns=u_names, index=['cvxpy', 'alphamind'])\n",
"number = 1\n",
"\n",
"for u_name, sample_data in zip(u_names, data_set):\n",
...
...
@@ -474,10 +530,11 @@
" special_risk = factor_data.srisk.values\n",
" sec_cov = risk_exposure @ risk_cov @ risk_exposure.T / 10000 + np.diag(special_risk ** 2) / 10000\n",
" er = factor_data[factor].values\n",
" n = len(er)\n",
" \n",
" bm = np.zeros(
len(er)
)\n",
" lbound = np.zeros(
len(er)
)\n",
" ubound = np.ones(
len(er)
) * 0.1\n",
" bm = np.zeros(
n
)\n",
" lbound = np.zeros(
n
)\n",
" ubound = np.ones(
n
) * 0.1\n",
" \n",
" risk_constraints = np.ones((len(er), 1))\n",
" risk_target = (np.array([1.]), np.array([1.]))\n",
...
...
@@ -486,20 +543,26 @@
" elasped_time1 = timeit.timeit(\"mean_variance_builder(er, sec_cov, bm, lbound, ubound, None, None, lam=1)\",\n",
" number=number, globals=globals()) / number * 1000\n",
" \n",
" cons = [dict(type='eq', fun=con_func)]\n",
" \n",
" if u_name != 'ashare_ex':\n",
" res = minimize(func, np.zeros(len(er)), bounds=list(zip(lbound, ubound)), constraints=cons, tol=1e-12)\n",
" x2 = res['x']\n",
" elasped_time2 = timeit.timeit(\"minimize(func, np.zeros(len(er)), bounds=list(zip(lbound, ubound)), constraints=cons, tol=1e-12)\",\n",
" number=number, globals=globals()) / number * 1000\n",
" w = cvxpy.Variable(n)\n",
" risk = quad_form(w, sec_cov)\n",
" objective = cvxpy.Minimize(-w.T * er + 0.5 * risk)\n",
" curr_risk_exposure = risk_constraints.T @ w\n",
" constraints = [w >= lbound,\n",
" w <= ubound,\n",
" curr_risk_exposure == risk_target[0]]\n",
" prob = cvxpy.Problem(objective, constraints)\n",
" prob.solve(solver='CVXOPT')\n",
" elasped_time2 = timeit.timeit(\"prob.solve(solver='CVXOPT')\",\n",
" number=number, globals=globals()) / number * 1000\n",
"\n",
" np.testing.assert_array_almost_equal(x1, x2, 4)\n",
" else:\n",
" elasped_time2 = np.nan\n",
" u1 = -x1 @ er + 0.5 * x1 @ sec_cov @ x1\n",
" x2 = np.array(w.value).flatten()\n",
" u2 = -x2 @ er + 0.5 * x2 @ sec_cov @ x2\n",
" \n",
" np.testing.assert_array_almost_equal(u1, u2, 4)\n",
"\n",
" df.loc['alphamind', u_name] = elasped_time1\n",
" df.loc['
sci
py', u_name] = elasped_time2\n",
" df.loc['
cvx
py', u_name] = elasped_time2\n",
" alpha_logger.info(f\"{u_name} is finished\")"
]
},
...
...
@@ -533,34 +596,37 @@
" <th>hs300</th>\n",
" <th>zz500</th>\n",
" <th>zz800</th>\n",
" <th>zz1000</th>\n",
" <th>ashare_ex</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>alphamind</th>\n",
" <td>8.13</td>\n",
" <td>21.83</td>\n",
" <td>30.04</td>\n",
" <td>71.48</td>\n",
" <td>652.18</td>\n",
" <th>cvxpy</th>\n",
" <td>20.25</td>\n",
" <td>314.35</td>\n",
" <td>1,306.26</td>\n",
" <td>2,795.40</td>\n",
" <td>7,386.27</td>\n",
" <td>195,024.34</td>\n",
" </tr>\n",
" <tr>\n",
" <th>scipy</th>\n",
" <td>8.33</td>\n",
" <td>1,032.94</td>\n",
" <td>70,803.96</td>\n",
" <td>101,735.25</td>\n",
" <td>NaN</td>\n",
" <th>alphamind</th>\n",
" <td>21.20</td>\n",
" <td>41.34</td>\n",
" <td>60.28</td>\n",
" <td>91.30</td>\n",
" <td>77.67</td>\n",
" <td>868.86</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"
sh50 hs300 zz500 zz800
ashare_ex\n",
"
alphamind 8.13 21.83 30.04 71.48 652.18
\n",
"
scipy 8.33 1,032.94 70,803.96 101,735.25 NaN
"
"
sh50 hs300 zz500 zz800 zz1000
ashare_ex\n",
"
cvxpy 20.25 314.35 1,306.26 2,795.40 7,386.27 195,024.34
\n",
"
alphamind 21.20 41.34 60.28 91.30 77.67 868.86
"
]
},
"execution_count": 10,
...
...
@@ -589,27 +655,20 @@
"name": "stderr",
"output_type": "stream",
"text": [
"2018-03-26 22:29:10,929 - ALPHA_MIND - INFO - sh50 is finished\n",
"2018-03-26 22:29:13,377 - ALPHA_MIND - INFO - hs300 is finished\n",
"2018-03-26 22:30:13,788 - ALPHA_MIND - INFO - zz500 is finished\n",
"2018-03-26 22:34:02,088 - ALPHA_MIND - INFO - zz800 is finished\n",
"2018-03-26 22:34:04,708 - ALPHA_MIND - INFO - ashare_ex is finished\n"
"2018-03-28 12:57:47,308 - ALPHA_MIND - INFO - sh50 is finished\n",
"2018-03-28 12:57:48,181 - ALPHA_MIND - INFO - hs300 is finished\n",
"2018-03-28 12:57:51,075 - ALPHA_MIND - INFO - zz500 is finished\n",
"2018-03-28 12:58:05,881 - ALPHA_MIND - INFO - zz800 is finished\n",
"2018-03-28 12:58:19,775 - ALPHA_MIND - INFO - zz1000 is finished\n",
"2018-03-28 13:05:47,684 - ALPHA_MIND - INFO - ashare_ex is finished\n"
]
}
],
"source": [
"df = pd.DataFrame(columns=u_names, index=['
alphamind', 'scipy
'])\n",
"df = pd.DataFrame(columns=u_names, index=['
cvxpy', 'alphamind
'])\n",
"number = 1\n",
"target_vol = 0.1\n",
"\n",
"def func(x):\n",
" return - er @ x\n",
"\n",
"def con_func(x):\n",
" return x.sum()\n",
"\n",
"def ieq_func(x):\n",
" return target_vol * target_vol - x @ sec_cov @ x\n",
"\n",
"for u_name, sample_data in zip(u_names, data_set):\n",
" all_styles = risk_styles + industry_styles + ['COUNTRY']\n",
...
...
@@ -619,35 +678,43 @@
" special_risk = factor_data.srisk.values\n",
" sec_cov = risk_exposure @ risk_cov @ risk_exposure.T / 10000 + np.diag(special_risk ** 2) / 10000\n",
" er = factor_data[factor].values\n",
" n = len(er)\n",
" \n",
" if 'weight' in factor_data:\n",
" bm = factor_data.weight.values\n",
" else:\n",
" bm = np.ones_like(er) /
len(er)
\n",
" lbound = np.zeros(
len(er)
)\n",
" ubound = np.ones(
len(er)
) * 0.1\n",
" bm = np.ones_like(er) /
n
\n",
" lbound = np.zeros(
n
)\n",
" ubound = np.ones(
n
) * 0.1\n",
" \n",
" risk_constraints = np.ones((
len(er)
, 1))\n",
" risk_constraints = np.ones((
n
, 1))\n",
" risk_target = (np.array([bm.sum()]), np.array([bm.sum()]))\n",
"\n",
" status, y, x1 = target_vol_builder(er, sec_cov, bm, lbound, ubound, risk_constraints, risk_target, vol_low=0, vol_high=target_vol)\n",
" elasped_time1 = timeit.timeit(\"mean_variance_builder(er, sec_cov, bm, lbound, ubound, None, None, lam=1)\",\n",
" number=number, globals=globals()) / number * 1000\n",
" \n",
" cons = [dict(type='eq', fun=con_func), dict(type='ineq', fun=ieq_func)]\n",
" \n",
" if u_name != 'ashare_ex':\n",
" res = minimize(func, bm, bounds=list(zip(lbound - bm, ubound-bm)), constraints=cons, tol=1e-12)\n",
" x2 = res['x'] + bm\n",
" elasped_time2 = timeit.timeit(\"minimize(func, np.zeros(len(er)), bounds=list(zip(lbound-bm, ubound-bm)), constraints=cons, tol=1e-12)\",\n",
" number=number, globals=globals()) / number * 1000\n",
" w = cvxpy.Variable(n)\n",
" risk = quad_form(w - bm, sec_cov)\n",
" objective = cvxpy.Minimize(-w.T * er)\n",
" curr_risk_exposure = risk_constraints.T @ w\n",
" constraints = [w >= lbound,\n",
" w <= ubound,\n",
" curr_risk_exposure == risk_target[0],\n",
" risk <= target_vol * target_vol]\n",
" prob = cvxpy.Problem(objective, constraints)\n",
" prob.solve(solver='CVXOPT')\n",
" elasped_time2 = timeit.timeit(\"prob.solve(solver='CVXOPT')\",\n",
" number=number, globals=globals()) / number * 1000\n",
"\n",
" np.testing.assert_array_almost_equal(x1, x2, 4)\n",
" else:\n",
" elasped_time2 = np.nan\n",
" u1 = -x1 @ er\n",
" x2 = np.array(w.value).flatten()\n",
" u2 = -x2 @ er\n",
" \n",
" np.testing.assert_array_almost_equal(u1, u2, 4)\n",
"\n",
" df.loc['alphamind', u_name] = elasped_time1\n",
" df.loc['
sci
py', u_name] = elasped_time2\n",
" df.loc['
cvx
py', u_name] = elasped_time2\n",
" alpha_logger.info(f\"{u_name} is finished\")"
]
},
...
...
@@ -681,34 +748,37 @@
" <th>hs300</th>\n",
" <th>zz500</th>\n",
" <th>zz800</th>\n",
" <th>zz1000</th>\n",
" <th>ashare_ex</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>alphamind</th>\n",
" <td>6.85</td>\n",
" <td>16.36</td>\n",
" <td>31.63</td>\n",
" <td>48.64</td>\n",
" <td>581.78</td>\n",
" <th>cvxpy</th>\n",
" <td>23.83</td>\n",
" <td>360.10</td>\n",
" <td>1,261.50</td>\n",
" <td>9,555.63</td>\n",
" <td>6,260.97</td>\n",
" <td>212,776.88</td>\n",
" </tr>\n",
" <tr>\n",
" <th>scipy</th>\n",
" <td>15.86</td>\n",
" <td>1,363.28</td>\n",
" <td>27,494.13</td>\n",
" <td>110,102.60</td>\n",
" <td>NaN</td>\n",
" <th>alphamind</th>\n",
" <td>22.55</td>\n",
" <td>32.70</td>\n",
" <td>60.94</td>\n",
" <td>59.65</td>\n",
" <td>116.27</td>\n",
" <td>824.79</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" sh50
hs300 zz500 zz800
ashare_ex\n",
"
alphamind 6.85 16.36 31.63 48.64 581.7
8\n",
"
scipy 15.86 1,363.28 27,494.13 110,102.60 NaN
"
" sh50
hs300 zz500 zz800 zz1000
ashare_ex\n",
"
cvxpy 23.83 360.10 1,261.50 9,555.63 6,260.97 212,776.8
8\n",
"
alphamind 22.55 32.70 60.94 59.65 116.27 824.79
"
]
},
"execution_count": 12,
...
...
@@ -723,9 +793,7 @@
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"metadata": {},
"outputs": [],
"source": []
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment