For code/output blocks: Use ``` (aka backtick or grave accent) in a single line before and after the block. See: http://commonmark.org/help/
ValueError: could not convert string to float: '10:00:00' when trying to backtest on intraday data
-
As the title suggests, I am having problems loading intraday data into my code. It is giving ValueError, but I don't know why.
Here is my code:from __future__ import (absolute_import, division, print_function, unicode_literals) import datetime import os.path import sys import backtrader as bt class TestStrategy(bt.Strategy): params = ( ('exitbars', 5), ) def log(self, txt, dt=None): ''' Logging function fot this strategy''' dt = dt or self.datas[0].datetime.date(0) print('%s, %s' % (dt.isoformat(), txt)) def __init__(self): self.dataclose = self.datas[0].close self.order = None self.buyprice = None self.buycomm = None def notify_order(self, order): if order.status in [order.Submitted, order.Accepted]: return if order.status in [order.Completed]: if order.isbuy(): self.log( 'BUY EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' % (order.executed.price, order.executed.value, order.executed.comm)) self.buyprice = order.executed.price self.buycomm = order.executed.comm else: # Sell self.log('SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' % (order.executed.price, order.executed.value, order.executed.comm)) self.bar_executed = len(self) elif order.status in [order.Canceled, order.Margin, order.Rejected]: self.log('Order Canceled/Margin/Rejected') self.order = None def notify_trade(self, trade): if not trade.isclosed: return self.log('OPERATION PROFIT, GROSS %.2f, NET %.2f' % (trade.pnl, trade.pnlcomm)) def next(self): self.log('Close, %.2f' % self.dataclose[0]) if self.order: return if not self.position: if self.dataclose[0] < self.dataclose[-1]: if self.dataclose[-1] < self.dataclose[-2]: self.log('BUY CREATE, %.2f' % self.dataclose[0]) self.order = self.buy() else: if len(self) >= (self.bar_executed + self.params.exitbars): # SELL, SELL, SELL!!! (with all possible default parameters) self.log('SELL CREATE, %.2f' % self.dataclose[0]) self.order = self.sell() if __name__ == '__main__': cerebro = bt.Cerebro() cerebro.addstrategy(TestStrategy) data = bt.feeds.BacktraderCSVData(dataname="dat.csv") cerebro.adddata(data) cerebro.broker.setcash(100000.0) cerebro.addsizer(bt.sizers.FixedSize, stake=25) print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue()) cerebro.run() cerebro.plot() print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
Here is the error it is giving me:
Starting Portfolio Value: 100000.00 Traceback (most recent call last): File "code.py", line 79, in <module> cerebro.run() File "C:\Users\Brian\AppData\Local\Programs\Python\Python37-32\lib\site-packages\backtrader\cerebro.py", line 1127, in run runstrat = self.runstrategies(iterstrat) File "C:\Users\Brian\AppData\Local\Programs\Python\Python37-32\lib\site-packages\backtrader\cerebro.py", line 1212, in runstrategies data.preload() File "C:\Users\Brian\AppData\Local\Programs\Python\Python37-32\lib\site-packages\backtrader\feed.py", line 688, in preload while self.load(): File "C:\Users\Brian\AppData\Local\Programs\Python\Python37-32\lib\site-packages\backtrader\feed.py", line 479, in load _loadret = self._load() File "C:\Users\Brian\AppData\Local\Programs\Python\Python37-32\lib\site-packages\backtrader\feed.py", line 710, in _load return self._loadline(linetokens) File "C:\Users\Brian\AppData\Local\Programs\Python\Python37-32\lib\site-packages\backtrader\feeds\btcsv.py", line 52, in _loadline self.lines.open[0] = float(next(itoken)) ValueError: could not convert string to float: '10:00:00'
and here is a peek inside my data, which is a csv file.
Date,Time,Open,High,Low,Close,Volume 2020-04-28,10:00:00,1.16,1.16,1.15,1.16,2660 2020-04-28,10:01:00,1.16,1.16,1.155,1.1565,11098 2020-04-28,10:02:00,1.16,1.16,1.15,1.155,4958 2020-04-28,10:03:00,1.16,1.16,1.15,1.1501,45815 2020-04-28,10:04:00,1.1439,1.1499,1.14,1.1422,8953 2020-04-28,10:05:00,1.14,1.1485,1.14,1.1439,4114 2020-04-28,10:06:00,1.15,1.15,1.15,1.15,425 2020-04-28,10:07:00,1.15,1.15,1.14,1.15,8364 2020-04-28,10:08:00,1.15,1.16,1.1496,1.16,42291 2020-04-28,10:09:00,1.1501,1.16,1.15,1.16,4751 2020-04-28,10:10:00,1.15,1.155,1.15,1.155,10705 2020-04-28,10:11:00,1.1501,1.16,1.1501,1.155,2971 2020-04-28,10:12:00,1.16,1.16,1.155,1.155,1776 2020-04-28,10:13:00,1.16,1.16,1.1515,1.16,3115 2020-04-28,10:14:00,1.16,1.16,1.155,1.16,2321 2020-04-28,10:15:00,1.16,1.16,1.155,1.16,875
Any help is appreciated. Thank you!
-
You are loading the default csv datafeeder that is looking for the date only. So your second data column of time cerebro thinks is pricing data and is trying to make a float type from it.
data = bt.feeds.BacktraderCSVData(dataname="dat.csv")
Try adding it this way:
data = btfeeds.GenericCSVData( dataname='mydata.csv', dtformat=('%Y-%m-%d'), tmformat=('%H.%M.%S'), datetime=0, time=1, high=2, low=3, open=4, close=5, volume=6, openinterest=-1 )
More info and this code can be found in the docs here.
-
Thank you it worked!