For code/output blocks: Use ``` (aka backtick or grave accent) in a single line before and after the block. See: http://commonmark.org/help/

[YahooFinanceData] FileNotFoundError



  • Hello, thanks for your work!

    I'm having an issue with YahooFinanceData feed – it raises an exception after calling cerebro.run. I'm using sample code from GH repo:

    from datetime import datetime
    import backtrader as bt
    
    
    class SmaCross(bt.SignalStrategy):
        def __init__(self):
            sma1 = bt.ind.SMA(period=10)
            sma2 = bt.ind.SMA(period=30)
            crossover = bt.ind.CrossOver(sma1, sma2)
            self.signal_add(bt.SIGNAL_LONG, crossover)
    
    
    cerebro = bt.Cerebro()
    cerebro.addstrategy(SmaCross)
    
    data0 = bt.feeds.YahooFinanceData(dataname='YHOO',
                                      fromdate=datetime(2011, 1, 1),
                                      todate=datetime(2012, 12, 31))
    
    cerebro.adddata(data0)
    
    cerebro.run()
    cerebro.plot()
    

    How does actual exception look like:

    Traceback (most recent call last):
      File "backtrade/strategy.py", line 25, in <module>
        cerebro.run()
      File "/Users/env/lib/python3.6/site-packages/backtrader/cerebro.py", line 1117, in run
        runstrat = self.runstrategies(iterstrat)
      File "/Users/env/lib/python3.6/site-packages/backtrader/cerebro.py", line 1194, in runstrategies
        data._start()
      File "/Users/env/lib/python3.6/site-packages/backtrader/feed.py", line 203, in _start
        self.start()
      File "/Users/env/lib/python3.6/site-packages/backtrader/feeds/yahoo.py", line 456, in start
        super(YahooFinanceData, self).start()
      File "/Users/env/lib/python3.6/site-packages/backtrader/feeds/yahoo.py", line 90, in start
        super(YahooFinanceCSVData, self).start()
      File "/Users/env/lib/python3.6/site-packages/backtrader/feed.py", line 671, in start
        self.f = io.open(self.p.dataname, 'r')
    FileNotFoundError: [Errno 2] No such file or directory: 'YHOO'
    

    Info: CPython v3.6.1


    I have investigated the problen so resolving chain looks like this:

    (/feeds/yahoo.py): YahooFinanceData.start --> YahooFinanceData.super().start --> YahooFinanceCSVData.super().start -->
    (/feed.py): CSVDataBase.start --> FileNotFoundError

    It actually tries to check if a string (dataname) has the readline attribute:

    # NOTE: Returns true
    if self.f is None:
        # NOTE: Returns false for the string
        if hasattr(self.p.dataname, 'readline'):
            self.f = self.p.dataname
        else:
            # Let an exception propagate to let the caller know
            self.f = io.open(self.p.dataname, 'r')  # <- raises FileNotFoundError
    

  • administrators

    This is a hidden feature and a problem following the Yahoo API fiasco. First:

    • YHOO seems to no longer be available as ticker. Even if you aren't religious the proper exclamation here would be: "God knows why!"

      Try YHOO.MX for example

    Then:

    • In case the on-line data feed cannot open the network connection and by means of using the base class it will try to open a file of the same name located in the current directory

    This was used several times for the samples when no network connection was available but the file had been pre-downloaded.



  • Hi,

    I tried using YHOO.MX and it still gives me the same error. What can I do now?



  • Use a provider which isn't Yahoo? Unless you have been under a rock during 2017, it is well known that Yahoo is no longer a data provider to be used.

    The API was taken down, a new was found but has quirks included by Yahoo (column swapping, price removals, ...) ...



  • Please can anyone advise how we can swap these yahoo codes to workable codes



  • Self answer again, do an explicit path reference:
    modpath = os.path.dirname(os.path.abspath(sys.argv[0]))
    datapath = os.path.join(os.getcwd(), 'backtrader-master/datas/orcl-1995-2014.txt')

    data0 = bt.feeds.YahooFinanceData(dataname=datapath , fromdate=datetime(2011, 1, 1),
    todate=datetime(2012, 12, 31))



  • live yahoo feeds had some issue, swapped to quandl feeds instead