Using tradingview csv file for backtest
-
Hi all,
I'm trying to use a tradingview CSV export for backtesting but I cant seem to get the data correct, I keep getting a value error on the time date format wondering if anyone has done it before?
-
@jordan-miranda-hickey what’s the difference between a trading view csv vs a normal csv? Also can you share the code you are using
-
@vypy1 sure:
import backtrader as bt import backtrader.analyzers as btanalyzers import pandas as pd import matplotlib from datetime import datetime import qgrid from tvDatafeed import TvDatafeed, Interval #username = 'YourTradingViewUsername' #password = 'YourTradingViewPassword' tv = TvDatafeed() # index symboldata= tv.get_hist(symbol='ADAUSDT',exchange='BYBIT',interval=Interval.in_15_minute,n_bars=20000) symboldata.to_csv('data.csv') class MaCrossStrategy(bt.Strategy): params = ( ('fast_length', 10), ('slow_length', 50) ) def __init__(self): ma_fast = bt.ind.SMA(period = self.params.fast_length) ma_slow = bt.ind.SMA(period = self.params.slow_length) self.crossover = bt.ind.CrossOver(ma_fast, ma_slow) def next(self): if not self.position: if self.crossover > 0: self.buy() elif self.crossover < 0: self.close() cerebro = bt.Cerebro() #data = bt.feeds.YahooFinanceData(dataname = 'BTC', fromdate = datetime(2021, 1, 1), todate = datetime(2022, 12, 1)) data = bt.feeds.GenericCSVData(dataname = 'data.csv',dtformat=('%d-%m-%y')) cerebro.adddata(data) cerebro.broker.setcash(1000000.0) cerebro.addsizer(bt.sizers.PercentSizer, percents = 10) cerebro.addanalyzer(btanalyzers.SharpeRatio, _name = "sharpe") cerebro.addanalyzer(btanalyzers.DrawDown, _name = "drawdown") cerebro.addanalyzer(btanalyzers.Returns, _name = "returns") back = cerebro.run() par_list = [[x[0].params.fast_length, x[0].params.slow_length, x[0].analyzers.returns.get_analysis()['rnorm100'], x[0].analyzers.drawdown.get_analysis()['max']['drawdown'], x[0].analyzers.sharpe.get_analysis()['sharperatio'] ] for x in back] par_df = pd.DataFrame(par_list, columns = ['length_fast', 'length_slow', 'return', 'dd', 'sharpe']) qgrid.show_grid(par_df)
however when i run it i get this error:
Traceback (most recent call last):
File "c:\Users\Jordan\Desktop\backtester\backtest.py", line 42, in <module>
cerebro.adddata(data)
File "C:\Users\Jordan\AppData\Local\Programs\Python\Python310\lib\site-packages\backtrader\cerebro.py", line 757, in adddata
data._id = next(self._dataid)
AttributeError: 'NoneType' object has no attribute '_id'
File "C:\Users\Jordan\AppData\Local\Programs\Python\Python310\lib\site-packages\backtrader\cerebro.py", line 1212, in runstrategies
data.preload()
File "C:\Users\Jordan\AppData\Local\Programs\Python\Python310\lib\site-packages\backtrader\feed.py", line 688, in preload
while self.load():
File "C:\Users\Jordan\AppData\Local\Programs\Python\Python310\lib\site-packages\backtrader\feed.py", line 479, in load
_loadret = self._load()
File "C:\Users\Jordan\AppData\Local\Programs\Python\Python310\lib\site-packages\backtrader\feed.py", line 710, in _load
return self._loadline(linetokens)
File "C:\Users\Jordan\AppData\Local\Programs\Python\Python310\lib\site-packages\backtrader\feeds\csvgeneric.py", line 114, in _loadline
dt = datetime.strptime(dtfield, dtformat)
File "C:\Users\Jordan\AppData\Local\Programs\Python\Python310\lib_strptime.py", line 568, in _strptime_datetime
tt, fraction, gmtoff_fraction = _strptime(data_string, format)
File "C:\Users\Jordan\AppData\Local\Programs\Python\Python310\lib_strptime.py", line 349, in _strptime
raise ValueError("time data %r does not match format %r" %
ValueError: time data '2022-10-01 01:00:00' does not match format '%d-%m-%y' -
@jordan-miranda-hickey your GV data date format seems to be a timezone aware format, the format you have mentioned in the parameters in not the same, try including the hours, minutes and seconds format too. Also year should be represented with %Y I believe.
-
@vypy1 unfortunately no luck it still doesn't like it not entirely sure why i tried like this :
data = bt.feeds.GenericCSVData(dataname = 'data.csv',dtformat=('%d-%m-%Y %H:%M:%S'))
still the same error
-
@jordan-miranda-hickey I think the format should be %Y-%m-%d %H:%M:%S, I can see that the file has year first
"time data '2022-10-01 01:00:00' does not match format '%d-%m-%y'"
-
@jordan-miranda-hickey Add a space between date and time
-
@vypy1 said in Using tradingview csv file for backtest:
%Y-%m-%d %H:%M:%S
thank you so much
I'm such a muppet I've been opening up the CSV to view the format and didn't realise that the code was reading it differently to what excel was, but its now does not liking the symbol
ValueError: could not convert string to float: 'BYBIT:ADAUSDT'
-
@jordan-miranda-hickey Not sure why. An alternate maybe to read the csv in as a dataframe and use pandasdataframe to add data.
-
@vypy1 how would i go about that?
-
@jordan-miranda-hickey You can refer to this Pandas Datafeed.
Just read in your csv with pandas and follow the documentation.