Skip to content

Comments

Add WACC module and a new realization in the MACRO module about investment inefficiencies#2278

Draft
daymontas1 wants to merge 2 commits intoremindmodel:developfrom
daymontas1:imperfect-markets-wacc
Draft

Add WACC module and a new realization in the MACRO module about investment inefficiencies#2278
daymontas1 wants to merge 2 commits intoremindmodel:developfrom
daymontas1:imperfect-markets-wacc

Conversation

@daymontas1
Copy link

@daymontas1 daymontas1 commented Jan 29, 2026

Capital Market Modelling in REMIND.pptx
Cost_of_Capital_Documentation_v2.docx

Purpose of this PR

This PR introduces (1) a new realization in the macro module that accounts for investment losses arising from domestic capital market inefficiencies, and (2) a new module (Module 25_WACC) for calculating capital costs associated with energy-system and macroeconomic investments.

Description

Investment_Inefficiencies
The Investment_Inefficiencies realization in the macro module computes the share of new investments that is not transformed into productive capital due to financial frictions, misallocation, installation costs, or other inefficiencies. A parameter, φ, is introduced into the capital accumulation equation to represent these inefficiencies.

Specifically, φ captures the share of gross investment that successfully translates into productive capital in each region. Regional φ values are calibrated using literature-defined bounds* and empirical data on the efficiency of financial systems.

Module 25_WACC
Module 25_WACC computes, for each time period, technology-specific weighted average cost of capital (WACC)–related costs for the energy system, as well as costs associated with macroeconomic investment flows.

Energy-technology WACC costs consist of:
(i) costs associated with newly installed capacity in the current period, and
(ii) residual costs of technologies that remain in operation from previous periods.

This structure relies on the assumption that the repayment period equals the technical lifetime of each technology. Input WACC data are primarily drawn from Calcaterra et al. and are aggregated to REMIND regions using GDP-weighted averages of the countries comprising each region.

From these values, WACC mark-ups are derived and defined as the difference between the WACC of a given technology–region pair and the lowest observed WACC. The latter corresponds to natural-gas power generation in the USA and the CAZ region (Canada, Australia, and New Zealand), which serves as the risk-free reference case (i.e., zero mark-up) against which all other combinations are benchmarked.

To preserve budget neutrality, WACC-related costs are recycled back into the economy. At the same time, to capture the stimulating effect of WACC costs on investment decisions, WACC costs calculated in the previous model iteration are deducted from those computed in the current iteration. As the model converges, the net WACC cost component in the budget constraint approaches zero.

Further documentation is provided in the attached presentation and Word file.

Parts concerned

  • ◻️ GAMS Code
  • ◻️ R-scripts
  • ◻️ Documentation (GAMS incode documentation, comments, tutorials)
  • ◻️ Input data / CES parameters
  • ◻️ Tests, CI/CD (continuous integration/deployment)
  • ◻️ Configuration (switches in main.gms, default.cfg, and scenario_config*.csv files)
  • ◻️ Other (please give a description)

Impact

  • ◻️ Bug fix
  • ◻️ Refactoring
  • ◻️ New feature
  • ◻️ Change of parameter values or input data (including CES parameters)
  • ◻️ Minor change (default scenarios show only small differences)
  • ◻️ Fundamental change of results of default scenarios

Checklist

Do not delete any line. Leave unfinished elements unchecked so others know how far along you are.
In the end all checkboxes must be ticked before you can merge
.

  • I executed the automated model tests (make test) after my final commit and all tests pass (FAIL 0)
  • I adjusted the reporting in remind2 if and where it was needed
  • I adjusted the madrat packages (mrremind and other packages involved) for input data generation if and where it was needed
  • My code follows the coding etiquette
  • I explained my changes within the PR, particularly in hard-to-understand areas
  • I checked that the in-code documentation is up-to-date
  • I adjusted forbiddenColumnNames in readCheckScenarioConfig.R in case the PR leads to deprecated switches
  • I updated the CHANGELOG.md correctly (added, changed, fixed, removed, input data/calibration)

Further information (optional)

  • Runs with these changes are here:
  • Comparison of results (what changes by this PR?):

@daymontas1 daymontas1 changed the title Add WACC module and a new realization in the MACRO module about inves… Add WACC module and a new realization in the MACRO module about investment inefficiencies Jan 29, 2026
@daymontas1
Copy link
Author

PR in mrremind for the required input data here: pik-piam/mrremind#778

* (1 - pm_delta_kap(regi,in))
** (pm_ttot_val(ttot+1) - pm_ttot_val(ttot))
+ p01_cumDeprecFactor_old(ttot+1,regi,in) * vm_invMacro(ttot,regi,in) * p01_investeffectv(regi)
* + p01_cumDeprecFactor_old(ttot+1,regi,in) * vm_invMacro(ttot,regi,in)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please delete.

Copy link
Contributor

@nicobauer nicobauer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

HI Diamantis. I left a few comments. Mostly they are on deletions of unnecessary lines that are commented anyways. ONly in the postsolve for the WACCS are two more important comments. Thanks and see you latter.

+ p01_cumDeprecFactor_old(ttot+1,regi,in) * vm_invMacro(ttot,regi,in) * p01_investeffectv(regi)
* + p01_cumDeprecFactor_old(ttot+1,regi,in) * vm_invMacro(ttot,regi,in)
+ p01_cumDeprecFactor_new(ttot+1,regi,in) * vm_invMacro(ttot+1,regi,in) * p01_investeffectv(regi)
* + p01_cumDeprecFactor_new(ttot+1,regi,in) * vm_invMacro(ttot+1,regi,in)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please delete.

* + p01_cumDeprecFactor_new(ttot+1,regi,in) * vm_invMacro(ttot+1,regi,in)
;

* * p01_investeffectv(regi) * (1 + (sum(inLocal, vm_invMacro(ttot+1,regi,inLocal)) - sum(inLocal, vm_invMacro(ttot,regi,inLocal))) / sum(inLocal, vm_invMacro(ttot,regi,inLocal)))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please delete.

*fix the WACC term of the budget equation equal to zero for all times
vm_waccCost.fx(t, regi) = 0;

***vm_techwaccCost(t, regi) = 0;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If not needed, Please delete.

*** | Contact: remind@pik-potsdam.de
*** SOF ./modules/25_WACC/standard/bounds.gms
*fix budget equation term to zero for 2005
***vm_waccCost.fx("2005",regi) = 0;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

plesae delete.

***Zero WACC for energy technologies is used for calibration
***p25_techwacc(t, regi, tewacc) = 0;

Parameter p25_invwacc(ttot, all_regi) "WACC markup for each country"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please reneame to counwacc or similar. "inv" is not so intuitive b/c it wcould also refer to techs. Also the ccs4r files should be named more intuitively.

*** | Contact: remind@pik-potsdam.de
*** SOF ./modules/25_WACC/standard/declarations.gms

Parameters
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add the units. That helps a lot to understand the code.

***---------------------------------------------------------------------------
* WACC implementation on capital costs
***---------------------------------------------------------------------------
***This equation calculates the weighted average cost of capital (WACC) costs for new and existing technologies while ensuring that each past investment is assigned the correct WACC from the year
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add a line in the comments about the p25_techwaccCostO. Same for next commend.

* WACC implementation on capital costs
***---------------------------------------------------------------------------
***This equation calculates the weighted average cost of capital (WACC) costs for new and existing technologies while ensuring that each past investment is assigned the correct WACC from the year
q25_techwaccCost(t, regi)$(t.val > 2005)..
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do I see correctly that the tech-wacc parameters already include the country specific wacc parameters?

***---------------------------------------------------------------------------
*' Calculation of total WACC costs
***---------------------------------------------------------------------------
p25_waccCostO_tewacc(t, regi, tewacc) =
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wherre is this parameter used again?

sum((t2)$((t.val - t2.val <= pm_lifetime_max(regi,tewacc)) and (t2.val < t.val)),
(vm_costInvTeDir.l(t2, regi, tewacc)
+ vm_costInvTeAdj.l(t2, regi, tewacc)$teAdj(tewacc)
) * p25_techwacc(t2, regi, tewacc) * pm_ts(t2)/2);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The /2 is the critical parameter that you wanted to x-check with Ropert Pietzcker. Right?

vm_taxrevimplicitQttyTargetTax(ttot,all_regi) "tax revenue of implict tax for quantity target bound [T$]"
vm_taxrevimplicitPriceTax(ttot,all_regi,entySe,all_enty,sector) "tax revenue of implict tax for final energy price target [T$]"
vm_taxrevimplicitPePriceTax(ttot,all_regi,all_enty) "tax revenue of implict tax forprimary energy price target [T$]"
vm_waccCost(ttot,all_regi) "difference between WACC costs in current and previous iteration"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why are these variables added here? Might it be a merge error?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please delete empty files

*' * (singleSectorGr) neo-classical, single sector growth model
$setGlobal macro singleSectorGr !! def = singleSectorGr
*' * (Investment_Inefficiencies) Investment losses due to domestic capital market inefficiencies
$setGlobal macro Investment_Inefficiencies !! def = singleSectorGr
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the default scenario would still be singleSectorGr please check for the final PR!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants