@run-out Thank you for your reply.
My PC have 64G memory, and AMD 5950X .
Something wrong with my code.
It's OK now.
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
Posts made by X-Mars
-
RE: Got 'Out of memory ' when run backtrader by two datas.
-
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.