Spaces:
Runtime error
Runtime error
Update signals/strategy.py
Browse files- signals/strategy.py +52 -33
signals/strategy.py
CHANGED
|
@@ -1,46 +1,65 @@
|
|
| 1 |
-
# signals/strategy.py
|
| 2 |
-
|
| 3 |
import pandas as pd
|
|
|
|
|
|
|
| 4 |
|
| 5 |
-
def
|
| 6 |
"""
|
| 7 |
-
|
| 8 |
-
|
|
|
|
|
|
|
|
|
|
| 9 |
Parameters:
|
| 10 |
-
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
Returns:
|
| 14 |
-
-
|
| 15 |
"""
|
| 16 |
-
#
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
# Criteria 3 & 4 for 1-hour data
|
| 20 |
-
crossed_above = (data_1h['SMA_21'].shift(2) < data_1h['SMA_50'].shift(2)) & (data_1h['SMA_21'] > data_1h['SMA_50'])
|
| 21 |
-
was_below = (data_1h['SMA_21'].shift(15) < data_1h['SMA_50'].shift(15))
|
| 22 |
|
| 23 |
-
|
| 24 |
-
buy_signals = data_1h[crossed_above & was_below & criteria_4h.reindex(data_1h.index, method='nearest')]
|
| 25 |
-
|
| 26 |
-
return buy_signals[['SMA_21', 'SMA_50']]
|
| 27 |
-
|
| 28 |
-
def generate_sell_signals(data_4h):
|
| 29 |
"""
|
| 30 |
-
|
| 31 |
-
|
|
|
|
| 32 |
Parameters:
|
| 33 |
-
-
|
| 34 |
-
|
| 35 |
Returns:
|
| 36 |
-
-
|
| 37 |
"""
|
| 38 |
-
#
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
sell_signals = data_4h[crossed_above_bb]
|
| 42 |
|
| 43 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 44 |
|
| 45 |
-
|
| 46 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
import pandas as pd
|
| 2 |
+
from indicators.sma import calculate_21_50_sma
|
| 3 |
+
from indicators.bollinger_bands import calculate_bollinger_bands
|
| 4 |
|
| 5 |
+
def check_buy_signal(data):
|
| 6 |
"""
|
| 7 |
+
Analyzes stock data to identify buy signals based on the criteria:
|
| 8 |
+
- On the 1 day time frame, the 21-period SMA is above the 50-period SMA.
|
| 9 |
+
- The 21-period SMA has been above the 50-period SMA for more than 1 day.
|
| 10 |
+
- On the 1-hour time frame, the 21-period SMA has just crossed above the 50-period SMA from below.
|
| 11 |
+
|
| 12 |
Parameters:
|
| 13 |
+
- data (pd.DataFrame): The stock data with 'SMA_21', 'SMA_50' columns.
|
| 14 |
+
|
|
|
|
| 15 |
Returns:
|
| 16 |
+
- pd.Series: A boolean series indicating buy signals.
|
| 17 |
"""
|
| 18 |
+
# Assuming 'data' has 'SMA_21' and 'SMA_50' calculated for both 1 day and 1 hour time frames
|
| 19 |
+
buy_signal = (data['SMA_21'] > data['SMA_50']) & (data['SMA_21'].shift(1) > data['SMA_50'].shift(1))
|
| 20 |
+
return buy_signal
|
|
|
|
|
|
|
|
|
|
| 21 |
|
| 22 |
+
def check_sell_signal(data):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
"""
|
| 24 |
+
Analyzes stock data to identify sell signals based on the criteria:
|
| 25 |
+
- The price has crossed above the upper band of the 1.7SD Bollinger Band on the 21-period SMA.
|
| 26 |
+
|
| 27 |
Parameters:
|
| 28 |
+
- data (pd.DataFrame): The stock data with 'Close', 'BB_Upper' columns.
|
| 29 |
+
|
| 30 |
Returns:
|
| 31 |
+
- pd.Series: A boolean series indicating sell signals.
|
| 32 |
"""
|
| 33 |
+
# Assuming 'data' has 'Close' and 'BB_Upper' calculated
|
| 34 |
+
sell_signal = data['Close'] > data['BB_Upper']
|
| 35 |
+
return sell_signal
|
|
|
|
| 36 |
|
| 37 |
+
def generate_signals(stock_data):
|
| 38 |
+
"""
|
| 39 |
+
Main function to generate buy and sell signals for a given stock.
|
| 40 |
+
|
| 41 |
+
Parameters:
|
| 42 |
+
- stock_data (pd.DataFrame): The stock data.
|
| 43 |
+
|
| 44 |
+
Returns:
|
| 45 |
+
- pd.DataFrame: The stock data with additional columns 'Buy_Signal' and 'Sell_Signal'.
|
| 46 |
+
"""
|
| 47 |
+
# First, ensure the necessary SMA and Bollinger Bands are calculated
|
| 48 |
+
stock_data = calculate_21_50_sma(stock_data)
|
| 49 |
+
stock_data = calculate_bollinger_bands(stock_data)
|
| 50 |
+
|
| 51 |
+
# Generate buy and sell signals
|
| 52 |
+
stock_data['Buy_Signal'] = check_buy_signal(stock_data)
|
| 53 |
+
stock_data['Sell_Signal'] = check_sell_signal(stock_data)
|
| 54 |
+
|
| 55 |
+
return stock_data
|
| 56 |
|
| 57 |
+
if __name__ == "__main__":
|
| 58 |
+
# Example usage
|
| 59 |
+
# This part is meant for testing. You'll need to replace it with actual stock data fetching.
|
| 60 |
+
dates = pd.date_range(start='2023-01-01', periods=100, freq='D')
|
| 61 |
+
close_prices = pd.Series((100 + pd.np.random.randn(100).cumsum()), index=dates)
|
| 62 |
+
sample_data = pd.DataFrame({'Close': close_prices})
|
| 63 |
+
|
| 64 |
+
signals_data = generate_signals(sample_data)
|
| 65 |
+
print(signals_data[['Buy_Signal', 'Sell_Signal']].tail())
|