- Introduced a new Strategy class to encapsulate trading strategies, including the Market Regime Strategy that adapts to different market conditions. - Refactored BollingerBands and RSI classes to accept configuration parameters for improved flexibility and maintainability. - Updated test_bbrsi.py to utilize the new strategy implementation and adjusted date ranges for testing. - Enhanced documentation to include details about the new Strategy class and its components.
6.2 KiB
Analysis Module
This document provides an overview of the Analysis module and its components, which are typically used for technical analysis of financial market data.
Modules
The Analysis module includes classes for calculating common technical indicators:
- Relative Strength Index (RSI): Implemented in
cycles/Analysis/rsi.py. - Bollinger Bands: Implemented in
cycles/Analysis/boillinger_band.py. - Trading Strategies: Implemented in
cycles/Analysis/strategies.py.
Class: RSI
Found in cycles/Analysis/rsi.py.
Calculates the Relative Strength Index.
Mathematical Model
- Average Gain (AvgU) and Average Loss (AvgD) over 14 periods:
\text{AvgU} = \frac{\sum \text{Upward Price Changes}}{14}, \quad \text{AvgD} = \frac{\sum \text{Downward Price Changes}}{14} - Relative Strength (RS):
RS = \frac{\text{AvgU}}{\text{AvgD}} - RSI:
RSI = 100 - \frac{100}{1 + RS}
__init__(self, period: int = 14)
- Description: Initializes the RSI calculator.
- Parameters:
period(int, optional): The period for RSI calculation. Defaults to 14. Must be a positive integer.
calculate(self, data_df: pd.DataFrame, price_column: str = 'close') -> pd.DataFrame
- Description: Calculates the RSI and adds it as an 'RSI' column to the input DataFrame. Handles cases where data length is less than the period by returning the original DataFrame with a warning.
- Parameters:
data_df(pd.DataFrame): DataFrame with historical price data. Must contain theprice_column.price_column(str, optional): The name of the column containing price data. Defaults to 'close'.
- Returns:
pd.DataFrame- The input DataFrame with an added 'RSI' column (containingnp.nanfor initial periods where RSI cannot be calculated). Returns a copy of the original DataFrame if the period is larger than the number of data points.
Class: BollingerBands
Found in cycles/Analysis/boillinger_band.py.
Bollinger Bands
Mathematical Model
- Middle Band: 20-day Simple Moving Average (SMA)
\text{Middle Band} = \frac{1}{20} \sum_{i=1}^{20} \text{Close}_{t-i} - Upper Band: Middle Band + 2 × 20-day Standard Deviation (σ)
\text{Upper Band} = \text{Middle Band} + 2 \times \sigma_{20} - Lower Band: Middle Band − 2 × 20-day Standard Deviation (σ)
\text{Lower Band} = \text{Middle Band} - 2 \times \sigma_{20}
__init__(self, period: int = 20, std_dev_multiplier: float = 2.0)
- Description: Initializes the BollingerBands calculator.
- Parameters:
period(int, optional): The period for the moving average and standard deviation. Defaults to 20. Must be a positive integer.std_dev_multiplier(float, optional): The number of standard deviations for the upper and lower bands. Defaults to 2.0. Must be positive.
calculate(self, data_df: pd.DataFrame, price_column: str = 'close') -> pd.DataFrame
- Description: Calculates Bollinger Bands and adds 'SMA' (Simple Moving Average), 'UpperBand', and 'LowerBand' columns to the DataFrame.
- Parameters:
data_df(pd.DataFrame): DataFrame with price data. Must include theprice_column.price_column(str, optional): The name of the column containing the price data (e.g., 'close'). Defaults to 'close'.
- Returns:
pd.DataFrame- The original DataFrame with added columns: 'SMA', 'UpperBand', 'LowerBand'.
Class: Strategy
Found in cycles/Analysis/strategies.py.
Implements various trading strategies using technical indicators.
__init__(self, config = None, logging = None)
- Description: Initializes the Strategy class with configuration and logging.
- Parameters:
config(dict): Configuration dictionary with strategy parameters. Must be provided.logging(logging object, optional): Logger for output messages. Defaults to None.
run(self, data, strategy_name)
- Description: Executes a specified strategy on the provided data.
- Parameters:
data(pd.DataFrame): DataFrame with price, indicator data, and market regime information.strategy_name(str): Name of the strategy to run. Currently supports "MarketRegimeStrategy".
- Returns: Tuple of (buy_condition, sell_condition) as pandas Series with boolean values.
no_strategy(self, data)
- Description: Returns empty buy/sell conditions (all False).
- Parameters:
data(pd.DataFrame): Input data DataFrame.
- Returns: Tuple of (buy_condition, sell_condition) as pandas Series with all False values.
rsi_bollinger_confirmation(self, rsi, window=14, std_mult=1.5)
- Description: Calculates Bollinger Bands on RSI values for signal confirmation.
- Parameters:
rsi(pd.Series): Series containing RSI values.window(int, optional): The period for the moving average. Defaults to 14.std_mult(float, optional): Standard deviation multiplier for bands. Defaults to 1.5.
- Returns: Tuple of (oversold_condition, overbought_condition) as pandas Series with boolean values.
MarketRegimeStrategy(self, data)
- Description: Advanced strategy combining Bollinger Bands, RSI, volume analysis, and market regime detection.
- Parameters:
data(pd.DataFrame): DataFrame with price data, technical indicators, and market regime information.
- Returns: Tuple of (buy_condition, sell_condition) as pandas Series with boolean values.
Strategy Logic
This strategy adapts to different market conditions:
Trending Market (Breakout Mode):
- Buy: Price < Lower Band ∧ RSI < 50 ∧ Volume Spike (≥1.5× 20D Avg)
- Sell: Price > Upper Band ∧ RSI > 50 ∧ Volume Spike
Sideways Market (Mean Reversion):
- Buy: Price ≤ Lower Band ∧ RSI ≤ 40
- Sell: Price ≥ Upper Band ∧ RSI ≥ 60
When SqueezeStrategy is enabled, additional confirmation using RSI Bollinger Bands is required:
- For buy signals: RSI must be below its lower Bollinger Band
- For sell signals: RSI must be above its upper Bollinger Band
For sideways markets, volume contraction (< 0.7× 30D Avg) is also checked to avoid false signals.