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())
|