In MIMOSA, every region can reduce its own emissions. The price for this is determined
by the area under the MAC (see Mitigation). On top of that,
regions can trade emission reductions with each other. Regions can pay other regions to reduce
their emissions, or receive payments for reducing their own emissions.
The financial transfers for
this are captured in the variable \(\text{mitigation cost trading balance}_{t,r}\). If it is positive,
the region has to pay for emission reductions in other regions. If it is negative,
the region receives payments for reducing its own emissions. For every timestep,
the sum of these transfers should be zero:
\[
\sum_r \text{mitigation cost trading balance}_{t,r} = 0
\]
All emissions are traded at the global carbon price. Therefore, the financial flows (mitigation cost balance) is
translated into emission flows (emission reduction trading balance) using the global carbon price:
\[
\text{emission reduction trading balance}_{t,r} = \frac{\text{mitigation cost trading balance}_{t,r}}{\text{global carbon price}_{t}},
\]
where the global carbon price is the population weighted average of the regional carbon prices:
\[
\text{global carbon price}_{t} = \frac{\sum_r \text{carbon price}_{t,r} \cdot \text{population}_{t,r}}{\sum_r \text{population}_{t,r}}.
\]
Finally, the emission reductions paid for by a region are calculated as the physical reductions in the region plus the
emission reduction trading balance:
\[
\text{paid for emission reductions}_{t,r} = \text{regional emission reduction}_{t,r} + \text{emission reduction trading balance}_{t,r}.
\]
Source code in mimosa/components/emissiontrade/emissiontrade.py
| def get_constraints(m: AbstractModel) -> Sequence[GeneralConstraint]:
"""
In MIMOSA, every region can reduce its own emissions. The price for this is determined
by the area under the MAC (see [Mitigation](mitigation.md#mitigation-costs)). On top of that,
regions can trade emission reductions with each other. Regions can pay other regions to reduce
their emissions, or receive payments for reducing their own emissions.
The financial transfers for
this are captured in the variable $\\text{mitigation cost trading balance}_{t,r}$. If it is positive,
the region has to pay for emission reductions in other regions. If it is negative,
the region receives payments for reducing its own emissions. For every timestep,
the sum of these transfers should be zero:
$$
\\sum_r \\text{mitigation cost trading balance}_{t,r} = 0
$$
All emissions are traded at the global carbon price. Therefore, the financial flows (mitigation cost balance) is
translated into emission flows (emission reduction trading balance) using the global carbon price:
$$
\\text{emission reduction trading balance}_{t,r} = \\frac{\\text{mitigation cost trading balance}_{t,r}}{\\text{global carbon price}_{t}},
$$
where the global carbon price is the population weighted average of the regional carbon prices:
$$
\\text{global carbon price}_{t} = \\frac{\\sum_r \\text{carbon price}_{t,r} \\cdot \\text{population}_{t,r}}{\\sum_r \\text{population}_{t,r}}.
$$
Finally, the emission reductions paid for by a region are calculated as the physical reductions in the region plus the
emission reduction trading balance:
$$
\\text{paid for emission reductions}_{t,r} = \\text{regional emission reduction}_{t,r} + \\text{emission reduction trading balance}_{t,r}.
$$
"""
constraints = []
m.global_carbonprice = Var(m.t)
# Emissions are traded at the global carbon price
constraints.extend(
[
# Constraint that sets the global carbon price to the average of the regional carbon prices:
GlobalEquation(
m.global_carbonprice,
lambda m, t: sum(
m.carbonprice[t, r] * m.population[t, r] for r in m.regions
)
/ m.global_population[t],
),
]
)
## Extra reporting variables:
m.attributed_emission_reductions = Var(
m.t, m.regions, units=quant.unit("emissionsrate_unit")
)
m.regional_emission_allowances = Var(
m.t, m.regions, units=quant.unit("emissionsrate_unit")
)
m.emission_reduction_trading_balance = Var(
m.t, m.regions, units=quant.unit("emissionsrate_unit")
)
m.mitigation_cost_trading_balance = Var(
m.t, m.regions, units=quant.unit("currency_unit")
)
constraints.extend(
[
GlobalConstraint(
lambda m, t: sum(
m.mitigation_cost_trading_balance[t, r] for r in m.regions
)
== 0.0,
"sum_mitigation_equals_sum_area_under_mac",
),
# Constraint: from import/export mitigation costs to import/export of emissions using the global carbon price
RegionalEquation(
m.emission_reduction_trading_balance,
lambda m, t, r: (
m.mitigation_cost_trading_balance[t, r]
/ soft_min(m.global_carbonprice[t])
if t > 0
else 0
),
),
# Constraint: paid for emission reductions
RegionalEquation(
m.attributed_emission_reductions,
lambda m, t, r: (
m.regional_emission_reduction[t, r]
+ m.emission_reduction_trading_balance[t, r]
if t > 0
else Constraint.Skip
),
),
# Constraint: regional emission allowances, equal to baseline minus paid for emission reductions
RegionalEquation(
m.regional_emission_allowances,
lambda m, t, r: (
m.baseline_emissions[t, r] - m.attributed_emission_reductions[t, r]
if t > 0
else m.baseline_emissions[t, r]
),
),
]
)
return constraints
|