import pandas as pd from indicators.sma import calculate_sma from indicators.bollinger_bands import calculate_bollinger_bands def generate_signals(data): """ Analyzes technical indicators to generate buy and sell signals. Args: data (pd.DataFrame): DataFrame containing the historical price data and indicators. Returns: pd.DataFrame: The input DataFrame augmented with buy and sell signals. """ # Ensure the necessary indicators are calculated and present in the DataFrame if 'SMA_21' not in data.columns or 'SMA_50' not in data.columns: data['SMA_21'] = calculate_sma(data, period=21) data['SMA_50'] = calculate_sma(data, period=50) if 'BB_Upper' not in data.columns: data = calculate_bollinger_bands(data) # Initialize columns for signals data['Buy_Signal'] = False data['Sell_Signal'] = False # Loop through the DataFrame to find buy and sell conditions for i in range(2, len(data)): # Buy condition: SMA_21 crosses above SMA_50, and has been below SMA_50 for at least 10 periods if data['SMA_21'].iloc[i] > data['SMA_50'].iloc[i] and data['SMA_21'].iloc[i-1] <= data['SMA_50'].iloc[i-1]: if data['SMA_50'].iloc[i-10:i-1].isnull().sum() < 1: # Ensure there's enough data if (data['SMA_21'].iloc[i-10:i-1] < data['SMA_50'].iloc[i-10:i-1]).all(): data.at[data.index[i], 'Buy_Signal'] = True # Sell condition: Price reaches or exceeds the upper Bollinger band for at least 3 periods after being below it for 5 or more periods if data['close'].iloc[i] >= data['BB_Upper'].iloc[i] and data['close'].iloc[i-1] < data['BB_Upper'].iloc[i-1] and data['close'].iloc[i-2] < data['BB_Upper'].iloc[i-2]: if (data['close'].iloc[i-5:i-1] < data['BB_Upper'].iloc[i-5:i-1]).all(): data.at[data.index[i], 'Sell_Signal'] = True return data # Example usage: # Assuming `price_data` is a pandas DataFrame with columns including 'date', 'open', 'high', 'low', 'close', and 'volume': # signals_data = generate_signals(price_data)