randomtrade.py 技術ドキュメント
プログラムの動作
randomtrade.py は、ランダムな取引によって人々の持つお金の分布がどのように変化するかをシミュレーションし、その統計的結果をリアルタイムで可視化するPythonプログラムです。このプログラムは、経済物理学における単純な富の再分配モデルに基づいています。
プログラムの主な機能は以下の通りです。
初期化: 全ての参加者(人数は設定可能)が均等な金額(平均値も設定可能)を持つ状態からシミュレーションを開始します。
ランダムな取引: 各シミュレーションサイクルにおいて、参加者の中からランダムに一人を選び、さらに別のランダムな参加者を選びます。最初の参加者は、設定された取引額(またはその人が持つ全額のうち少ない方)を2番目の参加者に渡します。このプロセスが指定された回数繰り返されます。
リアルタイム可視化: シミュレーションの進行に応じて、3種類のグラフが定期的に更新表示されます。
各参加者が現在保有する金額の棒グラフ。
各参加者の保有金額を昇順にソートした棒グラフ。
保有金額の分布を示すヒストグラムと、後述する理論的な指数分布との比較プロット。
パラメータ設定: 人数、初期平均金額、取引額、シミュレーション回数、グラフ更新間隔などの主要なパラメータは、コマンドライン引数を通じて柔軟に設定できます。
このプログラムは、多数の相互作用するエージェントが存在するシステムにおいて、ランダムなプロセスがどのように集団的な分布を形成するかを直感的に理解するのに役立ちます。
原理
このプログラムは、経済物理学におけるランダムな富の交換モデルに基づいています。このモデルでは、多数の個人が互いにランダムに富を交換するプロセスをシミュレートします。このような単純なモデルであっても、最終的には個人の富の分布が統計的な定常状態に収束することが知られています。
この定常状態での富の分布は、物理学におけるボルツマン分布と数学的に類似した指数分布に従います。ボルツマン分布は、多数の粒子がランダムにエネルギーを交換するシステムにおけるエネルギー分布を表すものであり、ここでは富(お金)をエネルギー、平均金額をシステムの温度の逆数と見なすことができます。
具体的には、富 \(v\) を持つ個人の数密度 \(f(v)\) は、以下の指数関数で表されます。
ここで、\(A\) と \(b\) は定数です。
\(b\) は平均金額の逆数として定義されます。 $\( b = \frac{1}{\text{平均金額}} \)$ これは、各参加者の初期金額 (
value) に対応します。\(A\) は分布が正規化されるための係数であり、参加者の総数 (
npersons) と \(b\) を用いて以下のように定義されます。 $\( A = \text{npersons} \cdot b \)$
シミュレーションでは、初期の均等な富の分布から開始し、ランダムな取引を繰り返すことで、実際の富の分布(ヒストグラム)がこの理論的な指数分布に徐々に近づいていく様子が観察できます。特に、一部の参加者が多額の富を蓄積し、多くの参加者が比較的少ない富を持つという、現実の経済における所得格差のような状況が自然に発生することを示唆しています。
必要な非標準ライブラリとインストール方法
このプログラムは、グラフ描画のために matplotlib ライブラリを使用しています。これはPythonの標準ライブラリではないため、事前にインストールが必要です。
以下の pip コマンドを使用してインストールできます。
pip install matplotlib
必要な入力ファイル
このプログラムは、外部の入力ファイルを必要としません。 すべての設定パラメータは、プログラム内のグローバル変数としてデフォルト値が設定されており、必要に応じてコマンドライン引数を通じて変更できます。
生成される出力ファイル
randomtrade.py は、シミュレーション結果を直接ファイルに保存することはありません。代わりに、matplotlib を使用して、シミュレーションの進行状況をリアルタイムで表示するグラフィカルなウィンドウを生成します。
生成されるグラフウィンドウには、3つのサブプロットが含まれます。
上段 (ax1):
タイトル:
Random trade (i = [現在のイテレーション数]/[最大イテレーション数], n=[人数], avg=[平均金額])X軸: 参加者のインデックス
Y軸: 各参加者が保有する現在の金額
初期平均金額を示す赤色の点線が描画されます。
このグラフは、各参加者の金額がどのように変動し、格差が拡大していくかを示します。
中段 (ax2):
X軸: 参加者のインデックス(ソート後)
Y軸: 各参加者が保有する金額(昇順にソート済み)
初期平均金額を示す赤色の点線が描画されます。
このグラフは、富の格差の拡大をより明確に示し、一部の富裕層と多数の貧困層が存在する構造を視覚化します。
下段 (ax3):
X軸: 金額
Y軸: 頻度 / 金額 (分布関数の値)
ランダムトレードによる現在の金額分布(ヒストグラム)が青線でプロットされます。
理論的な指数分布 \(f(v) = A \cdot \exp(-b \cdot v)\) が赤色の破線でプロットされます。
このグラフは、シミュレーションが進行するにつれて、実際の分布が理論的な指数分布に近づいていく様子を示します。
シミュレーションが完了すると、コンソールに「Press ENTER to exit>>」と表示され、Enterキーを押すまでグラフウィンドウは開いたままになります。ユーザーは、表示されているグラフを手動で保存することができます。
コマンドラインでの使用例 (Usage)
randomtrade.py は、以下の書式でコマンドラインから実行できます。
python randomtrade.py npersons value(average) vtrade n(maxiteration) n(plotinterval) n(distribution func)
各引数の説明は以下の通りです。
npersons: シミュレーションに参加する人数 (整数)デフォルト: 50
value(average): 各参加者が最初に持つお金の量、および全体の平均金額 (整数)デフォルト: 50
vtrade: 各取引で交換されるお金の量 (整数)デフォルト: 1
n(maxiteration): シミュレーションの最大反復回数 (整数)デフォルト: 500
n(plotinterval): グラフを更新するサイクル間隔 (整数)デフォルト: 100
n(distribution func): 分布関数を計算する際のX軸のメッシュ数 (整数)デフォルト: 21
いずれかの引数を省略した場合、それ以降の引数もデフォルト値が使用されます。例えば、npersons だけを指定すると、それ以外の引数はデフォルト値が適用されます。
コマンドラインでの具体的な使用例
人数を増やし、反復回数を多く設定した具体的な使用例を以下に示します。
python randomtrade.py 200 50 1 10000 100 21
実行結果の説明
このコマンドを実行すると、以下の設定でシミュレーションが開始されます。
npersons: 200人value(average): 50ドル(初期平均金額)vtrade: 1ドル(各取引での交換額)n(maxiteration): 10000回(最大反復回数)n(plotinterval): 100回(グラフ更新間隔)n(distribution func): 21(分布関数のX軸メッシュ数)
実行が開始されると、matplotlib によるグラフウィンドウが表示され、シミュレーションの経過がリアルタイムで可視化されます。100サイクルごとにグラフが更新され、以下の変化が観察できます。
上段・中段のグラフ: 時間の経過とともに、参加者間のお金の格差が拡大していく様子が視覚的に分かります。一部の参加者が多額の金額を保有し、多くの参加者は少額の金額しか持たなくなっていきます。特に中段のソートされたグラフでは、この格差がより明確に表現されます。
下段のグラフ: シミュレーションが十分な回数繰り返されると、各参加者の保有金額のヒストグラム(青線)が、理論的な指数分布(赤色の破線)に非常によく近似していく様子が確認できます。これは、ランダムな取引によって、システムの統計的な定常状態が指数分布で記述されることを示しています。
シミュレーションは合計10000回の反復を行った後、グラフウィンドウは開いたままとなり、コンソールに「Press ENTER to exit>>」と表示されます。Enterキーを押すことでプログラムが終了し、ウィンドウが閉じます。