Skip to content

turtle_quant_1.strategies.helpers.support_resistance.stnry_fibonacci_retrace

turtle_quant_1.strategies.helpers.support_resistance.stnry_fibonacci_retrace

Stationary Fibonacci retracement support and resistance strategy.

StnryFibonacciRetrace

StnryFibonacciRetrace(
    peak_distance: int = 10,
    peak_prominence_pct: float = 0.02,
    fib_levels: List[float] = [],
)

Bases: BaseSupResStrategy

Stationary Fibonacci retracement support and resistance strategy.

This strategy identifies support and resistance levels by calculating Fibonacci retracement levels between significant swing highs and lows across the entire dataset. It finds the most significant swing points and computes the classic Fibonacci ratios: 23.6%, 38.2%, 50%, 61.8%, and 78.6%.

Initialize the StnryFibonacciRetrace strategy.

Parameters:

Name Type Description Default
peak_distance int

Minimum distance between peaks (in candlesticks).

10
peak_prominence_pct float

Minimum prominence for peaks (as fraction of price range).

0.02
fib_levels List[float]

List of Fibonacci ratios to use. Defaults to standard levels.

[]
Source code in src/turtle_quant_1/strategies/helpers/support_resistance/stnry_fibonacci_retrace.py
def __init__(
    self,
    peak_distance: int = 10,  # NOTE: This is a magic number. Depends on resampling.
    peak_prominence_pct: float = 0.02,
    fib_levels: List[float] = [],
):
    """Initialize the StnryFibonacciRetrace strategy.

    Args:
        peak_distance: Minimum distance between peaks (in candlesticks).
        peak_prominence_pct: Minimum prominence for peaks (as fraction of price range).
        fib_levels: List of Fibonacci ratios to use. Defaults to standard levels.
    """
    super().__init__()
    self.peak_distance = peak_distance
    self.peak_prominence_pct = peak_prominence_pct

    # Standard Fibonacci retracement levels
    if not fib_levels:
        self.fib_levels = [0.236, 0.382, 0.500, 0.618, 0.786]
    else:
        self.fib_levels = fib_levels

generate_historical_levels

generate_historical_levels(
    data: DataFrame, symbol: str
) -> DataFrame

Generate Fibonacci retracement levels for historical data.

Parameters:

Name Type Description Default
data DataFrame

DataFrame with OHLCV data containing columns: ['datetime', 'Open', 'High', 'Low', 'Close', 'Volume']

required
symbol str

The symbol being analyzed.

required

Returns:

Type Description
DataFrame

DataFrame with Fibonacci retracement levels.

DataFrame

The columns are: ['datetime', 'level_values'].

Source code in src/turtle_quant_1/strategies/helpers/support_resistance/stnry_fibonacci_retrace.py
def generate_historical_levels(
    self, data: pd.DataFrame, symbol: str
) -> pd.DataFrame:
    """Generate Fibonacci retracement levels for historical data.

    Args:
        data: DataFrame with OHLCV data containing columns:
              ['datetime', 'Open', 'High', 'Low', 'Close', 'Volume']
        symbol: The symbol being analyzed.

    Returns:
        DataFrame with Fibonacci retracement levels.
        The columns are: ['datetime', 'level_values'].
    """
    # Ensure we have the required columns
    required_cols = ["High", "Low"]
    if not all(col in data.columns for col in required_cols):
        raise ValueError(f"Data must contain {required_cols} columns")

    # TODO: This is a magic number.
    data_resampled = DataUnitConverter.convert_to_1h_data(symbol, data)
    level_values = self._calc_sup_res_levels(data_resampled)

    # Create output DataFrame with 1-to-1 mapping to original data
    result = pd.DataFrame(
        {
            "datetime": pd.to_datetime(data_resampled["datetime"]).reset_index(
                drop=True
            ),
            "level_values": level_values,
        }
    )

    result = data[["datetime"]].merge(result, on="datetime", how="left")
    result["level_values"] = result["level_values"].bfill().ffill()

    return result