on my way

금융공학5: 리스크 관리와 포트폴리오 최적화: 데이터 분석과 CAPM 모델 활용 본문

etc

금융공학5: 리스크 관리와 포트폴리오 최적화: 데이터 분석과 CAPM 모델 활용

wingbeat 2024. 8. 16. 00:00
반응형

포트폴리오와 리스크

포트폴리오: 리스크 (High Risk - High Return)

  • 포트폴리오는 여러 투자 자산으로 이루어진 그룹을 말한다.
  • 리스크: 투자에서의 리스크는 투자 결과가 불확실한 정도를 말한다. 일반적으로 높은 리스크를 감수하면 높은 수익을 기대할 수 있어요. 이걸 High Risk - High Return이라고 해요.

리스크의 측정: 분산과 공분산

  • 분산 (Variance): 하나의 자산이 평균 수익률에서 얼마나 변동하는지를 나타내는 값이에요. 변동성이 클수록 리스크가 큰 거예요.
  • 공분산 (Covariance): 두 자산이 함께 움직이는 정도를 나타내는 값이다. 두 자산이 함께 오르고 내리면 공분산이 양수, 반대로 움직이면 공분산이 음수이다.

포트폴리오 최적화

  • 최적화: 포트폴리오의 리스크와 수익을 조절하여 가장 효율적인 투자 조합을 찾는 과정이에요.
    • 최대화: 주어진 리스크 내에서 수익을 최대화하는 것.
    • 최소화: 주어진 수익을 목표로 리스크를 최소화하는 것.

Yahoo Finance와 yfinance 라이브러리

  • Yahoo Finance: 금융 정보를 제공하는 웹사이트에요. 주식, 환율, 원자재 등 다양한 금융 데이터를 제공합니다.
  • yfinance 라이브러리: Python에서 Yahoo Finance의 데이터를 쉽게 가져올 수 있는 라이브러리예요.

CAPM (Capital Asset Pricing Model)

  • CAPM: 자본자산 가격결정 모형으로, 특정 자산의 기대 수익률을 계산하는 방법이다.
  • 공식:

효율적 프론티어 (Efficient Frontier)

  • 효율적 프론티어는 주어진 리스크에서 최대 수익을 제공하는 포트폴리오들을 이은 곡선이에요. 이 곡선 위의 포트폴리오는 가장 효율적인 투자 조합을 나타내요.

CAL (Capital Allocation Line)

  • 자본배분선은 무위험 자산과 위험 자산을 조합하여 만든 포트폴리오의 기대 수익률을 나타내는 직선이에요. 이 선과 효율적 프론티어가 만나는 점이 가장 효율적인 포트폴리오에요.

자료구조: 딕셔너리 (Dictionary)

  • 딕셔너리: 키(key)와 값(value)의 쌍으로 이루어진 자료구조에요. 예를 들어 주식 티커와 주식 이름을 딕셔너리로 저장할 수 있어요.

필기 내용

  1. 포트폴리오와 리스크
    • High Risk - High Return: 높은 리스크를 감수하면 높은 수익을 기대할 수 있어요.
    • 분산: 자산의 변동성을 측정하는 값.
    • 공분산: 두 자산이 함께 움직이는 정도를 측정하는 값.
  2. 최적화
    • 리스크를 고정하고 수익을 최대화하거나, 수익을 고정하고 리스크를 최소화하는 것.
  3. CAPM: 자산의 기대 수익률을 계산하는 모델.

공분산과 분산이란?

  • 분산 (Variance):
    • 한 자산의 수익률이 평균 수익률에서 얼마나 변동하는지를 측정하는 값이에요.
    • 예를 들어, 주식 A의 평균 수익률이 5%인데, 실제 수익률이 3%, 7%, 4%, 6%로 변동한다면, 이 변동성을 측정한 값이 분산이에요.
  • 공분산 (Covariance):
    • 두 자산의 수익률이 함께 움직이는 정도를 측정하는 값이에요.
    • 예를 들어, 주식 A와 주식 B가 함께 오르고 내린다면, 이 두 주식의 공분산은 양수에요. 한 주식이 오를 때 다른 주식이 내린다면 공분산은 음수에요.

요약

  • 포트폴리오: 여러 주식을 모아 위험을 분산시키는 방법.
  • 리스크: 투자의 불확실성.
  • CAPM: 자산의 기대 수익률을 계산하는 방법.
  • 공분산: 두 자산이 함께 움직이는 정도.
  • 분산: 한 자산의 변동성.

이 개념들을 이해하면 주식 투자에서 어떻게 리스크를 관리하고, 최적의 포트폴리오를 구성할 수 있는지 알 수 있어요.

 

 

 

 

데이터 다운로드

우리는 Amazon(AMZN)과 시장 지표인 S&P500(^GSPC)의 주식 데이터를 다운로드할 것이다.

여기서 주식 데이터는 주식이 얼마에 거래되었는지, 거래량이 얼마나 되었는지를 포함한다.

이 코드는 Amazon과 S&P500의 주식 데이터를 2022년 1월 1일부터 2023년 12월 31일까지 다운로드하고, 데이터의 정보를 확인한다.

500개의 값을 계산해도 되고....

X = df['Adj Close'].rename(columns={risky_asset: 'asset', market_benchmark: 'market'}).resample('M').last().pct_change().dropna()

resample은 월 단위로 (매달 끝나는 달의 return들)

risky_asset은 asset

market_benchmark는 market으로

2. 주식 데이터 시각화

주식 데이터 확인 및 그래프 그리기

df['Adj Close'].plot()

이 코드는 다운로드한 데이터 중 조정 종가(Adjusted Close)를 그래프로 그린다.

조정 종가는 주식이 실제로 거래된 가격을 의미한다

이 그래프를 보면 시간이 지나면서 주식 가격이 어떻게 변했는지 알 수 있어요.

3. 베타 계산

베타는 주식이 시장 전체와 얼마나 같이 움직이는지 나타내는 값이에요. 베타가 1이면 시장과 똑같이 움직이고, 1보다 크면 시장보다 더 크게 움직이고, 1보다 작으면 시장보다 덜 움직여요.

X = df['Adj Close'].rename(columns={risky_asset: 'asset', market_benchmark: 'market'}).resample('M').last().pct_change().dropna()
covariance = X.cov().iloc[0,1]
benchmark_variance = X['market'].var()
beta = covariance / benchmark_variance
beta

이 코드는 주식의 베타 값을 계산해요.

먼저 데이터의 월별 변화율을 계산하고, 공분산과 분산을 이용해서 베타를 구해요.

4. 회귀 분석

회귀 분석은 두 변수 간의 관계를 분석하는 방법이에요. 여기서는 주식과 시장 간의 관계를 분석해요.

y = X.pop('asset')
X = sm.add_constant(X)
model = sm.OLS(y, X).fit()
model.summary()

이 코드는 회귀 분석을 통해 주식이 시장에 어떻게 반응하는지 분석해요.

5. 포트폴리오 최적화

포트폴리오란?

포트폴리오는 여러 주식을 모아서 만든 투자 조합이에요. 여러 주식을 모으면 위험을 분산시킬 수 있어요. 여기서 목표는 같은 수익을 내면서도 위험을 최소화하는 거예요.

import yfinance as yf
ticker_names = {
    '^KS11': 'KOSPI',
    '^KQ11': 'KOSDAQ',
    '348210.KQ': '넥스틴',
    '058610.KQ': '에스피지',
    # ... 추가된 주식들
}
tickers = list(ticker_names.keys())
df = yf.download(tickers)
prices = df["Adj Close"].dropna(how="all")
prices.rename(columns=ticker_names, inplace=True)

이 코드는 여러 주식의 데이터를 다운로드하고 포트폴리오를 만들 준비를 해요.

6. CAPM (자본자산 가격결정모형)

CAPM은 주식의 기대 수익을 계산하는 방법이에요.

3. 자본자산 가격결정(CAPM: Capital Asset Pricing Model)

  • 개별 종목의 기대수익율: 시장 전체 수익율의 흐름에 영향
  • 위험 자산 기대 수익율 = 무위험자산 수익율 + b X Risk Premium
  • Risk Premium: 시장 수익율 = 무위험자산 수익율
  • beta: 위험자산 민감도, 특정 자산의 체계적 위험 측정 지표
  • beta = 시장 수익율과 위험자산 수익율의 공분산 / 위험자산 수익율의 분산
  • ols로 추정
  • 개별 종목 기대수익율은 개별 종목 위험에 비례
  • 베타: 개별 종목의 기대수익율 추정
from pypfopt import expected_returns

risk_free_rate = 0.035  # 무위험 이자율
mu = expected_returns.capm_return(prices, market_prices=prices['KOSPI'].to_frame(), risk_free_rate=risk_free_rate, frequency=252)
mu.plot.barh(figsize=(5, 10))

이 코드는 CAPM을 이용해 각 주식의 기대 수익을 계산하고 시각화해요.

기대 수익률 (Expected Returns)

이 이미지는 각 주식의 기대 수익률을 보여줍니다.

  • 기대 수익률: 각 주식이 평균적으로 얼마나 수익을 낼 것으로 예상되는지 나타냅니다.
  • 해석: 막대 그래프를 통해 각 주식의 기대 수익률을 비교할 수 있습니다. 예를 들어, KOSPI가 가장 높은 기대 수익률을 가지고 있음을 알 수 있습니다.

상관행렬 (Correlation Matrix)

이 이미지는 여러 주식 간의 상관관계를 나타내는 행렬입니다.

  • 상관행렬: 상관행계수(correlation coefficient)는 두 자산 간의 관계를 보여줍니다.
    • 값이 1에 가까울수록 두 자산이 동일하게 움직입니다.
    • 값이 0에 가까울수록 두 자산의 움직임이 무관합니다.
    • 값이 -1에 가까울수록 두 자산이 반대로 움직입니다.
  • 해석: 상관행렬의 각 셀은 두 주식 간의 상관관계를 나타냅니다. 밝은 색(노란색)에 가까울수록 두 주식의 움직임이 더 비슷하고, 어두운 색(파란색)에 가까울수록 덜 비슷합니다

 

7. 효율적 프론티어 (Efficient Frontier)

Efficient Frontier
- 투자 대상 중 가장 적절한 수익율과 위험을 가진 종목을 이은 곡선
- 효율적 포트폴리오: 주어진 위험 수준 대비 가장 높은 수익률을 제공하는 포트폴리오
- MPT에서의 위험: 수익률의 변동성( 과거 수익률의 표준편차)
- 동일한 기대 수익률 내에서 가장 작은 위험을 가진 포트폴리오의 집합
- 개별 종목의 기대수익률은 개별 종목의 위험에 비례하며 커지며, 특히 기대수익률 대비 위험이 큰 종목도 있고 낮은 종목도 있음
- 효율적 프론티어란 동일한 위험에서 가장 높은 수익률을 기대할 수 있는 종목들을 선으로 이은 것

효율적 프론티어는 동일한 위험에서 가장 높은 수익률을 기대할 수 있는 포트폴리오를 찾는 방법

from pypfopt import plotting
from pypfopt.efficient_frontier import EfficientFrontier

fig, ax = plt.subplots(figsize=(15, 5))
ef = EfficientFrontier(mu, S)

for name in list(ticker_names.values()):
    if name != 'KOSPI' and name != 'KOSDAQ':
        ef.add_constraint(lambda w: w[ef.tickers.index(name)] <= 0.1)  # 개별 종목 비중 10% 제한

plotting.plot_efficient_frontier(ef.deepcopy(), ax=ax, show_tickers=True)
ax.get_lines()[0].set_color("black")
ef.max_sharpe(risk_free_rate)
weights = ef.clean_weights()
ret_tangent, std_tangent, _ = ef.portfolio_performance(verbose=True, risk_free_rate=risk_free_rate)
ax.scatter(std_tangent, ret_tangent, s=100, c="r", marker="*", label="Max Sharpe", zorder=10)
ax.plot([0, std_tangent, std_tangent*2], [risk_free_rate, ret_tangent, 2*ret_tangent-risk_free_rate], 'c', label='CAL', zorder=-1)
ax.set_title("Efficient Frontier")
ax.set_ylabel('Expected Return')
ax.set_xlim(0.1, 0.7)
ax.set_ylim(0.036, 0.05)
handles, labels = ax.get_legend_handles_labels()
labels[0], labels[1] = ['Efficient Frontier', 'Assets']
ax.legend(handles, labels)
plt.show()

이 코드는 효율적 프론티어를 계산하고, 그래프로 그려서 어떤 포트폴리오가 가장 효율적인지 보여줘요.

  • 포트폴리오에서는 단일 종목의 비중이 너무 크지 않도록 제한: 예, 10%
  • 효율적 프론티어 우측: 코스피 지수, 코스닥은 코스피보다 위험은 크고 기대 수익률은 낮음

Expected annual return: 5.2% Annual volatility: 25.9% Sharpe Ratio: 0.06

이 이미지는 다양한 포트폴리오의 위험과 수익률을 보여주는 그래프입니다.

  • 효율적 프론티어: 동일한 위험 수준에서 가장 높은 수익을 제공하는 포트폴리오들의 집합입니다.
  • 검은 점: 개별 주식을 나타냅니다.
  • 검은 선: 효율적 프론티어를 나타냅니다.
  • 빨간 별: 샤프 비율이 가장 높은 포트폴리오를 나타냅니다.
  • 파란 선: 자본배분선(Capital Allocation Line, CAL)을 나타냅니다.
  • 해석: 이 그래프를 통해 어떤 포트폴리오가 가장 효율적인지 확인할 수 있습니다. 예를 들어, 빨간 별이 가장 효율적인 포트폴리오임을 보여줍니다.

 

이 이미지는 최적의 포트폴리오에서 각 자산이 차지하는 비중을 보여줍니다.

  • 포트폴리오 자산 배분: 각 자산이 포트폴리오에서 얼마나 큰 비중을 차지하는지를 나타냅니다.
  • 해석: 막대 그래프를 통해 KOSPI가 포트폴리오에서 가장 큰 비중을 차지하고 있음을 알 수 있습니다. 이는 KOSPI가 가장 안전하고 수익성이 높다고 판단되었기 때문일 수 있습니다.

이 모든 그래프들은 포트폴리오를 최적화하고, 리스크와 수익률을 비교하는 데 유용합니다. 이 과정을 통해 투자자들은 가장 효율적인 투자 결정을 내릴 수 있습니다.


- 포트폴리오 자산 배분: 코스피를 98% 이상 포함
- CAL: 효율적 프론티어 곡선에 접하는 직선,자본배분선
- MPT에서 도출된 위험자산만으로 구성된 효율적 포트폴리오에 무위험자산을 포함, 낮은 위험과 높은 기대수익률의 포트폴리오 집합, 이를 자본배분선으로 지칭

  • 자본배분선과 효율적 프론티어 곡선이 접하는 지점이 샤프 비율이 최대가 되는 포트폴리오

샤프 비율 (Sharpe Ratio)

샤프 비율은 해리 마코위츠의 제자 윌리엄 샤프가 개발한  투자 성과를 판단하는 지표로, 높은 샤프 비율을 기록하는 투자가 더 적은 위험으로 더 높은 수익률을 낸다는 것을 의미합니다. 

fig, ax = plt.subplots(figsize=(5, 10))
plotting.plot_weights(weights, ax=ax)
  • 총위험(total risk)에 집중하는 위험 대 보상 비율(Reward-to-risk Ratio)
  • Sharpe = (Rp-Rf) / Sigmap
  • 높은 샤프 비율을 기록하는 투자일수록 더 적은 위험으로 더 높은 수익률을 내고자 함
  • 샤프 비율이 0 이하라면 시장수익률보다 낮은 수익률 의미: 샤프 비율이 0 이상이어야 투자의 고려 대상, 1 이상이면 상당히 괜찮은 투자처
  • - 자본배분선의 y 절편: 무위험자산을 100% 보유하는 포트폴리오, 기대 수익률은 무위험수익률과 동일
    - 자본배분선과 효율적 프론티어 곡선이 접하는 지점: 위험자산만을 보유했을 때 가장 효율적인 포트폴리오

 

 

8. 효율적 시장 가설(EMH; Efficient Market Hypothesis)

- 효율적 시장 가설: 가격은 상품에 대해 얻을 수 있는 모든 정보를 빠르게 반영

- 투자자는 장기적으로 시장 수익률을 넘을 수 없음을 의미

- 예를 들어, 개별주와 시장 지수(Market Index)를 포함하는 포트폴리오를 최적화, 코스피가 효율적 프론티어 위에 위치하며, 포트폴리오에 코스피를 98% 이상 배분 하라는 결과

- 해석: 코스피 100%를 보유하는 것도 매우 효율적인 포트폴리오일 수 있고, 2%의 개별주를 넣으라는 것은 오히려 단기적인 오차로 인한 결과로 의심

- 한국의 주식 시장은 효율적 시장 가설을 잘 따라가는 것으로 고려, 코스피가 효율적인 포트폴리오

 

 

 

요약

  • 데이터 다운로드: 주식 데이터를 가져옵니다.
  • 데이터 시각화: 주식 가격 변화를 그래프로 그립니다.
  • 베타 계산: 주식이 시장과 얼마나 같이 움직이는지 계산합니다.
  • 회귀 분석: 주식과 시장의 관계를 분석합니다.
  • 포트폴리오 최적화: 여러 주식을 모아서 위험을 최소화하면서 수익을 최대화하는 방법을 찾습니다.
  • 효율적 프론티어: 가장 좋은 포트폴리오를 찾고 그래프로 보여줍니다.
  • 샤프 비율: 투자 성과를 판단하는 지표로, 높은 샤프 비율을 기록하는 투자가 더 적은 위험으로 더 높은 수익률을 낸다는 것을 의미합니다.

이 과정들은 주식을 분석하고 투자할 때 중요한 개념들이에요. 각각의 개념들은 주식을 이해하고, 투자 결정을 내리는 데 도움이 돼요.

반응형