Search code examples
pythonobjectback-testingbacktrader

Can you add parameters to backtrader strategy?


I am using the backtrader library.

class MA_CrossOver(bt.Strategy):

    alias = ('SMA_CrossOver',)

    params = (
        # period for the fast Moving Average
        ('fast', 10),
        # period for the slow moving average
        ('slow', 30),
        # moving average to use
        ('_movav', btind.MovAv.SMA)
    )

    def __init__(self):
        sma_fast = self.p._movav(period=self.p.fast)
        sma_slow = self.p._movav(period=self.p.slow)

        self.buysig = btind.CrossOver(sma_fast, sma_slow)

    def next(self):
        if self.position.size:
            if self.buysig < 0:
                self.sell()

        elif self.buysig > 0:
            self.buy()

I want dynamically adjust the fast and slow parameters. I tried adding **kwargs to class definition, but it doesn't work.


Solution

  • Yes, you can pass the parameters to backtrader strategy dynamically. You have to modify the __init__ function of the strategy class to get the parameters passed in during object creation. Here's an example:

    class MA_CrossOver(bt.Strategy):
    
        alias = ('SMA_CrossOver',)
    
        params = (
            # period for the fast Moving Average
            ('fast', 10),
            # period for the slow moving average
            ('slow', 30),
            # moving average to use
            ('_movav', btind.MovAv.SMA)
        )
    
        def __init__(self, params=None):
            if params != None:
                for name, val in params.items():
                    setattr(self.params, name, val)
    
            sma_fast = self.p._movav(period=self.p.fast)
            sma_slow = self.p._movav(period=self.p.slow)
    
            self.buysig = btind.CrossOver(sma_fast, sma_slow)
    
        def next(self):
            if self.position.size:
                if self.buysig < 0:
                    self.sell()
    
            elif self.buysig > 0:
                self.buy()
    

    While adding the strategy to backtrader cerebro, you can pass in a dictionary of parameters.

    strat_params = {'fast': 9, 'slow': 20}
    cerebro.addstrategy(MA_CrossOver, strat_params)