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/

    Unable to export exact results of optstrategy to CSV

    Indicators/Strategies/Analyzers
    2
    3
    1212
    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.
    • J
      John Land last edited by

      Hi, I am trying to export the results of the optstrategy to a csv file in the stop function but I have tried it multiple times and everytime one or more lines are missing in the output csv file. It works fine when printed to the console. Below is the code:

      from __future__ import (absolute_import, division, print_function,
                              unicode_literals)
      
      import datetime  # For datetime objects
      import os.path  # To manage paths
      import sys  # To find out the script name (in argv[0])
      import backtrader.feeds as btfeeds
      import csv
      import pandas
      # Import the backtrader platform
      import backtrader as bt
      
      
      # Create a Stratey
      class TestStrategy(bt.Strategy):
          params = (
              ('maperiod', 15),
              ('printlog', False),
          )
          
          def log(self, txt, dt=None, doprint=False):
              ''' Logging function fot this strategy'''
              if self.params.printlog or doprint:
                  dt = dt or self.datas[0].datetime.date(0)
                  print('%s, %s' % (dt.isoformat(), txt))
      
          def __init__(self):
              # Keep a reference to the "close" line in the data[0] dataseries
              self.dataclose = self.datas[0].close
      
              # To keep track of pending orders and buy price/commission
              self.order = None
              self.buyprice = None
              self.buycomm = None
      
              # Add a MovingAverageSimple indicator
              self.sma = bt.indicators.SimpleMovingAverage(
                  self.datas[0], period=self.params.maperiod)
      
          def notify_order(self, order):
              if order.status in [order.Submitted, order.Accepted]:
                  # Buy/Sell order submitted/accepted to/by broker - Nothing to do
                  return
      
              # Check if an order has been completed
              # Attention: broker could reject order if not enougth cash
              if order.status in [order.Completed, order.Canceled, order.Margin]:
                  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)
      
              # Write down: no pending order
              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):
              # Simply log the closing price of the series from the reference
              self.log('Close, %.2f' % self.dataclose[0])
      
              # Check if an order is pending ... if yes, we cannot send a 2nd one
              if self.order:
                  return
      
              # Check if we are in the market
              if not self.position:
      
                  # Not yet ... we MIGHT BUY if ...
                  if self.dataclose[0] > self.sma[0]:
      
                      # BUY, BUY, BUY!!! (with all possible default parameters)
                      self.log('BUY CREATE, %.2f' % self.dataclose[0])
      
                      # Keep track of the created order to avoid a 2nd order
                      self.order = self.buy()
      
              else:
      
                  if self.dataclose[0] < self.sma[0]:
                      # SELL, SELL, SELL!!! (with all possible default parameters)
                      self.log('SELL CREATE, %.2f' % self.dataclose[0])
      
                      # Keep track of the created order to avoid a 2nd order
                      self.order = self.sell()
      
          def stop(self):
              self.log('(MA Period %2d) Ending Value %.2f' %
                       (self.params.maperiod, self.broker.getvalue()), doprint=True)
              items = [self.params.maperiod, self.broker.startingcash, self.broker.getvalue()]
              b = open('test.csv', 'a', newline='')
              a = csv.writer(b)
              a.writerow(items)
              b.close()
              
      if __name__ == '__main__':
          # Create a cerebro entity
          cerebro = bt.Cerebro()
          
          # Add a strategy
          strats = cerebro.optstrategy(
              TestStrategy,
              maperiod=range(25,35))
      
         
          datapath = ('data.csv')
          
          df = pandas.read_csv(datapath,parse_dates=True,index_col=0)
      
          return_df = df['6/20/2018':'6/30/2018']
          
          data = bt.feeds.PandasData(dataname=return_df)
          # Add the Data Feed to Cerebro
          cerebro.adddata(data)
      
          # Set our desired cash start
          cerebro.broker.setcash(10000.0)
      
          # Add a FixedSize sizer according to the stake
          cerebro.addsizer(bt.sizers.FixedSize, stake=10)
      
          # Set the commission
          cerebro.broker.setcommission(commission=0.0)
      
          # Run over everything
          cerebro.run()  # list of list
      
      #
      

      The output csv is always missing some lines as shown below:

      26,10000.0,10291.39999999999
      28,10000.0,10338.699999999997
      27,10000.0,10321.899999999994
      31,10000.0,10313.200000000012
      30,10000.0,10312.200000000008
      32,10000.0,10302.400000000001
      33,10000.0,10293.2
      34,10000.0,10282.500000000004
      

      I even tried writing to a txt file but got the same problem. It might be something silly I am doing or some problem with my system, can anybody please help?

      yongmou 1 Reply Last reply Reply Quote 0
      • J
        John Land last edited by

        Nevermind I got the results with analyzers and everything is sorted for now.

        1 Reply Last reply Reply Quote 0
        • yongmou
          yongmou @John Land last edited by

          @john-land
          cerebro = bt.Cerebro(optreturn=False)

          set optreturn false when create cerebo

          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(); }); }