더북(TheBook)
# 최적화 라이브러리를 임포트한다
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])
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.