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

Is this a sufficient program for backtesting ?



  • Hi,
    In order to understand BackTrader I wanted to write a simple backtesting program on my own. Please take a look at the code and point out anything I might have missed out, diverted from, or areas where I lack understanding of how a backtesting system should function. Any other suggestion is also welcome. Thanks in advance.

    import talib, pandas, math
    
    class SimpleBacktest():
    
        def __init__(self):
            self.cash = 100000
            self.comm = 0.002815
            self.position = False
    
            # reading dataframe from CSV
            self.df = pandas.read_csv('data_csv.csv', delimiter=',') # please use your own CSV I am sure you have one handy
            self.df = self.df.astype({'close': 'float64', 'high': 'float64', 'low': 'float64', 'open': 'float64', 'timestamp': 'int64', 'volume': 'int64'})
        
    
        def calc_ti(self):
            self.df['sar'] = talib.SAR(self.df['high'], self.df['low'])
            
        def reset_df(self):
            self.df.dropna(inplace=True)
            self.df.reset_index(drop=True, inplace=True)
            self.r, self.c = self.df.shape
        
    
        def execute(self):
            for i in range(1, self.r):
                if self.df['sar'].loc[[i-1]].values < self.df['close'].iloc[[i-1]].values:
                    if self.position == False:
                        c = self.cash * self.comm # calculating commission
                        self.cash = self.cash - c # substracting commission from cash
                        self.qty = math.floor(self.cash / self.df['close'].loc[[i]].values)
                        self.cash = self.cash - (self.qty * self.df['close'].loc[[i]].values)
                        self.position = True
                        self.tgt_price = math.ceil(self.df['close'].loc[[i]].values + (self.df['close'].loc[[i]].values * 0.03))
                        self.invested = self.qty * self.df['close'].loc[[i]].values + self.c
                        print('Bought ', str(self.qty), ' shares @ ', str(self.df['close'].loc[[i]].values), 'Balance is: ', str(self.cash), 'taxes & charges: ', str(c), 'target price:', str(self.tgt_price))
                
                if self.df['sar'].loc[[i-1]].values > self.df['close'].iloc[[i-1]].values:
                    if self.df['close'].loc[[i-1]].values >= self.tgt_price:
                        if self.position == True:
                            self.cash = self.cash + (self.qty * self.df['close'].loc[[i]].values)
                            self.c = self.cash * self.comm
                            self.cash = self.cash - self.c
                            self.pnl = self.cash - self.invested
                            print('Sold   ', str(self.qty), ' shares @ ', str(self.df['close'].loc[[i]].values), 'Balance is: ', str(self.cash), 'taxes & charges: ', str(c), 'profit/loss: ', str(self.pnl))
                            self.qty = 0
                            self.position = False
                        
                if i == self.r-1:
                    if self.position == True:
                        self.cash = self.cash + (self.qty * self.df['close'].loc[[i]].values)
                        self.c = self.cash * self.comm
                        self.cash = self.cash - self.c
                        self.pnl = self.cash - self.invested
                        print('Sold   ', str(self.qty), ' shares @ ', str(self.df['close'].loc[[i]].values), 'Balance is: ', str(self.cash), 'taxes & charges: ', str(c), 'profit/loss: ', str(self.pnl))
                        self.qty = 0
                        self.position = False
                        # total profit or loss
                    print('\ntotal profit / loss: ', self.cash - 100000)
    
    tl = Talibtest()
    tl.calc_ti()
    tl.reset_df()
    tl.execute()
    

Log in to reply
 

});