INVESTAR / StockAnalysisInPython

452 stars 411 forks source link

7.6.3 RSI를 이용한 단순 백테스트 시 메모리 관련 문제 발생 #132

Open whxh opened 2 years ago

whxh commented 2 years ago

백테스트 시 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

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