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



  • 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?



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



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

    set optreturn false when create cerebo