ミクロ経済学の我流シミュレーション その1 基礎経済モデル
ミクロ経済学に基づき、経済シミュレーションまたはゲームを作った。モデル自体は簡単なものなのだが、「動く」までにするのが一苦労であった。コンピュータでシミュレーションができるようになるまでには、いろいろ決め難いことを決めねばならない。あいまいにしたいことがあれば、どうやってあいまいにするのか、乱数を使うならどのような乱数を使うのかを決めなければならない。企業が赤字の場合どうするか、パラメータが 0 や無限に近くなるのをどのような考え方で防ぐか、そういったことを決めていかねばならなかった。本記事は、その記録である。
基本的なアイデアは、価格によって需要と供給を決め、その需要と供給が一致するように、つまり(需要-供給)の二乗が最小となるように、最適化関数を用いれば、経済シミュレーションができるのでは?…というものである。
しかし、商品の生産について考えてみると、価格が増えると供給が増えるという経済学の法則が、個々の企業においては成り立っていないと考えるようになった。もちろん、利益が出ていれば新しい企業が参入があるし、利益が出ていなければ退出があって、そういう意味で「供給力」の増減はあるだろうけれども、むしろ、個々の企業は赤字にならない限り需要があれば必ず生産はするのではないかと考えるに致った。しかし、そう考えると、需要と供給は必ず一致するわけで、(需要-供給)の二乗を最小化するという道は崩れる。替わりに各企業を総合した利益を最大化することを最適化に組み込むことにした。(労働需給に関してのみ、(需要-供給)の二乗の最小化を組み込んだ。)
マルクス経済学を参考に、商品は、必需品、贅沢品、原料の三種ということにした。労働者は必需品を毎期需要し、また、貯蓄を持ち、(マルクス経済学と違って)貯蓄等の余裕から贅沢品を需要すると考えた。必需品、贅沢品、さらに原料も、原料と労働から作られると考えた。
資本家は、違った戦略を持ったエージェント 5人で表し、一期につき一分野に一社しか企業が参入できないと決めた。モデルを簡単にするためである。参入する資本家はランダムとした。
本来は、このシミュレーションを使って経済学的知見を確認するのが目的であった。しかし、思いのほか、シミュレーションをまともに動かすのに手こずり、たまに「まとも」に見える動作をするだけで満足するのが現状で、経済的知見のような微妙なことを言えるまでには致っていない。それが残念である。今後の課題としたい。
プログラム言語は、流行の Python を使った。人工知能入門を私が勉強したときに Python の最適化関数を知ったのが、Python を使おうと思ったキッカケである。
■ |
動機と目的
|
今回とは別の未発表の経済モデルについて考想を練っているときに、ヒントになればと『経済原論』を何冊か読んでみた。『経済原論』というのはどうもマルクス経済学の分野らしく、ミクロ・マクロ経済学以前の経済常識を読みたいと思っていた私には過ぎた本ばかりだったのだが、その中で、私は次のような記述に出会った。
> |
資本の累積的蓄積にともなう労働需要の累増によって、あるいは新市場の開拓、新産業分野の展開等にともなう資本の飛躍的膨張による労働需要の急増によって、産業予備軍が一定限をこえて収縮すれば、賃金率が上昇し、その賃銀率の上昇は機械採用の誘因として作用し、資本構成高度化の速度が高まる。すなわち、追加資本はヨリ高度な資本構成をもって投下され、また、元資本の更新が促進されかつその更新にともなう構成高度化の度合が大となる。かくして、一方では大量の予備軍が排出され他方では労働力吸収力が弱まることによって、再び貯水池は膨張し、賃銀率が下落せしめられることとなる。
(…)
賃銀率の上昇が機械採用の誘因として作用するのは、機械が(その耐久年限の間にわたって)節約する延べ労働量に対して支払われる賃銀総額よりもその機械の価値が小なることが機械採用の資本制的限界条件をなし、他面では賃銀率の上昇は旧生産方法による諸資本の剰余価値をますます減少せしめ資本としての存立を維持し難くするからである。
(富塚良三『経済原論』p.158-159)
|
機械が相対的余剰人員を作るというだけでなく、旧生産方法にとって賃金高が苦しいのが余計に賃金を下げる原因となる。二重の要因となるのが大きいのかと思った。しかし、新生産方法への移行には、機械の更新にともなう労働力需要による賃金増もあるはずで、このあたりはちゃんとモデルを作ってみる価値があるように思った。ここをコンピュータ・シミュレーションできればかっこいい。やりたい。…というのが動機だった。
機械の高度化には、労働力を少なくするものの他に、原料を少なくするようなものや、(剰余)価値を高めるようなものがあるはずで、どういうものを選ぶのか、無差別曲線的なものが描けそうだ。どういうものを選べば有利か「学習」さえできるかもしれない。上昇に対して上昇があったり下降があったりというのは差分(微分)方程式的なモデルにすればよいのだろうか。…などと考えはするが、それらをちゃんとしたシミュレーションにできるかどうかはまだ自信がなかった。
そのころ上記を読んで得たアイデアを列挙すると次のようなものであった。
|
…等々。ここから今回のシミュレーションにアイデアを活かしたものもあるし、そうでないものもある。機械高度化はモデルとしては組み込んでいるが、その設定を活かした結果が出たとは言い難い。平均賃金以外の賃金についても今回は考えていない。原料・必需品・贅沢品を部分として含む中間財のようなものもモデル化にまでには致らなかった。「新商品」「旧商品」という議論もほとんど組み込んでいない。これらのことは今後の課題としたい。
■ |
生産の理論の前理論
|
アイデアの初期段階では、企業オブジェクトに賃金等の価格情報を与えると、需要量と供給量を返し、それを合算して (需要 - 供給) ** 2 ("**" はPython などでのべき乗の記号)を最小化すれば良いと考えていた。
しかし、耐久消費財を念頭においた生産について考えているところでつまづいた。会社の個別の商品を見た場合、固定費がある分、数を作ったほうが安くなる。供給数が増えれば価格が安くなるという関係をグラフにすると、価格が高くなると供給が減るという関係になる。これは通常、供給曲線を考える際の価格が高くなれば供給が増えるというグラフの逆である。
最適化の過程では、価格がまず決まるとする。商品価格が決まっている状況で、需要が決まったとしよう。安く数が作れるといっても需要量に対しては多過ぎるということがあり得よう。価格が高くなると生産量が少なくなるが、価格が高くなるごとに需要も少なくなり、いつかは需要量に対してピッタリの数が供給できるということになるのではないか?
生産曲線を描くための式を考えよう。生産量を n、価格を P、固定費を K、労賃を V、原料費を C とし、商品一個あたりに必要な原料を α 個、商品一個あたりに必要な労働量を γ 人としよう。利益率 β を固定することで、生産曲線は次のようになる。
β = (- K + (P - α * C - γ * V) * n) / (K + (α * C + γ * V) * n)
<=> n = (1 + β) * K / (P - (1 + β) * (α * C + γ * V))
|
P が大きくなるほど n が小さくなる曲線になっている。これが需要と一致する点を考えるべきだろうか? しかし、利益率 β を固定するとは少しおかしいのではないかと私は考えた。利益率はできるだけ大きくなるようにするものだからだ。むしろ、n と P が決まって β が決まるものではないだろうか? 価格から決まるものと言えば、生産量というより利益率ではないか…と私は考えを改めた。それなら自由にすべき変数は n ではなく β だ。
…実のところを白状すると、それで考えを改めたのではない。複数企業が参入したときに赤字をどうするかというところで私は考えを改めたのである。赤字が存在する場合、企業は赤字がもっとも小さくなるように行動する。上の式で言えば P > α * C + γ * V であれば、できるだけ生産したほうが赤字幅が小さくなり、そうでなければ生産はいっさいやめたほうがよい。このとき有利な生産量の上限みたいなものがあるなら、上の生産の理論に意味があるが、生産するならなるだけ多く生産したほうがよいというなら、生産は常にギリギリまでやると考えたほうがよい…と考えを改めたのであった。
■ |
生産の理論
|
生産する企業において需要量が先に決まりそれに合わせて生産が行われる。利益率は上の β になり、(需要 - 供給) ** 2 の最小化ではなく、この β の最大化を最適化のスコアの中に組み込もうと考えを改めた。
さて、次の問題は、工場を増やす場合である。これには二つの場合が考えられる。一つは同じ企業がラインを増やす場合である。もう一つは、違う企業が参入して来るというものである。その違いは赤字のときに顕著に現れる。赤字になったとき、同じ企業が複数のラインを持つ場合は、一番、有利な条件のところのみを稼動させて他を休止すればよい。もし、生産に上限がないとすれば、これは赤字でない場合もそうである。
複数の会社が参入しているという場合、それぞれの会社が P > α * C + γ * V である限りにおいて生産しようとするだろう。そして、赤字を「分担」することになる。
本稿では、簡単にするため複数会社の参入の場合のみを考えることにした。そして、生産数の上限はないものとし、一企業で莫大な需要をこなすのも可能だとした。
どのように「分担」するかであるが、ここで、「動機と目的」でチラと述べたアイデアを使う。それは「機械の高度化には、労働力を少なくするものの他に、原料を少なくするようなものや、(剰余)価値を高めるようなものがある」という考えである。
企業(Python では Company オブジェクト) i は、剰余価値的な「優位性 (superiority)」A_i と上の α にあたる「一製品あたり原料 (ingredientsPerProduct)」α_i と上の γ にあたる「一製品あたり労働量 (laborsPerProduct)」γ_i の他に、優位性がどれぐらいの早さで陳腐化していくかを示す「優位性減衰(superiorityDecay)」δ_i を持つとする。
基本的には優位性の重みづけに基づいて「分担」が行われると考える。しかし、それだけではない。
「動機と目的」のところで「旧生産方式(…では…)生産の賃金弾力性が上がる」と考えたが、これを活かしたい。一方、機械の高度化により γ は小さくなっていくが、γ が大きいほど相対的に弾力性が大きく、したがって旧企業ほど弾力性が大きいのではないか。つまり、生産の賃金弾力性の変化の正体は、γ にあるのではないかと考えた。
全体の生産量が大きくなったり小さくなったりするなか賃金弾力性は割合に関して大きくなったり小さくなったりすることだろうと考えた。最初、γ_i の平均を γ_M として、賃金の変化量を Δ として、A_i * (a * Δ * γ_i / γ_M) を重み付けとして分配することを考えたが、この場合、分子と分母両方にくることで変化量 Δ が消えてしまい、弾力性として意味をなさない。そこで、A_i * ((γ_i / γ_M) ** (- c * Δ)) という重み付けにすることにした (a, c は何らかの定数)。(なお、分子と分母両方に来ることでγ_M の項は消えるので、A_i * (γ_i ** (- c * Δ))を重み付けに用いた。
P > α * C + γ * V なる企業は、「分担」に参加する。それ以外は参加しない。しかし、特別な場合として、P > α * C + γ * V なる企業が一つも存在しないことがありうる。その場合は、しきり直して、すべての企業が参加し、上の重み付けで生産つまり赤字を分担することにした。このとき優位性を基準にするのではなく、赤字の軽いところにより多く割り当てるような考え方も取れるかもしれないが、今回はそうしなかった。
なお、マルクス経済学では用語として「労働」と「労働力」を厳しく峻別するが、本稿ではそこのところを気にせず、「労働量」を「労働力量」の意味で用いている。あえていえば、運の要素を含まない「労働」はありえず、そうならばそれは「労働力」と区別できないと(今回は)考えたからである。
■ |
資本家による企業参入
|
商品には、必需品・贅沢品・原料の三種があるとする。企業の参入はそれぞれの分野一期に一社ずつしか起こらないとする。収益機会が豊富にあって、参入がたくさんあるというのは毎期参入があることで表現できると考えた。
逆に言うと参入できないときがあるということで、それが資本家の負債(debt) が 0 でない間は参入できないというルールによる。利潤がある間は、投資用の資金がたまる=負債が減るが、資本家が一旦投資をすると、参入によりその分野の利潤が減り、次の投資までの時間があき、しばらくして更新がとまり、再び利潤機会が復活する…といったことを想定している。
資本家は 5人いるものとする。その期に参入するかどうかはくじ引きで順番を決め順に試算していく。試算して参入する今期と前期と前々期の三期平均の利益率と今期の利益率の低い方の利益率が「市場利子率」と目される標準的な利益率 6 % を超えていれば、参入が行われることになる。5人とも参入しない場合は参入は行われない。(前期・前々期の利益率はその分野の最大の利益を出した企業のもの。)
企業の固定資産は 10 期で更新期を迎える。このとき、更新のために特別なことをしない。その企業が去り、有利ならば他の企業が新規参入してくるだけである。企業の優位性 A_i は毎期優位性減衰 δ_i をかけることで減衰させられる。
企業は次のようにして作られると決めた。
まず、固定資産を作るには原料が必要で、第1期に必要な原料は 5 個とし、新しい企業を作るごとに前の企業の固定資産に必要な原料の 1.05 倍の原料が必要となる。
0 から 1 まで変化しうる変数 r_1 と r_2 を決めたとして、A_i、δ_i、α_i、γ_i は次のように決める。
A_i = (4 - 2) * r_1 + 2
γ_i = ((0.99 - 0.95) * r_1 + 0.95) * γ_{i-1}
δ_i = ((0.5 ** 0.1) - (0.25 ** 0.1)) * r_2 + (0.25 ** 0.1)
α_i = ((1.18 - 0.98) * r_2 + 0.98) * α_{i-1}
|
ちなみに α_{i-1}、γ_{i-1} は前の企業の α と γ である。
つまり、優位性 A を大きくしようと思えば、商品あたりの労働量 γ を犠牲にして大きくしなければならないし、優位性減衰を有利にすなわち大きな値にしたいなら、商品あたりの原料を犠牲にして大きくしなければならないということである。
このリクツは…、優位性を得ようとすれば手をかけたことすなわち労働量を多くかけたことをしないといけないが、そのままではすぐに陳腐化する。それを防ぐには宣伝費をかけるなり流行によって変えやすい部分を余計につくる…すなわち原料を多く使う必要がある。…というものである。
資本家 5人はこの r_1 と r_2 の決め方が違う。一人は r_1 と r_2 をランダムに決める。別の一人は r_1 = 0、r_2 = 0 に、また別の一人は r_1 = 0、 r_2 = 1 に、また別の一人は r_1 = 1、r_2 = 0 に、最後の一人は r_1 = 1、 r_2 = 1 に決め打ちする。
さて、特別な場合として、ある分野の企業の数が 0 になる場合がある。この場合は、利潤に関係なく誰か一人の資本家が参入を行うこととする。基本はランダムであるが、負債がない者がいればそれを優先する。これにより生産が途切れることがなくなる。
■ |
必需品の需要
|
労働者は産業予備軍(失業者)も含めて 1000 人いるものとする。資本家と合わせて需要家は 1005 人いることになる。
必需品需要については被雇用者者も失業者も資本家も同じである。一定の価格弾力性に基づき、価格差と前期の必需品需要から求める。弾力性 E (< 0)、前期の一人あたりの需要を D_{i-1}、前期の必需品の価格を P_{i-1}、今期の必需品の価格を P_i とすれば、今期の一人あたりの需要 D_i は、
D_i = (1 - ((P_i - P_{i-1}) / P_{i-1}) * E) * D_{i-1}。
|
ただし、必需品がまったくいらなくなるということはありえないので、D_i を 1 以上に決め、上の計算式が 1 に満たないときは D_i = 1 とした。
■ |
労働の需要と供給
|
労働の供給のアイデアは、「動機と目的」で述べた「必要生活費が減ると(…) 労賃は増える方向になるはず」という考察と、賃金から必要生活費を除いた「余剰」それを本稿では仮に「新規貯蓄」と呼ぶが、それが大きいほど労働意欲がわくはずだという考察による。この意欲をどうミックスするかを決めねばならないが、一定の率 r (= 0.5) を決め、それぞれの要素を加味することにした。(なお、新規貯蓄が 0 以下の場合は、労働供給はなされないと考えた。)
また、労働供給はある程度は動くだろうが、上限・下限があるだろう。前期の失業者数のプラス・マイナス 50% ぐらいだろうか。一方、必要生活費がどれぐらい動いたかや、新規貯蓄がどれぐらい動いたかは、プラス・マイナス無限の値を理論的には取りうると考える。それをうまく表せる関数の一つに arctan (正接 tangent の逆関数) があるので今回はそれを使おう。
今期・前期の失業者の人数を n_i・n_{i-1}、今期・前期の新規貯蓄を S_i・ S_{i-1}、今期・前期の必要生活費を N_i・N_{i-1} とする。なお、必要生活費はその期の必需品の価格に前節の一人あたりの必需品需要をかけたものである。
q = r * ((S_i - S_{i-1})/S_{i-1}) + (1 - r) * ((N_i - N_{i-1}/N_{i-1}))
n_i = n_{i-1} - 0.5 * (2/π) * arctan(2 * q) * n_{i-1}
|
…とする。なお、失業者よりも被雇用者が多い場合は、失業者ではなく被雇用者に対して上式を使う。なお、arctan の中身が 2 * q になっているのは q に対する反応をよくするため適当な数値(ここでは 2)をかけることに決めたためである。
一方、労働需要については、必需品・贅沢品・原料について需要が決まればそれぞれの企業の生産個数が決まり、それをその企業の商品あたりの労働量とかけて積み上がれば、全体の労働需要になる。
労働需要と労働供給については初期の構想のまま、(需要 - 供給) ** 2 を最適化のスコアの中に組み込む。
■ |
贅沢品の需要
|
マルクス経済学では、労働者は贅沢品を買わないなどと考えたりするものだが、本稿ではそのような考えを取らない。贅沢品は、労働者も資本家も等しく、貯蓄が多くなるごとに強く嗜好すると考えた。
ただし、目安となる基準額は今期の新規貯蓄から決まり、それは新規貯蓄の3倍とする。貯蓄が基準額を越える部分の 1/3 を基準額に足した額がその者の需要の強さとし、最適化のパラメータとして与えられる贅沢品の価格よりそれが上であれば、その者は贅沢品を需要するとする。
贅沢品を需要する者を積み上げた数字が、その期の贅沢品の需要量となる。
■ |
原料の需要
|
原料の需要を計算するには少し複雑な計算が必要である。というのは、原料の生産自体に原料を必要とすると考えるからである。
必需品・贅沢品の需要および企業の新規設立にともなう需要から、とりあえず原料の必要最低限が計算できる。そして、その必要最低限について原料を生産すると、余分に必要な原料を計算できる。そして、この余分に必要な原料を生産するためにさらに余分な原料を計算できる。その余分となる部分は小さくなって 0 に近づく。それを足しあわせれば、必要な原料の需要量=生産量になる。…というのが基本的なアイデアである。そういうのは最適化で解くことができる(ことがある)。
最初の必要最小限の量を d_0 としよう。「分担」にしたがって k + d_0 を生産して k' が「余分な生産量」として求まるとする。この (k' + d_0 - k - d_0) ** 2 を最小にするよう最適化する、すなわち k - k' = 0 <=> k = k' になる点がみつかる。
α_M を企業の中で最大の商品あたり原料とする。k を「余分な生産量」とすると、k = α_M * (k + d_0) を解いた k より小さいものが実際の「余分な生産量」になる。そのような k と k = 0 を範囲として最適化をすればよい。
なお、この原料生産における α が 1 を越えるとおかしなことになる(「余分」なはずがマイナスになってしまう)。そして 1 に接近するごとに無限に k が大きくなりうる。本稿のシミュレーションではそのため上限値を 0.9 にして規制している。マルクス経済学で原料的なものへの生産への投資だけを肥大化する議論があったりするが、それはここに現れているのかもしれない。
■ |
社会的負債
|
最適化のパラメータとして賃金・必需品・贅沢品・原料の価格を与え、最小化するスコアとして (労働需要 - 労働供給) ** 2 に、各企業の利潤にマイナスをかけたものを足したものを使って、大きく最適化を回す。
すると本来なら 労働需要 - 労働供給 = 0 になって欲しいのであるが、他とのかねあいで、そうならないことも出てくる。その場合にどう考えればよいか決めねばならない。
ここで社会的負債という考え方を導入する。誰か個人に帰さない負債をその勘定科目に付けるのである。まず、失業者の必要生活費は、毎期、この社会的負債とする。
次に 労働需要 - 労働供給 = 0 にならなかった残りを考える。労働需要が労働供給より大きい場合は、被雇用者が「残業」をして補ったと考える。残業代は通常の賃金の二倍とする。もう少し具体的に書くと (労働需要 - 労働供給) * 2 * 賃金 / 被雇用者数 が被雇用者の賃金にプラスされる。その原資は社会的負債とする。
一方、労働供給が労働需要より大きい場合、あまった「被雇用者」は、社会的負債から賃金を出すことにする。
さて、こうすると、資本家がだいぶ得しているように見えるかもしれないが、本モデルでは、資本家の利益は必要経費以外すべて社会的負債を減らすことに使われるという乱暴な決めごとをしいた。
まず資本家の「賃金」も労働者の賃金と変わらない分を確保するとする。そこから貯蓄をし、必需品や贅沢品を買う。一方、企業を起業したときは固定資産分が負債となるとする。毎期、固定資産は残存価格なしで定額法で減価償却されるとする。毎期この賃金と償却分は社会的負債に付けかえてよいことにする。会社の利益はまず個人の負債を返すのに使われ、それ以上はすべて社会的負債の返却に使うこととする(赤字であればすべて社会的負債になる)。
■ |
実験
|
これまでの議論を総合して作ったのが micro_economy_1.py である。使った Python のバージョンは 3.6.4、SciPy は 1.0.0。これを動くまで持っていくには、バグを取るのはもちろん、例えば、価格の範囲を 1 から 1000 の間に制限したりする必要があったりした。しかし、それで思った通り動いたかというとそうではない。
初期値として [賃金, 必需品, 贅沢品, 原料] の価格が [30, 10, 15, 15]、貯蓄は平均 10 の指数分布の乱数で与え、失業者数は 1000人中 300 人として、とにかく20期、動かしてみた結果のログが(途中省略して)次のようになる。
$ python micro_economy_1.py Acronyms: W: Wages, N: Necessaries, L: Luxuries, I: Ingredients. OptForStep: iterated 354 times score=-10091.663249003372 Companies N:2, L:1, I:2 [Type] [OwnerId] [ProfitRate] N 4 0.6464061520432376 N 0 0.5398981085921184 L 3 -0.4693981403076306 I 4 0.3890054894418247 I 1 0.4552044030220315 Increase of Social Debt: -41648.3813700879 Price W:24.117976351346208, N:12.71757042603145, L:8.490434756232888, I:17.502720924647342 Worker's Savings Increase: 2.8301426929739364 Supply of Labors = 659 (Demand - Supply) of Labors = -8.845901365632926 Profit Rate N:0.6464061520432376, L:-0.4693981403076306, I:0.4552044030220315 Product N:1682.261006620607, L:508.0, I:1179.3961158798008 Savings mean:7.123712162563456, variance:56.036152802783974 OptForStep(Fail): iterated 434 times score=-10023.034742576805 Companies N:3, L:1, I:3 [Type] [OwnerId] [ProfitRate] N 4 0.5692171840533023 N 0 0.4796735066944609 N 3 0.5072608323075326 L 3 -0.6331127886653873 I 4 0.5008517300585492 I 1 0.5822854722290667 I 2 0.4967528319755297 Increase of Social Debt: -29867.906983487737 Price W:24.104261951222355, N:13.68336071886696, L:6.3961219154413085, I:20.375282363400267 Worker's Savings Increase: 2.2434384293723397 Supply of Labors = 644 (Demand - Supply) of Labors = -7.102309758557908 Profit Rate N:0.5692171840533023, L:-0.6331127886653873, I:0.5822854722290667 Product N:1605.609037929279, L:515.0, I:1188.7162160814187 Savings mean:5.294845251329998, variance:40.21842122854789 : :(途中省略) : OptForStep: iterated 67 times score=-11945.151089968967 Companies N:7, L:1, I:11 [Type] [OwnerId] [ProfitRate] N 1 -1.0 N 3 -1.0 N 1 -1.0 N 0 -1.0 N 1 -1.0 N 3 -1.0 N 3 0.0017767916634080928 L 0 -0.9124559175922721 I 2 0.4383446515964115 I 3 0.46464649016358484 I 4 0.2931006298619478 I 3 0.31370011667054504 I 2 0.15686696468470215 I 3 0.18059678503444124 I 0 0.1380200621047454 I 1 0.1646298989601593 I 0 0.12085664202468203 I 1 0.14584078296272854 I 3 0.1724042806996111 Increase of Social Debt: -52964.17361935915 Price W:23.482049217481375, N:17.37946471154916, L:2.1750598365291447, I:32.74557654522276 Worker's Savings Increase: 1.2916032687826373e-09 Supply of Labors = 493 (Demand - Supply) of Labors = -0.47052139378268976 Profit Rate N:0.0017767916634080928, L:-0.9124559175922721, I:0.46464649016358484 Product N:1357.8933444703962, L:7.0, I:2171.29069018655 Savings mean:3.0360519738180525, variance:3.8439410663385103
これでもそこそこうまく行っているほうである。省略したが途中で最適化が失敗したりもしていた。しかも、何回もやり直すと、乱数の変化によって同じ初期値でもかなり違う結果になる。シミュレーションとして成功しているとはとても言えない。
贅沢品の価格が下限である 1 に貼り付いたり、今回はそうではないが、贅沢品の生産数がほとんどの期で 0 になるような現象が起きることがある。必需品は労賃の下限を規制し、原料は原料自身を規制し、贅沢品は新規貯蓄を規制する…。だから、贅沢品の利益の最適化が効いて新規貯蓄はある程度、確保されるだろうと想定していたが、まったくそうなる気配がない。
どうもこれは貯蓄という時間を加味した概念のせいで、別に新規貯蓄をスコアに加味する必要があるのではないかと、新規貯蓄の項をスコアに加え、その倍率を変えたりしたのだが、そうすると、他が上限の 999 に行ったり、かなりシステムが不安定になった。
しかたなく労働の供給のところで、「新規貯蓄が 0 以下の場合は、労働供給はなされない」というところを「新規貯蓄が賃金の 1/3 以下の場合は、労働供給はなされない」と変え「チューンアップ」した。最低限文化的な生活ができる最低賃金を設定した感じだろうか。
もしかすると、このような時間要素が絡むものには別の最適化が必要なのかもしれない。変動があまり起きないように保守的になるようスコアをいじったり、新規貯蓄の何分の一を求めるかを最適化のパラメータに加え、それを贅沢品の企業の利益の時間平均したものに連動させて動かしたり…といったことが可能なのかもしれない。そのあたり、何か理論があるのかもしれないが、最適化に詳しくない私は知らない。とにかく、上に書いた以外、そういったことは今回はせず、今後の課題とした。
ほかに、労働需要 - 労働供給が結構大きな値になったりするのが気になる。荒療治として (労働需要 - 労働供給) ** 2 を例えば 500 倍ぐらいすると、そういうのはピタッとやむ。ただ、ここだけが問題となって変数が動く余裕がなくなるのも問題なので 500 倍ではなく 3 倍に「チューンアップ」した。
さらに、他の分野では利益が出ているのに、ある分野では利益が出ず赤字企業が一社でずっとガンバル…みたいな状況によく陥るのも気分が悪い。これは利益を単純に足しているためで、一つの分野が悪くても他の分野がよければその分野に集中するということが起こっているからだろう。
そこで単純な利益ではなく、分野の会社ごとの平均の利益(のマイナス)をスコアに加えることにした。ただ、これでもマイナスの利益が頻出するので、マイナスの利益が出ている分野は、そのスコアの損失が 10 倍になるように「チューンアップ」した。
以上のような「チューンアップ」をほどこしたのが micro_economy_2.py である。(実は micro_economy_2.py を徐々に作ったあと、そこでの結果をフィードバックして、元の姿を取り戻させたのが今の micro_economy_1.py になる。)
その実行結果は次のようになる。
$ python micro_economy_2.py Acronyms: W: Wages, N: Necessaries, L: Luxuries, I: Ingredients. OptForStep: iterated 381 times score=199.14451826752122 Companies N:2, L:1, I:2 [Type] [OwnerId] [ProfitRate] N 2 0.15785712173309763 N 4 0.06000000142191066 L 1 0.022531117948959137 I 1 0.14371062526667935 I 4 0.0952181654287593 Increase of Social Debt: -9439.585871854228 Price W:27.665544186369424, N:8.42616407566005, L:16.06006543360048, I:14.708153325601893 Worker's Savings Increase: 9.22184806785054 Supply of Labors = 677 (Demand - Supply) of Labors = -23.519479027346506 Profit Rate N:0.15785712173309763, L:0.022531117948959137, I:0.14371062526667935 Product N:2199.804612475398, L:143.0, I:1321.7896276112863 Savings mean:14.366558311863528, variance:60.983399128998435 OptForStep: iterated 174 times score=-1302.607431756639 Companies N:3, L:2, I:3 [Type] [OwnerId] [ProfitRate] N 2 0.184573312550856 N 4 0.09497140367468562 N 1 0.12878264187785823 L 1 0.06202481418393208 L 1 0.12081190075306245 I 1 0.10755293413896723 I 4 0.06846321706064229 I 1 0.11069872789188746 Increase of Social Debt: -9097.65054502226 Price W:27.820179381017276, N:8.531461651432085, L:16.734051113263384, I:14.213954706850094 Worker's Savings Increase: 9.28601871761191 Supply of Labors = 679 (Demand - Supply) of Labors = 0.3296904460578389 Profit Rate N:0.184573312550856, L:0.12081190075306245, I:0.11069872789188746 Product N:2183.3106949025205, L:228.0, I:1374.821164469151 Savings mean:16.90846601705912, variance:66.1866623725694 : :(途中省略) : OptForStep: iterated 172 times score=-690.3138436451507 Companies N:8, L:11, I:2 [Type] [OwnerId] [ProfitRate] N 1 0.11079495316511993 N 3 0.1419682710163418 N 1 0.16831510437478583 N 0 0.15649575081955516 N 1 0.18572646681909302 N 3 0.2148881435495164 N 4 0.08780107321425604 N 3 0.10752348438347388 L 4 0.7900641956200828 L 3 0.7573857249594464 L 4 0.6338394879033661 L 3 0.6305024343449366 L 1 0.6158272798213816 L 2 0.5080590847399747 L 0 0.4915681937735938 L 3 0.5389468132269766 L 1 0.54006641645961 L 2 0.38065674637457325 L 0 0.34991402750855927 I 2 -1.0 I 1 0.034486188374192886 Increase of Social Debt: -21076.69231147747 Price W:21.507096423871268, N:5.666779542210449, L:31.13078545560748, I:10.25336993188364 Worker's Savings Increase: 8.216129843877951 Supply of Labors = 642 (Demand - Supply) of Labors = -0.639035539853694 Profit Rate N:0.2148881435495164, L:0.7900641956200828, I:0.034486188374192886 Product N:2357.1450615640033, L:135.0, I:2139.6432464962945 Savings mean:19.37009799829607, variance:130.21863585528772
こちらでも初期値を少しいじると大きく結果が変わったり、同じ初期値でもランダム性によりかなり結果が変わったり、最適化が失敗することがあったり、贅沢品の生産が 0 になったりづることすらある。しかし、この回では、必需品・贅沢品・原料の企業がバランス良く成長しているように見えた。
蛇足として、スコアを上述のものの替わりに社会的負債そのものにした実験が micro_economy_1sd.py である。ここには結果を示さないが、とても不安定なものになった。
■ |
結論
|
わからないところや不明なところがあればソースを読んで欲しい。はじめてプログラムをする方などは面食らうかもしれないが、そんなに難しいことはしていないので読めると思う。思いたい。
当初の動機にあった機械高度化に関する議論に致る前の前の段階で、ただ、安定して動くことすら難しいところで終ったのは悔やしい。ランダム性はあっても、こんなにカオス風に動くとは想定していなかった。当初、どの分野もまず利益が出るだろうと思っていたら、それすら難しそうなのには驚いた。これでは次の理論的な解析に進めない。
こんな状況の Toy プログラムを公開して意味があるのか…と迷いもしたが、ググると案外、このようなシミュレーションはなされていなさそうなので、他の方が「失敗事例」として参照できるよう公開しておくことにした。もし万一、ここから発展させて何か成果を出せる人が出たとしたら、私はうれしい。その人が優秀であることを私は疑わない。
■ |
追記: 労働供給に関する資産効果の補足説明
|
上の「動機と目的」の以下の部分、自分でも意味がよく取れなくなっていたので再考した。
|
物価が下がって、実質賃金が上がっているというとき…、
|
労働供給増 = α * 実質賃金増 - β * 実質貯蓄増 で表せるということではないか?
資産・貯蓄総額の大きさによって物価減の影響は変わってきそうではある。ただ、個人個人によって働きはじめる実質貯蓄額や実質賃金額は違うということもありそうである。
働きはじめの実質貯蓄額や実質賃金額は変化していくのではないか。より貯蓄を欲するようになるといった感じに。また、どれだけ贅沢品をこれまで買えたかでも変わってくるのではないか? 希望実質貯蓄額が大きい者は、贅沢品もなかなか買わないのが自然だろう。
そういった細かいことまで、モデルに組み込むのは難しい。だから、個人の貯蓄総額についてはとりあえず考えず、実質貯蓄増の割合だけを問題にすればよいのではないか? 実質貯蓄増は、必需品価格変化によって代替できると考える。すると、上で書いたように、労働供給は、(今期・前期の新規貯蓄を S_i・ S_{i-1}、今期・前期の必要生活費を N_i・N_{i-1} として)
q = r * ((S_i - S_{i-1})/S_{i-1}) + (1 - r) * ((N_i - N_{i-1}/N_{i-1}))
|
をもととすればよいのではないか。
ややこしいがここでは、新規貯蓄増のほうが、実質賃金増に対応している。新規貯蓄増は、賃金から必需品を引いたものだから、それに近いと考えるのである。
■ |
参考
|
Python については私はまだ初心者で、ネットの情報にいろいろお世話になった。マルクス経済学以外のミクロ経済学については、以前にいろいろ読んでいてお世話になっているが、特に今回これといって参考にしたわけではないので、ここに書名は出さないでおく。
|
(なお、上の実験結果はバージョン 0.0.4 によるもの。)
■ |
ライセンス
|
パブリックドメイン。 (数式のような小さなプログラムなので。)
自由に改変・公開してください。
■ |
アーカイブ
|
今回の配布物は以下の zip ファイル。更新があれば下のリンクの中身は最新のものに置き変わっているはず。micro_economy_1.py と micro_economy_1sd.py と micro_economy_2.py と micro_economy_3*.py と micro_economy_4*.py が入っている。
バージョン 0.0.10 から GitHub にも登録してあるが、更新は、ここの更新のあと1日から3日遅れの予定。
更新: | 2018-03-19,2018-03-21,2018-09-09,2019-05-24,2020-02-13,2020-04-08 |
初公開: | 2018年03月19日 17:04:07 |
最新版: | 2020年04月08日 16:56:19 |
2018-03-19 17:04:10 (JST) in 経済学 | 固定リンク | コメント (10) | トラックバック (0)
トラックバック
他サイトなどからこの記事に自薦された関連記事(トラックバック)はまだありません。
» JRF の私見:税・経済・法:ミクロ経済学の我流シミュレーション その1 基礎経済モデル (この記事)
コメント
初公開:micro_economy-20180319.zip。バージョン 0.0.1。
ひとこと [cocolog:89067097] に、今回のことの感想を書いてたりもしますので、よろしければそちらもご覧ください。
投稿: JRF | 2018-03-19 17:39:35 (JST)
更新:micro_economy-20180321.zip。バージョン 0.0.2。
micro_economy_1sd.py を足した。
あと、上のコメントに書いた「感想」のひとことにも書いたのだけど…、
「ミクロ経済学」のシミュレーションと言っているのには、ちょっと語弊がある。パレート最適などのミクロ経済学の特徴的な概念を使っているかと言えばそうではなく、実際には経済原論…基礎的な経済学の原理である需要と供給の関係に触れているだけである。しかし、「経済原論」と言ってしまうと、今はマルクス経済学のことになってしまうようで、それもまた違うとして、その言葉を避けたのだった。
誤解を招く表現であることについては申し訳なく思うが、その辺の事情を斟酌していただければと思う。
投稿: JRF | 2018-03-21 01:54:42 (JST)
更新:micro_economy-20180322.zip。バージョン 0.0.3。
micro_economy_1sd.py のみの更新。資本家の debt について計算し忘れがあったのを修正。
どうしようかと思ったが、それのみの更新なので、他はバージョンナンバーは上げなかった。
あと、わかっている不具合というか…、現在、失業者数が 0 になった場合、そこから回復しようがないアルゴリズムになっている。この点は改めるべきかもしれない。動く範囲を失業者数の +50% - -50% ではなく、単純に +100人 - -100人にするとか…。でも、課題によってそこが問題になるようならそう変えればいいだけの話という気もするので、今回は変更を見送った。
投稿: JRF | 2018-03-22 17:40:26 (JST)
更新:micro_economy-20180909.zip。バージョン 0.0.4。
その2の検討をしているときに気付いたのだが、贅沢品の需要の計算でミスをしていた。
というとったところ(複数)を…、
…と書き換えた。贅沢品の売り個数おかしくなっていた。毎期、労働者の数ぐらい売れることがあった。
ただし、こうすると、新規貯蓄が大きいと基準額が大きくなり、買える人が少なくなるという点で、新規貯蓄をあまり増やさない効果があることになる。当然、賃金を抑える方向に働くわけで、それをシステムにビルトインして示唆するのは、労働運動的にはあまりよくないかもしれない。
それにつれて、失業者数の初期値を 200 から 300 にした。そうでないとうまく動かないことが多かった。また、そうやっても、micro_economy_2.py が不安定になった。
あと、ほとんど意味のない改変だが、micro_economy_1sd.py で新規貯蓄が 0 以下になって労働供給が 0 になる場合にペナルティをくわえるようにした。
アーカイブには、その2の内容も同梱するようになった。micro_economy_3*.py や micro_economy_4*.py も同梱している。それらについては、その2の記事を参照して欲しい。
投稿: JRF | 2018-09-09 22:42:18 (JST)
更新:micro_economy-20190524.zip。バージョン 0.0.5。ダウンロードは SugarSync から↓。
https://www.sugarsync.com/pf/D252372_79_6993339670
まず、ココログの全面リニューアル(2019年3月)にともない、自由なアップロードができなくなっている。そのため、ダウンロードサイトを一時的(予定)に SugarSync にしている。
今回、「その3 log 戦略」と「その4 最適化の失敗」の記事を書き、アーカイブに micro_economy_5.py と exp_01_06.py と exp_01_06.log を加えた。それらについては記事を参照していただきたい(リンクは上に書いてある)。
また、従来からあるものも少し変更している。
まず、Economy._calcProfitOfCompany を読みやすく変更。これは影響はないはず。
次に、資本家(capitalists)について毎期、self.socialDebt += curPrice.wages するように変更。
さらに、各期の終りに就業者ごとと失業者ごとにランダムにソートするようにした。失業や就業のチャンスがランダムに来るように、ただし、最適化に便利なようにその期でその境界が一定になるようにそうした。
さらに、各期について総貯蓄の増分を表示するようにした。
そして、上の記事については「追記: 労働供給に関する資産効果の補足説明」を書き足した。
投稿: JRF | 2019-05-24 23:16:27 (JST)
更新: micro_economy-20190529.zip。バージョン 0.0.6。ダウンロードは SugarSync から↓。
https://www.sugarsync.com/pf/D252372_79_6904860256
初期値の設定ミスを修正。ただ、ほぼ影響はないはず。
あと、score_transforms.png をアーカイブに入れるのを忘れていたので入れた。
投稿: JRF | 2019-05-29 16:11:36 (JST)
更新: micro_economy-20200213.zip。バージョン 0.0.7。
《micro_economy-20200213.zip》
https://www.sugarsync.com/pf/D252372_79_7092931482
これまでの micro_economy_*.py については、socialDebt の計算間違いを主に訂正している。
micro_economy_7.py では様々な工夫があるが、最適化が基本失敗し、inf が返ってきたとき raise ValueError("Economy Collapesed.") するようにした。そもそも、inf が返りにくくはなっているが。
最後まで迷ったこと。tanh と arctan は似た関数で、これまでは arctan を使ってきたのだが、今回からは tanh を使うことにした。これまで使っていた arctan を tanh に変えるか、かなり迷ったのだが、統一感の他に変える大きな理由もなく、変えないのは歴史的な理由しかなく逆にどちらでも良いことがわかるということで、残すことにした。が、今後批判があればわからない。
ちなみに micro_economy_6.py がないが、exp_01_06.py がその代わりという扱い。
↓に感想を少し書いた。
[cocolog:91677019]
http://jrf.cocolog-nifty.com/statuses/2020/02/post-59b062.html
投稿: JRF | 2020-02-13 06:52:17 (JST)
更新: micro_economy-20200215.zip。バージョン 0.0.8。
《micro_economy-20200215.zip》
https://www.sugarsync.com/pf/D252372_79_7002595239
micro_economy_4.py を micro_economy_7.py にだいたい統合した micro_economy_7li.py の追加。
あと、生産の分担をするときのパラメータを少し増やした。この変更で、生産の分担がより敏感になされるようにできるはず。
投稿: JRF | 2020-02-15 08:35:29 (JST)
更新: micro_economy-20200222.zip。バージョン 0.0.9。
《micro_economy-20200222.zip》
https://www.sugarsync.com/pf/D252372_79_7027163248
最適化に関する細かな修正。
投稿: JRF | 2020-02-22 03:20:31 (JST)
更新: micro_economy-20200310.zip。バージョン 0.0.10。
《micro_economy-20200310.zip》
https://www.sugarsync.com/pf/D252372_79_7198459140
「公共事業」の成長を考えてみた。
投稿: JRF | 2020-03-10 14:55:02 (JST)