Spaces:
Runtime error
Runtime error
import pandas as pd | |
from indicators.sma import calculate_21_50_sma | |
from indicators.bollinger_bands import calculate_bollinger_bands | |
def check_buy_signal(data): | |
""" | |
Analyzes stock data to identify buy signals based on the criteria: | |
- On the 1 day time frame, the 21-period SMA is above the 50-period SMA. | |
- The 21-period SMA has been above the 50-period SMA for more than 1 day. | |
- On the 1-hour time frame, the 21-period SMA has just crossed above the 50-period SMA from below. | |
Parameters: | |
- data (pd.DataFrame): The stock data with 'SMA_21', 'SMA_50' columns. | |
Returns: | |
- pd.Series: A boolean series indicating buy signals. | |
""" | |
# Assuming 'data' has 'SMA_21' and 'SMA_50' calculated for both 1 day and 1 hour time frames | |
buy_signal = (data['SMA_21'] > data['SMA_50']) & (data['SMA_21'].shift(1) > data['SMA_50'].shift(1)) | |
return buy_signal | |
def check_sell_signal(data): | |
""" | |
Analyzes stock data to identify sell signals based on the criteria: | |
- The price has crossed above the upper band of the 1.7SD Bollinger Band on the 21-period SMA. | |
Parameters: | |
- data (pd.DataFrame): The stock data with 'Close', 'BB_Upper' columns. | |
Returns: | |
- pd.Series: A boolean series indicating sell signals. | |
""" | |
# Assuming 'data' has 'Close' and 'BB_Upper' calculated | |
sell_signal = data['Close'] > data['BB_Upper'] | |
return sell_signal | |
def generate_signals(stock_data): | |
""" | |
Main function to generate buy and sell signals for a given stock. | |
Parameters: | |
- stock_data (pd.DataFrame): The stock data. | |
Returns: | |
- pd.DataFrame: The stock data with additional columns 'Buy_Signal' and 'Sell_Signal'. | |
""" | |
# First, ensure the necessary SMA and Bollinger Bands are calculated | |
stock_data = calculate_21_50_sma(stock_data) | |
stock_data = calculate_bollinger_bands(stock_data) | |
# Generate buy and sell signals | |
stock_data['Buy_Signal'] = check_buy_signal(stock_data) | |
stock_data['Sell_Signal'] = check_sell_signal(stock_data) | |
return stock_data | |
if __name__ == "__main__": | |
# Example usage | |
# This part is meant for testing. You'll need to replace it with actual stock data fetching. | |
dates = pd.date_range(start='2023-01-01', periods=100, freq='D') | |
close_prices = pd.Series((100 + pd.np.random.randn(100).cumsum()), index=dates) | |
sample_data = pd.DataFrame({'Close': close_prices}) | |
signals_data = generate_signals(sample_data) | |
print(signals_data[['Buy_Signal', 'Sell_Signal']].tail()) | |