def backtest(parameters, price1,init_capital, max_capital_deploy, buy_margin, sell_margin):
longwindow = int(parameters[0])
shortwindow = int(parameters[1])
if (longwindow < shortwindow) or (shortwindow < 1) or (init_capital <= 0) or (max_capital_deploy <=0) or (buy_margin < 0) or (sell_margin < 0) :
return 0
short_moving_avg = data.ewm(span=5).mean()
long_moving_avg = data.ewm(span=60).mean()
#simulate the trading
capital=init_capital
qty1 = 0
p1 = 0
pos = 0
margin_blocked = 0
trade_pnl = []
mtm_pl = []
for i in range(len(data)):
if capital <= 0:
break
if pos == 0:
if short_moving_avg [i] > long_moving_avg[i]:
pos=-1
p1 = price1[i]
margin_blocked = capital * max_capital_deploy
qty1 = -(margin_blocked / 2) // (p1 * sell_margin)
if -qty1 < 1:
break
elif short_moving_avg [i] < long_moving_avg[i]:
pos = 1
p1 = price1[i]
margin_blocked = capital * max_capital_deploy
qty1 = (margin_blocked / 2) // (p1 * buy_margin)
if qty1 < 1:
break
elif pos < 0:
if short_moving_avg [i] > long_moving_avg[i]:
pnl = qty1 * (price1[i] - p1)
if not fixedcapital:
capital += pnl
trade_pnl = np.append(trade_pnl, pnl)
margin_blocked = 0
qty1 = 0
pos = 0
else:
pnl = qty1 * (price1[i] - p1)
mtm_pl = np.append(mtm_pl, pnl)
elif pos > 0:
if short_moving_avg [i] < long_moving_avg[i]:
pnl = qty1 * (price1[i] - p1)
trade_pnl = np.append(trade_pnl, pnl)
margin_blocked = 0
qty1 = 0
pos = 0
else:
pnl = qty1 * (price1[i] - p1)
mtm_pl = np.append(mtm_pl, pnl)
else:
if short_moving_avg [i] > long_moving_avg[i]:
pnl = qty1 * (price1[i] - p1)
trade_pnl = np.append(trade_pnl, pnl)
margin_blocked = 0
qty1 = 0
pos = 0
return capital, trade_pnl, mtm_pl
I m getting error in indentation but I am not sure this is indentation error or code error can you please help to correct the error and get the trade pnl mtm pnl capital...I want to pass it to the backtest function
Please, always post the full traceback you get in error tags.
There is inconsistent indentation - e.g. lines 46-47, 57-58.
Also there are huge problems with your nested if/elif/else blocks
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
data = pd.read_csv('aapl.csv')
data1 = data[['Date']]
data1 = data1.set_index('Date')
data = data[["Adj Close"]]
data.head()
data.columns = ["price"]
data.head()
x = [i for i in range(len(data))]
n = len(data)
short_period = 5
long_period = 10
for i in range(n):
short_moving_avg = data.ewm(span=5).mean()
long_moving_avg = data.ewm(span=60).mean()
initial part of code is this
how can I add whole trace book can you sugest
Error:
File "<ipython-input-1-2e5b5ffb66bd>", line 75
elif pos > 0:
^
SyntaxError: invalid syntax
pos=[]
for i in range(len(data)):
if pos == 0:
if data[:"short_moving_avg"] > data["long_moving_avg"]:
pos=-1
elif data["short_moving_avg"] < data["long_moving_avg"]:
pos = 1
elif pos < 0:
if data["short_moving_avg"] < data["long_moving_avg"]:
pos = 0
elif pos > 0:
if data["short_moving_avg"] > data["long_moving_avg"]:
pos = 0
Error:
ValueError Traceback (most recent call last)
<ipython-input-29-467a46c71805> in <module>()
6 pos=-1
7
----> 8 elif data["short_moving_avg"] < data["long_moving_avg"]:
9 pos = 1
10
~\Anaconda3\lib\site-packages\pandas\core\generic.py in __nonzero__(self)
1571 raise ValueError("The truth value of a {0} is ambiguous. "
1572 "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
-> 1573 .format(self.__class__.__name__))
1574
1575 __bool__ = __nonzero__
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
I don't no what does this error mean..how I solve this error
def backtest(inCapital):
ohp = 0
ocp = 0
hp = 0
cp = 0
capital = 1000
rCapital = 0
pnl = 0
pa = 0
columns = ['hp','cp', 'adj.close','pnl','capital']
df = pd.DataFrame(index= data.set_index(pd.to_datetime(data['Date']), inplace=True), columns=columns)
for i in range(len(data)):
if data['short_moving_emavg'][i] > data['long_moving_emavg'][i]:
if hp==0:
hp=1
cp=1
pa = data['Adj Close'][i]
rcapital=cap+pnl
pnl=0
pdb_set_trace()
if (hp==1):
hp=-1
cp=-1
pa = data['Adj Close'][i]
pnl = (data['Adj Close'][i] - pa)
elif data['short_moving_emavg'][i] < data['long_moving_emavg'][i]:
if (hp==0):
hp=-1
cp=-1
pa = data['Adj Close'][i]
rcapital=cap+pnl
pnl=0
if (hp==-1):
hp=1
cp=-1
pa = data['Adj Close'][i]
rcapital=cap+pnl
pnl=0
Error:
[error]
NameError Traceback (most recent call last)
<ipython-input-5-4d163fc15f0e> in <module>()
14 for i in range(len(data)):
15 if data['short_moving_emavg'][i] > data['long_moving_emavg'][i]:
---> 16 if hp==0:
17 hp=1
18 cp=1
NameError: name 'hp' is not defined
[/error]