포트폴리오 계산하기
이제 각 달마다 가장 좋은 포트폴리오를 찾기 위해 포트폴리오를 생성해 볼게요. numpy의 random.random()은 균등분포에서 난수를 생성하고, 그런 다음 이 값들이 합쳐서 1이 되도록 /= 연산자로 정규화해요. 이렇게 만든 가중치를 사용해 수익률과 변동성을 계산합니다. 수익률은 가중치와 개별 수익률의 곱을 합한 값이에요. 변동성은 더 복잡하며, 서로 다른 주식 간 공분산이 포함돼요.
마지막으로, 이후에 사용할 수 있도록 월별 날짜를 키로 하여 값을 딕셔너리에 저장합니다.
이번 예제에서는 코드 실행 속도를 높이기 위해 각 날짜마다 포트폴리오를 10개만 생성하지만, 실제 환경에서는 소수의 종목에 대해 임의로 생성한 포트폴리오를 보통 1000개에서 5000개 정도 사용하시는 게 좋아요.
이 연습은 강의의 일부입니다
Python으로 배우는 금융 분야 Machine Learning
연습 안내
np.random.random()을 사용해 가중치에 사용할 임의의 숫자 3개를 생성하세요.- 반복문에서 현재
date의 월별 수익률과weights의 내적(np.dot(); 두 배열의 원소별 곱을 합함)을 취해returns를 계산하세요. .setdefault()메서드를 사용해 현재date에 해당하는portfolio_weights딕셔너리에 빈 리스트([])를 추가한 뒤, 그 리스트에weights를 이어 붙이세요.
실습형 인터랙티브 연습
이 예제를 이 샘플 코드를 완성하여 풀어보세요.
portfolio_returns, portfolio_volatility, portfolio_weights = {}, {}, {}
# Get portfolio performances at each month
for date in sorted(covariances.keys()):
cov = covariances[date]
for portfolio in range(10):
weights = np.random.random(____)
weights /= np.sum(weights) # /= divides weights by their sum to normalize
returns = np.dot(____, returns_monthly.loc[____])
volatility = np.sqrt(np.dot(weights.T, np.dot(cov, weights)))
portfolio_returns.setdefault(date, []).append(returns)
portfolio_volatility.setdefault(date, []).append(volatility)
portfolio_weights.setdefault(date, ____).append(____)
print(portfolio_weights[date][0])