반응형

이전 장에서, 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')
반응형

+ 최근 글