Refactor trend detection logic and update date filtering in main.py. Removed width parameter from detect_trends method and enhanced peak detection to include valleys and peaks between consecutive points.
This commit is contained in:
parent
0bbe308321
commit
e1f1e7f561
10
main.py
10
main.py
@ -5,13 +5,17 @@ from cycle_detector import CycleDetector
|
|||||||
|
|
||||||
# Load data from CSV file instead of database
|
# Load data from CSV file instead of database
|
||||||
data = pd.read_csv('data/btcusd_1-day_data.csv')
|
data = pd.read_csv('data/btcusd_1-day_data.csv')
|
||||||
|
|
||||||
# Convert datetime column to datetime type
|
# Convert datetime column to datetime type
|
||||||
one_month_ago = pd.to_datetime('2025-04-05')
|
start_date = pd.to_datetime('2025-04-01')
|
||||||
daily_data = data[pd.to_datetime(data['datetime']) >= one_month_ago]
|
stop_date = pd.to_datetime('2025-05-06')
|
||||||
|
|
||||||
|
daily_data = data[(pd.to_datetime(data['datetime']) >= start_date) &
|
||||||
|
(pd.to_datetime(data['datetime']) < stop_date)]
|
||||||
print(f"Number of data points: {len(daily_data)}")
|
print(f"Number of data points: {len(daily_data)}")
|
||||||
|
|
||||||
trend_detector = TrendDetectorSimple(daily_data, verbose=True)
|
trend_detector = TrendDetectorSimple(daily_data, verbose=True)
|
||||||
trends = trend_detector.detect_trends(width=1)
|
trends = trend_detector.detect_trends()
|
||||||
trend_detector.plot_trends(trends)
|
trend_detector.plot_trends(trends)
|
||||||
|
|
||||||
#trend_detector = TrendDetectorMACD(daily_data, True)
|
#trend_detector = TrendDetectorMACD(daily_data, True)
|
||||||
|
|||||||
@ -33,7 +33,7 @@ class TrendDetectorSimple:
|
|||||||
|
|
||||||
self.logger.info(f"Initialized TrendDetectorSimple with {len(self.data)} data points")
|
self.logger.info(f"Initialized TrendDetectorSimple with {len(self.data)} data points")
|
||||||
|
|
||||||
def detect_trends(self, width):
|
def detect_trends(self):
|
||||||
"""
|
"""
|
||||||
Detect trends by identifying local minima and maxima in the price data
|
Detect trends by identifying local minima and maxima in the price data
|
||||||
using scipy.signal.find_peaks.
|
using scipy.signal.find_peaks.
|
||||||
@ -45,13 +45,13 @@ class TrendDetectorSimple:
|
|||||||
Returns:
|
Returns:
|
||||||
- DataFrame with columns for timestamps, prices, and trend indicators
|
- DataFrame with columns for timestamps, prices, and trend indicators
|
||||||
"""
|
"""
|
||||||
self.logger.info(f"Detecting trends with width {width}")
|
self.logger.info(f"Detecting trends")
|
||||||
|
|
||||||
df = self.data.copy()
|
df = self.data.copy()
|
||||||
close_prices = df['close'].values
|
close_prices = df['close'].values
|
||||||
|
|
||||||
max_peaks, _ = find_peaks(close_prices, width=width)
|
max_peaks, _ = find_peaks(close_prices)
|
||||||
min_peaks, _ = find_peaks(-close_prices, width=width)
|
min_peaks, _ = find_peaks(-close_prices)
|
||||||
|
|
||||||
self.logger.info(f"Found {len(min_peaks)} local minima and {len(max_peaks)} local maxima")
|
self.logger.info(f"Found {len(min_peaks)} local minima and {len(max_peaks)} local maxima")
|
||||||
|
|
||||||
@ -63,7 +63,38 @@ class TrendDetectorSimple:
|
|||||||
for peak in min_peaks:
|
for peak in min_peaks:
|
||||||
df.at[peak, 'is_min'] = True
|
df.at[peak, 'is_min'] = True
|
||||||
|
|
||||||
|
# Find consecutive peaks and add the valley in between
|
||||||
|
if len(max_peaks) >= 2:
|
||||||
|
for i in range(len(max_peaks) - 1):
|
||||||
|
start_idx = max_peaks[i]
|
||||||
|
end_idx = max_peaks[i + 1]
|
||||||
|
|
||||||
|
# Find the minimum value between these two peaks
|
||||||
|
segment = close_prices[start_idx:end_idx + 1]
|
||||||
|
valley_idx = start_idx + np.argmin(segment)
|
||||||
|
|
||||||
|
# Add to min_peaks if not already there
|
||||||
|
if valley_idx not in min_peaks:
|
||||||
|
min_peaks = np.append(min_peaks, valley_idx)
|
||||||
|
df.at[valley_idx, 'is_min'] = True
|
||||||
|
self.logger.info(f"Added valley at index {valley_idx} between peaks {start_idx} and {end_idx}")
|
||||||
|
|
||||||
|
# Find consecutive valleys and add the peak in between
|
||||||
|
if len(min_peaks) >= 2:
|
||||||
|
min_peaks = np.sort(min_peaks) # Sort after potential additions
|
||||||
|
for i in range(len(min_peaks) - 1):
|
||||||
|
start_idx = min_peaks[i]
|
||||||
|
end_idx = min_peaks[i + 1]
|
||||||
|
|
||||||
|
# Find the maximum value between these two valleys
|
||||||
|
segment = close_prices[start_idx:end_idx + 1]
|
||||||
|
peak_idx = start_idx + np.argmax(segment)
|
||||||
|
|
||||||
|
# Add to max_peaks if not already there
|
||||||
|
if peak_idx not in max_peaks:
|
||||||
|
max_peaks = np.append(max_peaks, peak_idx)
|
||||||
|
df.at[peak_idx, 'is_max'] = True
|
||||||
|
self.logger.info(f"Added peak at index {peak_idx} between valleys {start_idx} and {end_idx}")
|
||||||
|
|
||||||
result = df[['datetime', 'close', 'is_min', 'is_max']]
|
result = df[['datetime', 'close', 'is_min', 'is_max']]
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user