이전 포스팅인 「2024.04.09 - [파린이의 퀀트 투자] - 퀀트 투자_주식: S&P500과 KOSPI(1)」에서 도출된 결과값의 의의는 다음과 같다. 먼저 해외 주식 기준인 S&P500의 약 3.00%의 수익률이 기대되고 이때 위험(표준편차)은 약 5.92%이다. 이에 반해 국내 주식 기준인 KOSPI의 수익률은 약 1.04%로 예상되고 이때 위험(표준편차)은 약 8.01%이다. 해당 결과는 아래 표에서 다시 한번 정리하였으니 참고하여 주길 바란다. 이번 포스팅에서는 두 데이터의 상관계수를 계산한 뒤 전체 주식 시장의 기대수익률 및 위험(표준편차)을 분석하고 위 과정들을 파이썬을 이용하여 코딩하여 최종적으로 결론 짓고자 한다.
| 국내 시총 지수(KOSPI) | 국외 시총 지수(S&P500) | |
| 기대수익률(E(R)) | 1.04% | 3.00% |
| 위험: 표준편차(σ) | 8.01% | 5.92% |
다음은 두 자산의 포트폴리오의 기대수익률과 표준편차를 계산하는 공식이다.

다음은 KOSPI와 S&P500를 한 축 위에 옮겨 그린 그래프와 위 수식들을 엑셀에 대입하여 구한 두 데이터의 상관계수, 공분산, 기대수익률, 그리고 표준편차의 값이다.


여기서 한가지 주목하고자 하는 점은 상관계수인데, 두 변수(주식)의 선형 관계 정도를 보여주는 상관계수의 값이 약 0.61이다. 이것이 의미하는 바는 두 지수가 세계적인 경제 흐름에 비슷한 영향을 받고 이에 데이터가 비슷한 방향성을 가진다는 사실이다. 예를 들어 2019년 하반기부터 2020년 상반기까지 코로나의 영향으로 두 지수는 모두 급락을 경험하였다. 이에 경기를 회복하기 위해 미국이 2020년 3월 15일 1.25%였던 금리를 0.25%까지 내리며 통화량을 크게 증가시켰다. 이 영향으로 두 지수 모두 빠르게 회복되는 면모를 보인다. 다만 그 폭이 국내 주식 지수인 KOSPI가 더욱 크게 나타나며 표준편차(위험)를 높인다. 다시 말해, 분기 단위로 수익률을 보면 국내 지수와 국외 지수 변동에는 시기적 차이가 존재하지 않으며 선행 지수와 후행 지수로 둘을 구분하기는 어렵다는 것을 의미한다.
이제 본격적으로 파이썬을 이용하여 위의 값들을 도출하여 보려 한다. 지금까지의 방법과 같이 엑셀 파일을 이용하여 계산할 수도 있겠으나 이전 포스팅에서도 언급한 바와 같이 엑셀로 계산하게 되면 위의 값들을 각각의 시트에서 따로 따로 입력을 해야하는 불편함이 있으며 여러 개의 엑셀 파일을 이용하여야 하기 때문에 데이터의 용량이 과도하게 커지게 되어 처리 속도도 느려지게 될 것이다. 따라서 처리가 간편하고 용량이 상대적으로 적은 코딩을 이용하여 위의 내용을 정리하고 매분기 새로운 값을 입력하여 결과를 확인하려 한다.
먼저 jupyter notebook에서 코딩할 폴더에 엑셀 데이터 값을 옮겨주었다. 엑셀 데이터는 pandas 모듈을 이용하여 불러올 것이고 각 주식의 수익률 이름을 "Returns"로 설정하였다. 따라서 해당 작업을 하기 전에 선행 작업으로 pandas 모듈을 설치하여 주어야 하고, pandas 모듈 중 openpyxl까지 설치된 상태라야 정상적으로 실행될 것으로 보인다. 다음은 pandas 모듈 설치 코드이다. 다음 코드를 명령 프롬프트("win + R"로 실행창을 열고 'cmd"를 입력하면 명령 프롬프트 창을 열 수 있다.)에 입력하여 완료한다. (데이터 엑셀 표 제목이 각각 'KOSPI'와 'S&P_500_Historical_Data_(2)'이다.)

pip install pandas
pip install openpyxl
지금까지 한 작업을 코딩으로 만들면 다음과 같다.
import pandas as pd
df_stock_a = pd.read_excel('KOSPI.xlsx')
df_stock_b = pd.read_excel('S&P_500_Historical Data_(2).xlsx')
returns_a = df_stock_a['Returns']
returns_b = df_stock_b['Returns']
mean_return_a = returns_a.mean()
std_dev_a = returns_a.std()
mean_return_b = returns_b.mean()
std_dev_b = returns_b.std()
correl = returns_a.corr(returns_b)
mean_return_a = "{:.4f}".format(mean_return_a)
mean_return_b = "{:.4f}".format(mean_return_b)
std_dev_a = "{:.4f}".format(std_dev_a)
std_dev_b = "{:.4f}".format(std_dev_b)
correl = "{:.4f}".format(correl)
print("Stock A:")
print("Mean return:", mean_return_a)
print("Standard deviation:", std_dev_a)
print("\nStock B:")
print("Mean return:", mean_return_b)
print("Standard deviation:", std_dev_b)
print("\nCorrelation:", correl)
weight_a = 0.7505
weight_b = 0.2495
mean_return_a = float(mean_return_a)
mean_return_b = float(mean_return_b)
std_dev_a = float(std_dev_a)
std_dev_b = float(std_dev_b)
correl = float(correl)
portfolio_return = (weight_a * mean_return_a) + (weight_b * mean_return_b)
portfolio_std_dev = ((weight_a * std_dev_a) ** 2 + (weight_b * std_dev_b) ** 2 +
2 * weight_a * weight_b * std_dev_a * std_dev_b * correl) ** 0.5
portfolio_return = "{:.4f}".format(portfolio_return)
portfolio_std_dev = "{:.4f}".format(portfolio_std_dev)
print("\nPortfolio:")
print("Expected return:", portfolio_return)
print("Standard deviation:", portfolio_std_dev)

'파린이의 퀀트 투자' 카테고리의 다른 글
| 퀀트 투자_주식: 총 정리_PER (0) | 2024.04.10 |
|---|---|
| 퀀트 투자_주식: S&P500과 KOSPI(3) (0) | 2024.04.09 |
| 퀀트 투자_주식: S&P500과 KOSPI(1) (0) | 2024.04.09 |
| 퀀트 투자_주식: S&P500과 ETS model(2) (0) | 2024.04.09 |
| 퀀트 투자_주식: S&P500과 ETS model(1) (0) | 2024.04.09 |