190 likes | 400 Views
一般均衡モデルと 不動点アルゴリズム. 2003.12.30. 関東学園大学 犬童健良. ( M 消費者、 N 産業)の場合. 消費者の効用最大化 効用関数 U (・)は厳密擬凸かつ微分可能とすると、解(需要関数)は価格に対し 0 次同次となる。 生産者の費用最小化 一次同時の生産関数 Q から導かれる要素需要は要素価格に対し 0 次同次となる。. 均衡の条件. 均衡の定義:全財・要素の超過需要関数が 0 以下となる価格ベクトル。 利潤0条件(相補スラックネス条件):産出量が正のとき、利潤は 0 である。 Walras 法則:均衡条件のラグランジアンが非正。.
E N D
一般均衡モデルと不動点アルゴリズム 2003.12.30. 関東学園大学 犬童健良
(M消費者、N産業)の場合 • 消費者の効用最大化 • 効用関数U(・)は厳密擬凸かつ微分可能とすると、解(需要関数)は価格に対し0次同次となる。 • 生産者の費用最小化 • 一次同時の生産関数Qから導かれる要素需要は要素価格に対し0次同次となる。
均衡の条件 • 均衡の定義:全財・要素の超過需要関数が0以下となる価格ベクトル。 • 利潤0条件(相補スラックネス条件):産出量が正のとき、利潤は0である。 • Walras法則:均衡条件のラグランジアンが非正。
均衡の計算手順 • 計算に先立って、各財(企業)jについてその生産量Qjで生産要素LjとKjを除した新しい変数を作る。(解の次元を下げる工夫) • 利潤0条件(相補性条件)から、財価格を要素価格の関数として表す。 • 各個人の需要を求め、市場需要を集計する。 • 各財の市場需要に見合う生産量を求める。 • 各要素の派生需要を求め、その集計的超過需要を0と置いて連立方程式を解く。ただしWalras法則によりその合計は0である。
不動点アルゴリズム • 一般均衡やゲームの解、つまりナッシュ均衡の存在は、連続写像の不動点として証明されている(いわゆる存在定理)。 • しかし複雑なモデルでは手計算が事実上ムリであるので、具体的に均衡を求めるには、その不動点を近似する計算方法(アルゴリズム)が必要になる。 • 一般均衡モデルの文脈では、Scarf(1967,1973) の古典的アルゴリズムとそれを改良発展させたMerrill(1972)、Van der Laan & Talman(1979)などが知られる。 • これらの方法では隣接する分割単体を探索するため、三角形分割(Hansen-Kuhn-McKinnon)を利用する。 • 例えば、2生産要素KとLの価格ベクトル(r、w)を正規化した基本単体(r+w=1)を3角形分割し、超過需要がすべて0に十分近くなる頂点が見つかるまで分割単体間を移動する。
定義(単体) • 定義(m次元単体; simplex):一次独立な整数ベクトルbj j=1,…,m+1をの頂点とする凸包。すなわちS={X⊆Zm|X=∑ajbj, ∑aj=1,aj≧0}. • 定義(基本単体):各頂点bjがいずれも単位ベクトルのとき。 • 定義(辺単体):m-1次元単体S’の頂点がm次元単体Sの部分集合のとき。
bj+1 bj’ bj bj-1 3角形分割とピボッティング • 基点 • 頂点b1をn+1次元基本単体の中から選ぶ。 • 単体分割 • 各分割に属するn+1個の頂点を定める。 • ただしベクトルφは1からnまでの整数の順列とする。 • また各ejを次のように定義する。 • ピボッティング • 隣接する単体へ移動する。 • 取り除く頂点をbjとする。追加する頂点は図のようである。ただしbn+1はb1と隣接する。 • LemkeとHowsonの非巡回の議論が適用され、解への収束が保証される。
Scarfアルゴリズム • 格子数Dを選び3角形分割を施す。初期単体を選ぶ。 • 初期単体の全頂点をその規則(*)にしたがってラベル付けする。 • 複数の頂点に同じラベルがある場合、以下の手順4を行う。全ての頂点に異なるラベルが付いている場合は手順5に飛ぶ。 • ピボッティングしてからラベルを計算しなおし、手順3へ戻る。ただし初期単体のときは、基本単体の頂点を除去する。初期単体以外のときは、同じラベルをもつ頂点のうち、直前の手順で導入された頂点を残す。 • 完全にラベル付けされた単体から任意の点を選ぶ。超過需要ベクトルをすべて計算し、もし十分な近似であったならば停止する。さもなくば格子数Dを増やし、新たな初期単体を選んでから、手順2に戻る。 • (*) ラベル付け規則: • 基本単体の境界上の頂点に、最初に0となる座標の番号 i (又は識別記号)をつける。 • それ以外の頂点に、超過需要が正となる最初の財や要素の番号j(同上)をつける。
アルゴリズムの実行過程の例 • D=5、1次元基本単体1=r+wとする。 • 超過需要関数のグラフが下左の図のようであったとしよう。 • このとき、各頂点のラベルは下右の図のようである。 • また頂点(1/5,4/5) を基点とする単体からのピボッティングを図中に示した。((0,1)側から出発したとする。) • 移動先の単体では完全ラベル付け済みなので、均衡点の近似が得られた。精度がこれで十分なら、停止する。 w w k ρl ρk 1 k k l l l 0 r 1 r 0 1
Prologを用いた実装と実験 • まずPrologを用いてShoven and Whalleyのテキストに出ている2財2消費者モデルをモデリングし、テキストに示された均衡の数値例を検証する。 • 次に、同上モデルに対するScarfアルゴリズムを実装し、均衡を実際に近似してみよう。
Shoven&Whalleyの2×2市場経済 %均衡の数値例(Shoven & Whalleyより) price_of_product(firm(m),1.399). price_of_product(firm(s),1.093). price_of_capital(1.373). price_of_labor(1.000). • Prologプログラムgeq00.plとして作成。筆者のホームページで公開している。(http://www.us.kanto-gakuen.ac.jp/indo) • 図に実行結果とパラメータのモデル例を示す。テキストの数値と若干異なったが、均衡条件は十分満たされている。 consumer(r). %rich consumer(p). %poor firm(m). %maker firm(s). %sales market_share(firm(m),consumer(r),0.5). market_share(firm(s),consumer(r),0.5). market_share(firm(m),consumer(p),0.3). market_share(firm(s),consumer(p),0.7). demand_substitution_elasticity(consumer(r),1.5). demand_substitution_elasticity(consumer(p),0.75). endowment(consumer(r),capital,25). endowment(consumer(p),capital,0). endowment(consumer(r),labor,0). endowment(consumer(p),labor,60). scale_of_business(firm(m),1.5). scale_of_business(firm(s),2.0). inputs_weight(firm(m),0.6). inputs_weight(firm(s),0.7). supply_substitution_elasticity(firm(m),2.0). supply_substitution_elasticity(firm(s),0.5). ?- production(A,[K,L|B],C). A = firm(m) K = 6.21451 L = 26.3591 B = [1.5, 0.6, 2.0, 1.373, 1.0] C = [24.9405, 24.9405, 5.04871e-029, true] ; A = firm(s) K = 18.7894 L = 33.6307 B = [2.0, 0.7, 0.5, 1.373, 1.0] C = [54.3762, 54.3762, 5.04871e-029, true] ; No ?- utility(A,B,C). A = consumer(r) B = [11.5116, 16.6699] C = 27.8641 ; A = consumer(p) B = [13.4289, 37.7063] C = 50.8946 ; No ?- ?- [geq00]. % geq00 compiled 0.01 sec, 0 bytes Yes ?- total_expendenture_for(F,Q,V). F = firm(m) Q = quantity(24.9405=r:11.5116+p:13.4289) V = value(34.8918=r:16.1048+p:18.787) ; F = firm(s) Q = quantity(54.3762=r:16.6699+p:37.7063) V = value(59.4332=r:18.2202+p:41.213) ; No
プログラムについての説明 • 述語utility/3は消費者の効用最大化と商品需要、述語production/3は生産者の費用最小化する要素需要をそれぞれ計算する(ともにCES型関数) 。実行に先立って、前頁右上下図のようなモデルパラメータと均衡価格のデータを与える必要がある。 • total_expendenture_for/3は消費者の効用最大化の結果に基づき、企業別の商品需要に集計する。 • 均衡条件のチェックは、production/3の中でも行っている。すなわち、上記のパラメータの下で、まず各企業にとって費用最小化する生産量と要素の派生需要が計算される。 production/3の第3引数(図では変数Cでバインドされたリスト)によって、消費者の効用最大化の結果である商品需要が、最適生産量と一致するか否かをチェックしている。 • 図のように要素の超過需要を検証するプログラムを作成し実行すると、わずかな不均衡(資本側に正の超過需要)が検出されたものの、ほぼ均衡が達成されていることが分かる。 ?- excess_demand(A,B,C). A = capital(0.00388917=25.0039-25, price(1.373)) B = labor(-0.0102005=59.9898-60, price(1.0)) C = disequilibrium No ?- excess_demand(capital(EDK=K1-K,price(R)),labor(EDL=L1-L,price(W)),T):- endowment(consumer(r),capital,Kr), endowment(consumer(p),capital,Kp), endowment(consumer(r),labor,Lr), endowment(consumer(p),labor,Lp), K is Kr + Kp, L is Lr + Lp, production(firm(m),[Km,Lm,_,_,_,R,W],_), production(firm(s),[Ks,Ls,_,_,_,R,W],_), K1 is Km + Ks, L1 is Lm + Ls, EDK is K1 - K, EDL is L1 - L, equilibrium_check([EDK,EDL],T). equilibrium_check([EDK,EDL],disequilibrium):- member(X,[EDK,EDL]), X>0, !. equilibrium_check(_,equilibrium).
表計算によるチェック • 数値例が若干文献と異なるので念のため表計算でShoven&Whalleyの例題とそこで主張された近似均衡を検算した。下図のように、先述のPrologモデルの出力とほぼ同じ結果が得られている。 • 練習問題:図はエクセルのシーと埋め込みになっている。図をダブルクリックするか、エクセルにコピーしてから、資本要素価格rの値を1.3735に変えて実験してみよ。またSolverを用いて均衡を見出せ。
Scarfアルゴリズムの実装 • 基本モデルでは予め価格のデータセットを与えて均衡条件を検証するのみだった。 • そこでScarfの不動点アルゴリズムを組み込むことによって、その均衡価格を近似できるようにしたい。 • 例題は基本単体が1次元のため、実装は容易である(ただし財価格は固定される)。 • またラベル貼りとそれに必要な超過需要関数の計算には先の例題モデルで作成した述語を再利用する。
均衡近似の実験(1) • このPrologによるプログラムでは文献の数値との比較のため、正規化した要素価格に対応する1次元単体の三角形分割を擬似的に用いたが、直接述語allocation/3を用いて出発頂点を数え上げており、明示的なピボッティングはしていない。 • 以下の図は均衡近似の実験結果である。格子数10および5000のときの近似値はShaven&Whallyの本のそれと近いことが分かる。 • ただし、財の価格は、要素価格の正規化スケールによって、以下のように調整する必要がある。 price_of_product(firm(m),A):- A is 1.399/(1.3735+1). price_of_product(firm(s),B):- B is 1.093/(1.3735+1). price_of_capital(A):-A is 1.3735/(1.3735+1). % 初期値 price_of_labor(B):-B is 1/(1.3735+1). % 初期値 % 2. grid(10). ?- test_simple. approximated solution is : id(6), prices([5/10, 5/10]), excess_demands([7.63971, -2.76429]), label(1) Yes % 2. grid(5000). ?- test_simple. approximated solution is : id(2108), prices([2893/5000, 2107/5000]), excess_demands([0.00852542, 0.00268448]), label(1) Yes ?- listing(log_simple). log_simple(id(1), prices([10/10, 0/10]), excess_demands([-20.6774, 660272.0]), label(2)). log_simple(id(2), prices([9/10, 1/10]), excess_demands([-16.9082, 11.6681]), label(2)). log_simple(id(3), prices([8/10, 2/10]), excess_demands([-13.2364, 6.54272]), label(2)). log_simple(id(4), prices([7/10, 3/10]), excess_demands([-8.38792, 3.61095]), label(2)). log_simple(id(5), prices([6/10, 4/10]), excess_demands([-1.73013, 0.687809]), label(2)). log_simple(id(6), prices([5/10, 5/10]), excess_demands([7.63971, -2.76429]), label(1)). log_simple(id(7), prices([4/10, 6/10]), excess_demands([21.1433, -6.91299]), label(1)). log_simple(id(8), prices([3/10, 7/10]), excess_demands([41.187, -11.7324]), label(1)). log_simple(id(9), prices([2/10, 8/10]), excess_demands([72.3653, -16.9863]), label(1)). log_simple(id(10), prices([1/10, 9/10]), excess_demands([126.664, -22.1559]), label(1)). log_simple(id(11), prices([0/10, 10/10]), excess_demands([2.05073e+006, -28.6762]), label(1)). Yes
プログラミングの改良:練習問題 • 前頁に示したように、三角形分割とピボッティングを使わなくとも、Prologで格子点を数え上げるのは易しい。練習として、(前出のプログラムを見ずに!)N人にD個の同じ品物を配分する方法を枚挙する述語をalloc/3として作成しなさい。 • 三角形分割とピボッティングをプログラムし、上記のallocを用いた結果と比較しなさい。次元数1,2,3の各場合について、実験してみること。 • 上記の2種類のプログラムを用いて、例題の均衡を近似するプログラムを作りなさい。両者の性能を比較しなさい。 述語allocationを用いた縦型探索: 配分(価格)を数え上げながら要素超過需要が十分0に近いところを見つけ、近似が悪ければ格子数Dを増やしてやり直す。(実験(1)で作成済みのプログラムを手直しする。) Scarfアルゴリズム: 三角形分割を用い、要素価格を更新しながら、各頂点の超過需要関数とそのラベルを計算する。ただし、ピボットしたときは新しい頂点についてのみ計算すればよい。すべてのラベルが異なる分割単体(つまり完全ラベル付け済み)で、その超過需要が十分0に近い頂点が見つかるまでピボッティングを続ける。近似が悪ければ格子数Dを増やしてやり直す。
ピボッティングの実装 % 1-Dimension simplicies pivot([V1,V2],out(1),[V3,V2]):- vector_diff(V2,V1,D), vector_sum(D,V2,V3), \+ (member(X,V3),X<0). pivot([V1,V2],out(2),[V1,V3]):- vector_diff(V1,V2,D), vector_sum(D,V1,V3), \+ (member(X,V3),X<0). % N-Dimensional simplicies pivot(V,out(K),T):- length(V,N), N > 2, nth1(K,V,VJ), pivot(ring,K/N,[K0,K1]), nth1(K1,V,V1), nth1(K0,V,V0), vector_diff(V1,VJ,D), vector_sum(D,V0,V2), \+ (member(X,V2),X<0), substitute(K/N,V,_->V2,T). % test run for pivot/3. ?- B=out(1),D=out(2),F=out(3), H=out(2),J=out(1), A=[[4,0,0],[3,0,1],[3,1,0]], pivot(A,B,C),pivot(C,D,E), pivot(E,F,G),pivot(G,H,I), pivot(I,J,K). B = out(1) D = out(2) F = out(3) H = out(2) J = out(1) A = [[4, 0, 0], [3, 0, 1], [3, 1, 0]] C = [[2, 1, 1], [3, 0, 1], [3, 1, 0]] E = [[2, 1, 1], [2, 2, 0], [3, 1, 0]] G = [[2, 1, 1], [2, 2, 0], [1, 2, 1]] I = [[2, 1, 1], [1, 1, 2], [1, 2, 1]] K = [[0, 2, 2], [1, 1, 2], [1, 2, 1]] ; No ?- pivot(ring,1/N,[N,2]):-!. pivot(ring,K/N,[K0,K1]):- K > 0, K < N, !, K0 is K -1, K1 is K + 1. pivot(ring,N/N,[K0,1]):- K0 is N - 1, !. substitute(K/N,V,VK->V2,T):- length(V,N), nth1(K,V,VK), findall(W, (nth1(J,V,X), (J \= K -> W=X; W=V2)), T).
三角形分割の実装 ?- simplical_subdivision( dim(2),pivot(K),perm(Pi),(1/D)*(S->T) ). K = 1 Pi = [ (1->2), (2->1)] D = 10 S = [[10, 0, 0], [9, 1, 0], [9, 0, 1]] T = [[8, 1, 1], [9, 1, 0], [9, 0, 1]] ; K = 1 Pi = [ (1->2), (2->1)] D = 10 S = [[9, 1, 0], [8, 2, 0], [8, 1, 1]] T = [[7, 2, 1], [8, 2, 0], [8, 1, 1]] ; K = 2 Pi = [ (1->2), (2->1)] D = 10 S = [[9, 1, 0], [8, 2, 0], [8, 1, 1]] T = [[9, 1, 0], [9, 0, 1], [8, 1, 1]] Yes ?- vertex_of_simplical_subdivision( dim(N), vertex(K), perm(Pi), (1/D)*[S|[S0|O]] ):- grid(D), length(Q,N), N1 is N + 1, nth1(K0,Q,_), (K0 > N-> !, fail;true), K is K0 + 1, vertex_of_simplical_subdivision( dim(N), vertex(K0), perm(Pi),(1/D)*[S0|O] ), member(K0->KP,Pi), findall(W, ( nth1(J,S0,X), exchange( dim(N),row(KP),col(J),DK ), W is X + DK, W >= 0 ), S), length(S,N1). %------------------------------------------------- % subdivision of unit simplex %------------------------------------------------- simplical_subdivision(dim(N), pivot(K),perm(Pi),(1/D)*(S->T) ):- N1 is N + 1, vertex_of_simplical_subdivision( dim(N), vertex(N1),perm(Pi),(1/D)*S ), pivot(S,out(K),T). initial_simplical_subdivision( dim(N),(1/D)*S ):- grid(D), N1 is N + 1, allocation(N1,D,S). vertex_of_simplical_subdivision(dim(N), vertex(1),perm(Pi),(1/D)*[S] ):- permutation(dim(N),Pi), grid(D), initial_simplical_subdivision( dim(N),(1/D)*S ).
参考文献 • J.B. Shoven and J. Whalley (1992). Applying General Equilibrium. Cambridge University Press.[応用一般均衡分析―理論と実際. 小平 裕 (訳). 東洋経済新報社.1993.] • H. E. Scarf (1982). The computation of equilibrium prices: An exposition. In K.J. Arrow and M.D. Intriligator (eds.), Handbook of Mathematical Economics, vol. II, North-Holand, Chapter 21.