250x250
반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 블록체인
- it
- backtest
- 확률
- TOEFL
- AWS
- GeorgiaTech
- toefl writing
- can
- 퀀트
- Bitcoin
- 자동차sw
- 프로그래밍
- 토플
- 암호화폐
- probability
- 백트레이더
- 토플 라이팅
- AUTOSAR
- 비트코인
- 아마존 웹 서비스
- 클라우드
- Cloud
- 파이썬
- 백테스트
- backtrader
- 자동매매
- 오토사
- 개발자
- python
Archives
- Today
- Total
Leo's Garage
BackTrader - 여러 지표 섞어서 만들기 (3) 본문
728x90
반응형
이번에는 여러 지표를 섞어서 매매 전략을 만들어보도록 하겠다.
이번 전략에는 기본적으로 SMA(Simple Moving Average)와 MACD(Moving Average Convergence Divergence) 그리고 RSI(Relative Strength Index) 이 세 가지 지표를 섞어서 전략을 만들어보려고 한다.
각 지표에 대한 설명 및 동작에 대한 내용은 아래 포스팅들을 참조하기 바란다.
이번에 만들 전략은 아래와 같다.
MACD와 RSI 둘 다 특정 임계점(Threshold)을 넘어 위로 가면 전략은 매수한다.
MACD와 RSI 둘 중 하나라도 특정 임계점(Threshold) 아래로 가면 매도한다.
그리고 Take_Profit과 Stop_loss 비율을 사전에 정의하여 해당 조건 시 매도하도록 전략을 구성한다.
import backtrader as bt
import yfinance as yf
class ReverseTrendStrategy(bt.Strategy):
params = (
("fast_window", 12),
("slow_window", 26),
("macd_window", 9),
("macd_threshold", 0.0),
("rsi_window", 14),
("rsi_threshold", 50),
("stop_loss", 2.0),
("take_profit", 5.0),
)
def __init__(self):
self.fast_average = bt.indicators.SimpleMovingAverage(
self.data.close, period=self.params.fast_window
)
self.slow_average = bt.indicators.SimpleMovingAverage(
self.data.close, period=self.params.slow_window
)
self.macd = bt.indicators.MACD(
self.data.close,
period_me1=self.params.fast_window,
period_me2=self.params.slow_window,
period_signal=self.params.macd_window,
)
self.rsi = bt.indicators.RelativeStrengthIndex(
self.data.close, period=self.params.rsi_window
)
def next(self):
if not self.position:
if self.macd.macd[0] > self.params.macd_threshold and self.rsi[0] > self.params.rsi_threshold:
self.buy()
else:
if self.macd.macd[0] < self.params.macd_threshold or self.rsi[0] < self.params.rsi_threshold:
self.sell()
if self.data.close[0] < self.data.close[-1] * (1 - self.params.stop_loss / 100):
self.sell()
if self.data.close[0] > self.data.close[-1] * (1 + self.params.take_profit / 100):
self.sell()
cerebro = bt.Cerebro()
data = bt.feeds.PandasData(dataname= yf.download('TSLA','2021-01-01','2021-12-31'))
cerebro.adddata(data)
cerebro.addstrategy(ReverseTrendStrategy)
cerebro.run()
cerebro.plot()
코드는 위와 같고 해당 코드를 Tesla 1년치 주가에 반영해보았다.
초기 자본은 10000이었는데 1년 뒤에 36217.51이 되었다.
약 3배 이상의 수익을 얻었다고 볼 수 있다.
728x90
반응형
Comments