理想市场的简易模拟

本文最后更新于 2024年8月28日 下午

一、问题描述

用户提出编写一个程序来模拟小型市场,该市场中有买家和卖家两类主体,需遵循特定的交易规则,并以交易轮数为横轴、同一轮中的平均交易价格为纵轴绘制图表。

二、市场主体特征

(一)买家

交易价格上限:
价格上限均匀分布在区间 [buyer_price_min, buyer_price_max] 内。例如,若设定buyer_price_min = 50,buyer_price_max = 150,则每个买家的价格上限是在这个区间内随机生成的值。
当交易价格超过上限时,交易无法完成。
预期价格:
买家希望尽可能以低于预期价格的价格完成交易。
初始预期价格为交易价格上限的 0.8 倍。比如,若某买家的价格上限为 120,则其初始预期价格为 120 * 0.8 = 96。

(二)卖家

交易价格下限:
价格下限均匀分布在区间 [seller_price_min, seller_price_max] 内。例如,当seller_price_min = 80,seller_price_max = 180时,每个卖家的价格下限在这个区间随机产生。
当交易价格低于下限时,交易无法完成。
预期价格:
卖家希望尽可能以高于预期价格的价格完成交易。
初始预期价格为交易价格下限的 1.2 倍。例如,若某卖家的价格下限为 100,则其初始预期价格为 100 * 1.2 = 120。
以下用表格总结市场主体特征:

主体 特征描述 具体示例
买家 交易价格上限在 [buyer_price_min, buyer_price_max] 内,初始预期价格为上限的 0.8 倍 价格上限区间 [50, 150],某买家上限为 110,预期价格为 88
卖家 交易价格下限在 [seller_price_min, seller_price_max] 内,初始预期价格为下限的 1.2 倍 价格下限区间 [80, 180],某卖家下限为 130,预期价格为 156

三、市场运作规则

(一)交易单位

分为轮和次,一轮交易时段中有多次交易。

(二)交易过程

在一轮交易时段内:
所有买家依次随机接触不同的卖家,接触的卖家数量为卖家总数的 10% - 50%。例如,若有 30 个卖家,那么买家可能接触的卖家数量在 3 到 15 个之间。
当买家接触卖家时,只有当交易价格位于买家交易价格上限与卖家交易价格下限之间时,交易才可能进行。
在满足交易可能的情况下,在买家上限与卖家下限之间随机选取一个价格作为拟定交易价格。
对于拟定交易价格,若低于买家预期价格,买家以较高概率(0.7)接受交易,否则以较低概率(0.3)接受;若高于卖家预期价格,卖家以较高概率(0.7)接受交易,否则以较低概率(0.3)。
若双方均接受拟定价格,则暂存这个价格。买家遍历完所有接触的卖家后,在拟定价格中挑选最低拟定价格作为本次交易价格。
举例说明:
假设买家 A 的价格上限为 100,预期价格为 80,卖家 B 的价格下限为 90,预期价格为 108。随机生成的拟定交易价格为 95,这个价格高于买家 A 的预期价格,但低于卖家 B 的预期价格。此时,买家 A 接受交易的概率为 0.3,卖家 B 接受交易的概率为 0.7。如果双方都接受,这个价格就暂存起来。如果买家 A 在本轮中还接触了其他卖家,重复上述过程,最后从所有暂存的拟定价格中挑选最低的作为本次交易价格。

(三)预期价格调整

若交易完成:
买家和卖家的预期价格都会朝着本次交易的价格靠近。例如,若交易价格为 95,买家原本预期价格为 80,卖家原本预期价格为 108,则双方的预期价格会根据一定的算法向 95 靠近。
若交易未能完成:
卖家朝着其交易价格下限调整预期价格,买方朝着其交易价格上限调整预期价格。
在买家遍历完所有卖家后,对遍历过的卖家以及买家本身的预期价格按照上述要求进行调整。

(四)多轮交易

市场交易需要进行多轮,以观察市场的动态变化。

四、程序实现步骤

(一)定义市场主体类

买家类(Buyer):
属性:价格上限(price_limit)、预期价格(expected_price)。
方法:
check_deal(seller, proposed_price):检查是否接受交易,根据拟定交易价格与预期价格的关系确定接受概率。
update_expected_price(deal_price):根据交易结果更新预期价格。
卖家类(Seller):
属性:价格下限(price_limit)、预期价格(expected_price)。
方法:
check_deal(proposed_price):检查是否接受交易,根据拟定交易价格与预期价格的关系确定接受概率。
update_expected_price(deal_price):根据交易结果更新预期价格。

(二)模拟市场交易

创建买家和卖家列表:
使用循环生成指定数量的买家和卖家,买家数量如num_buyers = 50,卖家数量如num_sellers = 30。在创建买家和卖家对象时,分别随机生成他们的价格上限和下限,并根据上限和下限计算初始预期价格。
进行多轮交易:
设定交易轮数,如num_rounds = 20。在每一轮交易中,执行以下操作:
对于每个买家:
确定随机接触的卖家数量,在卖家总数的 10% - 50% 之间随机选取。
遍历随机选择的卖家:
对于每个卖家,判断交易是否可能进行,即交易价格是否在买家上限与卖家下限之间。如果可能,随机生成拟定交易价格。
根据买家和卖家的方法检查双方是否接受拟定价格,如果接受,则暂存这个价格。
在暂存的拟定价格中挑选最低价格作为本次交易价格。
对于完成交易的买家和卖家,根据交易价格更新他们的预期价格;对于未完成交易的,按照规则调整预期价格。
计算本轮的总交易价格和交易次数,如果有交易完成,计算平均价格;如果没有交易完成,本轮平均价格记为 None。

(三)绘制图表

以交易轮数为横轴,同一轮中的平均交易价格为纵轴,使用matplotlib库绘制图表。
具体步骤:
定义横轴的交易轮数范围,从 1 到设定的交易轮数。
根据模拟市场交易得到的平均价格列表,绘制图表。设置图表的标题、横轴标签和纵轴标签,使图表清晰易懂。

以下为示例图表:

注:本笔记借助豆包AI进行梳理总结。


理想市场的简易模拟
http://knnow.top/post/理想市场的简易模拟.html
作者
氮氮NNU
发布于
2024年8月28日
更新于
2024年8月28日
许可协议