본문 바로가기
투자

Python05 기술적투자04 Envelope 전략

by Miracle_Morning 2021. 12. 3.

 Finterstella 라이브러리를 이용한 기술적 투자전략, Envelope 전략이다.

Envelope는 단순히 주식 차트의 이동평균선 위아래로 +- N% 보조선을 긋고 트레이딩을 하는 전략이다. 추세에 배팅하는 모멘텀과, 파동은 언제나 평균으로 돌아온다는 평균 회귀 전략 둘 다 사용 가능하다.

 

먼저 Finterstella 라이브러리를 설치하고 import 해준다.

!pip install finterstellar
import finterstellar as fs

 

주식 차트를 받아서 pandas dataframe 으로 바꾸는 함수를 만들어주고, 나스닥 추종 ETF인 QQQ를 받아와서 차트를 그려보겠다.

def fet_data(stock,start,end):
  df = fs.get_price(stock,start_date=start,end_date=end)
  fs.draw_chart(df,right=stock)
  return df
  
symbol= 'QQQ'
df = get_data(symbol,'2020-01-01','2021-12-02')

QQQ 차트: 2020-01-01 ~ 2021-12-02

Envelope은 Finterstella 내장 함수에 있다. 다음과 같이 dataframe에 envelope을 추가할 수 있다. 20일 이동평균 기준 기준으로 +- 10% 밴드를 설정한다

fs.envelope(df,w=20,spread=0.1)
df.tail()

Data frame에 upper bound lower bound 가 추가된 모습

band를 차트에 추가해보자

fs.draw_band_chart(df)

차트에 envelope 이 추가 된 모습

위 그림에서 파란색 선은 이동 평균선이고, 붉은 선은 주가, 밴드는 이동 평균선을 기준으로 +- 10% 이다.

 

다음과 같이 영역을 설정해보자.

  • 위쪽 밴드 위: A
  • 위쪽 밴드-이동평균 선위: B
  • 이동평균선 밑-아래쪽 밴드: C
  • 아래쪽 밴드 아래: D

Envelope를 이용한 투자전략을 한대 모아서, 함수를 만든다.

def Envelop(df,buy,sell):
  fs.envelope(df,w=20,spread=0.1) #  Envelope 추가
  fs.draw_band_chart(df)          # Band chart 그리기
  fs.band_to_signal(df,buy=buy,sell=sell)  # Buy, Sell 시그널 형성
  fs.position(df)  # Buy Sell 시그널에 따른 포지션 설정 
  fs.evaluate(df,cost=0.001) # 0.001: 수수료
  fs.performance(df,rf_rate=0.01) # 0.01: 무위험 이자율, 최종 결과도출
  fs.draw_trade_results(df) # 결과 그리기

 

이제 전략을 시뮬레이션할 준비가 끝났다.

 

1. 모멘텀 전략

추세가 그대로 이어진다는 것을 가정하는 전략이다. 주가가 B 영역에 오면 상승이 예상되니 Buy, 올랐던 주가가 하락하여 C 영역에 진입하면 하락이 예상되니 Sell 한다. ( 꼭 B, C로 안 해도되고, A,B 로 해도되지만 ETF 는 움직임이 크지 않아서 임의로 B,C로 정했다). 만들어둔 함수를 이용하면 쉽게 시뮬레이션해볼 수 있다.

 

df = get_data(symbol,'2020-01-01','2021-12-02')
Envelop(df,'B','C')

Envelope 모멘텀 전략을 사용, 주가와 수익률

  • CAGR: 21.65%
  • Accumulated return: 43.44%
  • Average return: 1.72%
  • Benchmark return : 75.16%
  • Number of trades: 23
  • Number of win: 10
  • Hit ratio: 43.48%
  • Investment period: 1.8 yrs
  • Sharpe ratio: 0.99
  • MDD: -15.95%
  • Benchmark MDD: -28.56%

주식을 그대로 Buy and Hold 했을 때를 Benchmark 해서 해당 전략의 Performance를 측정해봤다. 연평균 수익률 21.65%, 누적 수익률 43.44%로  Benchmark 수익률 75.16%에는 못 미친다. 트레이딩에서 수익을 본 확률은 43.8%로 절반이 되지 못한다. 최대 수익률 낙폭은 Benchmark  -28.56%, 전략 -15.95%로 절반 정도로 줄었다.

 

2. 평균 회귀 전략

요동치는 주가는 평균으로 회귀한다는 전략이다. D에서 buy B에서 sell 한다.

df = get_data(symbol,'2020-01-01','2021-12-02')
Envelop(df,'D','B')
  • CAGR: -0.52%
  • Accumulated return: -0.96%
  • Average return: -0.96%
  • Benchmark return : 75.16%
  • Number of trades: 1
  • Number of win: 0
  • Hit ratio: 0.00%
  • Investment period: 1.8 yrs
  • Sharpe ratio: -0.08
  • MDD: -17.05%
  • Benchmark MDD: -28.56%

전략이 실패했다. 평균 회귀 같은 경우 우상향보다는 횡보하는 주식인데 변동이 클 경우 잘 먹힌다. 여기서 사용한 주식은 나스닥을 추종하는 QQQ라는 ETF로 우상향에 변동폭이 많이 크지 않으므로 적당하지 않다는 점에 사실 당연한 결과이다. 

 

 

 

 

*Reference

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9791162244753#N)