Python Forum

Full Version: python indentation errror and output error
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
    
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]