2.3.15 factor_pricer

Purpose

  • Estimate the fair value of an infrastructure instrument with a factor pricing model. You give the instrument's factor loadings (for example face value, maturity, probability of default and sector), and the model returns an estimated credit spread or equity risk premium with an interquartile range. The type of factor_loadings you pass selects the model:

  • Credit spread for project finance senior debt, in bps

  • Credit spread for corporate senior debt, in bps

  • Credit spread for junior debt, in bps

  • Equity risk premium, as a decimal (0.05 represents 5%)

Parameters

  • value_date (date, required): The calibration date of the model. If the date isn't calibrated, the latest earlier calibration is used.

  • factor_loadings (object, required): The instrument's factor loadings. The class you use selects the model, and each class accepts only the variables its model uses. Passing an unused variable or leaving out a required one raises a ValueError. Rates and ratios are decimals (0.35 represents 35%). Sector flags are booleans. Leaving a flag out means the base case. At most one sector flag may be set. Supported classes are:

    • CreditSpreadProjectFinanceFactorLoadings

      • Required: face_value (float), maturity (float, in years, ≥ 0), pd (float, probability of default, 0 to 1).

      • Optional sector flags: energy_and_water_resources, environmental_services, power, roads, wind_and_solar.

    • CreditSpreadCorporateFactorLoadings

      • Required: face_value, maturity, pd.

      • Optional sector flags: airports, energy_and_water_resources, rail.

      • Optional flag: merchant.

    • CreditSpreadJuniorFactorLoadings

      • Required: face_value, maturity, pd.

      • Optional sector flags: power, rail, renewables, roads, social.

      • Optional flag: merchant.

    • EquityPremiaFactorLoadings

      • Required: investment (float), leverage (float), roa (float, return on assets), size (float), term_spread (float).

      • Optional sector flags: airports, energy_and_water_resources, environmental_services, port, roads, social, wind_and_solar.

      • Optional flag: growth.

  • asset_class (Product, optional): The asset class of the instrument. Only Product.PRIVATE_INFRA is supported, and that's the default if omitted.

  • country (string, optional): Three-letter ISO code of the country, used to look up the 3-month risk-free rate as the benchmark rate. Values can be obtained by referring to Privatemetrics® Country Codes . Credit spread models need either country or benchmark_rate_override. The equity premia model doesn't use a benchmark rate.

  • benchmark_rate_override (float, optional): Benchmark rate as a decimal (0.03 represents 3%). When set, it's used instead of the country lookup. Use it when no risk-free rate is available for the country at value_date.

  • instrument_name (string, optional): Name of the instrument, for your own reference.

Response

  • estimatedValue: The central estimate of the credit spread (bps) or equity risk premium (decimal) for an instrument with these characteristics.

  • percentile25: 25% of comparable instruments fall below this value.

  • percentile75: 25% of comparable instruments fall above this value.

  • interquartileRange: The spread between the two percentiles (percentile75 − percentile25), which is the width of the estimate's uncertainty band.

Example 1: Credit spread, project finance

esponse = await service.factor_pricer_calculate(
    value_date=date(2015, 12, 31),
    factor_loadings=factor_pricer_models.CreditSpreadProjectFinanceFactorLoadings(
        face_value=17625000,
        maturity=20,
        pd=0.048,
        roads=True,
    ),
    # asset_class=Product.PRIVATE_INFRA,
    country="GBR",
    # benchmark_rate_override=None,
    # instrument_name=None,
)

#Sample Response
#{
#    "data": {
#        "results": {
#            "estimatedValue": 240.44643552713399,
#            "percentile25": 231.72001531149016,
#            "percentile75": 249.50007473886663,
#            "interquartileRange": 17.78005942737647
#        }
#    }
#}

Example 2: Equity risk premium

response = await service.factor_pricer_calculate(
    value_date=date(2024, 12, 31),
    factor_loadings=factor_pricer_models.EquityPremiaFactorLoadings(
        investment=0.05,
        leverage=0.6,
        roa=0.06,
        size=500000000,
        term_spread=0.01,
        roads=True,
    ),
    # asset_class=Product.PRIVATE_INFRA,
    # country=None,
    # benchmark_rate_override=None,
    # instrument_name=None,
)

#Sample Response
#{
#    "data": {
#        "results": {
#            "estimatedValue": 0.05104569997510218,
#            "percentile25": 0.04673827257180027,
#            "percentile75": 0.05554492252154092,
#            "interquartileRange": 0.008806649949740647
#        }
#    }
#}