[금융 AI] 금융 투자 영역에서의 AI(2) - 전통 퀀트 구현
금융 시계열 및 파이썬을 활용한 전통 퀀트 방법 구현
금융 투자 데이터 준비
1) 데이터 구매 : 블룸버그, Refinitiv(로이터), FnGuide
2) 증권사 API : 삼성증권 OpenAPI, 키움증권 API, Alpaca, Upstox
3) 금융 웹페이지 크롤링 : 네이버 금융, 야후 파이낸스, 구글 파이낸스
4) 금융 데이터 제공 오픈 API 활용 : Alpha Vantage, 퀀들, 야후 파이낸스
가장 쉬운 방법은 FinanceDataReader 라이브러리를 사용하면 누구나 쉽게 금융 투자 데이터를 불러올 수 있다. 거래소별 전체 종목 코드는 StockListing() 함수를 사용하여 한국거래소에 상장된 종목 리스트는 fdr.StockListing('KRX')로, 미국 S&P500에 상장된 종목들은 fdr.StockListing('S&P500')으로 간단히 얻을 수 있다. 더불어 DataReader() 함수를 통해 특정 기업의 주식 가격, 거래량 등의 시계열 데이터를 수집할 수 있다. 예를 들어, 애플의 2020년 1월 1일부터 2020년 12월 31일까지의 주식 가격 데이터를 fdr.DataReader ('AAPL', '2020-01-01', '2020-12-31') 코드로 수집할 수 있다.
퀀트 전략의 기술적 지표
퀀트 투자 전략은 금융 시장에서 거래되는 자산의 가치를 수치적으로 분석해 투자 결정을 내리는 접근법이다. 이 방식은 대량의 데이터를 기반으로 알고리즘과 통계적 모델을 사용해 시장의 비효율성을 찾아내고, 이를 이용해 수익을 창출하려는 목적을 가진다. 그 중에서도 기술적 분석은 주식이나 다른 금융 상품의 미래 가격 움직임을 예측하기 위해 과거의 가격 데이터와 거래량을 분석한다. 기술적 분석의 중요성은 시장의 심리와 행동 패턴을 파악해 이를 이용하려는데 있다. 카테고리 별로 나열한 지표들은 시장의 다양한 측면을 분석하고, 이를 바탕으로 거래 신호를 도출하는데 사용된다.
- 이동평균선 : 일정 기간 동안의 가격을 평균화하여 추세를 파악하는 기법이다. 과거 n일 동안의 종가를 n으로 나누어 계산한다. 이동평균선은 가격 데이터의 잡음을 줄이고 주가의 중요한 추세를 파악하는데 도움을 준다.
- 볼린저 밴드 : 1980년대 존 볼린저에 의해 개발되었다. 이 지표는 중간 밴드(이동평균선), 상단 밴드(중간 밴드+ (2x 표준편차)), 하단 밴드(중간 밴드 - (2× 표준편차))의 세 가지 선으로 구성된다. 가격이 밴드의 위쪽이나 아래쪽 경계를 넘어설 때 과매수나 과매도 상황을 나타낸다.
- 상대강도지수 : 1978년 웰스 와일더가 개발한 지표로, 가 격 변동의 속도와 변동 크기를 통해 과매수나 과매도 상태를 나타낸다. RSI는 다음과 같은 공 식으로 계산된다. RSI = 100- (100/(1+RS)), 여기서 RS는 평균 상승폭을 평균 하락폭으로 나눈 값이다.
- MACD(이동평균 수렴확산 지수) : 제럴드 아펠이 1970년대 후반에 개발한 지표로, 장단기 이동평균선의 차이를 통해 추세의 강도와 방향을 판단한다. MACD line 12일 이동평균선 - 26일 이동평균선, Signal line = MACD line의 9일 지수이동평균(EMA)이다.
- 스토캐스틱 오실레이터 : 조지 레인이 1950년대에 개발한 지표로, 주가가 최근 가격 범위 내에서 어디에 위치해 있는지를 나타낸다. %K= (현재 종가 - n일 동안의 최저가)/ (n일 동안의 최고가 - n일 동안의 최저가) * 100, %D = %K의 3일 단순이동평균(SMA)이다.
거래량 가중 평균 가격 : 거래량을 고려하여 평균 가격을 계산하 는 지표로, 주로 대규모 주식 거래에서 벤치마크로 사용된다. VWAP= (총 거래 금액/ 총 거래량)이다.
- 평균진폭지수 : 웰스 와일더가 개발한 지표로, 가격 변동성을 측정한다. ATR = n일 동안의 진폭(당일 최고가와 최저가, 전일 종가와 비교)의 평균이다.
- 현금흐름지수 : 가격과 거래량을 기반으로 자산의 과매수나 과매도 상태를 측정한다. 현금흐름지수는 상대강도지수와 비슷한 방식으로 계산되지만, 거래량을 추가로 고려한다.
- 거래량지표 : 가격 변동과 거래량의 관계를 분석하는 데 사용되는 지표다. 거래량이 증가하면 대차 이익률은 증가하고, 거래량이 감소하면 대차 이익률은 감소한다.
- 대형주 지수 : 시가총액이 큰 기업들의 주식 가격 추세를 반영한 지표다. 이 지표는 투자자들이 대형주에 대한 시장 트렌드를 이해하는 데 도움이 된다. 이는 특정 시장 지수(예를 들어 S&P 500)에 속하는 주식의 가격과 거래량을 기반으로 계산된다.
기술적 지표 생성을 위한 도구: TA-Lib
앞서 소개한 기술적 지표를 쉽게 생성할 수 있도록 도와주는 파이썬 라이브러리가 다수 존재한다. TA-Lib, pandas-ta, zipline, pyalgotrade 등이 있는데, 그중에서도 TA-Lib을 추천한다.
TA-Lib은 금융 시장 데이터의 기술적 분석을 위해 개발된 강력한 라이브러리다. 이 라이브러리는 트레이더와 시장 분석가들이 주식, 외환, 선물 시장 등에서 가격 변동을 분석 하고 예측하는 데 사용할 수 있는 150개 이상의 기술적 지표와 함수를 포함하고 있다. 예를 들어, 평균 방향성 지수(ADX), 이동평균 수렴/발산(MACD), 상대강도지수(RSI), 스토캐스틱 오실레이터, 볼린저 밴드 등이 포함되어 있다. 이러한 지표들은 시장의 트렌드, 모멘텀, 변동성, 볼륨 등 다양한 측면을 분석하는 데 활용된다.
또한, TA-Lib은 캔들스틱 패턴을 인식하는 기능을 제공하는데, 이는 시장 참여자들의 심리와 시장 의 가능한 전환점을 파악하는 데 유용하다. 캔들스틱 패턴은 가격 차트에서 특정 형태를 형성하는 일련의 캔들을 의미하며, 이는 잠재적인 구매 또는 판매 신호를 제공할 수 있다.
TA-Lib을 사용하여 애플(AAPL)의 주식 데이터를 불러오고, 단순이동평균(SMA)과 상대강도지수(RSI)를 계산하는 방법은 다음과 같다. 먼저, 야후 파이낸스에서 데이터를 가져오기 위해 pandas_datareader 라이브러리의 get_data_ yahoo 함수를 사용한다. 그 후 TA-Lib을 사용하여 SMA와 RSI를 계산한다.
#필요 라이브러리 호출
import pandas as pd
from pandas_datareader import data as pdr
import talib
#야후 파이낸스에서 애플 주식 데이터 불러오기
aapl_data = pdr.get_data_yahoo('AAPL')
#단순이동평균(SMA), 여기서는 20일 SMA를 계산한다.
aapl_data['SMA_20'] = talib.SMA(aapl_data['Close'], timeperiod=28)
#상대강도지수(RSI), 여기서는 14일 RSI를 계산한다.
aapl_data['RSI_14'] = talib.RSI(aapl_data['Close'], timeperiod=14)
#결과 출력
print(aapl_data.tail())
위의 코드는 Apple의 최신 주식 데이터를 가져와서 20일 SMA와 14일 RSI를 계산하고, 이를 데이터 프레임에 추가한 후 마지막 5개의 데이터 포인트를 출력한 것이다.
퀀트 투자 성과 평가를 위한 백테스팅 및 주요 지표
백테스팅은 과거 데이터를 활용하여 특정 투자 전략이 과거에 어떤 성과를 거두었는지 검증하는 과정이다. 예를 들어 어떤 투자자가 특정 주식이 5일 연속 하락할 때 매수하고, 이후 5일 간 상승하면 매도하는 전략을 고안했다고 하자. 백테스팅은 이러한 전략을 과거의 주식 가격 데이터에 적용하여, 실제로 이 전략을 과거에 사용했다면 얼마나 성공적이었을지를 평가하는 것이다.
실제 자본을 투입하지 않고 트레이딩 전략을 테스트하는 방식으로, 데모 트레이딩과 유사한 점이 있다. 하지만 백테스팅은 실제 과거 데이터를 기반으로 하기 때문에, 더 신뢰할 수 있는 결과를 제공한다는 장점이 있다. 트레이더들은 이 과정을 통해 자신의 전략이 과거 시장 조건에서 어떻게 작동했는지 이해할 수 있으며, 이를 바탕으로 미래의 성과를 예측한다. 백테스팅은 전략의 유효성을 확인하고 위험 요소를 사전에 파악하는 데에 중요한 도구로 활용된다.
그러나 백테스팅에 대한 비판도 존재한다. 가장 흔한 비판 중 하나는 '과적합'이다. 과적합은 특정 과거 데이터에 대해 너무 잘 맞는 전략을 개발함으로써, 실제 시장 조건에서는 그 효과가 크게 떨어질 수 있다는 것이다. 또한 과거의 시장 조건이 미래에도 동일하게 발생한다는 보장이 없기 때문에, 백테스팅 결과가 항상 미래의 성과를 정확히 예측하지는 못한다는 점도 지적된다. 따라서 투자자들은 백테스팅 결과를 무조건적으로 신뢰하기보다는 하나의 참고 자료로 활용하고, 실제 시장 환경과 변화를 면밀히 관찰하면서 전략을 조정해야 한다.
아래는 다양한 백테스팅 라이브러리들이다.
Backtrader : 파이썬으로 작성된 유연하고 강력한 백테스팅 라이브러리이다. 다양한 시장 데이터 및 트레이딩 전략에 대한 지원이 우수하고, 실시간 트레이딩을 위한 기능을 제공한다.
Zipline : Quantopian이 개발한 백테스팅 라이브러리로 주식, 선물 등 다양한 자산 클래스에 대한 백테스팅을 지원한다. 파이프라인 API를 통해 대량의 데이터 처리도 가능하다.
PyAlgoTrade : 이벤트 드리븐 방식의 백테스팅을 지원하는 파이썬 라이브러리이다. 여러 종류의 알고리즘 트레이딩 전략에 적용 가능하다.
bt : 빠르고 간편하게 포트폴리오 백테스팅을 할 수 있는 파이썬 라이브러리로 백터 연산을 기반으로 한다.
Catalyst : Zipline의 확장 버전이다.
퀀트 투자 성과 측정을 위한 주요 지표
투자 전략의 성공을 판단할 때 높은 수익률만을 기준으로 삼는 것은 충분하지 않다. 수익률은 투자에서 발생하는 위험, 시장 변동성, 자금 유동성 등 다른 중요한 요소들을 고려하지 않기 때문이다. 따라서 투자 전략의 진정한 성공을 평가하기 위해서는 수익률 이외에도 위험관리, 장기적 안정성, 시장 조건 변화에 대한 적응력 등 다양한 각도에서 그 효과성을 검토해야 한다.
- 연평균 복리 수익률 = ((최종 자산 가치 / 초기 자산 가치)^ (1/투자 기간)-1) * 100
- MDD = (최저점 - 피크점)/피크점 *100
- 변동성 = 표준편차(일간 수익률)*(연간 거래일 수)
- 샤프 비율 = (포트폴리오의 수익률 - 무위험 이자율)/포트폴리오의 변동성
- 베타 = Cov(수익률(자산), 수익률(시장))/ Var (수익률(시장))
- 알파 = 실제 포트폴리오 수익률 - [무위험 이자율 + 베타* (시장 수익률 - 무위험 이자율)]
- 소르티노 비율 = (포트폴리오 수익률 - 목표 수익률)/ 다운사이드 리스크 *다운사이드 리스크 : 손실에 대한 변동성