Commit 390152e0 authored by Dr.李's avatar Dr.李

update optimizer

parent e0bfc963
......@@ -7,13 +7,14 @@ Created on 2017-7-20
"""
cimport numpy as cnp
from libcpp.string cimport string
from libcpp.vector cimport vector
import numpy as np
cdef extern from "lpoptimizer.hpp" namespace "pfopt":
cdef cppclass LpOptimizer:
LpOptimizer(int, int, double*, double*, double*, double*) except +
LpOptimizer(int, int, double*, double*, double*, double*, string) except +
vector[double] xValue()
double feval()
int status()
......@@ -29,9 +30,12 @@ cdef class LPOptimizer:
cnp.ndarray[double, ndim=2] cons_matrix,
double[:] lbound,
double[:] ubound,
double[:] objective):
double[:] objective,
str method='simplex'):
self.n = lbound.shape[0]
self.m = cons_matrix.shape[0]
py_bytes = method.encode('ascii')
cdef char* c_str = py_bytes
cdef double[:] cons = cons_matrix.flatten(order='C');
self.cobj = new LpOptimizer(self.n,
......@@ -39,7 +43,8 @@ cdef class LPOptimizer:
&cons[0],
&lbound[0],
&ubound[0],
&objective[0])
&objective[0],
c_str)
def __dealloc__(self):
del self.cobj
......@@ -151,9 +156,25 @@ cdef extern from "mvoptimizer.hpp" namespace "pfopt":
int status()
cdef extern from "qpalglib.hpp" namespace "pfopt":
cdef cppclass QPAlglib:
QPAlglib(int,
double*,
double*,
double*,
double*,
double) except +
vector[double] xValue()
int status()
cdef class QPOptimizer:
cdef MVOptimizer* cobj
cdef QPAlglib* cobj2
cdef cnp.ndarray er
cdef cnp.ndarray cov
cdef double risk_aversion
cdef int n
cdef int m
......@@ -169,12 +190,15 @@ cdef class QPOptimizer:
self.n = lbound.shape[0]
self.m = 0
self.er = np.array(expected_return)
self.cov = np.array(cov_matrix)
self.risk_aversion = risk_aversion
cdef double[:] cov = cov_matrix.flatten(order='C')
cdef double[:] cons
if cons_matrix is not None:
self.m = cons_matrix.shape[0]
cons = cons_matrix.flatten(order='C');
cons = cons_matrix.flatten(order='C')
self.cobj = new MVOptimizer(self.n,
&expected_return[0],
......@@ -187,25 +211,39 @@ cdef class QPOptimizer:
&cubound[0],
risk_aversion)
else:
self.cobj = new MVOptimizer(self.n,
self.cobj2 = new QPAlglib(self.n,
&expected_return[0],
&cov[0],
&lbound[0],
&ubound[0],
0,
NULL,
NULL,
NULL,
risk_aversion)
def __dealloc__(self):
if self.cobj:
del self.cobj
else:
del self.cobj2
def feval(self):
if self.cobj:
return self.cobj.feval()
else:
x = np.array(self.cobj2.xValue())
return 0.5 * self.risk_aversion * x @ self.cov @ x - self.er @ x
def x_value(self):
if self.cobj:
return np.array(self.cobj.xValue())
else:
return np.array(self.cobj2.xValue())
def status(self):
if self.cobj:
return self.cobj.status()
else:
status = self.cobj2.status()
if 1 <= status <= 4:
return 0
else:
return status
Subproject commit 7e81e8ec55c9f43bb6256eeb78d744f4670dae1d
Subproject commit 1ed77b10dab76d88b09a057670a3c01276bc82d0
......@@ -17,7 +17,8 @@ def linear_builder(er: np.ndarray,
risk_constraints: np.ndarray,
risk_target: Tuple[np.ndarray, np.ndarray],
turn_over_target: float = None,
current_position: np.ndarray = None) -> Tuple[str, np.ndarray, np.ndarray]:
current_position: np.ndarray = None,
method: str='simplex') -> Tuple[str, np.ndarray, np.ndarray]:
er = er.flatten()
n, m = risk_constraints.shape
......@@ -36,7 +37,7 @@ def linear_builder(er: np.ndarray,
if not turn_over_target:
cons_matrix = np.concatenate((risk_constraints.T, risk_lbound, risk_ubound), axis=1)
opt = LPOptimizer(cons_matrix, lbound, ubound, -er)
opt = LPOptimizer(cons_matrix, lbound, ubound, -er, method)
status = opt.status()
......@@ -77,7 +78,7 @@ def linear_builder(er: np.ndarray,
risk_ubound = np.concatenate((risk_ubound, np.inf * np.ones((n, 1))), axis=0)
cons_matrix = np.concatenate((risk_constraints, risk_lbound, risk_ubound), axis=1)
opt = LPOptimizer(cons_matrix, lbound, ubound, -er)
opt = LPOptimizer(cons_matrix, lbound, ubound, -er, method)
status = opt.status()
......
......@@ -57,7 +57,7 @@
"factor = 'EPS'\n",
"lb = 0.0\n",
"ub = 0.1\n",
"data_source = 'postgres+psycopg2://postgres:A12345678!@10.63.6.220/alpha'\n",
"data_source = 'postgres+psycopg2://postgres:we083826@localhost/alpha'\n",
"engine = SqlEngine(data_source)\n",
"\n",
"universes = [Universe('custom', [u_name]) for u_name in u_names]\n",
......@@ -82,12 +82,12 @@
"name": "stderr",
"output_type": "stream",
"text": [
"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"
"2018-03-29 23:27:41,866 - ALPHA_MIND - INFO - sh50 is finished\n",
"2018-03-29 23:27:41,879 - ALPHA_MIND - INFO - hs300 is finished\n",
"2018-03-29 23:27:41,897 - ALPHA_MIND - INFO - zz500 is finished\n",
"2018-03-29 23:27:41,925 - ALPHA_MIND - INFO - zz800 is finished\n",
"2018-03-29 23:27:41,966 - ALPHA_MIND - INFO - zz1000 is finished\n",
"2018-03-29 23:27:42,244 - ALPHA_MIND - INFO - ashare_ex is finished\n"
]
}
],
......@@ -171,21 +171,21 @@
" <tbody>\n",
" <tr>\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",
" <td>1.63</td>\n",
" <td>3.53</td>\n",
" <td>5.47</td>\n",
" <td>10.00</td>\n",
" <td>16.80</td>\n",
" <td>128.58</td>\n",
" </tr>\n",
" <tr>\n",
" <th>alphamind</th>\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",
" <td>0.21</td>\n",
" <td>0.37</td>\n",
" <td>0.45</td>\n",
" <td>0.65</td>\n",
" <td>0.80</td>\n",
" <td>2.43</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
......@@ -193,8 +193,8 @@
],
"text/plain": [
" sh50 hs300 zz500 zz800 zz1000 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"
"cvxpy 1.63 3.53 5.47 10.00 16.80 128.58\n",
"alphamind 0.21 0.37 0.45 0.65 0.80 2.43"
]
},
"execution_count": 4,
......@@ -223,23 +223,20 @@
"name": "stderr",
"output_type": "stream",
"text": [
"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"
"2018-03-29 23:28:14,838 - ALPHA_MIND - INFO - sh50 is finished\n",
"2018-03-29 23:28:15,575 - ALPHA_MIND - INFO - hs300 is finished\n",
"2018-03-29 23:28:18,310 - ALPHA_MIND - INFO - zz500 is finished\n"
]
}
],
"source": [
"from cvxpy import pnorm\n",
"\n",
"df = pd.DataFrame(columns=u_names, index=['cvxpy', 'alphamind'])\n",
"df = pd.DataFrame(columns=u_names[:3], 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",
"for u_name, sample_data in zip(u_names[:3], data_set):\n",
" factor_data = sample_data['factor']\n",
" er = factor_data[factor].values\n",
" n = len(er)\n",
......@@ -254,8 +251,22 @@
" risk_constraints = np.ones((len(er), 1))\n",
" risk_target = (np.array([1.]), np.array([1.]))\n",
"\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",
" status, y, x1 = linear_builder(er,\n",
" lbound,\n",
" ubound,\n",
" risk_constraints,\n",
" risk_target,\n",
" turn_over_target=turn_over_target,\n",
" current_position=current_position,\n",
" method='simplex')\n",
" elasped_time1 = timeit.timeit(\"\"\"linear_builder(er,\n",
" lbound,\n",
" ubound,\n",
" risk_constraints,\n",
" risk_target,\n",
" turn_over_target=turn_over_target,\n",
" current_position=current_position,\n",
" method='simplex')\"\"\", number=number, globals=globals()) / number * 1000\n",
" \n",
" w = cvxpy.Variable(n)\n",
" curr_risk_exposure = risk_constraints.T @ w\n",
......@@ -315,21 +326,21 @@
" <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",
" <td>2.50</td>\n",
" <td>20.24</td>\n",
" <td>52.74</td>\n",
" <td>125.65</td>\n",
" <td>204.18</td>\n",
" <td>1,789.07</td>\n",
" </tr>\n",
" <tr>\n",
" <th>alphamind</th>\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",
" <td>1.34</td>\n",
" <td>9.60</td>\n",
" <td>28.20</td>\n",
" <td>81.53</td>\n",
" <td>106.00</td>\n",
" <td>1,213.77</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
......@@ -337,8 +348,8 @@
],
"text/plain": [
" 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"
"cvxpy 2.50 20.24 52.74 125.65 204.18 1,789.07\n",
"alphamind 1.34 9.60 28.20 81.53 106.00 1,213.77"
]
},
"execution_count": 6,
......@@ -369,12 +380,12 @@
"name": "stderr",
"output_type": "stream",
"text": [
"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"
"2018-03-29 23:20:00,988 - ALPHA_MIND - INFO - sh50 is finished\n",
"2018-03-29 23:20:01,378 - ALPHA_MIND - INFO - hs300 is finished\n",
"2018-03-29 23:20:02,793 - ALPHA_MIND - INFO - zz500 is finished\n",
"2018-03-29 23:20:07,901 - ALPHA_MIND - INFO - zz800 is finished\n",
"2018-03-29 23:20:15,170 - ALPHA_MIND - INFO - zz1000 is finished\n",
"2018-03-29 23:23:37,330 - ALPHA_MIND - INFO - ashare_ex is finished\n"
]
}
],
......@@ -458,21 +469,21 @@
" <tbody>\n",
" <tr>\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",
" <td>8.30</td>\n",
" <td>164.79</td>\n",
" <td>620.38</td>\n",
" <td>2,280.32</td>\n",
" <td>3,124.51</td>\n",
" <td>87,652.78</td>\n",
" </tr>\n",
" <tr>\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",
" <td>0.38</td>\n",
" <td>4.29</td>\n",
" <td>16.04</td>\n",
" <td>49.93</td>\n",
" <td>71.42</td>\n",
" <td>2,238.11</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
......@@ -480,8 +491,8 @@
],
"text/plain": [
" sh50 hs300 zz500 zz800 zz1000 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"
"cvxpy 8.30 164.79 620.38 2,280.32 3,124.51 87,652.78\n",
"alphamind 0.38 4.29 16.04 49.93 71.42 2,238.11"
]
},
"execution_count": 8,
......@@ -497,27 +508,92 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4. Mean - Variance 优化 (Box约束以及线性约束)"
"## 4. Mean - Variance 优化 (Box约束)\n",
"---------------"
]
},
{
"cell_type": "code",
"execution_count": 9,
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"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"
"2018-03-29 23:23:37,938 - ALPHA_MIND - INFO - sh50 is finished\n",
"2018-03-29 23:23:38,599 - ALPHA_MIND - INFO - hs300 is finished\n",
"2018-03-29 23:23:41,505 - ALPHA_MIND - INFO - zz500 is finished\n",
"2018-03-29 23:23:51,712 - ALPHA_MIND - INFO - zz800 is finished\n",
"2018-03-29 23:24:05,999 - ALPHA_MIND - INFO - zz1000 is finished\n"
]
}
],
"source": [
"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",
" all_styles = risk_styles + industry_styles + ['COUNTRY']\n",
" factor_data = sample_data['factor']\n",
" risk_cov = sample_data['risk_cov'][all_styles].values\n",
" risk_exposure = factor_data[all_styles].values\n",
" 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(n)\n",
" lbound = np.zeros(n)\n",
" ubound = np.ones(n) * 0.1\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",
" \n",
" w = cvxpy.Variable(n)\n",
" risk = quad_form(w, sec_cov)\n",
" objective = cvxpy.Minimize(-w.T * er + 0.5 * risk)\n",
" constraints = [w >= lbound,\n",
" w <= ubound]\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",
" 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['cvxpy', u_name] = elasped_time2\n",
" alpha_logger.info(f\"{u_name} is finished\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 5. Mean - Variance 优化 (Box约束以及线性约束)\n",
"----------------"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df = pd.DataFrame(columns=u_names, index=['cvxpy', 'alphamind'])\n",
"number = 1\n",
......@@ -568,72 +644,9 @@
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>sh50</th>\n",
" <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>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>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 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,
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"outputs": [],
"source": [
"df"
]
......@@ -642,28 +655,15 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## 5. 线性优化(带二次限制条件)\n",
"## 6. 线性优化(带二次限制条件)\n",
"-------------------------"
]
},
{
"cell_type": "code",
"execution_count": 11,
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"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"
]
}
],
"outputs": [],
"source": [
"df = pd.DataFrame(columns=u_names, index=['cvxpy', 'alphamind'])\n",
"number = 1\n",
......@@ -720,72 +720,9 @@
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>sh50</th>\n",
" <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>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>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 zz1000 ashare_ex\n",
"cvxpy 23.83 360.10 1,261.50 9,555.63 6,260.97 212,776.88\n",
"alphamind 22.55 32.70 60.94 59.65 116.27 824.79"
]
},
"execution_count": 12,
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"outputs": [],
"source": [
"df"
]
......
Subproject commit bf4367184164e593cd2856ef38f8dd4f8cc76999
Subproject commit a187ed6c8f3aa40b47d5be80667cbbe6a6fd563d
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