本文档是关于在 Devcon 2024 上举行的“执行票证的基于代理的仿真”研讨会的文档。主要内容包括如何在 Google Colab 或本地 Jupyter Notebook 环境中设置和运行 ET 仿真,以及如何调整仿真参数和配置,以便用户可以设计自己的仿真并比较结果。此外,还提供了关于调整票证持有者属性和竞标策略的说明。
本文档包含关于2024年11月15日下午2:30在B教室举行的“工作坊:执行票的基于代理的模拟”的工作坊文档。
工作坊目标:运行你自己的模拟配置并比较结果。
如果你不想使用 Google Colab 并且想在本地运行代码,请参阅下面的章节,了解如何自行在本地设置,例如使用 Jupyter Lab。
使用 Google Colab 注册
访问模拟 notebook:Google Colab
在你的云盘中保存副本:“文件 > 在云盘中保存副本”
使用以下链接下载代码:ET-Simulation
需要复习一下使用 GitHub 吗?查看例如这里
支持类需要存储在你的 Google MyDrive 中,才能从 Colab Notebook 访问。
因此,我们建议将包含代码的文件夹(默认名称为“ET-Simulation-main”)复制到你的“MyDrive”(链接)主目录。
要运行模拟,只需转到 Jupyter notebook 中的“运行时”和“全部运行”。如果所有设置都正确,它应该运行并显示以及存储结果。
将模拟连接到你的 Google Drive。运行模拟时,系统会提示你连接你的 Google Drive。请这样做。
要检查一切是否正常,你可以在 notebook 的末尾检查结果。它们应该显示你特定模拟运行的结果。
恭喜,你现在已成功在你的帐户上设置了模拟。现在你可以开始玩转模拟并调整模拟参数。
要运行你自己设计的模拟,请调整“sys_params”:
# 定义实验参数
TIMESTEPS = 1000
RUNS = 10 # 仅当运行一次时,才支持生成结果图片
# 定义系统参数
sys_params = {
'selling_mechanism': 'first_price', # 选项 'EIP-1559', 'AMM-style', 'first_price' 或 'second_price',目前
'max_tickets': 100, # 对于灵活的票数,此值的一半用作目标值
'initial_ticket_price': 20, # 应低于 MEV 规模,否则持票人会亏本购买门票(不现实)
'MEV_scale': 30,
'slots_per_epoch': 32,
'number_of_ticket_holders': 10,
'secondary_market': True, # 决定是否启用二级市场
'price_vola': {'mean': 0, 'sigma': 0.2}, # 波动率指数,服从对数正态分布。可以设置为 [None, None]。如果不是 'None':定义底层正态分布的均值(应设置为 0),sigma 为标准差。典型值可能为 0 & 0.2
'agent_bidding_strategy': 'optimal_heuristic_bidding', # 仅与一阶或二阶价格拍卖相关。其他选项:naive_hist_obs_of_dist, hist_obs_of_dist, random_evenly_10_50, optimal_heuristic_bidding(最后一个仅适用于 FPA)
'EIP-1559_max_tickets': 4, # 仅与 EIP-1559 相关,每个 slot 要购买的最大票数。
'EIP-1559_adjust_factor': 8, # 定义价格调整对于 EIP-1559 定价的快慢,类似于 EIP-1559 (1/factor),8 = 12.5%
'AMM_adjust_factor': 25, # 定义价格调整对于 AMM 风格定价的快慢,类似于 EIP-1559 (1/factor),8 = 12.5%
'expiry_period': None, # 定义门票是否过期:None - 定义为不过期,否则为要过期的插槽的 Int 值。对于初始化阶段,它是 ticket_id + expiry_period。
'reimbursement_factor': None, # 仅与 AMM 风格定价相关。持票人可以将其门票价格卖回协议。'None' 用于禁用该选项。否则,0 到 1 之间的数字表示折扣(0 表示无折扣)。请注意,由于票价的离散性,折扣太小可能会导致无限循环的出售。
}
在 TicketHolderAgent 类 ('Support-Classes/models.py') 中调整持票人的属性:
# 定义 TicketHolders 作为代理
class TicketHolderAgent:
def __init__(self, id, params):
self.id = id
num_holders = params['number_of_ticket_holders']
if self.id <= (num_holders * 0.2):
self.type = 'top'
self.available_funds = random.uniform(400, 1000)
self.MEV_capture_rate = random.uniform(0.85, 0.95)
elif self.id > (num_holders * 0.2) and self.id <= (num_holders * 0.6):
self.type = 'middle'
self.available_funds = random.uniform(300, 700)
self.MEV_capture_rate = random.uniform(0.75, 0.85)
elif self.id > (num_holders * 0.6):
self.type = 'tail'
self.available_funds = random.uniform(200, 500)
self.MEV_capture_rate = random.uniform(0.6, 0.75)
self.aggressiveness = np.random.normal(0.15, 0.02) # np.random.normal(mean, std_dev) # random.uniform(0.01, 0.3)
self.vola_spec_factor = np.random.normal(1, 0.5) # Builder 波动率专业化的随机分布
if self.vola_spec_factor <= 0:
self.vola_spec_factor = 0.1
self.earnings = 0
self.costs = 0
self.purchase_value_of_unredeemed_tickets = 0
self.won_slots = []
self.discount_factor = 1 # 目前通常设置为 1,详情请参阅研究报告。反映了插槽间的折扣因子
使用以下方法在 ('Support-Classes/models.py') 中调整持票人的竞标机制:
def decide_bid_first_price(self, params):
def decide_bid_second_price(self, params, ticket_for_sale=None, current_slot=None, vola_this_slot=None, previous_state=None):
def decide_EIP_1559_ticket(self, ticket_price, params):
def decide_AMM_ticket(self, ticket_price, params):
def holder_decide_AMM_sell(self, tickets, ticket_price, params):
如果你想在本地运行它,你可以在这里找到相关文档,我们希望你能自行完成此过程。
- 原文链接: ephema.notion.site/Devco...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!