« 前のひとこと | トップページ | 次のひとこと »

cocolog:89931312

Python による「ミクロ経済学の我流シミュレーション」の記事の「その2」を書いた。スコアを取るとき、利益を足し合わせるだけでなく、バランスを取るために分散を足すようにした。はっきり言ってやってることのレベル低くて申し訳ない…。 (JRF 4256)

JRF 2018年9月 9日 (日)

ミクロ経済学の我流シミュレーションの「その1」に関するひとことは [cocolog:89067097]。

その1の記事は

《ミクロ経済学の我流シミュレーション その1 基礎経済モデル》
http://jrf.cocolog-nifty.com/society/2018/03/post.html

JRF2018/9/96919

その2の記事は

《ミクロ経済学の我流シミュレーション その2 バランス戦略》
http://jrf.cocolog-nifty.com/society/2018/09/post.html

アーカイブは

《micro_economy.zip》
http://jrf.cocolog-nifty.com/archive/python/micro_economy.zip

JRF2018/9/98482

……。

詳しくは記事を読んでもらうとして、こちらではやろうとしてやらなかったことを延べたい。

それは、その2の記事の λ と μ について。

JRF2018/9/92526

まず、λ について。

<pre>
スコア1 = - mean([r_N, r_L, r_I]) + λ * variance([r_N, r_L, r_I])
</pre>

JRF2018/9/98781

という式だが、分散を足すのに、math.sqrt をかけたほうがいいのか、そのまま足したほうがいいのかでまず迷ったが、そのまま足す形の関数が『Strategic Asset Allocation - Portfolio Choice for Long-Term Investers』([cocolog:86393544])でも紹介されているので、この形にした。その本では必ずしも、最適化のスコアとして用いていたわけではなかったが…。

JRF2018/9/93607

で、λ の値は、最初、m = mean([r_N,r_L,R_I]) とすると、r_N = 3m/2, r_L = 3m/4, r_I = 3m/4 などとなるときに スコア1 = 0 とおいた値である 16/(3 * m) を λにすることを考えた(sympy で解を確認)。その r_N,r_L,r_I のところで偏微分すると具合も良かったから。

JRF2018/9/94538

ただ、r_* はマイナスになることもあるため、そのままでは使えない。そこで、大きい値の場合は、そのままだが、小さな値やマイナスだと丸める関数 softPlusE という関数を定義し、λ = 16 / (3 * softPlusE(0.01, mean([r_N, r_L, r_I]))) としてみた。

JRF2018/9/99631

ちなみに softPlusE の定義は、

<pre>
def softPlusE (M, m):
if m / M > 100:
return m
else:
return math.log(math.e + math.exp(m / M)) * M
</pre>

JRF2018/9/97272

だいたいいい感じなのだが、でも、r_* の値はだいたい 1.0 から -1.0 までの間なので、そんなこった関数ではなく定数で十分なのではないかといういい気がしてきた。そこで λ をだいたい 100.0 に決めうちしてしまうと、そのほうがなぜかシステムもクラッシュを起こしにくくなった。そこで λ = 100.0 に決めた。

JRF2018/9/90338

……。

μ については、スコア1が小数点 1 位か2位以下の問題のようなので、だいたいそれぐらいになるようにということで、まずは (労働需要 - 労働供給) ** 2 / mean([労働需要,労働供給]) にしてみた。

micro_economy_3*.py はそれでよかったが、micro_economy_4*.py だと、ときどき、(労働需要 - 労働供給) の絶対値が 100 を超える場合が出てくる。おかしい…っていうんで、係数をかけて大きくしたりしてみたがやっぱりおかしい。

JRF2018/9/91499

それで、試しに固定してみようと μ * (労働需要 - 労働供給) ** 2 にして μ = 0.1 にすると micro_economy_4*.py では割とうまくいった。しかし、今度は micro_economy_3*.py に戻るとうまくいかない。

μ = 0.01 にすると、micro_economy_3*.py でも micro_economy_4*.py でもそこそこよくなったので、そう決めうちすることにした。

JRF2018/9/95237

……。

…とまぁ、そんなところ。

「その2」の記事に今後の課題として「過去実績とのバランスをとる」ことを書いたが、他に、新規参入を全分野で一期一社のみとする代わりに、時間要素を取り入れ、一期の時間幅を変動させることも考えたりしている。しかし、その場合、退出して企業数が 0 になる場合の強制参入について、これまでと違う論理が必要になり、どう攻めればいいのか思いついていない。

JRF2018/9/98241

「その2」でも書いたが、もしかすると最適化はこんなテキトーな感じで使っていいものではないのかもしれない。そのあたり私は修行が足りな過ぎるな…と思う。そんな状態で記事を公開して、なんか恥ずかしく申し訳なく感じる…。

JRF2018/9/91886

« 前のひとこと | トップページ | 次のひとこと »

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/93568/67149207

トラックバックのポリシー

他サイトなどからこの記事に自薦された関連記事(トラックバック)はまだありません。

このころのニュース