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
반응형
'캡스톤' 카테고리의 다른 글
Turtle 전략 (6) | 2021.09.14 |
---|---|
RSI 전략 (0) | 2021.09.13 |
SMA 전략 (0) | 2021.09.13 |
시스템(퀀트) 트레이딩 롤모델 (1) | 2021.09.13 |