np.random.seed(111) ls = np.random.choice(linestyles, size=loss_frame.shape[0]) for i, beta_ in enumerate(loss_frame.iloc[:, :-1].values): ls_ = ls[i] if (beta_ == beta_best).all(): draw_points = True linewidth = 2 else: draw_points = False linewidth = 1 draw(beta_, filtered_data, theor_maturities, title_date=CONFIG.SETTLE_DATE, longest_maturity_year=longest_maturity_year, draw_points=draw_points, weight_scheme=CONFIG.WEIGHT_SCHEME, ax=ax, ls=ls_, linewidth=linewidth, shift=True) ax.set_ylim(filtered_data.ytm.min() - 0.01, filtered_data['ytm'].max() + 0.01) ax.legend(loc='upper right') plt.savefig( f'spot_path_{CONFIG.WEIGHT_SCHEME}_{CONFIG.SETTLE_DATE}_{loss.__name__}.png', dpi=400) #numerical loss print('final loss is {loss} and yield MAE is {mae}'.format( loss=loss_frame['loss'].min(), mae=MAE_YTM(beta_best,
options = {'maxiter': 500, 'eps': 9e-5, 'disp': True} #Tuple of arguments for loss function loss_args = (filtered_data, coupons_cf, streak_data, CONFIG.RHO, CONFIG.WEIGHT_SCHEME) #defining loss loss = yield_Loss filtered_data['weight'] = weight([1, 1, 1, 1], filtered_data, CONFIG.WEIGHT_SCHEME) ###### OPTIMIZATION print('start optimization\n') res_ = iter_minimizer(Loss=loss, beta_init=x0, loss_args=loss_args, method='SLSQP', bounds=bounds, constraints=constr, max_deal_span=max_deal_span, options=options) beta_best = res_.x print('end optimization\n') ### Showing results of work draw(beta_best, filtered_data, theor_maturities, f'{CONFIG.SETTLE_DATE:%d.%m.%Y}', longest_maturity_year, draw_points=True, weight_scheme=CONFIG.WEIGHT_SCHEME, label='Spot rate curve', alpha=0.8, shift=True) plt.ylim(0, filtered_data.ytm.max() + 0.01) plt.savefig(f'zero_curve_{date:%d.%m.%Y}.png', dpi=400); plt.close()