Navigation

    Backtrader Community

    • Register
    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    For code/output blocks: Use ``` (aka backtick or grave accent) in a single line before and after the block. See: http://commonmark.org/help/

    Possible division by zero in `AnnualReturn`

    General Code/Help
    2
    4
    1304
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Maxim Korobov
      Maxim Korobov last edited by

      I'm optimizing parameters for strategy.
      Sometimes when strategy is full of fear, so perform no action. In suck situations ZeroDivisionError: float division by zero occur.

      Traceback (most recent call last):
        File "D:/Projects/trading-bot/main/lab/backtrader/morning_buy.py", line 86, in <module>
      	strategies = back_trader.run(timeframe=bt.TimeFrame.Minutes)
        File "C:\Users\Home\Anaconda3\lib\site-packages\backtrader\cerebro.py", line 794, in run
      	runstrat = self.runstrategies(iterstrat)
        File "C:\Users\Home\Anaconda3\lib\site-packages\backtrader\cerebro.py", line 927, in runstrategies
      	strat._stop()
        File "C:\Users\Home\Anaconda3\lib\site-packages\backtrader\strategy.py", line 421, in _stop
      	analyzer._stop()
        File "C:\Users\Home\Anaconda3\lib\site-packages\backtrader\analyzer.py", line 194, in _stop
      	self.stop()
        File "C:\Users\Home\Anaconda3\lib\site-packages\backtrader\analyzers\annualreturn.py", line 84, in stop
      	annualret = (value_end / value_start) - 1.0
      ZeroDivisionError: float division by zero
      

      I checked that

      b_trader.broker.setcash(1000.0)
      

      was called earlier.

      1 Reply Last reply Reply Quote 0
      • B
        backtrader administrators last edited by

        AnnualReturn is really a relic. It was superseded by TimeReturn which is configurable for different timeframes and can even track datas

        In any case that error seems likely to happen when there has been no year change in the data.

        1 Reply Last reply Reply Quote 0
        • Maxim Korobov
          Maxim Korobov last edited by

          Thanks for suggestion, I replace it with:

          back_trader.addanalyzer(TimeReturn, timeframe=bt.TimeFrame.Years, _name='annualreturn')
          

          Looks loke pretty the same for SharpeRatio:

          Traceback (most recent call last):
            File "D:/Projects/trading-bot/main/lab/backtrader/morning_buy.py", line 87, in <module>
          	strategies = back_trader.run(timeframe=bt.TimeFrame.Minutes)
            File "C:\Users\Home\Anaconda3\lib\site-packages\backtrader\cerebro.py", line 794, in run
          	runstrat = self.runstrategies(iterstrat)
            File "C:\Users\Home\Anaconda3\lib\site-packages\backtrader\cerebro.py", line 927, in runstrategies
          	strat._stop()
            File "C:\Users\Home\Anaconda3\lib\site-packages\backtrader\strategy.py", line 421, in _stop
          	analyzer._stop()
            File "C:\Users\Home\Anaconda3\lib\site-packages\backtrader\analyzer.py", line 194, in _stop
          	self.stop()
            File "C:\Users\Home\Anaconda3\lib\site-packages\backtrader\analyzers\sharpe.py", line 173, in stop
          	ret_free_avg = average(ret_free)
            File "C:\Users\Home\Anaconda3\lib\site-packages\backtrader\mathsupport.py", line 38, in average
          	return math.fsum(x) / (len(x) - bessel)
          ZeroDivisionError: float division by zero
          1 Reply Last reply Reply Quote 0
          • B
            backtrader administrators last edited by

            That happens because the SharpeRatio is being used with less data than the timeframe with which is working.

            @Maxim-Korobov said in Possible division by zero in `AnnualReturn`:

                       ret_free = [r - rate for r in returns]
                       ret_free_avg = average(ret_free)
            

            The average fails because the number of returns is 0

            Change the timeframe of the analyzer to something for which returns can be generated.

            1 Reply Last reply Reply Quote 0
            • 1 / 1
            • First post
              Last post
            Copyright © 2016, 2017, 2018 NodeBB Forums | Contributors
            $(document).ready(function () { app.coldLoad(); }); }