from otree.api import * import random doc = """ In this Vickrey auction, 3 players bid for an object with private values. Each player can only submit one bid. See: Vickrey, William. "Counterspeculation, auctions, and competitive ' sealed tenders." The Journal of finance 16.1 (1961): 8-37. """ class Constants(BaseConstants): name_in_url = 'proxy_auction' players_per_group = 3 num_rounds = 1 endowment = 5 INSTRUCTIONS_TEMPLATE = 'second_price_auction/instructions.html' class Subsession(BaseSubsession): pass class Group(BaseGroup): highest_bid = models.IntegerField() second_highest_bid = models.IntegerField() bids_one = models.IntegerField(initial=0) bids_two = models.IntegerField(initial=0) bids_three = models.IntegerField(initial=0) bids_four = models.IntegerField(initial=0) bids_five = models.IntegerField(initial=0) bids_six = models.IntegerField(initial=0) bids_seven = models.IntegerField(initial=0) bids_eight = models.IntegerField(initial=0) bids_nine = models.IntegerField(initial=0) bids_ten = models.IntegerField(initial=0) bids_eleven = models.IntegerField(initial=0) bids_twelve = models.IntegerField(initial=0) bids_thirteen = models.IntegerField(initial=0) bids_fourteen = models.IntegerField(initial=0) bids_fifteen = models.IntegerField(initial=0) def set_payoffs(group: Group): players = group.get_players() bids = sorted([p.bid_amount for p in players], reverse=True) group.highest_bid = bids[0] group.second_highest_bid = bids[1] players_with_highest_bid = [ p for p in players if p.bid_amount == group.highest_bid ] # if tie, winner is chosen at random winner = random.choice(players_with_highest_bid) winner.is_winner = True for p in players: p.payoff_I = Constants.endowment if p.is_winner: p.payoff_I += (p.private_value - group.second_highest_bid) def set_bids_one(group: Group): players = group.get_players() group.bids_one = sum([p.bid_one for p in players]) def set_bids_two(group: Group): players = group.get_players() group.bids_two = sum([p.bid_two for p in players]) def set_bids_three(group: Group): players = group.get_players() group.bids_three = sum([p.bid_three for p in players]) def set_bids_four(group: Group): players = group.get_players() group.bids_four = sum([p.bid_four for p in players]) def set_bids_five(group: Group): players = group.get_players() group.bids_five = sum([p.bid_five for p in players]) def set_bids_six(group: Group): players = group.get_players() group.bids_six = sum([p.bid_six for p in players]) def set_bids_seven(group: Group): players = group.get_players() group.bids_seven = sum([p.bid_seven for p in players]) def set_bids_eight(group: Group): players = group.get_players() group.bids_eight = sum([p.bid_eight for p in players]) def set_bids_nine(group: Group): players = group.get_players() group.bids_nine = sum([p.bid_nine for p in players]) def set_bids_ten(group: Group): players = group.get_players() group.bids_ten = sum([p.bid_ten for p in players]) def set_bids_eleven(group: Group): players = group.get_players() group.bids_eleven = sum([p.bid_eleven for p in players]) def set_bids_twelve(group: Group): players = group.get_players() group.bids_twelve = sum([p.bid_twelve for p in players]) def set_bids_thirteen(group: Group): players = group.get_players() group.bids_thirteen = sum([p.bid_thirteen for p in players]) def set_bids_fourteen(group: Group): players = group.get_players() group.bids_fourteen = sum([p.bid_fourteen for p in players]) # group.bids_fifteen = sum([p.bid_fifteen for p in players]) class Player(BasePlayer): private_value = models.IntegerField() payoff_I = models.IntegerField() bid_amount = models.IntegerField(initial=0) is_winner = models.BooleanField( initial=False, doc="""Indicates whether the player is the winner""" ) bid_one = models.IntegerField( initial=1, choices=[ (1, 'はい'), (0, 'いいえ') ], widget=widgets.RadioSelect, blank=False ) bid_two = models.IntegerField( initial=1, choices=[ (1, 'はい'), (0, 'いいえ') ], widget=widgets.RadioSelect, blank=False ) bid_three = models.IntegerField( initial=1, choices=[ (1, 'はい'), (0, 'いいえ') ], widget=widgets.RadioSelect, blank=False ) bid_four = models.IntegerField( initial=1, choices=[ (1, 'はい'), (0, 'いいえ') ], widget=widgets.RadioSelect, blank=False ) bid_five = models.IntegerField( initial=1, choices=[ (1, 'はい'), (0, 'いいえ') ], widget=widgets.RadioSelect, blank=False ) bid_six = models.IntegerField( initial=1, choices=[ (1, 'はい'), (0, 'いいえ') ], widget=widgets.RadioSelect, blank=False ) bid_seven = models.IntegerField( initial=1, choices=[ (1, 'はい'), (0, 'いいえ') ], widget=widgets.RadioSelect, blank=False ) bid_eight = models.IntegerField( initial=1, choices=[ (1, 'はい'), (0, 'いいえ') ], widget=widgets.RadioSelect, blank=False ) bid_nine = models.IntegerField( initial=1, choices=[ (1, 'はい'), (0, 'いいえ') ], widget=widgets.RadioSelect, blank=False ) bid_ten = models.IntegerField( initial=1, choices=[ (1, 'はい'), (0, 'いいえ') ], widget=widgets.RadioSelect, blank=False ) bid_eleven = models.IntegerField( initial=1, choices=[ (1, 'はい'), (0, 'いいえ') ], widget=widgets.RadioSelect, blank=False ) bid_twelve = models.IntegerField( initial=1, choices=[ (1, 'はい'), (0, 'いいえ') ], widget=widgets.RadioSelect, blank=False ) bid_thirteen = models.IntegerField( initial=1, choices=[ (1, 'はい'), (0, 'いいえ') ], widget=widgets.RadioSelect, blank=False ) bid_fourteen = models.IntegerField( initial=1, choices=[ (1, 'はい'), (0, 'いいえ') ], widget=widgets.RadioSelect, blank=False ) bid_fifteen = models.IntegerField( initial=1, choices=[ (1, 'はい'), (0, 'いいえ') ], widget=widgets.RadioSelect, blank=False ) bid_price = models.IntegerField(initial=1) #pages class Bid01(Page): form_model = 'player' form_fields = ['bid_one'] @staticmethod def before_next_page(player, timeout_happened): if player.bid_one == 1: player.bid_amount = 1 player.bid_price = 2 else: player.bid_two = 0 player.bid_three = 0 player.bid_four = 0 player.bid_five = 0 player.bid_six = 0 player.bid_seven = 0 player.bid_eight = 0 player.bid_nine = 0 player.bid_ten = 0 player.bid_eleven = 0 player.bid_twelve = 0 player.bid_thirteen = 0 player.bid_fourteen = 0 player.bid_fifteen = 0 class WaitPage01(WaitPage): after_all_players_arrive = set_bids_one class Bid02(Page): form_model = 'player' form_fields = ['bid_two'] @staticmethod def is_displayed(player: Player): return player.bid_one * player.group.bids_one >= 2 @staticmethod def before_next_page(player, timeout_happened): if player.bid_two == 1: player.bid_amount = 2 player.bid_price = 3 else: player.bid_three = 0 player.bid_four = 0 player.bid_five = 0 player.bid_six = 0 player.bid_seven = 0 player.bid_eight = 0 player.bid_nine = 0 player.bid_ten = 0 player.bid_eleven = 0 player.bid_twelve = 0 player.bid_thirteen = 0 player.bid_fourteen = 0 player.bid_fifteen = 0 class WaitPage02(WaitPage): after_all_players_arrive = set_bids_two class Bid03(Page): form_model = 'player' form_fields = ['bid_three'] @staticmethod def is_displayed(player: Player): return player.bid_two * player.group.bids_two >= 2 @staticmethod def before_next_page(player, timeout_happened): if player.bid_three == 1: player.bid_amount = 3 player.bid_price = 4 else: player.bid_four = 0 player.bid_five = 0 player.bid_six = 0 player.bid_seven = 0 player.bid_eight = 0 player.bid_nine = 0 player.bid_ten = 0 player.bid_eleven = 0 player.bid_twelve = 0 player.bid_thirteen = 0 player.bid_fourteen = 0 player.bid_fifteen = 0 class WaitPage03(WaitPage): after_all_players_arrive = set_bids_three class Bid04(Page): form_model = 'player' form_fields = ['bid_four'] @staticmethod def is_displayed(player: Player): return player.bid_three * player.group.bids_three >= 2 @staticmethod def before_next_page(player, timeout_happened): if player.bid_four == 1: player.bid_amount = 4 player.bid_price = 5 else: player.bid_five = 0 player.bid_six = 0 player.bid_seven = 0 player.bid_eight = 0 player.bid_nine = 0 player.bid_ten = 0 player.bid_eleven = 0 player.bid_twelve = 0 player.bid_thirteen = 0 player.bid_fourteen = 0 player.bid_fifteen = 0 class WaitPage04(WaitPage): after_all_players_arrive = set_bids_four class Bid05(Page): form_model = 'player' form_fields = ['bid_five'] @staticmethod def is_displayed(player: Player): return player.bid_four * player.group.bids_four >= 2 @staticmethod def before_next_page(player, timeout_happened): if player.bid_five == 1: player.bid_amount = 5 player.bid_price = 6 else: player.bid_six = 0 player.bid_seven = 0 player.bid_eight = 0 player.bid_nine = 0 player.bid_ten = 0 player.bid_eleven = 0 player.bid_twelve = 0 player.bid_thirteen = 0 player.bid_fourteen = 0 player.bid_fifteen = 0 class WaitPage05(WaitPage): after_all_players_arrive = set_bids_five class Bid06(Page): form_model = 'player' form_fields = ['bid_six'] @staticmethod def is_displayed(player: Player): return player.bid_five * player.group.bids_five >= 2 @staticmethod def before_next_page(player, timeout_happened): if player.bid_six == 1: player.bid_amount = 6 player.bid_price = 7 else: player.bid_seven = 0 player.bid_eight = 0 player.bid_nine = 0 player.bid_ten = 0 player.bid_eleven = 0 player.bid_twelve = 0 player.bid_thirteen = 0 player.bid_fourteen = 0 player.bid_fifteen = 0 class WaitPage06(WaitPage): after_all_players_arrive = set_bids_six class Bid07(Page): form_model = 'player' form_fields = ['bid_seven'] @staticmethod def is_displayed(player: Player): return player.bid_six * player.group.bids_six >= 2 @staticmethod def before_next_page(player, timeout_happened): if player.bid_seven == 1: player.bid_amount = 7 player.bid_price = 8 else: player.bid_eight = 0 player.bid_nine = 0 player.bid_ten = 0 player.bid_eleven = 0 player.bid_twelve = 0 player.bid_thirteen = 0 player.bid_fourteen = 0 player.bid_fifteen = 0 class WaitPage07(WaitPage): after_all_players_arrive = set_bids_seven class Bid08(Page): form_model = 'player' form_fields = ['bid_eight'] @staticmethod def is_displayed(player: Player): return player.bid_seven * player.group.bids_seven >= 2 @staticmethod def before_next_page(player, timeout_happened): if player.bid_eight == 1: player.bid_amount = 8 player.bid_price = 9 else: player.bid_nine = 0 player.bid_ten = 0 player.bid_eleven = 0 player.bid_twelve = 0 player.bid_thirteen = 0 player.bid_fourteen = 0 player.bid_fifteen = 0 class WaitPage08(WaitPage): after_all_players_arrive = set_bids_eight class Bid09(Page): form_model = 'player' form_fields = ['bid_nine'] @staticmethod def is_displayed(player: Player): return player.bid_eight * player.group.bids_eight >= 2 @staticmethod def before_next_page(player, timeout_happened): if player.bid_nine == 1: player.bid_amount = 9 player.bid_price = 10 else: player.bid_ten = 0 player.bid_eleven = 0 player.bid_twelve = 0 player.bid_thirteen = 0 player.bid_fourteen = 0 player.bid_fifteen = 0 class WaitPage09(WaitPage): after_all_players_arrive = set_bids_nine class Bid10(Page): form_model = 'player' form_fields = ['bid_ten'] @staticmethod def is_displayed(player: Player): return player.bid_nine * player.group.bids_nine >= 2 @staticmethod def before_next_page(player, timeout_happened): if player.bid_ten == 1: player.bid_amount = 10 player.bid_price = 11 else: player.bid_eleven = 0 player.bid_twelve = 0 player.bid_thirteen = 0 player.bid_fourteen = 0 player.bid_fifteen = 0 class WaitPage10(WaitPage): after_all_players_arrive = set_bids_ten class Bid11(Page): form_model = 'player' form_fields = ['bid_eleven'] @staticmethod def is_displayed(player: Player): return player.bid_ten * player.group.bids_ten >= 2 @staticmethod def before_next_page(player, timeout_happened): if player.bid_eleven == 1: player.bid_amount = 11 player.bid_price = 12 else: player.bid_twelve = 0 player.bid_thirteen = 0 player.bid_fourteen = 0 player.bid_fifteen = 0 class WaitPage11(WaitPage): after_all_players_arrive = set_bids_eleven class Bid12(Page): form_model = 'player' form_fields = ['bid_twelve'] @staticmethod def is_displayed(player: Player): return player.bid_eleven * player.group.bids_eleven >= 2 @staticmethod def before_next_page(player, timeout_happened): if player.bid_twelve == 1: player.bid_amount = 12 player.bid_price = 13 else: player.bid_thirteen = 0 player.bid_fourteen = 0 player.bid_fifteen = 0 class WaitPage12(WaitPage): after_all_players_arrive = set_bids_twelve class Bid13(Page): form_model = 'player' form_fields = ['bid_thirteen'] @staticmethod def is_displayed(player: Player): return player.bid_twelve * player.group.bids_twelve >= 2 @staticmethod def before_next_page(player, timeout_happened): if player.bid_thirteen == 1: player.bid_amount = 13 player.bid_price = 14 else: player.bid_fourteen = 0 player.bid_fifteen = 0 class WaitPage13(WaitPage): after_all_players_arrive = set_bids_thirteen class Bid14(Page): form_model = 'player' form_fields = ['bid_fourteen'] @staticmethod def is_displayed(player: Player): return player.bid_thirteen * player.group.bids_thirteen >= 2 @staticmethod def before_next_page(player, timeout_happened): if player.bid_fourteen == 1: player.bid_amount = 14 player.bid_price = 15 else: player.bid_fifteen = 0 class WaitPage14(WaitPage): after_all_players_arrive = set_bids_fourteen class Bid15(Page): form_model = 'player' form_fields = ['bid_fifteen'] @staticmethod def is_displayed(player: Player): return player.bid_fourteen * player.group.bids_fourteen >= 2 @staticmethod def before_next_page(player, timeout_happened): if player.bid_fifteen == 1: player.bid_amount = 15 class ResultWaitPgae(WaitPage): after_all_players_arrive = set_payoffs class Results(Page): pass class Introduction1(Page): @staticmethod def before_next_page(player, timeout_happened): if player.id_in_group % 4 == 1: player.private_value = 4 elif player.id_in_group % 4 == 2: player.private_value = 12 elif player.id_in_group % 4 == 3: player.private_value = 9 else: player.private_value = 6 page_sequence = [ Introduction1, Bid01, WaitPage01, Bid02, WaitPage02, Bid03, WaitPage03, Bid04, WaitPage04, Bid05, WaitPage05, Bid06, WaitPage06, Bid07, WaitPage07, Bid08, WaitPage08, Bid09, WaitPage09, Bid10, WaitPage10, Bid11, WaitPage11, Bid12, WaitPage12, Bid13, WaitPage13, Bid14, WaitPage14, Bid15, ResultWaitPgae, Results ]