Latest release notes#

For information on previous versions, please see:

v9.1#

New to v9?

See Introduction to v9.0 for help updating your code.

New features#

All asset classes now support volatility plot_surface method#

Added support for plot surface for equity and commodity asset classes. Previously, this method was only available with FX. smile and vol_term_structure methods have also been added for FX, equity and commodities.

Each plot function should be run in a separate cell. Code example:

import sigtech.framework as sig
import datetime as dtm
sig.init()
# plot vol surface dor EURUSD
vs_fx = sig.obj.get('EURUSD VOLSURFACE')
vs_fx.plot_surface(d=vs_fx.history_dates_actual()[-1], z_name='Vol')
# plot EURUSD smile for 5Y tenor
vs_fx.smile(d=vs_fx.history_dates_actual()[-1], tenor='5Y').plot()
# plot EURUSD vol term structure for 25 delta call
vs_fx.vol_term_structure(d=vs_fx.history_dates_actual()[-1], delta='25C').plot()
# plot surface for SPX INDEX
vs_spx = sig.obj.get('SPX INDEX VOLSURFACE')
vs_spx.plot_surface(d=vs_spx.history_dates_actual()[-1])
# plot SPX INDEX smile for expiry 21 Jun 2024
vs_spx.smile(d=vs_spx.history_dates_actual()[-1], expiry=dtm.date(2024, 6, 21)).plot()
# plot SPX INDEX vol term structure for 100% moneyness
vs_spx.vol_term_structure(d=vs_spx.history_dates_actual()[-1], moneyness=100).plot()

Average backtest statistics available for multiple strategy runs#

Users can run multiple strategies at the same time and view the results all at once. The generated performance report shows average backtest statistics across all strategies, allowing for easy comparison.

Code example:

import sigtech.framework as sig
import datetime as dtm
from sigtech.framework.analytics.performance.performance_report import View

sig.init()

irs_1 = sig.InterestRateSwap(
    currency='USD',
    trade_date=dtm.date(2022, 4, 6),
    start_date=dtm.date(2022, 4, 8),
    tenor='5Y',
)

irs_2 = sig.InterestRateSwap(
    currency='USD',
    trade_date=dtm.date(2022, 4, 6),
    start_date=dtm.date(2022, 4, 8),
    tenor='1Y',
)

report = sig.PerformanceReport([irs_1, irs_2], views=[View.SUMMARY_MULTIPLE_CCY])
report.report()

Improvements#

Dependency updates#

Upgraded QuantLib to 1.34#

QuantLib Python package has been upgraded to version 1.34. Changes include:

  • Prevented Calendar::advance from returning the business end of month (instead of the calendar end) when endOfMonth is true and convention is Unadjusted.

  • Added good Friday holiday for SOFR fixing.

  • Properly restricted Sao Paulo city holiday to years before 2022. Updated holidays for 2023 and 2024 in calendars for India, Thailand, Singapore and South Africa.

  • Fixed past payment dates and added support for OIS in LinearTsrPricer. Swaptions can now take an OIS as underlying. So far, only BlackSwaptionEngine manages OIS explicitly; other engines might work and return approximated values.

  • More methods in MakeOIS and MakeVanillaSwap.

  • More methods in the BondFunctions class now support either clean or dirty prices.

  • Previously, the basisPointValue and yieldValueBasisPoint methods in BondFunctions didn’t always manage the settlement date correctly; this is now fixed.

  • Fixed calculation of year fraction under Actual/365 Canadian convention in FuturesRateHelper.

  • Fixed settlement date calculation in cross-currency basis-swap rate helpers in some cases.

For more information, refer to [QuantLib’s 1.34 release notes] (https://github.com/lballabio/QuantLib/releases/tag/v1.34).

Bug fixes#

  • Removed greek values for maturity date to prevent NaN or 0.000 values being returned.

  • Improved the error message returned when no dates are available in strategy_dt_list.

  • inspect.display_sizing_calculation method now works for all strategies, not just futures.

  • Changed rolling adjustments for RollingFutureStrategy and RollingFutureFXHedgedStrategy to bypass non-existing contracts.

  • Fixed error loading data history for KE COMDTY by overriding the default rolling future parameters.

  • Fixed strategy to catch error when first contract history is empty and start_date is not specified.

  • Set default values net_target_quantity and force_target_quantity as True in set_option_positions, while an error is raised if target_quantity cannot be achieved.

  • Fixed bug with CUSTOM_DATA_SOURCE_CONFIG for multiple data providers.

  • Created dynamically-generated new monthly schedules for rolling rules based on front_table.

  • plot_surface can now be displayed on matplotlib v3.8, successfully plotting a graph.

  • Adjusted timeline widget visuals for better viewing in dark mode.

  • Removed requirement for currency field in SingleBondStrategy.

  • Fixed memory leak after using object.clear_cache. After clearing the object cache, users should still be able to access the object.

  • Strike type checks in option groups are now case-insensitive.