pythonbacktrader

Can't convert from timestamp to date


I am developing a backtesting strategy along with backtrader. I am feeding cerebro with generic csv data that goes like this:

1502942400000,4261.48000000,4280.56000000,4261.32000000,4261.45000000,11.30892600,1502944199999,48224.75400837,49,3.93617400,16793.03995768,7922.57993329

The first attribute is the timestamp, as shown an int, so when adding the data I choose dtformat=1:

data = bt.feeds.GenericCSVData(dataname="./file.csv", dtformat=1)
cerebro.adddata(data)

When I call cerebro.run(), I keep getting the same error:

Traceback (most recent call last):
  File "C:\Users\jorge\Desktop\cerebro\btc.py", line 8, in <module>
    cerebro.run()
  File "C:\Users\jorge\Desktop\cerebro\env\lib\site-packages\backtrader\cerebro.py", line 1127, in run
    runstrat = self.runstrategies(iterstrat)
  File "C:\Users\jorge\Desktop\cerebro\env\lib\site-packages\backtrader\cerebro.py", line 1212, in runstrategies
    data.preload()
  File "C:\Users\jorge\Desktop\cerebro\env\lib\site-packages\backtrader\feed.py", line 688, in preload
    while self.load():
  File "C:\Users\jorge\Desktop\cerebro\env\lib\site-packages\backtrader\feed.py", line 479, in load
    _loadret = self._load()
  File "C:\Users\jorge\Desktop\cerebro\env\lib\site-packages\backtrader\feed.py", line 710, in _load
    return self._loadline(linetokens)
  File "C:\Users\jorge\Desktop\cerebro\env\lib\site-packages\backtrader\feeds\csvgeneric.py", line 116, in _loadline
    dt = self._dtconvert(dtfield)
  File "C:\Users\jorge\Desktop\cerebro\env\lib\site-packages\backtrader\feeds\csvgeneric.py", line 96, in <lambda>
    self._dtconvert = lambda x: datetime.utcfromtimestamp(int(x))
OSError: [Errno 22] Invalid argument

I can't manage to figure out why it cannot be converted, also tried with dtformat=2, but in that case fails because it expects a float.

Here is the full code:

import backtrader as bt

cerebro = bt.Cerebro()
cerebro.broker.setcash(1000)
data = bt.feeds.GenericCSVData(dataname="./file.csv", dtformat=1)
print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
cerebro.adddata(data)
cerebro.run()
cerebro.plot()
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())

I appreciate any help you can lend me,

Thank you!


Solution

  • This should work for you:

    import datetime
    data = bt.feeds.GenericCSVData(
         dtformat=lambda x: datetime.datetime.utcfromtimestamp(int(x) / 1000))