Как стать автором
Обновить

Эмулятор классического рынка

Время на прочтение12 мин
Количество просмотров3.6K
image

Каждый раз, когда я читаю что-либо об экономике, я постоянно пропускаю момент между “да, конечно, это всё очевидно” и “почему? как вы это получили?”.

Обычно это связано с тем, что примеры, которые можно привести из реальной жизни, либо элементарные, либо настолько сложные, что уже не помогают в понимании.

Но ведь для иллюстрации идей можно какую-нибудь симуляцию сделать? Не совсем из реальной жизни. Выкинуть незначимое, оставить важное и посмотреть, что получится?

Под катом я расскажу, как попытался написать эмулятор простейшей рыночной конкуренции и что в итоге получилось. Будет много графиков.

Что будем делать?


Рассматриваем, для начала, самую что ни на есть классику, всё как любит дедушка Адам Смит: у нас есть покупатели и производители товаров, которые конкурируют между собой.

Классическая теория утверждает, что в отсутствии других факторов (!) конкуренция между продавцами приводит к оптимизации издержек и установлению равновесной цены.

Более того, утверждается, что эта самая равновесная цена будет значительно ниже, чем если бы продавец был бы один (монополия) или несколько (олигополия).

Звучит здраво, логично, интересно. На практике мы, правда, это наблюдаем далеко не всегда. Слишком много дополнительных факторов.

Постараюсь сформулировать основные причины, почему “чистая” конкуренция практически не встречается в реальной жизни:

  • кроме цен товаров, есть ещё понятие качества (иногда именно качество товаров приводится в качестве драйвера конкурентной борьбы), но, в отличие от цены, его гораздо сложнее формализовать
  • продавцы товаров конкурируют не только между собой, но и с продавцами смежных товаров (даже если я очень люблю пиццу, меня можно уговорить купить бургер), а также с универсальным конкурентом “ничего не буду покупать”
  • покупатели находятся не в равных условиях (есть люди богаче, есть беднее, есть более требовательные к качеству, есть менее)
  • производители тоже находятся не в равных условиях (неравенство по капиталам, производственным возможностям, заметности на рынке)
  • производители инвестируют заработанные средства в совершенствование своих производственных мощностей
  • кроме самих участников процесса купли-продажи есть огромное количество внешних факторов (государства, с налогами и пошлинами, географическое сосредоточение, случайные факторы вроде неурожаев, катастроф или спонтанных человеческих решений)

Есть желание попробовать учесть все эти факторы, кроме последнего.

Формализуем задачу


Основные действующие лица:

  • потребители (покупатели, граждане, citizens)
  • фабрики (цеха, производители, продавцы, factories)

Потребители регулярно зарабатывают деньги и имеют потребность в продукте (product).
В нашей модели продукт будет только один. Он удовлетворяет разом всю пирамиду потребностей всех потребителей.

Все фабрики производят продукт, различия только в качестве и цене. Фабрики сами выходят на рынок и продают свой продукт гражданам, обойдёмся без посредников.

Цель потребителей — приобрести наилучший для них продукт, потратив минимум денег.
Цель фабрик — максимизировать свои капиталы.

Кроме того, что продукт у нас всего один, у него ещё есть объективная и прозрачная числовая характеристика его качества. И фабрики, и потребители одинаково это самое качество оценивают. Это свойства продукта, которое появляется вместе с его производством.

У фабрик есть какие-то производственные возможности: себестоимость (затраты, ниже которой продукт производиться не будет) и максимальное качество (значение качества, выше которого произвести продукт не получится).

После раунда продаж, фабрики инвестируют часть своих капиталов модернизацию. Т.к. научно-технический прогресс — штука сложная, алгоритм работает таким образом: каждая фабрика, у которой ещё есть деньги, тратит случайное число денег на случайное изменение своих производственных возможностей (может стать хуже).

Когда у фабрики заканчиваются деньги, она больше ничего не производит.

Полный рыночный цикл выглядит следующим образом:

  1. Фабрики, если могут, производят продукты и демонстрируют их на рынке
  2. Приходят потребители и выбирают наилучший для себя вариант (из доступных для них)
  3. Совершаются сделки
  4. Фабрики совершают модернизацию, если могут

И так — достаточное количество итераций.

Теория гласит, что в таких условиях фабрики будут жестко конкурировать между собой, что приведёт к снижению цены и/или качества продуктов.

Посмотрим, что будет на практике.

Начало реализации


В качестве инструмента для разработки я выбрал python Jupyter Notebook — среду, максимально дружественную к работе с данными, быстрым таблицам и графикам на скорую руку.

Сам процесс эмуляции казался не таким уж страшным, а для подведения результатов хотелось воспользоваться богатым инструментарием pandas.

Код доступен тут

Не думаю, что основная реализация кого-то заинтересует: три класса (фабрика, потребитель и продукт), функции для работы с экземплярами этого класса, функции “рынка”, всё в цикле, всё логируется, результаты пишутся в файл, дальше в дело вступает pandas.

Первые корректировки


Достаточно быстро стало понятно, что в модель можно и нужно вводить неравенство между людьми и между фабриками.

Отмечу сразу, на всякий случай, что названия распределений ниже условные, они взяты в кавычки и являются просто сжатой метафорой. Цели высмеять чьи-то политические убеждения или, тем более, продемонстрировать свои, не ставилось.

Попробовал несколько моделей распределения показателей:

  • “коммунизм” — у каждого объекта какое-то случайное число, распределение вероятностей — равномерное
  • “развитой социализм” — всё то же самое, распределение вероятностей нормальное (у большинства средняя зарплата)
  • “современное общество” — “хвостатое” распределение вероятностей (миллионеры на большем расстоянии от средней зарплаты, чем нищие), функция random.gammavariate

Если для примера взять потребителей, то вид распределения их зарплат напрямую влияет на форму т.н. “кривой спроса” (зависимость доли людей, готовых купить товар, в зависимости от его цены):
image
Кривая спроса для трёх распределений дохода населения: “коммунизм” (equal), “развитой социализм” (normalize) и “современное общество” (gamma).

Как видно, в случае равномерного распределения кривая спроса превращается в ломаную спроса (вероятность купить 1 при цене товара меньше минимальной зарплаты, потом линейно уменьшается).

В случае равномерного распределения доходов кривая спроса становится похожа на сигмоиду.
В случае же распределения доходов, похожего на настоящее, сигмоида становится асимметричной. И становится более похожей на кривые спроса из учебников экономики:

image

Значит ли это, что в самой логике кривой спроса заложено неравенство в доходах? Нет, там же миллион факторов. Но мы можем грубо обобщить, сказав, что неравномерность в “силе спроса” (кто-то готов переплатить за чебурек, кто-то готов стоять час в очереди, а кто-то нет) распределена примерно так же, как и реальные доходы населения.

По аналогии можно построить кривую предложения.

Кривая предложения в данном случае — сколько заводов при каких ценах готовы производить продукт заданного качества.

Если мы возьмём 50 заводов, то кривая получается с большим число разломов, а при большом числе — стремится к прямой.

image
Кривая предложения для k=50 заводов

image
Кривая предложения для k=1000 заводов

Для получения кривой из учебника, требуется а) много продавцов, б) равномерное распределение по себестоимости.

Это неочевидно, интересно и требует дополнительно интерпретации.

Итак, первая победа.
У нас есть какие-то бледные подобия кривых спроса и предложения из учебников.

Закладываем неравенства и двигаемся дальше.

В большинстве случаев для распределений я заложил гамма-распределения (которые “хвостатые”):

  • доходы граждан (см. график ниже, средняя зарплата 25, минимальная 5, максимальная 160 )
  • стартовые капиталы фабрик (см. график, логика та же, разброс меньше)
  • производственные возможности фабрик (предел качества от 2 до 30, себестоимости — от 1 до 5)
  • шансы на успешную модернизацию (а вот они распределены нормально)


image
Стартовые условия граждан в модели (по горизонтали сумма зарплаты, по вертикали — число граждан, которые имеют такие доходы)

image
Стартовые капиталы фабрик в модели (по горизонтали капиталы, по вертикали — число фабрик, располагающих такими средствами)

Особенности национальной модернизации


Если бы у нас не было никаких изменений, долговременное моделирование не имело бы большого смысла. Модернизация означает, что фабрики будут пытаться конкурировать между собой. Тем, у кого большие продажи (стартовые капиталы, хорошие условия) не получится долго почивать на лаврах, конкуренты быстро приблизятся по цене и качеству производимых товаров.

Тем не менее, быстро стало понятно, что фабрикам нужна “память”. Часто получалось так, что успешная фабрика начинала цикл отрицательных модернизаций и теряла всё.
Поэтому пришлось добавить такую логику в алгоритм: если до модернизации были продажи, а после неё пропали, то следующий раунд модернизации будет в формате “откатываем всё назад”.

Параметры первой серьёзной эмуляции


Стартовые условия:

  • число жителей, N=2000
  • число заводов, k=50
  • число раундов в модели, после которой смотрим результаты R=30
  • чуть-чуть логики и много рандома

Результат пишем в два файла: лог граждан и лог фабрик.

Данные первого лога:

image
где
id — id купленного товара (надо было нормально назвать)
citizen_id — уникальный номер гражданина,
period — номер раунда эмуляции
money — его зарплата на этом раунде,
quality и price — качество и цена товара, который он купил в этом раунде (-1 в случае, если не купил ничего)

Второй лог

image
где
id — id фабрики,
period — номер раунда эмуляции,
capital — капитал фабрики на данном раунде,
pur — число продаж в этом раунде,
price — цена продажи
cost, quality — себестоимость и качество соответственно
lag — данные прошлого раунда

Кажется, пора смотреть результаты.

Смотрим результаты


Какой результат хочется посмотреть в первую очередь? Наверное, сколько заводов разорилось, не сумев выставить на рынок интересное предложение.

Итог такой.

  • Совсем разорились (ушли в минус) — один завод. Sad but true.
  • Нет денег на модернизацию — 45 заводов. Это почти разорились. Но если вдруг на их товар внезапно появится спрос, они, теоретически смогут выкарабкаться.
  • Есть капиталы, нет продаж — 3 завода. Когда-то у них всё было хорошо, но потом их отстранили конкуренты.
  • Есть капиталы, есть продажи — 2 завода. Один продаёт дорого товар максимального качества, другой — очень дёшево приемлемого качества. Картельный сговор, поделили рынок, вот это всё.

Хотя бы одну продажу за 30 раундов имели 11 заводов.

В динамике всё чуть сложнее. Данных много.

С теми заводами, у которых с продажами не получилось, как в счастливых семьях — всё примерно одинаково. Разница только в скорости падения.

image
Динамика изменения капитализации тех заводов, у которых не случилось продаж: все начинали из разных стартовых условий, тратили разные суммы на модернизацию, но итог один: все свалились “в ноль” или барахтаются около него.

Интереснее, но и сложнее с более счастливыми “семьями” — у кого продажи всё-таки сложились.

image

У нас есть чемпион, у которого всё хорошо (id=11) — есть продажи, капитал растёт. Но для того, чтобы найти свою аудиторию, потребовалось 7 ходов.
Единственный конкурент, имеющий продажи (id=0) смог выйти только на третье место по капиталу. Второе место (id=20) с 10 раунда почивает на лаврах и медленно теряет деньги. Остальные теряют деньги быстрее.

Стоит отметить, что наши лидеры по начальным условиям занимали разное положение. Второе место по капиталам “в итоге” (id=0) был абсолютным лидером по начальным капиталам, “победитель на рынке ширпотреба” (id=20) был в гуще лидеров, а вот “чемпион” занимал только 11 место по первоначальным накоплениям.

Кажется, ещё интересно посмотреть динамику продаж самих по себе.

image
Динамика числа продаж в разбивке по фабрикам.
По-горизонтали: номер раунда. По-вертикали — число потребителей (из 2000), которые делали покупки (у разных фабрик разные оттенки).


На что стоит обратить внимание?

Во-первых, на первом ходу далеко не все жители могли себе позволить купить хоть что-то (очевидно, это люди с минимальными доходами). Достаточно быстро это число сократилось до нуля, потом снова просело, а потом вышло на 100% снабжение.

Во-вторых, какая-то конкуренция была достаточно долго. На первом ходу 6 фабрик имели продажи, на четвёртом — 7, на пятнадцатом — 4. Долго было 3 продавца (у одного совсем микроскопические продажи) и только к 27 ходу его окончательно “отстранили от рынка”.

Кажется, стоит немного увлечься “ошибкой выжившего”?

Посмотрим на наших чемпионов подробнее?

Id=11 (top-1 по продажам и капиталу) “с раздачи” имел приемлемое качество, но высокую цену (price=37, при медианной зарплате в 27.5, т.е. большинство не могли себе позволить купить эту продукцию). Получил 8 процентов рынка. Сделал приемлемую в целом модернизацию — увеличил качество и поднял цену. Получил ноль продаж. Откатился назад. Получил почти 30% рынка (очевидно тут помогли провалы конкурентов). Сделал идеальную модернизацию — увеличил качество и снизил цену. Получил ноль продаж, увы, в этот момент вышли предложения ещё лучше. Для того, чтобы получить продажи потребовалась серия из 4 модернизаций “хотя бы не назад”. К девятому ходу предложение уже выглядело отличным — товар с качеством 43 за 21 (пользователи это отметили, давая ему две трети рынка). Но резкое поднятие цены — и снова ноль продаж. Затем три планомерных тренда: качество — лучше, цена — ниже, продажи — выше.

image
Динамика изменения основных параметров предложения фабрики id=11 (top-1 по продажам и капиталу).

Пик “карьеры” — 21 ход, 99% рынка, но стоит чуть-чуть поднять цену — и конкуренты тут как тут.

Единственный выживший по продажам, кроме лидера, имел с самого начала низкие цены и низкое качество. Продажи имел нерегулярно, основной вектор модернизации имел на снижении цен. Стабильность получил только на 25 ходу, когда при качестве в 31 смог продавать товар за 3. С тех пор он прочно занял свою нишу и успешно воюет за “низший средний класс”.
Пик “карьеры” — последний ход, 41% рынка.

Интересно, что случилось бы, если бы симуляция продолжилась ещё пару десятков ходов?

image
Динамика изменения основных параметров предложения фабрики id=0 (top-3 по капиталу, имеет продажи к концу симуляции).

Текущий top-2 по капиталу (id=20), не имеющий продаж последние 10 раундов был лидером по стартовым капиталам (поэтому и не смог потерять всё за 30 ходов), производил умеренно плохой умеренно дешёвый товар. Удачная модернизация качества позволила получить хорошие продажи и достаточно долго их держать. Ухудшение качества долго не сказывалось на доходах, т.к. цена снижалась. Всё закончилось на 20 ходу. Хорошая модернизация не спасла. Наверное, это обидно, иметь стабильные 10% рынка, одновременно улучшить качество и цену и потерять продажи (id=0 вышел с ещё более эффективной модернизацией).

Никакие дальнейшие действия не помогли ни вернуть старую аудиторию, ни найти новую. Тем не менее, от полного разорения фабрику отделяет от 8 до 20 раундов. Время, достаточное для того, чтобы могло наконец-то повезти.

image
Динамика изменения основных параметров предложения фабрики id=20 (top-2 по капиталу, не имеет продаж последние 10 раундов).

Кажется, какая-то закономерность прослеживается. Фабрики, которые предлагают более качественный товар по низким ценам процветают. Остальные умирают.

Посмотрим, как изменился рынок со стороны потребителя за 30 ходов.

image
Соотношение цена-качество на начальном этапе. Приводится 50 предложений продуктов на рынке.
По-горизонтали — цена продукта, по-вертикали — его качество.
Синим отмечен “выбор пользователя”, т.е. те продукты, у которых на этом раунде были продажи.


Тут хорошо видно, насколько в неравных условиях находятся фабрики. Кто-то может не делать ничего и иметь хорошие показатели. Фабрикам же “из правого нижнего угла” потребуется существенно больше действий для того, чтобы найти своего потребителя.

Как изменится картина к концу симуляции?

image
Соотношение цена-качество к концу симуляции. Синим отмечен “выбор пользователя”.

Если в начале большинство покупало товар качеством 26 за 18 (при этом были те, кто покупал товар качеством 30 за 42 и товар качеством 15 за 7), то в конце большинство покупает товар качеством 57 за 24 (а часть — товар качеством 28 за 1.16). Изменения налицо!

А как это выглядело в динамике?

image
Динамика изменения цены продаваемых товаров.
По горизонтали номер раунда, по вертикали — цена продажи, каждая фабрика отмечена отдельным цветом, чем больше радиус окружности, тем больше объём продаж.


Интересно, но в этой симуляции “премиальный” ценовой сегмент (из-за которого не было большого смысла смотреть среднюю цену или среднее качество) пропал как таковой.
Связано это оказалось с тем, что качество “масс- маркета” сравнялось с качеством “премиальных продуктов” достаточно быстро.

image
Динамика изменения качества продаваемых товаров
По горизонтали номер раунда, по вертикали — качество продукта, каждая фабрика отмечена отдельным цветом, чем больше радиус окружности, тем больше объём продаж.


Т.е. с точки зрения пользователя стало лучше. Теория торжествует.

Теперь давайте посмотрим, каково стало жить фабрикам. То, что большинство не заработало, это понятно. Интересно, каковы шансы сделать хорошее действо (опустить цены, улучшить качество) и получить улучшение в продажах.

Итак, модернизация №1: снижение цен.

По условию, шанс уйти в нужную сторону 25% (столько же — в обратную, в остальных случаях, модернизация будет по другому параметру).

Если ты всё сделал правильно, шансы улучшения продаж составят 14% (43 исхода из 310) и ещё 5% на то, что станет хуже (но и 3% шансов улучшения продаж при росте цен).
Почти всегда это обуславливается плохой исходной позицией. Но несколько раз это было связано с тем, что и конкуренты не стояли на месте.

Модернизация №2: улучшение качества.

Шансы уйти в правильную сторону те же.

Шансы на улучшение в случае правильных действий — те же 14%, а вот шанс на ухудшение выше — 9% (и 7% шанс на улучшение при движении не в правильную сторону).

Кажется, это не математический эффект. Возможно, просто игра малых чисел.

Остался ещё один вопрос.

У нас “выжило” немного фабрик, большинство разорилось. Неизбежно ли это?

Стоит прогнать ещё пару симуляций, но кажется, что да.

Только дело не в рынке, экономических законах и статистике. Дело в алгоритме выбора.

У нас сейчас выбор пользователя — явная функция от его зарплаты, цены и качества продукта. Соответственно у товара, который хуже идеального на одну миллионную, в текущей модели нет ни единого шанса — все 100% рынка достанутся идеальному товару.

В реальной жизни на выбор пользователя оказывают влияние случайные факторы. Их можно было бы заложить.

На этом пока всё.

Выводы кратко


Неэкономические выводы:

  • Играть с такими моделями весело
  • Крутить данные можно очень по-разному
  • Хорошо, когда всё залогировано

Экономические выводы:

  • Кажется, в классической экономической модели неравенства стартовых условий заложены изначально
  • Кривые спроса и предложения, похожие на учебные, построить можно, но кривыми (а не ломаными) они будут при очень большом количестве как покупателей, так и продавцов
  • В целом, основные положения теории (конкуренция среди продавцов ведёт к улучшению условий покупателей) верны
  • Стартовые условия сильно влияют на итоговый результат, но не предопределяют его
  • Конкуренция в условиях неравенства ведёт к сегментации рынка (на “премиум сегмент” и “масс-маркет” как в нашем примере)
  • Судя по всему, при полностью детерминированном выборе конкуренция ведёт к олигополии

Дальнейшие планы


  • Сделать ещё несколько симуляций при разных стартовых условиях (в том числе дать фабрикам побольше времени)
  • Перейти к усложнениям
  • ввести связь между качеством товара и его ценой,
  • ввести какую-то функцию маржинальности (разница между ценой продажи и себестоимостью как функция качества товара)
  • ввести несколько типов продуктов и придумать логику их связи между собой
  • устроить граждан “работать на завод”, чтобы при разорении завода падал потребительский спрос
  • внести случайность в выбор пользователем продукта
Теги:
Хабы:
Всего голосов 11: ↑11 и ↓0+11
Комментарии12

Публикации

Истории

Работа

Data Scientist
68 вакансий

Ближайшие события

2 – 18 декабря
Yandex DataLens Festival 2024
МоскваОнлайн
11 – 13 декабря
Международная конференция по AI/ML «AI Journey»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань