Sospecho que la razón de ese resultado es la forma en que modeló la situación, haciendo que los precios se ofrezcan al azar a partir de una muestra de números de manera uniforme (a menos que esté leyendo mal el código), pero esto es poco realista.
Como se menciona en el documento de Smith de 1962:
cada secuencia de experimentos se realizó en secuencias de cinco a diez minutos de duración
Así que los estudiantes sólo tuvieron entre 5 y 10 minutos para concluir los oficios. Los estudiantes conocían su propia valoración del artículo y querían conseguirlo.
En esta situación, a los estudiantes no les interesa elegir un precio al azar de la muestra de precios. En lugar de ello, los estudiantes elegirán entre una distribución que tenga una masa más cercana a su propia valoración.
Mi predicción es que si en lugar de hacer un muestreo aleatorio de los precios de la matriz dejas que el programa genere números a partir de alguna distribución que tenga más masa cercana al precio correcto verás menos volatilidad en los datos.
Por ejemplo, en lugar de utilizar random.choice(price_deltas)
puedes usar random.choice(price_deltas, p=weights)
que permite asignar pesos a los números para que algunos sean más probables que otros.
EDITAR:
Usted podría utilizar el enfoque de peso anterior, pero también descubrí uno mucho más simple. Si estás bien asumiendo que los precios pueden ser continuos (que desde el punto de vista de la teoría económica está bien 0,01c es realmente sólo límite práctico en la vida real), entonces lo que puedes hacer es omitir la creación de deltas en el inicio:
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)]
Lo siguiente que puedes hacer es sustituir random.choice()
con alguna distribución que tenga la mayor parte de la masa en cero - como la distribución exponencial . En python esto se puede hacer usando random.exponential()
De este modo, el código cambiaría mínimamente y generaría deltas más cercanos a la valoración real de los operadores:
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)
Este nuevo código produce resultados mucho menos "irregulares". Aquí hay algunos ejemplos del comportamiento de los precios con la distribución exponencial (posiblemente diferentes tipos de distribución darían mejores resultados, pero está más allá del alcance de la respuesta de SE para examinar eso). Por ejemplo, aquí hay 8 gráficos generados cuando los precios dependen de la distribución exponencial:
1 votos
No soy un experto en el análisis de los códigos de Python, pero sospecho que el algoritmo de decisión/comercialización particular fue la razón de la volatilidad sostenida. Ayudaría si pudieras describir verbalmente los algoritmos de decisión en tu script.
0 votos
Se puede cambiar el nombre de "reproducción de la distribución" en lugar de "comprensión" para obtener una opinión más especializada.
0 votos
Sólo se puede responder a la pregunta que se hizo, no a la pregunta que se pretendía hacer - eso no hace que la retroalimentación sea menos especialista - dicho esto, hice algunos ajustes a su código que redujeron la "irregularidad" - sin embargo, como la respuesta de HerK explica que no hay mucho que se pueda hacer con el comercio aleatorio puro - una alternativa sería especificar los agentes a través de algún modelo + AI / algoritmo de aprendizaje - sin embargo eso es demasiado tiempo para codificar todo desde la nada para una respuesta SE