@@ -1127,6 +1127,7 @@ def run(self, **kwargs) -> pd.Series:
1127
1127
Profit Factor 2.08802
1128
1128
Expectancy [%] 8.79171
1129
1129
SQN 0.916893
1130
+ Kelly Criterion 0.6134
1130
1131
_strategy SmaCross
1131
1132
_equity_curve Eq...
1132
1133
_trades Size EntryB...
@@ -1298,7 +1299,7 @@ def constraint(_):
1298
1299
"of strategy parameters and returns a bool whether "
1299
1300
"the combination of parameters is admissible or not" )
1300
1301
1301
- if return_optimization and method != 'skopt' :
1302
+ if return_optimization and method not in ( 'skopt' , 'skopt_gp' ) :
1302
1303
raise ValueError ("return_optimization=True only valid if method='skopt'" )
1303
1304
1304
1305
def _tuple (x ):
@@ -1398,7 +1399,7 @@ def _optimize_skopt() -> Union[pd.Series,
1398
1399
Tuple [pd .Series , pd .Series ],
1399
1400
Tuple [pd .Series , pd .Series , dict ]]:
1400
1401
try :
1401
- from skopt import forest_minimize
1402
+ from skopt import forest_minimize , gp_minimize
1402
1403
from skopt .space import Integer , Real , Categorical
1403
1404
from skopt .utils import use_named_args
1404
1405
from skopt .callbacks import DeltaXStopper
@@ -1453,17 +1454,29 @@ def objective_function(**params):
1453
1454
warnings .filterwarnings (
1454
1455
'ignore' , 'The objective has been evaluated at this point before.' )
1455
1456
1456
- res = forest_minimize (
1457
- func = objective_function ,
1458
- dimensions = dimensions ,
1459
- n_calls = max_tries ,
1460
- base_estimator = ExtraTreesRegressor (n_estimators = 20 , min_samples_leaf = 2 ),
1461
- acq_func = 'LCB' ,
1462
- kappa = 3 ,
1463
- n_initial_points = min (max_tries , 20 + 3 * len (kwargs )),
1464
- initial_point_generator = 'lhs' , # 'sobel' requires n_initial_points ~ 2**N
1465
- callback = DeltaXStopper (9e-7 ),
1466
- random_state = random_state )
1457
+ if method == 'skopt_gp' :
1458
+ res = gp_minimize (
1459
+ func = objective_function ,
1460
+ dimensions = dimensions ,
1461
+ n_calls = max_tries ,
1462
+ n_jobs = - 1 ,
1463
+ acq_func = 'gp_hedge' ,
1464
+ n_initial_points = min (max_tries , 20 + 3 * len (kwargs )),
1465
+ initial_point_generator = 'random' , # 'sobel' requires n_initial_points ~ 2**N
1466
+ callback = DeltaXStopper (9e-7 ),
1467
+ random_state = random_state )
1468
+ else :
1469
+ res = forest_minimize (
1470
+ func = objective_function ,
1471
+ dimensions = dimensions ,
1472
+ n_calls = max_tries ,
1473
+ base_estimator = ExtraTreesRegressor (n_estimators = 20 , min_samples_leaf = 2 ),
1474
+ acq_func = 'LCB' ,
1475
+ kappa = 3 ,
1476
+ n_initial_points = min (max_tries , 20 + 3 * len (kwargs )),
1477
+ initial_point_generator = 'lhs' , # 'sobel' requires n_initial_points ~ 2**N
1478
+ callback = DeltaXStopper (9e-7 ),
1479
+ random_state = random_state )
1467
1480
1468
1481
stats = self .run (** dict (zip (kwargs .keys (), res .x )))
1469
1482
output = [stats ]
@@ -1486,7 +1499,7 @@ def objective_function(**params):
1486
1499
1487
1500
if method == 'grid' :
1488
1501
output = _optimize_grid ()
1489
- elif method == 'skopt' :
1502
+ elif method in ( 'skopt' , 'skopt_gp' ) :
1490
1503
output = _optimize_skopt ()
1491
1504
else :
1492
1505
raise ValueError (f"Method should be 'grid' or 'skopt', not { method !r} " )
0 commit comments