머신러닝과 기술적 분석

backtrader 에서 eps등의 재무 데이터를 추가하는 방법 본문

백테스트

backtrader 에서 eps등의 재무 데이터를 추가하는 방법

BetterToday 2021. 7. 31. 16:34
728x90

backtrader 에서 기본적으로 제공하는 데이터 컬럼은 Open, High, Low, Close, Volumn 이렇게 5개이다. 여기세 per, eps등의 재무데이터를 추가할 수 있다!

 

1. 추가하는 방법

  • 기존 데이터 피드를 확장해서 데이터를 추가
    class EpsData(bt.feeds.PandasData):
        lines = ('per', 'eps',)  # add a line containing the net payout yield

        # Open   High    Low  Close    Volume    PER(5)   EPS(6)
        params = dict(
            per=5,                  # 5번째 컬럼
            eps=6,                  # 6번째 컬럼
            dtformat='%Y-%m-%d',  # fix date format a yyyy-mm-dd
            timeframe=bt.TimeFrame.Months,  # fixed the timeframe
            openinterest=-1,  # -1 indicates there is no openinterest field
        )
  • 전략 로직에서 사용할 때
per = self.datas[0].per[0]
eps = self.datas[0].eps[0]

 

2. 전체 샘플코드

import backtrader as bt
import FinanceDataReader as fdr
from pykrx import stock


class EpsData(bt.feeds.PandasData):
    lines = ('per', 'eps',)  # add a line containing the net payout yield

    # Open   High    Low  Close    Volume    PER(5)   EPS(6)
    params = dict(
        per=5,                  # 5번째 컬럼
        eps=6,                  # 6번째 컬럼
        dtformat='%Y-%m-%d',  # fix date format a yyyy-mm-dd
        timeframe=bt.TimeFrame.Months,  # fixed the timeframe
        openinterest=-1,  # -1 indicates there is no openinterest field
    )


# Create a Stratey
class TestStrategy(bt.Strategy):
    def next(self):
        dt = self.datas[0].datetime.date(0)
        price = self.datas[0].close[0]
        per = self.datas[0].per[0]
        eps = self.datas[0].eps[0]
        print(f"{dt}: close: {price} per: {per} eps: {eps}")


if __name__ == '__main__':
    # 1. 삼성전자 (종목코드 : 005930) 의 가격데이터 가져오기
    # Date,Open,High,Low,Close,Volume,npy
    df = fdr.DataReader("005930", "2021-01-04", "2021-07-31")
    df = df[["Open", "High", "Low", "Close", "Volume"]]

    # 2. 삼성전자의 퀀트 데이터 가져오기
    #   pykrx 에서 eps는 연간실적 기준인듯..?
    df_etc = stock.get_market_fundamental_by_date("20210104", "20210731", "005930")
    df_etc = df_etc[["PER", "EPS"]]

    # 3. Join
    df = df.join(df_etc)

    eps_data = EpsData(dataname=df)

    cerebro = bt.Cerebro(stdstats=False)
    cerebro.addstrategy(TestStrategy)
    cerebro.adddata(eps_data)
    cerebro.run()

    # Plot the result
    # cerebro.plot(style='candlestick', barup="red", bardown="blue")

 

 

 

728x90
반응형
Comments