netflypsb commited on
Commit
baf05f5
·
verified ·
1 Parent(s): 40603e9

Update signals/strategy.py

Browse files
Files changed (1) hide show
  1. 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 generate_buy_signals(data_4h, data_1h):
6
  """
7
- Generates buy signals based on specified criteria.
8
-
 
 
 
9
  Parameters:
10
- - data_4h: DataFrame containing 4-hour interval stock data with SMA and price columns.
11
- - data_1h: DataFrame containing 1-hour interval stock data with SMA and price columns.
12
-
13
  Returns:
14
- - buy_signals: DataFrame containing timestamps and signals where buy conditions are met.
15
  """
16
- # Criteria 1 & 2 for 4-hour data
17
- criteria_4h = (data_4h['SMA_21'] > data_4h['SMA_50'])
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
- # Combine criteria
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
- Generates sell signals based on specified criteria.
31
-
 
32
  Parameters:
33
- - data_4h: DataFrame containing 4-hour interval stock data with Bollinger Bands and price columns.
34
-
35
  Returns:
36
- - sell_signals: DataFrame containing timestamps and signals where sell conditions are met.
37
  """
38
- # Criteria for sell signal
39
- crossed_above_bb = data_4h['Close'] > data_4h['BB_Upper']
40
-
41
- sell_signals = data_4h[crossed_above_bb]
42
 
43
- return sell_signals[['Close', 'BB_Upper']]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
 
45
- # Example usage would require actual loaded data with the appropriate columns calculated.
46
- # This example assumes `data_4h` and `data_1h` DataFrames are prepared and include 'Close', 'SMA_21', 'SMA_50', and Bollinger Bands columns.
 
 
 
 
 
 
 
 
 
 
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())