#1, 導入
ここでは、趣味で作った農家経済シミュレーションの進捗をジワジワと報告させてもらってます。
今回、一つの目標としていた***「ミクロな多数の主体の最適化行動が市場価格等の現象を形作り、そうやって形成された価格の影響を受けてミクロな主体が最適行動をとる」***という部分のモデル化が一応できたので、更新しました。
シミュレーションの結果は、長くなるので記事を分けました。こっちを参照でお願いします。
##ミクロな農家の最適化行動
本モデルの農家は、想定した地域の主食となる穀物Aだけを作ります。
そして、自分の食欲を満たすために一定量の穀物Aを食べますし、売ったり買ったりもします。
農産物を売る農家にはnet-sellerという名前を与え、自給分の生産+農産物を買う農家にはnet-buyerという名前を与えました。
なお、想定した地域はメキシコ農村部で、穀物Aのイメージは飼料用トウモロコシです。
###効用最適化問題
農家の行動の目的関数は「効用」でして、効用を得るための手段は「その他の財oを買う」「自分が持ってる時間を余暇に費やす」です。
また、農家が今期の生産計画に基づいて穀物Aを生産した結果は、次期に生産物を売ることで収入として帰ってきます(生産計画と収入受け取り時期のズレ)。
したがって、農業収入は次期になるまで得られないため、今期の消費は前期の収入や貯金で賄う必要があります。
加えて、今期にたてる生産計画は次期の消費にしか影響を与えないため、次期の消費量も今期の最適化行動における選択変数としないと、農産物を生産する農家がいなくなります。
将来のことを一切考慮しない農家は存在しないということですね。
ということで、ここでは、
(今期における農家の効用) = 1 × (今期の消費による効用) + r × (次期の消費による効用)
という効用関数を最大化するように農家は生産・消費計画をたてます。
なお、上式 r は将来の効用をどのくらい軽く見るかという係数で、割引率といわれます。ここでは、r = 0.5と設定。
###予算制約と収入源
農家は予算の範囲内で生産・消費を行う必要があります。すなわち、収入(貯蓄)>費用(消費)を満たす範囲内で消費・生産活動をするということです。
ここでは、①今期の消費における予算制約は「貯蓄>消費」、②次期の見込み消費における予算制約は「見込み収入>見込み消費」として、2つの予算制約を設定しました。
じゃあ、農家はどこから収入を得るのでしょうか?
ここでは、net-seller(農産物を売る農家)の収入は、①売ることによる収入、②投入農地面積当たり一定額の補助金交付(メキシコにおけるPROCAMPO政策)から得ます。
net-buyer(一部の自給分の農産物を作るだけで、農産物を売らない農家。たまに買ったりもする)の収入は、①別の場所で働く収入、②農地を貸す収入、③投入農地面積当たり一定額の補助金交付から得ます。
##複数のミクロがマクロを形成する模様
まず、前提として、4人の農家が予測した価格を基に生産を行い終わったとします。
(以下、分かりづらいですが、1 peso価格が上がったときに需要量が何kg減るのか推計してます。需要の価格弾力性を%で計測している研究ばっかりだったので、1 peso上がったときの需要減少量が計測しづらい、、)
さらに、この市場にアクセスできる人たちの全需要をまとめた需要関数が背後にあると仮定します。
4か月あたりの平均需要量は70,000っぽい(2haのseller3人の初期値でこれだった)ので、それを初期値・基本値とします。
弾力性は-0.55としておくと、価格が1%上がったら0.55%需要が下がるので、
-0.55 = {(D2 - D1) / D1} / {(pt2 - pt1) / pt1}です。
実測値から計算した価格の初期値が0.6 (peso/kg: 前のエントリー参照)なので、D1 = 70,000(kg)としたとき、
価格が0.006(1%) peso 増加した時に需要が385減少するので、価格が1 peso 増加した時に需要は64166 kg 減ります。
よって、需要 = 70000 - 64166 * (pA - pA_pre) という式が得られます(疲れた)。
以下、上記で推計した需要関数=総供給量が成り立つ価格を計算します(需要と供給のマッチング)。
各農家はpythonのclassを使って定義されており、いかに示すコードでは、4人の農家はaというリストに入れられてます。
構造としては、
①各期において基準需要量70,000と今期の総生産量の差を計算して、その値に基づいた価格が返されるようにしてます。
②そのあと、Demandクラスに保存されている市場価格を更新します。
③最後に、確定した価格に基づいて農家に収入をあげます。
ちなみに、①を前期価格との差で計算すると、ハイパーインフレ・デフレが起きて、結果があり得なくなるので、基準値は70,000で固定しました。
# 需要と供給を合わせる関数の定義
def Match(a, Demand):
# ①全農家の生産量の総和を計算
Supply = 0
for i in range(len(a) - 1):
Supply = Supply + a[i].supply
pA_pre = 5024207380 / 8324248200 # メキシコの実際のトウモロコシの価格(≒0.6)
pA_n = (70000 + 64166 * pA_pre - Supply) / 64166
# ③需要の更新と時間・価格のリスト追加
Demand.upgrade_demand(Supply)
if pA_n <= 0:
pAlist.append(0)
else:
pAlist.append(pA_n)
# ④均衡価格に応じた収入をnet-sellerが得る
for i in range(len(a) - 1):
a[i].Sell()
##農家の価格予想
このシミュレーションにおける学習っぽい要素はココです。
前述のとおり、農家は今期に作った農産物を次期の価格で売ります。したがって、価格が未知の状態で生産計画を立てるんですね。
だから、価格を予想する必要があります。
該当コードは、農家クラスの内部の関数として組み込みました。
とりあえず、今回は簡単に以下のような回帰式を最小二乗法で推定して、その式を基に予想価格を形成しました。なお、この価格予想は3期以降のみ適応しました。
(今期の価格) = a0 + a1*(前期の価格)
0期の予想価格は0.6で固定しました。
また、1期と2期については、サンプルサイズが1と2です(厳密には、1期におけるサンプルは、0期初めの価格p0・生産量s1、0期終わりに形成された価格p1・1期の生産量np.nan、2つのサンプルが入ってます。しかし、1期の生産量はまだブランクなので、サンプルサイズは1となります)。
一般的に、説明変数の数はサンプルサイズより小さくないと回帰式は推定できないので、1期については上記の回帰式が推定できません。
2期は推定できそうですが、切片を含んでいるので、何となく切片も説明変数と捉えたときに問題が起きそうなので、推定しませんでした。
ということで、1期と2期については、0期と前期終わりに形成された今期の価格の変化率を0期の価格に乗じることで、予想価格を形成しました。
コードは以下です。
def expect_price(self):
if (1 <= t) and (t <=2):
self.expected_pAlist.append(pAlist[t] * (1 + (pAlist[t] - pAlist[0]) / pAlist[0]))
if 3 <= t:
pAlist_pre = pAlist[:-1]
pAlist_cur = pAlist[1:]
df = pd.DataFrame({"pA":pAlist_cur, "pA_pre":pAlist_pre})
y = df["pA"]
X = df["pA_pre"]
ols_res = sm.OLS(y, sm.add_constant(X)).fit() # OLSで回帰
expected_pA = ols_res.predict()[-1] # 時期のpA予測
if expected_pA < 0: # 予測値が負になったら、価格が0になると予想させる
self.expected_pAlist.append(0)
else:
self.expected_pAlist.append(expected_pA)
#def expect_price終わり
まあ、もっとやろうと思えば、net-sellerの数とか、net-sellerと農地規模の交差項とかを説明変数にできるでしょうね。
しかし、今回はとりあえず簡単に前期からの自己相関を簡単に考慮したという形で終了です。
なお、前期の被説明変数の係数が内生性の問題でバイアスされているという点についても、やろうと思えばry)
次はこっちで宜しくお願いします。