백테스트 시 Pandas 데이터를 직접 사용하는 방법을 이용했습니다.
그리고 백테스트를 위해 일년 데이터를 사용했구요.
(백테스트 전 Matplot에서 발생하는 warings 에러도 해결 했음)
코드를 돌리면 텍스트로 결과는 나오나 그래프가 출력이 안됩니다.
그래프 출력 시 메모리 이슈로 아래와 같이 에러가 발생합니다.
확인 부탁드립니다.
수정 : matplotlib 버전이 달라 발생하는 문제인것 같습니다.
현재 matplotlib 버전은 3.3.4인데 다운그래이드 해서 개발자님과 동일한 버전에서 실행해 보겠습니다.
→ 개발자님 버전도 3.3.4 로 동일 하지만 코드 실행 안되고 동일한 메모리 에러 발생
수정2 : Spyder를 사용해서 코드를 실행하는데, spyder에서 matplotlib 사용 시 발생되는 문제라고 하는 군요.
다른 방식으로 시도해 보겠습니다.
실행코드
from datetime import datetime
import backtrader as bt
import pandas as pd
from Analyzer import MarketDB
class MyStrategy(bt.Strategy): # ①
def init(self):
self.rsi = bt.indicators.RSI(self.data.close) # ②
def next(self): # ③
if not self.position:
if self.rsi < 30:
self.order = self.buy()
else:
if self.rsi > 70:
self.order = self.sell()
mk=MarketDB()
df=mk.get_daily_price('NAVER')
df.date=pd.to_datetime(df.date)
data = bt.feeds.PandasData(dataname=df, datetime='date')
print(f'Initial Portfolio Value : {cerebro.broker.getvalue():,.0f} KRW')
cerebro.run()
print(f'Final Portfolio Value : {cerebro.broker.getvalue():,.0f} KRW')
cerebro.plot()
에러 문구
start_date is initialized to '2021-02-10'
end_date is initialized to '2022-02-10'
Initial Portfolio Value : 10,000,000 KRW
Final Portfolio Value : 9,895,000 KRW
Traceback (most recent call last):
File "Z:\..\Investar\Backtrader_RSI.py", line 47, in
cerebro.plot() # ⑨
File "c:\anaconda3\lib\site-packages\backtrader\cerebro.py", line 989, in plot
rfig = plotter.plot(strat, figid=si * 100,
File "c:\anaconda3\lib\site-packages\backtrader\plot\plot.py", line 262, in plot
self.mpyplot.setp(ax.get_xticklabels(), visible=False)
File "c:\anaconda3\lib\site-packages\matplotlib\axes\_base.py", line 63, in wrapper
return get_method(self)(*args, **kwargs)
File "c:\anaconda3\lib\site-packages\matplotlib\axis.py", line 1255, in get_ticklabels
return self.get_majorticklabels()
File "c:\anaconda3\lib\site-packages\matplotlib\axis.py", line 1207, in get_majorticklabels
ticks = self.get_major_ticks()
File "c:\anaconda3\lib\site-packages\matplotlib\axis.py", line 1378, in get_major_ticks
numticks = len(self.get_majorticklocs())
File "c:\anaconda3\lib\site-packages\matplotlib\axis.py", line 1283, in get_majorticklocs
return self.major.locator()
File "c:\anaconda3\lib\site-packages\matplotlib\dates.py", line 1327, in __call__
return locator()
File "c:\anaconda3\lib\site-packages\matplotlib\dates.py", line 1738, in __call__
return self.tick_values(dmin, dmax)
File "c:\anaconda3\lib\site-packages\matplotlib\dates.py", line 1748, in tick_values
ticks = self._wrapped_locator.tick_values(nmin, nmax)
File "c:\anaconda3\lib\site-packages\matplotlib\ticker.py", line 2022, in tick_values
locs = vmin - step + np.arange(n + 3) * step
MemoryError: Unable to allocate 70.8 GiB for an array with shape (9504000003,) and data type float64
백테스트 시 Pandas 데이터를 직접 사용하는 방법을 이용했습니다. 그리고 백테스트를 위해 일년 데이터를 사용했구요. (백테스트 전 Matplot에서 발생하는 warings 에러도 해결 했음)
코드를 돌리면 텍스트로 결과는 나오나 그래프가 출력이 안됩니다. 그래프 출력 시 메모리 이슈로 아래와 같이 에러가 발생합니다. 확인 부탁드립니다.
수정 : matplotlib 버전이 달라 발생하는 문제인것 같습니다. 현재 matplotlib 버전은 3.3.4인데 다운그래이드 해서 개발자님과 동일한 버전에서 실행해 보겠습니다. → 개발자님 버전도 3.3.4 로 동일 하지만 코드 실행 안되고 동일한 메모리 에러 발생
수정2 : Spyder를 사용해서 코드를 실행하는데, spyder에서 matplotlib 사용 시 발생되는 문제라고 하는 군요. 다른 방식으로 시도해 보겠습니다.
실행코드 from datetime import datetime import backtrader as bt import pandas as pd from Analyzer import MarketDB
class MyStrategy(bt.Strategy): # ① def init(self): self.rsi = bt.indicators.RSI(self.data.close) # ② def next(self): # ③ if not self.position: if self.rsi < 30: self.order = self.buy() else: if self.rsi > 70: self.order = self.sell()
mk=MarketDB() df=mk.get_daily_price('NAVER')
df.date=pd.to_datetime(df.date)
data = bt.feeds.PandasData(dataname=df, datetime='date')
cerebro = bt.Cerebro() # ④ cerebro.addstrategy(MyStrategy)
cerebro.adddata(data) cerebro.broker.setcash(10000000)
cerebro.addsizer(bt.sizers.SizerFix, stake=30)
print(f'Initial Portfolio Value : {cerebro.broker.getvalue():,.0f} KRW') cerebro.run() print(f'Final Portfolio Value : {cerebro.broker.getvalue():,.0f} KRW') cerebro.plot()
에러 문구 start_date is initialized to '2021-02-10' end_date is initialized to '2022-02-10' Initial Portfolio Value : 10,000,000 KRW Final Portfolio Value : 9,895,000 KRW