general-equilibrium-model-builder について
general-equilibrium-model-builderは、ワルラス型一般均衡モデルを構築・解法する経済学者向けスキルです。純粋交換経済を対象に、理論、Juliaによる数値計算、エッジワース・ボックスの可視化を扱います。
主な機能
- 01純粋交換経済の定式化
- 02均衡と厚生定理の解説
- 03均衡計算用Juliaコードの生成
- 04価格正規化と超過需要の求解
- 05エッジワース・ボックスによる配分の可視化
活用シーン
- 01経済モデルの均衡条件を導出
- 02均衡価格と配分を計算
- 03厚生とパレート効率を分析
- 04比較静学でパラメーター変化を調査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ meleantonio/ awesome-econ-ai-stuff --skill general-equilibrium-model-builderインストール後、Claude Code で/general-equilibrium-model-builderを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
index.mdexamples/comparative_statics.jlpure_exchange_2x2.jl詳細
一般均衡モデルビルダー
目的
このスキルは、経済学者が**ワルラス的一般均衡(GE)**モデルを構築、分析し、数値的に解くのを支援します。均衡価格と配分を求めるための、理論的基礎(存在、一意性、厚生定理)とJuliaによる計算実装の両方を扱います。
現在の対象範囲:生産のない純粋交換経済です。今後のバージョンでは、生産経済、不確実性を伴うアロー=ドブリュー経済、動学モデルに対応する予定です。
使用する場面
- 理論の構築:論文向けに純粋交換の一般均衡モデルを定式化する場合
- 教育:ミクロ経済学の理論講義向けに例を作成する場合
- 計算:均衡価格と配分を数値的に求める場合
- 厚生分析:パレート効率性と社会厚生を評価する場合
- 比較静学:パラメーターによる均衡の変化を分析する場合
手順
ステップ 1:経済環境を把握する
モデルを生成する前に、ユーザーに以下を尋ねます。
- 財の数($L$):経済にはいくつの財がありますか?
- 消費者の数($I$):エージェントは何人いますか?
- 選好:どのような効用関数ですか?(コブ=ダグラス、CES、レオンチェフ、準線形)
- 初期保有:各エージェントの初期保有ベクトルはどのようなものですか?
- 出力形式:理論の導出、Juliaコード、または両方のどれを希望しますか?
ステップ 2:理論的枠組みを設定する
純粋交換経済 $\mathcal{E}$ は、次のように特徴づけられます。
$$\mathcal{E} = \left{ (u^i, \omega^i)_{i=1}^{I} \right}$$
ここで:
- $u^i: \mathbb{R}^L_+ \to \mathbb{R}$ は消費者 $i$ の効用関数です
- $\omega^i \in \mathbb{R}^L_+$ は消費者 $i$ の初期保有ベクトルです
- $L$ は財の数です
- $I$ は消費者の数です
消費者の問題:価格 $p \in \mathbb{R}^L_{++}$ が与えられたとき、消費者 $i$ は次の問題を解きます。
$$\max_{x^i \in \mathbb{R}^L_+} u^i(x^i) \quad \text{s.t.} \quad p \cdot x^i \leq p \cdot \omega^i$$
この解から、マーシャル需要 $x^i(p, p \cdot \omega^i)$ が得られます。
ステップ 3:ワルラス均衡を定義する
定義(ワルラス均衡):配分 $(x^{*1}, \ldots, x^{I})$ と価格ベクトル $p^ \in \mathbb{R}^L_{++}$ が、以下を満たすとき、ワルラス均衡を構成します。
- 効用最大化:各 $i$ について、$x^{i}$ は価格 $p^$ のもとで消費者 $i$ の問題を解きます
- 市場清算:$\sum_{i=1}^{I} x^{*i} = \sum_{i=1}^{I} \omega^i$
同じことを、超過需要関数 $z(p) = \sum_{i=1}^{I} [x^i(p) - \omega^i]$ を用いて表すと、$z(p^*) = 0$ となります。
ステップ 4:主要な理論的結果を示す
必要に応じて、以下の定理を含めます。
定理(ワルラスの法則):任意の価格ベクトル $p$ について: $$p \cdot z(p) = 0$$
解釈:超過需要の価値は常にゼロです(予算制約は等号で成立します)。
定理(厚生経済学の第一基本定理):すべてのワルラス均衡配分はパレート効率的です。
定理(厚生経済学の第二基本定理):凸性の仮定のもとでは、任意のパレート効率的配分を、適切な一括移転によってワルラス均衡として実現できます。
定理(存在:Debreu、1959年):標準的な仮定(選好の連続性、狭義凸性、狭義単調性、厳密に正の初期保有)のもとで、ワルラス均衡が存在します。
ステップ 5:計算用のJuliaコードを生成する
次の構成でJuliaを使用します。
# ============================================
# General Equilibrium Solver in Julia
# Pure Exchange Economy
# ============================================
using LinearAlgebra
using NLsolve
using Plots
# Define the economy structure
struct PureExchangeEconomy
n_goods::Int # Number of goods (L)
n_consumers::Int # Number of consumers (I)
endowments::Matrix{Float64} # I × L matrix of endowments
utility_params::Vector{Any} # Parameters for utility functions
utility_type::Symbol # :cobb_douglas, :ces, :leontief
end
# Cobb-Douglas utility: u(x) = ∏ x_l^α_l
function utility_cobb_douglas(x, α)
return prod(x .^ α)
end
# Marshallian demand for Cobb-Douglas preferences
function demand_cobb_douglas(p, wealth, α)
# x_l = (α_l / sum(α)) * (wealth / p_l)
α_normalized = α / sum(α)
return α_normalized .* wealth ./ p
end
# Excess demand function
function excess_demand(p, economy::PureExchangeEconomy)
z = zeros(economy.n_goods)
for i in 1:economy.n_consumers
ω_i = economy.endowments[i, :]
wealth_i = dot(p, ω_i)
if economy.utility_type == :cobb_douglas
α_i = economy.utility_params[i]
x_i = demand_cobb_douglas(p, wealth_i, α_i)
else
error("Unsupported utility_type: $(economy.utility_type). Only :cobb_douglas is currently implemented.")
end
z += x_i - ω_i
end
return z
end
# Solve for equilibrium prices (normalize p_1 = 1)
# Uses log-price parameterization to ensure prices remain strictly positive
function solve_equilibrium(economy::PureExchangeEconomy)
# Initial guess in log-space (log of ones = zeros)
p0 = zeros(economy.n_goods - 1)
# Excess demand for goods 2 to L (Walras' Law implies good 1 clears)
# Reparameterize using log-prices: x = log(p_rest), so p_rest = exp(x)
function excess_demand_reduced!(F, x)
p_rest = exp.(x) # Exponentiate to get positive prices
p = vcat(1.0, p_rest) # Numeraire p_1 = 1
z = excess_demand(p, economy)
F .= z[2:end]
end
# Solve z(p) = 0 in log-space
result = nlsolve(excess_demand_reduced!, p0, autodiff=:forward)
if converged(result)
p_rest_star = exp.(result.zero) # Convert back from log-space
p_star = vcat(1.0, p_rest_star)
return p_star
else
error("Equilibrium solver did not converge")
end
end
# Compute equilibrium allocations
function equilibrium_allocations(p_star, economy::PureExchangeEconomy)
allocations = zeros(economy.n_consumers, economy.n_goods)
for i in 1:economy.n_consumers
ω_i = economy.endowments[i, :]
wealth_i = dot(p_star, ω_i)
if economy.utility_type == :cobb_douglas
α_i = economy.utility_params[i]
allocations[i, :] = demand_cobb_douglas(p_star, wealth_i, α_i)
else
throw(ArgumentError("Unsupported utility_type: $(economy.utility_type) in equilibrium_allocations. Only :cobb_douglas is currently implemented."))
end
end
return allocations
end
# Check Pareto efficiency via MRS equality
function check_pareto_efficiency(allocations, economy::PureExchangeEconomy)
# Currently only supports 2-good economies
if economy.n_goods != 2
throw(ArgumentError("check_pareto_efficiency currently only supports 2-good economies. Got economy.n_goods = $(economy.n_goods)."))
end
if economy.utility_type == :cobb_douglas
# MRS_{12} = (α_1/α_2) * (x_2/x_1) should be equal for all consumers
epsilon = 1e-12 # Small threshold for near-zero detection
mrs_values = []
for i in 1:economy.n_consumers
α_i = economy.utility_params[i]
x_i = allocations[i, :]
# Guard against division by zero: check both x_i[1] and α_i[2]
if abs(x_i[1]) < epsilon || abs(α_i[2]) < epsilon
# Handle corner case: set sentinel value for zero/near-zero consumption
push!(mrs_values, Inf)
else
mrs_i = (α_i[1] / α_i[2]) * (x_i[2] / x_i[1])
push!(mrs_values, mrs_i)
end
end
return mrs_values
else
throw(ArgumentError("Unsupported utility type: $(economy.utility_type) in check_pareto_efficiency. Only :cobb_douglas is currently implemented."))
end
end
ステップ 6:完全な例を示す
# ============================================
# Example: 2×2 Pure Exchange Economy
# ============================================
# Two consumers, two goods
# Consumer 1: u(x,y) = x^0.6 * y^0.4, endowment (4, 1)
# Consumer 2: u(x,y) = x^0.3 * y^0.7, endowment (1, 4)
economy = PureExchangeEconomy(
2, # 2 goods
2, # 2 consumers
[4.0 1.0; 1.0 4.0], # Endowment matrix
[[0.6, 0.4], [0.3, 0.7]], # Cobb-Douglas parameters
:cobb_douglas
)
# Solve for equilibrium
p_star = solve_equilibrium(economy)
println("Equilibrium prices: p = ", p_star)
# Compute allocations
x_star = equilibrium_allocations(p_star, economy)
println("Consumer 1 allocation: ", x_star[1, :])
println("Consumer 2 allocation: ", x_star[2, :])
# Verify market clearing
total_endowment = sum(economy.endowments, dims=1)
total_allocation = sum(x_star, dims=1)
println("Market clearing check: ", isapprox(total_endowment, total_allocation))
# Check Pareto efficiency (MRS equality)
mrs = check_pareto_efficiency(x_star, economy)
println("MRS values (should be equal): ", mrs)
ステップ 7:エッジワース・ボックスで可視化する
# ============================================
# Edgeworth Box Visualization
# ============================================
function plot_edgeworth_box(economy::PureExchangeEconomy, p_star, x_star)
# Total endowment defines box dimensions
ω_total = vec(sum(economy.endowments, dims=1))
# Create plot
plt = plot(
xlim=(0, ω_total[1]),
ylim=(0, ω_total[2]),
xlabel="Good 1",
ylabel="Good 2",
title="Edgeworth Box",
legend=:topright,
aspect_ratio=:equal
)
# Plot endowment point
ω1 = economy.endowments[1, :]
scatter!([ω1[1]], [ω1[2]], label="Endowment", markersize=8, color=:red)
# Plot equilibrium allocation
scatter!([x_star[1, 1]], [x_star[1, 2]], label="Equilibrium", markersize=8, color=:green)
# Plot budget line through endowment
# p_1 * x_1 + p_2 * x_2 = p_1 * ω_1 + p_2 * ω_2
wealth1 = dot(p_star, ω1)
x1_range = range(0, ω_total[1], length=100)
x2_budget = (wealth1 .- p_star[1] .* x1_range) ./ p_star[2]
plot!(x1_range, x2_budget, label="Budget line", color=:blue, linewidth=2)
# Plot contract curve (locus of Pareto efficient allocations)
# For Cobb-Douglas, contract curve: x_2^1 / x_1^1 = (α_2^1/α_1^1) / (α_2^2/α_1^2) * (ω_2 - x_2^1) / (ω_1 - x_1^1)
return plt
end
# Generate the plot
plt = plot_edgeworth_box(economy, p_star, x_star)
savefig(plt, "edgeworth_box.png")
プロンプトの例
ユーザーは、次のようなプロンプトでこのスキルを呼び出すことができます。
- 「CES選好を持つ、財が2つ、消費者が3人の純粋交換経済を設定してください」
- 「コブ=ダグラス経済のワルラス均衡条件を導出してください」
- 「私の交換経済の均衡価格を求めるJuliaコードを書いてください」
- 「純粋交換経済について、厚生経済学の第一基本定理を証明してください」
- 「契約曲線と均衡を示すエッジワース・ボックスをプロットしてください」
- 「比較静学を計算してください。初期保有が変化すると、均衡はどのように変わりますか?」
要件
ソフトウェア
- Julia 1.9+
パッケージ
using Pkg
Pkg.add(["NLsolve", "LinearAlgebra", "Plots", "ForwardDiff"])
| パッケージ | 目的 |
|---|---|
NLsolve | 超過需要 = 0 を解く非線形方程式ソルバー |
LinearAlgebra | ベクトル/行列演算 |
Plots | 可視化(エッジワース・ボックスなど) |
ForwardDiff | ヤコビアンの自動微分 |
数学的背景
存在を保証する仮定
均衡の存在を保証する標準的な仮定:
- 連続性:各 $u^i$ は連続です
- 強単調性:$x \gg y \Rightarrow u^i(x) > u^i(y)$
- 狭義凸性:$u^i$ は狭義準凹です
- 正の初期保有量:すべての $i$ について $\omega^i \gg 0$
超過需要の性質
標準的な仮定の下で、$z(p)$ は次の性質を満たします:
- 連続性:$z$ は連続です
- 0 次同次性:すべての $\lambda > 0$ について $z(\lambda p) = z(p)$
- ワルラスの法則:$p \cdot z(p) = 0$
- 境界での挙動:$p_l \to 0$ のとき、$z_l(p) \to +\infty$
数値解法の方針
- 価格を正規化する:$p_1 = 1$(ニュメレール)とします
- 次元を削減する:$z_2(p) = \cdots = z_L(p) = 0$ を解きます(ワルラスの法則により $z_1 = 0$ となります)
- ニュートン法を使用する:ヤコビアンの自動微分を使って
NLsolve.jlを実行します - 境界に対処する:反復中は $p_l > 0$ を保ちます
ベストプラクティス
- 解を求めた後は必ず市場清算を検証してください
- ワルラスの法則が数値的に成り立つことを確認してください($p \cdot z \approx 0$)
- 消費者間の MRS の等価性を確認して、パレート効率性を検証してください
- ソルバーが収束しない場合は、複数の初期推定値を使用してください
- 価格を正規化して、不定性を避けてください(0 次同次性)
よくある落とし穴
- ❌ 価格はスカラー倍までしか定まらないことを忘れる(正規化が必要です)
- ❌ 隅点解(ある財の消費がゼロになる解)を確認しない
- ❌ 境界付近での数値精度の問題を無視する
- ❌ 検証せずに一意性を仮定する(複数の均衡が存在する可能性があります)
- ❌ マーシャル需要(非補償需要)とヒックス需要(補償需要)を混同する
拡張(今後のバージョン)
- 生産経済:利潤最大化を行う企業
- アロー=ドブリュー証券:条件付き請求権と不確実性
- 世代重複(OLG):世代が重複する動学的一般均衡
- 計算可能な一般均衡(CGE):政策分析向けの較正済みモデル
- 不完備市場:すべての不確実な事象について取引できない場合
参考文献
教科書
- Mas-Colell, Whinston, and Green (1995). Microeconomic Theory. Oxford University Press. 第15~17章。
- Debreu, G. (1959). Theory of Value. Yale University Press.
- Varian, H. (1992). Microeconomic Analysis. 第3版。第17~18章。
計算リソース
- QuantEcon の Julia 講義:https://julia.quantecon.org/
- Judd, K. (1998). Numerical Methods in Economics. MIT Press.
主要論文
- Arrow, K. J., & Debreu, G. (1954). 競争経済における均衡の存在。Econometrica, 22(3), 265-290.
- Scarf, H. (1967). 連続写像の不動点の近似。SIAM Journal on Applied Mathematics, 15(5), 1328-1343.
変更履歴
v1.0.0
- 初回リリース:コブ=ダグラス型選好を持つ純粋交換経済
- NLsolve を使用した Julia 実装
- エッジワース・ボックスの可視化
- 理論的枠組みと厚生定理