了解弗農·史密斯 1962 年的“競爭市場行為的實驗研究”
Vernon Smith 1962 年的論文“競爭市場行為的實驗研究”模擬了使用學生(他們有一張紙給出了他們的預訂價格)的市場。在其中一項實驗中,需求/供應曲線看起來像左邊的圖表,右邊是相應的市場活動:
由於在實驗中使用學生似乎沒有什麼特別之處(即據我所知,他們只是在執行簡單的計算),因此我決定用 Python 編寫實驗程式碼。我的腳本在這裡。
當我執行腳本(具有與上述相同的需求/供應曲線)時,市場活動通常如下所示:
市場價格確實徘徊在 2.00 美元左右,但我的圖表似乎比原始論文中的圖表更加參差不齊。我試圖弄清楚發生了什麼,特別是是否:
- 我以某種方式錯誤地理解了這篇論文,或者
- 我的 Python 腳本有一些錯誤,或者
- 論文中有某種錯誤或不成文的假設。
我懷疑該結果的原因是您對情況進行建模的方式是通過以統一方式從數字樣本中隨機提供價格(除非我誤讀了程式碼),但這是不現實的。
正如史密斯 1962 年的論文所述:
每個實驗序列都進行了 5 到 10 分鐘長的序列
所以學生們只有 5-10 分鐘的時間來真正完成交易。學生們知道他們自己對這件物品的估價,他們想得到它。
在這種情況下,從價格樣本中隨機選擇價格不符合學生的興趣。相反,學生將從一些更接近他們自己估值的分佈中進行選擇。
我的預測是,如果不是從數組中隨機抽樣價格,而是讓程序從某個分佈中生成數字,該分佈的質量更接近正確價格,您將看到數據的波動性更小。
例如,
random.choice(price_deltas)
您可以使用random.choice(price_deltas, p=weights)
允許您為數字分配權重而不是使用它,這樣一些數字比其他數字更有可能。編輯:
您可以使用上面的重量方法,但我也發現了更簡單的方法。如果假設價格可以是連續的(從經濟理論的角度來看很好,0.01c 實際上只是現實生活中的實際限制),那麼您可以做的就是在開始時跳過創建增量:
import numpy as np import matplotlib.pyplot as plt buyers = [3.25 - 0.25*n for n in range(0, 11)] sellers = [3.25 - 0.25*n for n in range(0, 11)]
接下來你可以做的是
random.choice()
用一些在零處具有最大質量的分佈替換——比如指數分佈。在 python 中,這可以使用 來完成random.exponential()
,因此程式碼只會發生很小的變化,並且會生成更接近交易者實際估值的增量:trading_prices = [] trading_counts = [] for _ in range(5): buyers_still_in_market = list(range(len(buyers))) sellers_still_in_market = list(range(len(sellers))) transactions = [] for _ in range(1000): # First, a random buyer offers to buy at some price below their number on # their card b = np.random.choice(buyers_still_in_market) delta = np.random.exponential(400) buyer_price = max(0, buyers[b] - abs(delta)) s = np.random.choice(sellers_still_in_market) if buyer_price >= sellers[s]: transactions.append((b, buyers[b], s, sellers[s], buyer_price)) buyers_still_in_market.remove(b) sellers_still_in_market.remove(s) trading_prices.append(buyer_price) # Then, a random seller offers to sell at some price above their number on # their card. #0.65 - for log normal s = np.random.choice(sellers_still_in_market) delta = np.random.exponential(400) seller_price = sellers[s] + abs(delta) b = np.random.choice(buyers_still_in_market) if seller_price <= buyers[b]: transactions.append((b, buyers[b], s, sellers[s], seller_price)) buyers_still_in_market.remove(b) sellers_still_in_market.remove(s) trading_prices.append(seller_price) trading_counts.append(len(trading_prices)) print(len(transactions), "transactions") plt.plot(list(range(len(trading_prices))), trading_prices) plt.ylim(0, 4.00) for x in trading_counts: plt.axvline(x=x-1, ymin=0, ymax=4.0, color='red') print("line drawn at x =", x) plt.show() print(trading_prices)
這段新程式碼產生的結果“參差不齊”。以下是一些價格行為與指數分佈的範例(可能不同類型的分佈會產生更好的結果,但它超出了 SE 答案的範圍來檢查)。例如,這裡有 8 個圖表,當價格依賴於指數分佈時: