Skip to content

Commit 5b9c2e4

Browse files
committed
[Refactor] Simplify signal generation in BollingerMeanReversion, BuyAndHold, DualMAStrategy, and DualThrustStrategy
1 parent 880ae64 commit 5b9c2e4

4 files changed

Lines changed: 18 additions & 23 deletions

File tree

src/quanteval/strategies/bollinger_mean_reversion.py

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -52,19 +52,10 @@ def generate_signals(self, data: pd.DataFrame) -> pd.Series:
5252
upper = middle + (num_std * std)
5353
lower = middle - (num_std * std)
5454

55-
# Initialize signal with NaN
56-
signal = pd.Series(np.nan, index=data.index)
57-
58-
# Entry signal: Price touches lower band (buy signal)
55+
# Generate signals
56+
signal = pd.Series(np.nan, index=data.index, name='Signal')
5957
signal[data['Close'] < lower] = 1
60-
61-
# Exit signal: Price touches upper band (sell signal)
6258
signal[data['Close'] > upper] = 0
6359

64-
# Forward fill to maintain position between signals
65-
signal = signal.ffill()
66-
67-
# Fill initial NaNs with 0 (no position)
68-
signal = signal.fillna(0)
60+
return signal.ffill().fillna(0)
6961

70-
return signal

src/quanteval/strategies/buy_hold.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ class BuyAndHoldStrategy(Strategy):
2121
>>> results = bt.run()
2222
"""
2323

24+
name = 'BuyAndHold'
25+
2426
def __init__(self):
2527
super().__init__(name='BuyAndHold')
2628

src/quanteval/strategies/dual_ma.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,9 @@ def generate_signals(self, data: pd.DataFrame) -> pd.Series:
6060
fast_ma = data['Close'].rolling(window=fast_window).mean()
6161
slow_ma = data['Close'].rolling(window=slow_window).mean()
6262

63-
# Generate signal: 1 if fast > slow, else 0
64-
signal = np.where(fast_ma > slow_ma, 1, 0)
63+
# Generate signals
64+
signal = pd.Series(np.nan, index=data.index, name='Signal')
65+
signal[fast_ma > slow_ma] = 1
66+
signal[fast_ma <= slow_ma] = 0
6567

66-
return pd.Series(signal, index=data.index, name='Signal')
68+
return signal.ffill().fillna(0)

src/quanteval/strategies/dual_thrust.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,7 @@ def generate_signals(self, data: pd.DataFrame) -> pd.Series:
4949
Returns:
5050
Series with values:
5151
1: Long position (price > upper threshold)
52-
-1: Short position (price < lower threshold)
53-
0: No position
52+
0: No position (price < lower threshold)
5453
"""
5554
k1 = self.params['k1']
5655
k2 = self.params['k2']
@@ -61,15 +60,16 @@ def generate_signals(self, data: pd.DataFrame) -> pd.Series:
6160
hc = data['Close'].shift(1).rolling(window=n).max()
6261
ll = data['Low'].shift(1).rolling(window=n).min()
6362
lc = data['Close'].shift(1).rolling(window=n).min()
63+
6464
diff = np.maximum(hh - lc, hc - ll)
6565

6666
# Calculate thresholds
67-
upper_threshold = data['Open'] + k1 * diff
68-
lower_threshold = data['Open'] - k2 * diff
67+
upper = data['Open'] + k1 * diff
68+
lower = data['Open'] - k2 * diff
6969

7070
# Generate signals
71-
signals = pd.Series(0, index=data.index)
72-
signals[data['High'] > upper_threshold] = 1 # Buy signal
73-
signals[data['Low'] < lower_threshold] = 0 # Sell signal
71+
signal = pd.Series(np.nan, index=data.index, name='Signal')
72+
signal[data['Close'] > upper] = 1
73+
signal[data['Close'] < lower] = 0
7474

75-
return signals
75+
return signal.ffill().fillna(0)

0 commit comments

Comments
 (0)