Navigation

    Backtrader Community

    • Register
    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    1. Home
    2. X-Mars
    3. Posts
    For code/output blocks: Use ``` (aka backtick or grave accent) in a single line before and after the block. See: http://commonmark.org/help/
    X
    • Profile
    • Following 0
    • Followers 0
    • Topics 1
    • Posts 2
    • Best 0
    • Groups 0

    Posts made by X-Mars

    • RE: Got 'Out of memory ' when run backtrader by two datas.

      @run-out Thank you for your reply.
      My PC have 64G memory, and AMD 5950X .
      Something wrong with my code.
      It's OK now.

      posted in General Code/Help
      X
      X-Mars
    • Got 'Out of memory ' when run backtrader by two datas.

      Dear all,

      I got 'Out of memory ' when run backtrader by two datas.
      Someone can help me?
      Thk for your job.

      These is codes.

      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 pandas as pd
      from typing import Union
      
      # Import the backtrader platform
      import backtrader as bt
      import logging, itertools
      from charts.bar import MakeBarOptinons
      from charts.line import MakeLineOptinons
      
      
      
      class BarAnalysis(bt.analyzers.Analyzer):
      
          def start(self):
              self.rets = {
                  'strategy': [],
                  'profit': [],
                  'profit_percentage': []
              }
      
          def stop(self):
              self.rets['strategy'].append(str(self.strategy.params.hours) + '--' + str(self.strategy.params.percentage) + '--' + str(self.strategy.params.portfolio))
              self.rets['profit'].append(self.strategy.broker.getvalue() - 100000)
              self.rets['profit_percentage'].append((self.strategy.broker.getvalue() - 100000) / 100000)
      
          def get_analysis(self):
              return self.rets
      
      
      class TestStrategy(bt.Strategy):
          """
              percentage 数字货币资产 占 总资产的比例
              portfolio [1] 数字货币1(BTC) 占 数字货币资产
              portfolio [2] 数字货币2(ETH) 占 数字货币资产
          """
          params = {
              'hours': 1,
              'percentage': 1,
              'portfolio': (1, 1),
              'name': 'test'
          }
      
          def log(self, txt, dt=None):
              ''' Logging function fot this strategy'''
              dt = dt or self.datas[0].datetime.datetime()
              print('%s, %s' % (dt.strftime('%Y-%m-%d %H:%M:%S'), txt))
      
          def log_write(self, txt, dt=None):
              logging.basicConfig(filename=self.params.name + '.csv',
                                  filemode='a',
                                  level=logging.INFO,
                                  format='%(asctime)s , %(message)s',
                                  datefmt='%Y-%m-%d %H:%M:%S')
              # logger = logging.getLogger('urbanGUI')
      
              dt = dt or self.datas[0].datetime.datetime()
              logging.info('%s, %s' % (dt.strftime('%Y-%m-%d %H:%M:%S'), txt))
      
          def next(self):
              if hasattr(self, 'order_datetime'):
      
                  """
                      用于买币的资金:总资产的 10%
                  """
                  cash_for_coin = self.broker.getvalue() * (self.params.percentage / 100)
      
                  current_datetime = self.data0.datetime.datetime()
                  time_ago = (current_datetime - self.order_datetime).seconds
                  # print(cash_for_coin)
      
                  if time_ago >= (self.params.hours * 60 * 60):
                      price0 = self.data0.close[0]
                      position_value0 = self.getposition(self.data0).size * price0
      
                      """
                          购币/售币 数量 = (持仓价值 - (用于买币的资金 * 当前币种所占比例)) / 当前收盘价
                      """
                      size0 = (position_value0 - (cash_for_coin * (self.params.portfolio[0] / 100))) / price0
                      # print(price0)
                      # print(position_value0)
                      # print(size0)
                      if float(size0) > float(0):
                          self.sell(data=self.data0, size=size0, price=price0)
                          # self.log_write('SELL , %.2f , %.2f , %s , %.10f , %.10f' % (
                          #     self.params.hours, self.params.percentage, str(self.params.portfolio), price0, size0))
                          self.log('SELL , %.2f , %.2f , %s , %.10f , %.10f' % (
                          self.params.hours, self.params.percentage, str(self.params.portfolio), price0, size0))
      
                      elif float(size0) < float(0):
                          self.buy(data=self.data0, size=size0, price=price0)
                          # self.log_write('BUY , %.2f , %.2f , %s , %.10f , %.10f' % (
                          #     self.params.hours, self.params.percentage, str(self.params.portfolio), price0, size0))
                          self.log('BUY , %.2f , %.2f , %s , %.10f , %.10f' % (
                          self.params.hours, self.params.percentage, str(self.params.portfolio), price0, size0))
      
                      price1 = self.data1.close[0]
                      position_value1 = self.getposition(self.data1).size * price1
      
                      """
                          购币/售币 数量 = (持仓价值 - (用于买币的资金 * 当前币种所占比例)) / 当前收盘价
                      """
                      size1 = (position_value1 - (cash_for_coin * (self.params.portfolio[1] / 100))) / price1
                      # print(price1)
                      # print(position_value1)
                      # print(size1)
                      if float(size1) > float(0):
                          self.sell(data=self.data1, size=size1, price=price1)
                          # self.log_write('SELL , %.2f , %.2f , %s , %.10f , %.10f' % (
                          #     self.params.hours, self.params.percentage, str(self.params.portfolio), price1, size1))
                          self.log('SELL , %.2f , %.2f , %s , %.10f , %.10f' % (
                          self.params.hours, self.params.percentage, str(self.params.portfolio), price1, size1))
      
                      elif float(size1) < float(0):
                          self.buy(data=self.data1, size=size1, price=price1)
                          # self.log_write('BUY , %.2f , %.2f , %s , %.10f , %.10f' % (
                          #     self.params.hours, self.params.percentage, str(self.params.portfolio), price1, size1))
                          self.log('BUY , %.2f , %.2f , %s , %.10f , %.10f' % (
                          self.params.hours, self.params.percentage, str(self.params.portfolio), price1, size1))
      
              else:
      
                  """
                      用于买币的资金:总现金的 10%
                  """
                  cash_for_coin = self.params.percentage / 100 * self.broker.cash
      
                  current_datetime = self.data0.datetime.datetime()
      
                  """
                      用于购买当前币种的资金 
                  """
                  cash_for_coin_this0 = self.params.portfolio[0] / 100 * cash_for_coin
                  price0 = self.data0.close[0]
                  size0 = cash_for_coin_this0 / price0
                  self.buy(data=self.data0, size=size0, price=price0)
                  self.log('BUY , %.2f , %.2f , %s , %.10f , %.10f' % (self.params.hours, self.params.percentage, str(self.params.portfolio), price0, size0))
      
                  cash_for_coin_this1 = self.params.portfolio[1] / 100 * cash_for_coin
                  price1 = self.data1.close[0]
                  size1 = cash_for_coin_this1 / price1
                  self.buy(data=self.data1, size=size1, price=price1)
                  self.log('BUY , %.2f , %.2f , %s , %.10f , %.10f' % (self.params.hours, self.params.percentage, str(self.params.portfolio), price1, size1))
      
                  self.order_datetime = current_datetime
      
              # print('========================================================================================================================')
      
          def stop(self):
              position_value_data0 = self.data0.close[0] * self.getposition(self.data0).size
              position_value_data1 = self.data1.close[0] * self.getposition(self.data1).size
              profit = self.broker.getvalue() - 100000
              profit_percentage = round(profit / 100000 * 100, 4)
              self.log_write('Profit , %.2f , %.2f , %s , %.10f , %.10f , %.10f , %.10f , %.10f , %.4f' % (self.params.hours, self.params.percentage, str(self.params.portfolio), self.broker.cash, position_value_data0, position_value_data1, self.broker.getvalue(), profit, profit_percentage))
      
      if __name__ == '__main__':
      
          action = int(sys.argv[1]) if len(sys.argv) > 1 else 0
          portfolio_tuple = itertools.product(range(1, 101), range(1, 101))
          portfolio_list = [list(portfolio) for portfolio in portfolio_tuple if portfolio[0] + portfolio[1] == 100]
          print(portfolio_list)
      
          if action == 0:
              print('请选择执行类型:')
              print("""
          
                     action == 1:
                         name = 'bearToBull'
                         from_date = datetime.datetime(2019, 1, 1)
                         to_date = datetime.datetime(2019, 6, 30)
                     action == 2:
                         name = 'bearTobullToBear'
                         from_date = datetime.datetime(2020, 10, 1)
                         to_date = datetime.datetime(2021, 6, 30)
                     action == 3:
                         name = 'bullToBear'
                         from_date = datetime.datetime(2017, 12, 1)
                         to_date = datetime.datetime(2018, 12, 31)
                     action == 4:
                         name = 'bullToBearToShockToBullToBear'
                         from_date = datetime.datetime(2017, 10, 1)
                         to_date = datetime.datetime(2020, 3, 31)
                     action == 5:
                         name = 'shock'
                         from_date = datetime.datetime(2019, 7, 1)
                         to_date = datetime.datetime(2020, 9, 30)
                     action == 6:
                         name = 'all'
                         from_date = datetime.datetime(2017, 12, 1)
                         to_date = datetime.datetime(2021, 6, 30)
                 """)
              sys.exit()
          elif action == 1:
              name = 'bearToBull-two-coin'
              from_date = datetime.datetime(2019, 1, 1)
              to_date = datetime.datetime(2019, 6, 30)
          elif action == 2:
              name = 'bearTobullToBear-two-coin'
              from_date = datetime.datetime(2020, 10, 1)
              to_date = datetime.datetime(2021, 6, 30)
          elif action == 3:
              name = 'bullToBear-two-coin'
              from_date = datetime.datetime(2017, 12, 1)
              to_date = datetime.datetime(2018, 12, 31)
          elif action == 4:
              name = 'bullToBearToShockToBullToBear-two-coin'
              from_date = datetime.datetime(2017, 10, 1)
              to_date = datetime.datetime(2020, 3, 31)
          elif action == 5:
              name = 'shock-two-coin'
              from_date = datetime.datetime(2019, 7, 1)
              to_date = datetime.datetime(2020, 9, 30)
          elif action == 6:
              name = 'all-two-coin'
              from_date = datetime.datetime(2017, 12, 1)
              to_date = datetime.datetime(2021, 6, 30)
          else:
              sys.exit()
      
          print(name)
          print(from_date)
          print(to_date)
      
          cerebro = bt.Cerebro()
      
          cerebro.optstrategy(TestStrategy, hours=range(1, 11), portfolio=portfolio_list, percentage=range(5, 101, 10), name=name)
      
          df0 = pd.read_csv('/app/data/Binance_BTCUSDT_minute.csv', parse_dates=['time'])
          # df0 = pd.read_csv('/Users/mars/Downloads/Binance_BTCUSDT_minute.csv', parse_dates=['time'])
          data0 = bt.feeds.PandasData(dataname=df0,
                                      timeframe=bt.TimeFrame.Minutes,
                                      datetime='time',
                                      open='open',
                                      high='high',
                                      low='low',
                                      close='close',
                                      volume='volume',
                                      openinterest=-1,
                                      fromdate=from_date,
                                      todate=to_date)
      
          df1 = pd.read_csv('/app/data/Binance_ETHUSDT_minute.csv', parse_dates=['time'])
          # df1 = pd.read_csv('/Users/mars/Downloads/Binance_ETHUSDT_minute.csv', parse_dates=['time'])
          data1 = bt.feeds.PandasData(dataname=df1,
                                      timeframe=bt.TimeFrame.Minutes,
                                      datetime='time',
                                      open='open',
                                      high='high',
                                      low='low',
                                      close='close',
                                      volume='volume',
                                      openinterest=-1,
                                      fromdate=from_date,
                                      todate=to_date)
      
          # Add the Data Feed to Cerebro
          cerebro.adddata(data0)
          cerebro.adddata(data1)
      
          cerebro.addanalyzer(BarAnalysis, _name="data_all")
          # Set our desired cash start
          cerebro.broker.setcash(100000.0)
          cerebro.broker.setcommission(commission=0.001)
      
          # Print out the starting conditions
          print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
      
          # Run over everything
          stratruns = cerebro.run()
      
          print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
          data_end = {
              'strategy': [],
              'profit': [],
              'profit_percentage': []
          }
          for stratrun in stratruns:
              for strat in stratrun:
                  data_end['strategy'].extend(strat.analyzers.data_all.rets['strategy'])
                  data_end['profit'].extend(strat.analyzers.data_all.rets['profit'])
                  data_end['profit_percentage'].extend(strat.analyzers.data_all.rets['profit_percentage'])
          print(data_end)
          print(name + '  最大收益为:')
          profit_max = max(data_end['profit'])
          print(profit_max)
          print(name + '  最大收益模式为:')
          indices = [data_end['strategy'][i] for i, x in enumerate(data_end['profit']) if x == profit_max]
          print(indices)
          M = MakeLineOptinons(data=data_end, file_name=name + '.html')
          M.make_options()
      
      

      These is error log.

      [Fri Jul 16 14:52:18 2021] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/user.slice/user-1000.slice/session-1.scope,task=python,pid=3834,uid=1000
      [Fri Jul 16 14:52:18 2021] Out of memory: Killed process 3834 (python) total-vm:5423880kB, anon-rss:3722984kB, file-rss:176kB, shmem-rss:0kB, UID:1000 pgtables:8360kB oom_score_adj:0
      [Fri Jul 16 14:52:18 2021] oom_reaper: reaped process 3834 (python), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
      
      

      Have nice day.

      posted in General Code/Help
      X
      X-Mars
    • 1 / 1