optstrategy not working in Jupyter
-
Im trying to run a simple example using optstrategy in a Jyputer notebook and it simply just hangs. Any ideas?
Here is the code:
import datetime # For datetime objects import os.path # To manage paths import sys # To find out the script name (in argv[0]) # Import the backtrader platform import backtrader as bt # Create a Stratey class TestStrategy(bt.Strategy): params = (('BBandsperiod', 20),) def log(self, txt, dt=None): ''' Logging function fot this strategy''' dt = dt or self.datas[0].datetime.date(0) # print('%s, %s' % (dt.isoformat(), txt)) def __init__(self): # Keep a reference to the "close" line in the data[0] dataseries self.dataclose = self.datas[0].close # To keep track of pending orders and buy price/commission self.order = None self.buyprice = None self.buycomm = None self.redline = None self.blueline = None # Add a BBand indicator self.bband = bt.indicators.BBands(self.datas[0], period=self.params.BBandsperiod) def notify_order(self, order): if order.status in [order.Submitted, order.Accepted]: # Buy/Sell order submitted/accepted to/by broker - Nothing to do return # Check if an order has been completed # Attention: broker could reject order if not enougth cash if order.status in [order.Completed, order.Canceled, order.Margin]: if order.isbuy(): # self.log( # 'BUY EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' % # (order.executed.price, # order.executed.value, # order.executed.comm)) self.buyprice = order.executed.price self.buycomm = order.executed.comm else: # Sell pass # self.log('SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' % # (order.executed.price, # order.executed.value, # order.executed.comm)) self.bar_executed = len(self) # Write down: no pending order self.order = None def notify_trade(self, trade): if not trade.isclosed: return #self.log('OPERATION PROFIT, GROSS %.2f, NET %.2f' % # (trade.pnl, trade.pnlcomm)) def next(self): # Simply log the closing price of the series from the reference #self.log('Close, %.2f' % self.dataclose[0]) # Check if an order is pending ... if yes, we cannot send a 2nd one if self.order: return if self.dataclose < self.bband.lines.bot and not self.position: self.redline = True if self.dataclose > self.bband.lines.top and self.position: self.blueline = True if self.dataclose > self.bband.lines.mid and not self.position and self.redline: # BUY, BUY, BUY!!! (with all possible default parameters) #self.log('BUY CREATE, %.2f' % self.dataclose[0]) # Keep track of the created order to avoid a 2nd order self.order = self.buy() if self.dataclose > self.bband.lines.top and not self.position: # BUY, BUY, BUY!!! (with all possible default parameters) #self.log('BUY CREATE, %.2f' % self.dataclose[0]) # Keep track of the created order to avoid a 2nd order self.order = self.buy() if self.dataclose < self.bband.lines.mid and self.position and self.blueline: # SELL, SELL, SELL!!! (with all possible default parameters) #self.log('SELL CREATE, %.2f' % self.dataclose[0]) self.blueline = False self.redline = False # Keep track of the created order to avoid a 2nd order self.order = self.sell() if __name__ == '__main__': # Create a cerebro entity cerebro = bt.Cerebro() # Add a strategy #cerebro.addstrategy(TestStrategy) cerebro.optstrategy(TestStrategy, BBandsperiod=(18, 22)) # Datas are in a subfolder of the samples. Need to find where the script is # because it could have been called from anywhere # modpath = os.path.dirname(os.path.abspath(sys.argv[0])) # datapath = os.path.join(modpath, 'TSLA-USD.csv') # Create a Data Fee data = bt.feeds.GenericCSVData( dataname='data/BTC_USDT_poliniex_1d_2017.csv', dtformat='%Y-%m-%d', # dtformat='%Y-%m-%d %H:%M:%S', # dtformat='%d.%m.%Y %H:%M:%S.%f', # tmformat='%H%M%S', # already the default value # datetime=0, # position at default time=-1, # position of time open=1, # position of open high=2, low=3, close=4, volume=5, openinterest=-1, # -1 for not present timeframe=bt.TimeFrame.Days) # Add the Data Feed to Cerebro cerebro.adddata(data) # Set our desired cash start cerebro.broker.setcash(1000000.0) # Add a FixedSize sizer according to the stake cerebro.addsizer(bt.sizers.FixedSize, stake=5) # Set the commission cerebro.broker.setcommission(commission=0.002) # Print out the starting conditions #print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue()) # Run over everything cerebro.run() # Print out the final result #print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue()) # Plot the result cerebro.plot()
Here is the output from the Jupyter console:
-
@Søren-Pallesen I've heard that jupyter doesn't support multiprocessing. This can be a reason of the error.
-
See this: https://community.backtrader.com/topic/612/optimzation-question/
Any shell which hijacks the initialization of the Python kernel is bound to have problems with the
multiprocessing
module under Windows. Google shows some other references from the past: -
Thx for prompt answers. Love this community for that. Any way to use optstrategy without multiprocessing?
-
- Option 1:
maxcpus=1
(disable using multiple cores) - Option 2: You give GvR a call and tell him that in 2017 (with 2018 not being that far away) the GIL may no longer be such a good idea. It may be worth a try.
- Option 1:
-
Funny and knowleble. Rare combo
. Thx again will give maxcpus a shot. Shame though when you have a 12 core i7 ...