반응형
이전 장에서, Indicator 설정과 next메서드를 통한 거래를 진행했다. 이제 이러한 거래의 세부 내역이 어떻게 진행되는지
run창에서 볼 수 있는 log를 만들어 보도록 하자.
먼저 log함수를 따로 만들기 전에, next를 활용하여 현재 상태를 출력해보자.
현재 라인의 번호 표기용으로 -> ref = len(self)
날짜를 출력하기 위해 -> date = self.datas[0].datetime.date(0)
종가의 출력을 위해 -> close = self.dataclose[0] # __init__에 만들어놧던 Indicator 사용
이평선 값의 출력을 위해 -> SMA = self.SMA[0] # __init__에 만들어놧던 Indicator 사용
def next(self):
ref = len(self)
date = self.datas[0].datetime.date(0)
close = self.dataclose[0]
SMA = self.SMA[0]
print(f'[{ref}] [날짜 : {date}] [종가 : {close}] [이평선 : {SMA}]')
if self.dataclose[-1] < self.SMA[-1]:
if self.dataclose[0] > self.SMA[0]:
self.order = self.buy()
출력시 아래와 같다.
[20] [날짜 : 2020-10-30] [종가 : 56600.0] [이평선 : 59660.0]
[21] [날짜 : 2020-11-02] [종가 : 57400.0] [이평선 : 59620.0]
[22] [날짜 : 2020-11-03] [종가 : 58800.0] [이평선 : 59625.0]
[23] [날짜 : 2020-11-04] [종가 : 58500.0] [이평선 : 59600.0]
[24] [날짜 : 2020-11-05] [종가 : 60300.0] [이평선 : 59620.0]
[25] [날짜 : 2020-11-06] [종가 : 60100.0] [이평선 : 59640.0]
[26] [날짜 : 2020-11-09] [종가 : 60200.0] [이평선 : 59630.0]
[27] [날짜 : 2020-11-10] [종가 : 60200.0] [이평선 : 59595.0]
[28] [날짜 : 2020-11-11] [종가 : 61300.0] [이평선 : 59615.0]
.
.
원하는대로 출력물이 나왔는데, 위에 설정한 ref가 20부터 시작하는것을 확인할 수 있다. 이유는 간단하다.
이평선이 20일 이평선이기 때문에, 시작일부터 20일 이후부터 next 함수가 진행되기 때문이다.
이 이전 기간은 prenext 함수에서 진행된다. 한번 prenext함수를 작성하여
확인해보도록 하자.
def prenext(self):
ref = len(self)
date = self.datas[0].datetime.date(0)
close = self.dataclose[0]
SMA = self.SMA[0]
print(f'[prenext] [{ref}] [날짜 : {date}] [종가 : {close}] [이평선 : {SMA}]')
def next(self):
ref = len(self)
date = self.datas[0].datetime.date(0)
close = self.dataclose[0]
SMA = self.SMA[0]
print(f'[ next ] [{ref}] [날짜 : {date}] [종가 : {close}] [이평선 : {SMA}]')
if self.dataclose[-1] < self.SMA[-1]:
if self.dataclose[0] > self.SMA[0]:
self.order = self.buy()
출력시 아래와 같다.
[prenext] [1] [날짜 : 2020-09-29] [종가 : 58200.0] [이평선 : nan]
[prenext] [2] [날짜 : 2020-10-05] [종가 : 58700.0] [이평선 : nan]
.
.
[prenext] [18] [날짜 : 2020-10-28] [종가 : 59000.0] [이평선 : nan]
[prenext] [19] [날짜 : 2020-10-29] [종가 : 58100.0] [이평선 : nan]
[ next ] [20] [날짜 : 2020-10-30] [종가 : 56600.0] [이평선 : 59660.0]
[ next ] [21] [날짜 : 2020-11-02] [종가 : 57400.0] [이평선 : 59620.0]
[ next ] [22] [날짜 : 2020-11-03] [종가 : 58800.0] [이평선 : 59625.0]
.
.
prenext 함수에서는 이평선이 준비되지 않았기 때문에 nan이 출력되고 next함수 부터 제대로 값이 출력되는 것을 볼 수 있다.
다음장에서는 log 함수를 별도로 만들어서 log 관리를 진행해보도록 하자.
*최종코드
import backtrader as bt
import helper
class MyStrategy(bt.Strategy):
def __init__(self):
self.dataclose = self.datas[0].close
self.SMA = bt.indicators.MovingAverageSimple(period=20)
def prenext(self):
ref = len(self)
date = self.datas[0].datetime.date(0)
close = self.dataclose[0]
SMA = self.SMA[0]
print(f'[prenext] [{ref}] [날짜 : {date}] [종가 : {close}] [이평선 : {SMA}]')
def next(self):
ref = len(self)
date = self.datas[0].datetime.date(0)
close = self.dataclose[0]
SMA = self.SMA[0]
print(f'[ next ] [{ref}] [날짜 : {date}] [종가 : {close}] [이평선 : {SMA}]')
if self.dataclose[-1] < self.SMA[-1]:
if self.dataclose[0] > self.SMA[0]:
self.order = self.buy()
if __name__ == "__main__":
cerebro = bt.Cerebro()
cerebro.addstrategy(MyStrategy)
df = helper.ohlcv_data()
data = bt.feeds.PandasData(dataname=df)
cerebro.adddata(data)
cerebro.broker.setcash(20000000)
cerebro.run()
#cerebro.plot(style='candle', barup='red', bardown='blue')
반응형
'Back Trader' 카테고리의 다른 글
04. BackTrader - 기초(4) log 설정_2. (0) | 2021.09.30 |
---|---|
02. BackTrader - 기초(2) Strategy로 Indicator 설정 (0) | 2021.09.29 |
01. BackTrader - 기초(1) Data 설정, 기본설정, plot (0) | 2021.09.20 |