백테스트
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
반응형