참고:
퀀트 투자를 위한 머신러닝 딥러닝 알고리즘 트레이딩
https://github.com/PacktPublishing/Machine-Learning-for-Algorithmic-Trading-Second-Edition_Original/blob/master/07_linear_models/02_fama_macbeth.ipynb
알고리즘을 이용한 트레이딩 전략들은 리스크와 자산 수익률 간의 관계를 계량하기 위해 팩터 모델을 자주 사용.
각 팩터 리스크는 프리미엄이 있고, 총 자산 수익률은 이런 리스크 프리미엄의 가중평균으로 볼 수 있다.
특히 요즘은 특정 팩터에 대한 노출을 추구하는 펀드들도 생겨나고 있기 때문에, 리스크 팩터를 이용한 거래가 가능하고, 따라서 팩터 모델은 더욱 중요해 지고 있다.
가장 기초 모델은 CAPM. CAPM은 본질적으로 기본적 분석을 이용한 투자와는 전혀 다른 방식이다. 이 모델의 근거는 시장의 체계적 리스크를 제거할 수 없다는 것. 가격에는 공개된 모든 정보가 반영되는 효율적 시장이므로, 이때 리스크 조정 수익률이 더 우수하지 않아야 된다는 전제를 갖는다. 그럼 왜 CAPM으로 모든 것이 설명이 안되는가? 그건 두 가지 전제가 모든 틀렸기 때문이다.
1. 우선 시장은 완벽하게 효율적이지 않다. 2001년 노벨 경제학상
2. CAPM으로 설명할 수 없는 anomaly들은, 이들을 설명할 수 있는 추가 팩터가 존재한다는 것을 의미. 이로 인해 multi-factor 모델이 탄생한다.
APT는 CAPM의 대안으로 여러 리스크 팩터를 허용한다. 팩터가 명시된 것은 아니지만, 이후 연구들의 기초가 되었다.
가장 유명한 모델이 파마 프렌치의 3팩터 모델. capm, 기업 규모와 가치.
5팩터는 기업 이익 및 투자 수준을 추가했다.
이 리스크 팩터는, 이 팩터를 반영하는 metric에 따라 높은 값 혹은 낮은 값을 가진 포트폴리오의 수익률 차이를 이용해 결정된다. 좀 더 자세히 쓰면
기업 규모 : 시가총액
가치: 장부가치를 시가 총액으로 나눈 값
OP: 매출에서 비용을 뺀 금액
투자: 투자/자산
파마 프렌치 모델이 많이 사용되는 이유는, 웹사이트에서 이 데이터를 지속적으로 업데이트해 제공하고 있으며, 연구 포트폴리오 까지도 제공되기 때문. 심지어, pandas_datareader로 매우 손쉽게 데이터를 얻을 수 있다.
import pandas_datareader.data as web
ff_factor = 'F-F_Research_Data_5_Factors_2x3'
ff_factor_data = web.DataReader(ff_factor, 'famafrench', start='2010', end='2017-12')[0]
를 하면 리스크 팩터 값들을 바로 얻을 수 있다.
파이썬을 이용해, 선형 팩터 모델의 팩터들이 자산의 수익률을 잘 설명하는지에 대한 회귀 분석을 할 수 있다.
책에서 제공된 코드를 따라 가본다.
ff_portfolio = '17_Industry_Portfolios'
ff_portfolio_data = web.DataReader(ff_portfolio, 'famafrench', start='2010', end='2017-12')[0]
ff_portfolio_data = ff_portfolio_data.sub(ff_factor_data.RF, axis=0)
를 통해, 사이트에서 산업별 포트폴리오를 얻을 수 있다. 이 때 수익률에는 Rf도 더해진 값이므로 일을 빼준다.
저장된 주식 데이터에서, .filter를 이용해 보고 싶은 것만 골라낸 뒤, 월별 수익률을 만들어 내고, 해당 기간 데이터를 팩터 dataframe에서 골라내는 것을 전처리를 완료한다.
검정 대상에 대해 다시 정리해 보면, 1~T기간에 걸쳐 N개의 자산에 대한 수익률을 갖게 되며 M개의 팩터가 프리미엄을 설명하는지를 보려고 하는 것이 현재 상태다.
계수에 대한 회귀 분석을 할 때, 일반적으로 바로 실시하는 회귀 분석은 GMT를 위반할 가능성이 높기 때문에, 파마와 맥베스는 2단계 방법론을 제안했다.
1. 모든 자산에 대해, N번의 시계열 회귀 분석을 한다. 따라서 N X M 짜리 행렬을 하나 얻게 된다.
2. 모든 기간에 대해, 1번을 통해 계산한 값을 이용해 횡단면 회귀 분석을 한다. 따라서 T X M짜리 행렬을 하나 얻게 된다. 이 행렬을 시간에 대한 평균을 내어, 전체에 대한 리스크 프리미엄 추정치를 얻는다.
beta와 lambda로 두고 개별로 계산하는 방법도 있지만, linearmodels는 이 절차가 구현되어 있다.
model=LinearFactorModel(portfolios=portfolios, factors= factor_data)
ret=models.fit()
결과를 보면 동일한 값을 돌려준다.
print(ret)을 하면 요약된 결과를, print(ret.full_summary)는 섹터별 결과를 보여준다.
플롯팅을 해 보면, 기간에 따른 람다의 값(즉1번 단계를 거친 값을 활용한 횡단면 값들의 평균)이 굉장히 역동적으로 변하는 것을 볼 수 있다.