def optimize_model(model: str, info: List[Info], data: Data, metric: str, day: int, rate: float, local: bool, use_fft: bool, **kwargs) -> opt.OptimizeResult: print(f"Optimizing {model} with {metric} on day {day}") actual_calls = data.prices[True][day] actual_puts = data.prices[False][day] pricer = GenPricer(model=model, market=EvalArgs.from_structure(data=data, info=info, rate=rate, day=day), use_fft=use_fft) optimizer = opt.minimize if local else opt.differential_evolution t0 = time() result = pricer.optimize_pars(metric=metric, actual_calls=actual_calls, actual_puts=actual_puts, bounds=par_bounds[model], optimizer=optimizer, **kwargs) with open(hf.get_log_file_name(model=model, metric=metric), 'a+') as log: hf.log_print( f"Time spent for {model}, day {day}: {timedelta(seconds=(time() - t0))}\n", out1=log) return result
def cut_by_bs_delta(data: Data, info: List[Info], rate=0.008, disp=False) -> Tuple[Data, List[Info]]: for day, is_call in [(d, c) for d in range(len(info)) for c in [True, False]]: pricer = gp.GenPricer(model='bs', market=EvalArgs.from_structure(data=data, info=info, rate=rate, day=day), use_fft=False) result: opt.OptimizeResult = pricer.optimize_pars( metric='MAE', actual_calls=data.prices[True][day], actual_puts=data.prices[False][day], bounds=config.par_bounds['bs'], optimizer=opt.differential_evolution, polish=True, disp=disp) bs_sigma = result.x[0] bs_sigma = bs_sigma deltas = bs.bs_delta(spot=info[day].spot, strikes=data.strikes[is_call][day], r=rate, q=rate, t=info[day].mat, bs_sigma=bs_sigma, is_call=is_call) data.prices[is_call][day] = data.prices[is_call][day][ np.abs(deltas) >= .1] data.strikes[is_call][day] = data.strikes[is_call][day][ np.abs(deltas) >= .1] return data, info