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')
Envelope은 Finterstella 내장 함수에 있다. 다음과 같이 dataframe에 envelope을 추가할 수 있다. 20일 이동평균 기준 기준으로 +- 10% 밴드를 설정한다
fs.envelope(df,w=20,spread=0.1)
df.tail()
band를 차트에 추가해보자
fs.draw_band_chart(df)
위 그림에서 파란색 선은 이동 평균선이고, 붉은 선은 주가, 밴드는 이동 평균선을 기준으로 +- 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')
- 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)
'투자' 카테고리의 다른 글
퀀트킹 백테스터02 한국의 대형주 투자의 수익률은? (0) | 2022.01.25 |
---|---|
퀀트킹 백테스터01 마법공식 백테스팅 (1) | 2022.01.10 |
Python04 기술적투자03 RSI 전략 (4) | 2021.10.31 |
Python03 기술적투자02 MACD전략 (0) | 2021.10.24 |
Python02 기술적투자01 라이브러리 소개 (0) | 2021.10.22 |