반응형

이제 아예 log 함수를 만들어서 관리하도록 해보자.

함수명은 단순히 log로 하고 입력값으로 self를하여 클래스 변수를 이용하도록 하고, next나 prenext 등에서 log 함수를

호출하여 log를 작성하도록 하자.

 

먼저, log함수를 작성하고 이전장에서 next함수에 넣었던 변수와 print 함수를 옮기자.

    def log(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}]')

    def prenext(self):
        self.log()

    def next(self):
        self.log()
        if self.dataclose[-1] < self.SMA[-1]:
            if self.dataclose[0] > self.SMA[0]:
                self.order = self.buy()

출력시 아래와 같다.

[1] [날짜 : 2020-09-29] [종가 : 58200.0] [이평선 : nan]
[2] [날짜 : 2020-10-05] [종가 : 58700.0] [이평선 : nan]
.
.
[20] [날짜 : 2020-10-30] [종가 : 56600.0] [이평선 : 59660.0]
[21] [날짜 : 2020-11-02] [종가 : 57400.0] [이평선 : 59620.0]
.
.
[245] [날짜 : 2021-09-28] [종가 : 76300.0] [이평선 : 76360.0]
[246] [날짜 : 2021-09-29] [종가 : 74100.0] [이평선 : 76350.0]
.
.

next에 order조건에 부합 할 때 order에 대한 log를 작성 할 수 있도록, log 함수에 비고란을 만들고

order부에 log 함수를 적용해서 어떤 시점에 거래가 이루어지는지 확인 할 수 있도록 함수를 작성해보자

    def next(self):
        self.log()
        if self.dataclose[-1] < self.SMA[-1]:
            if self.dataclose[0] > self.SMA[0]:
                self.order = self.buy()
                self.log(text="매수발생")

그럼 이제 어떤 시점에 매수가 발생 했는지 알 수 있다.

.
.
[119] [날짜 : 2021-03-29] [종가 : 81600.0] [이평선 : 82100.0][]
[120] [날짜 : 2021-03-30] [종가 : 82200.0] [이평선 : 82030.0][]
[120] [날짜 : 2021-03-30] [종가 : 82200.0] [이평선 : 82030.0][매수발생]
[121] [날짜 : 2021-03-31] [종가 : 81400.0] [이평선 : 81900.0][]
[122] [날짜 : 2021-04-01] [종가 : 82900.0] [이평선 : 81925.0][]
[122] [날짜 : 2021-04-01] [종가 : 82900.0] [이평선 : 81925.0][매수발생]
[123] [날짜 : 2021-04-02] [종가 : 84800.0] [이평선 : 82060.0][]
[124] [날짜 : 2021-04-05] [종가 : 85400.0] [이평선 : 82230.0][]
.
.

이제 다음장에서는 notify_order를 통해 거래가 어떻게 진행되는지를 확인해보도록 한다.

 

 

*전체 코드

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 log(self,text=""):
        ref = len(self)
        date = self.datas[0].datetime.date(0)
        close = self.dataclose[0]
        SMA = self.SMA[0]
        print(f'[{ref}] [날짜 : {date}] [종가 : {close}] [이평선 : {SMA}][{text}]')

    def prenext(self):
        self.log()

    def next(self):
        self.log()
        if self.dataclose[-1] < self.SMA[-1]:
            if self.dataclose[0] > self.SMA[0]:
                self.order = self.buy()
                self.log(text="매수발생")

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')
반응형

+ 최근 글