Assess Physical and Transition Risk for Mortgages
This example shows an approach to assess physical and transition risks for mortgages. Physical and transition risks are the two main categories of climate change risks. Physical risks relate to natural events such as flooding and wildfires. Transition risks derive from policy changes related to the transition away from fossil fuels. For example, a mortgage transition risk is a change in energy-efficiency standards for buildings.
Multiple institutions, including central banks, offer climate scenarios that include projections on emissions and economic variables. The economic variables typically include projections on gross domestic product (GDP), unemployment rate, price indices, and others [2], [3], [6]. Projections of physical variables about changes in precipitation or sea-level rise are available from meteorological agencies [12], [13]. In some countries, central bank estimates project energy-efficiency upgrade costs [9]. This example brings together economic variables, physical variables, and transition costs to assess the impact of physical and transition risk on mortgage loan provisions and capital requirements.
The workflow in this example is:
Explore climate scenarios: In this example, the data is simulated, but it captures trends similar to those in real climate scenario data sets. The economic variables in this example are residential and commercial real estate price indices. The only physical variable is precipitation change. For this example, you use three climate scenarios: "Early Action," "Delayed Action," and "No Action."
Compute baseline loan-to-value ratio projections: The loan balance projections are straightforward for mortgages. To project the property value, you use the real estate price indices. You then use the resulting loan-to-value (LTV) ratio as a reference to compare against the LTV ratio adjusted for physical and transition risk.
Model physical risk: To adjust the property value for flood risk, you use a simple adjustment factor as a function of precipitation changes.
Model transition risk: Make adjustments to the property value based on its current energy efficiency rating and the estimated energy-efficiency transition costs necessary to reach a higher rating.
Adjust LTV ratio projections: With the property value adjusted for physical and transition risk, in this part of the example, you project an adjusted LTV ratio.
Estimate provisions and capital: This example assumes a probability of default (PD) and loss given default (LGD) models are available that include LTV as a predictor. These models are the basis for the provisions and capital requirements computations. In this part of the example, you perform capital requirements calculations in the form of risk-weighted assets (RWA). It also computes the lifetime PD and the lifetime expected credit loss (ECL), or provisions.
Physical and transition risk for new mortgages: Specify a different loan origination year and run the analysis. Loans starting in the future are affected by physical and transition risks differently than existing mortgages. The contrast between climate scenarios is more noticeable in the long term, and credit risk is higher, in general, early in the life of a mortgage.
Computational approaches to measure mortgage physical and transition risks require a combination of data from multiple sources, qualitative assessments, and expert judgment. The time horizon for this type of analysis is decades. No data exists to assess sensitivities to risk drivers because the climate scenarios have not yet been realized and not all the feedback loops and impacts are understood. Multiple models and assumptions must be brought together with qualitative adjustments and simplifications, and interdisciplinary collaboration is important. This example points out the places where different data sources, models, and qualitative adjustments intersect.
This example is extensible. You can apply additional economic variables to the analysis, such as unemployment rate, as long as the PD or LGD models also include these variables. Multiple risks are explicitly excluded from this example, for example, exposure to wild fires or coastal flooding due to sea-level rise. The proposed approach can be extended to incorporate these physical risks into the analysis. Also, this example analyzes first an existing mortgage, where the effects of climate impact towards the end of the loan are not large because the credit risk decreases for older loans. This example then complements the loan analysis with a hypothetical new loan starting in the future (for example, refinancing or new origination). Moreover, the loan analysis of this example focuses only on property value, yet additional risk considerations can include insurance considerations. For example, insurance considerations might be the rising costs of insurance due to more severe climate events or the fact that a property may become uninsurable. Therefore, the results of this example are limited and do not show a comprehensive assessment of the impact of climate change on mortgage loans, but the methodology of this example can be extended to incorporate additional climate risk considerations.
Explore Climate Scenarios
This example uses simulated data with the following three different climate scenarios:
Early Action — The world takes immediate action and climate policies are put into effect. Although this scenario has an initial impact on the economy, this scenario leads to the best conditions in the long run.
Delayed Action — No significant policy changes take place until 2030. The climate policies at that point are more aggressive, so this scenario has a more important impact on the economy, but the economic conditions improve later on.
No Action — The assumption is that no climate policies are in effect. Initially, this scenario has fewer economic disruptions because no policy changes occur, but the effects of climate change have an impact on the economy in the long run. Also, the overall state of the economy is worse in this scenario than the other two scenarios by the end of the simulated time horizon. Arguably, the worst conditions in the "No Action" scenario would take place after year 2050 when the simulated scenarios end.
The climate scenario narratives in this example are similar to those in real climate scenario data sets. The economic variables in this example are residential and commercial real estate price indices. These variables are available in some real climate scenario data sets. An alternative for the real estate indices is a general price index, which is commonly available in climate scenario data.
Load the climate scenario data (SimulatedClimateScenarioData.mat
) and generate plots for the residential and commercial price indices. These indices incorporate climate impact in the aggregate level and show the overall trends in the average market value of the properties. Property values are initially projected using these macroeconomic indices. Then, this example applies property-specific adjustments to the value projections to account for physical and transition risks. These adjustments are explained in the Model Physical Risk for Floods and Model Transition Risk for Energy Efficiency Upgrades sections, and the full adjustments to the property values come together in the Compute LTV Projections Adjusted for Physical and Transition Risk section.
load SimulatedClimateScenarioData.mat ScenarioLabels = ["Early Action" "Delayed Action" "No Action"]; figure t = tiledlayout(2,1); nexttile PropertyType = "Residential"; VarName = strcat("RealEstate",PropertyType); hold on for s = ScenarioLabels Ind = EconomicVariables.Scenario == s; plot(EconomicVariables.Year(Ind),EconomicVariables.(VarName)(Ind)) end hold off title(PropertyType) ylabel('Index') legend(ScenarioLabels,'Location','northwest') grid on nexttile PropertyType = "Commercial"; VarName = strcat("RealEstate",PropertyType); hold on for s = ScenarioLabels Ind = EconomicVariables.Scenario == s; plot(EconomicVariables.Year(Ind),EconomicVariables.(VarName)(Ind)) end hold off title(PropertyType) ylabel('Index') legend(ScenarioLabels,'Location','northwest') grid on title(t,"Real Estate Price Indices")
The climate scenario data also includes physical variables. In this example, the data includes information on precipitation change. The periodicity of these projections is not the same as the economic variables, so you must interpolate the data. The precipitation change levels, although simulated in the data set for this example, are consistent with precipitation projections in existing climate scenarios (see, for example, [9]).
Create a single table (ClimateScenarioData
) with all the climate data yearly projections. This table includes a variable with the precipitation change converted to percent changes. To do this, use a baseline precipitation level of 2.6
mm/day (see, for example, [1] or [11]).
ClimateScenarioData = EconomicVariables; ClimateScenarioData.PrecipitationChange = zeros(height(ClimateScenarioData),1); ClimateScenarioData.PrecipitationChangePct = zeros(height(ClimateScenarioData),1); for s = ScenarioLabels IndYearly = ClimateScenarioData.Scenario == s; IndOrig = PhysicalVariables.Scenario == s; ClimateScenarioData.PrecipitationChange(IndYearly) = interp1(PhysicalVariables.Year(IndOrig),PhysicalVariables.PrecipitationChange(IndOrig),ClimateScenarioData.Year(IndYearly)); end BaselinePrecipitationLevel = 2.6; ClimateScenarioData.PrecipitationChangePct = ClimateScenarioData.PrecipitationChange/BaselinePrecipitationLevel;
The plotted data shows that the increase in precipitation is worse for the "No Action"
scenario. Properties with higher flood risk are affected by the precipitation changes more than properties with low flood risk. You can use this data for the physical risk adjustments to the property value projections.
figure; t = tiledlayout(2,1); nexttile hold on for s = ScenarioLabels Ind = ClimateScenarioData.Scenario == s; plot(ClimateScenarioData.Year(Ind),ClimateScenarioData.PrecipitationChange(Ind)) end hold off title('Absolute Change') ylabel('mm/day') legend(ScenarioLabels,'Location','northwest') grid on nexttile hold on for s = ScenarioLabels Ind = ClimateScenarioData.Scenario == s; plot(ClimateScenarioData.Year(Ind),ClimateScenarioData.PrecipitationChangePct(Ind)*100) end hold off title('Percent Change') ylabel('%','Rotation',0) legend(ScenarioLabels,'Location','northwest') grid on title(t,"Precipitation Change")
Compute Baseline Loan-to-Value Projections
In this example, the loan-to-value (LTV) ratio is the main link between the scenario variables and the credit analysis. Start by specifying the characteristics of a particular mortgage.
MortgageData.CurrentYear = 2020; % Assume end of year MortgageData.OriginationYear = 2010; % Assume end of year MortgageData.Term = 30; % Original mortgage term MortgageData.Rate = 0.0575; % Assume fixed rate MortgageData.Balance = 90000; % Current mortgage balance at end of current year MortgageData.CurrentValue = 190000; MortgageData.PropertyType = "Commercial";
Use the mortgageProjectionsBaseline
helper function to project the mortgage balance and the property value separately, and then compute the LTV ratio.
To project the mortgage balance, start from the current loan balance and then use the loan age, term, and interest rate to project the balance forward, using standard annuity techniques. Define the exposure at the end of the year as the scheduled payment amount plus the remaining balance after the payment.
For the property value, start with the current property value and use the corresponding real estate price index (either residential or commercial) to project the value into the future. Different climate scenarios lead to different projected values.
You can compute the LTV ratio projections from the loan balance and the property values in each time period.
function ProjectionsBaseline = mortgageProjectionsBaseline(MortgageData,ClimateScenarioData) CurrentYear = MortgageData.CurrentYear; % Assume end of year Age = MortgageData.CurrentYear - MortgageData.OriginationYear; % Loan is already this age, next end of year will be age + 1 Term = MortgageData.Term; % Original mortgage term Rate = MortgageData.Rate; % Assume fixed rate Balance = MortgageData.Balance; % Current mortgage balance at end of current year BasicProjections = table; BasicProjections.Year = (CurrentYear+1:CurrentYear+(Term-Age))'; BasicProjections.Age = (Age+1:Term)'; BasicProjections.Age(BasicProjections.Age<=0) = NaN; Age = max(Age,0); % Project loan balance % Exposure at the end of next year is the expected payment amount plus remaining % balance after the payment [PrincipalPayment,InterestPayment,RemainingBalance] = amortize(Rate,(Term-Age),Balance); BasicProjections.LoanBalance = nan(height(BasicProjections),1); BasicProjections.LoanBalance(BasicProjections.Age>0) = PrincipalPayment'+InterestPayment'+RemainingBalance'; % Project property value CurrentValue = MortgageData.CurrentValue; PropertyType = MortgageData.PropertyType; ScenarioIDs = unique(ClimateScenarioData.Scenario,'stable'); NumScenarios = length(ScenarioIDs); ProjectionsBaseline = repmat(BasicProjections,NumScenarios,1); ProjectionsBaseline = addvars(ProjectionsBaseline,repelem(ScenarioIDs,height(BasicProjections)),'Before','Year','NewVariableName','Scenario'); ProjectionsBaseline(ProjectionsBaseline.Year>max(ClimateScenarioData.Year),:)=[]; PropertyTypeVarName = strcat("RealEstate",PropertyType); ProjectionsBaseline = join(ProjectionsBaseline,ClimateScenarioData(:,["Scenario" "Year" PropertyTypeVarName])); ProjectionsBaseline.Properties.VariableNames{end} = 'PriceIndex'; ProjectionsBaseline.Value = CurrentValue*ProjectionsBaseline.PriceIndex/100; % Compute LTV ProjectionsBaseline.LTV = ProjectionsBaseline.LoanBalance./ProjectionsBaseline.Value; end
Obtain the baseline mortgage projections and visualize the projected value and LTV ratio for each climate scenario.
ProjectionsBaseline = mortgageProjectionsBaseline(MortgageData,EconomicVariables); figure; t = tiledlayout(2,1); nexttile hold on for s = ScenarioLabels Ind = ProjectionsBaseline.Scenario == s; plot(ProjectionsBaseline.Year(Ind),ProjectionsBaseline.Value(Ind)) end hold off title('Property Value') ylabel('$','Rotation',0) legend(ScenarioLabels,'Location','northwest') grid on nexttile hold on for s = ScenarioLabels Ind = ProjectionsBaseline.Scenario == s; plot(ProjectionsBaseline.Year(Ind),ProjectionsBaseline.LTV(Ind)*100) end hold off title('Loan to Value (LTV) Ratio') ylabel('%','Rotation',0) legend(ScenarioLabels,'Location','northwest') grid on title(t,"Baseline Mortgage Projections")
These results are reference LTV ratios for the loan, for each climate scenario. Only the property value is affected by the climate scenarios. For these baseline projections, you use only the real estate price indices to project the property value. Therefore, these projections show the impact of only these macroeconomic variables. The Physical Risk for Floods and Transition Risk for Energy Efficiency Upgrades sections model additional impacts of climate projections on the property value using property-specific characteristics.
Model Physical Risk for Floods
To incorporate risk of flooding, you must introduce a property value adjustment factor, as a function of precipitation change (in percent) and the flood risk rating of a property.
Assume that you have known flood risk ratings for the properties, specifically, "Low"
, "Medium"
, and "High"
flood risk ratings.
MortgageData.FloodRiskRating = "High";
The functional form in this example is:
The floodRiskAdjustmentFactor
helper function implements this functional form along with tunable sensitivity parameters for each flood rating.
FloodRiskLevel = ["Low";"Medium";"High"]; function adjFactor = floodRiskAdjustmentFactor(RiskLevel,PrecipitationChangePct) switch RiskLevel case "Low" Sensitivity =-0.01; case "Medium" Sensitivity =-0.05; case "High" Sensitivity =-0.17; end adjFactor = exp(Sensitivity*PrecipitationChangePct*100); end
For each 1% in precipitation increase, the property value drops by a fraction . For example:
If the sensitivity parameter for
"Low"
is-0.01
, for each 1% in precipitation increase, the property value drops by 1-exp(-0.01
) =1-0.99
, which is about a 1% decrease in the property value.If the sensitivity parameter for
"Medium"
is-0.05
, for each 1% in precipitation increase, the property value drops by 1-exp(-0.05
)=1-0.9512
, which is about a 4.9% decrease in the property value.If the sensitivity parameter for
"High"
is-0.17
, for each 1% in precipitation increase, the property value drops by 1-exp(-0.17
)=1-0.8437
, which is about a 15.6% decrease in the property value.
The following plot shows the adjustment factor (in percent) as a function of the precipitation change (in percent) for the three flood risk ratings.
figure; PrecChangePctForPlot = 0:0.005:0.06; for ii = 1:length(FloodRiskLevel) adjFactorForPlot = floodRiskAdjustmentFactor(FloodRiskLevel(ii),PrecChangePctForPlot); plot(PrecChangePctForPlot*100,adjFactorForPlot*100); hold on; end hold off; grid on; title("Property Value Adjustment Factor") xlabel("Precipitation Change (%)") ylabel("Adjustment Factor (%)") legend("Flood Risk: "+FloodRiskLevel,'Location','southwest')
The log version of the floodRiskAdjustmentFactor
helper function is similar to the damage function that Davenport uses in [5]. This example uses only one physical risk variable, but you can include additional variables in the model and you can also consider a quadratic version of the log model, or some other variation.
However, in this example, the floodRiskAdjustmentFactor
helper function is not a damage or impact function because this function does not estimate damages directly. Instead, the floodRiskAdjustmentFactor
helper function estimates the impact on the market value of the property. Even though the market value of the property correlates to potential damages, it is not necessarily the same as damages. For example, if, based on some analysis, the estimated expected damage for a particular property is 10% of its value, the market value would not necessarily drop by exactly 10%. A 10% damage once every 50 years may be discounted by the market differently than a 10% damage every five years. Or, a 10% damage in a single property may be perceived differently than 10% damage in all properties in a nearby radius along with infrastructure damage. These considerations still require expert judgment. In addition, this analysis can benefit from using catastrophe modeling tools (see, for example, [10]). The value adjustment factor function can incorporate data from a catastrophe modeling analysis and you can potentially calibrate a parametric model for different portfolio segments or risk levels.
figure; ProjectionsBaseline = join(ProjectionsBaseline,ClimateScenarioData(:,["Scenario" "Year" "PrecipitationChangePct"])); for s = ScenarioLabels Ind = ProjectionsBaseline.Scenario == s; adjFactorForPlot = floodRiskAdjustmentFactor(MortgageData.FloodRiskRating,ProjectionsBaseline.PrecipitationChangePct(Ind)); plot(ProjectionsBaseline.Year(Ind),ProjectionsBaseline.Value(Ind).*adjFactorForPlot); hold on; end hold off; grid on; title(["Property Value Adjusted for Physical Risk"; "Flood Risk Rating: " + MortgageData.FloodRiskRating]) ylabel('$','Rotation',0) legend(ScenarioLabels,'Location','southwest')
These adjustments are combined with transition risk adjustments in the Compute LTV Projections Adjusted for Physical and Transition Risk section.
Model Transition Risk for Energy Efficiency Upgrades
Changing regulations for energy efficiency of properties represents a transition risk. For example, new regulations may require a minimum energy efficiency rating to rent a property. An energy efficiency rating itself may be required to sell a property in order to inform prospective buyers and lenders about potential maintenance and upgrade costs. New energy efficiency regulations affect the market value of a property.
Assume that you have known energy efficiency ratings for the properties. Examples of these efficiency ratings are Energy Performance Certificates [14] or Energy Star [15]. This example uses a simulated scale with five levels: "Low"
, "Medium Low"
, "Medium"
, "Medium High"
, and "High"
. This example specifies a current energy rating and a maximum attainable energy rating for each property.
MortgageData.CurrentEnergyRating = "Medium Low"; MortgageData.MaxEnergyRating = "Medium High";
Assume the regulators impose a minimum energy rating of Medium High to sell or rent a property.
MinRegulatoryRating = "Medium High";
In this example, the deadline to meet the minimum energy efficiency rating depends on the climate scenario:
Early action — Minimum energy rating should be met by 2021
Late action — Minimum energy rating met by 2031
No action — No deadline to meet minimum rating
Assume you have estimates of the cost to upgrade to a higher rating. The estimates in this example are simulated, but for an example of these kinds of estimates, see the CBES Guidance document [6].
disp(EnergyEfficiencyUpgradeCost)
High Medium High Medium Medium Low Low _____ ___________ ______ __________ ___ High 0 NaN NaN NaN NaN Medium High 30000 0 NaN NaN NaN Medium 40000 20000 0 NaN NaN Medium Low 50000 30000 12000 0 NaN Low 70000 50000 35000 25000 0
Assume that these costs correspond to the median property values and that the costs are proportionally adjusted for the property value.
MedianPropertyValue = 150000; EnergyEfficiencyUpgradeCostPct = EnergyEfficiencyUpgradeCost; EnergyEfficiencyUpgradeCostPct{:,:} = EnergyEfficiencyUpgradeCost{:,:}/MedianPropertyValue; disp(EnergyEfficiencyUpgradeCostPct)
High Medium High Medium Medium Low Low _______ ___________ _______ __________ ___ High 0 NaN NaN NaN NaN Medium High 0.2 0 NaN NaN NaN Medium 0.26667 0.13333 0 NaN NaN Medium Low 0.33333 0.2 0.08 0 NaN Low 0.46667 0.33333 0.23333 0.16667 0
To enhance this example, you can replace these estimates with a more granular model, where different characteristics of the property help predict the upgrade costs.
To adjust the property values for transition risk, use the transitionRiskAdjustmentFactor
helper function to apply the following steps.
For the
"Early Action"
and"Delayed Action"
scenarios:
If the current energy rating is lower than the minimum regulatory rating, the price of the property drops by the upgrade costs on the year of the corresponding deadline.
The property is upgraded to reach its maximum attainable rating during the year of the deadline.
The year after the deadline, the upgrades are finished and the property not only recovers its value, but also gets a small boost in its value because of the higher energy rating compared to two years prior. The extra value added is a fraction of the upgrade costs (the fraction is a tunable parameter).
For the
"No Action"
scenario, the property values receive no adjustments for transition risk and simply follow the original value projections according to the real estate indices.
All costs are adjusted by inflation by using the same real estate index to adjust these costs for inflation.
function AdjFactor = transitionRiskAdjustmentFactor(MortgageData,PriceIndexData,EnergyEfficiencyUpgradeCostPct,MinRegRating) % For "Early Action" and "Delayed Action": % - Price drops by upgrade costs if rating below min regulatory rating by % the deadline % - Upgrades made in 1 year and property value increases not just back to % baseline, but higher, by a fraction of upgrade costs ValueIncreaseFractionFromEnergyUpgrade = 0.2; CurrentValue = MortgageData.CurrentValue; OrderedEnergyRatings = fliplr(EnergyEfficiencyUpgradeCostPct.Properties.VariableNames); CurrentEnergyRating = MortgageData.CurrentEnergyRating; CurrentEnergyRatingCat = categorical(CurrentEnergyRating,OrderedEnergyRatings,Ordinal=true); MaxEnergyRating = MortgageData.MaxEnergyRating; MinRegRatingCat = categorical(MinRegRating,OrderedEnergyRatings,Ordinal=true); EnergyUpgradeCost = CurrentValue*EnergyEfficiencyUpgradeCostPct{CurrentEnergyRating,MaxEnergyRating}; ValueIncreaseFromEnergyUpgrade = ValueIncreaseFractionFromEnergyUpgrade*EnergyUpgradeCost; Year = PriceIndexData.Year; Index = PriceIndexData.PriceIndex; BaselineValue = CurrentValue*Index/100; Penalty = zeros(size(BaselineValue)); ValueIncrease= zeros(size(BaselineValue)); % "Early Action", regulatory minimum happens in 2021 IndScenarioLocal = PriceIndexData.Scenario == "Early Action"; UpgradeYear = 2021; if CurrentEnergyRatingCat<MinRegRatingCat Penalty(IndScenarioLocal & Year==UpgradeYear) = -EnergyUpgradeCost*Index(IndScenarioLocal & Year==UpgradeYear)/100; end ValueIncrease(IndScenarioLocal & Year>UpgradeYear) = ValueIncreaseFromEnergyUpgrade.*Index(IndScenarioLocal & Year>UpgradeYear)/100; % "Delayed Action", regulatory minimum happens in 2031 IndScenarioLocal = PriceIndexData.Scenario == "Delayed Action"; UpgradeYear = 2031; if CurrentEnergyRatingCat<MinRegRatingCat Penalty(IndScenarioLocal & Year==UpgradeYear) = -EnergyUpgradeCost*Index(IndScenarioLocal & Year==UpgradeYear)/100; end ValueIncrease(IndScenarioLocal & Year>UpgradeYear) = ValueIncreaseFromEnergyUpgrade.*Index(IndScenarioLocal & Year>UpgradeYear)/100; % "No Action": No changes, adjusted is same as baseline AdjValue = BaselineValue + Penalty + ValueIncrease; AdjFactor = AdjValue./BaselineValue; end
The following plot shows the projected property value for the different climate scenarios.
figure; for s = ScenarioLabels Ind = ProjectionsBaseline.Scenario == s; adjFactorForPlot = transitionRiskAdjustmentFactor(MortgageData,ProjectionsBaseline(Ind,["Scenario" "Year" "PriceIndex"]),EnergyEfficiencyUpgradeCostPct,MinRegulatoryRating); plot(ProjectionsBaseline.Year(Ind),ProjectionsBaseline.Value(Ind).*adjFactorForPlot); hold on; end hold off; grid on; title(["Property Value Adjusted for Transition Risk"; "Current Energy Rating: " + MortgageData.CurrentEnergyRating]) ylabel('$','Rotation',0) legend(ScenarioLabels,'Location','southeast')
The deadline years show a sudden drop in property value for the "Early Action"
and "Delayed Action"
scenarios. Then the property values recover because of an extra benefit from the upgrades. Even though the "No Action"
scenario has a steady trajectory, both "Early Action"
and "Delayed Action"
lead to higher property values due to the benefit of the energy efficiency upgrades.
Different implementations are possible to adjust the property value with the transition costs. For example, each property could have its own upgrade schedule with assumptions on how fast different owners would react to the regulatory changes. Some owners may not wait until 2031 to make upgrades if they know the regulation is coming, and they may make early upgrades to potentially gain extra value as early adopters. Using the workflow of this example, you can incorporate other variations or extensions to adjust the property value with the transition costs.
For credit risk analysis, besides the impact on property value, you can use other credit drivers to adjust for transition risk. For example, you might include an analysis to adjust the disposable income by the investments required each year to enhance the efficiency of the property. In this case, the credit models would need to include disposable income as a predictor to capture the effect of the projections for provisions or capital. Using this approach, you can also add other types of transition risk as long as the impact of these risks is captured in the projected values of the variables included in the credit models.
The adjustments described in this section are combined with physical risk adjustments in the Compute LTV Projections Adjusted for Physical and Transition Risk section.
Compute LTV Projections Adjusted for Physical and Transition Risk
To adjust LTV projections for both physical and transition risks, combine physical and transition risk adjustments from the Model Physical Risk for Floods and Model Transition Risk for Energy Efficiency Upgrades sections.
The mortgageClimateAdjustedProjectionsFuture
helper function below computes baseline projections, as well as the projections adjusted for physical risk, transition risk, and both physical and transition risk.
function Projections = mortgageClimateAdjustedProjectionsFuture(MortgageData,ClimateScenarioData,physicalRiskAdjFcn,transitionRiskAdjFcn) ProjectionsReference = mortgageProjectionsBaseline(MortgageData,ClimateScenarioData); ProjectionsReference = addvars(ProjectionsReference,ones(height(ProjectionsReference),1),'Before','Value','NewVariableNames','AdjustmentFactor'); % Allocate output table, with blocks for all risk adjustments RiskAdjustmentTypes = ["No Adjustments"; "Physical"; "Transition"; "Physical and Transition"]; Projections = repmat(ProjectionsReference,length(RiskAdjustmentTypes),1); Projections = addvars(Projections,repelem(RiskAdjustmentTypes,height(ProjectionsReference)),'Before','Scenario','NewVariableNames','RiskAdjustment'); % "No Adjustments" is the same as the reference projections, no changes needed % Physical risk PhysicalRiskInd = Projections.RiskAdjustment=="Physical"; FloodRisk = MortgageData.FloodRiskRating; ProjectionsReference = join(ProjectionsReference,ClimateScenarioData(:,["Year" "Scenario" "PrecipitationChangePct"])); Projections.AdjustmentFactor(PhysicalRiskInd) = physicalRiskAdjFcn(FloodRisk,ProjectionsReference.PrecipitationChangePct); Projections.Value(PhysicalRiskInd) = MortgageData.CurrentValue*(Projections.PriceIndex(PhysicalRiskInd)/100).*Projections.AdjustmentFactor(PhysicalRiskInd); Projections.LTV(PhysicalRiskInd) = Projections.LoanBalance(PhysicalRiskInd)./Projections.Value(PhysicalRiskInd); % Transition risk TransitionRiskInd = Projections.RiskAdjustment=="Transition"; PriceIndexData = Projections(TransitionRiskInd,["Scenario" "Year" "PriceIndex"]); Projections.AdjustmentFactor(TransitionRiskInd) = transitionRiskAdjFcn(MortgageData,PriceIndexData); Projections.Value(TransitionRiskInd) = MortgageData.CurrentValue*(Projections.PriceIndex(TransitionRiskInd)/100).*Projections.AdjustmentFactor(TransitionRiskInd); Projections.LTV(TransitionRiskInd) = Projections.LoanBalance(TransitionRiskInd)./Projections.Value(TransitionRiskInd); % Physical and transition risk PhysAndTransRiskInd = Projections.RiskAdjustment=="Physical and Transition"; Projections.AdjustmentFactor(PhysAndTransRiskInd) = Projections.AdjustmentFactor(PhysicalRiskInd).*Projections.AdjustmentFactor(TransitionRiskInd); Projections.Value(PhysAndTransRiskInd) = MortgageData.CurrentValue*(Projections.PriceIndex(PhysAndTransRiskInd)/100).*Projections.AdjustmentFactor(PhysAndTransRiskInd); Projections.LTV(PhysAndTransRiskInd) = Projections.LoanBalance(PhysAndTransRiskInd)./Projections.Value(PhysAndTransRiskInd); end physicalRiskAdjFcn = @floodRiskAdjustmentFactor; transitionRiskAdjFcn = @(MortgageData,PriceIndexData)transitionRiskAdjustmentFactor(MortgageData,PriceIndexData,EnergyEfficiencyUpgradeCostPct,MinRegulatoryRating); Projections = mortgageClimateAdjustedProjectionsFuture(MortgageData,ClimateScenarioData,physicalRiskAdjFcn,transitionRiskAdjFcn); head(Projections)
RiskAdjustment Scenario Year Age LoanBalance PriceIndex AdjustmentFactor Value LTV ________________ ______________ ____ ___ ___________ __________ ________________ __________ _______ "No Adjustments" "Early Action" 2021 11 95175 101.2 1 1.9228e+05 0.49498 "No Adjustments" "Early Action" 2022 12 92517 102.4 1 1.9456e+05 0.47552 "No Adjustments" "Early Action" 2023 13 89707 103.6 1 1.9684e+05 0.45574 "No Adjustments" "Early Action" 2024 14 86735 104.8 1 1.9912e+05 0.43559 "No Adjustments" "Early Action" 2025 15 83592 106 1 2.014e+05 0.41505 "No Adjustments" "Early Action" 2026 16 80268 107.8 1 2.0482e+05 0.3919 "No Adjustments" "Early Action" 2027 17 76754 109.6 1 2.0824e+05 0.36858 "No Adjustments" "Early Action" 2028 18 73037 111.4 1 2.1166e+05 0.34507
Select the RiskAdjustmentChoice
adjustment type and then visualize the property value and LTV projections for your selection.
RiskAdjustmentChoice = "Physical and Transition"; IndRiskAdjustment = Projections.RiskAdjustment==RiskAdjustmentChoice; figure t = tiledlayout(2,1); nexttile for s = ScenarioLabels IndScenario = Projections.Scenario == s; IndPlot = IndRiskAdjustment&IndScenario; plot(Projections.Year(IndPlot),Projections.Value(IndPlot)); hold on; end hold off grid on title('Property Value') ylabel('$','Rotation',0) legend(ScenarioLabels,'Location','southwest') nexttile for s = ScenarioLabels IndScenario = Projections.Scenario == s; IndPlot = IndRiskAdjustment&IndScenario; plot(Projections.Year(IndPlot),Projections.LTV(IndPlot)*100); hold on; end hold off grid on title('LTV') ylabel('%','Rotation',0) legend(ScenarioLabels,'Location','southwest') title(t,strcat("Adjustment for ",RiskAdjustmentChoice," Risk"))
For the property values, the transition shocks have an impact on these values in the deadline years, but in the long run, the physical risk dominates. Although these patterns are visible in the LTV projections, the loan balance goes steadily down over the life of the mortgage. Therefore, the overall value of the LTV ratio is similar, and small, for all scenarios near the maturity of the loan.
The Estimate Provisions and Capital section explores new mortgage origination, for example, what is the effect of a new mortgage for the same property, assuming that the property is sold in the future. The LTV ratio shows strong differences in this situation because the loan balance is large at the start of the loan.
Estimate Provisions and Capital
To assess the impact of the physical and transition risk adjustments, you can use credit models that include the LTV ratio as a predictor and then estimate the provisions and capital with and without the adjustments.
This example uses a lifetime probability of default (PD) model (see fitLifetimePDModel
) that includes the LTV ratio and the age of the mortgage as predictors.
load SimulatedClimatePDModel.mat
disp(ClimatePDModel)
Probit with properties: ModelID: "Probit" Description: "Simulated lifetime PD model for climate risk analysis of mortgages." UnderlyingModel: [1×1 classreg.regr.CompactGeneralizedLinearModel] IDVar: "ID" AgeVar: "Age" LoanVars: "LTV" MacroVars: "" ResponseVar: "Default" WeightsVar: "" TimeInterval: 1
This example also includes a loss given default (LGD) model (see fitLGDModel
) in the analysis. This model also uses LTV and age as predictors.
load SimulatedClimateLGDModel.mat
disp(ClimateLGDModel)
Regression with properties: ResponseTransform: "probit" BoundaryTolerance: 1.0000e-05 ModelID: "ClimateLGD" Description: "Simulated LGD model for climate risk analysis of mortgages." UnderlyingModel: [1×1 classreg.regr.CompactLinearModel] PredictorVars: ["Age" "LTV"] ResponseVar: "LGD" WeightsVar: ""
The models fitted in this example are ad hoc and use simulated training data that includes the projected variables of interest, in this case, the LTV ratio and age of the loan. In practice, you could use existing PD and LGD models for a mortgage loan portfolio if they include the variables projected using the climate scenarios, in this case the property value and LTV ratio. In this example, the age of a loan is included because it is a common predictor variable for credit models, especially for lifetime PD models in the context of lifetime expected credit losses. An exposure-at-default (EAD) model (see fitEADModel
) is not as relevant for mortgages because they use a standard payment schedule.
Compute the projected PD and LGD values using the predict
functions from the PD and LGD models.
Projections.PD = predict(ClimatePDModel,Projections); Projections.LGD = predict(ClimateLGDModel,Projections);
With these projections, you can compute the capital requirements and risk-weighted assets (RWA). The computation of RWA follows Basel II and uses the asymptotic single risk factor (ASRF) model (see asrf
). The asrf
function uses the PD, LGD, and EAD projections; for EAD, use the projected loan balances.
MortgageAssetCorrelation = 0.15;
Projections.Capital = asrf(Projections.PD,Projections.LGD,MortgageAssetCorrelation,'EAD',Projections.LoanBalance);
Projections.RWA = 12.5*Projections.Capital;
Visualize the projected credit metrics. All metrics, in general, decrease with loan age. In the deadline years for transition scenarios, the metrics show a one year shock, specifically in 2021 for "Early Action"
and 2031 for "Delayed Action"
. However, the downward trend in risk mitigates future differences resulting from different climate scenarios. Indeed, for climate risk, some adjustments to projections happen many years into the future, where the PD, LGD, and EAD values are smaller. The RWA value, naturally, shows the same trends.
RiskAdjustmentChoice = "Physical and Transition"; IndRiskAdjustment = Projections.RiskAdjustment==RiskAdjustmentChoice; RiskMetricChoice = "RWA"; switch RiskMetricChoice case "PD" MetricTitle = "Probability of Default"; MetricYLabel = "%"; MetricMultiplier = 100; case "LGD" MetricTitle = "Loss Given Default"; MetricYLabel = "%"; MetricMultiplier = 100; case "RWA" MetricTitle = "Risk-Weighted Assets"; MetricYLabel = "$"; MetricMultiplier = 1; end figure; barYear = Projections.Year(IndRiskAdjustment&Projections.Scenario == ScenarioLabels(1)); barData = zeros(length(barYear),length(ScenarioLabels)); for ii = 1:length(ScenarioLabels) s = ScenarioLabels(ii); IndScenario = Projections.Scenario == s; IndPlot = IndRiskAdjustment&IndScenario; barData(:,ii) = Projections{IndPlot,RiskMetricChoice}*MetricMultiplier; end bar(barYear,barData); grid on title([MetricTitle; "Risk Adjustments: "+RiskAdjustmentChoice]) ylabel(MetricYLabel,'Rotation',0) legend(ScenarioLabels,'Location','northeast')
Regarding cumulative provisions, the computeCumulativeProvisions
helper function calls the portfolioECL
function and returns the cumulative lifetime expected credit loss (ECL) for each scenario and type of climate risk adjustment.
function [ECLByScenarioAndType,CumulativeProvisions] = computeCumulativeProvisions(Projections,ClimatePDModel) % Give each block of scenario and risk adjustment a separate "ID" for % lifetime PD computations (cumulative, marginal, survival) [Projections.ID,AdjGroupLabel,ScenGroupLabel] = findgroups(Projections.RiskAdjustment,Projections.Scenario); IndAfterLoanOrigination = Projections.Age>0; Projections.MarginalPD = nan(height(Projections),1); Projections.MarginalPD(IndAfterLoanOrigination) = predictLifetime(ClimatePDModel,Projections(IndAfterLoanOrigination,:),ProbabilityType="marginal"); EIR = 0.045; % Effective interest rate [~,ECLByScenarioAndType,ECLPerPeriod] = portfolioECL(Projections(IndAfterLoanOrigination,["ID" "MarginalPD"]),Projections(IndAfterLoanOrigination,["ID" "LGD"]),Projections(IndAfterLoanOrigination,["ID" "LoanBalance"]),Periodicity="annual",InterestRate=EIR); ECLByScenarioAndType = addvars(ECLByScenarioAndType,AdjGroupLabel(ECLByScenarioAndType.ID),NewVariableNames="RiskAdjustment",Before="ID"); ECLByScenarioAndType = addvars(ECLByScenarioAndType,ScenGroupLabel(ECLByScenarioAndType.ID),NewVariableNames="Scenario",Before="ID"); Provisions = nan(height(Projections),1); Provisions(IndAfterLoanOrigination) = ECLPerPeriod{:,end}; % Next line returns cumulative as rows, sorted by ID CumulProvByID = splitapply(@(x)cumsum(x'),Provisions(IndAfterLoanOrigination),Projections.ID(IndAfterLoanOrigination)); % Put rows in original ID order, and transpose into columns CumulProvByID = CumulProvByID(ECLByScenarioAndType.ID,:)'; CumulativeProvisions = nan(height(Projections),1); CumulativeProvisions(IndAfterLoanOrigination) = CumulProvByID(:); end
Compute the cumulative provisions information.
[ECLByScenarioAndType,Projections.CumulativeProvisions] = computeCumulativeProvisions(Projections,ClimatePDModel);
Visualize the cumulative provisions over time and the lifetime ECL amount.
RiskAdjustmentChoice = "Physical and Transition"; IndRiskAdjustment = Projections.RiskAdjustment==RiskAdjustmentChoice; figure t = tiledlayout(2,1); nexttile for s = ScenarioLabels IndScenario = Projections.Scenario == s; IndPlot = IndRiskAdjustment&IndScenario; plot(Projections.Year(IndPlot),Projections.CumulativeProvisions(IndPlot)); hold on; end hold off; grid on; title("Cumulative Provisions") ylabel('$','Rotation',0) legend(ScenarioLabels,'Location','southeast') nexttile IndRiskAdjustment = ECLByScenarioAndType.RiskAdjustment==RiskAdjustmentChoice; barLabel = categorical("Lifetime ECL"); barData = zeros(1,length(ScenarioLabels)); for ii=1:length(ScenarioLabels) s = ScenarioLabels(ii); IndScenario = ECLByScenarioAndType.Scenario == s; IndPlot = IndRiskAdjustment&IndScenario; barData(ii) = ECLByScenarioAndType{IndPlot,"ECL"}; end bar(barLabel,barData); grid on; title("Lifetime Expected Credit Loss") ylabel('$','Rotation',0) legend(ScenarioLabels,'Location','northeast') title(t,strcat("Risk Adjustments: ",RiskAdjustmentChoice))
As discussed earlier, the credit metrics decrease with the age of the loan, so the provisions are more sensitive to the short term shocks. That explains why the "Early Action"
has higher provisions for the seasoned loan in this example. The longer-term impact of the delayed and no action scenarios occur when the PD, LGD, EAD are very small and have minimal effect in the cumulative provisions. The Physical and Transition Risk for New Mortgages section, however, shows that the longer-term risks have a different impact on a new mortgage origination in the future.
Calculate Physical and Transition Risk for New Mortgages
In this section, you modify the origination year of the loan and set the loan origination at a future date. For example, if the property is sold a few years from now, the new owner would likely get a new mortgage for the same property.
The PD, LGD, and EAD credit metrics are typically higher earlier in the life of a mortgage. By moving the start date of the loan into the future, you can analyze how physical and transition risks that have a longer-time frame impact the credit risk of a hypothetical new loan in the future.
The new mortgage data is the same as the mortgage data in the previous sections, except for the loan origination year. This example lists all the mortgage data in case you want to modify other fields and further explore the methodology.
NewMortgageData.OriginationYear = 2032; % Assume end of year NewMortgageData.CurrentYear = 2020; % Assume end of year NewMortgageData.Term = 30; % Original mortgage term NewMortgageData.Rate = 0.0575; % Assume fixed rate NewMortgageData.Balance = 90000; % Current mortgage balance at end of current year NewMortgageData.CurrentValue = 190000; NewMortgageData.PropertyType = "Commercial"; NewMortgageData.FloodRiskRating = "High"; NewMortgageData.CurrentEnergyRating = "Medium Low"; NewMortgageData.MaxEnergyRating = "Medium High"; MinRegulatoryRating = "Medium High";
Obtain the projections and the period-by-period and cumulative credit metrics.
NewProjections = mortgageClimateAdjustedProjectionsFuture(NewMortgageData,ClimateScenarioData,physicalRiskAdjFcn,transitionRiskAdjFcn);
NewProjections.PD = predict(ClimatePDModel,NewProjections);
NewProjections.LGD = predict(ClimateLGDModel,NewProjections);
NewProjections.Capital = asrf(NewProjections.PD,NewProjections.LGD,MortgageAssetCorrelation,'EAD',NewProjections.LoanBalance);
NewProjections.RWA = 12.5*NewProjections.Capital;
[NewECLByScenarioAndType,NewProjections.CumulativeProvisions] = computeCumulativeProvisions(NewProjections,ClimatePDModel);
Select the type of risk adjustment (physical, transition, or both) and then visualize the results.
RiskAdjustmentChoice = "Physical and Transition"; IndRiskAdjustment = NewProjections.RiskAdjustment==RiskAdjustmentChoice; figure t = tiledlayout("flow"); nexttile for s = ScenarioLabels IndScenario = NewProjections.Scenario == s; IndPlot = IndRiskAdjustment&IndScenario; plot(NewProjections.Year(IndPlot),NewProjections.Value(IndPlot)); hold on; end hold off grid on title('Property Value') ylabel('$','Rotation',0) nexttile for s = ScenarioLabels IndScenario = NewProjections.Scenario == s; IndPlot = IndRiskAdjustment&IndScenario; plot(NewProjections.Year(IndPlot),NewProjections.LTV(IndPlot)*100); hold on; end hold off grid on title('LTV') ylabel('%','Rotation',0) nexttile for s = ScenarioLabels IndScenario = NewProjections.Scenario == s; IndPlot = IndRiskAdjustment&IndScenario; plot(NewProjections.Year(IndPlot),NewProjections.CumulativeProvisions(IndPlot)); hold on; end hold off grid on title("Cumulative Provisions") ylabel('$','Rotation',0) nexttile IndRiskAdjustment = NewECLByScenarioAndType.RiskAdjustment==RiskAdjustmentChoice; barLabel = categorical("Lifetime ECL"); barData = zeros(1,length(ScenarioLabels)); for ii=1:length(ScenarioLabels) s = ScenarioLabels(ii); IndScenario = NewECLByScenarioAndType.Scenario == s; IndPlot = IndRiskAdjustment&IndScenario; barData(ii) = NewECLByScenarioAndType{IndPlot,"ECL"}; end bar(barLabel,barData); grid on title("Lifetime Expected Credit Loss") ylabel('$','Rotation',0) title(t,["Risk Adjustments: " + RiskAdjustmentChoice; "Origination Year: " + string(NewMortgageData.OriginationYear)]) leg = legend(ScenarioLabels,"Orientation","horizontal"); leg.Layout.Tile = 'south';
The property values are projected from the current year of the analysis, applying the physical and transition risk adjustments discussed in the example. The LTV ratio and the credit risk metrics are computed from the loan origination year.
A loan starting in 2032, for example, after the "Early Action"
and "Delayed Action"
deadlines, starts when the short term effects of upgrading for energy efficiency are in the past. Regarding physical risk, properties with higher flood risk are already losing more value by the start of the loan. Regarding transition risk, energy efficiency upgrades in early and delayed scenarios already took place.
Although the differences in total provisions are not large, different climate scenarios have the highest lifetime ECL depending on the origination year selected. The "Early Action"
scenario is the riskiest for existing, seasoned loans. The "Delayed Action"
becomes riskier for loans starting in the early 2020s because of the transition effect in the year 2031. However, eventually the "No Action"
scenario becomes the riskiest.
Conclusion
This example demonstrates a workflow to incorporate some physical and transition risks into a climate-related credit analysis for mortgages. The methodology in this example is a simple approach to bring together existing information and models to assess the impact of climate change on provisions and capital.
Climate risk is a complex developing area and this example is a starting point that you can extend in different directions. You might add more variables (such as rate of unemployment or sea-level rise) and other models (such as flood or cost models) to the analysis. Bringing an entire portfolio of mortgages could also shed light on portfolio composition or potentially a dynamic balance sheet analysis. You might also explore debt serviceability to analyze the disposable income projections in the analysis. Another area of investigation could be additional insurance considerations, such as projections on the cost of insurance or whether a property is no longer insurable.
References
[1] Adler, Robert F., Guojun Gu, George J. Huffman. "Estimating Climatological Bias Errors for the Global Precipitation Climatology Project (GPCP)." Journal of Applied. Meteorology and Climatology. 51, 84–99, 2012.
[2] Bank of Canada, Climate Transition Scenario Data, https://www.bankofcanada.ca/2022/01/climate-transition-scenario-data/.
[3] Bank of England, Key elements of the 2021 Biennial Exploratory Scenario: Financial risks from climate change, June 2021, https://www.bankofengland.co.uk/stress-testing/2021/key-elements-2021-biennial-exploratory-scenario-financial-risks-climate-change.
[4] Bank of England, Guidance for participants of the 2021 Biennial Exploratory Scenario: Financial risks from climate change, June 2021, https://www.bankofengland.co.uk/-/media/boe/files/stress-testing/2021/the-2021-biennial-exploratory-scenario-on-the-financial-risks-from-climate-change.pdf.
[5] Davenport, F. V., Burke, M., and Diffenbaugh, N. S. "Contribution of Historical Precipitation Change to US Flood Damages." Proceedings of the National Academy of Sciences. Vol. 118, No. 4, January 26, 2021, https://www.pnas.org/doi/10.1073/pnas.2017524118.
[6] European Central Bank, Banking Supervision, Climate Risk Stress Test, January 2022, https://www.bankingsupervision.europa.eu/ecb/pub/pdf/ssm.macrofinancialscenariosclimateriskstresstest2022~bcac934986.en.pdf.
[7] U.S. Federal Government, 2022: U.S. Climate Resilience Toolkit. [Online] https://toolkit.climate.gov. Climate Explorer: https://toolkit.climate.gov/tool/climate-explorer-0. Accessed June, 2022.
[8] Intergovernmental Panel on Climate Change (IPCC), https://www.ipcc.ch/.
[9] Collins, M., R. Knutti, J. Arblaster, J.-L. Dufresne, T. Fichefet, P. Friedlingstein, X. Gao, W.J. Gutowski, T. Johns, G. Krinner, M. Shongwe, C. Tebaldi, A.J. Weaver and M. Wehner. "Long-term Climate Change: Projections, Commitments and Irreversibility." In Climate Change 2013: The Physical Science Basis. Contribution of Working Group I to the Fifth Assessment Report of the Intergovernmental Panel on Climate Change. [Stocker, T.F., D. Qin, G.-K. Plattner, M. Tignor, S.K. Allen, J. Boschung, A. Nauels, Y. Xia, V. Bex and P.M. Midgley (eds.)]. Cambridge University Press, Cambridge, United Kingdom and New York, NY, 2013.
[10] Mitchell-Wallace, K., Jones, M., Hillier, J., and Foote, M. Natural Catastrophe Risk Management and Modelling: A Practitioner's Guide. Wiley-Blackwell, May 2017.
[11] National Center for Atmospheric Research, Climate Data Guide, Precipitation Data Sets: https://climatedataguide.ucar.edu/climate-data/precipitation-data-sets-overview-comparison-table.
[12] National Oceanic and Atmospheric Administration (NOAA), https://www.noaa.gov/.
[13] Met Office, https://www.metoffice.gov.uk/.
[14] Energy Performance Certificate Wiki: https://en.wikipedia.org/wiki/Energy_performance_certificate.
[15] Energy Star Wiki: https://en.wikipedia.org/wiki/Energy_Star.