output = output.rolling(window=self.CONV_WIDTH).apply(_predict)
return output
- def get_storage(self, pair: Optional[str] = None) -> Optional[BaseStorage]:
+ def get_storage(self, pair: Optional[str] = None) -> BaseStorage:
"""
Get the storage for Optuna
"""
storage = JournalStorage(
JournalFileBackend(f"{storage_dir}/{storage_filename}.log")
)
+ else:
+ raise ValueError(
+ f"Unsupported storage backend: {storage_backend}. Supported backends are: 'sqlite' and 'file'."
+ )
return storage
@staticmethod
return
time_spent = time.time() - start_time
- if self.optuna_study_has_best_params(study):
+ if QuickAdapterRegressorV3.optuna_study_has_best_params(study):
params_storage[pair] = study.best_params
rmse_storage[pair] = study.best_value
logger.info(f"Optuna {namespace} hyperopt done ({time_spent:.2f} secs)")
f"Optuna {namespace} hyperopt failed ({time_spent:.2f} secs): no study best params found"
)
- def optuna_storage(self, pair: str) -> Optional[optuna.storages.BaseStorage]:
+ def optuna_storage(self, pair: str) -> optuna.storages.BaseStorage:
storage_dir = self.full_path
storage_filename = f"optuna-{pair.split('/')[0]}"
storage_backend = self.__optuna_config.get("storage")
f"{storage_dir}/{storage_filename}.log"
)
)
+ else:
+ raise ValueError(
+ f"Unsupported optuna storage backend: {storage_backend}. Supported backends are 'sqlite' and 'file'."
+ )
return storage
def optuna_create_study(
self, study_name: str, pair: str
) -> Optional[optuna.study.Study]:
- storage = self.optuna_storage(pair)
- if storage is None:
- logger.error(f"Failed to create optuna storage for {study_name}")
+ try:
+ storage = self.optuna_storage(pair)
+ except Exception as e:
+ logger.error(
+ f"Failed to create optuna storage for {study_name}: {str(e)}",
+ exc_info=True,
+ )
return None
if self.__optuna_config.get("continuous"):
- self.optuna_study_delete(study_name, storage)
+ QuickAdapterRegressorV3.optuna_study_delete(study_name, storage)
try:
return optuna.create_study(
@staticmethod
def is_trade_duration_valid(trade_duration_candles: int) -> bool:
- if isna(trade_duration_candles):
- return False
- if trade_duration_candles == 0:
- return False
- return True
+ return not (isna(trade_duration_candles) or trade_duration_candles <= 0)
def get_stoploss_distance(
self, df: DataFrame, trade: Trade, current_rate: float
import numpy as np
import pandas as pd
import talib.abstract as ta
-from typing import Callable
+from typing import Callable, Union
from scipy.signal import convolve
from scipy.signal.windows import gaussian
from technical import qtpylib
-def get_distance(p1: pd.Series | float, p2: pd.Series | float) -> pd.Series | float:
+def get_distance(
+ p1: Union[pd.Series, float], p2: Union[pd.Series, float]
+) -> Union[pd.Series, float]:
return abs(p1 - p2)