6 votos

Entender el "Estudio experimental del comportamiento del mercado competitivo" de Vernon Smith de 1962

El artículo de Vernon Smith de 1962 "An Experimental Study of Competitive Market Behavior" simula un mercado con estudiantes (que tienen un papel con sus precios de reserva). En uno de los experimentos, las curvas de demanda/oferta se parecen al gráfico de la izquierda, con la correspondiente actividad del mercado a la derecha:

chart 1 from Smith's paper

Como no parece haber nada especial en el uso de los estudiantes en el experimento (es decir, por lo que puedo decir, sólo están realizando cálculos simples), decidí codificar el experimento en Python. Mi script es aquí .

Cuando ejecuto el script (que tiene las mismas curvas de demanda/oferta que el anterior), la actividad del mercado suele tener este aspecto:

my plot

El precio de mercado ronda efectivamente los 2 dólares, pero mi gráfico parece notablemente más irregular que el del documento original. Estoy tratando de averiguar lo que está pasando, en particular si:

  1. Estoy entendiendo el papel incorrectamente de alguna manera, o
  2. Mi Python script tiene algún error, o
  3. Hay algún tipo de error o suposición no escrita en el documento.

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

4voto

Coincoin Puntos 12823

Gode y Sunder (1993) registró un resultado similar al suyo. El resumen del artículo dice:

Presentamos experimentos de mercado en los que los comerciantes humanos son sustituidos por programas de "inteligencia cero" que presentan ofertas y pujas aleatorias. La imposición de una restricción presupuestaria (es decir, no permitir que los comerciantes vendan por debajo de sus costes o compren por encima de sus valores) es suficiente para elevar la eficiencia asignativa de estas subastas hasta casi el 100%. La eficiencia asignativa de una subasta doble se deriva en gran medida de su estructura, independientemente de la motivación, la inteligencia o el aprendizaje de los comerciantes. La mano invisible de Adam Smith puede ser más poderosa de lo que algunos han pensado; puede generar racionalidad agregada no sólo a partir de la racionalidad individual, sino también de la irracionalidad individual.

En concreto, Gode y Sunder consideran dos algoritmos de comercio. El primer algoritmo genera ofertas y demandas a partir de una distribución uniforme en un intervalo fijo, digamos $[L,U]$ independientemente de los valores de reserva de los comerciantes. Los autores denominan a estos comerciantes como comerciantes de inteligencia cero sin restricciones (ZI-U). En el segundo algoritmo, las ofertas se extraen de $\mathrm{unif}[L,v]$ y las preguntas se extraen de $\mathrm{unif}[c,U]$ , donde $v,c$ son los valores de reserva de los compradores y vendedores respectivamente. Los comerciantes que siguen este segundo algoritmo se denominan comerciantes de inteligencia cero restringida (ZI-C).

La siguiente figura (junto con varias otras en el documento con diferentes parámetros de mercado) muestra que los operadores ZI-U generan una volatilidad de precios más sostenida que los operadores ZI-C, que a su vez se asemejan a los operadores humanos en las mismas condiciones de mercado. Así que sospecho que la volatilidad sostenida que observaste en tu código se debió al hecho de que utilizaste límites uniformes en la generación aleatoria de oferta/demanda en lugar de imponer una restricción presupuestaria a los operadores.

enter image description here

0 votos

Gracias, ¡aprecio esta referencia! (Encontré el artículo de Smith mencionado en mi libro de texto de economía 101 sin ninguna referencia a otra literatura desde entonces, y soy demasiado novato en economía para encontrar rápidamente los artículos relevantes).

1 votos

@riceissa: De nada. También puedes referirte a Duffy's capítulo en el Manual de economía computacional para otros desarrollos relacionados en la literatura.

3voto

Matthias Benkard Puntos 11264

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:

enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here

0 votos

¡Gracias! Estoy convencido de que es la forma en que se eligen los deltas lo que provoca las irregularidades. Sin embargo, cuando utilizo deltas exponenciales, los precios de negociación parecen seguir oscilando entre 1,5 y 2,5, igual que en mi gráfico original. Creo que la reducción de las irregularidades en tu gráfico no se debe a que los precios sean más estables en torno al precio de equilibrio, sino a que hay menos operaciones (no hay mucho espacio para las irregularidades cuando sólo se realizan 2-3 operaciones en un solo período).

0 votos

@riceissa no guardé la salida posterior, pero sé con certeza que la volatilidad de los precios bajó porque realmente calculé la volatilidad de los precios en base a la lista del final, la comparé con la original y, y fue menor en esta nueva que en el script original.

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X