import random from otree.api import * doc = """ This app creates the code using data from type Y individuals from Fehr, Tyran (2001) """ class C(BaseConstants): NAME_IN_URL = 'misconfidence_Y' PLAYERS_PER_GROUP = 2 NUM_ROUNDS = 20 NUM_PAYING_ROUNDS = 1 guess_max = 30 instructions_player1 = 'misconfidence_app/InstructionsPlayer1.html' instructions_player2 = 'misconfidence_app/InstructionsPlayer2.html' ROUND_SHOCK = 10 show_up = 3 class Subsession(BaseSubsession): pass class Group(BaseGroup): realized_avg_price = models.IntegerField() transformed_avg_price = models.FloatField() guess_player1 = models.IntegerField( min=1, max=C.guess_max, label="Please pick a number from 1 to 30:" ) guess_player2 = models.IntegerField( min=1, max=C.guess_max, label="Please pick a number from 1 to 30:" ) indexed = models.IntegerField() def creating_session(subsession): subj1 = [18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6] subj2 = [18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6] subj3 = [7, 7, 6, 17, 17, 18, 19, 12, 19, 18, 6, 6, 6, 6, 7, 11, 5, 7, 6, 6] subj4 = [18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6] subj5 = [18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6] subj6 = [9, 8, 13, 18, 17, 19, 17, 12, 18, 18, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6] subj7 = [7, 16, 18, 18, 7, 18, 18, 7, 18, 18, 6, 6, 6, 6, 6, 3, 6, 3, 6, 6] subj8 = [18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6] subj9 = [18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6] subj10 = [17, 19, 19, 18, 18, 9, 18, 12, 18, 5, 18, 21, 6, 4, 4, 4, 6, 4, 6, 6] subj11 = [18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6] subj12 = [18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 6, 6, 6, 6, 6, 6, 24, 6, 6, 6] dataset = [subj1, subj2, subj3, subj4, subj5, subj6, subj7, subj8, subj9, subj10, subj11, subj12] for groups in subsession.get_groups(): if subsession.round_number == 1: groups.indexed = random.randint(1, 12) else: groups.indexed = groups.in_round(1).indexed actual_player0 = dataset[groups.indexed - 1] if subsession.round_number == 1: groups.realized_avg_price = actual_player0[subsession.round_number-1] groups.transformed_avg_price = groups.realized_avg_price / C.guess_max if subsession.round_number == 2: groups.realized_avg_price = actual_player0[subsession.round_number - 1] groups.transformed_avg_price = groups.realized_avg_price / C.guess_max if subsession.round_number == 3: groups.realized_avg_price = actual_player0[subsession.round_number - 1] groups.transformed_avg_price = groups.realized_avg_price / C.guess_max if subsession.round_number == 4: groups.realized_avg_price = actual_player0[subsession.round_number - 1] groups.transformed_avg_price = groups.realized_avg_price / C.guess_max if subsession.round_number == 5: groups.realized_avg_price = actual_player0[subsession.round_number - 1] groups.transformed_avg_price = groups.realized_avg_price / C.guess_max if subsession.round_number == 6: groups.realized_avg_price = actual_player0[subsession.round_number - 1] groups.transformed_avg_price = groups.realized_avg_price / C.guess_max if subsession.round_number == 7: groups.realized_avg_price = actual_player0[subsession.round_number - 1] groups.transformed_avg_price = groups.realized_avg_price / C.guess_max if subsession.round_number == 8: groups.realized_avg_price = actual_player0[subsession.round_number - 1] groups.transformed_avg_price = groups.realized_avg_price / C.guess_max if subsession.round_number == 9: groups.realized_avg_price = actual_player0[subsession.round_number - 1] groups.transformed_avg_price = groups.realized_avg_price / C.guess_max if subsession.round_number == 10: groups.realized_avg_price = actual_player0[subsession.round_number - 1] groups.transformed_avg_price = groups.realized_avg_price / C.guess_max if subsession.round_number == 11: groups.realized_avg_price = actual_player0[subsession.round_number - 1] groups.transformed_avg_price = groups.realized_avg_price / C.guess_max if subsession.round_number == 12: groups.realized_avg_price = actual_player0[subsession.round_number - 1] groups.transformed_avg_price = groups.realized_avg_price / C.guess_max if subsession.round_number == 13: groups.realized_avg_price = actual_player0[subsession.round_number - 1] groups.transformed_avg_price = groups.realized_avg_price / C.guess_max if subsession.round_number == 14: groups.realized_avg_price = actual_player0[subsession.round_number - 1] groups.transformed_avg_price = groups.realized_avg_price / C.guess_max if subsession.round_number == 15: groups.realized_avg_price = actual_player0[subsession.round_number - 1] groups.transformed_avg_price = groups.realized_avg_price / C.guess_max if subsession.round_number == 16: groups.realized_avg_price = actual_player0[subsession.round_number - 1] groups.transformed_avg_price = groups.realized_avg_price / C.guess_max if subsession.round_number == 17: groups.realized_avg_price = actual_player0[subsession.round_number - 1] groups.transformed_avg_price = groups.realized_avg_price / C.guess_max if subsession.round_number == 18: groups.realized_avg_price = actual_player0[subsession.round_number - 1] groups.transformed_avg_price = groups.realized_avg_price / C.guess_max if subsession.round_number == 19: groups.realized_avg_price = actual_player0[subsession.round_number - 1] groups.transformed_avg_price = groups.realized_avg_price / C.guess_max if subsession.round_number == 20: groups.realized_avg_price = actual_player0[subsession.round_number - 1] groups.transformed_avg_price = groups.realized_avg_price / C.guess_max class Player(BasePlayer): action = models.FloatField() loss = models.FloatField() participation_fee = models.CurrencyField(initial=3) payment_num = models.FloatField( doc="Randomly chosen payment number used to implement Hossain and Okui's " "binarized scoring rule" ) paying_round = models.IntegerField() final_payoff = models.CurrencyField() def set_payoff(group): p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) p1.payment_num = round(random.uniform(0, 1), 9) p2.payment_num = round(random.uniform(0, 1), 9) p1.action = group.guess_player1 / C.guess_max p2.action = group.guess_player2 / C.guess_max p1.loss = (p1.action - group.transformed_avg_price) ** 2 p2.loss = (p2.action - p1.action) ** 2 if p1.loss < p1.payment_num: p1.payoff = 7 else: p1.payoff = 0 if p2.loss < p2.payment_num: p2.payoff = 7 else: p2.payoff = 0 p1.paying_round = random.randint(1, C.NUM_ROUNDS) p2.paying_round = random.randint(1, C.NUM_ROUNDS) p1.final_payoff = C.show_up + p1.in_round(p1.paying_round).payoff p2.final_payoff = C.show_up + p2.in_round(p2.paying_round).payoff # PAGES class Player1(Page): form_model = 'group' form_fields = ['guess_player1'] @staticmethod def is_displayed(player): return player.id_in_group == 1 class WaitForP1(WaitPage): pass class Player2(Page): form_model = 'group' form_fields = ['guess_player2'] @staticmethod def is_displayed(player): return player.id_in_group == 2 class NewIncomeTables(Page): pass @staticmethod def is_displayed(self): return self.round_number == C.ROUND_SHOCK class ResultsWaitPage(WaitPage): after_all_players_arrive = set_payoff class Results(Page): pass class FinalPage(Page): pass @staticmethod def is_displayed(self): return self.round_number == C.NUM_ROUNDS @staticmethod def vars_for_template(player): participant = player.participant final_payoff = player.final_payoff return { 'final_payoff': final_payoff, 'code': participant.code or participant.label, 'participation': player.participation_fee } page_sequence = [Player1, WaitForP1, Player2, ResultsWaitPage, Results, NewIncomeTables, FinalPage ]