Commit 60b2ca4a authored by iLampard's avatar iLampard

Merge remote-tracking branch 'origin/master'

parents c6d69b4f fbb26530
...@@ -20,6 +20,16 @@ ...@@ -20,6 +20,16 @@
**Alpha - Mind** 是基于 **Python** 开发的股票多因子研究框架。 **Alpha - Mind** 是基于 **Python** 开发的股票多因子研究框架。
## 依赖
该项目主要有两个主要的github外部依赖:
* [portfolio - optimizer](https://github.com/alpha-miner/portfolio-optimizer):该项目是相同作者编写的用于资产组合配置的优化器工具包;
* [xgboost](https://github.com/dmlc/xgboost): 该项目是alpha - mind中一些机器模型的基础库。
这两个库都已经使用git子模块的方式打包到alpha-mind代码库中。
## 功能 ## 功能
alpha - mind 提供了多因子研究中常用的工具链,包括: alpha - mind 提供了多因子研究中常用的工具链,包括:
......
# -*- coding: utf-8 -*-
"""
Created on 2017-5-17
@author: cheng.li
"""
...@@ -33,7 +33,7 @@ def cs_impl(ref_date, ...@@ -33,7 +33,7 @@ def cs_impl(ref_date,
total_risk_exp = total_data[constraint_risk] total_risk_exp = total_data[constraint_risk]
er = total_data[[factor_name]].values.astype(float) er = total_data[[factor_name]].values.astype(float)
er = factor_processing(er, [winsorize_normal, standardize], total_risk_exp.values, [winsorize_normal, standardize]).flatten() er = factor_processing(er, [winsorize_normal, standardize], total_risk_exp.values, [standardize]).flatten()
industry = total_data.industry_name.values industry = total_data.industry_name.values
codes = total_data.code.tolist() codes = total_data.code.tolist()
...@@ -46,7 +46,10 @@ def cs_impl(ref_date, ...@@ -46,7 +46,10 @@ def cs_impl(ref_date,
total_risk_exp = target_pos[constraint_risk] total_risk_exp = target_pos[constraint_risk]
activate_weight = target_pos['weight'].values activate_weight = target_pos['weight'].values
excess_return = np.exp(target_pos[['dx']].values) - 1. excess_return = np.exp(target_pos[['dx']].values) - 1.
excess_return = factor_processing(excess_return, [winsorize_normal, standardize], total_risk_exp.values, [winsorize_normal, standardize]).flatten() excess_return = factor_processing(excess_return,
[winsorize_normal, standardize],
total_risk_exp.values,
[winsorize_normal, standardize]).flatten()
port_ret = np.log(activate_weight @ excess_return + 1.) port_ret = np.log(activate_weight @ excess_return + 1.)
ic = np.corrcoef(excess_return, activate_weight)[0, 1] ic = np.corrcoef(excess_return, activate_weight)[0, 1]
x = sm.add_constant(activate_weight) x = sm.add_constant(activate_weight)
...@@ -76,10 +79,7 @@ def cross_section_analysis(ref_date, ...@@ -76,10 +79,7 @@ def cross_section_analysis(ref_date,
if __name__ == '__main__': if __name__ == '__main__':
import numpy as np from alphamind.api import SqlEngine, Universe, risk_styles, industry_styles
import pandas as pd
import statsmodels.api as sm
from alphamind.api import *
factor_name = 'SIZE' factor_name = 'SIZE'
data_source = 'postgres+psycopg2://postgres:A12345678!@10.63.6.220/alpha' data_source = 'postgres+psycopg2://postgres:A12345678!@10.63.6.220/alpha'
......
...@@ -14,7 +14,7 @@ from alphamind.data.standardize import standardize ...@@ -14,7 +14,7 @@ from alphamind.data.standardize import standardize
from alphamind.data.winsorize import winsorize_normal from alphamind.data.winsorize import winsorize_normal
from alphamind.portfolio.constraints import Constraints from alphamind.portfolio.constraints import Constraints
from alphamind.portfolio.constraints import LinearConstraints from alphamind.portfolio.constraints import LinearConstraints
from alphamind.portfolio.longshortbulder import long_short_build from alphamind.portfolio.longshortbulder import long_short_builder
from alphamind.portfolio.rankbuilder import rank_build from alphamind.portfolio.rankbuilder import rank_build
from alphamind.portfolio.linearbuilder import linear_builder from alphamind.portfolio.linearbuilder import linear_builder
from alphamind.portfolio.meanvariancebuilder import mean_variance_builder from alphamind.portfolio.meanvariancebuilder import mean_variance_builder
...@@ -109,7 +109,7 @@ def er_portfolio_analysis(er: np.ndarray, ...@@ -109,7 +109,7 @@ def er_portfolio_analysis(er: np.ndarray,
weights = rank_build(er, use_rank=kwargs['use_rank'], masks=is_tradable).flatten() * benchmark.sum() / kwargs[ weights = rank_build(er, use_rank=kwargs['use_rank'], masks=is_tradable).flatten() * benchmark.sum() / kwargs[
'use_rank'] 'use_rank']
elif method == 'ls' or method == 'long_short': elif method == 'ls' or method == 'long_short':
weights = long_short_build(er).flatten() weights = long_short_builder(er).flatten()
elif method == 'mv' or method == 'mean_variance': elif method == 'mv' or method == 'mean_variance':
lbound, ubound, cons_exp, risk_lbound, risk_ubound = create_constraints(benchmark, **kwargs) lbound, ubound, cons_exp, risk_lbound, risk_ubound = create_constraints(benchmark, **kwargs)
cov = kwargs['cov'] cov = kwargs['cov']
......
# -*- coding: utf-8 -*-
"""
Created on 2018-1-15
@author: cheng.li
"""
import numpy as np
from alphamind.data.standardize import standardize
def factor_turn_over(factor_values: np.ndarray,
trade_dates: np.ndarray,
codes: np.ndarray,
use_standize: bool=True):
if use_standize:
factor_values = standardize(factor_values, trade_dates)
if __name__ == '__main__':
from alphamind.api import *
engine = SqlEngine()
factor = 'ep_q'
freq = '5b'
start_date = '2017-06-01'
end_date = '2017-08-01'
universe = Universe('custom', ['zz500'])
...@@ -7,13 +7,14 @@ Created on 2017-7-20 ...@@ -7,13 +7,14 @@ Created on 2017-7-20
""" """
cimport numpy as cnp cimport numpy as cnp
from libcpp.string cimport string
from libcpp.vector cimport vector from libcpp.vector cimport vector
import numpy as np import numpy as np
cdef extern from "lpoptimizer.hpp" namespace "pfopt": cdef extern from "lpoptimizer.hpp" namespace "pfopt":
cdef cppclass LpOptimizer: cdef cppclass LpOptimizer:
LpOptimizer(int, int, double*, double*, double*, double*) except + LpOptimizer(int, int, double*, double*, double*, double*, string) except +
vector[double] xValue() vector[double] xValue()
double feval() double feval()
int status() int status()
...@@ -26,12 +27,15 @@ cdef class LPOptimizer: ...@@ -26,12 +27,15 @@ cdef class LPOptimizer:
cdef int m cdef int m
def __cinit__(self, def __cinit__(self,
cnp.ndarray[double, ndim=2] cons_matrix, cnp.ndarray[double, ndim=2] cons_matrix,
double[:] lbound, double[:] lbound,
double[:] ubound, double[:] ubound,
double[:] objective): double[:] objective,
str method='simplex'):
self.n = lbound.shape[0] self.n = lbound.shape[0]
self.m = cons_matrix.shape[0] self.m = cons_matrix.shape[0]
py_bytes = method.encode('ascii')
cdef string c_str = py_bytes
cdef double[:] cons = cons_matrix.flatten(order='C'); cdef double[:] cons = cons_matrix.flatten(order='C');
self.cobj = new LpOptimizer(self.n, self.cobj = new LpOptimizer(self.n,
...@@ -39,7 +43,8 @@ cdef class LPOptimizer: ...@@ -39,7 +43,8 @@ cdef class LPOptimizer:
&cons[0], &cons[0],
&lbound[0], &lbound[0],
&ubound[0], &ubound[0],
&objective[0]) &objective[0],
c_str)
def __dealloc__(self): def __dealloc__(self):
del self.cobj del self.cobj
...@@ -151,9 +156,25 @@ cdef extern from "mvoptimizer.hpp" namespace "pfopt": ...@@ -151,9 +156,25 @@ cdef extern from "mvoptimizer.hpp" namespace "pfopt":
int status() 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 class QPOptimizer:
cdef MVOptimizer* cobj cdef MVOptimizer* cobj
cdef QPAlglib* cobj2
cdef cnp.ndarray er
cdef cnp.ndarray cov
cdef double risk_aversion
cdef int n cdef int n
cdef int m cdef int m
...@@ -169,12 +190,15 @@ cdef class QPOptimizer: ...@@ -169,12 +190,15 @@ cdef class QPOptimizer:
self.n = lbound.shape[0] self.n = lbound.shape[0]
self.m = 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[:] cov = cov_matrix.flatten(order='C')
cdef double[:] cons cdef double[:] cons
if cons_matrix is not None: if cons_matrix is not None:
self.m = cons_matrix.shape[0] self.m = cons_matrix.shape[0]
cons = cons_matrix.flatten(order='C'); cons = cons_matrix.flatten(order='C')
self.cobj = new MVOptimizer(self.n, self.cobj = new MVOptimizer(self.n,
&expected_return[0], &expected_return[0],
...@@ -187,25 +211,39 @@ cdef class QPOptimizer: ...@@ -187,25 +211,39 @@ cdef class QPOptimizer:
&cubound[0], &cubound[0],
risk_aversion) risk_aversion)
else: else:
self.cobj = new MVOptimizer(self.n, self.cobj2 = new QPAlglib(self.n,
&expected_return[0], &expected_return[0],
&cov[0], &cov[0],
&lbound[0], &lbound[0],
&ubound[0], &ubound[0],
0, risk_aversion)
NULL,
NULL,
NULL,
risk_aversion)
def __dealloc__(self): def __dealloc__(self):
del self.cobj if self.cobj:
del self.cobj
else:
del self.cobj2
def feval(self): def feval(self):
return self.cobj.feval() 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): def x_value(self):
return np.array(self.cobj.xValue()) if self.cobj:
return np.array(self.cobj.xValue())
else:
return np.array(self.cobj2.xValue())
def status(self): def status(self):
return self.cobj.status() if self.cobj:
\ No newline at end of file return self.cobj.status()
else:
status = self.cobj2.status()
if 1 <= status <= 4:
return 0
else:
return status
...@@ -12,614 +12,6 @@ Base = declarative_base() ...@@ -12,614 +12,6 @@ Base = declarative_base()
metadata = Base.metadata metadata = Base.metadata
class FullFactor(Base):
__tablename__ = 'full_factor'
__table_args__ = (
Index('full_factor_trade_date_code_uindex', 'trade_date', 'code', unique=True),
)
trade_date = Column(DateTime, primary_key=True, nullable=False)
code = Column(Integer, primary_key=True, nullable=False)
secShortName = Column(String(10))
exchangeCD = Column(String(4))
preClosePrice = Column(Float(53))
actPreClosePrice = Column(Float(53))
openPrice = Column(Float(53))
highestPrice = Column(Float(53))
lowestPrice = Column(Float(53))
closePrice = Column(Float(53))
turnoverVol = Column(BigInteger)
turnoverValue = Column(Float(53))
dealAmount = Column(BigInteger)
turnoverRate = Column(Float(53))
accumAdjFactor = Column(Float(53))
negMarketValue = Column(Float(53))
marketValue = Column(Float(53))
chgPct = Column(Float(53))
isOpen = Column(Integer)
vwap = Column(Float(53))
AccountsPayablesTDays = Column(Float(53))
AccountsPayablesTRate = Column(Float(53))
AdminiExpenseRate = Column(Float(53))
ARTDays = Column(Float(53))
ARTRate = Column(Float(53))
ASSI = Column(Float(53))
BLEV = Column(Float(53))
BondsPayableToAsset = Column(Float(53))
CashRateOfSales = Column(Float(53))
CashToCurrentLiability = Column(Float(53))
CMRA = Column(Float(53))
CTOP = Column(Float(53))
CTP5 = Column(Float(53))
CurrentAssetsRatio = Column(Float(53))
CurrentAssetsTRate = Column(Float(53))
CurrentRatio = Column(Float(53))
DAVOL10 = Column(Float(53))
DAVOL20 = Column(Float(53))
DAVOL5 = Column(Float(53))
DDNBT = Column(Float(53))
DDNCR = Column(Float(53))
DDNSR = Column(Float(53))
DebtEquityRatio = Column(Float(53))
DebtsAssetRatio = Column(Float(53))
DHILO = Column(Float(53))
DilutedEPS = Column(Float(53))
DVRAT = Column(Float(53))
EBITToTOR = Column(Float(53))
EGRO = Column(Float(53))
EMA10 = Column(Float(53))
EMA120 = Column(Float(53))
EMA20 = Column(Float(53))
EMA5 = Column(Float(53))
EMA60 = Column(Float(53))
EPS = Column(Float(53))
EquityFixedAssetRatio = Column(Float(53))
EquityToAsset = Column(Float(53))
EquityTRate = Column(Float(53))
ETOP = Column(Float(53))
ETP5 = Column(Float(53))
FinancialExpenseRate = Column(Float(53))
FinancingCashGrowRate = Column(Float(53))
FixAssetRatio = Column(Float(53))
FixedAssetsTRate = Column(Float(53))
GrossIncomeRatio = Column(Float(53))
HBETA = Column(Float(53))
HSIGMA = Column(Float(53))
IntangibleAssetRatio = Column(Float(53))
InventoryTDays = Column(Float(53))
InventoryTRate = Column(Float(53))
InvestCashGrowRate = Column(Float(53))
LCAP = Column(Float(53))
LFLO = Column(Float(53))
LongDebtToAsset = Column(Float(53))
LongDebtToWorkingCapital = Column(Float(53))
LongTermDebtToAsset = Column(Float(53))
MA10 = Column(Float(53))
MA120 = Column(Float(53))
MA20 = Column(Float(53))
MA5 = Column(Float(53))
MA60 = Column(Float(53))
MAWVAD = Column(Float(53))
MFI = Column(Float(53))
MLEV = Column(Float(53))
NetAssetGrowRate = Column(Float(53))
NetProfitGrowRate = Column(Float(53))
NetProfitRatio = Column(Float(53))
NOCFToOperatingNI = Column(Float(53))
NonCurrentAssetsRatio = Column(Float(53))
NPParentCompanyGrowRate = Column(Float(53))
NPToTOR = Column(Float(53))
OperatingExpenseRate = Column(Float(53))
OperatingProfitGrowRate = Column(Float(53))
OperatingProfitRatio = Column(Float(53))
OperatingProfitToTOR = Column(Float(53))
OperatingRevenueGrowRate = Column(Float(53))
OperCashGrowRate = Column(Float(53))
OperCashInToCurrentLiability = Column(Float(53))
PB = Column(Float(53))
PCF = Column(Float(53))
PE = Column(Float(53))
PS = Column(Float(53))
PSY = Column(Float(53))
QuickRatio = Column(Float(53))
REVS10 = Column(Float(53))
REVS20 = Column(Float(53))
REVS5 = Column(Float(53))
ROA = Column(Float(53))
ROA5 = Column(Float(53))
ROE = Column(Float(53))
ROE5 = Column(Float(53))
RSI = Column(Float(53))
RSTR12 = Column(Float(53))
RSTR24 = Column(Float(53))
SalesCostRatio = Column(Float(53))
SaleServiceCashToOR = Column(Float(53))
SUE = Column(Float(53))
TaxRatio = Column(Float(53))
TOBT = Column(Float(53))
TotalAssetGrowRate = Column(Float(53))
TotalAssetsTRate = Column(Float(53))
TotalProfitCostRatio = Column(Float(53))
TotalProfitGrowRate = Column(Float(53))
VOL10 = Column(Float(53))
VOL120 = Column(Float(53))
VOL20 = Column(Float(53))
VOL240 = Column(Float(53))
VOL5 = Column(Float(53))
VOL60 = Column(Float(53))
WVAD = Column(Float(53))
REC = Column(Float(53))
DAREC = Column(Float(53))
GREC = Column(Float(53))
FY12P = Column(Float(53))
DAREV = Column(Float(53))
GREV = Column(Float(53))
SFY12P = Column(Float(53))
DASREV = Column(Float(53))
GSREV = Column(Float(53))
FEARNG = Column(Float(53))
FSALESG = Column(Float(53))
TA2EV = Column(Float(53))
CFO2EV = Column(Float(53))
ACCA = Column(Float(53))
DEGM = Column(Float(53))
SUOI = Column(Float(53))
EARNMOM = Column(Float(53))
FiftyTwoWeekHigh = Column(Float(53))
Volatility = Column(Float(53))
Skewness = Column(Float(53))
ILLIQUIDITY = Column(Float(53))
BackwardADJ = Column(Float(53))
MACD = Column(Float(53))
ADTM = Column(Float(53))
ATR14 = Column(Float(53))
ATR6 = Column(Float(53))
BIAS10 = Column(Float(53))
BIAS20 = Column(Float(53))
BIAS5 = Column(Float(53))
BIAS60 = Column(Float(53))
BollDown = Column(Float(53))
BollUp = Column(Float(53))
CCI10 = Column(Float(53))
CCI20 = Column(Float(53))
CCI5 = Column(Float(53))
CCI88 = Column(Float(53))
KDJ_K = Column(Float(53))
KDJ_D = Column(Float(53))
KDJ_J = Column(Float(53))
ROC6 = Column(Float(53))
ROC20 = Column(Float(53))
SBM = Column(Float(53))
STM = Column(Float(53))
UpRVI = Column(Float(53))
DownRVI = Column(Float(53))
RVI = Column(Float(53))
SRMI = Column(Float(53))
ChandeSD = Column(Float(53))
ChandeSU = Column(Float(53))
CMO = Column(Float(53))
DBCD = Column(Float(53))
ARC = Column(Float(53))
OBV = Column(Float(53))
OBV6 = Column(Float(53))
OBV20 = Column(Float(53))
TVMA20 = Column(Float(53))
TVMA6 = Column(Float(53))
TVSTD20 = Column(Float(53))
TVSTD6 = Column(Float(53))
VDEA = Column(Float(53))
VDIFF = Column(Float(53))
VEMA10 = Column(Float(53))
VEMA12 = Column(Float(53))
VEMA26 = Column(Float(53))
VEMA5 = Column(Float(53))
VMACD = Column(Float(53))
VOSC = Column(Float(53))
VR = Column(Float(53))
VROC12 = Column(Float(53))
VROC6 = Column(Float(53))
VSTD10 = Column(Float(53))
VSTD20 = Column(Float(53))
KlingerOscillator = Column(Float(53))
MoneyFlow20 = Column(Float(53))
AD = Column(Float(53))
AD20 = Column(Float(53))
AD6 = Column(Float(53))
CoppockCurve = Column(Float(53))
ASI = Column(Float(53))
ChaikinOscillator = Column(Float(53))
ChaikinVolatility = Column(Float(53))
EMV14 = Column(Float(53))
EMV6 = Column(Float(53))
plusDI = Column(Float(53))
minusDI = Column(Float(53))
ADX = Column(Float(53))
ADXR = Column(Float(53))
Aroon = Column(Float(53))
AroonDown = Column(Float(53))
AroonUp = Column(Float(53))
DEA = Column(Float(53))
DIFF = Column(Float(53))
DDI = Column(Float(53))
DIZ = Column(Float(53))
DIF = Column(Float(53))
MTM = Column(Float(53))
MTMMA = Column(Float(53))
PVT = Column(Float(53))
PVT6 = Column(Float(53))
PVT12 = Column(Float(53))
TRIX5 = Column(Float(53))
TRIX10 = Column(Float(53))
UOS = Column(Float(53))
MA10RegressCoeff12 = Column(Float(53))
MA10RegressCoeff6 = Column(Float(53))
PLRC6 = Column(Float(53))
PLRC12 = Column(Float(53))
SwingIndex = Column(Float(53))
Ulcer10 = Column(Float(53))
Ulcer5 = Column(Float(53))
Hurst = Column(Float(53))
ACD6 = Column(Float(53))
ACD20 = Column(Float(53))
EMA12 = Column(Float(53))
EMA26 = Column(Float(53))
APBMA = Column(Float(53))
BBI = Column(Float(53))
BBIC = Column(Float(53))
TEMA10 = Column(Float(53))
TEMA5 = Column(Float(53))
MA10Close = Column(Float(53))
AR = Column(Float(53))
BR = Column(Float(53))
ARBR = Column(Float(53))
CR20 = Column(Float(53))
MassIndex = Column(Float(53))
BearPower = Column(Float(53))
BullPower = Column(Float(53))
Elder = Column(Float(53))
NVI = Column(Float(53))
PVI = Column(Float(53))
RC12 = Column(Float(53))
RC24 = Column(Float(53))
JDQS20 = Column(Float(53))
Variance20 = Column(Float(53))
Variance60 = Column(Float(53))
Variance120 = Column(Float(53))
Kurtosis20 = Column(Float(53))
Kurtosis60 = Column(Float(53))
Kurtosis120 = Column(Float(53))
Alpha20 = Column(Float(53))
Alpha60 = Column(Float(53))
Alpha120 = Column(Float(53))
Beta20 = Column(Float(53))
Beta60 = Column(Float(53))
Beta120 = Column(Float(53))
SharpeRatio20 = Column(Float(53))
SharpeRatio60 = Column(Float(53))
SharpeRatio120 = Column(Float(53))
TreynorRatio20 = Column(Float(53))
TreynorRatio60 = Column(Float(53))
TreynorRatio120 = Column(Float(53))
InformationRatio20 = Column(Float(53))
InformationRatio60 = Column(Float(53))
InformationRatio120 = Column(Float(53))
GainVariance20 = Column(Float(53))
GainVariance60 = Column(Float(53))
GainVariance120 = Column(Float(53))
LossVariance20 = Column(Float(53))
LossVariance60 = Column(Float(53))
LossVariance120 = Column(Float(53))
GainLossVarianceRatio20 = Column(Float(53))
GainLossVarianceRatio60 = Column(Float(53))
GainLossVarianceRatio120 = Column(Float(53))
RealizedVolatility = Column(Float(53))
REVS60 = Column(Float(53))
REVS120 = Column(Float(53))
REVS250 = Column(Float(53))
REVS750 = Column(Float(53))
REVS5m20 = Column(Float(53))
REVS5m60 = Column(Float(53))
REVS5Indu1 = Column(Float(53))
REVS20Indu1 = Column(Float(53))
Volumn1M = Column(Float(53))
Volumn3M = Column(Float(53))
Price1M = Column(Float(53))
Price3M = Column(Float(53))
Price1Y = Column(Float(53))
Rank1M = Column(Float(53))
CashDividendCover = Column(Float(53))
DividendCover = Column(Float(53))
DividendPaidRatio = Column(Float(53))
RetainedEarningRatio = Column(Float(53))
CashEquivalentPS = Column(Float(53))
DividendPS = Column(Float(53))
EPSTTM = Column(Float(53))
NetAssetPS = Column(Float(53))
TORPS = Column(Float(53))
TORPSLatest = Column(Float(53))
OperatingRevenuePS = Column(Float(53))
OperatingRevenuePSLatest = Column(Float(53))
OperatingProfitPS = Column(Float(53))
OperatingProfitPSLatest = Column(Float(53))
CapitalSurplusFundPS = Column(Float(53))
SurplusReserveFundPS = Column(Float(53))
UndividedProfitPS = Column(Float(53))
RetainedEarningsPS = Column(Float(53))
OperCashFlowPS = Column(Float(53))
CashFlowPS = Column(Float(53))
NetNonOIToTP = Column(Float(53))
NetNonOIToTPLatest = Column(Float(53))
PeriodCostsRate = Column(Float(53))
InterestCover = Column(Float(53))
NetProfitGrowRate3Y = Column(Float(53))
NetProfitGrowRate5Y = Column(Float(53))
OperatingRevenueGrowRate3Y = Column(Float(53))
OperatingRevenueGrowRate5Y = Column(Float(53))
NetCashFlowGrowRate = Column(Float(53))
NetProfitCashCover = Column(Float(53))
OperCashInToAsset = Column(Float(53))
CashConversionCycle = Column(Float(53))
OperatingCycle = Column(Float(53))
PEG3Y = Column(Float(53))
PEG5Y = Column(Float(53))
PEIndu = Column(Float(53))
PBIndu = Column(Float(53))
PSIndu = Column(Float(53))
PCFIndu = Column(Float(53))
PEHist20 = Column(Float(53))
PEHist60 = Column(Float(53))
PEHist120 = Column(Float(53))
PEHist250 = Column(Float(53))
StaticPE = Column(Float(53))
ForwardPE = Column(Float(53))
EnterpriseFCFPS = Column(Float(53))
ShareholderFCFPS = Column(Float(53))
ROEDiluted = Column(Float(53))
ROEAvg = Column(Float(53))
ROEWeighted = Column(Float(53))
ROECut = Column(Float(53))
ROECutWeighted = Column(Float(53))
ROIC = Column(Float(53))
ROAEBIT = Column(Float(53))
ROAEBITTTM = Column(Float(53))
OperatingNIToTP = Column(Float(53))
OperatingNIToTPLatest = Column(Float(53))
InvestRAssociatesToTP = Column(Float(53))
InvestRAssociatesToTPLatest = Column(Float(53))
NPCutToNP = Column(Float(53))
SuperQuickRatio = Column(Float(53))
TSEPToInterestBearDebt = Column(Float(53))
DebtTangibleEquityRatio = Column(Float(53))
TangibleAToInteBearDebt = Column(Float(53))
TangibleAToNetDebt = Column(Float(53))
NOCFToTLiability = Column(Float(53))
NOCFToInterestBearDebt = Column(Float(53))
NOCFToNetDebt = Column(Float(53))
TSEPToTotalCapital = Column(Float(53))
InteBearDebtToTotalCapital = Column(Float(53))
NPParentCompanyCutYOY = Column(Float(53))
SalesServiceCashToORLatest = Column(Float(53))
CashRateOfSalesLatest = Column(Float(53))
NOCFToOperatingNILatest = Column(Float(53))
TotalAssets = Column(Float(53))
MktValue = Column(Float(53))
NegMktValue = Column(Float(53))
TEAP = Column(Float(53))
NIAP = Column(Float(53))
TotalFixedAssets = Column(Float(53))
IntFreeCL = Column(Float(53))
IntFreeNCL = Column(Float(53))
IntCL = Column(Float(53))
IntDebt = Column(Float(53))
NetDebt = Column(Float(53))
NetTangibleAssets = Column(Float(53))
WorkingCapital = Column(Float(53))
NetWorkingCapital = Column(Float(53))
TotalPaidinCapital = Column(Float(53))
RetainedEarnings = Column(Float(53))
OperateNetIncome = Column(Float(53))
ValueChgProfit = Column(Float(53))
NetIntExpense = Column(Float(53))
EBIT = Column(Float(53))
EBITDA = Column(Float(53))
EBIAT = Column(Float(53))
NRProfitLoss = Column(Float(53))
NIAPCut = Column(Float(53))
FCFF = Column(Float(53))
FCFE = Column(Float(53))
DA = Column(Float(53))
TRevenueTTM = Column(Float(53))
TCostTTM = Column(Float(53))
RevenueTTM = Column(Float(53))
CostTTM = Column(Float(53))
GrossProfitTTM = Column(Float(53))
SalesExpenseTTM = Column(Float(53))
AdminExpenseTTM = Column(Float(53))
FinanExpenseTTM = Column(Float(53))
AssetImpairLossTTM = Column(Float(53))
NPFromOperatingTTM = Column(Float(53))
NPFromValueChgTTM = Column(Float(53))
OperateProfitTTM = Column(Float(53))
NonOperatingNPTTM = Column(Float(53))
TProfitTTM = Column(Float(53))
NetProfitTTM = Column(Float(53))
NetProfitAPTTM = Column(Float(53))
SaleServiceRenderCashTTM = Column(Float(53))
NetOperateCFTTM = Column(Float(53))
NetInvestCFTTM = Column(Float(53))
NetFinanceCFTTM = Column(Float(53))
GrossProfit = Column(Float(53))
Beta252 = Column(Float(53))
RSTR504 = Column(Float(53))
EPIBS = Column(Float(53))
CETOP = Column(Float(53))
DASTD = Column(Float(53))
CmraCNE5 = Column(Float(53))
HsigmaCNE5 = Column(Float(53))
SGRO = Column(Float(53))
EgibsLong = Column(Float(53))
STOM = Column(Float(53))
STOQ = Column(Float(53))
STOA = Column(Float(53))
NLSIZE = Column(Float(53))
ROEAfterNonRecurring = Column(Float(53))
EPSAfterNonRecurring = Column(Float(53))
EODPrice = Column(Float(53))
LogFloatCap = Column(Float(53))
BPS = Column(Float(53))
SPS = Column(Float(53))
DebtToAsset = Column(Float(53))
DROEAfterNonRecurring = Column(Float(53))
LogTotalCap = Column(Float(53))
BP = Column(Float(53))
SP = Column(Float(53))
EPAfterNonRecurring = Column(Float(53))
DivToB = Column(Float(53))
DivP = Column(Float(53))
EBITToSales = Column(Float(53))
EBITAToSales = Column(Float(53))
EVToSales = Column(Float(53))
EVToEBIT = Column(Float(53))
EVToEBITDA = Column(Float(53))
EVToNOPLAT = Column(Float(53))
EVToIC = Column(Float(53))
FCFFPS = Column(Float(53))
FCFFToEarningAfterNonRecurring = Column(Float(53))
FCFFP = Column(Float(53))
ProfitToAsset = Column(Float(53))
GrossProfitRatio = Column(Float(53))
LATO = Column(Float(53))
FATO = Column(Float(53))
TATO = Column(Float(53))
EquityTO = Column(Float(53))
PayableTO = Column(Float(53))
RecievableTO = Column(Float(53))
RevenueGrowth = Column(Float(53))
GrossProfitGrowth = Column(Float(53))
NetProfitGrowth = Column(Float(53))
GrossCFToRevenue = Column(Float(53))
CFToRevenue = Column(Float(53))
CFToProfit = Column(Float(53))
CFToAsset = Column(Float(53))
GrossCFGrowth = Column(Float(53))
CFGrowth = Column(Float(53))
ICFGrowth = Column(Float(53))
AveAmount60 = Column(Float(53))
PeriodReturn60 = Column(Float(53))
AmountRatio60to250 = Column(Float(53))
CFPS = Column(Float(53))
CFP = Column(Float(53))
NetCFGrowth = Column(Float(53))
NetCFGrowthP = Column(Float(53))
NetCash = Column(Float(53))
NetCashP = Column(Float(53))
BVPSGrowth = Column(Float(53))
EquityPSGrowth = Column(Float(53))
WholeSales = Column(Float(53))
WholeProfitAfterNonRecurring = Column(Float(53))
ExpenseRatio = Column(Float(53))
AcidTestRatio = Column(Float(53))
TimeInterestEarnedRatio = Column(Float(53))
DepositReceivedVsSale = Column(Float(53))
DebtRatioExcemptDepRec = Column(Float(53))
SNBARatio = Column(Float(53))
CFinc1 = Column(Float(53))
BDTO = Column(Float(53))
RVOL = Column(Float(53))
CHV = Column(Float(53))
VAL = Column(Float(53))
BETA = Column(Float(53))
MOMENTUM = Column(Float(53))
SIZE = Column(Float(53))
EARNYILD = Column(Float(53))
RESVOL = Column(Float(53))
GROWTH = Column(Float(53))
BTOP = Column(Float(53))
LEVERAGE = Column(Float(53))
LIQUIDTY = Column(Float(53))
SIZENL = Column(Float(53))
Bank = Column(BigInteger)
RealEstate = Column(BigInteger)
Health = Column(BigInteger)
Transportation = Column(BigInteger)
Mining = Column(BigInteger)
NonFerMetal = Column(BigInteger)
HouseApp = Column(BigInteger)
LeiService = Column(BigInteger)
MachiEquip = Column(BigInteger)
BuildDeco = Column(BigInteger)
CommeTrade = Column(BigInteger)
CONMAT = Column(BigInteger)
Auto = Column(BigInteger)
Textile = Column(BigInteger)
FoodBever = Column(BigInteger)
Electronics = Column(BigInteger)
Computer = Column(BigInteger)
LightIndus = Column(BigInteger)
Utilities = Column(BigInteger)
Telecom = Column(BigInteger)
AgriForest = Column(BigInteger)
CHEM = Column(BigInteger)
Media = Column(BigInteger)
IronSteel = Column(BigInteger)
NonBankFinan = Column(BigInteger)
ELECEQP = Column(BigInteger)
AERODEF = Column(BigInteger)
Conglomerates = Column(BigInteger)
COUNTRY = Column(BigInteger)
DROE = Column(Float(53))
IVR = Column(Float(53))
xueqiu_hotness = Column(Float(53))
con_eps = Column(Float(53))
con_eps_rolling = Column(Float(53))
con_na = Column(Float(53))
con_na_rolling = Column(Float(53))
con_np = Column(Float(53))
con_npcgrate_1w = Column(Float(53))
con_npcgrate_4w = Column(Float(53))
con_npcgrate_13w = Column(Float(53))
con_npcgrate_26w = Column(Float(53))
con_npcgrate_52w = Column(Float(53))
con_npcgrate_2y = Column(Float(53))
con_np_rolling = Column(Float(53))
con_np_yoy = Column(Float(53))
con_pb = Column(Float(53))
con_pb_order = Column(Float(53))
con_pb_rolling = Column(Float(53))
con_pb_rolling_order = Column(Float(53))
con_or = Column(Float(53))
con_pe = Column(Float(53))
con_pe_order = Column(Float(53))
con_pe_rolling = Column(Float(53))
con_pe_rolling_order = Column(Float(53))
con_peg = Column(Float(53))
con_peg_order = Column(Float(53))
con_peg_rolling = Column(Float(53))
con_peg_rolling_order = Column(Float(53))
con_roe = Column(Float(53))
con_target_price = Column(Float(53))
market_confidence_5d = Column(Float(53))
market_confidence_10d = Column(Float(53))
market_confidence_15d = Column(Float(53))
market_confidence_25d = Column(Float(53))
market_confidence_75d = Column(Float(53))
mcap = Column(Float(53))
optimism_confidence_5d = Column(Float(53))
optimism_confidence_10d = Column(Float(53))
optimism_confidence_15d = Column(Float(53))
optimism_confidence_25d = Column(Float(53))
optimism_confidence_75d = Column(Float(53))
pessimism_confidence_5d = Column(Float(53))
pessimism_confidence_10d = Column(Float(53))
pessimism_confidence_15d = Column(Float(53))
pessimism_confidence_25d = Column(Float(53))
pessimism_confidence_75d = Column(Float(53))
tcap = Column(Float(53))
d_srisk = Column(Float(53))
s_srisk = Column(Float(53))
l_srisk = Column(Float(53))
class DailyPortfolios(Base): class DailyPortfolios(Base):
__tablename__ = 'daily_portfolios' __tablename__ = 'daily_portfolios'
__table_args__ = ( __table_args__ = (
...@@ -670,6 +62,12 @@ class Experimental(Base): ...@@ -670,6 +62,12 @@ class Experimental(Base):
ep_q = Column(Float(53)) ep_q = Column(Float(53))
ep_q_d_1w = Column(Float(53)) ep_q_d_1w = Column(Float(53))
ev = Column(Float(53)) ev = Column(Float(53))
liq = Column(Float(53))
pure_liq_0 = Column(Float(53))
pure_liq_1 = Column(Float(53))
pure_liq_2 = Column(Float(53))
pure_liq_3 = Column(Float(53))
pure_liq_4 = Column(Float(53))
class FactorMaster(Base): class FactorMaster(Base):
...@@ -918,29 +316,6 @@ class Positions(Base): ...@@ -918,29 +316,6 @@ class Positions(Base):
weight = Column(JSON) weight = Column(JSON)
class QuantileAnalysis(Base):
__tablename__ = 'quantile_analysis'
__table_args__ = (
Index('quantile_idx', 'trade_date', 'portfolio', 'universe', 'benchmark', unique=True),
)
trade_date = Column(DateTime, primary_key=True, nullable=False)
portfolio = Column(String(50), primary_key=True, nullable=False)
universe = Column(String(20), primary_key=True, nullable=False)
benchmark = Column(Integer, primary_key=True, nullable=False)
source = Column(String(20), primary_key=True, nullable=False)
q1 = Column(Float(53))
q2 = Column(Float(53))
q3 = Column(Float(53))
q4 = Column(Float(53))
q5 = Column(Float(53))
q6 = Column(Float(53))
q7 = Column(Float(53))
q8 = Column(Float(53))
q9 = Column(Float(53))
q10 = Column(Float(53))
class RebalanceLog(Base): class RebalanceLog(Base):
__tablename__ = 'rebalance_log' __tablename__ = 'rebalance_log'
__table_args__ = ( __table_args__ = (
...@@ -1118,8 +493,6 @@ class RiskExposure(Base): ...@@ -1118,8 +493,6 @@ class RiskExposure(Base):
trade_date = Column(DateTime, primary_key=True, nullable=False) trade_date = Column(DateTime, primary_key=True, nullable=False)
code = Column(Integer, primary_key=True, nullable=False) code = Column(Integer, primary_key=True, nullable=False)
exchangeCD = Column(String(4))
secShortName = Column(String(20))
BETA = Column(Float(53)) BETA = Column(Float(53))
MOMENTUM = Column(Float(53)) MOMENTUM = Column(Float(53))
SIZE = Column(Float(53)) SIZE = Column(Float(53))
...@@ -1159,7 +532,6 @@ class RiskExposure(Base): ...@@ -1159,7 +532,6 @@ class RiskExposure(Base):
AERODEF = Column(BigInteger) AERODEF = Column(BigInteger)
Conglomerates = Column(BigInteger) Conglomerates = Column(BigInteger)
COUNTRY = Column(BigInteger) COUNTRY = Column(BigInteger)
updateTime = Column(DateTime)
class RiskMaster(Base): class RiskMaster(Base):
......
...@@ -14,8 +14,8 @@ from sqlalchemy import select ...@@ -14,8 +14,8 @@ from sqlalchemy import select
from sqlalchemy import join from sqlalchemy import join
from sqlalchemy import outerjoin from sqlalchemy import outerjoin
from alphamind.data.dbmodel.models import Universe as UniverseTable from alphamind.data.dbmodel.models import Universe as UniverseTable
from alphamind.data.dbmodel.models import FullFactor
from alphamind.data.engines.utilities import _map_factors from alphamind.data.engines.utilities import _map_factors
from alphamind.data.dbmodel.models import Market
from alphamind.data.engines.utilities import factor_tables from alphamind.data.engines.utilities import factor_tables
from alphamind.data.transformer import Transformer from alphamind.data.transformer import Transformer
from alphamind.utilities import encode from alphamind.utilities import encode
...@@ -86,22 +86,22 @@ class Universe(object): ...@@ -86,22 +86,22 @@ class Universe(object):
dependency = transformer.dependency dependency = transformer.dependency
factor_cols = _map_factors(dependency, factor_tables) factor_cols = _map_factors(dependency, factor_tables)
big_table = FullFactor big_table = Market
for t in set(factor_cols.values()): for t in set(factor_cols.values()):
if t.__table__.name != FullFactor.__table__.name: if t.__table__.name != Market.__table__.name:
big_table = outerjoin(big_table, t, and_(FullFactor.trade_date == t.trade_date, big_table = outerjoin(big_table, t, and_(Market.trade_date == t.trade_date,
FullFactor.code == t.code, Market.code == t.code,
FullFactor.trade_date.in_( Market.trade_date.in_(
dates) if dates else FullFactor.trade_date.between( dates) if dates else Market.trade_date.between(
start_date, end_date))) start_date, end_date)))
big_table = join(big_table, UniverseTable, big_table = join(big_table, UniverseTable,
and_(FullFactor.trade_date == UniverseTable.trade_date, and_(Market.trade_date == UniverseTable.trade_date,
FullFactor.code == UniverseTable.code, Market.code == UniverseTable.code,
universe_cond)) universe_cond))
query = select( query = select(
[FullFactor.trade_date, FullFactor.code] + list(factor_cols.keys())) \ [Market.trade_date, Market.code] + list(factor_cols.keys())) \
.select_from(big_table).distinct() .select_from(big_table).distinct()
df = pd.read_sql(query, engine.engine).sort_values(['trade_date', 'code']).dropna() df = pd.read_sql(query, engine.engine).sort_values(['trade_date', 'code']).dropna()
......
...@@ -18,10 +18,11 @@ from alphamind.data.dbmodel.models import Gogoal ...@@ -18,10 +18,11 @@ from alphamind.data.dbmodel.models import Gogoal
from alphamind.data.dbmodel.models import Experimental from alphamind.data.dbmodel.models import Experimental
from alphamind.data.dbmodel.models import LegacyFactor from alphamind.data.dbmodel.models import LegacyFactor
from alphamind.data.dbmodel.models import Tiny from alphamind.data.dbmodel.models import Tiny
from alphamind.data.dbmodel.models import RiskExposure
from alphamind.data.engines.industries import INDUSTRY_MAPPING from alphamind.data.engines.industries import INDUSTRY_MAPPING
factor_tables = [Uqer, Gogoal, Experimental, LegacyFactor, Tiny] factor_tables = [RiskExposure, Uqer, Gogoal, Experimental, LegacyFactor, Tiny]
def _map_risk_model_table(risk_model: str) -> tuple: def _map_risk_model_table(risk_model: str) -> tuple:
......
...@@ -9,6 +9,7 @@ from typing import Optional ...@@ -9,6 +9,7 @@ from typing import Optional
from typing import List from typing import List
import numpy as np import numpy as np
from alphamind.data.neutralize import neutralize from alphamind.data.neutralize import neutralize
from alphamind.utilities import alpha_logger
def factor_processing(raw_factors: np.ndarray, def factor_processing(raw_factors: np.ndarray,
...@@ -29,6 +30,8 @@ def factor_processing(raw_factors: np.ndarray, ...@@ -29,6 +30,8 @@ def factor_processing(raw_factors: np.ndarray,
if post_process: if post_process:
for p in post_process: for p in post_process:
if p.__name__ == 'winsorize_normal':
alpha_logger.warning("winsorize_normal normally should not be done after neutralize")
new_factors = p(new_factors, groups=groups) new_factors = p(new_factors, groups=groups)
return new_factors return new_factors
Subproject commit d04d8ac4ca33c4482ac2baae9b537a0df0d1b036 Subproject commit 1dcecd88728512ff50730f418d9d58195bf33851
...@@ -17,7 +17,8 @@ def linear_builder(er: np.ndarray, ...@@ -17,7 +17,8 @@ def linear_builder(er: np.ndarray,
risk_constraints: np.ndarray, risk_constraints: np.ndarray,
risk_target: Tuple[np.ndarray, np.ndarray], risk_target: Tuple[np.ndarray, np.ndarray],
turn_over_target: float = None, 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() er = er.flatten()
n, m = risk_constraints.shape n, m = risk_constraints.shape
...@@ -36,7 +37,7 @@ def linear_builder(er: np.ndarray, ...@@ -36,7 +37,7 @@ def linear_builder(er: np.ndarray,
if not turn_over_target: if not turn_over_target:
cons_matrix = np.concatenate((risk_constraints.T, risk_lbound, risk_ubound), axis=1) 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() status = opt.status()
...@@ -77,7 +78,7 @@ def linear_builder(er: np.ndarray, ...@@ -77,7 +78,7 @@ def linear_builder(er: np.ndarray,
risk_ubound = np.concatenate((risk_ubound, np.inf * np.ones((n, 1))), axis=0) 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) 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() status = opt.status()
......
...@@ -11,15 +11,15 @@ from alphamind.utilities import simple_abssum ...@@ -11,15 +11,15 @@ from alphamind.utilities import simple_abssum
from alphamind.utilities import transform from alphamind.utilities import transform
def long_short_build(er: np.ndarray, def long_short_builder(er: np.ndarray,
leverage: float=1., leverage: float = 1.,
groups: np.ndarray=None, groups: np.ndarray = None,
masks: np.ndarray=None) -> np.ndarray: masks: np.ndarray = None) -> np.ndarray:
er = er.copy() er = er.copy()
if masks is not None: if masks is not None:
er[~masks] = 0. er[masks] = 0.
er[~masks] = er[~masks] - er[~masks].mean()
if er.ndim == 1: if er.ndim == 1:
er = er.reshape((-1, 1)) er = er.reshape((-1, 1))
......
...@@ -37,6 +37,25 @@ class TestLinearBuild(unittest.TestCase): ...@@ -37,6 +37,25 @@ class TestLinearBuild(unittest.TestCase):
expected_risk = np.zeros(self.risk_exp.shape[1]) expected_risk = np.zeros(self.risk_exp.shape[1])
np.testing.assert_array_almost_equal(calc_risk, expected_risk) np.testing.assert_array_almost_equal(calc_risk, expected_risk)
def test_linear_build_with_interior(self):
bm = self.bm / self.bm.sum()
eplson = 1e-6
status, _, w = linear_builder(self.er,
0.,
0.01,
self.risk_exp,
(bm @ self.risk_exp, bm @ self.risk_exp),
method='interior')
self.assertEqual(status, 'optimal')
self.assertAlmostEqual(np.sum(w), 1.)
self.assertTrue(np.all(w <= 0.01 + eplson))
self.assertTrue(np.all(w >= -eplson))
calc_risk = (w - bm) @ self.risk_exp
expected_risk = np.zeros(self.risk_exp.shape[1])
np.testing.assert_array_almost_equal(calc_risk, expected_risk)
def test_linear_build_with_inequality_constraints(self): def test_linear_build_with_inequality_constraints(self):
bm = self.bm / self.bm.sum() bm = self.bm / self.bm.sum()
eplson = 1e-6 eplson = 1e-6
......
...@@ -8,7 +8,7 @@ Created on 2017-5-9 ...@@ -8,7 +8,7 @@ Created on 2017-5-9
import unittest import unittest
import numpy as np import numpy as np
import pandas as pd import pandas as pd
from alphamind.portfolio.longshortbulder import long_short_build from alphamind.portfolio.longshortbulder import long_short_builder
class TestLongShortBuild(unittest.TestCase): class TestLongShortBuild(unittest.TestCase):
...@@ -17,37 +17,38 @@ class TestLongShortBuild(unittest.TestCase): ...@@ -17,37 +17,38 @@ class TestLongShortBuild(unittest.TestCase):
self.x = np.random.randn(3000, 10) self.x = np.random.randn(3000, 10)
self.groups = np.random.randint(10, 40, size=3000) self.groups = np.random.randint(10, 40, size=3000)
choices = np.random.choice(3000, 100, replace=False) choices = np.random.choice(3000, 100, replace=False)
self.masks = np.full(3000, True, dtype=bool) self.masks = np.full(3000, False, dtype=bool)
self.masks[choices] = False self.masks[choices] = True
def test_long_short_build(self): def test_long_short_build(self):
x = self.x[:, 0].flatten() x = self.x[:, 0].flatten()
calc_weights = long_short_build(x).flatten() calc_weights = long_short_builder(x).flatten()
expected_weights = x / np.abs(x).sum() expected_weights = x / np.abs(x).sum()
np.testing.assert_array_almost_equal(calc_weights, expected_weights) np.testing.assert_array_almost_equal(calc_weights, expected_weights)
calc_weights = long_short_build(self.x, leverage=2) calc_weights = long_short_builder(self.x, leverage=2)
expected_weights = self.x / np.abs(self.x).sum(axis=0) * 2 expected_weights = self.x / np.abs(self.x).sum(axis=0) * 2
np.testing.assert_array_almost_equal(calc_weights, expected_weights) np.testing.assert_array_almost_equal(calc_weights, expected_weights)
def test_long_short_build_with_group(self): def test_long_short_build_with_group(self):
x = self.x[:, 0].flatten() x = self.x[:, 0].flatten()
calc_weights = long_short_build(x, groups=self.groups).flatten() calc_weights = long_short_builder(x, groups=self.groups).flatten()
expected_weights = pd.Series(x).groupby(self.groups).apply(lambda s: s / np.abs(s).sum()) expected_weights = pd.Series(x).groupby(self.groups).apply(lambda s: s / np.abs(s).sum())
np.testing.assert_array_almost_equal(calc_weights, expected_weights) np.testing.assert_array_almost_equal(calc_weights, expected_weights)
calc_weights = long_short_build(self.x, groups=self.groups) calc_weights = long_short_builder(self.x, groups=self.groups)
expected_weights = pd.DataFrame(self.x).groupby(self.groups).apply(lambda s: s / np.abs(s).sum(axis=0)) expected_weights = pd.DataFrame(self.x).groupby(self.groups).apply(lambda s: s / np.abs(s).sum(axis=0))
np.testing.assert_array_almost_equal(calc_weights, expected_weights) np.testing.assert_array_almost_equal(calc_weights, expected_weights)
def test_long_short_build_with_masks(self): def test_long_short_build_with_masks(self):
x = self.x[:, 0].flatten() x = self.x[:, 0].flatten()
calc_weights = long_short_builder(x, masks=self.masks, leverage=1.).flatten()
self.assertAlmostEqual(calc_weights.sum(), 0.)
masked_x = x.copy() masked_x = x.copy()
masked_x[~self.masks] = 0. masked_x[self.masks] = 0.
leverage = np.abs(masked_x).sum() masked_x[~self.masks] = masked_x[~self.masks] - masked_x[~self.masks].mean()
calc_weights = long_short_build(x, masks=self.masks, leverage=leverage).flatten() expected_weights = masked_x / np.abs(masked_x).sum()
expected_weights = x.copy()
expected_weights[~self.masks] = 0.
np.testing.assert_array_almost_equal(calc_weights, expected_weights) np.testing.assert_array_almost_equal(calc_weights, expected_weights)
......
...@@ -21,7 +21,10 @@ fi ...@@ -21,7 +21,10 @@ fi
cd ../.. cd ../..
cd alphamind/pfopt cd alphamind/pfopt
export BUILD_TEST=OFF
./build_linux.sh ./build_linux.sh
if [ $? -ne 0 ] ; then if [ $? -ne 0 ] ; then
cd ../.. cd ../..
exit 1 exit 1
......
...@@ -19,6 +19,7 @@ cd ../.. ...@@ -19,6 +19,7 @@ cd ../..
cd alphamind\pfopt cd alphamind\pfopt
set BUILD_TEST=OFF
call build_windows.bat call build_windows.bat
if %errorlevel% neq 0 exit /b 1 if %errorlevel% neq 0 exit /b 1
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
"cells": [ "cells": [
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 4, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 5, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -53,7 +53,7 @@ ...@@ -53,7 +53,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 6, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -88,7 +88,7 @@ ...@@ -88,7 +88,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 7, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -222,7 +222,7 @@ ...@@ -222,7 +222,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 8, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -231,372 +231,9 @@ ...@@ -231,372 +231,9 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 9, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"name": "stderr",
"output_type": "stream",
"text": [
"2018-03-22 14:40:34,692 - ALPHA_MIND - INFO - 2017-01-03 00:00:00: 800\n",
"2018-03-22 14:40:34,770 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 full re-balance\n",
"2018-03-22 14:40:34,793 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 is finished\n",
"2018-03-22 14:40:34,802 - ALPHA_MIND - INFO - 2017-01-17 00:00:00: 800\n",
"2018-03-22 14:40:34,810 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 full re-balance\n",
"2018-03-22 14:40:34,898 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 is finished\n",
"2018-03-22 14:40:34,913 - ALPHA_MIND - INFO - 2017-02-07 00:00:00: 800\n",
"2018-03-22 14:40:34,931 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 full re-balance\n",
"2018-03-22 14:40:34,964 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 is finished\n",
"2018-03-22 14:40:34,976 - ALPHA_MIND - INFO - 2017-02-21 00:00:00: 799\n",
"2018-03-22 14:40:34,986 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 full re-balance\n",
"2018-03-22 14:40:35,019 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 is finished\n",
"2018-03-22 14:40:35,029 - ALPHA_MIND - INFO - 2017-03-07 00:00:00: 800\n",
"2018-03-22 14:40:35,037 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 full re-balance\n",
"2018-03-22 14:40:35,062 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 is finished\n",
"2018-03-22 14:40:35,071 - ALPHA_MIND - INFO - 2017-03-21 00:00:00: 800\n",
"2018-03-22 14:40:35,079 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 full re-balance\n",
"2018-03-22 14:40:35,104 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 is finished\n",
"2018-03-22 14:40:35,114 - ALPHA_MIND - INFO - 2017-04-06 00:00:00: 800\n",
"2018-03-22 14:40:35,121 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 full re-balance\n",
"2018-03-22 14:40:35,147 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 is finished\n",
"2018-03-22 14:40:35,157 - ALPHA_MIND - INFO - 2017-04-20 00:00:00: 800\n",
"2018-03-22 14:40:35,164 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 full re-balance\n",
"2018-03-22 14:40:35,191 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 is finished\n",
"2018-03-22 14:40:35,201 - ALPHA_MIND - INFO - 2017-05-05 00:00:00: 800\n",
"2018-03-22 14:40:35,209 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 full re-balance\n",
"2018-03-22 14:40:35,234 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 is finished\n",
"2018-03-22 14:40:35,244 - ALPHA_MIND - INFO - 2017-05-19 00:00:00: 800\n",
"2018-03-22 14:40:35,251 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 full re-balance\n",
"2018-03-22 14:40:35,277 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 is finished\n",
"2018-03-22 14:40:35,287 - ALPHA_MIND - INFO - 2017-06-06 00:00:00: 800\n",
"2018-03-22 14:40:35,294 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 full re-balance\n",
"2018-03-22 14:40:35,320 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 is finished\n",
"2018-03-22 14:40:35,330 - ALPHA_MIND - INFO - 2017-06-20 00:00:00: 800\n",
"2018-03-22 14:40:35,337 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 full re-balance\n",
"2018-03-22 14:40:35,362 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 is finished\n",
"2018-03-22 14:40:35,372 - ALPHA_MIND - INFO - 2017-07-04 00:00:00: 800\n",
"2018-03-22 14:40:35,380 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 full re-balance\n",
"2018-03-22 14:40:35,406 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 is finished\n",
"2018-03-22 14:40:35,416 - ALPHA_MIND - INFO - 2017-07-18 00:00:00: 800\n",
"2018-03-22 14:40:35,423 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 full re-balance\n",
"2018-03-22 14:40:35,448 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 is finished\n",
"2018-03-22 14:40:35,458 - ALPHA_MIND - INFO - 2017-08-01 00:00:00: 800\n",
"2018-03-22 14:40:35,466 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 full re-balance\n",
"2018-03-22 14:40:35,492 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 is finished\n",
"2018-03-22 14:40:35,503 - ALPHA_MIND - INFO - 2017-08-15 00:00:00: 800\n",
"2018-03-22 14:40:35,511 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 full re-balance\n",
"2018-03-22 14:40:35,536 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 is finished\n",
"2018-03-22 14:40:35,546 - ALPHA_MIND - INFO - 2017-08-29 00:00:00: 800\n",
"2018-03-22 14:40:35,554 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 full re-balance\n",
"2018-03-22 14:40:35,580 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 is finished\n",
"2018-03-22 14:40:35,590 - ALPHA_MIND - INFO - 2017-09-12 00:00:00: 800\n",
"2018-03-22 14:40:35,598 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 full re-balance\n",
"2018-03-22 14:40:35,624 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 is finished\n",
"2018-03-22 14:40:35,637 - ALPHA_MIND - INFO - 2017-09-26 00:00:00: 800\n",
"2018-03-22 14:40:35,650 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 full re-balance\n",
"2018-03-22 14:40:35,682 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 is finished\n",
"2018-03-22 14:40:35,692 - ALPHA_MIND - INFO - 2017-10-17 00:00:00: 800\n",
"2018-03-22 14:40:35,701 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 full re-balance\n",
"2018-03-22 14:40:35,726 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 is finished\n",
"2018-03-22 14:40:35,736 - ALPHA_MIND - INFO - 2017-10-31 00:00:00: 800\n",
"2018-03-22 14:40:35,743 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 full re-balance\n",
"2018-03-22 14:40:35,768 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 is finished\n",
"2018-03-22 14:40:35,778 - ALPHA_MIND - INFO - 2017-11-14 00:00:00: 800\n",
"2018-03-22 14:40:35,785 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 full re-balance\n",
"2018-03-22 14:40:35,810 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 is finished\n",
"2018-03-22 14:40:35,819 - ALPHA_MIND - INFO - 2017-11-28 00:00:00: 800\n",
"2018-03-22 14:40:35,827 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 full re-balance\n",
"2018-03-22 14:40:35,852 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 is finished\n",
"2018-03-22 14:40:35,861 - ALPHA_MIND - INFO - 2017-12-12 00:00:00: 800\n",
"2018-03-22 14:40:35,869 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 full re-balance\n",
"2018-03-22 14:40:35,894 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 is finished\n",
"2018-03-22 14:40:35,904 - ALPHA_MIND - INFO - 2017-12-26 00:00:00: 800\n",
"2018-03-22 14:40:35,912 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 full re-balance\n",
"2018-03-22 14:40:35,936 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 is finished\n",
"2018-03-22 14:40:35,948 - ALPHA_MIND - INFO - 2018-01-10 00:00:00: 800\n",
"2018-03-22 14:40:35,956 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 full re-balance\n",
"2018-03-22 14:40:35,980 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 is finished\n",
"2018-03-22 14:40:35,990 - ALPHA_MIND - INFO - 2018-01-24 00:00:00: 800\n",
"2018-03-22 14:40:35,997 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 full re-balance\n",
"2018-03-22 14:40:36,023 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 is finished\n",
"2018-03-22 14:40:36,033 - ALPHA_MIND - INFO - 2018-02-07 00:00:00: 800\n",
"2018-03-22 14:40:36,040 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 full re-balance\n",
"2018-03-22 14:40:36,065 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 is finished\n",
"2018-03-22 14:40:42,703 - ALPHA_MIND - INFO - 2017-01-03 00:00:00: 800\n",
"2018-03-22 14:40:42,719 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 full re-balance\n",
"2018-03-22 14:40:42,747 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 is finished\n",
"2018-03-22 14:40:42,757 - ALPHA_MIND - INFO - 2017-01-17 00:00:00: 800\n",
"2018-03-22 14:40:42,765 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 full re-balance\n",
"2018-03-22 14:40:42,790 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 is finished\n",
"2018-03-22 14:40:42,800 - ALPHA_MIND - INFO - 2017-02-07 00:00:00: 800\n",
"2018-03-22 14:40:42,807 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 full re-balance\n",
"2018-03-22 14:40:42,833 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 is finished\n",
"2018-03-22 14:40:42,843 - ALPHA_MIND - INFO - 2017-02-21 00:00:00: 799\n",
"2018-03-22 14:40:42,850 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 full re-balance\n",
"2018-03-22 14:40:42,876 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 is finished\n",
"2018-03-22 14:40:42,885 - ALPHA_MIND - INFO - 2017-03-07 00:00:00: 800\n",
"2018-03-22 14:40:42,893 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 full re-balance\n",
"2018-03-22 14:40:42,918 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 is finished\n",
"2018-03-22 14:40:42,928 - ALPHA_MIND - INFO - 2017-03-21 00:00:00: 800\n",
"2018-03-22 14:40:42,935 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 full re-balance\n",
"2018-03-22 14:40:42,961 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 is finished\n",
"2018-03-22 14:40:42,971 - ALPHA_MIND - INFO - 2017-04-06 00:00:00: 800\n",
"2018-03-22 14:40:42,978 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 full re-balance\n",
"2018-03-22 14:40:43,003 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 is finished\n",
"2018-03-22 14:40:43,013 - ALPHA_MIND - INFO - 2017-04-20 00:00:00: 800\n",
"2018-03-22 14:40:43,020 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 full re-balance\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2018-03-22 14:40:43,046 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 is finished\n",
"2018-03-22 14:40:43,056 - ALPHA_MIND - INFO - 2017-05-05 00:00:00: 800\n",
"2018-03-22 14:40:43,063 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 full re-balance\n",
"2018-03-22 14:40:43,089 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 is finished\n",
"2018-03-22 14:40:43,099 - ALPHA_MIND - INFO - 2017-05-19 00:00:00: 800\n",
"2018-03-22 14:40:43,106 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 full re-balance\n",
"2018-03-22 14:40:43,132 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 is finished\n",
"2018-03-22 14:40:43,141 - ALPHA_MIND - INFO - 2017-06-06 00:00:00: 800\n",
"2018-03-22 14:40:43,149 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 full re-balance\n",
"2018-03-22 14:40:43,175 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 is finished\n",
"2018-03-22 14:40:43,184 - ALPHA_MIND - INFO - 2017-06-20 00:00:00: 800\n",
"2018-03-22 14:40:43,192 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 full re-balance\n",
"2018-03-22 14:40:43,217 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 is finished\n",
"2018-03-22 14:40:43,227 - ALPHA_MIND - INFO - 2017-07-04 00:00:00: 800\n",
"2018-03-22 14:40:43,234 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 full re-balance\n",
"2018-03-22 14:40:43,262 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 is finished\n",
"2018-03-22 14:40:43,272 - ALPHA_MIND - INFO - 2017-07-18 00:00:00: 800\n",
"2018-03-22 14:40:43,279 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 full re-balance\n",
"2018-03-22 14:40:43,304 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 is finished\n",
"2018-03-22 14:40:43,314 - ALPHA_MIND - INFO - 2017-08-01 00:00:00: 800\n",
"2018-03-22 14:40:43,321 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 full re-balance\n",
"2018-03-22 14:40:43,346 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 is finished\n",
"2018-03-22 14:40:43,356 - ALPHA_MIND - INFO - 2017-08-15 00:00:00: 800\n",
"2018-03-22 14:40:43,363 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 full re-balance\n",
"2018-03-22 14:40:43,388 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 is finished\n",
"2018-03-22 14:40:43,398 - ALPHA_MIND - INFO - 2017-08-29 00:00:00: 800\n",
"2018-03-22 14:40:43,405 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 full re-balance\n",
"2018-03-22 14:40:43,430 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 is finished\n",
"2018-03-22 14:40:43,444 - ALPHA_MIND - INFO - 2017-09-12 00:00:00: 800\n",
"2018-03-22 14:40:43,456 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 full re-balance\n",
"2018-03-22 14:40:43,481 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 is finished\n",
"2018-03-22 14:40:43,493 - ALPHA_MIND - INFO - 2017-09-26 00:00:00: 800\n",
"2018-03-22 14:40:43,501 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 full re-balance\n",
"2018-03-22 14:40:43,526 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 is finished\n",
"2018-03-22 14:40:43,536 - ALPHA_MIND - INFO - 2017-10-17 00:00:00: 800\n",
"2018-03-22 14:40:43,543 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 full re-balance\n",
"2018-03-22 14:40:43,569 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 is finished\n",
"2018-03-22 14:40:43,579 - ALPHA_MIND - INFO - 2017-10-31 00:00:00: 800\n",
"2018-03-22 14:40:43,586 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 full re-balance\n",
"2018-03-22 14:40:43,611 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 is finished\n",
"2018-03-22 14:40:43,621 - ALPHA_MIND - INFO - 2017-11-14 00:00:00: 800\n",
"2018-03-22 14:40:43,628 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 full re-balance\n",
"2018-03-22 14:40:43,654 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 is finished\n",
"2018-03-22 14:40:43,664 - ALPHA_MIND - INFO - 2017-11-28 00:00:00: 800\n",
"2018-03-22 14:40:43,671 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 full re-balance\n",
"2018-03-22 14:40:43,696 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 is finished\n",
"2018-03-22 14:40:43,705 - ALPHA_MIND - INFO - 2017-12-12 00:00:00: 799\n",
"2018-03-22 14:40:43,713 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 full re-balance\n",
"2018-03-22 14:40:43,738 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 is finished\n",
"2018-03-22 14:40:43,748 - ALPHA_MIND - INFO - 2017-12-26 00:00:00: 799\n",
"2018-03-22 14:40:43,755 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 full re-balance\n",
"2018-03-22 14:40:43,780 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 is finished\n",
"2018-03-22 14:40:43,790 - ALPHA_MIND - INFO - 2018-01-10 00:00:00: 799\n",
"2018-03-22 14:40:43,797 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 full re-balance\n",
"2018-03-22 14:40:43,822 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 is finished\n",
"2018-03-22 14:40:43,834 - ALPHA_MIND - INFO - 2018-01-24 00:00:00: 799\n",
"2018-03-22 14:40:43,841 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 full re-balance\n",
"2018-03-22 14:40:43,866 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 is finished\n",
"2018-03-22 14:40:43,876 - ALPHA_MIND - INFO - 2018-02-07 00:00:00: 799\n",
"2018-03-22 14:40:43,883 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 full re-balance\n",
"2018-03-22 14:40:43,908 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 is finished\n",
"2018-03-22 14:40:50,656 - ALPHA_MIND - INFO - 2017-01-03 00:00:00: 800\n",
"2018-03-22 14:40:50,666 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 full re-balance\n",
"2018-03-22 14:40:50,694 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 is finished\n",
"2018-03-22 14:40:50,704 - ALPHA_MIND - INFO - 2017-01-17 00:00:00: 800\n",
"2018-03-22 14:40:50,711 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 full re-balance\n",
"2018-03-22 14:40:50,737 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 is finished\n",
"2018-03-22 14:40:50,746 - ALPHA_MIND - INFO - 2017-02-07 00:00:00: 800\n",
"2018-03-22 14:40:50,754 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 full re-balance\n",
"2018-03-22 14:40:50,780 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 is finished\n",
"2018-03-22 14:40:50,790 - ALPHA_MIND - INFO - 2017-02-21 00:00:00: 799\n",
"2018-03-22 14:40:50,797 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 full re-balance\n",
"2018-03-22 14:40:50,824 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 is finished\n",
"2018-03-22 14:40:50,833 - ALPHA_MIND - INFO - 2017-03-07 00:00:00: 800\n",
"2018-03-22 14:40:50,841 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 full re-balance\n",
"2018-03-22 14:40:50,867 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 is finished\n",
"2018-03-22 14:40:50,878 - ALPHA_MIND - INFO - 2017-03-21 00:00:00: 800\n",
"2018-03-22 14:40:50,886 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 full re-balance\n",
"2018-03-22 14:40:50,912 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 is finished\n",
"2018-03-22 14:40:50,924 - ALPHA_MIND - INFO - 2017-04-06 00:00:00: 800\n",
"2018-03-22 14:40:50,932 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 full re-balance\n",
"2018-03-22 14:40:50,958 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 is finished\n",
"2018-03-22 14:40:50,969 - ALPHA_MIND - INFO - 2017-04-20 00:00:00: 800\n",
"2018-03-22 14:40:50,976 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 full re-balance\n",
"2018-03-22 14:40:51,002 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 is finished\n",
"2018-03-22 14:40:51,011 - ALPHA_MIND - INFO - 2017-05-05 00:00:00: 800\n",
"2018-03-22 14:40:51,019 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 full re-balance\n",
"2018-03-22 14:40:51,045 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 is finished\n",
"2018-03-22 14:40:51,054 - ALPHA_MIND - INFO - 2017-05-19 00:00:00: 800\n",
"2018-03-22 14:40:51,062 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 full re-balance\n",
"2018-03-22 14:40:51,087 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 is finished\n",
"2018-03-22 14:40:51,097 - ALPHA_MIND - INFO - 2017-06-06 00:00:00: 800\n",
"2018-03-22 14:40:51,105 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 full re-balance\n",
"2018-03-22 14:40:51,131 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 is finished\n",
"2018-03-22 14:40:51,142 - ALPHA_MIND - INFO - 2017-06-20 00:00:00: 800\n",
"2018-03-22 14:40:51,150 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 full re-balance\n",
"2018-03-22 14:40:51,193 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 is finished\n",
"2018-03-22 14:40:51,212 - ALPHA_MIND - INFO - 2017-07-04 00:00:00: 800\n",
"2018-03-22 14:40:51,229 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 full re-balance\n",
"2018-03-22 14:40:51,276 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 is finished\n",
"2018-03-22 14:40:51,295 - ALPHA_MIND - INFO - 2017-07-18 00:00:00: 800\n",
"2018-03-22 14:40:51,309 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 full re-balance\n",
"2018-03-22 14:40:51,342 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 is finished\n",
"2018-03-22 14:40:51,355 - ALPHA_MIND - INFO - 2017-08-01 00:00:00: 800\n",
"2018-03-22 14:40:51,363 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 full re-balance\n",
"2018-03-22 14:40:51,390 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 is finished\n",
"2018-03-22 14:40:51,401 - ALPHA_MIND - INFO - 2017-08-15 00:00:00: 800\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2018-03-22 14:40:51,409 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 full re-balance\n",
"2018-03-22 14:40:51,438 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 is finished\n",
"2018-03-22 14:40:51,450 - ALPHA_MIND - INFO - 2017-08-29 00:00:00: 800\n",
"2018-03-22 14:40:51,460 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 full re-balance\n",
"2018-03-22 14:40:51,487 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 is finished\n",
"2018-03-22 14:40:51,499 - ALPHA_MIND - INFO - 2017-09-12 00:00:00: 800\n",
"2018-03-22 14:40:51,507 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 full re-balance\n",
"2018-03-22 14:40:51,534 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 is finished\n",
"2018-03-22 14:40:51,544 - ALPHA_MIND - INFO - 2017-09-26 00:00:00: 800\n",
"2018-03-22 14:40:51,553 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 full re-balance\n",
"2018-03-22 14:40:51,582 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 is finished\n",
"2018-03-22 14:40:51,592 - ALPHA_MIND - INFO - 2017-10-17 00:00:00: 800\n",
"2018-03-22 14:40:51,600 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 full re-balance\n",
"2018-03-22 14:40:51,627 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 is finished\n",
"2018-03-22 14:40:51,638 - ALPHA_MIND - INFO - 2017-10-31 00:00:00: 800\n",
"2018-03-22 14:40:51,646 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 full re-balance\n",
"2018-03-22 14:40:51,672 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 is finished\n",
"2018-03-22 14:40:51,683 - ALPHA_MIND - INFO - 2017-11-14 00:00:00: 800\n",
"2018-03-22 14:40:51,692 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 full re-balance\n",
"2018-03-22 14:40:51,718 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 is finished\n",
"2018-03-22 14:40:51,729 - ALPHA_MIND - INFO - 2017-11-28 00:00:00: 800\n",
"2018-03-22 14:40:51,737 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 full re-balance\n",
"2018-03-22 14:40:51,763 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 is finished\n",
"2018-03-22 14:40:51,774 - ALPHA_MIND - INFO - 2017-12-12 00:00:00: 800\n",
"2018-03-22 14:40:51,782 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 full re-balance\n",
"2018-03-22 14:40:51,810 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 is finished\n",
"2018-03-22 14:40:51,821 - ALPHA_MIND - INFO - 2017-12-26 00:00:00: 800\n",
"2018-03-22 14:40:51,829 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 full re-balance\n",
"2018-03-22 14:40:51,856 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 is finished\n",
"2018-03-22 14:40:51,866 - ALPHA_MIND - INFO - 2018-01-10 00:00:00: 800\n",
"2018-03-22 14:40:51,874 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 full re-balance\n",
"2018-03-22 14:40:51,901 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 is finished\n",
"2018-03-22 14:40:51,911 - ALPHA_MIND - INFO - 2018-01-24 00:00:00: 800\n",
"2018-03-22 14:40:51,920 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 full re-balance\n",
"2018-03-22 14:40:51,946 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 is finished\n",
"2018-03-22 14:40:51,956 - ALPHA_MIND - INFO - 2018-02-07 00:00:00: 800\n",
"2018-03-22 14:40:51,964 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 full re-balance\n",
"2018-03-22 14:40:51,991 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 is finished\n",
"2018-03-22 14:40:58,929 - ALPHA_MIND - INFO - 2017-01-03 00:00:00: 800\n",
"2018-03-22 14:40:58,939 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 full re-balance\n",
"2018-03-22 14:40:58,966 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 is finished\n",
"2018-03-22 14:40:58,976 - ALPHA_MIND - INFO - 2017-01-17 00:00:00: 800\n",
"2018-03-22 14:40:58,983 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 full re-balance\n",
"2018-03-22 14:40:59,008 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 is finished\n",
"2018-03-22 14:40:59,018 - ALPHA_MIND - INFO - 2017-02-07 00:00:00: 800\n",
"2018-03-22 14:40:59,025 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 full re-balance\n",
"2018-03-22 14:40:59,051 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 is finished\n",
"2018-03-22 14:40:59,061 - ALPHA_MIND - INFO - 2017-02-21 00:00:00: 799\n",
"2018-03-22 14:40:59,068 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 full re-balance\n",
"2018-03-22 14:40:59,094 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 is finished\n",
"2018-03-22 14:40:59,103 - ALPHA_MIND - INFO - 2017-03-07 00:00:00: 800\n",
"2018-03-22 14:40:59,111 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 full re-balance\n",
"2018-03-22 14:40:59,136 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 is finished\n",
"2018-03-22 14:40:59,146 - ALPHA_MIND - INFO - 2017-03-21 00:00:00: 800\n",
"2018-03-22 14:40:59,154 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 full re-balance\n",
"2018-03-22 14:40:59,179 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 is finished\n",
"2018-03-22 14:40:59,188 - ALPHA_MIND - INFO - 2017-04-06 00:00:00: 800\n",
"2018-03-22 14:40:59,196 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 full re-balance\n",
"2018-03-22 14:40:59,220 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 is finished\n",
"2018-03-22 14:40:59,230 - ALPHA_MIND - INFO - 2017-04-20 00:00:00: 800\n",
"2018-03-22 14:40:59,238 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 full re-balance\n",
"2018-03-22 14:40:59,263 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 is finished\n",
"2018-03-22 14:40:59,273 - ALPHA_MIND - INFO - 2017-05-05 00:00:00: 800\n",
"2018-03-22 14:40:59,281 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 full re-balance\n",
"2018-03-22 14:40:59,306 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 is finished\n",
"2018-03-22 14:40:59,316 - ALPHA_MIND - INFO - 2017-05-19 00:00:00: 800\n",
"2018-03-22 14:40:59,324 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 full re-balance\n",
"2018-03-22 14:40:59,349 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 is finished\n",
"2018-03-22 14:40:59,359 - ALPHA_MIND - INFO - 2017-06-06 00:00:00: 800\n",
"2018-03-22 14:40:59,366 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 full re-balance\n",
"2018-03-22 14:40:59,392 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 is finished\n",
"2018-03-22 14:40:59,402 - ALPHA_MIND - INFO - 2017-06-20 00:00:00: 800\n",
"2018-03-22 14:40:59,409 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 full re-balance\n",
"2018-03-22 14:40:59,435 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 is finished\n",
"2018-03-22 14:40:59,447 - ALPHA_MIND - INFO - 2017-07-04 00:00:00: 800\n",
"2018-03-22 14:40:59,456 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 full re-balance\n",
"2018-03-22 14:40:59,483 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 is finished\n",
"2018-03-22 14:40:59,493 - ALPHA_MIND - INFO - 2017-07-18 00:00:00: 800\n",
"2018-03-22 14:40:59,501 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 full re-balance\n",
"2018-03-22 14:40:59,528 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 is finished\n",
"2018-03-22 14:40:59,538 - ALPHA_MIND - INFO - 2017-08-01 00:00:00: 800\n",
"2018-03-22 14:40:59,546 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 full re-balance\n",
"2018-03-22 14:40:59,573 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 is finished\n",
"2018-03-22 14:40:59,584 - ALPHA_MIND - INFO - 2017-08-15 00:00:00: 800\n",
"2018-03-22 14:40:59,591 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 full re-balance\n",
"2018-03-22 14:40:59,616 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 is finished\n",
"2018-03-22 14:40:59,626 - ALPHA_MIND - INFO - 2017-08-29 00:00:00: 800\n",
"2018-03-22 14:40:59,633 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 full re-balance\n",
"2018-03-22 14:40:59,659 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 is finished\n",
"2018-03-22 14:40:59,669 - ALPHA_MIND - INFO - 2017-09-12 00:00:00: 800\n",
"2018-03-22 14:40:59,676 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 full re-balance\n",
"2018-03-22 14:40:59,701 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 is finished\n",
"2018-03-22 14:40:59,713 - ALPHA_MIND - INFO - 2017-09-26 00:00:00: 800\n",
"2018-03-22 14:40:59,720 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 full re-balance\n",
"2018-03-22 14:40:59,745 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 is finished\n",
"2018-03-22 14:40:59,755 - ALPHA_MIND - INFO - 2017-10-17 00:00:00: 800\n",
"2018-03-22 14:40:59,762 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 full re-balance\n",
"2018-03-22 14:40:59,788 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 is finished\n",
"2018-03-22 14:40:59,797 - ALPHA_MIND - INFO - 2017-10-31 00:00:00: 800\n",
"2018-03-22 14:40:59,805 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 full re-balance\n",
"2018-03-22 14:40:59,830 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 is finished\n",
"2018-03-22 14:40:59,840 - ALPHA_MIND - INFO - 2017-11-14 00:00:00: 800\n",
"2018-03-22 14:40:59,847 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 full re-balance\n",
"2018-03-22 14:40:59,872 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 is finished\n",
"2018-03-22 14:40:59,882 - ALPHA_MIND - INFO - 2017-11-28 00:00:00: 800\n",
"2018-03-22 14:40:59,889 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 full re-balance\n",
"2018-03-22 14:40:59,914 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 is finished\n",
"2018-03-22 14:40:59,926 - ALPHA_MIND - INFO - 2017-12-12 00:00:00: 799\n",
"2018-03-22 14:40:59,934 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 full re-balance\n",
"2018-03-22 14:40:59,959 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 is finished\n",
"2018-03-22 14:40:59,969 - ALPHA_MIND - INFO - 2017-12-26 00:00:00: 799\n",
"2018-03-22 14:40:59,977 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 full re-balance\n",
"2018-03-22 14:41:00,002 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 is finished\n",
"2018-03-22 14:41:00,012 - ALPHA_MIND - INFO - 2018-01-10 00:00:00: 799\n",
"2018-03-22 14:41:00,019 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 full re-balance\n",
"2018-03-22 14:41:00,044 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 is finished\n",
"2018-03-22 14:41:00,054 - ALPHA_MIND - INFO - 2018-01-24 00:00:00: 799\n",
"2018-03-22 14:41:00,062 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 full re-balance\n",
"2018-03-22 14:41:00,087 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 is finished\n",
"2018-03-22 14:41:00,097 - ALPHA_MIND - INFO - 2018-02-07 00:00:00: 799\n",
"2018-03-22 14:41:00,104 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 full re-balance\n",
"2018-03-22 14:41:00,129 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 is finished\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 45.9 s, sys: 44.7 s, total: 1min 30s\n",
"Wall time: 32.2 s\n"
]
}
],
"source": [ "source": [
"%%time\n", "%%time\n",
"\n", "\n",
...@@ -617,7 +254,7 @@ ...@@ -617,7 +254,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 10, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -630,7 +267,7 @@ ...@@ -630,7 +267,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 11, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
"cells": [ "cells": [
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 4, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 31, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
"all_styles = risk_styles + industry_styles + macro_styles\n", "all_styles = risk_styles + industry_styles + macro_styles\n",
"\n", "\n",
"risk_exposure_values = total_data[all_styles].values.astype(float)\n", "risk_exposure_values = total_data[all_styles].values.astype(float)\n",
"special_risk_values = total_data['s_srisk'].values.astype(float)\n", "special_risk_values = total_data['srisk'].values.astype(float)\n",
"risk_cov_values = risk_cov[all_styles].values\n", "risk_cov_values = risk_cov[all_styles].values\n",
"\n", "\n",
"sec_cov_values_full = risk_exposure_values @ risk_cov_values @ risk_exposure_values.T / 10000 + np.diag(special_risk_values ** 2) / 10000\n", "sec_cov_values_full = risk_exposure_values @ risk_cov_values @ risk_exposure_values.T / 10000 + np.diag(special_risk_values ** 2) / 10000\n",
...@@ -51,7 +51,7 @@ ...@@ -51,7 +51,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 32, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -71,18 +71,9 @@ ...@@ -71,18 +71,9 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 33, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 360 ms, sys: 321 ms, total: 681 ms\n",
"Wall time: 48.3 ms\n"
]
}
],
"source": [ "source": [
"%%time\n", "%%time\n",
"w = Variable(n)\n", "w = Variable(n)\n",
...@@ -100,49 +91,9 @@ ...@@ -100,49 +91,9 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 34, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"ECOS 2.0.4 - (C) embotech GmbH, Zurich Switzerland, 2012-15. Web: www.embotech.com/ECOS\n",
"\n",
"It pcost dcost gap pres dres k/t mu step sigma IR | BT\n",
" 0 -3.236e-01 -9.496e+01 +2e+03 9e-01 1e-02 1e+00 5e+00 --- --- 1 1 - | - - \n",
" 1 -5.482e+00 -1.908e+01 +1e+03 2e-01 9e-04 4e-01 3e+00 0.6534 2e-01 1 2 2 | 0 0\n",
" 2 -2.485e+00 -3.161e+00 +1e+02 1e-02 3e-05 8e-02 3e-01 0.9700 8e-02 2 2 2 | 0 0\n",
" 3 -2.433e+00 -2.610e+00 +3e+01 3e-03 8e-06 2e-02 6e-02 0.7649 2e-02 2 2 2 | 0 0\n",
" 4 -2.416e+00 -2.454e+00 +5e+00 7e-04 2e-06 4e-03 1e-02 0.8454 6e-02 2 2 2 | 0 0\n",
" 5 -2.408e+00 -2.415e+00 +1e+00 1e-04 3e-07 6e-04 2e-03 0.8342 2e-02 2 2 2 | 0 0\n",
" 6 -2.403e+00 -2.406e+00 +4e-01 6e-05 1e-07 1e-04 1e-03 0.8410 3e-01 2 3 3 | 0 0\n",
" 7 -2.401e+00 -2.401e+00 +5e-02 7e-06 1e-08 1e-05 1e-04 0.8893 3e-03 2 2 2 | 0 0\n",
" 8 -2.400e+00 -2.400e+00 +7e-03 1e-06 2e-09 8e-07 2e-05 0.9647 1e-01 2 2 2 | 0 0\n",
" 9 -2.400e+00 -2.400e+00 +3e-04 4e-08 8e-11 3e-08 7e-07 0.9613 1e-04 2 2 2 | 0 0\n",
"10 -2.400e+00 -2.400e+00 +2e-05 3e-09 5e-12 2e-09 5e-08 0.9440 1e-02 2 2 2 | 0 0\n",
"11 -2.400e+00 -2.400e+00 +3e-07 4e-11 9e-14 3e-11 7e-10 0.9842 3e-04 2 2 2 | 0 0\n",
"12 -2.400e+00 -2.400e+00 +3e-09 5e-13 1e-15 4e-13 8e-12 0.9890 1e-04 3 1 1 | 0 0\n",
"\n",
"OPTIMAL (within feastol=5.2e-13, reltol=1.4e-09, abstol=3.3e-09).\n",
"Runtime: 0.259075 seconds.\n",
"\n",
"CPU times: user 339 ms, sys: 7.32 ms, total: 347 ms\n",
"Wall time: 340 ms\n"
]
},
{
"data": {
"text/plain": [
"-2.4003282365705503"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"%%time\n", "%%time\n",
"prob.solve(verbose=True)" "prob.solve(verbose=True)"
...@@ -150,62 +101,18 @@ ...@@ -150,62 +101,18 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 35, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"data": {
"text/plain": [
"('optimal', -2.4003282365705503)"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"prob.status, prob.value" "prob.status, prob.value"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 36, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"name": "stdout",
"output_type": "stream",
"text": [
" pcost dcost gap pres dres k/t\n",
" 0: -3.8414e-01 -9.6498e+01 2e+03 1e+01 4e-01 1e+00\n",
" 1: -2.2054e-01 -2.8096e+01 2e+02 3e+00 1e-01 2e+00\n",
" 2: -7.3888e-01 -2.3177e+01 1e+02 3e+00 1e-01 2e+00\n",
" 3: -9.0974e-01 -1.6105e+01 9e+01 2e+00 7e-02 3e+00\n",
" 4: -2.5843e+00 -6.4237e+00 1e+01 5e-01 2e-02 1e+00\n",
" 5: -2.6397e+00 -2.9412e+00 1e+00 4e-02 2e-03 1e-01\n",
" 6: -2.5273e+00 -2.6901e+00 6e-01 2e-02 9e-04 5e-02\n",
" 7: -2.4427e+00 -2.5068e+00 2e-01 8e-03 3e-04 2e-02\n",
" 8: -2.4035e+00 -2.4090e+00 2e-02 7e-04 3e-05 1e-03\n",
" 9: -2.4004e+00 -2.4005e+00 4e-04 1e-05 5e-07 2e-05\n",
"10: -2.4003e+00 -2.4003e+00 6e-06 2e-07 9e-09 4e-07\n",
"11: -2.4003e+00 -2.4003e+00 1e-07 4e-09 2e-10 7e-09\n",
"Optimal solution found.\n",
"CPU times: user 1.47 s, sys: 1.61 s, total: 3.08 s\n",
"Wall time: 352 ms\n"
]
},
{
"data": {
"text/plain": [
"-2.4003282579305463"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"%%time\n", "%%time\n",
"prob.solve(verbose=True, solver='CVXOPT')" "prob.solve(verbose=True, solver='CVXOPT')"
...@@ -213,54 +120,18 @@ ...@@ -213,54 +120,18 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 37, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"data": {
"text/plain": [
"('optimal', -2.4003282579305463)"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"prob.status, prob.value" "prob.status, prob.value"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 38, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"name": "stdout",
"output_type": "stream",
"text": [
" pcost dcost gap pres dres\n",
" 0: -4.0275e+01 -8.9373e+01 8e+03 6e+01 5e-16\n",
" 1: -2.7029e+00 -8.3780e+01 2e+02 1e+00 1e-15\n",
" 2: -1.3699e+00 -2.0914e+01 2e+01 1e-15 2e-15\n",
" 3: -1.6193e+00 -6.3167e+00 5e+00 6e-16 2e-15\n",
" 4: -1.8992e+00 -4.2870e+00 2e+00 4e-16 1e-15\n",
" 5: -2.1306e+00 -3.2594e+00 1e+00 3e-16 8e-16\n",
" 6: -2.1625e+00 -2.9783e+00 8e-01 3e-16 6e-16\n",
" 7: -2.2529e+00 -2.6835e+00 4e-01 2e-16 6e-16\n",
" 8: -2.3100e+00 -2.5413e+00 2e-01 2e-16 4e-16\n",
" 9: -2.3407e+00 -2.4723e+00 1e-01 2e-16 4e-16\n",
"10: -2.3953e+00 -2.4100e+00 1e-02 3e-16 1e-15\n",
"11: -2.4002e+00 -2.4005e+00 2e-04 4e-16 9e-16\n",
"12: -2.4003e+00 -2.4003e+00 2e-06 2e-16 8e-16\n",
"13: -2.4003e+00 -2.4003e+00 2e-08 2e-16 1e-15\n",
"Optimal solution found.\n",
"CPU times: user 584 ms, sys: 636 ms, total: 1.22 s\n",
"Wall time: 83 ms\n"
]
}
],
"source": [ "source": [
"%%time\n", "%%time\n",
"P = matrix(sec_cov_values)\n", "P = matrix(sec_cov_values)\n",
...@@ -288,18 +159,9 @@ ...@@ -288,18 +159,9 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 39, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 70 ms, sys: 36.7 ms, total: 107 ms\n",
"Wall time: 107 ms\n"
]
}
],
"source": [ "source": [
"%%time\n", "%%time\n",
"lbound = np.zeros(n)\n", "lbound = np.zeros(n)\n",
...@@ -322,7 +184,7 @@ ...@@ -322,7 +184,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 40, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -331,7 +193,7 @@ ...@@ -331,7 +193,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 41, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -343,7 +205,7 @@ ...@@ -343,7 +205,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 42, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -364,7 +226,7 @@ ...@@ -364,7 +226,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 43, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -395,7 +257,7 @@ ...@@ -395,7 +257,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 44, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -411,33 +273,9 @@ ...@@ -411,33 +273,9 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 45, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"name": "stdout",
"output_type": "stream",
"text": [
"Scale(n) cvxpy cvxopt ipopt\n",
"200 359.93 28.96 30.79\n",
"400 1104.61 436.92 86.73\n",
"600 2248.70 544.58 57.86\n",
"800 3371.36 1025.66 88.14\n",
"1000 6210.00 1657.73 104.53\n",
"1200 12045.02 2785.55 132.32\n",
"1400 18365.51 4679.09 154.84\n",
"1600 24513.72 5827.70 201.17\n",
"1800 33475.16 10443.92 309.69\n",
"2000 44205.53 12464.22 330.94\n",
"2200 59213.54 17986.24 439.36\n",
"2400 72602.25 20114.71 562.75\n",
"2600 93412.44 24947.24 573.60\n",
"2800 111345.23 31156.20 644.45\n",
"3000 127577.49 39207.67 804.31\n",
"3200 147128.87 47593.30 956.98\n"
]
}
],
"source": [ "source": [
"n_steps = list(range(200, 3201, 200))\n", "n_steps = list(range(200, 3201, 200))\n",
"cvxpy_times = [None] * len(n_steps)\n", "cvxpy_times = [None] * len(n_steps)\n",
...@@ -458,9 +296,21 @@ ...@@ -458,9 +296,21 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": null,
"metadata": { "metadata": {},
"collapsed": true "outputs": [],
}, "source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [], "outputs": [],
"source": [] "source": []
} }
...@@ -482,6 +332,35 @@ ...@@ -482,6 +332,35 @@
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.6.4" "version": "3.6.4"
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
} }
}, },
"nbformat": 4, "nbformat": 4,
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
"cells": [ "cells": [
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 1, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 17, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -46,13 +46,6 @@ ...@@ -46,13 +46,6 @@
"target_vol = 0.05\n", "target_vol = 0.05\n",
"risk_model = 'short'\n", "risk_model = 'short'\n",
"\n", "\n",
"if risk_model == 'day':\n",
" risk_model_name = 'd_srisk'\n",
"elif risk_model == 'short':\n",
" risk_model_name = 's_srisk'\n",
"else:\n",
" risk_model_name = 'l_srisk'\n",
"\n",
"executor = NaiveExecutor()\n", "executor = NaiveExecutor()\n",
"ref_dates = makeSchedule(start_date, end_date, freq, 'china.sse')\n", "ref_dates = makeSchedule(start_date, end_date, freq, 'china.sse')\n",
"engine = SqlEngine(data_source)" "engine = SqlEngine(data_source)"
...@@ -60,7 +53,7 @@ ...@@ -60,7 +53,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 18, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -91,18 +84,9 @@ ...@@ -91,18 +84,9 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 19, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 45.9 s, sys: 39.5 s, total: 1min 25s\n",
"Wall time: 29.4 s\n"
]
}
],
"source": [ "source": [
"%%time\n", "%%time\n",
"\n", "\n",
...@@ -112,134 +96,9 @@ ...@@ -112,134 +96,9 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 20, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"name": "stderr",
"output_type": "stream",
"text": [
"2018-03-22 16:42:06,212 - ALPHA_MIND - INFO - 2016-01-04 partial re-balance: 799\n",
"2018-03-22 16:42:06,685 - ALPHA_MIND - INFO - 2016-01-04 is finished\n",
"/home/python/anaconda3/envs/py36/lib/python3.6/site-packages/ipykernel_launcher.py:72: FutureWarning: \n",
"Passing list-likes to .loc or [] with any missing label will raise\n",
"KeyError in the future, you can use .reindex() as an alternative.\n",
"\n",
"See the documentation here:\n",
"http://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike\n",
"2018-03-22 16:42:06,812 - ALPHA_MIND - INFO - 2016-01-18 partial re-balance: 800\n",
"2018-03-22 16:42:07,339 - ALPHA_MIND - INFO - 2016-01-18 is finished\n",
"2018-03-22 16:42:07,411 - ALPHA_MIND - INFO - 2016-02-01 partial re-balance: 800\n",
"2018-03-22 16:42:07,919 - ALPHA_MIND - INFO - 2016-02-01 is finished\n",
"2018-03-22 16:42:07,973 - ALPHA_MIND - INFO - 2016-02-22 partial re-balance: 800\n",
"2018-03-22 16:42:08,599 - ALPHA_MIND - INFO - 2016-02-22 is finished\n",
"2018-03-22 16:42:08,647 - ALPHA_MIND - INFO - 2016-03-07 partial re-balance: 800\n",
"2018-03-22 16:42:09,157 - ALPHA_MIND - INFO - 2016-03-07 is finished\n",
"2018-03-22 16:42:09,236 - ALPHA_MIND - INFO - 2016-03-21 partial re-balance: 800\n",
"2018-03-22 16:42:09,775 - ALPHA_MIND - INFO - 2016-03-21 is finished\n",
"2018-03-22 16:42:09,878 - ALPHA_MIND - INFO - 2016-04-05 partial re-balance: 800\n",
"2018-03-22 16:42:10,528 - ALPHA_MIND - INFO - 2016-04-05 is finished\n",
"2018-03-22 16:42:10,649 - ALPHA_MIND - INFO - 2016-04-19 partial re-balance: 800\n",
"2018-03-22 16:42:11,136 - ALPHA_MIND - INFO - 2016-04-19 is finished\n",
"2018-03-22 16:42:11,205 - ALPHA_MIND - INFO - 2016-05-04 partial re-balance: 800\n",
"2018-03-22 16:42:11,684 - ALPHA_MIND - INFO - 2016-05-04 is finished\n",
"2018-03-22 16:42:11,784 - ALPHA_MIND - INFO - 2016-05-18 partial re-balance: 800\n",
"2018-03-22 16:42:12,264 - ALPHA_MIND - INFO - 2016-05-18 is finished\n",
"2018-03-22 16:42:12,331 - ALPHA_MIND - INFO - 2016-06-01 partial re-balance: 800\n",
"2018-03-22 16:42:12,796 - ALPHA_MIND - INFO - 2016-06-01 is finished\n",
"2018-03-22 16:42:12,896 - ALPHA_MIND - INFO - 2016-06-17 partial re-balance: 800\n",
"2018-03-22 16:42:13,409 - ALPHA_MIND - INFO - 2016-06-17 is finished\n",
"2018-03-22 16:42:13,511 - ALPHA_MIND - INFO - 2016-07-01 partial re-balance: 800\n",
"2018-03-22 16:42:14,159 - ALPHA_MIND - INFO - 2016-07-01 is finished\n",
"2018-03-22 16:42:14,261 - ALPHA_MIND - INFO - 2016-07-15 partial re-balance: 800\n",
"2018-03-22 16:42:14,923 - ALPHA_MIND - INFO - 2016-07-15 is finished\n",
"2018-03-22 16:42:15,021 - ALPHA_MIND - INFO - 2016-07-29 partial re-balance: 800\n",
"2018-03-22 16:42:15,664 - ALPHA_MIND - INFO - 2016-07-29 is finished\n",
"2018-03-22 16:42:15,761 - ALPHA_MIND - INFO - 2016-08-12 partial re-balance: 800\n",
"2018-03-22 16:42:16,664 - ALPHA_MIND - INFO - 2016-08-12 is finished\n",
"2018-03-22 16:42:16,763 - ALPHA_MIND - INFO - 2016-08-26 partial re-balance: 800\n",
"2018-03-22 16:42:17,401 - ALPHA_MIND - INFO - 2016-08-26 is finished\n",
"2018-03-22 16:42:17,513 - ALPHA_MIND - INFO - 2016-09-09 partial re-balance: 800\n",
"2018-03-22 16:42:18,223 - ALPHA_MIND - INFO - 2016-09-09 is finished\n",
"2018-03-22 16:42:18,313 - ALPHA_MIND - INFO - 2016-09-27 partial re-balance: 800\n",
"2018-03-22 16:42:18,891 - ALPHA_MIND - INFO - 2016-09-27 is finished\n",
"2018-03-22 16:42:18,956 - ALPHA_MIND - INFO - 2016-10-18 partial re-balance: 800\n",
"2018-03-22 16:42:19,541 - ALPHA_MIND - INFO - 2016-10-18 is finished\n",
"2018-03-22 16:42:19,653 - ALPHA_MIND - INFO - 2016-11-01 partial re-balance: 800\n",
"2018-03-22 16:42:20,408 - ALPHA_MIND - INFO - 2016-11-01 is finished\n",
"2018-03-22 16:42:20,478 - ALPHA_MIND - INFO - 2016-11-15 partial re-balance: 800\n",
"2018-03-22 16:42:21,094 - ALPHA_MIND - INFO - 2016-11-15 is finished\n",
"2018-03-22 16:42:21,187 - ALPHA_MIND - INFO - 2016-11-29 partial re-balance: 800\n",
"2018-03-22 16:42:21,806 - ALPHA_MIND - INFO - 2016-11-29 is finished\n",
"2018-03-22 16:42:21,906 - ALPHA_MIND - INFO - 2016-12-13 partial re-balance: 800\n",
"2018-03-22 16:42:22,500 - ALPHA_MIND - INFO - 2016-12-13 is finished\n",
"2018-03-22 16:42:22,576 - ALPHA_MIND - INFO - 2016-12-27 partial re-balance: 800\n",
"2018-03-22 16:42:23,087 - ALPHA_MIND - INFO - 2016-12-27 is finished\n",
"2018-03-22 16:42:23,186 - ALPHA_MIND - INFO - 2017-01-11 partial re-balance: 800\n",
"2018-03-22 16:42:23,673 - ALPHA_MIND - INFO - 2017-01-11 is finished\n",
"2018-03-22 16:42:23,774 - ALPHA_MIND - INFO - 2017-01-25 partial re-balance: 799\n",
"2018-03-22 16:42:24,278 - ALPHA_MIND - INFO - 2017-01-25 is finished\n",
"2018-03-22 16:42:24,384 - ALPHA_MIND - INFO - 2017-02-15 partial re-balance: 799\n",
"2018-03-22 16:42:24,897 - ALPHA_MIND - INFO - 2017-02-15 is finished\n",
"2018-03-22 16:42:25,001 - ALPHA_MIND - INFO - 2017-03-01 partial re-balance: 800\n",
"2018-03-22 16:42:25,640 - ALPHA_MIND - INFO - 2017-03-01 is finished\n",
"2018-03-22 16:42:25,708 - ALPHA_MIND - INFO - 2017-03-15 partial re-balance: 800\n",
"2018-03-22 16:42:26,042 - ALPHA_MIND - INFO - 2017-03-15 is finished\n",
"2018-03-22 16:42:26,140 - ALPHA_MIND - INFO - 2017-03-29 partial re-balance: 800\n",
"2018-03-22 16:42:26,541 - ALPHA_MIND - INFO - 2017-03-29 is finished\n",
"2018-03-22 16:42:26,652 - ALPHA_MIND - INFO - 2017-04-14 partial re-balance: 800\n",
"2018-03-22 16:42:27,164 - ALPHA_MIND - INFO - 2017-04-14 is finished\n",
"2018-03-22 16:42:27,267 - ALPHA_MIND - INFO - 2017-04-28 partial re-balance: 800\n",
"2018-03-22 16:42:27,788 - ALPHA_MIND - INFO - 2017-04-28 is finished\n",
"2018-03-22 16:42:27,892 - ALPHA_MIND - INFO - 2017-05-15 partial re-balance: 800\n",
"2018-03-22 16:42:28,382 - ALPHA_MIND - INFO - 2017-05-15 is finished\n",
"2018-03-22 16:42:28,432 - ALPHA_MIND - INFO - 2017-05-31 partial re-balance: 800\n",
"2018-03-22 16:42:29,125 - ALPHA_MIND - INFO - 2017-05-31 is finished\n",
"2018-03-22 16:42:29,174 - ALPHA_MIND - INFO - 2017-06-14 partial re-balance: 800\n",
"2018-03-22 16:42:29,692 - ALPHA_MIND - INFO - 2017-06-14 is finished\n",
"2018-03-22 16:42:29,733 - ALPHA_MIND - INFO - 2017-06-28 partial re-balance: 800\n",
"2018-03-22 16:42:30,231 - ALPHA_MIND - INFO - 2017-06-28 is finished\n",
"2018-03-22 16:42:30,329 - ALPHA_MIND - INFO - 2017-07-12 partial re-balance: 800\n",
"2018-03-22 16:42:30,930 - ALPHA_MIND - INFO - 2017-07-12 is finished\n",
"2018-03-22 16:42:30,973 - ALPHA_MIND - INFO - 2017-07-26 partial re-balance: 800\n",
"2018-03-22 16:42:31,469 - ALPHA_MIND - INFO - 2017-07-26 is finished\n",
"2018-03-22 16:42:31,563 - ALPHA_MIND - INFO - 2017-08-09 partial re-balance: 800\n",
"2018-03-22 16:42:32,045 - ALPHA_MIND - INFO - 2017-08-09 is finished\n",
"2018-03-22 16:42:32,090 - ALPHA_MIND - INFO - 2017-08-23 partial re-balance: 800\n",
"2018-03-22 16:42:32,585 - ALPHA_MIND - INFO - 2017-08-23 is finished\n",
"2018-03-22 16:42:32,688 - ALPHA_MIND - INFO - 2017-09-06 partial re-balance: 800\n",
"2018-03-22 16:42:33,268 - ALPHA_MIND - INFO - 2017-09-06 is finished\n",
"2018-03-22 16:42:33,312 - ALPHA_MIND - INFO - 2017-09-20 partial re-balance: 800\n",
"2018-03-22 16:42:34,756 - ALPHA_MIND - INFO - 2017-09-20 is finished\n",
"2018-03-22 16:42:34,828 - ALPHA_MIND - INFO - 2017-10-11 partial re-balance: 800\n",
"2018-03-22 16:42:35,322 - ALPHA_MIND - INFO - 2017-10-11 is finished\n",
"2018-03-22 16:42:35,421 - ALPHA_MIND - INFO - 2017-10-25 partial re-balance: 800\n",
"2018-03-22 16:42:35,937 - ALPHA_MIND - INFO - 2017-10-25 is finished\n",
"2018-03-22 16:42:36,031 - ALPHA_MIND - INFO - 2017-11-08 partial re-balance: 800\n",
"2018-03-22 16:42:36,406 - ALPHA_MIND - INFO - 2017-11-08 is finished\n",
"2018-03-22 16:42:36,510 - ALPHA_MIND - INFO - 2017-11-22 partial re-balance: 800\n",
"2018-03-22 16:42:37,039 - ALPHA_MIND - INFO - 2017-11-22 is finished\n",
"2018-03-22 16:42:37,138 - ALPHA_MIND - INFO - 2017-12-06 partial re-balance: 800\n",
"2018-03-22 16:42:37,663 - ALPHA_MIND - INFO - 2017-12-06 is finished\n",
"2018-03-22 16:42:37,763 - ALPHA_MIND - INFO - 2017-12-20 partial re-balance: 800\n",
"2018-03-22 16:42:38,475 - ALPHA_MIND - INFO - 2017-12-20 is finished\n",
"2018-03-22 16:42:38,516 - ALPHA_MIND - INFO - 2018-01-04 partial re-balance: 800\n",
"2018-03-22 16:42:39,015 - ALPHA_MIND - INFO - 2018-01-04 is finished\n",
"2018-03-22 16:42:39,081 - ALPHA_MIND - INFO - 2018-01-18 partial re-balance: 800\n",
"2018-03-22 16:42:39,548 - ALPHA_MIND - INFO - 2018-01-18 is finished\n",
"2018-03-22 16:42:39,646 - ALPHA_MIND - INFO - 2018-02-01 partial re-balance: 800\n",
"2018-03-22 16:42:40,074 - ALPHA_MIND - INFO - 2018-02-01 is finished\n",
"2018-03-22 16:42:40,183 - ALPHA_MIND - INFO - 2018-02-22 partial re-balance: 800\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2018-03-22 16:42:40,805 - ALPHA_MIND - INFO - 2018-02-22 is finished\n"
]
}
],
"source": [ "source": [
"# rebalance\n", "# rebalance\n",
"\n", "\n",
...@@ -291,7 +150,7 @@ ...@@ -291,7 +150,7 @@
" \n", " \n",
" risk_exposure = res[all_styles].values\n", " risk_exposure = res[all_styles].values\n",
" risk_cov = risk_cov[all_styles].values\n", " risk_cov = risk_cov[all_styles].values\n",
" special_risk = res[risk_model_name].values\n", " special_risk = res.srisk.values\n",
" sec_cov = risk_exposure @ risk_cov @ risk_exposure.T / 10000 + np.diag(special_risk ** 2) / 10000\n", " sec_cov = risk_exposure @ risk_cov @ risk_exposure.T / 10000 + np.diag(special_risk ** 2) / 10000\n",
" \n", " \n",
" benchmark_w = res.weight.values\n", " benchmark_w = res.weight.values\n",
...@@ -370,30 +229,9 @@ ...@@ -370,30 +229,9 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 21, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x7fa799d260b8>"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 864x432 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [ "source": [
"ret_df = pd.DataFrame({'returns': rets, 'turn_over': turn_overs, 'leverage': leverags}, index=ref_dates)\n", "ret_df = pd.DataFrame({'returns': rets, 'turn_over': turn_overs, 'leverage': leverags}, index=ref_dates)\n",
"\n", "\n",
...@@ -415,30 +253,9 @@ ...@@ -415,30 +253,9 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 22, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x7fa7977319b0>"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 864x432 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [ "source": [
"ret_df[['returns', 'tc_cost']][-30:].cumsum().plot(figsize=(12, 6),\n", "ret_df[['returns', 'tc_cost']][-30:].cumsum().plot(figsize=(12, 6),\n",
" title='Fixed freq rebalanced: {0} with benchmark {1}'.format(freq, 905),\n", " title='Fixed freq rebalanced: {0} with benchmark {1}'.format(freq, 905),\n",
...@@ -448,18 +265,14 @@ ...@@ -448,18 +265,14 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": null,
"metadata": { "metadata": {},
"collapsed": true
},
"outputs": [], "outputs": [],
"source": [] "source": []
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": null,
"metadata": { "metadata": {},
"collapsed": true
},
"outputs": [], "outputs": [],
"source": [] "source": []
} }
......
...@@ -44,19 +44,12 @@ ...@@ -44,19 +44,12 @@
"batch = 0\n", "batch = 0\n",
"horizon = map_freq(freq)\n", "horizon = map_freq(freq)\n",
"universe = Universe(\"custom\", ['zz800'])\n", "universe = Universe(\"custom\", ['zz800'])\n",
"data_source = 'postgres+psycopg2://postgres:A12345678!@10.63.6.220/alpha'\n", "data_source = 'postgres+psycopg2://postgres:we083826@localhost/alpha'\n",
"benchmark_code = 905\n", "benchmark_code = 905\n",
"method = 'tv'\n", "method = 'tv'\n",
"target_vol = 0.05\n", "target_vol = 0.05\n",
"risk_model = 'short'\n", "risk_model = 'short'\n",
"\n", "\n",
"if risk_model == 'day':\n",
" risk_model_name = 'd_srisk'\n",
"elif risk_model == 'short':\n",
" risk_model_name = 's_srisk'\n",
"else:\n",
" risk_model_name = 'l_srisk'\n",
"\n",
"executor = NaiveExecutor()\n", "executor = NaiveExecutor()\n",
"ref_dates = makeSchedule(start_date, end_date, freq, 'china.sse')\n", "ref_dates = makeSchedule(start_date, end_date, freq, 'china.sse')\n",
"engine = SqlEngine(data_source)" "engine = SqlEngine(data_source)"
...@@ -182,7 +175,7 @@ ...@@ -182,7 +175,7 @@
" \n", " \n",
" risk_exposure = res[all_styles].values\n", " risk_exposure = res[all_styles].values\n",
" risk_cov = risk_cov[all_styles].values\n", " risk_cov = risk_cov[all_styles].values\n",
" special_risk = res[risk_model_name].values\n", " special_risk = res.srisk.values\n",
" sec_cov = risk_exposure @ risk_cov @ risk_exposure.T / 10000 + np.diag(special_risk ** 2) / 10000\n", " sec_cov = risk_exposure @ risk_cov @ risk_exposure.T / 10000 + np.diag(special_risk ** 2) / 10000\n",
"\n", "\n",
" benchmark_w = res.weight.values\n", " benchmark_w = res.weight.values\n",
...@@ -276,9 +269,9 @@ ...@@ -276,9 +269,9 @@
"outputs": [], "outputs": [],
"source": [ "source": [
"def create_report(ret_df, windows):\n", "def create_report(ret_df, windows):\n",
" sharp_calc = MovingSharp(windows)\n", " sharp_calc = MovingSharp(windows, x='ret', y='riskFree')\n",
" drawdown_calc = MovingMaxDrawdown(windows)\n", " drawdown_calc = MovingMaxDrawdown(windows, x='ret')\n",
" max_drawdown_calc = MovingMaxDrawdown(len(ret_df))\n", " max_drawdown_calc = MovingMaxDrawdown(len(ret_df), x='ret')\n",
"\n", "\n",
" res_df = pd.DataFrame(columns=['daily_return', 'cum_ret', 'sharp', 'drawdown', 'max_drawn', 'leverage'])\n", " res_df = pd.DataFrame(columns=['daily_return', 'cum_ret', 'sharp', 'drawdown', 'max_drawn', 'leverage'])\n",
" total_returns = 0.\n", " total_returns = 0.\n",
...@@ -292,8 +285,8 @@ ...@@ -292,8 +285,8 @@
"\n", "\n",
" res_df.loc[date, 'daily_return'] = ret\n", " res_df.loc[date, 'daily_return'] = ret\n",
" res_df.loc[date, 'cum_ret'] = total_returns\n", " res_df.loc[date, 'cum_ret'] = total_returns\n",
" res_df.loc[date, 'drawdown'] = drawdown_calc.result()[0]\n", " res_df.loc[date, 'drawdown'] = drawdown_calc.result()\n",
" res_df.loc[date, 'max_drawn'] = max_drawdown_calc.result()[0]\n", " res_df.loc[date, 'max_drawn'] = max_drawdown_calc.result()\n",
" res_df.loc[date, 'leverage'] = ret_df.loc[date, 'leverage']\n", " res_df.loc[date, 'leverage'] = ret_df.loc[date, 'leverage']\n",
"\n", "\n",
" if i < 5:\n", " if i < 5:\n",
...@@ -335,13 +328,6 @@ ...@@ -335,13 +328,6 @@
" alpha_logger.info(f\"target_vol: {target_vol:.4f} finished\")" " alpha_logger.info(f\"target_vol: {target_vol:.4f} finished\")"
] ]
}, },
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": null,
...@@ -356,18 +342,6 @@ ...@@ -356,18 +342,6 @@
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.4"
},
"varInspector": { "varInspector": {
"cols": { "cols": {
"lenName": 16, "lenName": 16,
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
"cells": [ "cells": [
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 1, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 2, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 3, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -83,18 +83,9 @@ ...@@ -83,18 +83,9 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 4, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 41.9 s, sys: 40.9 s, total: 1min 22s\n",
"Wall time: 1min 40s\n"
]
}
],
"source": [ "source": [
"%%time\n", "%%time\n",
"\n", "\n",
...@@ -106,7 +97,7 @@ ...@@ -106,7 +97,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 5, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -145,7 +136,7 @@ ...@@ -145,7 +136,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 6, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -229,30 +220,9 @@ ...@@ -229,30 +220,9 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 7, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x7f42e1a2f0b8>"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 864x432 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [ "source": [
"ret_df = create_scenario(weight_gap)\n", "ret_df = create_scenario(weight_gap)\n",
"ret_df[['returns', 'tc_cost']].cumsum().plot(figsize=(12, 6),\n", "ret_df[['returns', 'tc_cost']].cumsum().plot(figsize=(12, 6),\n",
......
...@@ -9,18 +9,9 @@ ...@@ -9,18 +9,9 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 1, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/python/anaconda3/envs/py36/lib/python3.6/site-packages/statsmodels/compat/pandas.py:56: FutureWarning: The pandas.core.datetools module is deprecated and will be removed in a future version. Please use the pandas.tseries module instead.\n",
" from pandas.core import datetools\n"
]
}
],
"source": [ "source": [
"%matplotlib inline\n", "%matplotlib inline\n",
"\n", "\n",
...@@ -37,7 +28,7 @@ ...@@ -37,7 +28,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 2, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -58,7 +49,7 @@ ...@@ -58,7 +49,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 3, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -84,7 +75,7 @@ ...@@ -84,7 +75,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 4, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -93,138 +84,9 @@ ...@@ -93,138 +84,9 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 5, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"name": "stderr",
"output_type": "stream",
"text": [
"2018-03-22 17:13:42,256 - ALPHA_MIND - INFO - 2016-01-04 00:00:00 is finished with 2772 stocks for BETA\n",
"2018-03-22 17:13:42,271 - ALPHA_MIND - INFO - 2016-01-04 00:00:00 risk_exposure: 1.6086128191581534e-30\n",
"2018-03-22 17:13:47,661 - ALPHA_MIND - INFO - 2016-02-01 00:00:00 is finished with 2773 stocks for BETA\n",
"2018-03-22 17:13:47,667 - ALPHA_MIND - INFO - 2016-02-01 00:00:00 risk_exposure: 7.456405071367582e-31\n",
"2018-03-22 17:13:52,918 - ALPHA_MIND - INFO - 2016-03-07 00:00:00 is finished with 2774 stocks for BETA\n",
"2018-03-22 17:13:52,924 - ALPHA_MIND - INFO - 2016-03-07 00:00:00 risk_exposure: 1.2197868346978973e-30\n",
"2018-03-22 17:13:54,671 - ALPHA_MIND - INFO - 2016-04-05 00:00:00 is finished with 2802 stocks for BETA\n",
"2018-03-22 17:13:54,677 - ALPHA_MIND - INFO - 2016-04-05 00:00:00 risk_exposure: 7.242098556410275e-30\n",
"2018-03-22 17:13:56,554 - ALPHA_MIND - INFO - 2016-05-04 00:00:00 is finished with 2806 stocks for BETA\n",
"2018-03-22 17:13:56,560 - ALPHA_MIND - INFO - 2016-05-04 00:00:00 risk_exposure: 3.847254043586179e-30\n",
"2018-03-22 17:13:58,371 - ALPHA_MIND - INFO - 2016-06-01 00:00:00 is finished with 2809 stocks for BETA\n",
"2018-03-22 17:13:58,377 - ALPHA_MIND - INFO - 2016-06-01 00:00:00 risk_exposure: 5.6789307501760295e-30\n",
"2018-03-22 17:14:04,016 - ALPHA_MIND - INFO - 2016-07-01 00:00:00 is finished with 2825 stocks for BETA\n",
"2018-03-22 17:14:04,022 - ALPHA_MIND - INFO - 2016-07-01 00:00:00 risk_exposure: 5.9479827277393326e-30\n",
"2018-03-22 17:14:09,675 - ALPHA_MIND - INFO - 2016-07-29 00:00:00 is finished with 2836 stocks for BETA\n",
"2018-03-22 17:14:09,683 - ALPHA_MIND - INFO - 2016-07-29 00:00:00 risk_exposure: 1.4491897594845847e-29\n",
"2018-03-22 17:14:11,734 - ALPHA_MIND - INFO - 2016-08-26 00:00:00 is finished with 2847 stocks for BETA\n",
"2018-03-22 17:14:11,740 - ALPHA_MIND - INFO - 2016-08-26 00:00:00 risk_exposure: 2.109312425987064e-30\n",
"2018-03-22 17:14:13,664 - ALPHA_MIND - INFO - 2016-09-27 00:00:00 is finished with 2859 stocks for BETA\n",
"2018-03-22 17:14:13,669 - ALPHA_MIND - INFO - 2016-09-27 00:00:00 risk_exposure: 4.7710125973915175e-30\n",
"2018-03-22 17:14:15,585 - ALPHA_MIND - INFO - 2016-11-01 00:00:00 is finished with 2876 stocks for BETA\n",
"2018-03-22 17:14:15,592 - ALPHA_MIND - INFO - 2016-11-01 00:00:00 risk_exposure: 1.4354426896104443e-30\n",
"2018-03-22 17:14:17,401 - ALPHA_MIND - INFO - 2016-11-29 00:00:00 is finished with 2902 stocks for BETA\n",
"2018-03-22 17:14:17,407 - ALPHA_MIND - INFO - 2016-11-29 00:00:00 risk_exposure: 7.961468511471374e-30\n",
"2018-03-22 17:14:19,424 - ALPHA_MIND - INFO - 2016-12-27 00:00:00 is finished with 2921 stocks for BETA\n",
"2018-03-22 17:14:19,430 - ALPHA_MIND - INFO - 2016-12-27 00:00:00 risk_exposure: 2.1259429060221634e-30\n",
"2018-03-22 17:14:21,562 - ALPHA_MIND - INFO - 2017-01-25 00:00:00 is finished with 2944 stocks for BETA\n",
"2018-03-22 17:14:21,568 - ALPHA_MIND - INFO - 2017-01-25 00:00:00 risk_exposure: 5.545706705509228e-30\n",
"2018-03-22 17:14:23,640 - ALPHA_MIND - INFO - 2017-03-01 00:00:00 is finished with 2983 stocks for BETA\n",
"2018-03-22 17:14:23,645 - ALPHA_MIND - INFO - 2017-03-01 00:00:00 risk_exposure: 3.454424467241384e-30\n",
"2018-03-22 17:14:25,652 - ALPHA_MIND - INFO - 2017-03-29 00:00:00 is finished with 3024 stocks for BETA\n",
"2018-03-22 17:14:25,658 - ALPHA_MIND - INFO - 2017-03-29 00:00:00 risk_exposure: 9.500238505602917e-31\n",
"2018-03-22 17:14:27,797 - ALPHA_MIND - INFO - 2017-04-28 00:00:00 is finished with 3080 stocks for BETA\n",
"2018-03-22 17:14:27,803 - ALPHA_MIND - INFO - 2017-04-28 00:00:00 risk_exposure: 5.211260892494718e-30\n",
"2018-03-22 17:14:29,789 - ALPHA_MIND - INFO - 2017-05-31 00:00:00 is finished with 3113 stocks for BETA\n",
"2018-03-22 17:14:29,795 - ALPHA_MIND - INFO - 2017-05-31 00:00:00 risk_exposure: 1.887162282491123e-30\n",
"2018-03-22 17:14:31,821 - ALPHA_MIND - INFO - 2017-06-28 00:00:00 is finished with 3155 stocks for BETA\n",
"2018-03-22 17:14:31,827 - ALPHA_MIND - INFO - 2017-06-28 00:00:00 risk_exposure: 3.6391046198045084e-30\n",
"2018-03-22 17:14:33,744 - ALPHA_MIND - INFO - 2017-07-26 00:00:00 is finished with 3196 stocks for BETA\n",
"2018-03-22 17:14:33,750 - ALPHA_MIND - INFO - 2017-07-26 00:00:00 risk_exposure: 1.117040127407821e-30\n",
"2018-03-22 17:14:35,768 - ALPHA_MIND - INFO - 2017-08-23 00:00:00 is finished with 3231 stocks for BETA\n",
"2018-03-22 17:14:35,774 - ALPHA_MIND - INFO - 2017-08-23 00:00:00 risk_exposure: 2.5968630684448953e-30\n",
"2018-03-22 17:14:37,952 - ALPHA_MIND - INFO - 2017-09-20 00:00:00 is finished with 3260 stocks for BETA\n",
"2018-03-22 17:14:37,958 - ALPHA_MIND - INFO - 2017-09-20 00:00:00 risk_exposure: 1.5511722522567208e-30\n",
"2018-03-22 17:14:39,998 - ALPHA_MIND - INFO - 2017-10-25 00:00:00 is finished with 3295 stocks for BETA\n",
"2018-03-22 17:14:40,004 - ALPHA_MIND - INFO - 2017-10-25 00:00:00 risk_exposure: 2.1109629697015596e-30\n",
"2018-03-22 17:14:42,115 - ALPHA_MIND - INFO - 2017-11-22 00:00:00 is finished with 3332 stocks for BETA\n",
"2018-03-22 17:14:42,121 - ALPHA_MIND - INFO - 2017-11-22 00:00:00 risk_exposure: 2.544620987373059e-31\n",
"2018-03-22 17:14:44,248 - ALPHA_MIND - INFO - 2017-12-20 00:00:00 is finished with 3362 stocks for BETA\n",
"2018-03-22 17:14:44,254 - ALPHA_MIND - INFO - 2017-12-20 00:00:00 risk_exposure: 4.73559073771931e-31\n",
"2018-03-22 17:14:46,522 - ALPHA_MIND - INFO - 2018-01-18 00:00:00 is finished with 3386 stocks for BETA\n",
"2018-03-22 17:14:46,528 - ALPHA_MIND - INFO - 2018-01-18 00:00:00 risk_exposure: 1.7053704060570062e-30\n",
"2018-03-22 17:14:48,647 - ALPHA_MIND - INFO - 2018-02-22 00:00:00 is finished with 3433 stocks for BETA\n",
"2018-03-22 17:14:48,654 - ALPHA_MIND - INFO - 2018-02-22 00:00:00 risk_exposure: 3.792625694055929e-06\n",
"2018-03-22 17:14:50,389 - ALPHA_MIND - INFO - 2016-01-04 00:00:00 is finished with 2772 stocks for SIZE\n",
"2018-03-22 17:14:50,394 - ALPHA_MIND - INFO - 2016-01-04 00:00:00 risk_exposure: 1.1278691974191277e-29\n",
"2018-03-22 17:14:52,169 - ALPHA_MIND - INFO - 2016-02-01 00:00:00 is finished with 2773 stocks for SIZE\n",
"2018-03-22 17:14:52,175 - ALPHA_MIND - INFO - 2016-02-01 00:00:00 risk_exposure: 8.594106895765079e-30\n",
"2018-03-22 17:14:53,918 - ALPHA_MIND - INFO - 2016-03-07 00:00:00 is finished with 2774 stocks for SIZE\n",
"2018-03-22 17:14:53,924 - ALPHA_MIND - INFO - 2016-03-07 00:00:00 risk_exposure: 4.210084377205933e-30\n",
"2018-03-22 17:14:55,653 - ALPHA_MIND - INFO - 2016-04-05 00:00:00 is finished with 2802 stocks for SIZE\n",
"2018-03-22 17:14:55,659 - ALPHA_MIND - INFO - 2016-04-05 00:00:00 risk_exposure: 1.1562225990728833e-29\n",
"2018-03-22 17:14:57,421 - ALPHA_MIND - INFO - 2016-05-04 00:00:00 is finished with 2806 stocks for SIZE\n",
"2018-03-22 17:14:57,426 - ALPHA_MIND - INFO - 2016-05-04 00:00:00 risk_exposure: 1.6441828230801868e-30\n",
"2018-03-22 17:14:59,169 - ALPHA_MIND - INFO - 2016-06-01 00:00:00 is finished with 2809 stocks for SIZE\n",
"2018-03-22 17:14:59,174 - ALPHA_MIND - INFO - 2016-06-01 00:00:00 risk_exposure: 5.509209167854315e-30\n",
"2018-03-22 17:15:00,924 - ALPHA_MIND - INFO - 2016-07-01 00:00:00 is finished with 2825 stocks for SIZE\n",
"2018-03-22 17:15:00,930 - ALPHA_MIND - INFO - 2016-07-01 00:00:00 risk_exposure: 1.3347445942020468e-29\n",
"2018-03-22 17:15:02,720 - ALPHA_MIND - INFO - 2016-07-29 00:00:00 is finished with 2836 stocks for SIZE\n",
"2018-03-22 17:15:02,726 - ALPHA_MIND - INFO - 2016-07-29 00:00:00 risk_exposure: 3.5653171071655307e-29\n",
"2018-03-22 17:15:04,396 - ALPHA_MIND - INFO - 2016-08-26 00:00:00 is finished with 2847 stocks for SIZE\n",
"2018-03-22 17:15:04,402 - ALPHA_MIND - INFO - 2016-08-26 00:00:00 risk_exposure: 6.1151045463471505e-30\n",
"2018-03-23 00:45:45,442 - ALPHA_MIND - INFO - 2016-09-27 00:00:00 is finished with 2859 stocks for SIZE\n",
"2018-03-23 00:45:45,448 - ALPHA_MIND - INFO - 2016-09-27 00:00:00 risk_exposure: 6.909199044087559e-30\n",
"2018-03-22 17:15:08,029 - ALPHA_MIND - INFO - 2016-11-01 00:00:00 is finished with 2876 stocks for SIZE\n",
"2018-03-22 17:15:08,035 - ALPHA_MIND - INFO - 2016-11-01 00:00:00 risk_exposure: 4.413606328884348e-30\n",
"2018-03-22 17:15:09,854 - ALPHA_MIND - INFO - 2016-11-29 00:00:00 is finished with 2902 stocks for SIZE\n",
"2018-03-22 17:15:09,860 - ALPHA_MIND - INFO - 2016-11-29 00:00:00 risk_exposure: 9.523316225794703e-30\n",
"2018-03-22 17:15:11,727 - ALPHA_MIND - INFO - 2016-12-27 00:00:00 is finished with 2921 stocks for SIZE\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2018-03-22 17:15:11,733 - ALPHA_MIND - INFO - 2016-12-27 00:00:00 risk_exposure: 3.655672915132341e-30\n",
"2018-03-22 17:15:13,656 - ALPHA_MIND - INFO - 2017-01-25 00:00:00 is finished with 2944 stocks for SIZE\n",
"2018-03-22 17:15:13,661 - ALPHA_MIND - INFO - 2017-01-25 00:00:00 risk_exposure: 2.168764196857329e-29\n",
"2018-03-22 17:15:15,524 - ALPHA_MIND - INFO - 2017-03-01 00:00:00 is finished with 2983 stocks for SIZE\n",
"2018-03-22 17:15:15,529 - ALPHA_MIND - INFO - 2017-03-01 00:00:00 risk_exposure: 1.375407667858211e-29\n",
"2018-03-22 17:15:17,402 - ALPHA_MIND - INFO - 2017-03-29 00:00:00 is finished with 3024 stocks for SIZE\n",
"2018-03-22 17:15:17,408 - ALPHA_MIND - INFO - 2017-03-29 00:00:00 risk_exposure: 3.9636580002788475e-30\n",
"2018-03-22 17:15:19,200 - ALPHA_MIND - INFO - 2017-04-28 00:00:00 is finished with 3080 stocks for SIZE\n",
"2018-03-22 17:15:19,206 - ALPHA_MIND - INFO - 2017-04-28 00:00:00 risk_exposure: 1.6109649432771383e-29\n",
"2018-03-22 17:15:21,166 - ALPHA_MIND - INFO - 2017-05-31 00:00:00 is finished with 3113 stocks for SIZE\n",
"2018-03-22 17:15:21,172 - ALPHA_MIND - INFO - 2017-05-31 00:00:00 risk_exposure: 8.98807921396236e-30\n",
"2018-03-22 17:15:23,189 - ALPHA_MIND - INFO - 2017-06-28 00:00:00 is finished with 3155 stocks for SIZE\n",
"2018-03-22 17:15:23,195 - ALPHA_MIND - INFO - 2017-06-28 00:00:00 risk_exposure: 2.619755747973041e-29\n",
"2018-03-22 17:15:25,309 - ALPHA_MIND - INFO - 2017-07-26 00:00:00 is finished with 3196 stocks for SIZE\n",
"2018-03-22 17:15:25,315 - ALPHA_MIND - INFO - 2017-07-26 00:00:00 risk_exposure: 7.442825891859807e-30\n",
"2018-03-22 17:15:27,332 - ALPHA_MIND - INFO - 2017-08-23 00:00:00 is finished with 3231 stocks for SIZE\n",
"2018-03-22 17:15:27,338 - ALPHA_MIND - INFO - 2017-08-23 00:00:00 risk_exposure: 2.094090575050461e-29\n",
"2018-03-22 17:15:29,674 - ALPHA_MIND - INFO - 2017-09-20 00:00:00 is finished with 3260 stocks for SIZE\n",
"2018-03-22 17:15:29,679 - ALPHA_MIND - INFO - 2017-09-20 00:00:00 risk_exposure: 1.379968572880394e-29\n",
"2018-03-22 17:15:31,588 - ALPHA_MIND - INFO - 2017-10-25 00:00:00 is finished with 3295 stocks for SIZE\n",
"2018-03-22 17:15:31,595 - ALPHA_MIND - INFO - 2017-10-25 00:00:00 risk_exposure: 1.298369149708692e-29\n",
"2018-03-22 17:15:33,877 - ALPHA_MIND - INFO - 2017-11-22 00:00:00 is finished with 3332 stocks for SIZE\n",
"2018-03-22 17:15:33,883 - ALPHA_MIND - INFO - 2017-11-22 00:00:00 risk_exposure: 2.5394162299504933e-29\n",
"2018-03-22 17:15:35,929 - ALPHA_MIND - INFO - 2017-12-20 00:00:00 is finished with 3362 stocks for SIZE\n",
"2018-03-22 17:15:35,934 - ALPHA_MIND - INFO - 2017-12-20 00:00:00 risk_exposure: 8.917816446747243e-30\n",
"2018-03-22 17:15:38,229 - ALPHA_MIND - INFO - 2018-01-18 00:00:00 is finished with 3386 stocks for SIZE\n",
"2018-03-22 17:15:38,238 - ALPHA_MIND - INFO - 2018-01-18 00:00:00 risk_exposure: 1.2273008204302055e-29\n",
"2018-03-22 17:15:40,428 - ALPHA_MIND - INFO - 2018-02-22 00:00:00 is finished with 3433 stocks for SIZE\n",
"2018-03-22 17:15:40,434 - ALPHA_MIND - INFO - 2018-02-22 00:00:00 risk_exposure: 3.984103419085592e-07\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 1min 39s, sys: 47.4 s, total: 2min 26s\n",
"Wall time: 2min 5s\n"
]
}
],
"source": [ "source": [
"%%time\n", "%%time\n",
"res = [risk_factor_analysis(factor) for factor in candidates_factors]" "res = [risk_factor_analysis(factor) for factor in candidates_factors]"
...@@ -232,7 +94,7 @@ ...@@ -232,7 +94,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 6, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -245,67 +107,21 @@ ...@@ -245,67 +107,21 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 7, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "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>abs t.</th>\n",
" </tr>\n",
" <tr>\n",
" <th>factor</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>SIZE</th>\n",
" <td>4.065686</td>\n",
" </tr>\n",
" <tr>\n",
" <th>BETA</th>\n",
" <td>2.339300</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" abs t.\n",
"factor \n",
"SIZE 4.065686\n",
"BETA 2.339300"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"df['abs t.'] = np.abs(df['t.'])\n", "df['abs t.'] = np.abs(df['t.'])\n",
"df[['factor', 'abs t.']].groupby('factor').mean().sort_values('abs t.', ascending=False).head()" "df[['factor', 'abs t.']].groupby('factor').mean().sort_values('abs t.', ascending=False).head()"
] ]
}, },
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": null,
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
"cells": [ "cells": [
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 1, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 2, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 3, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -49,108 +49,21 @@ ...@@ -49,108 +49,21 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 4, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"risk_cov = total_data['risk_cov'][all_styles].values\n", "risk_cov = total_data['risk_cov'][all_styles].values\n",
"factor = total_data['factor']\n", "factor = total_data['factor']\n",
"risk_exposure = factor[all_styles].values\n", "risk_exposure = factor[all_styles].values\n",
"special_risk = factor['d_srisk'].values" "special_risk = factor['srisk'].values"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 5, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "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>1</th>\n",
" <th>2</th>\n",
" <th>6</th>\n",
" <th>8</th>\n",
" <th>9</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0.140538</td>\n",
" <td>0.041499</td>\n",
" <td>0.017832</td>\n",
" <td>0.004555</td>\n",
" <td>-0.000341</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0.041499</td>\n",
" <td>0.181848</td>\n",
" <td>0.120095</td>\n",
" <td>0.012643</td>\n",
" <td>0.002199</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>0.017832</td>\n",
" <td>0.120095</td>\n",
" <td>0.246541</td>\n",
" <td>0.015257</td>\n",
" <td>0.027952</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>0.004555</td>\n",
" <td>0.012643</td>\n",
" <td>0.015257</td>\n",
" <td>0.149261</td>\n",
" <td>0.022305</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>-0.000341</td>\n",
" <td>0.002199</td>\n",
" <td>0.027952</td>\n",
" <td>0.022305</td>\n",
" <td>0.132042</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 1 2 6 8 9\n",
"1 0.140538 0.041499 0.017832 0.004555 -0.000341\n",
"2 0.041499 0.181848 0.120095 0.012643 0.002199\n",
"6 0.017832 0.120095 0.246541 0.015257 0.027952\n",
"8 0.004555 0.012643 0.015257 0.149261 0.022305\n",
"9 -0.000341 0.002199 0.027952 0.022305 0.132042"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"sec_cov = risk_exposure @ risk_cov @ risk_exposure.T / 10000 + np.diag(special_risk ** 2) / 10000\n", "sec_cov = risk_exposure @ risk_cov @ risk_exposure.T / 10000 + np.diag(special_risk ** 2) / 10000\n",
"sec_cov_df = pd.DataFrame(sec_cov, index=codes, columns=codes)\n", "sec_cov_df = pd.DataFrame(sec_cov, index=codes, columns=codes)\n",
...@@ -170,7 +83,7 @@ ...@@ -170,7 +83,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 31, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -188,19 +101,9 @@ ...@@ -188,19 +101,9 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 32, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"name": "stdout",
"output_type": "stream",
"text": [
"total weight is 1.0000\n",
"portfolio activate weight forecasting vol is 0.0250\n",
"portfolio expected return is 2.2232 comparing with benchmark er 1.2359\n"
]
}
],
"source": [ "source": [
"# check the result\n", "# check the result\n",
"print(f\"total weight is {p_weight.sum(): .4f}\")\n", "print(f\"total weight is {p_weight.sum(): .4f}\")\n",
...@@ -218,7 +121,7 @@ ...@@ -218,7 +121,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 8, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -241,13 +144,6 @@ ...@@ -241,13 +144,6 @@
"benchmark_code = 906\n", "benchmark_code = 906\n",
"target_vol = 0.05\n", "target_vol = 0.05\n",
"\n", "\n",
"if risk_model == 'day':\n",
" risk_model_name = 'd_srisk'\n",
"elif risk_model == 'short':\n",
" risk_model_name = 's_srisk'\n",
"else:\n",
" risk_model_name = 'l_srisk'\n",
"\n",
"executor = NaiveExecutor()\n", "executor = NaiveExecutor()\n",
"ref_dates = makeSchedule(start_date, end_date, freq, 'china.sse')\n", "ref_dates = makeSchedule(start_date, end_date, freq, 'china.sse')\n",
"engine = SqlEngine(data_source)" "engine = SqlEngine(data_source)"
...@@ -255,7 +151,7 @@ ...@@ -255,7 +151,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 9, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -286,18 +182,9 @@ ...@@ -286,18 +182,9 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 10, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 42.9 s, sys: 32.7 s, total: 1min 15s\n",
"Wall time: 26.9 s\n"
]
}
],
"source": [ "source": [
"%%time\n", "%%time\n",
"\n", "\n",
...@@ -309,7 +196,7 @@ ...@@ -309,7 +196,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 11, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -338,7 +225,7 @@ ...@@ -338,7 +225,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 12, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -367,7 +254,7 @@ ...@@ -367,7 +254,7 @@
" \n", " \n",
" risk_exposure = total_data[all_styles].values\n", " risk_exposure = total_data[all_styles].values\n",
" risk_cov = risk_cov[all_styles].values\n", " risk_cov = risk_cov[all_styles].values\n",
" special_risk = total_data[risk_model_name].values\n", " special_risk = total_data.srisk.values\n",
" sec_cov = risk_exposure @ risk_cov @ risk_exposure.T / 10000 + np.diag(special_risk ** 2) / 10000\n", " sec_cov = risk_exposure @ risk_cov @ risk_exposure.T / 10000 + np.diag(special_risk ** 2) / 10000\n",
"\n", "\n",
" benchmark_w = total_data.weight.values\n", " benchmark_w = total_data.weight.values\n",
...@@ -434,98 +321,18 @@ ...@@ -434,98 +321,18 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 13, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"name": "stderr",
"output_type": "stream",
"text": [
"2018-03-22 17:35:31,207 - ALPHA_MIND - INFO - 2016-01-04 is finished with expected vol 0.05\n",
"2018-03-22 17:35:31,891 - ALPHA_MIND - INFO - 2016-01-18 is finished with expected vol 0.05\n",
"2018-03-22 17:35:32,506 - ALPHA_MIND - INFO - 2016-02-01 is finished with expected vol 0.05\n",
"2018-03-22 17:35:33,220 - ALPHA_MIND - INFO - 2016-02-22 is finished with expected vol 0.05\n",
"2018-03-22 17:35:33,940 - ALPHA_MIND - INFO - 2016-03-07 is finished with expected vol 0.05\n",
"2018-03-22 17:35:34,598 - ALPHA_MIND - INFO - 2016-03-21 is finished with expected vol 0.05\n",
"2018-03-22 17:35:35,235 - ALPHA_MIND - INFO - 2016-04-05 is finished with expected vol 0.05\n",
"2018-03-22 17:35:35,909 - ALPHA_MIND - INFO - 2016-04-19 is finished with expected vol 0.05\n",
"2018-03-22 17:35:36,517 - ALPHA_MIND - INFO - 2016-05-04 is finished with expected vol 0.05\n",
"2018-03-22 17:35:37,125 - ALPHA_MIND - INFO - 2016-05-18 is finished with expected vol 0.05\n",
"2018-03-22 17:35:37,771 - ALPHA_MIND - INFO - 2016-06-01 is finished with expected vol 0.05\n",
"2018-03-22 17:35:38,520 - ALPHA_MIND - INFO - 2016-06-17 is finished with expected vol 0.05\n",
"2018-03-22 17:35:39,224 - ALPHA_MIND - INFO - 2016-07-01 is finished with expected vol 0.05\n",
"2018-03-22 17:35:39,856 - ALPHA_MIND - INFO - 2016-07-15 is finished with expected vol 0.05\n",
"2018-03-22 17:35:40,510 - ALPHA_MIND - INFO - 2016-07-29 is finished with expected vol 0.05\n",
"2018-03-22 17:35:41,302 - ALPHA_MIND - INFO - 2016-08-12 is finished with expected vol 0.05\n",
"2018-03-22 17:35:42,105 - ALPHA_MIND - INFO - 2016-08-26 is finished with expected vol 0.05\n",
"2018-03-22 17:35:42,783 - ALPHA_MIND - INFO - 2016-09-09 is finished with expected vol 0.05\n",
"2018-03-22 17:35:43,393 - ALPHA_MIND - INFO - 2016-09-27 is finished with expected vol 0.05\n",
"2018-03-22 17:35:44,185 - ALPHA_MIND - INFO - 2016-10-18 is finished with expected vol 0.05\n",
"2018-03-22 17:35:44,735 - ALPHA_MIND - INFO - 2016-11-01 is finished with expected vol 0.05\n",
"2018-03-22 17:35:45,378 - ALPHA_MIND - INFO - 2016-11-15 is finished with expected vol 0.05\n",
"2018-03-22 17:35:46,148 - ALPHA_MIND - INFO - 2016-11-29 is finished with expected vol 0.05\n",
"2018-03-22 17:35:46,867 - ALPHA_MIND - INFO - 2016-12-13 is finished with expected vol 0.05\n",
"2018-03-22 17:35:47,404 - ALPHA_MIND - INFO - 2016-12-27 is finished with expected vol 0.05\n",
"2018-03-22 17:35:48,031 - ALPHA_MIND - INFO - 2017-01-11 is finished with expected vol 0.05\n",
"2018-03-22 17:35:48,658 - ALPHA_MIND - INFO - 2017-01-25 is finished with expected vol 0.05\n",
"2018-03-22 17:35:49,473 - ALPHA_MIND - INFO - 2017-02-15 is finished with expected vol 0.05\n",
"2018-03-22 17:35:50,082 - ALPHA_MIND - INFO - 2017-03-01 is finished with expected vol 0.05\n",
"2018-03-22 17:35:50,594 - ALPHA_MIND - INFO - 2017-03-15 is finished with expected vol 0.05\n",
"2018-03-22 17:35:51,173 - ALPHA_MIND - INFO - 2017-03-29 is finished with expected vol 0.05\n",
"2018-03-22 17:35:51,710 - ALPHA_MIND - INFO - 2017-04-14 is finished with expected vol 0.05\n",
"2018-03-22 17:35:52,420 - ALPHA_MIND - INFO - 2017-04-28 is finished with expected vol 0.05\n",
"2018-03-22 17:35:53,039 - ALPHA_MIND - INFO - 2017-05-15 is finished with expected vol 0.05\n",
"2018-03-22 17:35:53,753 - ALPHA_MIND - INFO - 2017-05-31 is finished with expected vol 0.05\n",
"2018-03-22 17:35:54,510 - ALPHA_MIND - INFO - 2017-06-14 is finished with expected vol 0.05\n",
"2018-03-22 17:35:55,359 - ALPHA_MIND - INFO - 2017-06-28 is finished with expected vol 0.05\n",
"2018-03-22 17:35:56,118 - ALPHA_MIND - INFO - 2017-07-12 is finished with expected vol 0.05\n",
"2018-03-22 17:35:56,706 - ALPHA_MIND - INFO - 2017-07-26 is finished with expected vol 0.05\n",
"2018-03-22 17:35:57,372 - ALPHA_MIND - INFO - 2017-08-09 is finished with expected vol 0.05\n",
"2018-03-22 17:35:58,074 - ALPHA_MIND - INFO - 2017-08-23 is finished with expected vol 0.05\n",
"2018-03-22 17:35:58,776 - ALPHA_MIND - INFO - 2017-09-06 is finished with expected vol 0.05\n",
"2018-03-22 17:35:59,368 - ALPHA_MIND - INFO - 2017-09-20 is finished with expected vol 0.05\n",
"2018-03-22 17:36:00,199 - ALPHA_MIND - INFO - 2017-10-11 is finished with expected vol 0.05\n",
"2018-03-22 17:36:01,075 - ALPHA_MIND - INFO - 2017-10-25 is finished with expected vol 0.05\n",
"2018-03-22 17:36:01,774 - ALPHA_MIND - INFO - 2017-11-08 is finished with expected vol 0.05\n",
"2018-03-22 17:36:02,427 - ALPHA_MIND - INFO - 2017-11-22 is finished with expected vol 0.05\n",
"2018-03-22 17:36:03,084 - ALPHA_MIND - INFO - 2017-12-06 is finished with expected vol 0.05\n",
"2018-03-22 17:36:03,744 - ALPHA_MIND - INFO - 2017-12-20 is finished with expected vol 0.05\n",
"2018-03-22 17:36:04,318 - ALPHA_MIND - INFO - 2018-01-04 is finished with expected vol 0.05\n",
"2018-03-22 17:36:04,967 - ALPHA_MIND - INFO - 2018-01-18 is finished with expected vol 0.05\n",
"2018-03-22 17:36:05,550 - ALPHA_MIND - INFO - 2018-02-01 is finished with expected vol 0.05\n"
]
}
],
"source": [ "source": [
"ret_df = create_scenario(target_vol)" "ret_df = create_scenario(target_vol)"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 14, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x7fdd80563a20>"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 864x432 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [ "source": [
"ret_df[['returns', 'tc_cost']].cumsum().plot(figsize=(12, 6),\n", "ret_df[['returns', 'tc_cost']].cumsum().plot(figsize=(12, 6),\n",
" title='Fixed freq rebalanced: {0} with benchmark {1}'.format(freq, 905),\n", " title='Fixed freq rebalanced: {0} with benchmark {1}'.format(freq, 905),\n",
...@@ -535,9 +342,7 @@ ...@@ -535,9 +342,7 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": null,
"metadata": { "metadata": {},
"collapsed": true
},
"outputs": [], "outputs": [],
"source": [] "source": []
} }
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
"source": [ "source": [
"* 比较不同组合组合优化器在不同规模问题上的性能;\n", "* 比较不同组合组合优化器在不同规模问题上的性能;\n",
"\n", "\n",
"* 下面的结果主要比较``alphamind``和``sicpy``中内置优化器的性能差别;\n", "* 下面的结果主要比较``alphamind``和``python``中其他优化器的性能差别,我们将尽可能使用``cvxopt``中的优化器,其次选择``scipy``;\n",
"\n", "\n",
"* 由于``scipy``在``ashare_ex``上面性能太差,所以一般忽略``scipy``在这个股票池上的表现;\n", "* 由于``scipy``在``ashare_ex``上面性能太差,所以一般忽略``scipy``在这个股票池上的表现;\n",
"\n", "\n",
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
"import timeit\n", "import timeit\n",
"import numpy as np\n", "import numpy as np\n",
"import pandas as pd\n", "import pandas as pd\n",
"import cvxpy\n",
"from cvxopt import solvers\n",
"from scipy.optimize import linprog\n", "from scipy.optimize import linprog\n",
"from scipy.optimize import minimize\n", "from scipy.optimize import minimize\n",
"from alphamind.api import *\n", "from alphamind.api import *\n",
...@@ -49,13 +51,13 @@ ...@@ -49,13 +51,13 @@
"outputs": [], "outputs": [],
"source": [ "source": [
"ref_date = '2018-02-08'\n", "ref_date = '2018-02-08'\n",
"u_names = ['sh50', 'hs300', 'zz500', 'zz800', 'ashare_ex']\n", "u_names = ['sh50', 'hs300', 'zz500', 'zz800', 'zz1000', 'ashare_ex']\n",
"b_codes = [16, 300, 905, 906, None]\n", "b_codes = [16, 300, 905, 906, 852, None]\n",
"risk_model = 'short'\n", "risk_model = 'short'\n",
"factor = 'EPS'\n", "factor = 'EPS'\n",
"lb = 0.0\n", "lb = 0.0\n",
"ub = 0.1\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", "engine = SqlEngine(data_source)\n",
"\n", "\n",
"universes = [Universe('custom', [u_name]) for u_name in u_names]\n", "universes = [Universe('custom', [u_name]) for u_name in u_names]\n",
...@@ -80,46 +82,55 @@ ...@@ -80,46 +82,55 @@
"name": "stderr", "name": "stderr",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"2018-03-22 17:53:03,797 - ALPHA_MIND - INFO - sh50 is finished\n", "2018-03-30 16:52:12,784 - ALPHA_MIND - INFO - sh50 is finished\n",
"2018-03-22 17:53:04,072 - ALPHA_MIND - INFO - hs300 is finished\n", "2018-03-30 16:52:12,796 - ALPHA_MIND - INFO - hs300 is finished\n",
"2018-03-22 17:53:04,821 - ALPHA_MIND - INFO - zz500 is finished\n", "2018-03-30 16:52:12,813 - ALPHA_MIND - INFO - zz500 is finished\n",
"2018-03-22 17:53:07,024 - ALPHA_MIND - INFO - zz800 is finished\n", "2018-03-30 16:52:12,842 - ALPHA_MIND - INFO - zz800 is finished\n",
"2018-03-22 17:53:07,034 - ALPHA_MIND - INFO - ashare_ex is finished\n" "2018-03-30 16:52:12,879 - ALPHA_MIND - INFO - zz1000 is finished\n",
"2018-03-30 16:52:13,184 - ALPHA_MIND - INFO - ashare_ex is finished\n"
] ]
} }
], ],
"source": [ "source": [
"df = pd.DataFrame(columns=u_names, index=['scipy', 'alphamind'])\n", "df = pd.DataFrame(columns=u_names, index=['cvxpy', 'alphamind'])\n",
"\n", "\n",
"number = 1\n", "number = 1\n",
"\n", "\n",
"for u_name, sample_data in zip(u_names, data_set):\n", "for u_name, sample_data in zip(u_names, data_set):\n",
" factor_data = sample_data['factor']\n", " factor_data = sample_data['factor']\n",
" er = factor_data[factor].values\n", " er = factor_data[factor].values\n",
" lbound = np.ones(len(er)) * lb\n", " n = len(er)\n",
" ubound = np.ones(len(er)) * ub\n", " lbound = np.ones(n) * lb\n",
"\n", " ubound = np.ones(n) * ub\n",
" risk_constraints = np.ones((len(er), 1))\n", " \n",
" risk_constraints = np.ones((n, 1))\n",
" risk_target = (np.array([1.]), np.array([1.]))\n", " risk_target = (np.array([1.]), np.array([1.]))\n",
"\n", "\n",
" status, y, x1 = linear_builder(er, lbound, ubound, risk_constraints, risk_target)\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", " elasped_time1 = timeit.timeit(\"linear_builder(er, lbound, ubound, risk_constraints, risk_target)\", number=number, globals=globals()) / number * 1000\n",
"\n", "\n",
" c = -er\n",
" A_eq = risk_constraints.T\n", " A_eq = risk_constraints.T\n",
" b_eq = np.array([1.])\n", " b_eq = np.array([1.])\n",
" \n", " \n",
" if u_name != 'ashare_ex':\n", " solvers.options['glpk'] = {'msg_lev': 'GLP_MSG_OFF'}\n",
" res = linprog(c, A_ub=None, b_ub=None, A_eq=A_eq, b_eq=b_eq, bounds=list(zip(lbound, ubound)))\n", " w = cvxpy.Variable(n)\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", " curr_risk_exposure = risk_constraints.T @ w\n",
" number=number, globals=globals()) / number * 1000\n", " \n",
" x2 = res['x']\n", " constraints = [w >= lbound,\n",
" np.testing.assert_array_almost_equal(x1, x2, 4)\n", " w <= ubound,\n",
" else:\n", " curr_risk_exposure == risk_target[0]]\n",
" elasped_time2 = np.nan\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", "\n",
" df.loc['alphamind', u_name] = elasped_time1\n", " df.loc['alphamind', u_name] = elasped_time1\n",
" df.loc['scipy', u_name] = elasped_time2\n", " df.loc['cvxpy', u_name] = elasped_time2\n",
" alpha_logger.info(f\"{u_name} is finished\")" " alpha_logger.info(f\"{u_name} is finished\")"
] ]
}, },
...@@ -153,34 +164,37 @@ ...@@ -153,34 +164,37 @@
" <th>hs300</th>\n", " <th>hs300</th>\n",
" <th>zz500</th>\n", " <th>zz500</th>\n",
" <th>zz800</th>\n", " <th>zz800</th>\n",
" <th>zz1000</th>\n",
" <th>ashare_ex</th>\n", " <th>ashare_ex</th>\n",
" </tr>\n", " </tr>\n",
" </thead>\n", " </thead>\n",
" <tbody>\n", " <tbody>\n",
" <tr>\n", " <tr>\n",
" <th>scipy</th>\n", " <th>cvxpy</th>\n",
" <td>32.43</td>\n", " <td>1.68</td>\n",
" <td>132.91</td>\n", " <td>3.13</td>\n",
" <td>297.11</td>\n", " <td>5.02</td>\n",
" <td>829.00</td>\n", " <td>10.15</td>\n",
" <td>NaN</td>\n", " <td>13.55</td>\n",
" <td>145.17</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>alphamind</th>\n", " <th>alphamind</th>\n",
" <td>0.31</td>\n", " <td>0.20</td>\n",
" <td>0.47</td>\n", " <td>0.33</td>\n",
" <td>0.64</td>\n", " <td>0.44</td>\n",
" <td>0.83</td>\n", " <td>0.58</td>\n",
" <td>2.74</td>\n", " <td>0.72</td>\n",
" <td>2.94</td>\n",
" </tr>\n", " </tr>\n",
" </tbody>\n", " </tbody>\n",
"</table>\n", "</table>\n",
"</div>" "</div>"
], ],
"text/plain": [ "text/plain": [
" sh50 hs300 zz500 zz800 ashare_ex\n", " sh50 hs300 zz500 zz800 zz1000 ashare_ex\n",
"scipy 32.43 132.91 297.11 829.00 NaN\n", "cvxpy 1.68 3.13 5.02 10.15 13.55 145.17\n",
"alphamind 0.31 0.47 0.64 0.83 2.74" "alphamind 0.20 0.33 0.44 0.58 0.72 2.94"
] ]
}, },
"execution_count": 4, "execution_count": 4,
...@@ -209,24 +223,28 @@ ...@@ -209,24 +223,28 @@
"name": "stderr", "name": "stderr",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"2018-03-22 17:53:09,185 - ALPHA_MIND - INFO - sh50 is finished\n", "2018-03-30 16:52:13,374 - ALPHA_MIND - INFO - sh50 is finished\n",
"2018-03-22 17:53:09,228 - ALPHA_MIND - INFO - hs300 is finished\n", "2018-03-30 16:52:13,509 - ALPHA_MIND - INFO - hs300 is finished\n",
"2018-03-22 17:53:09,366 - ALPHA_MIND - INFO - zz500 is finished\n", "2018-03-30 16:52:13,732 - ALPHA_MIND - INFO - zz500 is finished\n",
"2018-03-22 17:53:09,694 - ALPHA_MIND - INFO - zz800 is finished\n", "2018-03-30 16:52:14,220 - ALPHA_MIND - INFO - zz800 is finished\n",
"2018-03-22 17:53:15,241 - ALPHA_MIND - INFO - ashare_ex is finished\n" "2018-03-30 16:52:14,956 - ALPHA_MIND - INFO - zz1000 is finished\n",
"2018-03-30 16:52:21,246 - ALPHA_MIND - INFO - ashare_ex is finished\n"
] ]
} }
], ],
"source": [ "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 (simplex)', 'alphamind (interior)'])\n",
"turn_over_target = 0.5\n", "turn_over_target = 0.5\n",
"number = 1\n", "number = 1\n",
"\n", "\n",
"for u_name, sample_data in zip(u_names, data_set):\n", "for u_name, sample_data in zip(u_names, data_set):\n",
" factor_data = sample_data['factor']\n", " factor_data = sample_data['factor']\n",
" er = factor_data[factor].values\n", " er = factor_data[factor].values\n",
" lbound = np.ones(len(er)) * lb\n", " n = len(er)\n",
" ubound = np.ones(len(er)) * ub\n", " lbound = np.ones(n) * lb\n",
" ubound = np.ones(n) * ub\n",
" \n", " \n",
" if 'weight' in factor_data:\n", " if 'weight' in factor_data:\n",
" current_position = factor_data.weight.values\n", " current_position = factor_data.weight.values\n",
...@@ -236,12 +254,53 @@ ...@@ -236,12 +254,53 @@
" risk_constraints = np.ones((len(er), 1))\n", " risk_constraints = np.ones((len(er), 1))\n",
" risk_target = (np.array([1.]), np.array([1.]))\n", " risk_target = (np.array([1.]), np.array([1.]))\n",
"\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", " status, y, x1 = linear_builder(er,\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", " lbound,\n",
"\n", " ubound,\n",
" np.testing.assert_almost_equal(np.abs(x1 - current_position).sum(), 0.5)\n", " risk_constraints,\n",
" risk_target,\n",
" turn_over_target=turn_over_target,\n",
" current_position=current_position,\n",
" method='interior')\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='interior')\"\"\", number=number, globals=globals()) / number * 1000\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",
" \n",
" elasped_time3 = 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",
" \n",
" np.testing.assert_almost_equal(x1 @ er, np.array(w.value).flatten() @ er, 4)\n",
"\n", "\n",
" df.loc['alphamind', u_name] = elasped_time1\n", " df.loc['alphamind (interior)', u_name] = elasped_time1\n",
" df.loc['alphamind (simplex)', u_name] = elasped_time3\n",
" df.loc['cvxpy', u_name] = elasped_time2\n",
" alpha_logger.info(f\"{u_name} is finished\")" " alpha_logger.info(f\"{u_name} is finished\")"
] ]
}, },
...@@ -275,25 +334,37 @@ ...@@ -275,25 +334,37 @@
" <th>hs300</th>\n", " <th>hs300</th>\n",
" <th>zz500</th>\n", " <th>zz500</th>\n",
" <th>zz800</th>\n", " <th>zz800</th>\n",
" <th>zz1000</th>\n",
" <th>ashare_ex</th>\n", " <th>ashare_ex</th>\n",
" </tr>\n", " </tr>\n",
" </thead>\n", " </thead>\n",
" <tbody>\n", " <tbody>\n",
" <tr>\n", " <tr>\n",
" <th>cvxpy</th>\n",
" <td>2.49</td>\n",
" <td>22.19</td>\n",
" <td>51.62</td>\n",
" <td>123.42</td>\n",
" <td>190.62</td>\n",
" <td>1,946.96</td>\n",
" </tr>\n",
" <tr>\n",
" <th>alphamind</th>\n", " <th>alphamind</th>\n",
" <td>0.99</td>\n", " <td>3.77</td>\n",
" <td>15.35</td>\n", " <td>33.59</td>\n",
" <td>65.26</td>\n", " <td>55.49</td>\n",
" <td>156.84</td>\n", " <td>116.31</td>\n",
" <td>2,641.52</td>\n", " <td>165.62</td>\n",
" <td>1,239.47</td>\n",
" </tr>\n", " </tr>\n",
" </tbody>\n", " </tbody>\n",
"</table>\n", "</table>\n",
"</div>" "</div>"
], ],
"text/plain": [ "text/plain": [
" sh50 hs300 zz500 zz800 ashare_ex\n", " sh50 hs300 zz500 zz800 zz1000 ashare_ex\n",
"alphamind 0.99 15.35 65.26 156.84 2,641.52" "cvxpy 2.49 22.19 51.62 123.42 190.62 1,946.96\n",
"alphamind 3.77 33.59 55.49 116.31 165.62 1,239.47"
] ]
}, },
"execution_count": 6, "execution_count": 6,
...@@ -317,23 +388,26 @@ ...@@ -317,23 +388,26 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 7, "execution_count": 8,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"name": "stderr", "name": "stderr",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"2018-03-22 17:53:15,699 - ALPHA_MIND - INFO - sh50 is finished\n", "2018-03-30 16:52:21,418 - ALPHA_MIND - INFO - sh50 is finished\n",
"2018-03-22 17:53:16,466 - ALPHA_MIND - INFO - hs300 is finished\n", "2018-03-30 16:52:21,888 - ALPHA_MIND - INFO - hs300 is finished\n",
"2018-03-22 17:53:17,160 - ALPHA_MIND - INFO - zz500 is finished\n", "2018-03-30 16:52:23,360 - ALPHA_MIND - INFO - zz500 is finished\n",
"2018-03-22 17:53:19,262 - ALPHA_MIND - INFO - zz800 is finished\n", "2018-03-30 16:52:29,066 - ALPHA_MIND - INFO - zz800 is finished\n",
"2018-03-22 17:54:24,333 - ALPHA_MIND - INFO - ashare_ex is finished\n" "2018-03-30 16:52:37,334 - ALPHA_MIND - INFO - zz1000 is finished\n",
"2018-03-30 16:56:15,174 - ALPHA_MIND - INFO - ashare_ex is finished\n"
] ]
} }
], ],
"source": [ "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", "number = 1\n",
"\n", "\n",
"for u_name, sample_data in zip(u_names, data_set):\n", "for u_name, sample_data in zip(u_names, data_set):\n",
...@@ -341,31 +415,41 @@ ...@@ -341,31 +415,41 @@
" factor_data = sample_data['factor']\n", " factor_data = sample_data['factor']\n",
" risk_cov = sample_data['risk_cov'][all_styles].values\n", " risk_cov = sample_data['risk_cov'][all_styles].values\n",
" risk_exposure = factor_data[all_styles].values\n", " risk_exposure = factor_data[all_styles].values\n",
" special_risk = factor_data['s_srisk'].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", " sec_cov = risk_exposure @ risk_cov @ risk_exposure.T / 10000 + np.diag(special_risk ** 2) / 10000\n",
" er = factor_data[factor].values\n", " er = factor_data[factor].values\n",
" n = len(er)\n",
"\n", "\n",
" bm = np.zeros(len(er))\n", " bm = np.zeros(n)\n",
" lbound = -np.ones(len(er)) * np.inf\n", " lbound = -np.ones(n) * np.inf\n",
" ubound = np.ones(len(er)) * np.inf\n", " ubound = np.ones(n) * np.inf\n",
"\n", "\n",
" status, y, x1 = mean_variance_builder(er, sec_cov, bm, lbound, ubound, None, None, lam=1)\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", " 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", " number=number, globals=globals()) / number * 1000\n",
" x2 = np.linalg.inv(sec_cov) @ er\n", " \n",
" elasped_time2 = timeit.timeit(\"np.linalg.inv(sec_cov) @ er\",\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", " number=number, globals=globals()) / number * 1000\n",
"\n", " \n",
" np.testing.assert_array_almost_equal(x1, x2, 4)\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", "\n",
" df.loc['alphamind', u_name] = elasped_time1\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\")" " alpha_logger.info(f\"{u_name} is finished\")"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 8, "execution_count": 9,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
...@@ -393,37 +477,40 @@ ...@@ -393,37 +477,40 @@
" <th>hs300</th>\n", " <th>hs300</th>\n",
" <th>zz500</th>\n", " <th>zz500</th>\n",
" <th>zz800</th>\n", " <th>zz800</th>\n",
" <th>zz1000</th>\n",
" <th>ashare_ex</th>\n", " <th>ashare_ex</th>\n",
" </tr>\n", " </tr>\n",
" </thead>\n", " </thead>\n",
" <tbody>\n", " <tbody>\n",
" <tr>\n", " <tr>\n",
" <th>alphamind</th>\n", " <th>cvxpy</th>\n",
" <td>104.94</td>\n", " <td>9.81</td>\n",
" <td>191.47</td>\n", " <td>185.93</td>\n",
" <td>281.23</td>\n", " <td>638.17</td>\n",
" <td>827.31</td>\n", " <td>2,501.41</td>\n",
" <td>29,734.30</td>\n", " <td>3,665.02</td>\n",
" <td>94,592.70</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>direct</th>\n", " <th>alphamind</th>\n",
" <td>0.13</td>\n", " <td>0.33</td>\n",
" <td>111.10</td>\n", " <td>5.66</td>\n",
" <td>37.12</td>\n", " <td>14.24</td>\n",
" <td>183.78</td>\n", " <td>47.29</td>\n",
" <td>2,194.78</td>\n", " <td>109.08</td>\n",
" <td>2,515.06</td>\n",
" </tr>\n", " </tr>\n",
" </tbody>\n", " </tbody>\n",
"</table>\n", "</table>\n",
"</div>" "</div>"
], ],
"text/plain": [ "text/plain": [
" sh50 hs300 zz500 zz800 ashare_ex\n", " sh50 hs300 zz500 zz800 zz1000 ashare_ex\n",
"alphamind 104.94 191.47 281.23 827.31 29,734.30\n", "cvxpy 9.81 185.93 638.17 2,501.41 3,665.02 94,592.70\n",
"direct 0.13 111.10 37.12 183.78 2,194.78" "alphamind 0.33 5.66 14.24 47.29 109.08 2,515.06"
] ]
}, },
"execution_count": 8, "execution_count": 9,
"metadata": {}, "metadata": {},
"output_type": "execute_result" "output_type": "execute_result"
} }
...@@ -436,34 +523,30 @@ ...@@ -436,34 +523,30 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"## 4. Mean - Variance 优化 (Box约束以及线性约束)" "## 4. Mean - Variance 优化 (Box约束)\n",
"---------------"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 9, "execution_count": 10,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"name": "stderr", "name": "stderr",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"2018-03-22 17:54:24,724 - ALPHA_MIND - INFO - sh50 is finished\n", "2018-03-30 16:56:16,044 - ALPHA_MIND - INFO - sh50 is finished\n",
"2018-03-22 17:54:49,448 - ALPHA_MIND - INFO - hs300 is finished\n", "2018-03-30 16:56:16,705 - ALPHA_MIND - INFO - hs300 is finished\n",
"2018-03-22 17:56:47,931 - ALPHA_MIND - INFO - zz500 is finished\n", "2018-03-30 16:56:19,651 - ALPHA_MIND - INFO - zz500 is finished\n",
"2018-03-22 18:14:21,352 - ALPHA_MIND - INFO - zz800 is finished\n", "2018-03-30 16:56:30,227 - ALPHA_MIND - INFO - zz800 is finished\n",
"2018-03-22 18:14:23,308 - ALPHA_MIND - INFO - ashare_ex is finished\n" "2018-03-30 16:56:44,840 - ALPHA_MIND - INFO - zz1000 is finished\n",
"2018-03-30 17:08:25,343 - ALPHA_MIND - INFO - ashare_ex is finished\n"
] ]
} }
], ],
"source": [ "source": [
"def func(x):\n", "df = pd.DataFrame(columns=u_names, index=['cvxpy', 'alphamind'])\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",
"number = 1\n", "number = 1\n",
"\n", "\n",
"for u_name, sample_data in zip(u_names, data_set):\n", "for u_name, sample_data in zip(u_names, data_set):\n",
...@@ -471,41 +554,43 @@ ...@@ -471,41 +554,43 @@
" factor_data = sample_data['factor']\n", " factor_data = sample_data['factor']\n",
" risk_cov = sample_data['risk_cov'][all_styles].values\n", " risk_cov = sample_data['risk_cov'][all_styles].values\n",
" risk_exposure = factor_data[all_styles].values\n", " risk_exposure = factor_data[all_styles].values\n",
" special_risk = factor_data['s_srisk'].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", " sec_cov = risk_exposure @ risk_cov @ risk_exposure.T / 10000 + np.diag(special_risk ** 2) / 10000\n",
" er = factor_data[factor].values\n", " er = factor_data[factor].values\n",
" \n", " n = len(er)\n",
" bm = np.zeros(len(er))\n",
" lbound = np.zeros(len(er))\n",
" ubound = np.ones(len(er)) * 0.1\n",
" \n",
" risk_constraints = np.ones((len(er), 1))\n",
" risk_target = (np.array([1.]), np.array([1.]))\n",
"\n", "\n",
" status, y, x1 = mean_variance_builder(er, sec_cov, bm, lbound, ubound, risk_constraints, risk_target, lam=1)\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", " 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", " number=number, globals=globals()) / number * 1000\n",
" \n", " \n",
" cons = [dict(type='eq', fun=con_func)]\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", " \n",
" if u_name != 'ashare_ex':\n", " u1 = -x1 @ er + 0.5 * x1 @ sec_cov @ x1\n",
" res = minimize(func, np.zeros(len(er)), bounds=list(zip(lbound, ubound)), constraints=cons, tol=1e-12)\n", " x2 = np.array(w.value).flatten()\n",
" x2 = res['x']\n", " u2 = -x2 @ er + 0.5 * x2 @ sec_cov @ x2\n",
" elasped_time2 = timeit.timeit(\"minimize(func, np.zeros(len(er)), bounds=list(zip(lbound, ubound)), constraints=cons, tol=1e-12)\",\n", " \n",
" number=number, globals=globals()) / number * 1000\n", " np.testing.assert_array_almost_equal(u1, u2, 4)\n",
"\n",
" np.testing.assert_array_almost_equal(x1, x2, 4)\n",
" else:\n",
" elasped_time2 = np.nan\n",
"\n", "\n",
" df.loc['alphamind', u_name] = elasped_time1\n", " df.loc['alphamind', u_name] = elasped_time1\n",
" df.loc['scipy', u_name] = elasped_time2\n", " df.loc['cvxpy', u_name] = elasped_time2\n",
" alpha_logger.info(f\"{u_name} is finished\")" " alpha_logger.info(f\"{u_name} is finished\")"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 10, "execution_count": 11,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
...@@ -533,37 +618,40 @@ ...@@ -533,37 +618,40 @@
" <th>hs300</th>\n", " <th>hs300</th>\n",
" <th>zz500</th>\n", " <th>zz500</th>\n",
" <th>zz800</th>\n", " <th>zz800</th>\n",
" <th>zz1000</th>\n",
" <th>ashare_ex</th>\n", " <th>ashare_ex</th>\n",
" </tr>\n", " </tr>\n",
" </thead>\n", " </thead>\n",
" <tbody>\n", " <tbody>\n",
" <tr>\n", " <tr>\n",
" <th>alphamind</th>\n", " <th>cvxpy</th>\n",
" <td>22.85</td>\n", " <td>10.78</td>\n",
" <td>43.37</td>\n", " <td>300.36</td>\n",
" <td>56.38</td>\n", " <td>1,377.87</td>\n",
" <td>96.70</td>\n", " <td>5,244.64</td>\n",
" <td>844.01</td>\n", " <td>6,758.95</td>\n",
" <td>334,990.46</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>scipy</th>\n", " <th>alphamind</th>\n",
" <td>11.82</td>\n", " <td>0.32</td>\n",
" <td>12,556.23</td>\n", " <td>4.78</td>\n",
" <td>58,165.61</td>\n", " <td>16.02</td>\n",
" <td>493,142.76</td>\n", " <td>41.63</td>\n",
" <td>NaN</td>\n", " <td>64.54</td>\n",
" <td>1,134.95</td>\n",
" </tr>\n", " </tr>\n",
" </tbody>\n", " </tbody>\n",
"</table>\n", "</table>\n",
"</div>" "</div>"
], ],
"text/plain": [ "text/plain": [
" sh50 hs300 zz500 zz800 ashare_ex\n", " sh50 hs300 zz500 zz800 zz1000 ashare_ex\n",
"alphamind 22.85 43.37 56.38 96.70 844.01\n", "cvxpy 10.78 300.36 1,377.87 5,244.64 6,758.95 334,990.46\n",
"scipy 11.82 12,556.23 58,165.61 493,142.76 NaN" "alphamind 0.32 4.78 16.02 41.63 64.54 1,134.95"
] ]
}, },
"execution_count": 10, "execution_count": 11,
"metadata": {}, "metadata": {},
"output_type": "execute_result" "output_type": "execute_result"
} }
...@@ -576,146 +664,156 @@ ...@@ -576,146 +664,156 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"## 5. 线性优化(带二次限制条件)\n", "## 5. Mean - Variance 优化 (Box约束以及线性约束)\n",
"-------------------------" "----------------"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 11, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"name": "stderr", "name": "stderr",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"2018-03-22 18:14:23,659 - ALPHA_MIND - INFO - sh50 is finished\n", "2018-03-30 17:08:25,991 - ALPHA_MIND - INFO - sh50 is finished\n",
"2018-03-22 18:14:28,900 - ALPHA_MIND - INFO - hs300 is finished\n", "2018-03-30 17:08:26,763 - ALPHA_MIND - INFO - hs300 is finished\n",
"2018-03-22 18:16:07,065 - ALPHA_MIND - INFO - zz500 is finished\n", "2018-03-30 17:08:30,276 - ALPHA_MIND - INFO - zz500 is finished\n",
"2018-03-22 18:23:41,655 - ALPHA_MIND - INFO - zz800 is finished\n", "2018-03-30 17:08:41,580 - ALPHA_MIND - INFO - zz800 is finished\n",
"2018-03-22 18:23:45,044 - ALPHA_MIND - INFO - ashare_ex is finished\n" "2018-03-30 17:09:18,856 - ALPHA_MIND - INFO - zz1000 is finished\n"
] ]
} }
], ],
"source": [ "source": [
"df = pd.DataFrame(columns=u_names, index=['alphamind', 'scipy'])\n", "df = pd.DataFrame(columns=u_names, index=['cvxpy', 'alphamind'])\n",
"number = 1\n", "number = 1\n",
"target_vol = 0.1\n",
"\n", "\n",
"def func(x):\n", "for u_name, sample_data in zip(u_names, data_set):\n",
" return - er @ x\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",
" risk_constraints = np.ones((len(er), 1))\n",
" risk_target = (np.array([1.]), np.array([1.]))\n",
"\n", "\n",
"def con_func(x):\n", " status, y, x1 = mean_variance_builder(er, sec_cov, bm, lbound, ubound, risk_constraints, risk_target, lam=1)\n",
" return x.sum()\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",
" 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",
" 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": [
"## 6. 线性优化(带二次限制条件)\n",
"-------------------------"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df = pd.DataFrame(columns=u_names, index=['cvxpy', 'alphamind'])\n",
"number = 1\n",
"target_vol = 0.1\n",
"\n", "\n",
"def ieq_func(x):\n",
" return target_vol * target_vol - x @ sec_cov @ x\n",
"\n", "\n",
"for u_name, sample_data in zip(u_names, data_set):\n", "for u_name, sample_data in zip(u_names, data_set):\n",
" all_styles = risk_styles + industry_styles + ['COUNTRY']\n", " all_styles = risk_styles + industry_styles + ['COUNTRY']\n",
" factor_data = sample_data['factor']\n", " factor_data = sample_data['factor']\n",
" risk_cov = sample_data['risk_cov'][all_styles].values\n", " risk_cov = sample_data['risk_cov'][all_styles].values\n",
" risk_exposure = factor_data[all_styles].values\n", " risk_exposure = factor_data[all_styles].values\n",
" special_risk = factor_data['s_srisk'].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", " sec_cov = risk_exposure @ risk_cov @ risk_exposure.T / 10000 + np.diag(special_risk ** 2) / 10000\n",
" er = factor_data[factor].values\n", " er = factor_data[factor].values\n",
" n = len(er)\n",
" \n", " \n",
" if 'weight' in factor_data:\n", " if 'weight' in factor_data:\n",
" bm = factor_data.weight.values\n", " bm = factor_data.weight.values\n",
" else:\n", " else:\n",
" bm = np.ones_like(er) / len(er)\n", " bm = np.ones_like(er) / n\n",
" lbound = np.zeros(len(er))\n", " lbound = np.zeros(n)\n",
" ubound = np.ones(len(er)) * 0.1\n", " ubound = np.ones(n) * 0.1\n",
" \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", " risk_target = (np.array([bm.sum()]), np.array([bm.sum()]))\n",
"\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", " 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", " 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", " number=number, globals=globals()) / number * 1000\n",
" \n", " \n",
" cons = [dict(type='eq', fun=con_func), dict(type='ineq', fun=ieq_func)]\n", " w = cvxpy.Variable(n)\n",
" \n", " risk = quad_form(w - bm, sec_cov)\n",
" if u_name != 'ashare_ex':\n", " objective = cvxpy.Minimize(-w.T * er)\n",
" res = minimize(func, bm, bounds=list(zip(lbound - bm, ubound-bm)), constraints=cons, tol=1e-12)\n", " curr_risk_exposure = risk_constraints.T @ w\n",
" x2 = res['x'] + bm\n", " constraints = [w >= lbound,\n",
" elasped_time2 = timeit.timeit(\"minimize(func, np.zeros(len(er)), bounds=list(zip(lbound-bm, ubound-bm)), constraints=cons, tol=1e-12)\",\n", " w <= ubound,\n",
" number=number, globals=globals()) / number * 1000\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", "\n",
" np.testing.assert_array_almost_equal(x1, x2, 4)\n", " u1 = -x1 @ er\n",
" else:\n", " x2 = np.array(w.value).flatten()\n",
" elasped_time2 = np.nan\n", " u2 = -x2 @ er\n",
" \n",
" np.testing.assert_array_almost_equal(u1, u2, 4)\n",
"\n", "\n",
" df.loc['alphamind', u_name] = elasped_time1\n", " df.loc['alphamind', u_name] = elasped_time1\n",
" df.loc['scipy', u_name] = elasped_time2\n", " df.loc['cvxpy', u_name] = elasped_time2\n",
" alpha_logger.info(f\"{u_name} is finished\")" " alpha_logger.info(f\"{u_name} is finished\")"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 12, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "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>ashare_ex</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>alphamind</th>\n",
" <td>22.60</td>\n",
" <td>32.65</td>\n",
" <td>61.21</td>\n",
" <td>65.76</td>\n",
" <td>744.30</td>\n",
" </tr>\n",
" <tr>\n",
" <th>scipy</th>\n",
" <td>14.00</td>\n",
" <td>3,379.72</td>\n",
" <td>48,615.18</td>\n",
" <td>213,248.36</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" sh50 hs300 zz500 zz800 ashare_ex\n",
"alphamind 22.60 32.65 61.21 65.76 744.30\n",
"scipy 14.00 3,379.72 48,615.18 213,248.36 NaN"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"df" "df"
] ]
...@@ -723,9 +821,7 @@ ...@@ -723,9 +821,7 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": null,
"metadata": { "metadata": {},
"collapsed": true
},
"outputs": [], "outputs": [],
"source": [] "source": []
} }
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 2, "execution_count": 5,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 3, "execution_count": 6,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -96,7 +96,7 @@ ...@@ -96,7 +96,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 4, "execution_count": 7,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -108,7 +108,7 @@ ...@@ -108,7 +108,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 5, "execution_count": 8,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -118,7 +118,7 @@ ...@@ -118,7 +118,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 6, "execution_count": 9,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
...@@ -127,7 +127,7 @@ ...@@ -127,7 +127,7 @@
"800" "800"
] ]
}, },
"execution_count": 6, "execution_count": 9,
"metadata": {}, "metadata": {},
"output_type": "execute_result" "output_type": "execute_result"
} }
...@@ -146,20 +146,19 @@ ...@@ -146,20 +146,19 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 7, "execution_count": 32,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"CPU times: user 6.95 ms, sys: 3.42 ms, total: 10.4 ms\n", "128 ms ± 4.27 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
"Wall time: 122 ms\n"
] ]
} }
], ],
"source": [ "source": [
"%%time\n", "%%timeit\n",
"neutralized_factor_uqer = uqer.neutralize(total_data[factor],\n", "neutralized_factor_uqer = uqer.neutralize(total_data[factor],\n",
" target_date=ref_date.replace('-', ''),\n", " target_date=ref_date.replace('-', ''),\n",
" industry_type='short')" " industry_type='short')"
...@@ -167,7 +166,7 @@ ...@@ -167,7 +166,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 8, "execution_count": 33,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
...@@ -197,43 +196,43 @@ ...@@ -197,43 +196,43 @@
" <tbody>\n", " <tbody>\n",
" <tr>\n", " <tr>\n",
" <th>000001</th>\n", " <th>000001</th>\n",
" <td>-0.065580</td>\n", " <td>-0.076975</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>000002</th>\n", " <th>000002</th>\n",
" <td>-0.279003</td>\n", " <td>-0.288382</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>000006</th>\n", " <th>000006</th>\n",
" <td>-0.044765</td>\n", " <td>-0.054668</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>000008</th>\n", " <th>000008</th>\n",
" <td>-0.049037</td>\n", " <td>-0.034123</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>000009</th>\n", " <th>000009</th>\n",
" <td>0.011354</td>\n", " <td>0.029815</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>000012</th>\n", " <th>000012</th>\n",
" <td>0.084542</td>\n", " <td>0.089305</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>000021</th>\n", " <th>000021</th>\n",
" <td>0.047019</td>\n", " <td>0.034998</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>000025</th>\n", " <th>000025</th>\n",
" <td>-0.045585</td>\n", " <td>-0.048613</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>000027</th>\n", " <th>000027</th>\n",
" <td>-0.014162</td>\n", " <td>-0.003274</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>000028</th>\n", " <th>000028</th>\n",
" <td>0.352680</td>\n", " <td>0.347669</td>\n",
" </tr>\n", " </tr>\n",
" </tbody>\n", " </tbody>\n",
"</table>\n", "</table>\n",
...@@ -241,31 +240,34 @@ ...@@ -241,31 +240,34 @@
], ],
"text/plain": [ "text/plain": [
" uqer\n", " uqer\n",
"000001 -0.065580\n", "000001 -0.076975\n",
"000002 -0.279003\n", "000002 -0.288382\n",
"000006 -0.044765\n", "000006 -0.054668\n",
"000008 -0.049037\n", "000008 -0.034123\n",
"000009 0.011354\n", "000009 0.029815\n",
"000012 0.084542\n", "000012 0.089305\n",
"000021 0.047019\n", "000021 0.034998\n",
"000025 -0.045585\n", "000025 -0.048613\n",
"000027 -0.014162\n", "000027 -0.003274\n",
"000028 0.352680" "000028 0.347669"
] ]
}, },
"execution_count": 8, "execution_count": 33,
"metadata": {}, "metadata": {},
"output_type": "execute_result" "output_type": "execute_result"
} }
], ],
"source": [ "source": [
"neutralized_factor_uqer = uqer.neutralize(total_data[factor],\n",
" target_date=ref_date.replace('-', ''),\n",
" industry_type='short')\n",
"df = pd.DataFrame(neutralized_factor_uqer, columns=['uqer'])\n", "df = pd.DataFrame(neutralized_factor_uqer, columns=['uqer'])\n",
"df.head(10)" "df.head(10)"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 9, "execution_count": 34,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
...@@ -274,7 +276,7 @@ ...@@ -274,7 +276,7 @@
"800" "800"
] ]
}, },
"execution_count": 9, "execution_count": 34,
"metadata": {}, "metadata": {},
"output_type": "execute_result" "output_type": "execute_result"
} }
...@@ -285,54 +287,54 @@ ...@@ -285,54 +287,54 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 10, "execution_count": 35,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"BETA -7.079814e-01\n", "BETA 6.017409e-14\n",
"MOMENTUM 5.939448e-01\n", "MOMENTUM 7.993606e-15\n",
"SIZE -6.938956e-01\n", "SIZE -6.938894e-14\n",
"EARNYILD 1.338850e+00\n", "EARNYILD -1.829648e-13\n",
"RESVOL 2.322437e-01\n", "RESVOL 2.109424e-13\n",
"GROWTH -2.983247e+00\n", "GROWTH -1.021405e-13\n",
"BTOP 1.012006e-01\n", "BTOP -1.425526e-13\n",
"LEVERAGE 3.958701e-02\n", "LEVERAGE -1.541545e-13\n",
"LIQUIDTY -6.292967e-01\n", "LIQUIDTY 4.973799e-14\n",
"SIZENL 4.881117e-04\n", "SIZENL 5.417888e-14\n",
"Bank -1.998401e-14\n", "Bank -8.770762e-15\n",
"RealEstate -1.243450e-14\n", "RealEstate -1.076916e-14\n",
"Health 1.454392e-14\n", "Health -6.661338e-16\n",
"Transportation -6.106227e-16\n", "Transportation 3.774758e-15\n",
"Mining -1.282308e-14\n", "Mining -4.551914e-15\n",
"NonFerMetal -2.775558e-17\n", "NonFerMetal 9.020562e-15\n",
"HouseApp 2.886580e-15\n", "HouseApp -4.218847e-15\n",
"LeiService -4.996004e-16\n", "LeiService -4.163336e-16\n",
"MachiEquip 9.547918e-15\n", "MachiEquip 2.395306e-14\n",
"BuildDeco -5.329071e-15\n", "BuildDeco 9.547918e-15\n",
"CommeTrade 7.216450e-15\n", "CommeTrade 5.884182e-15\n",
"CONMAT -6.772360e-15\n", "CONMAT 7.188694e-15\n",
"Auto -3.594347e-15\n", "Auto 6.883383e-15\n",
"Textile 5.412337e-15\n", "Textile 4.996004e-15\n",
"FoodBever 4.329870e-15\n", "FoodBever -6.217249e-15\n",
"Electronics 1.998401e-15\n", "Electronics 1.132427e-14\n",
"Computer 3.719247e-15\n", "Computer 8.604228e-15\n",
"LightIndus 6.133982e-15\n", "LightIndus 1.346145e-15\n",
"Utilities 3.053113e-16\n", "Utilities -6.258882e-15\n",
"Telecom -4.163336e-15\n", "Telecom 3.608225e-16\n",
"AgriForest 1.845746e-15\n", "AgriForest 8.160139e-15\n",
"CHEM 4.579670e-15\n", "CHEM -6.994405e-15\n",
"Media 2.586820e-14\n", "Media 1.088019e-14\n",
"IronSteel -7.223389e-15\n", "IronSteel -1.915135e-15\n",
"NonBankFinan 2.442491e-15\n", "NonBankFinan -9.880985e-15\n",
"ELECEQP 2.942091e-15\n", "ELECEQP -5.773160e-15\n",
"AERODEF -7.494005e-16\n", "AERODEF 4.031497e-15\n",
"Conglomerates 1.679212e-15\n", "Conglomerates -5.023759e-15\n",
"dtype: float64" "dtype: float64"
] ]
}, },
"execution_count": 10, "execution_count": 35,
"metadata": {}, "metadata": {},
"output_type": "execute_result" "output_type": "execute_result"
} }
...@@ -358,7 +360,7 @@ ...@@ -358,7 +360,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 11, "execution_count": 36,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -368,26 +370,25 @@ ...@@ -368,26 +370,25 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 12, "execution_count": 37,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"CPU times: user 1.59 s, sys: 8.02 ms, total: 1.6 s\n", "139 µs ± 8 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n"
"Wall time: 152 ms\n"
] ]
} }
], ],
"source": [ "source": [
"%%time\n", "%%timeit\n",
"neutralized_factor_alphamind = neutralize(x, y, weights=np.ones(len(y)))" "neutralized_factor_alphamind = neutralize(x, y, weights=np.ones(len(y)))"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 13, "execution_count": 38,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
...@@ -418,27 +419,27 @@ ...@@ -418,27 +419,27 @@
" <tbody>\n", " <tbody>\n",
" <tr>\n", " <tr>\n",
" <th>000001</th>\n", " <th>000001</th>\n",
" <td>-0.065580</td>\n", " <td>-0.076975</td>\n",
" <td>-0.076975</td>\n", " <td>-0.076975</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>000002</th>\n", " <th>000002</th>\n",
" <td>-0.279003</td>\n", " <td>-0.288382</td>\n",
" <td>-0.288382</td>\n", " <td>-0.288382</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>000006</th>\n", " <th>000006</th>\n",
" <td>-0.044765</td>\n", " <td>-0.054668</td>\n",
" <td>-0.054668</td>\n", " <td>-0.054668</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>000008</th>\n", " <th>000008</th>\n",
" <td>-0.049037</td>\n", " <td>-0.034123</td>\n",
" <td>-0.034123</td>\n", " <td>-0.034123</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>000009</th>\n", " <th>000009</th>\n",
" <td>0.011354</td>\n", " <td>0.029815</td>\n",
" <td>0.029815</td>\n", " <td>0.029815</td>\n",
" </tr>\n", " </tr>\n",
" </tbody>\n", " </tbody>\n",
...@@ -447,19 +448,20 @@ ...@@ -447,19 +448,20 @@
], ],
"text/plain": [ "text/plain": [
" uqer alpha-mind\n", " uqer alpha-mind\n",
"000001 -0.065580 -0.076975\n", "000001 -0.076975 -0.076975\n",
"000002 -0.279003 -0.288382\n", "000002 -0.288382 -0.288382\n",
"000006 -0.044765 -0.054668\n", "000006 -0.054668 -0.054668\n",
"000008 -0.049037 -0.034123\n", "000008 -0.034123 -0.034123\n",
"000009 0.011354 0.029815" "000009 0.029815 0.029815"
] ]
}, },
"execution_count": 13, "execution_count": 38,
"metadata": {}, "metadata": {},
"output_type": "execute_result" "output_type": "execute_result"
} }
], ],
"source": [ "source": [
"neutralized_factor_alphamind = neutralize(x, y, weights=np.ones(len(y)))\n",
"alphamind_series = pd.Series(neutralized_factor_alphamind.flatten(), index=total_data.index)\n", "alphamind_series = pd.Series(neutralized_factor_alphamind.flatten(), index=total_data.index)\n",
"df['alpha-mind'] = alphamind_series\n", "df['alpha-mind'] = alphamind_series\n",
"df.head()" "df.head()"
...@@ -467,7 +469,7 @@ ...@@ -467,7 +469,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 14, "execution_count": 39,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
...@@ -476,7 +478,7 @@ ...@@ -476,7 +478,7 @@
"800" "800"
] ]
}, },
"execution_count": 14, "execution_count": 39,
"metadata": {}, "metadata": {},
"output_type": "execute_result" "output_type": "execute_result"
} }
...@@ -495,7 +497,7 @@ ...@@ -495,7 +497,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 15, "execution_count": 40,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -504,7 +506,7 @@ ...@@ -504,7 +506,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 16, "execution_count": 41,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
...@@ -531,7 +533,7 @@ ...@@ -531,7 +533,7 @@
" <th>code</th>\n", " <th>code</th>\n",
" <th>isOpen</th>\n", " <th>isOpen</th>\n",
" <th>EPS</th>\n", " <th>EPS</th>\n",
" <th>s_srisk</th>\n", " <th>srisk</th>\n",
" <th>BETA</th>\n", " <th>BETA</th>\n",
" <th>MOMENTUM</th>\n", " <th>MOMENTUM</th>\n",
" <th>SIZE</th>\n", " <th>SIZE</th>\n",
...@@ -583,13 +585,13 @@ ...@@ -583,13 +585,13 @@
], ],
"text/plain": [ "text/plain": [
"Empty DataFrame\n", "Empty DataFrame\n",
"Columns: [code, isOpen, EPS, s_srisk, BETA, MOMENTUM, SIZE, EARNYILD, RESVOL, GROWTH, BTOP, LEVERAGE, LIQUIDTY, SIZENL, Bank, RealEstate, Health, Transportation, Mining, NonFerMetal, HouseApp, LeiService, MachiEquip, BuildDeco, CommeTrade, CONMAT, Auto, Textile, FoodBever, Electronics, Computer, LightIndus, Utilities, Telecom, AgriForest, CHEM, Media, IronSteel, NonBankFinan, ELECEQP, AERODEF, Conglomerates, COUNTRY]\n", "Columns: [code, isOpen, EPS, srisk, BETA, MOMENTUM, SIZE, EARNYILD, RESVOL, GROWTH, BTOP, LEVERAGE, LIQUIDTY, SIZENL, Bank, RealEstate, Health, Transportation, Mining, NonFerMetal, HouseApp, LeiService, MachiEquip, BuildDeco, CommeTrade, CONMAT, Auto, Textile, FoodBever, Electronics, Computer, LightIndus, Utilities, Telecom, AgriForest, CHEM, Media, IronSteel, NonBankFinan, ELECEQP, AERODEF, Conglomerates, COUNTRY]\n",
"Index: []\n", "Index: []\n",
"\n", "\n",
"[0 rows x 43 columns]" "[0 rows x 43 columns]"
] ]
}, },
"execution_count": 16, "execution_count": 41,
"metadata": {}, "metadata": {},
"output_type": "execute_result" "output_type": "execute_result"
} }
...@@ -608,25 +610,16 @@ ...@@ -608,25 +610,16 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 17, "execution_count": 42,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/python/anaconda3/envs/py36/lib/python3.6/site-packages/statsmodels/compat/pandas.py:56: FutureWarning: The pandas.core.datetools module is deprecated and will be removed in a future version. Please use the pandas.tseries module instead.\n",
" from pandas.core import datetools\n"
]
}
],
"source": [ "source": [
"import statsmodels.api as sm" "import statsmodels.api as sm"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 18, "execution_count": 43,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -636,7 +629,7 @@ ...@@ -636,7 +629,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 19, "execution_count": 44,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -653,7 +646,7 @@ ...@@ -653,7 +646,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 20, "execution_count": 45,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -663,24 +656,24 @@ ...@@ -663,24 +656,24 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 21, "execution_count": 46,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x7f5cb9dd7be0>" "<matplotlib.axes._subplots.AxesSubplot at 0x1fcc2856978>"
] ]
}, },
"execution_count": 21, "execution_count": 46,
"metadata": {}, "metadata": {},
"output_type": "execute_result" "output_type": "execute_result"
}, },
{ {
"data": { "data": {
"image/png": "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9bTjpsNW2I+22WMaSbmHJjOCettVn9incu1jkkfuD7E/3G61U/4PZH57WBvuctlh2ylPDzPPFz2f7JMd+8lO21/ENge+/lHoR3sYjyMbq0c2sQNjRXuoXM/zVnzfn8u8X/Z9f75vnV8Dir7vv9m8//dAHfgscJvv+882y38UeK3v+//zTul6nvcfgPXk8ULP814A3Oj7/kvN+18gvrP2H4DP+77/GLP8KuDjvu9fN6Q8txLfecP3/SdfdMWIiIiIiMhJsePv8O/4nS7P8z4FXD7go9fvIRPRNssvxr7sw/f9O4A7LjIPI+N53hd933/KYedjnKmOR091PHqq49FTHY+e6nj0VMejpzoereNYvzsGXcmdqEE8z3vQ87xTvu+fN48LXhiw2jngTOb9lcR3uc6Z19nl3zGvd5Nu/z6uGpDWIjDneZ7r+36nbx8iIiIiIiIjt9fvdN0F3GJe3wJ8eMA6dwM3eJ43b35A4wbgbt/3zwM1z/OuN9+9elFm+92km/UF4BrP8x7peV4eeCFwl/mu2GeAFzyMtERERERERPbNXoOu24DneJ53D/Ac8x7P857ied7bAXzfrwK/RRwYfQF4k1kG8HLg7cC9wH3Ax3dI93LP884BrwHe4HneOc/zZsxdrF8hDvC+Fu/W/4pJ67XAazzPuxdYAP5oj2U+DEfukccxpDoePdXx6KmOR091PHqq49FTHY+e6ni0jl397umHNERERESimWNxAAAAT0lEQVRERGR7e73TJSIiIiIiIttQ0CUiIiIiIjJCCrpERERERERGSEGXiIiIiIjICCnoEhERERERGSEFXSIiIiIiIiOkoEtERERERGSE/n958DdMa3gZVwAAAABJRU5ErkJggg==\n", "image/png": "iVBORw0KGgoAAAANSUhEUgAAA10AAAGUCAYAAADOA0gKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3XuQXtV55/tvowYhlw1IarBpIdvioDqDXCcWAYN8qYEREkg4IJkojyHEFokS2Q4uElTjMg6uUQWRCYTbwTnYjrgEQXkMjwkOSgWsCITt1MHcgk08MsVEXJyWm7GnkcBUYbWs5p0/eknTat6+SG8vqSW+n6ouv3vttZ+990P+yK/W3lttjUYDSZIkSVIdh+zvC5AkSZKkg5mhS5IkSZIqMnRJkiRJUkWGLkmSJEmqyNAlSZIkSRUZuiRJkiSpovaxKBIRC4CbgAnArZl59aD9E4E7gZOBV4BPZuZLZd+XgGVAH3BpZq4brmZEfB74U+D/Ao7OzJ4y3lbmnwO8AVycmU+XfUuBL5fLuSoz14zFfUuSJEnSSFpe6YqICcDNwEJgFnBhRMwaNG0ZsDUzTwBuBK4px84CLgA+ACwAvhoRE0ao+f8D84CfDjrHQmBm+VsOfK2cYwqwEjgNOBVYGRGTW71vSZIkSRqNsXi88FRgU2a+kJnbgbuBRYPmLAJ2ri7dC5xZVqYWAXdnZm9mvghsKvWGrJmZP9y5StbkHHdmZiMzHwOOiohjgbOB9Zm5JTO3AuvpD3iSJEmSVN1YPF44DegasL2Z/lWlpnMyc0dEvAZMLeOPDTp2Wvk9Us3RXMe0YcbfIiKW079KRmaePML5JEmSJKltpAljEbqanaQxyjlDjTdbgRtcc7TXMZrrAyAzVwOrd87p7u4e4ZT7RkdHBz09Pfv7Mg5q9rg+e1yfPa7PHtdnj+uzx/XZ47rGU387OztHNW8sHi/cDEwfsH0cMDit7JoTEe3AkcCWYY4dTc3RXsfe1JIkSZKkMTEWK11PAjMjYgbwM/o/jPG7g+asBZYCPwCWABsysxERa4H/FhE3AJ30fwTjCfpXp0aqOdha4PMRcTf9jyK+lpkvR8Q64L8O+HjGWcCXWrpjSZIkSRqllle6MnMH8HlgHfBs/1BujIgrI+K8Mu02YGpEbAJWAJeXYzcCCfwE+A5wSWb2DVUTICIujYjN9K9Y/WtE3FrO8QDwAv0f47gF+ONyji3AKvrD4ZPAlWVMkiRJkqprazRGelXqbct3ut5G7HF99rg+e1yfPa7PHtdnj+tr1uNGo8G2bdt48803aWsb8bsLGsbEiRPp7e3dZ+drNBoccsghHH744W/5b1fe6donH9KQJEmSNIxt27Zx6KGH0t7u//vdqvb2diZMmLBPz7ljxw62bdvGpEmT9ur4sfiQhiRJkqRhvPnmmwauA1h7eztvvvnmXh9v6JIkSZIq85HCA18r/w0NXZIkSZJUkaFLkiRJ0n7T1dXF3Llz9/dlVGXokiRJkrRX+vr69vclHBAMXZIkSdJBbvBq0te//nWuv/56AP71X/+VefPmce6557Jq1apd8/r6+li1ahXnnHMO8+bN46677gLg0UcfZcmSJVxyySWceeaZo76GRqOxq/6ZZ57J/fff/5Y5zz33HB//+MeZP38+8+bN44UXXmjltscNP6EiSZIk7UNv3n0Lja4Xx7Rm2/QZHHLBH+3VsStWrGDVqlV8+MMfZtWqVbvGv/nNb/Kud72LBx54gN7eXhYvXszpp58OwI9+9CM2bNjAe9/73lGf54EHHmDjxo2sX7+eLVu2cM455zBnzpzd5tx1110sW7aM888/n+3btx80K2mGLkmSJOlt6pe//CWvvfYaH/7whwH47d/+bR555BEAvve97/Hss8/yj//4jwC8/vrrvPjiixx66KHMnj17jwIXwBNPPMHixYuZMGECRx99NHPmzOGZZ57hxBNP3DXn5JNP5itf+Qovv/wyCxcu5Pjjjx+jO92/DF2SJEnSPrS3K1KtmDBhwm7/ztS2bduA/kf+hvsU+lVXXcUZZ5yx29ijjz7KO97xjqbzH3zwQW644QYArrvuOj74wQ/u2tdoNEa8zk984hOcdNJJPPzww1x00UVce+21fOxjHxvxuPHOd7okSZKkg9zRRx9NT08PW7Zsobe3l4ceegiAI488kiOOOIInnngCgG9/+9u7jjn99NO58847+fWvfw3A888/zxtvvDHseRYuXMj69etZv379boELYM6cOaxdu5a+vj5eeeUVHn/8cWbPnr3bnJ/+9Ke8733vY9myZcyfP59nn3225XsfD1zpkiRJkg5yhx56KJdddhnnnnsu06dP54QTTti174YbbmDFihVMmjRpt1Wt3/3d36Wrq4sFCxbQaDSYMmUKt99++15fw8KFC/mXf/kX5s+fT1tbG1dccQXHHHMMXV1du+asXbuW++67j/b2do455hguu+yyvT7feNI2mmW+t6lGd3f3/r4GADo6Oujp6dnfl3FQs8f12eP67HF99rg+e1yfPa6vWY/feOONIR/JG0+6urpYunQpGzZs2N+XMqT29nZ27Nixz8/b7L9hZ2cnwNDPZxY+XihJkiRJFRm6JEmSJAEwffr0cb3KdaAydEmSJElSRYYuSZIkSarI0CVJkiRJFRm6JEmSJKkiQ5ckSZL0NnbaaaexZcuWlufsjWuvvZbvf//7e3TMKaecMibX0tXVxdy5c1uuMxr+48iSJEmS9osvfOEL+/sS9glDlyRJkvQ28Ad/8Ad0d3fT29vLsmXL+L3f+73d9nd1dXHRRRdx0kknsXHjRmbMmMFXvvIVJk2aBMDtt9/O+vXr2bFjB3/zN3/DCSecwA9/+ENWrlzJtm3bOPzww7nhhhs44YQTuOeee1i3bh19fX0899xzfOYzn2H79u383d/9HYcddhh33XUXkydP5k//9E+ZN28ev/Vbv8Vpp53G7/zO77zlHFu2bOGSSy7hlVdeYfbs2TQajT2670ajwVVXXcUjjzxCW1sbl156KYsWLdptznPPPceKFSvYvn07jUaD1atXc/zxx7fW8AEMXZIkSdI+dOtTP+fFrdvGtOaMyYfzh6e8e9g5119/PZMnT+ZXv/oVH//4xznnnHOYMmXKbnOef/55rr/+ej70oQ+xYsUK1qxZw2c/+1kApkyZwrp167jjjjv4+te/znXXXccJJ5zAfffdR3t7O9///ve55ppruOWWW4D+ILNu3Tp6e3v56Ec/yp/92Z/xT//0T6xcuZJ7772XP/qjP3rLNTY7x4033sipp57KZZddxkMPPcQ3vvGNPerNAw88wMaNG1m/fj1btmzhnHPOYc6cObvNueuuu1i2bBnnn38+27dvp6+vb4/OMRLf6ZIkSZLeBm6//XbmzZvHueeeS3d3Ny+++OJb5nR2dvKhD30IgPPPP58nnnhi176FCxcC8Bu/8Rt0dXUB8Mtf/pLPfOYzzJ07lz//8z/nueee2zX/Ix/5CO985zuZOnUq73rXu5g/fz4AJ5544q7jB2t2jscee4zzzz8fgHnz5nHUUUft0X0/8cQTLF68mAkTJnD00UczZ84cnnnmmd3mnHzyyfz1X/81N998M5s3b961ujdWXOmSJEmS9qGRVqRqePTRR/nnf/5n/uEf/oFJkyaxZMkSent73zKvra1tyO2JEycCMGHChF0rQddeey0f+chHuO222+jq6mLJkiW75h922GG7fh9yyCG7jm9raxtyJanZOZpd12APPvggN9xwAwDXXXcdH/zgB3ftG83jiJ/4xCc46aSTePjhh7nooou49tpr+djHPjbicaPlSpckSZJ0kHv99dc58sgjmTRpEps2beLpp59uOu9nP/sZTz31FAD333//rlWv4eq+5z3vASAzx/aiizlz5nDfffcBsGHDBl599dW3zFm4cCHr169n/fr1uwWuncevXbuWvr4+XnnlFR5//HFmz56925yf/vSnvO9972PZsmXMnz+fZ599dkzvwdAlSZIkHeTOOOMM+vr6mDdvHn/1V3/Fb/7mbzadN3PmTL71rW8xb948Xn31VZYuXTps3c997nP85V/+JYsWLRrz96B2uuyyy3j88cc5++yz+d73vsdxxx23R8cvXLiQE088kfnz5xMRXHHFFRxzzDG7zVm7di1z585l/vz5PP/887ut2I2Ftj39+sfbSKO7u3t/XwMAHR0d9PT07O/LOKjZ4/rscX32uD57XJ89rs8e19esx2+88QbveMc79tMVjU5XVxdLly5lw4YN+/tShtXe3s6OHTv2+Xmb/Tfs7OwEGP7ZR1zpkiRJkqSqDF2SJEmSmD59+rhf5TpQGbokSZKkynyl58DXyn9DQ5ckSZJU2SGHHLJf3kPS2NixYweHHLL30cl/p0uSJEmq7PDDD2fbtm309vaO+G9OaXgTJ05s+m+M1dJoNDjkkEM4/PDD97qGoUuSJEmqrK2tjUmTJu3vyzgoHIhf4PTxQkmSJEmqyNAlSZIkSRUZuiRJkiSpIkOXJEmSJFVk6JIkSZKkisbk64URsQC4CZgA3JqZVw/aPxG4EzgZeAX4ZGa+VPZ9CVgG9AGXZua64WpGxAzgbmAK8DTwqczcHhE3Av+pnPIdwDGZeVQ5pg/4cdn375l53ljctyRJkiSNpOWVroiYANwMLARmARdGxKxB05YBWzPzBOBG4Jpy7CzgAuADwALgqxExYYSa1wA3ZuZMYGupTWZelpmzM3M28NfAfQPO/6ud+wxckiRJkvalsXi88FRgU2a+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\n",
"text/plain": [ "text/plain": [
"<Figure size 1008x504 with 1 Axes>" "<matplotlib.figure.Figure at 0x1fcc28465c0>"
] ]
}, },
"metadata": {}, "metadata": {},
...@@ -693,7 +686,7 @@ ...@@ -693,7 +686,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 22, "execution_count": 47,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
...@@ -727,58 +720,58 @@ ...@@ -727,58 +720,58 @@
" <tbody>\n", " <tbody>\n",
" <tr>\n", " <tr>\n",
" <th>000001</th>\n", " <th>000001</th>\n",
" <td>-0.065580</td>\n",
" <td>-0.076975</td>\n", " <td>-0.076975</td>\n",
" <td>-0.076975</td>\n", " <td>-0.076975</td>\n",
" <td>0.011395</td>\n", " <td>-0.076975</td>\n",
" <td>5.551115e-17</td>\n", " <td>-1.609823e-15</td>\n",
" <td>-1.165734e-15</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>000002</th>\n", " <th>000002</th>\n",
" <td>-0.279003</td>\n",
" <td>-0.288382</td>\n", " <td>-0.288382</td>\n",
" <td>-0.288382</td>\n", " <td>-0.288382</td>\n",
" <td>0.009378</td>\n", " <td>-0.288382</td>\n",
" <td>0.000000e+00</td>\n", " <td>3.885781e-16</td>\n",
" <td>-2.220446e-16</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>000006</th>\n", " <th>000006</th>\n",
" <td>-0.044765</td>\n",
" <td>-0.054668</td>\n", " <td>-0.054668</td>\n",
" <td>-0.054668</td>\n", " <td>-0.054668</td>\n",
" <td>0.009904</td>\n", " <td>-0.054668</td>\n",
" <td>7.494005e-16</td>\n", " <td>8.881784e-16</td>\n",
" <td>6.106227e-16</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>000008</th>\n", " <th>000008</th>\n",
" <td>-0.049037</td>\n",
" <td>-0.034123</td>\n", " <td>-0.034123</td>\n",
" <td>-0.034123</td>\n", " <td>-0.034123</td>\n",
" <td>-0.014914</td>\n", " <td>-0.034123</td>\n",
" <td>-6.106227e-16</td>\n", " <td>-5.204170e-16</td>\n",
" <td>-7.910339e-16</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>000009</th>\n", " <th>000009</th>\n",
" <td>0.011354</td>\n",
" <td>0.029815</td>\n", " <td>0.029815</td>\n",
" <td>0.029815</td>\n", " <td>0.029815</td>\n",
" <td>-0.018461</td>\n", " <td>0.029815</td>\n",
" <td>2.498002e-16</td>\n", " <td>-2.567391e-16</td>\n",
" <td>2.775558e-16</td>\n",
" </tr>\n", " </tr>\n",
" </tbody>\n", " </tbody>\n",
"</table>\n", "</table>\n",
"</div>" "</div>"
], ],
"text/plain": [ "text/plain": [
" uqer alpha-mind ols uqer - ols alphamind - ols\n", " uqer alpha-mind ols uqer - ols alphamind - ols\n",
"000001 -0.065580 -0.076975 -0.076975 0.011395 5.551115e-17\n", "000001 -0.076975 -0.076975 -0.076975 -1.609823e-15 -1.165734e-15\n",
"000002 -0.279003 -0.288382 -0.288382 0.009378 0.000000e+00\n", "000002 -0.288382 -0.288382 -0.288382 3.885781e-16 -2.220446e-16\n",
"000006 -0.044765 -0.054668 -0.054668 0.009904 7.494005e-16\n", "000006 -0.054668 -0.054668 -0.054668 8.881784e-16 6.106227e-16\n",
"000008 -0.049037 -0.034123 -0.034123 -0.014914 -6.106227e-16\n", "000008 -0.034123 -0.034123 -0.034123 -5.204170e-16 -7.910339e-16\n",
"000009 0.011354 0.029815 0.029815 -0.018461 2.498002e-16" "000009 0.029815 0.029815 0.029815 -2.567391e-16 2.775558e-16"
] ]
}, },
"execution_count": 22, "execution_count": 47,
"metadata": {}, "metadata": {},
"output_type": "execute_result" "output_type": "execute_result"
} }
...@@ -812,6 +805,35 @@ ...@@ -812,6 +805,35 @@
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.6.4" "version": "3.6.4"
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
} }
}, },
"nbformat": 4, "nbformat": 4,
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
"cells": [ "cells": [
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 1, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 2, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 3, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -64,32 +64,9 @@ ...@@ -64,32 +64,9 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 4, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"name": "stdout",
"output_type": "stream",
"text": [
"Scale(n) time(ms) feval min(x) max(x) sum(x) x(0) + x(1)\n",
"200 39.72 -0.82 0.000000 0.010000 1.000000 0.015\n",
"400 25.20 -1.28 0.000000 0.010000 1.000000 0.015\n",
"600 29.23 -1.54 0.000000 0.010000 1.000000 0.015\n",
"800 32.27 -1.63 0.000000 0.010000 1.000000 0.015\n",
"1000 15.13 -1.72 0.000000 0.010000 1.000000 0.015\n",
"1200 16.79 -1.81 0.000000 0.010000 1.000000 0.015\n",
"1400 18.62 -1.90 0.000000 0.010000 1.000000 0.015\n",
"1600 20.90 -1.96 0.000000 0.010000 1.000000 0.015\n",
"1800 24.02 -2.03 0.000000 0.010000 1.000000 0.015\n",
"2000 27.05 -2.06 0.000000 0.010000 1.000000 0.015\n",
"2200 28.04 -2.07 0.000000 0.010000 1.000000 0.015\n",
"2400 30.25 -2.13 0.000000 0.010000 1.000000 0.015\n",
"2600 31.96 -2.14 0.000000 0.010000 1.000000 0.015\n",
"2800 34.44 -2.16 0.000000 0.010000 1.000000 0.015\n",
"3000 36.86 -2.19 0.000000 0.010000 1.000000 0.015\n"
]
}
],
"source": [ "source": [
"print(\"{0:<8}{1:>12}{2:>12}{3:>12}{4:>12}{5:>12}{6:>15}\".format('Scale(n)', 'time(ms)', 'feval', 'min(x)', 'max(x)', 'sum(x)', 'x(0) + x(1)'))\n", "print(\"{0:<8}{1:>12}{2:>12}{3:>12}{4:>12}{5:>12}{6:>15}\".format('Scale(n)', 'time(ms)', 'feval', 'min(x)', 'max(x)', 'sum(x)', 'x(0) + x(1)'))\n",
"\n", "\n",
...@@ -101,7 +78,7 @@ ...@@ -101,7 +78,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 7, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -124,32 +101,9 @@ ...@@ -124,32 +101,9 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 8, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"name": "stdout",
"output_type": "stream",
"text": [
"Scale(n) time(ms) feval min(x) max(x) sum(x) x(0) + x(1)\n",
"200 2.95 -0.82 0.000000 0.010000 1.000000 0.015\n",
"400 2.34 -1.28 0.000000 0.010000 1.000000 0.015\n",
"600 2.44 -1.54 0.000000 0.010000 1.000000 0.015\n",
"800 2.91 -1.63 0.000000 0.010000 1.000000 0.015\n",
"1000 7.58 -1.72 0.000000 0.010000 1.000000 0.015\n",
"1200 3.89 -1.81 0.000000 0.010000 1.000000 0.015\n",
"1400 4.22 -1.90 0.000000 0.010000 1.000000 0.015\n",
"1600 4.37 -1.96 0.000000 0.010000 1.000000 0.015\n",
"1800 4.81 -2.03 0.000000 0.010000 1.000000 0.015\n",
"2000 4.98 -2.06 0.000000 0.010000 1.000000 0.015\n",
"2200 5.31 -2.07 0.000000 0.010000 1.000000 0.015\n",
"2400 6.13 -2.13 0.000000 0.010000 1.000000 0.015\n",
"2600 6.12 -2.14 0.000000 0.010000 1.000000 0.015\n",
"2800 6.73 -2.16 0.000000 0.010000 1.000000 0.015\n",
"3000 7.39 -2.19 0.000000 0.010000 1.000000 0.015\n"
]
}
],
"source": [ "source": [
"print(\"{0:<8}{1:>12}{2:>12}{3:>12}{4:>12}{5:>12}{6:>15}\".format('Scale(n)', 'time(ms)', 'feval', 'min(x)', 'max(x)', 'sum(x)', 'x(0) + x(1)'))\n", "print(\"{0:<8}{1:>12}{2:>12}{3:>12}{4:>12}{5:>12}{6:>15}\".format('Scale(n)', 'time(ms)', 'feval', 'min(x)', 'max(x)', 'sum(x)', 'x(0) + x(1)'))\n",
"\n", "\n",
...@@ -162,9 +116,7 @@ ...@@ -162,9 +116,7 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": null,
"metadata": { "metadata": {},
"collapsed": true
},
"outputs": [], "outputs": [],
"source": [] "source": []
} }
...@@ -186,6 +138,35 @@ ...@@ -186,6 +138,35 @@
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.6.4" "version": "3.6.4"
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
} }
}, },
"nbformat": 4, "nbformat": 4,
......
...@@ -51,7 +51,16 @@ else: ...@@ -51,7 +51,16 @@ else:
"alphamind/pfopt/include/pfopt", "alphamind/pfopt/include/pfopt",
"alphamind/pfopt/include/eigen", "alphamind/pfopt/include/eigen",
"alphamind/pfopt/include/alglib"], "alphamind/pfopt/include/alglib"],
libraries=['pfopt', 'alglib', 'libClp', 'libCoinUtils', 'libipopt', 'libcoinhsl', 'libcoinblas', 'libcoinlapack', 'libcoinmetis'], libraries=['pfopt',
'alglib',
'libClp',
'libCoinUtils',
'libipopt',
'libcoinhsl',
'libcoinblas',
'libcoinlapack',
'libcoinmetis',
'libcoinmumps'],
library_dirs=['alphamind/pfopt/lib'], library_dirs=['alphamind/pfopt/lib'],
extra_compile_args=['/MD']), extra_compile_args=['/MD']),
] ]
......
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