Skip to content

Releases: eq19/maps

v0.2.19

25 Dec 13:58
1f9c13a

Choose a tag to compare

Full Changelog: v0.2.18...v0.2.19

COmpendium of RElations – Modulo 6

Download action repository 'eq19/maps@v8' (SHA:c6194cc0e448d1e91083b1856e8689fb098b7eae)
Download action repository 'eq19/feed@v6' (SHA:0c2fc49365e51ae87aa1e8c999927773643ec827)
Download action repository 'eq19/lexer@v4' (SHA:1a7f40bbd717a5e78e8259464f34256f02b547db)
Download action repository 'eq19/eq19@v2' (SHA:af444f788505ab2e38d768875795bce2d3859419)

v0.2.18

24 Dec 13:19
c6194cc

Choose a tag to compare

Full Changelog: v0.2.17...v0.2.18

class EnhancedCatboostRegressor(BaseFreqAIModel):
    """
    Enhanced CatBoost Regressor for FreqAI
    
    CatBoost is a gradient boosting algorithm that handles categorical features
    automatically and provides excellent performance on financial time series data.
    
    Advantages:
    - Automatic categorical feature handling
    - Robust to overfitting
    - Good performance on small datasets
    - Built-in feature importance
    """
    
    model_type = "tree_based"
    default_parameters = {
        "iterations": 100,
        "learning_rate": 0.05,
        "depth": 6,
        "l2_leaf_reg": 3,
        "random_strength": 1,
        "bagging_temperature": 1,
        "border_count": 254,
        "verbose": False,
        "task_type": "CPU",
        "early_stopping_rounds": 10,
        "eval_metric": "RMSE"
    }
    
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        if not CATBOOST_AVAILABLE:
            raise ImportError("CatBoost is required. Install with: pip install catboost")
        self.catboost = cb
    
    def fit(self, X: np.ndarray, y: np.ndarray, **kwargs) -> 'EnhancedCatboostRegressor':
        """Train the CatBoost model with enhanced logging"""
        self.validate_data(X, y)
        X = self.preprocess_features(X)
        
        # Create CatBoost dataset
        train_data = self.catboost.Pool(X, y)
        
        # Initialize model
        self.model = self.catboost.CatBoostRegressor(**self.parameters)
        
        # Train model
        self.model.fit(train_data, **kwargs)
        
        self.is_trained = True
        self.feature_names = [f"feature_{i}" for i in range(X.shape[1])]
        
        # Log training completion
        self._setup_logging()
        self.logger.info(f"CatBoost model trained with {X.shape[0]} samples, {X.shape[1]} features")
        return self
    
    def predict(self, X: np.ndarray) -> np.ndarray:
        """Make predictions"""
        if not self.is_trained:
            raise ValueError("Model must be trained before making predictions")
        
        X = self.preprocess_features(X)
        return self.model.predict(X)
    
    def get_feature_importance(self) -> Optional[np.ndarray]:
        """Get CatBoost feature importance"""
        if self.is_trained and hasattr(self.model, 'get_feature_importance'):
            return self.model.get_feature_importance()
        return None

v0.2.17

22 Dec 02:23
fad6d7b

Choose a tag to compare

Full Changelog: v0.2.16...v0.2.17

{
  "freqai": {
    "enabled": true,
    "identifier": "indodax-1h-24h-v1",

    "purge_old_models": 1,

    "train_period_days": 21,
    "backtest_period_days": 7,

    "live_retrain_hours": 24,

    "feature_parameters": {
      "include_timeframes": ["1h"],

      "include_corr_pairlist": [
        "BTC/IDR",
        "ETH/IDR"
      ],

      "label_period_candles": 24,

      "include_shifted_candles": 3,
      "indicator_periods_candles": [12, 24],

      "DI_threshold": 0.75,
      "weight_factor": 0.9,

      "principal_component_analysis": false,
      "use_SVM_to_remove_outliers": true,

      "plot_feature_importances": 0
    },

    "data_split_parameters": {
      "test_size": 0,
      "random_state": 42
    },

    "model_training_parameters": {
      "n_estimators": 600,
      "learning_rate": 0.05,
      "max_depth": 5
    }
  }
}

v0.2.16

21 Dec 12:31
d29020d

Choose a tag to compare

Full Changelog: v0.2.15...v0.2.16

----------------------------------------------------------------------------------
ID: 1 👉 Running CalmarHyperOptLoss | Days: 7 | Epochs: 2500
Spaces: all | FreqAImodel: CatboostClassifierMultiTarget
----------------------------------------------------------------------------------

v0.2.15

21 Dec 04:28
ba8c4da

Choose a tag to compare

Full Changelog: v0.2.14...v0.2.15

    def set_freqai_targets(
        self,
        dataframe: DataFrame,
        metadata: dict,
        **kwargs
    ) -> DataFrame:
        """
        FreqAI target definition for:
        - Classifier
        - ClassifierMultiTarget
        - Regressor
        - RegressorMultiTarget
        """

        model_name = self.model_name.lower()
        is_classifier = "classifier" in model_name
        is_multi_target = "multitarget" in model_name

        label_period = self.freqai_info["feature_parameters"]["label_period_candles"]

        if is_classifier:
            # ==================================================
            # CLASSIFIERS
            # ==================================================

            if is_multi_target:
                # CatboostClassifierMultiTarget
                # IMPORTANT:
                # - class labels must be UNIQUE across targets
                # - target 1 uses {0, 1}
                # - target 2 uses {2, 3}
                self.freqai.class_names = [0, 1, 2, 3]

                # Target 1: direction (0 = down, 1 = up)
                dataframe["&s-up_or_down"] = (
                    dataframe["close"].shift(-label_period) > dataframe["close"]
                ).astype(int)

                # Target 2: volatility (2 = low, 3 = high)
                dataframe["&s-volatility"] = (
                    (
                        dataframe["close"].rolling(label_period).std()
                        > dataframe["close"].rolling(label_period).std().median()
                    ).astype(int)
                    + 2
                )

            else:
                # CatboostClassifier (single target)
                self.freqai.class_names = [0, 1]

                dataframe["&s-up_or_down"] = (
                    dataframe["close"].shift(-label_period) > dataframe["close"]
                ).astype(int)

        else:
            # ==================================================
            # REGRESSORS
            # ==================================================
            if is_multi_target:
                # CatboostRegressorMultiTarget
                dataframe["&-s_close"] = (
                    dataframe["close"]
                    .shift(-label_period) hi
                    .rolling(label_period)
                    .mean()
                    / dataframe["close"]
                    - 1
                )

                dataframe["&-s_range"] = (
                    dataframe["close"]
                    .shift(-label_period)
                    .rolling(label_period)
                    .max()
                    -
                    dataframe["close"]
                    .shift(-label_period)
                    .rolling(label_period)
                    .min()
                )

            else:
                # CatboostRegressor
                dataframe["&-s_close"] = (
                    dataframe["close"]
                    .shift(-label_period)
                    .rolling(label_period)
                    .mean()
                    / dataframe["close"]
                    - 1
                )

        return dataframe

Screenshot_2025-12-21-10-33-03-754_org telegram messenger
Screenshot_2025-12-21-10-31-22-499_com google android apps cloudconsole

v0.2.14

20 Dec 07:14
55254c9

Choose a tag to compare

Full Changelog: v0.2.13...v0.2.14

COmpendium of RElations – Modulo 6

    def set_freqai_targets(
        self,
        dataframe: DataFrame,
        metadata: dict,
        **kwargs
    ) -> DataFrame:
        """
        FreqAI target definition for:
        - Classifier
        - ClassifierMultiTarget
        - Regressor
        - RegressorMultiTarget
        """

        model_name = self.model_name.lower()
        is_classifier = "classifier" in model_name
        is_multi_target = "multitarget" in model_name

        label_period = self.freqai_info["feature_parameters"]["label_period_candles"]

        if is_classifier:
            # ==================================================
            # CLASSIFIERS
            # ==================================================
            self.freqai.class_names = [0, 1]

            if is_multi_target:
                # ClassifierMultiTarget
                dataframe["&s-up_or_down"] = (
                    dataframe["close"].shift(-label_period) > dataframe["close"]
                ).astype(int)

                dataframe["&s-volatility"] = (
                    dataframe["close"].rolling(label_period).std()
                    > dataframe["close"].rolling(label_period).std().median()
                ).astype(int)

            else:
                # Classifier
                dataframe["&s-up_or_down"] = (
                    dataframe["close"].shift(-label_period) > dataframe["close"]
                ).astype(int)

        else:
            # ==================================================
            # REGRESSORS
            # ==================================================
            if is_multi_target:
                # RegressorMultiTarget
                dataframe["&-s_close"] = (
                    dataframe["close"]
                    .shift(-label_period)
                    .rolling(label_period)
                    .mean()
                    / dataframe["close"]
                    - 1
                )

                dataframe["&-s_range"] = (
                    dataframe["close"]
                    .shift(-label_period)
                    .rolling(label_period)
                    .max()
                    -
                    dataframe["close"]
                    .shift(-label_period)
                    .rolling(label_period)
                    .min()
                )

            else:
                # Regressor
                dataframe["&-s_close"] = (
                    dataframe["close"]
                    .shift(-label_period)
                    .rolling(label_period)
                    .mean()
                    / dataframe["close"]
                    - 1
                )

        return dataframe

Screenshot_2025-12-20-14-26-53-853_com android chrome

    def set_freqai_targets(
        self,
        dataframe: DataFrame,
        metadata: dict,
        **kwargs
    ) -> DataFrame:
        """
        FreqAI target definition for:
        - Classifier
        - ClassifierMultiTarget
        - Regressor
        - RegressorMultiTarget
        """

        model_name = self.model_name.lower()
        is_classifier = "classifier" in model_name
        is_multi_target = "multitarget" in model_name

        label_period = self.freqai_info["feature_parameters"]["label_period_candles"]

        if is_classifier:
            # ==================================================
            # CLASSIFIERS
            # ==================================================
            self.freqai.class_names = [0, 1]

            # Classifier
            dataframe["&s-up_or_down"] = (
                dataframe["close"].shift(-label_period) > dataframe["close"]
           ).astype(int)

            if is_multi_target:
                # ClassifierMultiTarget
                dataframe["&s-volatility"] = (
                    dataframe["close"].rolling(label_period).std()
                    > dataframe["close"].rolling(label_period).std().median()
                ).astype(int)

        else:
            # ==================================================
            # REGRESSORS
            # ==================================================
            # Regressor
            dataframe["&-s_close"] = (
                dataframe["close"]
                .shift(-label_period)
                .rolling(label_period)
                .mean()
                 / dataframe["close"]
                 - 1
             )

             if is_multi_target:
                # RegressorMultiTarget
                dataframe["&-s_range"] = (
                    dataframe["close"]
                    .shift(-label_period)
                    .rolling(label_period)
                    .max()
                    -
                    dataframe["close"]
                    .shift(-label_period)
                    .rolling(label_period)
                    .min()
                )

        return dataframe

v0.2.13

20 Dec 06:43
aa14acd

Choose a tag to compare

Full Changelog: v0.2.12...v0.2.13

    def set_freqai_targets(self, dataframe: DataFrame, metadata: dict, **kwargs) -> DataFrame:
        """
        *Only functional with FreqAI enabled strategies*
        Required function to set the targets for the model.
        All targets must be prepended with `&` to be recognized by the FreqAI internals.

        More details about feature engineering available:

        https://www.freqtrade.io/en/latest/freqai-feature-engineering

        :param dataframe: strategy dataframe which will receive the targets
        :param metadata: metadata of current pair
        usage example: dataframe["&-target"] = dataframe["close"].shift(-1) / dataframe["close"]
        """
        is_classifier = "classifier" in self.model_name.lower()
        is_multi_target = "multitarget" in self.model_name.lower()

        # Classifiers are typically set up with strings as targets:
        if is_classifier:
            self.freqai.class_names = ["down", "up"]
            dataframe["&s-up_or_down"] = np.where(
                dataframe["close"].shift(-50) > dataframe["close"], "up", "down"
            )
        else:
            dataframe["&-s_close"] = (
                dataframe["close"]
                .shift(-self.freqai_info["feature_parameters"]["label_period_candles"])
                .rolling(self.freqai_info["feature_parameters"]["label_period_candles"])
                .mean()
                / dataframe["close"]
                - 1
            )

        # If user wishes to use multiple targets, they can add more by
        # appending more columns with '&'. User should keep in mind that multi targets
        # requires a multioutput prediction model such as
        # freqai/prediction_models/CatboostRegressorMultiTarget.py,
        # freqtrade trade --freqaimodel CatboostRegressorMultiTarget

        if is_multi_target:
            dataframe["&-s_range"] = (
                dataframe["close"]
                .shift(-self.freqai_info["feature_parameters"]["label_period_candles"])
                .rolling(self.freqai_info["feature_parameters"]["label_period_candles"])
                .max()
                -
                dataframe["close"]
                .shift(-self.freqai_info["feature_parameters"]["label_period_candles"])
                .rolling(self.freqai_info["feature_parameters"]["label_period_candles"])
                .min()
            )

        return dataframe

v0.2.12

20 Dec 05:19
b3c1186

Choose a tag to compare

Full Changelog: v0.2.11...v0.2.12

COmpendium of RElations – Modulo 6

    def set_freqai_targets(self, dataframe: DataFrame, metadata: dict, **kwargs) -> DataFrame:
        """
        *Only functional with FreqAI enabled strategies*
        Required function to set the targets for the model.
        All targets must be prepended with `&` to be recognized by the FreqAI internals.

        More details about feature engineering available:

        https://www.freqtrade.io/en/latest/freqai-feature-engineering

        :param dataframe: strategy dataframe which will receive the targets
        :param metadata: metadata of current pair
        usage example: dataframe["&-target"] = dataframe["close"].shift(-1) / dataframe["close"]
        """
        is_classifier = "classifier" in self.model_name.lower()
        is_multi_target = "multitarget" in self.model_name.lower()

        # Classifiers are typically set up with strings as targets:
        if is_classifier:
            self.freqai.class_names = ["down", "up"]
            dataframe["&s-up_or_down"] = np.where(
                dataframe["close"].shift(-50) > dataframe["close"], "up", "down"
            )

v0.2.11

20 Dec 03:39
9e010e0

Choose a tag to compare

Full Changelog: v0.2.8...v0.2.11

Screenshot_2025-12-20-10-48-37-288_com android chrome

v0.2.10

19 Dec 15:38
ae46b8e

Choose a tag to compare

Full Changelog: v0.2.8...v0.2.10