캡스톤

EMA 전략

코블리_vv 2021. 9. 13. 18:03
728x90
반응형

EMA (exponential moving average, 지수 이동평균)

 

전략

Length : 이동평균 기간

Exponential Percentage = 2 / (Length + 1)
EMA = (당일 종가 * Exponential Percentage) + (이전 EMA * (1-Exponential Percentage))

 

특징

  • SMA의 단점을 보완
  • 특정한 기간 동안의 주가를 최근의 가격에 더 높은 가중치를 두어 계산한다.
  • 단기 거래자가 선호하는 전략

장점

  • 가장 최근의 일자에 가장 큰 가중치를 두기 때문에 단순 이동평균에 비해 최근의 시장 분위기를 잘 반영한다.

단점

  • 최근 값에 가중 변수를 더해 빠르게 가격 반전을 예상하고 반전에 보다 민감하다.

코드

backtrader 함수를 이용하여 코드로 구현

## EMA
## 승수 = 2(1+n)
## ema(n) = (current close price x 승수 ) + (yesterday EMA x (1-승수))

from datetime import datetime
import backtrader as bt

class EmaCross(bt.Strategy):
    params = dict(
        period_1=12,
        period_2=26,
        period_signal=9
    )
    
    ## 초기화 메서드
    def __init__(self):
        ema1 = bt.ind.EMA(self.data, period=self.p.period_1) # 단기 이동 평균선
        ema2 = bt.ind.EMA(self.data, period=self.p.period_2) # 장기 이동 평균선
        self.crossover = bt.ind.CrossOver(ema1, ema2)
        
    def next(self):
        if not self.position:
            if self.crossover > 0:  # 단기 이동 평균선이 장기 이동 평균선을 상향 돌파시 매수
                self.buy()
                
        elif self.crossover < 0:  # 단기 이동 평균선이 장기 이동 평균선을 하향 돌파시 매수
            self.close()
            
cerebro = bt.Cerebro()

# 야후 금융 데이터 불러오기
data = bt.feeds.YahooFinanceData(dataname='036570.KS',
                                 fromdate=datetime(2017, 1, 1),
                                 todate=datetime(2020, 12, 31))

cerebro.adddata(data)  # 데이터 추가

#cerebro 실행
cerebro.addstrategy(EmaCross)  # 트레이딩 전략 추가
cerebro.broker.setcash(10000000)  # 브로거 설정

# 매매 단위 설정하기
cerebro.addsizer(bt.sizers.SizerFix, stake=30) # 한번에 30주 설정

# 초기 투자금
init_cash = cerebro.broker.getvalue()
cerebro.run()

# 최종 금액
final_cash = cerebro.broker.getvalue()

print("최종 금액 : ", final_cash, "\\")
print("수익률 : ", float(final_cash - init_cash) / float(init_cash) *100.0, "%")

cerebro.plot()

728x90
반응형