from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, Page, WaitPage ) cu = c doc = '\nIn a common value auction game, players simultaneously bid on the item being\nauctioned.
\nPrior to bidding, they are given an estimate of the actual value of the item.\nThis actual value is revealed after the bidding.
\nBids are private. The player with the highest bid wins the auction, but\npayoff depends on the bid amount and the actual value.
\n' class Constants(BaseConstants): name_in_url = 'common_value_auction_realized' players_per_group = None num_rounds = 1 min_allowable_bid = c(0) max_allowable_bid = c(12.5) instructions_template = 'common_value_auction_realized/instructions.html' def creating_session(subsession): pass class Subsession(BaseSubsession): creating_session = creating_session def set_winner_Type1(group): import random players = group.get_players() for p in players: p.available_funds = 12.5 playerbidnumber = max([p.id_in_group for p in players]) allbids = [] firstcount = 0 othercount = 0 while firstcount < playerbidnumber: freshplayer = firstcount + 1 currentperson = group.get_player_by_id(freshplayer) while othercount < currentperson.number_Type1: allbids.append(currentperson.bid_amount_type1) othercount = othercount + 1 firstcount = firstcount + 1 othercount = 0 bidsinorder = sorted(allbids, reverse=True) counter = 0 endcheck = 0 totalbids = 0 for p in players: if p.bid_amount_type1 > 0: totalbids = totalbids + p.number_Type1 if totalbids < playerbidnumber: for p in players: if p.bid_amount_type1 > 0 and p.number_Type1 > 0: p.owned_type1 = p.number_Type1 counter = counter + p.number_Type1 else: p.owned_type1 = 1 counter = counter + 1 players_with_marginal_bid = [p for p in players if p.bid_amount_type1 == 0 or p.number_Type1 == 0] while counter < playerbidnumber*2: receiver = random.choice(players) if receiver.owned_type1 < 4: receiver.owned_type1 = receiver.owned_type1 + 1 counter = counter + 1 endcheck = 3 print('Insufficient bids') if totalbids >= playerbidnumber: for p in players: if p.bid_amount_type1 > bidsinorder[playerbidnumber-1]: p.owned_type1 = p.number_Type1 counter = counter + p.number_Type1 elif p.bid_amount_type1 == bidsinorder[playerbidnumber-1]: p.owned_type1 = p.number_Type1 counter = counter + p.number_Type1 players_with_marginal_bid = [ p for p in players if p.bid_amount_type1 == bidsinorder[playerbidnumber-1] ] else: p.owned_type1 = 0 endcheck = 1 if counter > playerbidnumber: while counter > playerbidnumber: winner = random.choice( players_with_marginal_bid ) # if tie, winner is chosen at random winner.owned_type1 = winner.owned_type1 - 1 if winner.owned_type1 > - 1: counter = counter - 1 else: winner.owned_type1 = 0 for p in players: if endcheck == 1: p.auction_spending1 = p.owned_type1*bidsinorder[playerbidnumber-1] p.asset1auctionprice = bidsinorder[playerbidnumber-1] if endcheck == 3: p.auction_spending1 = 0 p.asset1auctionprice = 0 def set_winner_Type2(group): import random players = group.get_players() playerbidnumber = max([p.id_in_group for p in players]) allbids = [] firstcount = 0 othercount = 0 while firstcount < playerbidnumber: freshplayer = firstcount + 1 currentperson = group.get_player_by_id(freshplayer) while othercount < currentperson.number_Type2: allbids.append(currentperson.bid_amount_type2) othercount = othercount + 1 firstcount = firstcount + 1 othercount = 0 bidsinorder = sorted(allbids, reverse=True) counter = 0 endcheck = 0 totalbids = 0 for p in players: if p.bid_amount_type2 > 0: totalbids = totalbids + p.number_Type2 if totalbids < playerbidnumber: for p in players: if p.bid_amount_type2 > 0 and p.number_Type2 > 0: p.owned_type2 = p.number_Type2 counter = counter + p.number_Type2 else: p.owned_type2 = 1 counter = counter + 1 players_with_marginal_bid = [p for p in players if p.bid_amount_type2 == 0 or p.number_Type2 == 0] while counter < playerbidnumber: receiver = random.choice(players) if receiver.owned_type2 < 4: receiver.owned_type2 = receiver.owned_type2 + 1 counter = counter + 1 endcheck = 3 if totalbids >= playerbidnumber: for p in players: if p.bid_amount_type2 > bidsinorder[playerbidnumber-1]: p.owned_type2 = p.number_Type2 counter = counter + p.number_Type2 elif p.bid_amount_type2 == bidsinorder[playerbidnumber-1]: p.owned_type2 = p.number_Type2 counter = counter + p.number_Type2 players_with_marginal_bid = [ p for p in players if p.bid_amount_type2 == bidsinorder[playerbidnumber-1] ] else: p.owned_type2 = 0 endcheck = 1 if counter > playerbidnumber: while counter > playerbidnumber: winner = random.choice( players_with_marginal_bid ) # if tie, winner is chosen at random winner.owned_type2 = winner.owned_type2 - 1 if winner.owned_type2 > - 1: counter = counter - 1 else: winner.owned_type2 = 0 for p in players: if endcheck == 1: p.auction_spending2 = p.owned_type2*bidsinorder[playerbidnumber-1] p.asset2auctionprice = bidsinorder[playerbidnumber-1] if endcheck == 3: p.auction_spending2 = 0 p.asset2auctionprice = 0 p.initial_spending = p.auction_spending1 + p.auction_spending2 p.available_funds = p.available_funds - p.initial_spending def my_function(group): players = group.get_players() for p in players: set_this_data(p) def create_outcome(group): import random players = group.get_players() asset1gen = random.random() asset2gen = random.random() if asset1gen > .5: group.asset1outcome = "Asset 1 earned 25 cents." for p in players: p.available_funds = p.available_funds + .25*p.owned_type1 p.asset1earningschange = .25*p.owned_type1 p.asset1endvalue = 2.5 else: group.asset1outcome = "Asset 1 lost 25 cents." for p in players: p.available_funds = p.available_funds - .25*p.owned_type1 p.asset1earningschange = -.25*p.owned_type1 p.asset1endvalue = 2.5 if asset2gen < .1: group.asset2outcome = "Asset 2 earned 90 cents." for p in players: p.available_funds = p.available_funds + .9*p.owned_type2 p.asset2earningschange = .9*p.owned_type2 p.asset2endvalue = 2.5 else: group.asset2outcome = "Asset 2 lost 10 cents." for p in players: p.available_funds = p.available_funds - .1*p.owned_type2 p.asset2earningschange = -.1*p.owned_type2 p.asset2endvalue = 2.50 def showround2data(group): players = group.get_players() for p in players: pull_round2data(p) class Group(BaseGroup): item_value = models.CurrencyField(doc='Common value of the item to be auctioned random for treatment') highest_bid = models.CurrencyField() u = models.IntegerField() asset1outcome = models.StringField() asset2outcome = models.StringField() set_winner_Type1 = set_winner_Type1 set_winner_Type2 = set_winner_Type2 my_function = my_function create_outcome = create_outcome showround2data = showround2data def set_this_data(player): participant = player.participant participant.vars['type1'] = player.owned_type1 participant.vars['type2'] = player.owned_type2 participant.vars['funds'] = 12.50 participant.vars['bankedaccount'] = player.available_funds participant.vars['asset1value'] = player.asset1endvalue participant.vars['asset2value'] = player.asset2endvalue participant.vars['asset1auctionprice'] = player.asset1auctionprice participant.vars['asset2auctionprice'] = player.asset2auctionprice participant.vars['purchasehistory'] = player.purchasehistory participant.vars['purchasehistory2'] = player.purchasehistory2 def pull_round2data(player): participant = player.participant player.previousearnings2 = participant.vars['round2earnings'] player.bankedaccountprev2 = participant.vars['round2bankedaccount'] player.available_fundsprev2 = participant.vars['round2availablefunds'] player.owned_type2prev2 = participant.vars['round2ownedtype2'] player.asset2valueprev2 = participant.vars['round2asset2value'] class Player(BasePlayer): bid_amount_type1 = models.CurrencyField(doc='Amount bidded by the player', label='Bid amount for Type 1 Assets', max=Constants.max_allowable_bid, min=Constants.min_allowable_bid) number_Type1 = models.IntegerField(label='Number of Type 1 Assets to purchase (maximum)', max=2, min=0) bid_amount_type2 = models.CurrencyField(label='Bid amount for Type 2 Assets', max=Constants.max_allowable_bid, min=0) number_Type2 = models.IntegerField(label='Number of Type 2 Assets to purchase (maximum)', max=2, min=0) initial_spending = models.CurrencyField() owned_type1 = models.IntegerField(initial=0) owned_type2 = models.IntegerField(initial=0) auction_spending1 = models.CurrencyField() auction_spending2 = models.CurrencyField() available_funds = models.CurrencyField(initial=12.5) asset1endvalue = models.CurrencyField() asset2endvalue = models.CurrencyField() asset1auctionprice = models.CurrencyField() asset2auctionprice = models.CurrencyField() purchasehistory = models.LongStringField(initial='Nothing') purchasehistory2 = models.LongStringField(initial='Nothing') previousearnings2 = models.CurrencyField() bankedaccountprev2 = models.CurrencyField() available_fundsprev2 = models.CurrencyField() owned_type2prev2 = models.IntegerField() asset2valueprev2 = models.CurrencyField() asset1earningschange = models.CurrencyField(initial=0) asset2earningschange = models.CurrencyField(initial=0) set_this_data = set_this_data pull_round2data = pull_round2data