Loading [MathJax]/jax/output/CommonHTML/jax.js
article thumbnail image
Published 2022. 11. 29. 17:07

 

 

파이썬으로 배우는 포트폴리오 study day3

1. 투자와 자산배분

1.1. 자산배분과 포트폴리오

자산배분은 효율적 포트폴리오를 찾아내는 과정이다. 자산배분은 샤프의 CAPM 모델에 기초하는데, 수학/통계적인 방법으로 자산들을 분류하고 조합해 원하는 목적에 부합하는 자산군을 만들어내는 것이다.

 

자산은 리스트가 없는 자산(무위험자산)리스크 있는 자산(위험자산)으로 나눈다.
리스크 없는 자산으로만 구성된 포트폴리오는 투자자가 원하는 기대수익률을 만족시켜주지 못함. 따라서 리스크가 있는 자산도 필요하다. 다만, 리스크를 적절하게 통제하면서 원하는 기대수익률을 만족시키는 자산배분이 필요하다.

 

자산배분에는 리밸런싱 작업 또는 동적자산배분(시장 상황에 따라 조정)이 필요하다.

  • 리밸런싱은 단순히 월마다 또는 분기마다 종목을 교체하는 것이 아니라 가격의 변동에 따라 내재가치를 증가시켜나가는 작업이고, 이 과정에서 비중 조절이나 종목 교체도 일어난다.

정리, 자산배분은 위험자산과 무위험자산으로 분류하고 좋은 위험자산 포트폴리오를 찾아내는 것

 

 

1.2. 포트폴리오 성과의 결정 요인들

미국의 브린슨(Brinson), 후드(Hood), 비보어(Beevower)가 ‘포트폴리오 성과의 결정 요인들(Determinants of Portfolio Performance)’이라는 연구 논문(tandfonline.com/doi/abs/10.2469/faj.v51.n1.1869)을 통해 다음과 같은 결론을 얻었다.

 

1974년에서 1983년까지의 91개 미국 대형연기금 데이터를 분석한 결과에 따르면, 자산배분(원문은 ‘investment policy’)이 투자전략(마켓 타이밍과 종목 선택)보다 중요하며 총수익률 변동성의 95.6%를 설명한다.

 

자산배분이 중요한 이유 1.
종목 선택과 마켓 타이밍을 사용한 투자전략이 장기간에 걸쳐 반복적으로 성공하기 어렵다.

 

자산배분이 중요한 이유 2.
'테마' 또는 '섹터'라고 부르는 자산 클래스도 우수한 수익률을 지속하기 어렵기 때문이다.

 

따라서, 투자자의 투자 목적과 위험 선호 성향을 고려해 다양한 자산에 분산 투자하는 것이 위험을 줄이면서 성과를 높일 수 있는 유일한 방법이다.

 

 

1.3. 성과지표(RAPM)

포트폴리오 성과 측정 삼총사

  1. 위험 관점에서 수익률의 표준편차총위험이나 변동성을 나타낸다.
  2. 펀드의 베타시장 대비 민감도를 나타낸다.
  3. 위험조성지표로 샤프지수, 트레이너 지수, 젠센알파지수 등이 있다.
  4.  

1.3.1. 샤프지수

S=RpRfσp=

  • '투자수익률 대 변동성 비율 (reward to variability ratio)'

지배 원리에 따라 동일한 수익률에서 낮은 변동성 또는 동일한 변동성에서 높은 수익률을 가진 포트폴리오 또는 펀드 상품이 비교우위를 가진다. 샤프지수는 한 단위의 위험을 부담하는 대신 얻을 수 있는 수익률을 가리킨다.

 

1.3.2. 젠센알파지수

αp=Rp[Rf+βp(RMRf)]

  • 자본자산가격결정모델(CAPM)을 기반으로 하고 있다. 젠센알파지수는 CAPM 중 SML에서 파생되었다.
    • SML : Rf+βp(RMRf)
  • α = 포트폴리오 수익률 - 기대(적정)수익률
    • 포트폴리오와 SML 차이 값. 초과수익률을 냈느냐 안냈느냐

 

포트폴리오 수익률에서 기대(적정)수익률을 제외하기 때문에 펀드 매니저의 종목 선정 능력을 확인할 수 이는 지표로 활용된다. 기대수익률 또는 적정수익률로 삼을 수 있는 것이 시장수익률을 의미하는 벤치마크 수익률이다.

 

ex. 지난 1년간 A펀드가 12%, B펀드가 5%, 벤치마크지수가 7% 올랐다면 A펀드의 젠센 알파지수는 플러스지만, B펀드는 마이너스다.
즉, B펀드도 5%의 성과를 냈지만 시장 수익률을 따락지 못했다는 의미이다.

 

 

1.3.3. 트레이너 지수

T=RpRfβp=(Rp)(Rf)(βp)

트레이너비율은 위험보상비율(reward-to-volatility ratio)로, 위험 한 단위를 받고 얻은 초과성과가 얼마인지 측정하는 성과지표. 초과성과란 '무위험수익률(위험이 없는 투자로 얻는 수익률)'을 뛰어넘는 수익률을 말함

 

트레이너비율에서 위험은 포트폴리오 베타로 알려진 분산 불가능한 체계적 위험을 말한다.
베타는 전체 시장수익률의 변화율 대비 포트폴리오 수익률 기울기

 

  • 포트폴리오 총 위험 (총 변동성)
    σp=ϵp+βp
    인데, βp 는 분산이 안됨. 분산 투자를 해도 제거가 되지 않은 위험. 시장 위험 (ex. 코로나)
  • 트레이너 방법 또한 자본자산가격결정모델(CAPM)에 기반을 둔 방법. 다만, 총위험의 척도인 표준편차가 아니라 시장위험의 척도인 베타값을 사용하고 있다.
    • 포트폴리오를 잘 짰다면 분산이 되어 있을 테니까, 분산이 되지 않은 위험을 지고 가는 것이기 때문
    • 부담하고 있는 위험 한 단위에 대해서 무위험자산을 얼만큼 이겼나. 초과수익률을 얼마나 냈나를 말하는 것

 

1.3.4. 정보비율

RpRBsd(RpRB)=

  • sd(RpRB) : Tracking Error 추적오차

정보비율은 트레이너와 블랙이 주장한 것으로, 투자자들이 수익률을 선호하고 위험을 회피한다는 가정하에 위험을 고려해 적극적인 투자 성과를 평가하겠다는 목적을 갖음

 

정보비율 특징

  • 위험조정 후 수익률이 수익률의 변동 또는 분산 가능한 위험에 대한 노출로 달성된 것인지 파악
  • 즉, 특정한 위험을 부담할 때 반드시 수익으로 연결한다는 직관으로 만들어낸 평가 방법

 

정보비율 산출 방법 2가지

  1. 벤치마크 수익률과 포트폴리오 수익률 간의 차이(추적오차(tracking Error))를 이용
  2. 벤치마크 수익률과 포트폴리오 수익률 간의 회귀분석을 이용

 

1. 벤치마크 수익률과 포트폴리오 수익률 간의 차이를 이용하는 방법


=

  • 포트폴리오 수익률이 벤치마크를 초과하는 수익률을 달성하는 것은 벤치마크보다 높은 위험을 부담한 결과라는 뜻

 

2. 벤치마크 수익률과 포트폴리오 수익률 간의 회귀분석을 이용


=()

  • 포트폴리오 위험조정 후 수익률을 비체계적 위험으로 나눠 평가하고자 하는 척도

 

1.3.5. 최대 낙폭

최대 낙폭(Maximum Drawdown) 즉, MDD는 특정 투자 기간 중 포트폴리오 고점에서 저점까지 최대 누적 손실
MDD=

  • 고점에서 저점까지의 하락폭이 가장 큰 구간의 등락률
  • 분석 기간 중 특정 투자 시점에 투자한 투자자의 최대손실간능 수익률

MDD는 자산가치 하락 빈도와 회복 속도를 알려주지 못함

 

 

1.4. PYTHON CODE

MDD

numpy의 np.maxium.accumulate 이용

  • 정숫값으로 채워진 리스트 [11, 12, 13, 20, 19, 18, 17, 18, 23, 21]이 있을 때,
    리스트 또는 배열의 원소 순서대로 돌면서 최고값(running maximum)을 갱신하고자 한다.
    즉, [11, 12, 13, 20, 20, 20, 20, 20, 23, 23]처럼 만드는 함수가
    np.maximum.accumulate 함수다.
# cummax라는 이름의 함수를 선언. nums 매개변수를 받음
def cummax(nums):
    # 역대 최고값을 저장하기 위한 리스트 cum과 초기 최고값 max_를 설정
    cum = []
    max_ = 0

    # nums를 순회하면서 item을 현재 최고값을 비교
    # item > max 이면 최고값 max를 업데이트
    # 그리고 if문의 결과오 상관없이 최고값을 cum에 추가
    for item in nums:
        if item > max_:
            max_ = item
        cum.append(max_)
    return cum

# 자산 A가치를 리스트에 저장
values = [100, 120, 130, 100, 65, 80, 100, 120, 140, 160]

# 자산 A 가치(values)에서 for 루프로 반복하면서 cummax()로 구한 최고값을 뺀다.(x-y)
drawdown = [x-y for x,y in zip(values, cummax(values))]

# drawdown에서 최솟값이 저장된 인덱스를 구한다.
idx_lower = drawdown.index(min(drawdown))

# 자산 A 가치(values)의 인덱스 0 부터 idx_lower까지 데이터 중 가장 큰 값이 저장된 위치
idx_upper = values.index(max(values[:idx_lower]))

# MDD 공식에 따라 계산
print((values[idx_lower] - values[idx_upper]) / values[idx_upper])
# >> -0.5
import numpy as np

def mdd(x):
    arr = np.array(x)
    idx_lower = np.argmin(arr - np.maximum.accumulate(arr))
    idx_upper = np.argmax(arr[:idx_lower])
    return (arr[idx_lower] - arr[idx_upper])/arr[idx_upper]

# 앞서 구한 values를 갖고 MDD 계산
print(mdd(values))
# >> -0.5
복사했습니다!