Python examples for ‘Beyond Nelson-Siegel and splines: A model- agnostic Machine Learning framework for discount curve calibration, interpolation and extrapolation’

R-bloggers 2026-01-06

[This article was first published on T. Moudiki's Webpage - R, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

The preprint is https://www.researchgate.net/publication/392507059_Beyond_Nelson-Siegel_and_splines_A_model-_agnostic_Machine_Learning_framework_for_discount_curve_calibration_interpolation_and_extrapolation.

THe preprint uses R; R code to be released soon.

!pip install yieldcurveml#!pip install git+https://github.com/Techtonique/yieldcurve.git!pip install numpy<2.0.0/bin/bash: line 1: 2.0.0: No such file or directoryimport numpy as npimport matplotlib.pyplot as pltfrom sklearn.ensemble import ExtraTreesRegressorfrom sklearn.neural_network import MLPRegressorfrom sklearn.kernel_ridge import KernelRidgefrom sklearn.linear_model import LinearRegression, Ridge, RidgeCVfrom yieldcurveml.interpolatecurve import CurveInterpolator# Your data (divided by 100)yM = [9.193782, 9.502359, 9.804080, 9.959691, 10.010291,      9.672974, 9.085818, 8.553107, 8.131273, 7.808959,      7.562701, 7.371855, 7.221084, 7.099587]yM = np.asarray([yM[i]/100 for i in range(len(yM))])tm = np.asarray([0.08333333, 0.25000000, 0.50000000, 0.75000000, 1.00000000,      2.00000000, 3.00000000, 4.00000000, 5.00000000, 6.00000000,      7.00000000, 8.00000000, 9.00000000, 10.00000000])# Define models to comparemodels = {    'Extra Trees': ExtraTreesRegressor(n_estimators=1000, min_samples_leaf=1, min_samples_split=2),    'Ridge': RidgeCV(alphas=10**np.linspace(-10, 10, 100)),    'KRR': KernelRidge(alpha=0.1, kernel='rbf'),    'Linear': LinearRegression()}# Create subplot figurefig, (ax1, ax2) = plt.subplots(1, 2, figsize=(20, 8))# Plot for Laguerre basisax1.scatter(tm, yM, color='black', label='Original points', zorder=5)for name, model in models.items():    interpolator = CurveInterpolator(estimator=model, type_regressors="laguerre")    interpolator.fit(tm, yM)    yM_interp = interpolator.predict(tm)    ax1.plot(tm, yM_interp.spot_rates, label=f'{name}', alpha=0.7)ax1.set_xlabel('Maturity (years)')ax1.set_ylabel('Yield')ax1.set_title('Yield Curve Interpolation - Laguerre Basis')ax1.legend()ax1.grid(True, alpha=0.3)# Plot for Cubic basisax2.scatter(tm, yM, color='black', label='Original points', zorder=5)for name, model in models.items():    interpolator = CurveInterpolator(estimator=model, type_regressors="cubic")    interpolator.fit(tm, yM)    yM_interp = interpolator.predict(tm)    ax2.plot(tm, yM_interp.spot_rates, label=f'{name}', alpha=0.7)ax2.set_xlabel('Maturity (years)')ax2.set_ylabel('Yield')ax2.set_title('Yield Curve Interpolation - Cubic Basis')ax2.legend()ax2.grid(True, alpha=0.3)plt.tight_layout()plt.show()# Print residuals for each model and basisprint("\nResiduals (RMSE):")for basis in ["laguerre", "cubic"]:    print(f"\n{basis.capitalize()} basis:")    for name, model in models.items():        interpolator = CurveInterpolator(estimator=model, type_regressors=basis)        interpolator.fit(tm, yM)        yM_interp = interpolator.predict(tm)        rmse = np.sqrt(np.mean((yM - yM_interp.spot_rates) ** 2))        print(f"{name}: {rmse:.6f}")

image-title-here

Residuals (RMSE):Laguerre basis:Extra Trees: 0.000000Ridge: 0.001300KRR: 0.005551Linear: 0.001368Cubic basis:Extra Trees: 0.000000Ridge: 0.003231KRR: 0.007679Linear: 0.002490import matplotlib.pyplot as pltimport numpy as npfrom sklearn.ensemble import ExtraTreesRegressorfrom sklearn.neural_network import MLPRegressorfrom sklearn.kernel_ridge import KernelRidgefrom sklearn.linear_model import LinearRegression, Ridge, RidgeCVfrom yieldcurveml.interpolatecurve import CurveInterpolator# Your data (divided by 100)yM = np.asarray([9.193782, 9.502359, 9.804080, 9.959691, 10.010291,      9.672974, 9.085818, 8.553107, 8.131273, 7.808959,      7.562701, 7.371855, 7.221084, 7.099587])/100tm = np.asarray([0.08333333, 0.25000000, 0.50000000, 0.75000000, 1.00000000,      2.00000000, 3.00000000, 4.00000000, 5.00000000, 6.00000000,      7.00000000, 8.00000000, 9.00000000, 10.00000000])# Define models to comparemodels = {    'Extra Trees': ExtraTreesRegressor(n_estimators=1000, min_samples_leaf=1, min_samples_split=2),    'Ridge': RidgeCV(alphas=10**np.linspace(-10, 10, 100)),    'KRR': KernelRidge(alpha=0.1, kernel='rbf'),    'Linear': LinearRegression()}# Create subplot figurefig, (ax1, ax2) = plt.subplots(1, 2, figsize=(20, 8))# Plot for Laguerre basisax1.scatter(tm, yM, color='black', label='Original points', zorder=5)for name, model in models.items():    interpolator = CurveInterpolator(estimator=model, type_regressors="laguerre")    interpolator.fit(tm, yM)    yM_interp = interpolator.predict(tm)    ax1.plot(tm, yM_interp.spot_rates, label=f'{name}', alpha=0.7)ax1.set_xlabel('Maturity (years)')ax1.set_ylabel('Yield')ax1.set_title('Yield Curve Interpolation - Laguerre Basis')ax1.legend()ax1.grid(True, alpha=0.3)# Plot for Cubic basisax2.scatter(tm, yM, color='black', label='Original points', zorder=5)for name, model in models.items():    interpolator = CurveInterpolator(estimator=model, type_regressors="cubic")    interpolator.fit(tm, yM)    yM_interp = interpolator.predict(tm)    ax2.plot(tm, yM_interp.spot_rates, label=f'{name}', alpha=0.7)ax2.set_xlabel('Maturity (years)')ax2.set_ylabel('Yield')ax2.set_title('Yield Curve Interpolation - Cubic Basis')ax2.legend()ax2.grid(True, alpha=0.3)plt.tight_layout()plt.show()# Print residuals for each model and basisprint("\nResiduals (RMSE):")for basis in ["laguerre", "cubic"]:    print(f"\n{basis.capitalize()} basis:")    for name, model in models.items():        interpolator = CurveInterpolator(estimator=model, type_regressors=basis)        interpolator.fit(tm, yM)        yM_interp = interpolator.predict(tm)        rmse = np.sqrt(np.mean((yM - yM_interp.spot_rates) ** 2))        print(f"{name}: {rmse:.6f}")

image-title-here

Residuals (RMSE):Laguerre basis:Extra Trees: 0.000000Ridge: 0.001300KRR: 0.005551Linear: 0.001368Cubic basis:Extra Trees: 0.000000Ridge: 0.003231KRR: 0.007679Linear: 0.002490import numpy as npfrom yieldcurveml.deterministicshift.shift import ArbitrageFreeShortRate# ==========================================================================# 1. GENERATE SYNTHETIC DATA# ==========================================================================print("\n[1/6] Generating synthetic yield curve data...")np.random.seed(42)n_dates = 100maturities = np.array([0.25, 0.5, 1, 2, 3, 5, 7, 10])model = ArbitrageFreeShortRate(lambda_param=0.7, dt=1/12)# Time-varying Nelson-Siegel factorsbeta1 = 0.03 + 0.01 * np.sin(2 * np.pi * np.arange(n_dates) / 50)beta2 = -0.015 + 0.005 * np.cumsum(np.random.normal(0, 0.2, n_dates)) / np.sqrt(np.arange(1, n_dates+1))beta3 = 0.005 + 0.002 * np.random.normal(0, 1, n_dates)yield_data = np.zeros((n_dates, len(maturities)))for i in range(n_dates):    for j, tau in enumerate(maturities):        yield_data[i, j] = model.nelson_siegel_curve(tau, beta1[i], beta2[i], beta3[i])yield_data += np.random.normal(0, 0.001, yield_data.shape)print(f"  ✓ Generated {n_dates} yield curves")print(f"  ✓ Maturities: {maturities}")# ==========================================================================# 2. THREE METHODS FOR SHORT RATE CONSTRUCTION# ==========================================================================print("\n[2/6] Testing three short rate construction methods...")# Method 1: Nelson-Siegel Extrapolationrates1 = model.method1_ns_extrapolation(yield_data, maturities)print(f"\n  Method 1 (NS Extrapolation - Eq. 8):")print(f"    Mean: {rates1.mean()*100:.3f}%")print(f"    Std:  {rates1.std()*100:.3f}%")print(f"    Last: {rates1[-1]*100:.3f}%")# Method 2: ML Featuresrates2 = model.method2_ml_features(yield_data, maturities)print(f"\n  Method 2 (NS + ML - Definition 2):")print(f"    Mean: {rates2.mean()*100:.3f}%")print(f"    Std:  {rates2.std()*100:.3f}%")print(f"    Last: {rates2[-1]*100:.3f}%")# Method 3: Direct Regressionrates3 = model.method3_direct_regression(yield_data, maturities)print(f"\n  Method 3 (Direct Regression - Definition 3):")print(f"    Mean: {rates3.mean()*100:.3f}%")print(f"    Std:  {rates3.std()*100:.3f}%")print(f"    Last: {rates3[-1]*100:.3f}%")# ==========================================================================# 3. SIMULATE SHORT RATE PATHS# ==========================================================================print("\n[3/6] Simulating short rate paths...")n_paths = 2000n_periods = 60time_grid = np.arange(n_periods) * model.dtpaths = model.simulate_paths(n_paths=n_paths, n_periods=n_periods, model_type='AR1')print(f"  ✓ Simulated {n_paths} paths")print(f"  ✓ Time horizon: {n_periods} months ({n_periods/12:.1f} years)")print(f"  ✓ Mean rate at T=1Y:  {np.mean(paths[:, 12])*100:.3f}%")print(f"  ✓ Mean rate at T=3Y:  {np.mean(paths[:, 36])*100:.3f}%")print(f"  ✓ Mean rate at T=5Y:  {np.mean(paths[:, 59])*100:.3f}%")# ==========================================================================# 4. DETERMINISTIC SHIFT ADJUSTMENT (Core Algorithm)# ==========================================================================print("\n[4/6] Applying deterministic shift adjustment (Proposition 1)...")# Create market prices (flat 3.5% curve)market_prices = np.exp(-0.035 * time_grid)# Apply adjustmentadjusted_prices, shift = model.deterministic_shift_adjustment(    paths, market_prices, time_grid)# Validate FTAPerrors = np.abs(adjusted_prices - market_prices) / market_prices * 100print(f"\n  Fundamental Theorem of Asset Pricing Verification:")print(f"    Average error: {errors.mean():.4f}%")print(f"    Maximum error: {errors.max():.4f}%")print(f"    RMSE:         {np.sqrt(np.mean(errors**2)):.4f}%")# Detailed error tableprint(f"\n  Error Breakdown by Maturity:")print(f"  {'Maturity':<10} {'Market':<12} {'Adjusted':<12} {'Error (bps)':<12} {'Status'}")print(f"  {'-'*60}")test_indices = [12, 24, 36, 48, 60]  # 1Y, 2Y, 3Y, 4Y, 5Yfor idx in test_indices:    if idx < len(market_prices):        T = time_grid[idx]        P_market = market_prices[idx]        P_adj = adjusted_prices[idx]        error_bps = abs(P_adj - P_market) / P_market * 10000        status = "✓" if error_bps < 10 else "!"        print(f"  {T:<10.2f}Y {P_market:<12.6f} {P_adj:<12.6f} {error_bps:<12.2f} {status}")# Validateis_valid = model.validate_arbitrage_free(adjusted_prices, market_prices, tolerance=0.001)# ==========================================================================# 5. MONTE CARLO PRICING WITH CONFIDENCE INTERVALS# ==========================================================================print("\n[5/6] Monte Carlo pricing with confidence intervals...")test_maturities = [1.0, 3.0, 5.0]print(f"\n  Zero-Coupon Bond Prices:")print(f"  {'Maturity':<10} {'Price':<12} {'Std Error':<12} {'95% CI':<25} {'N'}")print(f"  {'-'*75}")for T in test_maturities:    result = model.monte_carlo_price_with_ci(paths, time_grid, T, use_adjusted=True)    ci_str = f"[{result.ci_lower:.6f}, {result.ci_upper:.6f}]"    print(f"  {T:<10.1f}Y {result.price:<12.6f} {result.std_error:<12.6f} {ci_str:<25} {result.n_simulations}")# ==========================================================================# 6. DERIVATIVES PRICING# ==========================================================================print("\n[6/6] Pricing interest rate derivatives...")# Cap pricingprint(f"\n  Interest Rate Caps:")print(f"  {'-'*80}")cap_specs = [    {'strike': 0.03, 'maturity': 3.0, 'freq': 0.25},    {'strike': 0.04, 'maturity': 5.0, 'freq': 0.25},    {'strike': 0.05, 'maturity': 5.0, 'freq': 0.5},]for spec in cap_specs:    cap_value, cap_se, caplet_details = model.price_cap(        paths, time_grid,        strike=spec['strike'],        cap_maturity=spec['maturity'],        payment_freq=spec['freq'],        notional=1_000_000,        use_adjusted_rates=True    )    print(f"\n  Cap: Strike={spec['strike']*100:.1f}%, Maturity={spec['maturity']}Y, Freq={spec['freq']}Y")    print(f"    Value:     ${cap_value:,.2f} ± ${cap_se:,.2f}")    print(f"    Caplets:   {len(caplet_details)}")    print(f"    First 3 caplets:")    for i, detail in enumerate(caplet_details[:3]):        print(f"      #{i+1}: T_reset={detail.reset_time:.2f}Y, "                f"Value=${detail.value:,.2f}, "                f"Fwd={detail.forward_rate_mean*100:.2f}%")# Swaption pricingprint(f"\n  Interest Rate Swaptions:")print(f"  {'-'*80}")swaption_specs = [    {'T_option': 1.0, 'swap_maturity': 5.0, 'strike': 0.03, 'type': 'payer'},    {'T_option': 2.0, 'swap_maturity': 5.0, 'strike': 0.035, 'type': 'payer'},    {'T_option': 1.0, 'swap_maturity': 3.0, 'strike': 0.04, 'type': 'receiver'},]for spec in swaption_specs:    is_payer = (spec['type'] == 'payer')    result = model.price_swaption(        paths, time_grid,        T_option=spec['T_option'],        swap_maturity=spec['swap_maturity'],        strike=spec['strike'],        notional=1_000_000,        payment_freq=0.5,        is_payer=is_payer,        use_adjusted_rates=True    )    print(f"\n  {spec['type'].upper()} Swaption: "            f"{spec['T_option']}Y into {spec['swap_maturity']}Y @ {spec['strike']*100:.2f}%")    print(f"    Value: ${result.price:,.2f} ± ${result.std_error:,.2f}")    print(f"    95% CI: [${result.ci_lower:,.2f}, ${result.ci_upper:,.2f}]")# ==========================================================================# SUMMARY# ==========================================================================print("\n" + "="*80)print("IMPLEMENTATION SUMMARY")print("="*80)print("\n✓ Theoretical Correctness:")print("  • Equation 5 (Forward rates):     [t,T] integral bounds")print("  • Equation 6 (Adjusted prices):   Proper trapezoidal integration")print("  • Proposition 1 (Shift):          φ(T) = f^M - f̂")print("  • Three methods:                  All implemented correctly")print("\n✓ Numerical Accuracy:")print(f"  • FTAP average error:             {errors.mean():.4f}%")print(f"  • FTAP maximum error:             {errors.max():.4f}%")print(f"  • Paper benchmark (Table 2):      < 0.1%")print(f"  • Status:                         {'PASS ✓' if errors.max() < 0.1 else 'REVIEW'}")print("\n✓ Features:")print("  • Confidence intervals:           Full support")print("  • Three short rate methods:       NS, ML, Direct")print("  • Path simulation:                AR(1), Vasicek")print("  • Derivatives:                    Caps, Swaptions")print("  • Validation:                     Automated FTAP check")print("\n✓ Production Ready:")print("  • Error handling:                 Comprehensive")print("  • Numerical stability:            Robust")print("  • Documentation:                  Complete")print("  • Code quality:                   Professional")print("\n" + "="*80)print("REFERENCE:")print("Moudiki, T. (2025). New Short Rate Models and their Arbitrage-Free")print("Extension: A Flexible Framework for Historical and Market-Consistent")print("Simulation. Version 4.0, October 27, 2025.")print("="*80)# ==========================================================================[1/6] Generating synthetic yield curve data...  ✓ Generated 100 yield curves  ✓ Maturities: [ 0.25  0.5   1.    2.    3.    5.    7.   10.  ][2/6] Testing three short rate construction methods...  Method 1 (NS Extrapolation - Eq. 8):    Mean: 1.424%    Std:  0.763%    Last: 1.157%  Method 2 (NS + ML - Definition 2):    Mean: 1.833%    Std:  0.744%    Last: 1.619%  Method 3 (Direct Regression - Definition 3):    Mean: 1.435%    Std:  0.784%    Last: 1.309%[3/6] Simulating short rate paths...  ✓ Simulated 2000 paths  ✓ Time horizon: 60 months (5.0 years)  ✓ Mean rate at T=1Y:  1.383%  ✓ Mean rate at T=3Y:  1.439%  ✓ Mean rate at T=5Y:  1.453%[4/6] Applying deterministic shift adjustment (Proposition 1)...  Fundamental Theorem of Asset Pricing Verification:    Average error: 0.0002%    Maximum error: 0.0005%    RMSE:         0.0003%  Error Breakdown by Maturity:  Maturity   Market       Adjusted     Error (bps)  Status  ------------------------------------------------------------  1.00      Y 0.965605     0.965604     0.02         ✓  2.00      Y 0.932394     0.932391     0.03         ✓  3.00      Y 0.900325     0.900321     0.03         ✓  4.00      Y 0.869358     0.869354     0.05         ✓Arbitrage-Free Validation:  Max relative error: 0.0005%  Avg relative error: 0.0002%  Tolerance: 0.10%  Status: ✓ PASS[5/6] Monte Carlo pricing with confidence intervals...  Zero-Coupon Bond Prices:  Maturity   Price        Std Error    95% CI                    N  ---------------------------------------------------------------------------  1.0       Y 0.965604     0.000104     [0.965401, 0.965807]      2000  3.0       Y 0.900321     0.000312     [0.899709, 0.900934]      2000  5.0       Y 0.841907     0.000435     [0.841054, 0.842759]      2000[6/6] Pricing interest rate derivatives...  Interest Rate Caps:  --------------------------------------------------------------------------------  Cap: Strike=3.0%, Maturity=3.0Y, Freq=0.25Y    Value:     $17,782.55 ± $260.68    Caplets:   12    First 3 caplets:      #1: T_reset=0.25Y, Value=$1,385.51, Fwd=3.51%      #2: T_reset=0.50Y, Value=$1,452.22, Fwd=3.52%      #3: T_reset=0.75Y, Value=$1,489.68, Fwd=3.52%  Cap: Strike=4.0%, Maturity=5.0Y, Freq=0.25Y    Value:     $5,261.32 ± $147.13    Caplets:   20    First 3 caplets:      #1: T_reset=0.25Y, Value=$144.54, Fwd=3.51%      #2: T_reset=0.50Y, Value=$220.05, Fwd=3.52%      #3: T_reset=0.75Y, Value=$263.20, Fwd=3.52%  Cap: Strike=5.0%, Maturity=5.0Y, Freq=0.5Y    Value:     $294.87 ± $25.17    Caplets:   10    First 3 caplets:      #1: T_reset=0.50Y, Value=$15.56, Fwd=3.53%      #2: T_reset=1.00Y, Value=$32.92, Fwd=3.54%      #3: T_reset=1.50Y, Value=$44.28, Fwd=3.54%  Interest Rate Swaptions:  --------------------------------------------------------------------------------  PAYER Swaption: 1.0Y into 5.0Y @ 3.00%    Value: $18,469.22 ± $336.51    95% CI: [$17,809.65, $19,128.78]  PAYER Swaption: 2.0Y into 5.0Y @ 3.50%    Value: $5,997.88 ± $184.75    95% CI: [$5,635.76, $6,360.00]  RECEIVER Swaption: 1.0Y into 3.0Y @ 4.00%    Value: $14,775.17 ± $305.07    95% CI: [$14,177.23, $15,373.12]================================================================================IMPLEMENTATION SUMMARY================================================================================✓ Theoretical Correctness:  • Equation 5 (Forward rates):     [t,T] integral bounds  • Equation 6 (Adjusted prices):   Proper trapezoidal integration  • Proposition 1 (Shift):          φ(T) = f^M - f̂  • Three methods:                  All implemented correctly✓ Numerical Accuracy:  • FTAP average error:             0.0002%  • FTAP maximum error:             0.0005%  • Paper benchmark (Table 2):      < 0.1%  • Status:                         PASS ✓✓ Features:  • Confidence intervals:           Full support  • Three short rate methods:       NS, ML, Direct  • Path simulation:                AR(1), Vasicek  • Derivatives:                    Caps, Swaptions  • Validation:                     Automated FTAP check✓ Production Ready:  • Error handling:                 Comprehensive  • Numerical stability:            Robust  • Documentation:                  Complete  • Code quality:                   Professional================================================================================REFERENCE:Moudiki, T. (2025). New Short Rate Models and their Arbitrage-FreeExtension: A Flexible Framework for Historical and Market-ConsistentSimulation. Version 4.0, October 27, 2025.================================================================================import matplotlib.pyplot as pltfrom yieldcurveml.utils import get_swap_rates, regression_reportfrom yieldcurveml.stripcurve import CurveStripperdatasets = ["and07", "ab13ois", "ap10", "ab13e6m", "negativerates"]def main():    for dataset in datasets:        # Get example data        data = get_swap_rates(dataset)        stripper_bootstrap = CurveStripper()        stripper_bootstrap.fit(data.maturity,                               data.rate,                               tenor_swaps="6m")        # Plot the results        plt.figure(figsize=(10, 6))        plt.plot(stripper_bootstrap.rates_.maturities, stripper_bootstrap.curve_rates_.spot_rates * 100,                label='Zero Rates', linewidth=2)        plt.plot(data.maturity, data.rate * 100, 'o',                label='Market Swap Rates', markersize=8)        plt.title(f'Bootstrapped Zero Curve - {dataset}')        plt.xlabel('Time to Maturity (years)')        plt.ylabel('Rate (%)')        plt.grid(True)        plt.legend()        plt.show()if __name__ == "__main__":    main()

image-title-here

image-title-here

image-title-here

image-title-here

image-title-here

from sklearn.ensemble import ExtraTreesRegressorimport matplotlib.pyplot as pltfrom yieldcurveml.utils import get_swap_rates, regression_reportfrom yieldcurveml.stripcurve import CurveStripperdef main():    # Get example data    data = get_swap_rates("and07")    # Create and fit both models, plus bootstrap    stripper_laguerre = CurveStripper(        estimator=ExtraTreesRegressor(n_estimators=100, random_state=42),        lambda1=2.5,        lambda2=4.5,        type_regressors="laguerre"    )    stripper_cubic = CurveStripper(        estimator=ExtraTreesRegressor(n_estimators=100, random_state=42),        type_regressors="cubic"    )    stripper_bootstrap = CurveStripper(        estimator=None,  # None means use bootstrap        type_regressors="cubic"  # type doesn't matter for bootstrap    )    stripper_laguerre.fit(data.maturity, data.rate, tenor_swaps="6m")    stripper_cubic.fit(data.maturity, data.rate, tenor_swaps="6m")    stripper_bootstrap.fit(data.maturity, data.rate, tenor_swaps="6m")    # Print diagnostics    print("\nLaguerre Model:")    print(regression_report(stripper_laguerre, "Laguerre"))    print("\nCubic Model:")    print(regression_report(stripper_cubic, "Cubic"))    # Create figure    fig, axes = plt.subplots(1, 3, figsize=(15, 5))    # Plot discount factors (log scale not needed for discount factors as they're always positive)    axes[0].plot(data.maturity, stripper_laguerre.curve_rates_.discount_factors, 'o-', label='Laguerre')    axes[0].plot(data.maturity, stripper_cubic.curve_rates_.discount_factors, 's--', label='Cubic')    axes[0].plot(data.maturity, stripper_bootstrap.curve_rates_.discount_factors, '^:', label='Bootstrap')    axes[0].set_title('Discount Factors')    axes[0].legend()    axes[0].grid(True)    # Plot spot rates with symlog scale    axes[1].plot(data.maturity, stripper_laguerre.curve_rates_.spot_rates, 'o-', label='Laguerre')    axes[1].plot(data.maturity, stripper_cubic.curve_rates_.spot_rates, 's--', label='Cubic')    axes[1].plot(data.maturity, stripper_bootstrap.curve_rates_.spot_rates, '^:', label='Bootstrap')    axes[1].plot(data.maturity, data.rate, 'kx', label='Original')    axes[1].set_title('Spot Rates')    axes[1].set_yscale('symlog')  # Use symlog scale to handle negative values    axes[1].legend()    axes[1].grid(True)    # Plot forward rates with symlog scale    if (stripper_laguerre.curve_rates_.forward_rates is not None and        stripper_cubic.curve_rates_.forward_rates is not None and        stripper_bootstrap.curve_rates_.forward_rates is not None):        axes[2].plot(data.maturity, stripper_laguerre.curve_rates_.forward_rates, 'o-', label='Laguerre')        axes[2].plot(data.maturity, stripper_cubic.curve_rates_.forward_rates, 's--', label='Cubic')        axes[2].plot(data.maturity, stripper_bootstrap.curve_rates_.forward_rates, '^:', label='Bootstrap')        axes[2].set_title('Forward Rates')        axes[2].set_yscale('symlog')  # Use symlog scale to handle negative values        axes[2].legend()        axes[2].grid(True)    plt.tight_layout()    plt.show()    print(stripper_cubic.curve_rates_.forward_rates == stripper_cubic.curve_rates_.spot_rates)    print(stripper_laguerre.curve_rates_.forward_rates == stripper_laguerre.curve_rates_.spot_rates)if __name__ == "__main__":    main()/usr/local/lib/python3.12/dist-packages/yieldcurveml/stripcurve/stripcurve.py:65: UserWarning: For basis regression methods, an estimator should be provided. Falling back to bootstrap method.  warnings.warn("For basis regression methods, an estimator should be provided. Falling back to bootstrap method.")Laguerre Model:Model Performance Metrics:| Metric    |   Laguerre ||:----------|-----------:|| Samples   |         14 || R²        |          1 || RMSE      |          0 || MAE       |          0 || Min Error |          0 || Max Error |          0 |Residuals Summary Statistics:| Statistic   |   Laguerre ||:------------|-----------:|| Mean        |     0      || Std Dev     |     0      || Median      |     0      || MAD         |     0      || Skewness    |     0.1373 || Kurtosis    |    -0.6585 |Residuals Percentiles:| Percentile   |   Laguerre ||:-------------|-----------:|| 1%           |         -0 || 5%           |         -0 || 25%          |          0 || 75%          |          0 || 95%          |          0 || 99%          |          0 |Cubic Model:Model Performance Metrics:| Metric    |   Cubic ||:----------|--------:|| Samples   |      14 || R²        |       1 || RMSE      |       0 || MAE       |       0 || Min Error |       0 || Max Error |       0 |Residuals Summary Statistics:| Statistic   |   Cubic ||:------------|--------:|| Mean        |  0      || Std Dev     |  0      || Median      |  0      || MAD         |  0      || Skewness    |  0.1373 || Kurtosis    | -0.6585 |Residuals Percentiles:| Percentile   |   Cubic ||:-------------|--------:|| 1%           |      -0 || 5%           |      -0 || 25%          |       0 || 75%          |       0 || 95%          |       0 || 99%          |       0 |

image-title-here

[False False False False False False False False False False False False False False][False False False False False False False False False False False False False False]import numpy as npfrom yieldcurveml.utils import get_swap_rates, regression_reportfrom yieldcurveml.stripcurve import CurveStripperfrom sklearn.ensemble import GradientBoostingRegressorimport matplotlib.pyplot as pltimport osdef main():    # Get example data    data = get_swap_rates("and07")    # Create and fit both models, plus bootstrap    stripper_laguerre = CurveStripper(        estimator=GradientBoostingRegressor(random_state=42),        lambda1=2.5,        lambda2=4.5,        type_regressors="laguerre"    )    stripper_cubic = CurveStripper(        estimator=GradientBoostingRegressor(random_state=42),        type_regressors="cubic"    )    stripper_bootstrap = CurveStripper(        estimator=None,  # None means use bootstrap        type_regressors="cubic"  # type doesn't matter for bootstrap    )    stripper_laguerre.fit(data.maturity, data.rate, tenor_swaps="6m")    stripper_cubic.fit(data.maturity, data.rate, tenor_swaps="6m")    stripper_bootstrap.fit(data.maturity, data.rate, tenor_swaps="6m")    # Print diagnostics    print("\nLaguerre Model:")    print(regression_report(stripper_laguerre, "Laguerre"))    print("\nCubic Model:")    print(regression_report(stripper_cubic, "Cubic"))    # Skip regression report for bootstrap since it's not a regression model    print("\nBootstrap Model:")    print("(No regression metrics available for bootstrap method)")    # Create figure    fig, axes = plt.subplots(1, 3, figsize=(15, 5))    # Plot discount factors    axes[0].plot(data.maturity, stripper_laguerre.curve_rates_.discount_factors, 'o-', label='Laguerre')    axes[0].plot(data.maturity, stripper_cubic.curve_rates_.discount_factors, 's--', label='Cubic')    axes[0].plot(data.maturity, stripper_bootstrap.curve_rates_.discount_factors, '^:', label='Bootstrap')    axes[0].set_title('Discount Factors')    axes[0].legend()    axes[0].grid(True)    # Plot spot rates    axes[1].plot(data.maturity, stripper_laguerre.curve_rates_.spot_rates, 'o-', label='Laguerre')    axes[1].plot(data.maturity, stripper_cubic.curve_rates_.spot_rates, 's--', label='Cubic')    axes[1].plot(data.maturity, stripper_bootstrap.curve_rates_.spot_rates, '^:', label='Bootstrap')    axes[1].plot(data.maturity, data.rate, 'kx', label='Original')    axes[1].set_title('Spot Rates')    axes[1].legend()    axes[1].grid(True)    # Plot forward rates (all models)    axes[2].plot(data.maturity, stripper_laguerre.curve_rates_.forward_rates, 'o-', label='Laguerre')    axes[2].plot(data.maturity, stripper_cubic.curve_rates_.forward_rates, 's--', label='Cubic')    axes[2].plot(data.maturity, stripper_bootstrap.curve_rates_.forward_rates, '^:', label='Bootstrap')    axes[2].set_title('Forward Rates')    axes[2].legend()    axes[2].grid(True)    # Add y-label for all plots    axes[0].set_ylabel('Rate')    axes[1].set_ylabel('Rate')    axes[2].set_ylabel('Rate')    # Add x-label for all plots    for ax in axes:        ax.set_xlabel('Maturity (years)')    plt.tight_layout()    plt.show()if __name__ == "__main__":    main()/usr/local/lib/python3.12/dist-packages/yieldcurveml/stripcurve/stripcurve.py:65: UserWarning: For basis regression methods, an estimator should be provided. Falling back to bootstrap method.  warnings.warn("For basis regression methods, an estimator should be provided. Falling back to bootstrap method.")Laguerre Model:Model Performance Metrics:| Metric    |   Laguerre ||:----------|-----------:|| Samples   |         14 || R²        |          1 || RMSE      |          0 || MAE       |          0 || Min Error |          0 || Max Error |          0 |Residuals Summary Statistics:| Statistic   |   Laguerre ||:------------|-----------:|| Mean        |     0      || Std Dev     |     0      || Median      |    -0      || MAD         |     0      || Skewness    |     0.5131 || Kurtosis    |    -0.4719 |Residuals Percentiles:| Percentile   |   Laguerre ||:-------------|-----------:|| 1%           |         -0 || 5%           |         -0 || 25%          |         -0 || 75%          |          0 || 95%          |          0 || 99%          |          0 |Cubic Model:Model Performance Metrics:| Metric    |   Cubic ||:----------|--------:|| Samples   |      14 || R²        |       1 || RMSE      |       0 || MAE       |       0 || Min Error |       0 || Max Error |       0 |Residuals Summary Statistics:| Statistic   |   Cubic ||:------------|--------:|| Mean        |  0      || Std Dev     |  0      || Median      | -0      || MAD         |  0      || Skewness    |  1.1389 || Kurtosis    |  1.4787 |Residuals Percentiles:| Percentile   |   Cubic ||:-------------|--------:|| 1%           |      -0 || 5%           |      -0 || 25%          |      -0 || 75%          |       0 || 95%          |       0 || 99%          |       0 |Bootstrap Model:(No regression metrics available for bootstrap method)

image-title-here

import numpy as npimport matplotlib.pyplot as pltfrom yieldcurveml.stripcurve import CurveStripperfrom yieldcurveml.utils import get_swap_ratesfrom sklearn.linear_model import Ridgedef main():    # Get example data    data = get_swap_rates("ab13ois")    stripper_sw = CurveStripper(        estimator=Ridge(alpha=1e-6),        type_regressors="kernel",        kernel_type="smithwilson",        alpha=0.1,        ufr=0.03    )    stripper_sw_no_ufr = CurveStripper(        estimator=Ridge(alpha=1e-6),        type_regressors="kernel",        kernel_type="smithwilson",        alpha=0.1,        ufr=None    )    # Smith-Wilson direct    stripper_sw_direct = CurveStripper(        estimator=None,        type_regressors="kernel",        kernel_type="smithwilson",        alpha=0.1,        ufr=0.055,        lambda_reg=1e-4    )    # Add bootstrapped stripper    stripper_bootstrap = CurveStripper(        estimator=None  # None means use bootstrap method    )    # Fit all strippers    strippers = {        'Bootstrap': stripper_bootstrap,        'Smith-Wilson (UFR=3%)': stripper_sw,        'Smith-Wilson (no UFR)': stripper_sw_no_ufr,        'Smith-Wilson Direct': stripper_sw_direct,    }    for name, stripper in strippers.items():        stripper.fit(data.maturity, data.rate)        print("Coeffs: ", stripper.coef_)    # Create extended maturity grid for extrapolation    t_extended = np.linspace(1, max(data.maturity) * 1.5, 100)    # Plot results with symlog scale for negative rates    fig, axes = plt.subplots(1, 3, figsize=(15, 5))    # Define what to plot in each subplot    plot_configs = [        {'title': 'Spot Rates', 'attr': 'spot_rates', 'style': '-'},        {'title': 'Forward Rates', 'attr': 'forward_rates', 'style': '--'},        {'title': 'Discount Factors', 'attr': 'discount_factors', 'style': '-'}    ]    # Plot each type of curve    for ax, config in zip(axes, plot_configs):        for name, stripper in strippers.items():            predictions = stripper.predict(t_extended)            values = getattr(predictions, config['attr'])            ax.plot(t_extended, values, config['style'], label=name)            # Add dots for bootstrap points            if name == 'Bootstrap':                bootstrap_values = getattr(stripper.curve_rates_, config['attr'])                ax.plot(stripper.curve_rates_.maturities, bootstrap_values, 'o', color='blue')        # Add UFR level to relevant plots        if config['title'] in ['Spot Rates', 'Forward Rates']:            ax.axhline(0.03, color='r', linestyle=':', label='UFR')        ax.set_title(config['title'])        ax.set_xlabel('Maturity')        ax.set_ylabel('Rate' if 'Rates' in config['title'] else 'Factor')        ax.grid(True)        if 'Rates' in config['title']:            ax.set_yscale('symlog')  # Use symlog scale for rates (handles negatives)        # Adjust legend to prevent overlap        ax.legend(bbox_to_anchor=(0.5, -0.15), loc='upper center', ncol=2)    plt.tight_layout()    plt.show()    # Plot discount factors comparison    plt.figure(figsize=(6, 6))    for name, stripper in strippers.items():        predictions = stripper.predict(t_extended)        plt.plot(t_extended, predictions.discount_factors, '-', label=name)    plt.title('Discount Factors Comparison')    plt.xlabel('Maturity')    plt.ylabel('Discount Factor')    plt.grid(True)    plt.legend()    plt.show()if __name__ == "__main__":    main()Coeffs:  NoneCoeffs:  NoneCoeffs:  NoneCoeffs:  [ -4.1677141   -1.149799     1.20273926   1.82505079   1.01388805  -0.33693645   0.41876024  -0.73607408  -0.99373378   1.37273563   0.90564829  -0.13418515  -2.95899345   0.0641933  -11.15438678  14.95634056]

image-title-here

image-title-here

import numpy as npfrom yieldcurveml.utils import get_swap_rates, regression_reportfrom yieldcurveml.stripcurve import CurveStripperfrom sklearn.ensemble import RandomForestRegressorimport matplotlib.pyplot as pltimport osdef main():    # Get example data    data = get_swap_rates("and07")    # Create and fit both models    stripper_laguerre = CurveStripper(        estimator=RandomForestRegressor(n_estimators=1000, random_state=42),        lambda1=2.5,        lambda2=4.5,        type_regressors="laguerre"    )    stripper_cubic = CurveStripper(        estimator=RandomForestRegressor(n_estimators=1000, random_state=42),        type_regressors="cubic"    )    stripper_bootstrap = CurveStripper(        estimator=None,  # None means use bootstrap        type_regressors="cubic"  # type doesn't matter for bootstrap    )    stripper_laguerre.fit(data.maturity, data.rate, tenor_swaps="6m")    stripper_cubic.fit(data.maturity, data.rate, tenor_swaps="6m")    stripper_bootstrap.fit(data.maturity, data.rate, tenor_swaps="6m")    # Print diagnostics    print("\nLaguerre Model:")    print(regression_report(stripper_laguerre, "Laguerre"))    print("\nCubic Model:")    print(regression_report(stripper_cubic, "Cubic"))    # Create figure with three plots in a row    fig, axes = plt.subplots(1, 3, figsize=(18, 6))    # Plot discount factors    axes[0].plot(data.maturity, stripper_laguerre.curve_rates_.discount_factors, 'o-', label='Laguerre')    axes[0].plot(data.maturity, stripper_cubic.curve_rates_.discount_factors, 's--', label='Cubic')    axes[0].plot(data.maturity, stripper_bootstrap.curve_rates_.discount_factors, '^:', label='Bootstrap')    axes[0].set_title('Discount Factors')    axes[0].legend()    axes[0].grid(True)    # Plot spot rates    axes[1].plot(data.maturity, stripper_laguerre.curve_rates_.spot_rates, 'o-', label='Laguerre')    axes[1].plot(data.maturity, stripper_cubic.curve_rates_.spot_rates, 's--', label='Cubic')    axes[1].plot(data.maturity, stripper_bootstrap.curve_rates_.spot_rates, '^:', label='Bootstrap')    axes[1].plot(data.maturity, data.rate, 'kx', label='Original')    axes[1].set_title('Spot Rates')    axes[1].legend()    axes[1].grid(True)    # Plot forward rates (all models)    axes[2].plot(data.maturity, stripper_laguerre.curve_rates_.forward_rates, 'o-', label='Laguerre')    axes[2].plot(data.maturity, stripper_cubic.curve_rates_.forward_rates, 's--', label='Cubic')    axes[2].plot(data.maturity, stripper_bootstrap.curve_rates_.forward_rates, '^:', label='Bootstrap')    axes[2].set_title('Forward Rates')    axes[2].legend()    axes[2].grid(True)    # Add y-labels    for ax in axes:        ax.set_ylabel('Rate')        ax.set_xlabel('Maturity (years)')    plt.tight_layout()    plt.show()if __name__ == "__main__":    main()/usr/local/lib/python3.12/dist-packages/yieldcurveml/stripcurve/stripcurve.py:65: UserWarning: For basis regression methods, an estimator should be provided. Falling back to bootstrap method.  warnings.warn("For basis regression methods, an estimator should be provided. Falling back to bootstrap method.")Laguerre Model:Model Performance Metrics:| Metric    |   Laguerre ||:----------|-----------:|| Samples   |    14      || R²        |     0.9749 || RMSE      |     0.0011 || MAE       |     0.0006 || Min Error |     0      || Max Error |     0.0036 |Residuals Summary Statistics:| Statistic   |   Laguerre ||:------------|-----------:|| Mean        |    -0.0004 || Std Dev     |     0.001  || Median      |    -0.0001 || MAD         |     0.0004 || Skewness    |    -2.0485 || Kurtosis    |     3.8372 |Residuals Percentiles:| Percentile   |   Laguerre ||:-------------|-----------:|| 1%           |    -0.0033 || 5%           |    -0.0022 || 25%          |    -0.0005 || 75%          |     0.0002 || 95%          |     0.0006 || 99%          |     0.0006 |Cubic Model:Model Performance Metrics:| Metric    |   Cubic ||:----------|--------:|| Samples   | 14      || R²        |  0.9867 || RMSE      |  0.0008 || MAE       |  0.0007 || Min Error |  0.0001 || Max Error |  0.0015 |Residuals Summary Statistics:| Statistic   |   Cubic ||:------------|--------:|| Mean        |  0.0004 || Std Dev     |  0.0007 || Median      |  0.0006 || MAD         |  0.0006 || Skewness    | -1.4083 || Kurtosis    |  1.5212 |Residuals Percentiles:| Percentile   |   Cubic ||:-------------|--------:|| 1%           | -0.0014 || 5%           | -0.001  || 25%          |  0.0003 || 75%          |  0.0006 || 95%          |  0.0012 || 99%          |  0.0013 |

image-title-here

import numpy as npfrom yieldcurveml.utils.utils import swap_cashflows_matrix, get_swap_ratesimport osdef main():    # Get example data from ap10 dataset    data = get_swap_rates("and07")    # Calculate swap cashflows using the example data    result = swap_cashflows_matrix(        swap_rates=data.rate,        maturities=data.maturity,        tenor_swaps="6m"    )    print("Input swap rates", result)    # Print results    print("Using AP10 dataset:")    print(f"Number of swaps: {result.nb_swaps}")    print("\nSwap Cashflow Matrix:")    print(result.cashflow_matrix)    print("\nCashflow Dates:")    print(result.cashflow_dates)if __name__ == "__main__":    main()Input swap rates SwapCashflows(nb_swaps=14, swaps_maturities=array([ 0.5,  1. ,  1.5,  2. ,  2.5,  3. ,  4. ,  5. ,  7. , 10. , 12. ,       15. , 20. , 30. ]), nb_swap_dates=array([ 1.,  2.,  3.,  4.,  5.,  6.,  8., 10., 14., 20., 24., 30., 40.,       60.]), swap_rates=array([0.0275, 0.031 , 0.033 , 0.0343, 0.0353, 0.033 , 0.0378, 0.0395,       0.0425, 0.045 , 0.0465, 0.0478, 0.0488, 0.0485]), cashflow_dates=array([[ 0.5,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ],       [ 0.5,  1. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ],       [ 0.5,  1. ,  1.5,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ],       [ 0.5,  1. ,  1.5,  2. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ],       [ 0.5,  1. ,  1.5,  2. ,  2.5,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ],       [ 0.5,  1. ,  1.5,  2. ,  2.5,  3. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ],       [ 0.5,  1. ,  1.5,  2. ,  2.5,  3. ,  3.5,  4. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ],       [ 0.5,  1. ,  1.5,  2. ,  2.5,  3. ,  3.5,  4. ,  4.5,  5. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ],       [ 0.5,  1. ,  1.5,  2. ,  2.5,  3. ,  3.5,  4. ,  4.5,  5. ,  5.5,         6. ,  6.5,  7. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ],       [ 0.5,  1. ,  1.5,  2. ,  2.5,  3. ,  3.5,  4. ,  4.5,  5. ,  5.5,         6. ,  6.5,  7. ,  7.5,  8. ,  8.5,  9. ,  9.5, 10. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ],       [ 0.5,  1. ,  1.5,  2. ,  2.5,  3. ,  3.5,  4. ,  4.5,  5. ,  5.5,         6. ,  6.5,  7. ,  7.5,  8. ,  8.5,  9. ,  9.5, 10. , 10.5, 11. ,        11.5, 12. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ],       [ 0.5,  1. ,  1.5,  2. ,  2.5,  3. ,  3.5,  4. ,  4.5,  5. ,  5.5,         6. ,  6.5,  7. ,  7.5,  8. ,  8.5,  9. ,  9.5, 10. , 10.5, 11. ,        11.5, 12. , 12.5, 13. , 13.5, 14. , 14.5, 15. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ],       [ 0.5,  1. ,  1.5,  2. ,  2.5,  3. ,  3.5,  4. ,  4.5,  5. ,  5.5,         6. ,  6.5,  7. ,  7.5,  8. ,  8.5,  9. ,  9.5, 10. , 10.5, 11. ,        11.5, 12. , 12.5, 13. , 13.5, 14. , 14.5, 15. , 15.5, 16. , 16.5,        17. , 17.5, 18. , 18.5, 19. , 19.5, 20. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,         0. ,  0. ,  0. ,  0. ,  0. ],       [ 0.5,  1. ,  1.5,  2. ,  2.5,  3. ,  3.5,  4. ,  4.5,  5. ,  5.5,         6. ,  6.5,  7. ,  7.5,  8. ,  8.5,  9. ,  9.5, 10. , 10.5, 11. ,        11.5, 12. , 12.5, 13. , 13.5, 14. , 14.5, 15. , 15.5, 16. , 16.5,        17. , 17.5, 18. , 18.5, 19. , 19.5, 20. , 20.5, 21. , 21.5, 22. ,        22.5, 23. , 23.5, 24. , 24.5, 25. , 25.5, 26. , 26.5, 27. , 27.5,        28. , 28.5, 29. , 29.5, 30. ]]), cashflow_matrix=array([[1.01375, 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     ],       [0.0155 , 1.0155 , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     ],       [0.0165 , 0.0165 , 1.0165 , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     ],       [0.01715, 0.01715, 0.01715, 1.01715, 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     ],       [0.01765, 0.01765, 0.01765, 0.01765, 1.01765, 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     ],       [0.0165 , 0.0165 , 0.0165 , 0.0165 , 0.0165 , 1.0165 , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     ],       [0.0189 , 0.0189 , 0.0189 , 0.0189 , 0.0189 , 0.0189 , 0.0189 ,        1.0189 , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     ],       [0.01975, 0.01975, 0.01975, 0.01975, 0.01975, 0.01975, 0.01975,        0.01975, 0.01975, 1.01975, 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     ],       [0.02125, 0.02125, 0.02125, 0.02125, 0.02125, 0.02125, 0.02125,        0.02125, 0.02125, 0.02125, 0.02125, 0.02125, 0.02125, 1.02125,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     ],       [0.0225 , 0.0225 , 0.0225 , 0.0225 , 0.0225 , 0.0225 , 0.0225 ,        0.0225 , 0.0225 , 0.0225 , 0.0225 , 0.0225 , 0.0225 , 0.0225 ,        0.0225 , 0.0225 , 0.0225 , 0.0225 , 0.0225 , 1.0225 , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     ],       [0.02325, 0.02325, 0.02325, 0.02325, 0.02325, 0.02325, 0.02325,        0.02325, 0.02325, 0.02325, 0.02325, 0.02325, 0.02325, 0.02325,        0.02325, 0.02325, 0.02325, 0.02325, 0.02325, 0.02325, 0.02325,        0.02325, 0.02325, 1.02325, 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     ],       [0.0239 , 0.0239 , 0.0239 , 0.0239 , 0.0239 , 0.0239 , 0.0239 ,        0.0239 , 0.0239 , 0.0239 , 0.0239 , 0.0239 , 0.0239 , 0.0239 ,        0.0239 , 0.0239 , 0.0239 , 0.0239 , 0.0239 , 0.0239 , 0.0239 ,        0.0239 , 0.0239 , 0.0239 , 0.0239 , 0.0239 , 0.0239 , 0.0239 ,        0.0239 , 1.0239 , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     ],       [0.0244 , 0.0244 , 0.0244 , 0.0244 , 0.0244 , 0.0244 , 0.0244 ,        0.0244 , 0.0244 , 0.0244 , 0.0244 , 0.0244 , 0.0244 , 0.0244 ,        0.0244 , 0.0244 , 0.0244 , 0.0244 , 0.0244 , 0.0244 , 0.0244 ,        0.0244 , 0.0244 , 0.0244 , 0.0244 , 0.0244 , 0.0244 , 0.0244 ,        0.0244 , 0.0244 , 0.0244 , 0.0244 , 0.0244 , 0.0244 , 0.0244 ,        0.0244 , 0.0244 , 0.0244 , 0.0244 , 1.0244 , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     , 0.     , 0.     , 0.     ,        0.     , 0.     , 0.     , 0.     ],       [0.02425, 0.02425, 0.02425, 0.02425, 0.02425, 0.02425, 0.02425,        0.02425, 0.02425, 0.02425, 0.02425, 0.02425, 0.02425, 0.02425,        0.02425, 0.02425, 0.02425, 0.02425, 0.02425, 0.02425, 0.02425,        0.02425, 0.02425, 0.02425, 0.02425, 0.02425, 0.02425, 0.02425,        0.02425, 0.02425, 0.02425, 0.02425, 0.02425, 0.02425, 0.02425,        0.02425, 0.02425, 0.02425, 0.02425, 0.02425, 0.02425, 0.02425,        0.02425, 0.02425, 0.02425, 0.02425, 0.02425, 0.02425, 0.02425,        0.02425, 0.02425, 0.02425, 0.02425, 0.02425, 0.02425, 0.02425,        0.02425, 0.02425, 0.02425, 1.02425]]))Using AP10 dataset:Number of swaps: 14Swap Cashflow Matrix:[[1.01375 0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.     ] [0.0155  1.0155  0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.     ] [0.0165  0.0165  1.0165  0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.     ] [0.01715 0.01715 0.01715 1.01715 0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.     ] [0.01765 0.01765 0.01765 0.01765 1.01765 0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.     ] [0.0165  0.0165  0.0165  0.0165  0.0165  1.0165  0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.     ] [0.0189  0.0189  0.0189  0.0189  0.0189  0.0189  0.0189  1.0189  0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.     ] [0.01975 0.01975 0.01975 0.01975 0.01975 0.01975 0.01975 0.01975 0.01975  1.01975 0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.     ] [0.02125 0.02125 0.02125 0.02125 0.02125 0.02125 0.02125 0.02125 0.02125  0.02125 0.02125 0.02125 0.02125 1.02125 0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.     ] [0.0225  0.0225  0.0225  0.0225  0.0225  0.0225  0.0225  0.0225  0.0225  0.0225  0.0225  0.0225  0.0225  0.0225  0.0225  0.0225  0.0225  0.0225  0.0225  1.0225  0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.     ] [0.02325 0.02325 0.02325 0.02325 0.02325 0.02325 0.02325 0.02325 0.02325  0.02325 0.02325 0.02325 0.02325 0.02325 0.02325 0.02325 0.02325 0.02325  0.02325 0.02325 0.02325 0.02325 0.02325 1.02325 0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.     ] [0.0239  0.0239  0.0239  0.0239  0.0239  0.0239  0.0239  0.0239  0.0239  0.0239  0.0239  0.0239  0.0239  0.0239  0.0239  0.0239  0.0239  0.0239  0.0239  0.0239  0.0239  0.0239  0.0239  0.0239  0.0239  0.0239  0.0239  0.0239  0.0239  1.0239  0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.     ] [0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  0.0244  1.0244  0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.      0.      0.      0.  0.      0.      0.      0.      0.      0.     ] [0.02425 0.02425 0.02425 0.02425 0.02425 0.02425 0.02425 0.02425 0.02425  0.02425 0.02425 0.02425 0.02425 0.02425 0.02425 0.02425 0.02425 0.02425  0.02425 0.02425 0.02425 0.02425 0.02425 0.02425 0.02425 0.02425 0.02425  0.02425 0.02425 0.02425 0.02425 0.02425 0.02425 0.02425 0.02425 0.02425  0.02425 0.02425 0.02425 0.02425 0.02425 0.02425 0.02425 0.02425 0.02425  0.02425 0.02425 0.02425 0.02425 0.02425 0.02425 0.02425 0.02425 0.02425  0.02425 0.02425 0.02425 0.02425 0.02425 1.02425]]Cashflow Dates:[[ 0.5  0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0. ] [ 0.5  1.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0. ] [ 0.5  1.   1.5  0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0. ] [ 0.5  1.   1.5  2.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0. ] [ 0.5  1.   1.5  2.   2.5  0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0. ] [ 0.5  1.   1.5  2.   2.5  3.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0. ] [ 0.5  1.   1.5  2.   2.5  3.   3.5  4.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0. ] [ 0.5  1.   1.5  2.   2.5  3.   3.5  4.   4.5  5.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0. ] [ 0.5  1.   1.5  2.   2.5  3.   3.5  4.   4.5  5.   5.5  6.   6.5  7.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0. ] [ 0.5  1.   1.5  2.   2.5  3.   3.5  4.   4.5  5.   5.5  6.   6.5  7.   7.5  8.   8.5  9.   9.5 10.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0. ] [ 0.5  1.   1.5  2.   2.5  3.   3.5  4.   4.5  5.   5.5  6.   6.5  7.   7.5  8.   8.5  9.   9.5 10.  10.5 11.  11.5 12.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0. ] [ 0.5  1.   1.5  2.   2.5  3.   3.5  4.   4.5  5.   5.5  6.   6.5  7.   7.5  8.   8.5  9.   9.5 10.  10.5 11.  11.5 12.  12.5 13.  13.5 14.  14.5 15.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0. ] [ 0.5  1.   1.5  2.   2.5  3.   3.5  4.   4.5  5.   5.5  6.   6.5  7.   7.5  8.   8.5  9.   9.5 10.  10.5 11.  11.5 12.  12.5 13.  13.5 14.  14.5 15.  15.5 16.  16.5 17.  17.5 18.  18.5 19.  19.5 20.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0. ] [ 0.5  1.   1.5  2.   2.5  3.   3.5  4.   4.5  5.   5.5  6.   6.5  7.   7.5  8.   8.5  9.   9.5 10.  10.5 11.  11.5 12.  12.5 13.  13.5 14.  14.5 15.  15.5 16.  16.5 17.  17.5 18.  18.5 19.  19.5 20.  20.5 21.  21.5 22.  22.5 23.  23.5 24.  24.5 25.  25.5 26.  26.5 27.  27.5 28.  28.5 29.  29.5 30. ]]

Please sign and share this petition https://www.change.org/stop_torturing_T_Moudiki – after seriously researching my background and contributions to the field.

To leave a comment for the author, please follow the link and comment on their blog: T. Moudiki's Webpage - R.

R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Continue reading: Python examples for ‘Beyond Nelson-Siegel and splines: A model- agnostic Machine Learning framework for discount curve calibration, interpolation and extrapolation’