Backtrader Community

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

    Pair Trading with minutes data

    Indicators/Strategies/Analyzers
    2
    7
    3980
    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.
    • G
      GwadaMan last edited by

      Hi,

      Since I upgrade my BT at last version, hours, minutes or secondes are not processes any more.
      It's look like BT is blocked at only day level.

      FYI : I setup timeframe and compression but it's still bloking to the first date to the first day "2016-11-29T23:59:59.999989".
      cerebro.resampledata(data0,timeframe=tframes[args.timeframe], compression=args.compression)
      cerebro.resampledata(data1,timeframe=tframes[args.timeframe], compression=args.compression)

      Could you provide a version of pair-trading contribution working with minutes data ?

      Regards,

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

        To properly provide an answer one would need some pieces of the puzzle.

        A long shot: you are not loading the data feed with the proper timeframe/compression information.

        1 Reply Last reply Reply Quote 0
        • G
          GwadaMan last edited by backtrader

          :Here a part of the source code with the timeframe/compression setting

          def runstrategy():
              args = parse_args()
          
              # Create a cerebro
              cerebro = bt.Cerebro()
          
              # Get the dates from the args
              fromdate = datetime.datetime(2016, 11, 25) # datetime.datetime.strptime(args.fromdate, '%Y-%m-%d')
              todate = datetime.datetime(2016, 12, 02) # datetime.datetime.strptime(args.todate, '%Y-%m-%d')
          
              # Create the 1st data
              tframes = dict(
                  secondes=bt.TimeFrame.Seconds,
                  minutes=bt.TimeFrame.Minutes,
                  days=bt.TimeFrame.Days,
                  weeks=bt.TimeFrame.Weeks,
                  months=bt.TimeFrame.Months,
                  years=bt.TimeFrame.Years)
          
              # Create the 1st data
              """
              data0 = btfeeds.YahooFinanceCSVData(
                  dataname=args.data0,
                  fromdate=fromdate,
                  todate=todate)
              """
              data0 = btfeeds.GenericCSVData(
                  dataname=args.data0,
          
                  fromdate=fromdate,
                  todate=todate,
          
                  nullvalue=0.0,
          
                  dtformat=('%Y-%m-%d %H:%M:%S'),
                  datetime=0,
                  high=2,
                  low=3,
                  open=1,
                  close=4,
                  volume=5,
                  openinterest=-1,
              )
          
              # Add the 1st data to cerebro
              cerebro.adddata(data0)
          
              # Create the 2nd data
              """
              data1 = btfeeds.YahooFinanceCSVData(
                  dataname=args.data1,
                  fromdate=fromdate,
                  todate=todate)
              """
              data1 = btfeeds.GenericCSVData(
                  dataname=args.data1,
          
                  fromdate=fromdate,
                  todate=todate,
          
                  nullvalue=0.0,
          
                  dtformat=('%Y-%m-%d %H:%M:%S'),
                  datetime=0,
                  high=2,
                  low=3,
                  open=1,
                  close=4,
                  volume=5,
                  openinterest=-1,
              )
          
              # Add the 2nd data to cerebro
              cerebro.adddata(data1)
          
          
              cerebro.resampledata(data0,timeframe=tframes[args.timeframe], compression=args.compression)
              # Create the 2nd data
              # Add the 2nd data to cerebro
              #cerebro.adddata(data1)
              cerebro.resampledata(data1,timeframe=tframes[args.timeframe], compression=args.compression)
          
              # Add the strategy
              cerebro.addstrategy(PairTradingStrategy,
                                  period=args.period,
                                  stake=args.stake)
          
              # Add the commission - only stocks like a for each operation
              cerebro.broker.setcash(args.cash)
          
              # Add the commission - only stocks like a for each operation
              cerebro.broker.setcommission(commission=args.commperc)
          
              # And run it
              cerebro.run(runonce=not args.runnext,
                          preload=not args.nopreload,
                          oldsync=args.oldsync)
          
              # Plot if requested
              if args.plot:
                  cerebro.plot(numfigs=args.numfigs, volume=False, zdown=False)
          
          
          def parse_args():
              parser = argparse.ArgumentParser(description='MultiData Strategy')
          
              parser.add_argument('--data0', '-d0',
                                  default='intra-DDD.csv',
                                  help='1st data into the system')
          
              parser.add_argument('--data1', '-d1',
                                  default='intra-SSYS.csv',
                                  help='2nd data into the system')
          
              parser.add_argument('--fromdate', '-f',
                                  default='1997-01-01',
                                  help='Starting date in YYYY-MM-DD format')
          
              parser.add_argument('--todate', '-t',
                                  default='1998-06-01',
                                  help='Starting date in YYYY-MM-DD format')
          
              group = parser.add_mutually_exclusive_group()
              group.add_argument('--tframe', default='years', required=False,
                                 choices=['days', 'weeks', 'months', 'years'],
                                 help='TimeFrame for the returns/Sharpe calculations')
          
              group.add_argument('--legacyannual', action='store_true',
                                 help='Use legacy annual return analyzer')
          
          
              pgroup = parser.add_mutually_exclusive_group(required=False)
          
              pgroup.add_argument('--replay',
                                  required=False, action='store_true',
                                  help='replay to chosen timeframe')
          
              pgroup.add_argument('--resample', default = True,
                                  required=False, action='store_true',
                                  help='resample to chosen timeframe')
          
              parser.add_argument('--timeframe', default='minutes',
                                  choices=bt.TimeFrame.Names,
                                  required=False, action='store',
                                  help='TimeFrame for Resample/Replay')
          
              parser.add_argument('--compression', default=1, type=int,
                                  required=False, action='store',
                                  help='Compression for Resample/Replay')
          
              parser.add_argument('--timeframe1', default=True,
                                  choices=bt.TimeFrame.Names,
                                  required=False, action='store',
                                  help='TimeFrame for Resample/Replay - Data1')
          
              parser.add_argument('--compression1', default=None, type=int,
                                  required=False, action='store',
                                  help='Compression for Resample/Replay - Data1')
          
              parser.add_argument('--period', default=10, type=int,
                                  help='Period to apply to the Simple Moving Average')
          
              parser.add_argument('--cash', default=100000, type=int,
                                  help='Starting Cash')
          
              parser.add_argument('--runnext', action='store_true',
                                  help='Use next by next instead of runonce')
          
              parser.add_argument('--nopreload', action='store_true',
                                  help='Do not preload the data')
          
              parser.add_argument('--oldsync', action='store_true',
                                  help='Use old data synchronization method')
          
              parser.add_argument('--commperc', default=0.005, type=float,
                                  help='Percentage commission (0.005 is 0.5%%')
          
              parser.add_argument('--stake', default=10, type=int,
                                  help='Stake to apply in each operation')
          
              parser.add_argument('--plot', '-p', default=True, action='store_true',
                                  help='Plot the read data')
          
              parser.add_argument('--numfigs', '-n', default=1,
                                  help='Plot using numfigs figures')
          
              return parser.parse_args()
          
          
          if __name__ == '__main__':
              runstrategy()
          
          B 1 Reply Last reply Reply Quote 1
          • B
            backtrader administrators @GwadaMan last edited by

            @GwadaMan said in Pair Trading with minutes data:

            data0 = btfeeds.GenericCSVData(
                dataname=args.data0,
            
                fromdate=fromdate,
                todate=todate,
            
                nullvalue=0.0,
            
                dtformat=('%Y-%m-%d %H:%M:%S'),
                datetime=0,
                high=2,
                low=3,
                open=1,
                close=4,
                volume=5,
                openinterest=-1,
            )
            

            timeframe? compression?

            G 1 Reply Last reply Reply Quote 0
            • G
              GwadaMan @backtrader last edited by

              @backtrader the code is splited. Does it miss something ? I didn't undestand your question.

              cerebro.resampledata(data0,timeframe=tframes[args.timeframe], compression=args.compression)
              cerebro.resampledata(data1,timeframe=tframes[args.timeframe], compression=args.compression)

              parser.add_argument('--timeframe', default='minutes',
              choices=bt.TimeFrame.Names,
              required=False, action='store',
              help='TimeFrame for Resample/Replay')

              parser.add_argument('--compression', default=1, type=int,
              required=False, action='store',
              help='Compression for Resample/Replay')

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

                The code is not formatted because you have not added 3-tick marks (see the top of the page) before and after the code.

                You are instantiating the data feed without any timeframe / compression indication. Same issue today: https://community.backtrader.com/topic/290/is-this-a-valid-way-of-analyzing-multiple-timeframes

                G 1 Reply Last reply Reply Quote 0
                • G
                  GwadaMan @backtrader last edited by

                  @backtrader thx I fixed it with your help !!!

                  1 Reply Last reply Reply Quote 0
                  • 1 / 1
                  • First post
                    Last post
                  Copyright © 2016, 2017, 2018, 2019, 2020, 2021 NodeBB Forums | Contributors