# 최적화 라이브러리를 임포트한다
from scipy.optimize import minimize
# 이번 최적화는 위험 최소화이므로 포트폴리오 분산 함수를 목적함수로 만든다
def obj_variance( weights, covmat ):
return np.sqrt( weights.T @ covmat @ weights )
# 다음은 목적함수 obj_variance( )에 사용되는 공분산 행렬인데, 일간수익률 공분산을 연간으로 환산한다
covmat = cov_daily * 250
# 처음에는 투자 자금을 다섯 종목에 균등하게 20%씩 투자하는 것으로 시작한다
weights = np.array( [ 0.2, 0.2, 0.2, 0.2, 0.2 ] )
# 각 종목의 투자 비중 한도는 0~100%이며 튜플로 지정한다
bnds = ( (0,1), (0,1), (0,1), (0,1), (0,1) )
# 제약조건은 투자 비중 100%인데(무차입투자), 제약조건을 따로 함수로 만들지 않고 람다(lambda) 함수, lambda x: np.sum(x) - 1로 만들었다
cons = ({ 'type': 'eq', 'fun': lambda x: np.sum(x) – 1 })
# 목적함수, 초깃값, 알고리즘, 범위, 제약식을 입력해 최적화를 수행한다
res = minimize( obj_variance, weights, (covmat), method='SLSQP', bounds=bnds, constraints=cons )
# 결과를 출력한다(마지막 x 값이 최적화된 투자 비중이다)
print( res )
결과
fun 0.1951085770743293 jac array([0.19483189, 0.19543133, 0.19500574, 0.19502595, 0.19522101]) message 'Optimization terminated successfully.' nfev 63 nit 9 njev 9 status 0 success True x array([0.20595945, 0.30464832, 0.4218103 , 0.02849997, 0.03908196])