{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Day 4: Demand I - Enhancing the model with demand\n", "\n", "We will continue our modeling exercise by adding carbon taxes, renewable subsidies, and investment to the model.\n", "\n", "This will allow us to consider the policy impacts of alternative energy transition policies.\n", "\n", "The data and code are based on the paper \"The Efficiency and Sectoral Distributional Implications of Large-Scale Renewable Policies,\" by Mar Reguant." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "We first load relevant libraries, same as last session." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m registry at `~/.julia/registries/General.toml`\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.8/Project.toml`\n", "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.8/Manifest.toml`\n" ] } ], "source": [ "using Pkg\n", "Pkg.add([\"DataFrames\", \"CSV\", \"JuMP\", \"Ipopt\", \"Cbc\", \"Plots\", \"Printf\"])" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "begin \n", " using DataFrames\n", " using CSV\n", " using JuMP\n", " using Ipopt, Cbc\n", " using Plots\n", " using Printf\n", "end" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Remember to set your path correctly:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"/Users/marreguant/Documents/GitHub/em-course/materials/day4/\"" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dirpath = \"/Users/marreguant/Documents/GitHub/em-course/materials/day4/\"" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Building the model\n", "\n", "We load the same data as usual, and also clean it up to simplify it further and create the demand and import curves." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "

12 rows × 7 columns

variablemeanminmedianmaxnmissingeltype
SymbolFloat64Float64Float64Float64Int64DataType
1price38.50551.6631137.2797137.1160Float64
2imports7.524264.24797.570559.798140Float64
3q_commercial12.95329.2623612.388122.17660Float64
4q_industrial4.12242.600493.833477.620030Float64
5q_residential11.07534.399510.007520.49220Float64
6wind_cap0.3409550.09358960.3346760.6817770Float64
7solar_cap0.2605490.001559190.06796380.7934070Float64
8hydronuc5.03462.363164.568599.680510Float64
9weights0.08760.007870440.07880530.2278390Float64
10demand28.150920.605227.093841.80960Float64
11bm0.07714380.01286680.0616161.135820Float64
12am5.266982.973535.299396.85870Float64
" ], "text/latex": [ "\\begin{tabular}{r|ccccccc}\n", "\t& variable & mean & min & median & max & nmissing & eltype\\\\\n", "\t\\hline\n", "\t& Symbol & Float64 & Float64 & Float64 & Float64 & Int64 & DataType\\\\\n", "\t\\hline\n", "\t1 & price & 38.5055 & 1.66311 & 37.2797 & 137.116 & 0 & Float64 \\\\\n", "\t2 & imports & 7.52426 & 4.2479 & 7.57055 & 9.79814 & 0 & Float64 \\\\\n", "\t3 & q\\_commercial & 12.9532 & 9.26236 & 12.3881 & 22.1766 & 0 & Float64 \\\\\n", "\t4 & q\\_industrial & 4.1224 & 2.60049 & 3.83347 & 7.62003 & 0 & Float64 \\\\\n", "\t5 & q\\_residential & 11.0753 & 4.3995 & 10.0075 & 20.4922 & 0 & Float64 \\\\\n", "\t6 & wind\\_cap & 0.340955 & 0.0935896 & 0.334676 & 0.681777 & 0 & Float64 \\\\\n", "\t7 & solar\\_cap & 0.260549 & 0.00155919 & 0.0679638 & 0.793407 & 0 & Float64 \\\\\n", "\t8 & hydronuc & 5.0346 & 2.36316 & 4.56859 & 9.68051 & 0 & Float64 \\\\\n", "\t9 & weights & 0.0876 & 0.00787044 & 0.0788053 & 0.227839 & 0 & Float64 \\\\\n", "\t10 & demand & 28.1509 & 20.6052 & 27.0938 & 41.8096 & 0 & Float64 \\\\\n", "\t11 & bm & 0.0771438 & 0.0128668 & 0.061616 & 1.13582 & 0 & Float64 \\\\\n", "\t12 & am & 5.26698 & 2.97353 & 5.29939 & 6.8587 & 0 & Float64 \\\\\n", "\\end{tabular}\n" ], "text/plain": [ "\u001b[1m12×7 DataFrame\u001b[0m\n", "\u001b[1m Row \u001b[0m│\u001b[1m variable \u001b[0m\u001b[1m mean \u001b[0m\u001b[1m min \u001b[0m\u001b[1m median \u001b[0m\u001b[1m max \u001b[0m\u001b[1m nmissin\u001b[0m ⋯\n", "\u001b[1m \u001b[0m│\u001b[90m Symbol \u001b[0m\u001b[90m Float64 \u001b[0m\u001b[90m Float64 \u001b[0m\u001b[90m Float64 \u001b[0m\u001b[90m Float64 \u001b[0m\u001b[90m Int64 \u001b[0m ⋯\n", "─────┼──────────────────────────────────────────────────────────────────────────\n", " 1 │ price 38.5055 1.66311 37.2797 137.116 ⋯\n", " 2 │ imports 7.52426 4.2479 7.57055 9.79814\n", " 3 │ q_commercial 12.9532 9.26236 12.3881 22.1766\n", " 4 │ q_industrial 4.1224 2.60049 3.83347 7.62003\n", " 5 │ q_residential 11.0753 4.3995 10.0075 20.4922 ⋯\n", " 6 │ wind_cap 0.340955 0.0935896 0.334676 0.681777\n", " 7 │ solar_cap 0.260549 0.00155919 0.0679638 0.793407\n", " 8 │ hydronuc 5.0346 2.36316 4.56859 9.68051\n", " 9 │ weights 0.0876 0.00787044 0.0788053 0.227839 ⋯\n", " 10 │ demand 28.1509 20.6052 27.0938 41.8096\n", " 11 │ bm 0.0771438 0.0128668 0.061616 1.13582\n", " 12 │ am 5.26698 2.97353 5.29939 6.8587\n", "\u001b[36m 2 columns omitted\u001b[0m" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "begin\n", " dfclust = CSV.read(string(dirpath,\"data_jaere_clustered.csv\"), DataFrame);\n", "\n", " # Re-scaling (we multiply by 8.76 to make it into a full year of hours (divided by 1000))\n", " dfclust.weights = 8.76 * dfclust.weights / sum(dfclust.weights);\n", "\n", " # Here only one demand type to make it easier\n", " dfclust.demand = dfclust.q_residential + dfclust.q_commercial + dfclust.q_industrial;\n", "\n", " # Calibrate imports (using elas 0.3)\n", " dfclust.bm = 0.3 * dfclust.imports ./ dfclust.price; # slope\n", " dfclust.am = dfclust.imports - dfclust.bm .* dfclust.price; # intercept\n", " \n", " describe(dfclust)\n", "end" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "The technology file now includes the fixed cost of building new power plants (technologies 3-5). Note that we added an additional row for new natural gas plants." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "We will use an annualization factor to pro-rate the importance of fixed costs for one year." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "

7 rows × 15 columns (omitted printing of 7 columns)

technameheatrateheatrate2FcapLBcapUBnewrenewable
String15Float64Float64Float64Float64Float64Int64Int64
1Hydro/Nuclear10.00.00.01.01.000
2Existing 16.671990.09291230.011.511.500
3Existing 29.794120.2862470.014.514.500
4Existing 313.818120.53520.00.5780.57800
5New Gas6.60.078.47730.0100.010
6Wind0.00.0100.3030.0100.011
7Solar0.00.0100.3030.0100.011
" ], "text/latex": [ "\\begin{tabular}{r|ccccccccc}\n", "\t& techname & heatrate & heatrate2 & F & capLB & capUB & new & renewable & \\\\\n", "\t\\hline\n", "\t& String15 & Float64 & Float64 & Float64 & Float64 & Float64 & Int64 & Int64 & \\\\\n", "\t\\hline\n", "\t1 & Hydro/Nuclear & 10.0 & 0.0 & 0.0 & 1.0 & 1.0 & 0 & 0 & $\\dots$ \\\\\n", "\t2 & Existing 1 & 6.67199 & 0.0929123 & 0.0 & 11.5 & 11.5 & 0 & 0 & $\\dots$ \\\\\n", "\t3 & Existing 2 & 9.79412 & 0.286247 & 0.0 & 14.5 & 14.5 & 0 & 0 & $\\dots$ \\\\\n", "\t4 & Existing 3 & 13.8181 & 20.5352 & 0.0 & 0.578 & 0.578 & 0 & 0 & $\\dots$ \\\\\n", "\t5 & New Gas & 6.6 & 0.0 & 78.4773 & 0.0 & 100.0 & 1 & 0 & $\\dots$ \\\\\n", "\t6 & Wind & 0.0 & 0.0 & 100.303 & 0.0 & 100.0 & 1 & 1 & $\\dots$ \\\\\n", "\t7 & Solar & 0.0 & 0.0 & 100.303 & 0.0 & 100.0 & 1 & 1 & $\\dots$ \\\\\n", "\\end{tabular}\n" ], "text/plain": [ "\u001b[1m7×15 DataFrame\u001b[0m\n", "\u001b[1m Row \u001b[0m│\u001b[1m techname \u001b[0m\u001b[1m heatrate \u001b[0m\u001b[1m heatrate2 \u001b[0m\u001b[1m F \u001b[0m\u001b[1m capLB \u001b[0m\u001b[1m capUB \u001b[0m\u001b[1m new \u001b[0m\u001b[1m\u001b[0m ⋯\n", "\u001b[1m \u001b[0m│\u001b[90m String15 \u001b[0m\u001b[90m Float64 \u001b[0m\u001b[90m Float64 \u001b[0m\u001b[90m Float64 \u001b[0m\u001b[90m Float64 \u001b[0m\u001b[90m Float64 \u001b[0m\u001b[90m Int64 \u001b[0m\u001b[90m\u001b[0m ⋯\n", "─────┼──────────────────────────────────────────────────────────────────────────\n", " 1 │ Hydro/Nuclear 10.0 0.0 0.0 1.0 1.0 0 ⋯\n", " 2 │ Existing 1 6.67199 0.0929123 0.0 11.5 11.5 0\n", " 3 │ Existing 2 9.79412 0.286247 0.0 14.5 14.5 0\n", " 4 │ Existing 3 13.8181 20.5352 0.0 0.578 0.578 0\n", " 5 │ New Gas 6.6 0.0 78.4773 0.0 100.0 1 ⋯\n", " 6 │ Wind 0.0 0.0 100.303 0.0 100.0 1\n", " 7 │ Solar 0.0 0.0 100.303 0.0 100.0 1\n", "\u001b[36m 8 columns omitted\u001b[0m" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "begin\n", " tech = CSV.read(string(dirpath,\"data_technology.csv\"), DataFrame);\n", " afactor = (1 - (1 / (1.05^20.0))) / 0.05;\n", " tech.F = tech.F ./afactor;\n", " tech.F2 = tech.F2 ./afactor;\n", " tech\n", "end" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Adding demand considerations\n", "\n", "We are now ready to clear the market. We will **maximize welfare** using a non-linear solver.\n", "\n", "$$ \\max \\ CS - Costs - Fixed Costs \\\\\n", "\n", "\\text{s.t.} \\ \\text{operational constraints, market clearing}. $$\n", "\n", "To include demand, we will separate the price that consumers pay from the price that the wholesale market sets. We define a variable \"tariff\" that is what consumers pay any hour of the day.\n", "\n", "We also allow alpha to determine the share of \"insensitive\" consumers. We can see how the investment changes as we modify \"alpha\"." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "clear_market_invest_tariff (generic function with 1 method)" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "## Clear market based on cost minimization\n", "function clear_market_invest_tariff(data::DataFrame, tech::DataFrame; \n", " tariff=35.0, alpha=1.0, tax=0.0, subsidy=0.0, ng_price = 4.0, elas = 0.3)\n", "\n", " # We declare a model\n", " model = Model(\n", " optimizer_with_attributes(\n", " Ipopt.Optimizer, \n", " \"print_level\"=>0)\n", " );\n", "\n", " # Set useful indexes\n", " I = nrow(tech); # number of techs\n", " T = nrow(data); # number of periods\n", "\n", " for i = 2:5\n", " tech.c[i] = tech.heatrate[i] * ng_price;\n", " tech.c2[i] = tech.heatrate2[i] * ng_price;\n", " end\n", " \n", " # Setting demand parameters\n", " data.b = elas * data.demand ./ data.price; # slope\n", " data.a = data.demand + data.b .* data.price; # intercept\n", " \n", " # Variables to solve for\n", " @variable(model, price[1:T]);\n", " @variable(model, demand[1:T]);\n", " @variable(model, imports[1:T]);\n", " @variable(model, quantity[1:T, 1:I] >= 0.0);\n", " @variable(model, costs[1:T]);\n", " @variable(model, total_cost);\n", " @variable(model, gross_surplus[1:T]);\n", " @variable(model, 0.0 <= gas_gw <= 100.0);\n", " @variable(model, 0.0 <= wind_gw <= 100.0);\n", " @variable(model, 0.0 <= solar_gw <= 100.0);\n", "\n", " # Maximize welfare including imports costs\n", " @NLobjective(model, Max, sum(data.weights[t] * gross_surplus[t] for t=1:T) - total_cost);\n", "\n", " # Market clearing\n", " @constraint(model, [t=1:T], \n", " demand[t] == data.a[t] - data.b[t] * (alpha*tariff + (1.0-alpha)*price[t]));\n", " @constraint(model, [t=1:T], \n", " imports[t] == data.am[t] + data.bm[t] * price[t]);\n", " @constraint(model, [t=1:T], \n", " demand[t] == sum(quantity[t,i] for i=1:I) + imports[t]);\n", "\n", " # # Alternative forumlation with imports as demand\n", " # # Define surplus\n", " # data.ahat = data.a - alpha * data.b * tariff - data.am;\n", " # data.bhat = (1.0-alpha)*data.b + data.bm; \n", " # @constraint(model, [t=1:T], gross_surplus[t]==\n", " # # demand after accounting for imports and insensitive consumers\n", " # (price[t] * (data.ahat[t] - data.bhat[t]*price[t]) + (data.ahat[t] - data.bhat[t]*price[t])^2/(2*data.bhat[t])));\n", "\n", " # # Define costs\n", " # @NLconstraint(model, [t=1:T], costs[t] ==\n", " # sum(tech.c[i] * quantity[t,i] +\n", " # tech.c2[i] * quantity[t,i]^2/2 +\n", " # tax * tech.e[i] * quantity[t,i] -\n", " # subsidy * tech.renewable[i] * quantity[t,i] for i=1:I));\n", "\n", " # Define surplus\n", " @constraint(model, [t=1:T], gross_surplus[t]==\n", " # insenstive consumers\n", " alpha * (tariff * (data.a[t] - data.b[t]*tariff) \n", " + (data.a[t] - data.b[t]*tariff)^2/(2*data.b[t])) \n", " # sensitive consumers\n", " + (1.0-alpha)*(price[t] * (data.a[t] - data.b[t]*price[t]) \n", " + (data.a[t] - data.b[t]*price[t])^2/(2*data.b[t])));\n", "\n", " # Define costs\n", " @NLconstraint(model, [t=1:T], costs[t] ==\n", " sum(tech.c[i] * quantity[t,i] +\n", " tech.c2[i] * quantity[t,i]^2/2 +\n", " tax * tech.e[i] * quantity[t,i] -\n", " subsidy * tech.renewable[i] * quantity[t,i] for i=1:I) +\n", " (imports[t] - data.am[t])^2/(2 * data.bm[t]));\n", " @NLconstraint(model, total_cost == sum(data.weights[t] * costs[t] for t=1:T) + \n", " tech.F[5]*gas_gw + tech.F[6]*wind_gw + tech.F[7]*solar_gw);\n", "\n", " # Constraints on output\n", " @constraint(model, [t=1:T], \n", " quantity[t,1] <= data.hydronuc[t]);\n", " @constraint(model, [t=1:T,i=2:4], \n", " quantity[t,i] <= tech[i,\"capUB\"]);\n", " @constraint(model, [t=1:T], \n", " quantity[t,5] <= gas_gw);\n", " @constraint(model, [t=1:T], \n", " quantity[t,6] <= wind_gw * data.wind_cap[t]);\n", " @constraint(model, [t=1:T], \n", " quantity[t,7] <= solar_gw * data.solar_cap[t]);\n", " \n", " # Solve model\n", " optimize!(model);\n", "\n", " status = @sprintf(\"%s\", JuMP.termination_status(model));\n", "\n", " if (status==\"LOCALLY_SOLVED\")\n", " p = JuMP.value.(price);\n", " d = JuMP.value.(demand);\n", " d_insen = (data.a .- data.b.*tariff);\n", " d_sen = (data.a .- data.b.*p);\n", " avg_price = sum(p.*d.*data.weights)/sum(d.*data.weights);\n", " avg_price_insen = sum(p.*d_insen.*data.weights)/sum(d_insen.*data.weights);\n", " avg_price_sen = sum(p.*d_sen.*data.weights)/sum(d_sen.*data.weights);\n", " imp = JuMP.value.(imports);\n", " q = JuMP.value.(quantity);\n", " cost = JuMP.value.(costs);\n", " results = Dict(\"status\" => @sprintf(\"%s\",JuMP.termination_status(model)),\n", " \"avg_price\" => avg_price,\n", " \"avg_price_insen\" => avg_price_insen,\n", " \"avg_price_sen\" => avg_price_sen,\n", " \"price\" => p,\n", " \"quantity\" => q,\n", " \"imports\" => imp,\n", " \"demand\" => d,\n", " \"cost\" => cost,\n", " \"total_cost\" => JuMP.value.(total_cost),\n", " \"gas_gw\" => JuMP.value.(gas_gw),\n", " \"wind_gw\" => JuMP.value.(wind_gw),\n", " \"solar_gw\" => JuMP.value.(solar_gw),\n", " \"welfare\" => objective_value(model));\n", " return results\n", " else\n", " results = Dict(\"status\" => @sprintf(\"%s\",JuMP.termination_status(model)));\n", " @printf(\"Solving error!\")\n", " return results\n", " end\n", "\n", "end" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "We will set the initial tariff to $35/MWh." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Dict{String, Any} with 14 entries:\n", " \"avg_price\" => 41.9207\n", " \"price\" => [46.7349, 30.888, 29.3978, 42.8286, 30.205, 30.1481, 30.…\n", " \"gas_gw\" => 4.44261\n", " \"status\" => \"LOCALLY_SOLVED\"\n", " \"quantity\" => [9.46003 11.5 … 3.34339e-8 2.58524e-9; 4.0713 11.301 … 2…\n", " \"solar_gw\" => -9.91207e-9\n", " \"imports\" => [9.01364, 7.83199, 8.18451, 7.17327, 5.81939, 7.30439, 8…\n", " \"avg_price_sen\" => 22.3446\n", " \"demand\" => [41.0176, 27.647, 26.6268, 29.9942, 22.5644, 24.0404, 25…\n", " \"welfare\" => 17549.3\n", " \"avg_price_insen\" => 41.9207\n", " \"cost\" => [884.952, 516.766, 422.583, 669.815, 437.525, 447.523, 4…\n", " \"total_cost\" => 5154.77\n", " \"wind_gw\" => 7.69907e-8" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "results1 = clear_market_invest_tariff(dfclust, tech, tariff=35.0, alpha=1.0)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Notice that average weighted prices are higher than the tariff we charged consumers, we need to charge them more or otherwise, we would not be able to pay the producers of energy." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "Dict{String, Any} with 14 entries:\n", " \"avg_price\" => 49.3583\n", " \"price\" => [46.5458, 30.6732, 29.111, 41.8348, 30.3265, 29.6282, 29…\n", " \"gas_gw\" => 1.43484\n", " \"status\" => \"LOCALLY_SOLVED\"\n", " \"quantity\" => [9.46003 11.5 … 1.24713e-8 2.62222e-9; 4.0713 10.723 … 1…\n", " \"solar_gw\" => -9.9109e-9\n", " \"imports\" => [9.0036, 7.81694, 8.16211, 7.11544, 5.82542, 7.26339, 8.…\n", " \"avg_price_sen\" => 7.23437\n", " \"demand\" => [37.8346, 24.0461, 22.8249, 26.0606, 19.8897, 19.5926, 2…\n", " \"welfare\" => 16590.6\n", " \"avg_price_insen\" => 49.3583\n", " \"cost\" => [797.376, 419.104, 319.944, 551.221, 368.199, 325.079, 3…\n", " \"total_cost\" => 4627.42\n", " \"wind_gw\" => 1.09296e-8" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "results2 = clear_market_invest_tariff(dfclust, tech, tariff=50.0, alpha=1.0)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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4uLi4rZt2yaEqKqq2rNnT5fZH9pIwwt12uzdd99NSEgIDw/v1atXQkLC+vXr1fb7779/2LBh6enp4eHhWVlZauM///nPiIiIe+65Z9y4cUlJSeph08W88sorffr0mTNnTnR0dEZGhtbleN3vf//7hISEbt26DRw4MCEhQb0IsLa29sYbb5wwYcJdd93Vu3fvkydPqnfOzKW0WCoAAAIFSURBVMwMDw9PT08fMmTI7373O00L96QjR44IIWJjYxP+4x//+IeiKHa7ffLkyaNGjXrggQfCwsIKCgrU++fm5oaFhc2aNevGG29MSUlxOp2alu8xW7duHTRo0N133z1z5szQ0NAnnnhCba+urh4+fPikSZPuvPPOqKgo9ZJaRVH++te/RkREpKenDxo06LHHHtOucC+aMWOG66rR+vr6xMTEcePG3XPPPZGRkcePH1fbP/vsM/W4GDZs2KxZs7QrtkPolP99ori4+MprXvr06aNeJqAoyoEDB86dO3fTTTep7wpVly5d2rt3b3Bw8KRJk7rq92dff/11UVHR9ddff8MNN2hdi9d9//331dXVrpuDBw9WPxi0WCz79u2rra2dPHnylSdJZ86cOXToUN++fceOHatBud5RV1d31QUvrnFwOBw5OTmXLl2aMGGC61fVQoji4uL8/PzIyMiJEyd2pVkXCgsLT5w4YTQar7/++ri4OFd7Q0PD3r17zWbz5MmTQ0JCXO2nT5/+6quv+vfvP2bMGC3q9boffvihe/furk1vtVr37dtXXV2dnJysXl6uOnv2bEFBQZ8+fcaNG3flhaYS6pRBCACAp3Sdd4UAALQBQQgAkBpBCACQGkEIAJAaQQgAkBpBCACQGkEIAJAaQQgAkBpBCACQGkEIAJAaQQgAkNr/B3Sk+OS33GklAAAAAElFTkSuQmCC", "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "histogram(results1[\"price\"])" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "We can see the right tariff is between \\\\$35 and \\\\$50/MWh." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Solving for the fixed point\n", "We can solve for the fixed point in a loop." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "47.94013355615169" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "let\n", " current_diff = 1.0;\n", " guess = 47.0;\n", " while (current_diff > 1e-2)\n", " res = clear_market_invest_tariff(dfclust, tech, tariff=guess);\n", " newguess = res[\"avg_price_insen\"];\n", " current_diff = (guess-newguess).^2;\n", " guess = newguess;\n", " end\n", " guess\n", "end" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Note: It is best to convert this into a function so that now we can compare alternative solutions." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "clear_market_equilibrium (generic function with 1 method)" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "function clear_market_equilibrium(data::DataFrame, tech::DataFrame; \n", " tariff=35.0, alpha=1.0, tax=0.0, subsidy=0.0, ng_price = 4.0, elas = 0.1)\n", " \n", " current_diff = 1.0;\n", " guess = tariff;\n", " while (current_diff > 1e-3)\n", " res = clear_market_invest_tariff(dfclust, tech, tariff=guess, alpha=alpha,\n", " tax=tax, subsidy=subsidy, ng_price=ng_price, elas=elas);\n", " newguess = res[\"avg_price_insen\"];\n", " current_diff = (guess-newguess).^2;\n", " guess = 0.5*newguess + 0.5*guess;\n", " end\n", " \n", " # we solve at the equilibrium guess and save tariff\n", " res = clear_market_invest_tariff(dfclust, tech, tariff=guess, alpha=alpha,\n", " tax=tax, subsidy=subsidy, ng_price=ng_price);\n", " res[\"tariff\"] = guess;\n", " \n", " return res\n", " \n", "end" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Dict{String, Any} with 15 entries:\n", " \"avg_price\" => 36.3463\n", " \"price\" => [45.5722, 37.1894, 30.2535, 42.0858, 30.8975, 31.254, 30…\n", " \"gas_gw\" => 3.27641\n", " \"status\" => \"LOCALLY_SOLVED\"\n", " \"quantity\" => [9.46003 11.5 … 4.50417e-8 2.56083e-9; 4.0713 11.5 … 3.8…\n", " \"solar_gw\" => -9.92085e-9\n", " \"tariff\" => 36.7052\n", " \"imports\" => [8.95188, 8.27364, 8.25133, 7.13004, 5.85378, 7.39157, 8…\n", " \"avg_price_sen\" => 36.3463\n", " \"demand\" => [38.7742, 27.1214, 27.8299, 28.136, 23.296, 25.1512, 26.…\n", " \"welfare\" => 18138.6\n", " \"avg_price_insen\" => 38.0774\n", " \"cost\" => [804.448, 507.164, 462.461, 609.649, 464.716, 486.321, 4…\n", " \"total_cost\" => 4724.62\n", " \"wind_gw\" => 1.13637e-7" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "res_sen = clear_market_equilibrium(dfclust, tech, alpha=0.0, tariff=43.0, elas=0.1)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "Dict{String, Any} with 15 entries:\n", " \"avg_price\" => 42.6267\n", " \"price\" => [46.71, 30.8602, 29.3608, 42.7005, 30.2204, 30.0812, 30.…\n", " \"gas_gw\" => 4.05734\n", " \"status\" => \"LOCALLY_SOLVED\"\n", " \"quantity\" => [9.46003 11.5 … 2.96888e-8 2.58588e-9; 4.0713 11.2264 … …\n", " \"solar_gw\" => -9.91152e-9\n", " \"tariff\" => 36.9241\n", " \"imports\" => [9.01232, 7.83005, 8.18162, 7.16581, 5.82015, 7.29911, 8…\n", " \"avg_price_sen\" => 20.7045\n", " \"demand\" => [40.6093, 27.1851, 26.1391, 29.4896, 22.2213, 23.4699, 2…\n", " \"welfare\" => 32585.7\n", " \"avg_price_insen\" => 42.6267\n", " \"cost\" => [815.749, 470.855, 375.745, 601.488, 405.953, 396.103, 4…\n", " \"total_cost\" => 4322.53\n", " \"wind_gw\" => 6.51929e-8" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "res_insen = clear_market_equilibrium(dfclust, tech, alpha=1.0, tariff=43.0, elas=0.1)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "histogram(res_sen[\"price\"], weights=dfclust.weights)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Does it help to have attentive consumers?\n", "\n", "We visualize the impact of the policy.\n", "\n", "We can plot the costs (or prices) of electricity for several values of alpha. This can take a while to compute." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "begin\n", " \n", " share_alpha = collect(0.1:0.2:0.9);\n", " tax = collect(0.0:15.0:30.0);\n", " \n", " dataPolicy = DataFrame(alpha=Float64[], tax=Float64[], tariff=Float64[], wind_gw=Float64[], solar_gw=Float64[]);\n", " \n", " for a in share_alpha\n", " for t in tax\n", " res = clear_market_equilibrium(dfclust, tech, \n", " tariff=40.0, alpha=a, tax=t, elas=0.1);\n", " push!(dataPolicy, [a, t, res[\"tariff\"], res[\"wind_gw\"], res[\"solar_gw\"]]);\n", " end\n", " end\n", " \n", "end" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "

15 rows × 5 columns

alphataxtariffwind_gwsolar_gw
Float64Float64Float64Float64Float64
10.10.036.71979.71004e-8-9.92054e-9
20.115.039.011718.2435-9.90921e-9
30.130.040.95624.3233-9.96835e-9
40.30.036.75017.96077e-8-9.91989e-9
50.315.039.103717.7348-9.97e-9
60.330.041.048323.2496-9.9023e-9
70.50.036.78197.90818e-8-9.92014e-9
80.515.039.196617.0416-9.90907e-9
90.530.041.183421.9431-9.89743e-9
100.70.036.8218.2906e-8-9.91776e-9
110.715.039.322416.5239-9.90711e-9
120.730.041.377220.5208-9.89108e-9
130.90.036.87268.59851e-8-9.91396e-9
140.915.039.458215.6445-9.90379e-9
150.930.041.642319.352-9.87847e-9
" ], "text/latex": [ "\\begin{tabular}{r|ccccc}\n", "\t& alpha & tax & tariff & wind\\_gw & solar\\_gw\\\\\n", "\t\\hline\n", "\t& Float64 & Float64 & Float64 & Float64 & Float64\\\\\n", "\t\\hline\n", "\t1 & 0.1 & 0.0 & 36.7197 & 9.71004e-8 & -9.92054e-9 \\\\\n", "\t2 & 0.1 & 15.0 & 39.0117 & 18.2435 & -9.90921e-9 \\\\\n", "\t3 & 0.1 & 30.0 & 40.956 & 24.3233 & -9.96835e-9 \\\\\n", "\t4 & 0.3 & 0.0 & 36.7501 & 7.96077e-8 & -9.91989e-9 \\\\\n", "\t5 & 0.3 & 15.0 & 39.1037 & 17.7348 & -9.97e-9 \\\\\n", "\t6 & 0.3 & 30.0 & 41.0483 & 23.2496 & -9.9023e-9 \\\\\n", "\t7 & 0.5 & 0.0 & 36.7819 & 7.90818e-8 & -9.92014e-9 \\\\\n", "\t8 & 0.5 & 15.0 & 39.1966 & 17.0416 & -9.90907e-9 \\\\\n", "\t9 & 0.5 & 30.0 & 41.1834 & 21.9431 & -9.89743e-9 \\\\\n", "\t10 & 0.7 & 0.0 & 36.821 & 8.2906e-8 & -9.91776e-9 \\\\\n", "\t11 & 0.7 & 15.0 & 39.3224 & 16.5239 & -9.90711e-9 \\\\\n", "\t12 & 0.7 & 30.0 & 41.3772 & 20.5208 & -9.89108e-9 \\\\\n", "\t13 & 0.9 & 0.0 & 36.8726 & 8.59851e-8 & -9.91396e-9 \\\\\n", "\t14 & 0.9 & 15.0 & 39.4582 & 15.6445 & -9.90379e-9 \\\\\n", "\t15 & 0.9 & 30.0 & 41.6423 & 19.352 & -9.87847e-9 \\\\\n", "\\end{tabular}\n" ], "text/plain": [ "\u001b[1m15×5 DataFrame\u001b[0m\n", "\u001b[1m Row \u001b[0m│\u001b[1m alpha \u001b[0m\u001b[1m tax \u001b[0m\u001b[1m tariff \u001b[0m\u001b[1m wind_gw \u001b[0m\u001b[1m solar_gw \u001b[0m\n", "\u001b[1m \u001b[0m│\u001b[90m Float64 \u001b[0m\u001b[90m Float64 \u001b[0m\u001b[90m Float64 \u001b[0m\u001b[90m Float64 \u001b[0m\u001b[90m Float64 \u001b[0m\n", "─────┼─────────────────────────────────────────────────────\n", " 1 │ 0.1 0.0 36.7197 9.71004e-8 -9.92054e-9\n", " 2 │ 0.1 15.0 39.0117 18.2435 -9.90921e-9\n", " 3 │ 0.1 30.0 40.956 24.3233 -9.96835e-9\n", " 4 │ 0.3 0.0 36.7501 7.96077e-8 -9.91989e-9\n", " 5 │ 0.3 15.0 39.1037 17.7348 -9.97e-9\n", " 6 │ 0.3 30.0 41.0483 23.2496 -9.9023e-9\n", " 7 │ 0.5 0.0 36.7819 7.90818e-8 -9.92014e-9\n", " 8 │ 0.5 15.0 39.1966 17.0416 -9.90907e-9\n", " 9 │ 0.5 30.0 41.1834 21.9431 -9.89743e-9\n", " 10 │ 0.7 0.0 36.821 8.2906e-8 -9.91776e-9\n", " 11 │ 0.7 15.0 39.3224 16.5239 -9.90711e-9\n", " 12 │ 0.7 30.0 41.3772 20.5208 -9.89108e-9\n", " 13 │ 0.9 0.0 36.8726 8.59851e-8 -9.91396e-9\n", " 14 │ 0.9 15.0 39.4582 15.6445 -9.90379e-9\n", " 15 │ 0.9 30.0 41.6423 19.352 -9.87847e-9" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dataPolicy" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "let\n", " \n", " tax1 = dataPolicy[dataPolicy.tax.==15.0,:]\n", " tax2 = dataPolicy[dataPolicy.tax.==30.0,:]\n", " \n", " plot(tax1.alpha, tax1.wind_gw, legend = false)\n", " plot!(tax2.alpha, tax2.wind_gw, legend = false)\n", " plot!(xlab=\"Share insensitive consumers\",ylab=\"Wind investment (GW))\")\n", " \n", "end" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Follow-up exercises\n", "\n", "1. What take aways do you get from the above visualization?\n", "\n", "2. Consider an energy savings technology. How could it be added to the model? What would be the challenges in calibrating it?" ] } ], "metadata": { "kernelspec": { "display_name": "Julia 1.8.5", "language": "julia", "name": "julia-1.8" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.8.5" } }, "nbformat": 4, "nbformat_minor": 2 }