Releases: eq19/maps
Releases · eq19/maps
v0.2.19
Full Changelog: v0.2.18...v0.2.19
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
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
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
Full Changelog: v0.2.15...v0.2.16
----------------------------------------------------------------------------------
ID: 1 👉 Running CalmarHyperOptLoss | Days: 7 | Epochs: 2500
Spaces: all | FreqAImodel: CatboostClassifierMultiTarget
----------------------------------------------------------------------------------
v0.2.15
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
v0.2.14
Full Changelog: v0.2.13...v0.2.14
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
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
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
Full Changelog: v0.2.11...v0.2.12
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
Full Changelog: v0.2.8...v0.2.11
v0.2.10
Full Changelog: v0.2.8...v0.2.10



