How to display pnl , size, ticker, portfolio value and date on single row?
-
Hi, I'm new to python and backtrader. I'm trying to replicate a price and SMA crossover strategy and when I run the program I get the following result. Everything is fine but I want to print that pnl for every trade on the same row as Date, Ticker,...etc.
I printed Date, ticker, cost, size,... here by using :
self.log(
'%s, BUY, %.2f, %.2f, %.2f' %
(self.params.ticker,
self.size,
self.data.close[0],
cerebro.broker.getvalue()
))and pnl using :
def notify_trade(self, trade): if not trade.isclosed: return self.log('%.2f' % (trade.pnl))
-
def notify_trade(self, trade): if not trade.isclosed: return self.log('%.2f, %s, %.2f, %.2f, %.2f' % (trade.pnl, self.params.ticker, self.size, self.data.close[0], cerebro.broker.getvalue()
-
@ab_trader I got an error in def next(self): as invalid syntax. I've posted my whole code below so that you can get a clear picture. Thank you very much for your help. It means a lot to me. God bless you.
from datetime import datetime
import backtrader as bt
import pandas as pd
import mathclass SmaCross(bt.Strategy):
params = dict(pslow=20,order_percentage= 0.99,ticker = 'NEPSE')def log(self, txt, dt=None): ''' Logging function for this strategy''' dt = dt or self.datas[0].datetime.date(0) print('%s, %s' % (dt.isoformat(), txt)) def __init__(self): sma = bt.talib.SMA(self.data.close,timeperiod=self.p.pslow) self.crossover = bt.ind.CrossOver(self.data.close, sma) def notify_trade(self, trade): if not trade.isclosed: return self.log('%.2f' % (trade.pnl)) def next(self): if not self.position: if self.crossover > 0: amount_to_invest = (self.p.order_percentage*self.broker.cash) self.size = math.floor(amount_to_invest/self.data.close) self.log( '%s, BUY, %.2f, %.2f, %.2f' % (self.params.ticker, self.size, self.data.close[0], cerebro.broker.getvalue() )) self.buy(size=self.size) elif self.crossover < 0: self.log( '%s, Sell, %.2f, %.2f, %.2f' % (self.params.ticker, self.size, self.data.close[0], cerebro.broker.getvalue() )) self.close()
cerebro = bt.Cerebro()
feed = pd.read_csv('test.csv',index_col = 'Date',parse_dates = True)
data = bt.feeds.PandasData(dataname = feed)
data
cerebro.adddata(data)
cerebro.addstrategy(SmaCross)print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
cerebro.run()
cerebro.addwriter(bt.WriterFile, csv = True, out='your_strategy_results')
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
cerebro.plot() -
@ab_trader It seems that the immediate code that follows notify_trade is shown as invalid syntax.
-
First, repost your code considering statement about backticks on the top of the page.
Second, post actual error message within the backticks. Your posts described error message in two different places of the script. So let's take a look on the actual one.
-
from datetime import datetime import backtrader as bt import pandas as pd import math class SmaCross(bt.Strategy): params = dict(pslow=20,order_percentage= 0.99,ticker = 'NEPSE') def log(self, txt, dt=None): ''' Logging function for this strategy''' dt = dt or self.datas[0].datetime.date(0) print('%s, %s' % (dt.isoformat(), txt)) def __init__(self): sma = bt.talib.SMA(self.data.close,timeperiod=self.p.pslow) self.crossover = bt.ind.CrossOver(self.data.close, sma) def notify_trade(self, trade): if not trade.isclosed: return self.log('%.2f, %s, %.2f, %.2f, %.2f' % (trade.pnl, self.params.ticker, self.size, self.data.close[0], cerebro.broker.getvalue() def next(self): if not self.position: if self.crossover > 0: amount_to_invest = (self.p.order_percentage*self.broker.cash) self.size = math.floor(amount_to_invest/self.data.close) self.buy(size=self.size) elif self.crossover < 0: self.close() cerebro = bt.Cerebro() feed = pd.read_csv('test.csv',index_col = 'Date',parse_dates = True) data = bt.feeds.PandasData(dataname = feed) data cerebro.adddata(data) cerebro.addstrategy(SmaCross) print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue()) cerebro.run() print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue()) cerebro.plot() File "<ipython-input-29-9a6b79c4a5d7>", line 25 def next(self): ^ SyntaxError: invalid syntax
I hope followed your instructions.
-
@Arun-Lama I strongly recommend you to study python first. If you will be asking such questions here and waiting for several days for an answer, you will not move anywhere. Looks like parentheses are missed in the script and this is not
bt
related error:self.log('%.2f, %s, %.2f, %.2f, %.2f' % (trade.pnl, self.params.ticker, self.size, self.data.close[0], cerebro.broker.getvalue()))
-
I feel ashamed for such mistakes. Thank you very much sir. What I thought was if it was parenthesis related problem, I thought it would be indicated in the error but it looks something different. Thank you. God Bless you.