2

I'm trying to get a signal out of aapl data but i got this error

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime

apple_stock = pd.read_csv('AAPL.csv')
apple_stock = apple_stock.set_index(pd.DatetimeIndex(apple_stock['Date'].values))

ma30 = pd.DataFrame()
ma30['AM'] = apple_stock['Adj Close'].rolling(window=30).mean()

ma100 = pd.DataFrame()
ma100['AM'] = apple_stock['Adj Close'].rolling(window=100).mean()

data = pd.DataFrame()
data['AAPL'] = apple_stock['Adj Close']
data['MA30'] = ma30['AM']
data['MA100'] = ma100['AM']


def signal(data):
    signal_buy = []
    signal_sell = []
    f = -1

    for i in range(0, len(data)):

        if data['MA30'][i] > data['MA100']:
            if f != 1:
                signal_buy.append(data['AAPL'][i])
                signal_sell.append(np.nan)
                f = 1
            else:
                signal_buy.append(np.nan)
                signal_sell.append(np.nan)

        elif data['MA30'][i] < data['MA100']:
            if f != 0:
                signal_buy.append(np.nan)
                signal_sell.append(data['AAPL'][i])
                f = 0
            else:
                signal_buy.append(np.nan)
                signal_sell.append(np.nan)

        else:
            signal_buy.append(np.nan)
            signal_sell.append(np.nan)

    return signal_buy, signal_sell


buy_sell = signal(data)

data['buy signal'] = buy_sell[0]
data['sell signal'] = buy_sell[1]

print(data)

This is the error it gives:

Traceback (most recent call last): File "C:/Users/k.taherinia/Desktop/Stock analysis and forecasting/moving_average_indicator.py", line 53, in buy_sell = signal(data) File "C:/Users/k.taherinia/Desktop/Stock analysis and forecasting/moving_average_indicator.py", line 28, in signal if data['MA30'][i] > data['MA100']: File "C:\Users\k.taherinia\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\generic.py", line 1527, in nonzero raise ValueError( ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Some people had the same problem with(and/or in pandas), but I could not find a solution for my code

dark diamond
  • 103
  • 6

1 Answers1

2

You cannot in one side use the [i] locator, and on the other side set it free. But, to do what you are expecting, here is a easy way :

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime

apple_stock = pd.read_csv('AAPL.csv')
apple_stock = apple_stock.set_index(pd.DatetimeIndex(apple_stock['Date'].values))

ma30 = pd.DataFrame()
ma30['AM'] = apple_stock['Adj Close'].rolling(window=30).mean()

ma100 = pd.DataFrame()
ma100['AM'] = apple_stock['Adj Close'].rolling(window=100).mean()

data = pd.DataFrame()
data['AAPL'] = apple_stock['Adj Close']
data['MA30'] = ma30['AM']
data['MA100'] = ma100['AM']

data['buy_signal'] = np.where(data.MA30 > data.MA100,1,0)
data['sell_signal'] = np.where(data.MA30 < data.MA100,1,0)

print(data)

Note that you can also do unique signal column with :

data['signal'] =  np.where(data.MA30 > data.MA100,1,np.where(data.MA30 < data.MA100,-1,0))
Lumber Jack
  • 602
  • 3
  • 9