import random from random import randrange, random, randint from gneezy_potters.config import * from otree.api import * from . import models author = 'Your name here' doc = """ Gneezy Potters method to elicit risk preference as in their 1995 QJE paper. """ class Constants(BaseConstants): name_in_url = 'gneezy_potters' # group size players_per_group = None # endowment amount for each different round endowment = (10, 10, 10, 10) # probability of success probability = (1 / 2, 1 / 2, 1 / 2, 1 / 2) # multiplier = return rate + 1 multiplier = (1.7, 1.35, 1.5, 1.35) # multiplier2 = return rate2 + 1 multipliersecond = (0.7, 0.75, 0.80, 0.75) # the number of total rounds num_rounds = len(probability) class Subsession(BaseSubsession): rand_round = models.IntegerField() class Group(BaseGroup): pass class Player(BasePlayer): random_draw = models.FloatField() winner = models.IntegerField() investment = models.CurrencyField( min=0, max=Constants.endowment[0], doc="""The amount invested by the subject""", ) give = models.IntegerField() # FUNCTIONS def creating_session(subsession: Subsession): subsession.rand_round = randrange(1, Constants.num_rounds + 1) if subsession.round_number == 1: for p in subsession.get_players(): round_list = (j for j in range(1, Constants.num_rounds + 1)) probabilities = Constants.probability multipliers = Constants.multiplier multipliersecond = Constants.multipliersecond endowments = Constants.endowment p.participant.vars['environment'] = list( zip(round_list, endowments, probabilities, multipliers, multipliersecond) ) p.participant.vars['environment2'] = list( zip(round_list, endowments, probabilities, multipliersecond) ) p.participant.vars['outcomes'] = [None for j in range(0, Constants.num_rounds)] p.participant.vars['investment'] = [None for j in range(0, Constants.num_rounds)] p.participant.vars['payoff'] = [None for j in range(0, Constants.num_rounds)] def set_payoffs(player: Player, round_num): player.random_draw = random() if player.random_draw < player.participant.vars['environment'][round_num - 1][2]: player.payoff = ( player.participant.vars['environment'][round_num - 1][1] - player.investment + player.investment * player.participant.vars['environment'][round_num - 1][3] ) player.winner = 1 else: player.payoff = ( player.participant.vars['environment'][round_num - 1][1] - player.investment + player.investment * player.participant.vars['environment'][round_num - 1][4] ) player.winner = 0 player.participant.vars['investment'][round_num - 1] = player.investment player.participant.vars['payoff'][round_num - 1] = player.payoff player.participant.payoff = player.payoff # PAGES def vars_for_all_templates(self): round_number = self.subsession.round_number return { 'endowment': c(self.player.participant.vars['environment'][round_number - 1][1]), 'probability': round(self.player.participant.vars['environment'][round_number - 1][2], 2), 'return': round(self.player.participant.vars['environment'][round_number - 1][3], 2), 'return2': round(self.player.participant.vars['environment'][round_number - 1][4], 2), } class Instruction(Page): form_model = 'player' form_fields = ['give'] # Only display instruction in round 1 @staticmethod def is_displayed(player: Player): return player.subsession.round_number == 1 @staticmethod def vars_for_template(player: Player) : return { 'slider_initial' : randint(0, 10), } class Instruction_Example(Page): pass class Investment(Page): form_model = 'player' form_fields = ['give', 'investment'] timeout_submission = {'investment': c(0)} # def vars_for_template(self): # round_number = self.subsession.round_number # return{ # 'endowment': c(self.player.participant.vars['environment'][round_number - 1][1]), # 'probability': self.player.participant.vars['environment'][round_number - 1][2], # 'return': self.player.participant.vars['environment'][round_number - 1][3] - 1 # } @staticmethod def before_next_page(player: Player, timeout_happened): round_number = player.subsession.round_number set_payoffs(player, round_number) @staticmethod def vars_for_template(player: Player): round_number = player.subsession.round_number return { 'endowment' : c(player.participant.vars['environment'][round_number - 1][1]), 'probability' : round(player.participant.vars['environment'][round_number - 1][2], 2), 'return' : round(player.participant.vars['environment'][round_number - 1][3], 2), 'return2' : round(player.participant.vars['environment'][round_number - 1][4], 2), 'slider_initial' : randint(0, 10), } @staticmethod def js_vars(player): round_number = player.subsession.round_number return { 'return': round(player.participant.vars['environment'][ round_number - 1][3], 2), 'return2': round( player.participant.vars['environment'][round_number - 1][4], 2), } class Pausepage(Page): @staticmethod def is_displayed(player: Player): player.participant.vars['ce_rand_round'] = player.subsession.rand_round # class ResultsWaitPage(WaitPage): # # def after_all_players_arrive(self): # pass # ---------------------------------------------------------------------------------------------------------------- class Results(Page): # skip results until last page # ---------------------------------------------------------------------------------------------------------------- @staticmethod def is_displayed(player: Player): # if Constants.one_choice_per_page: return player.subsession.round_number == Constants.num_rounds # return True @staticmethod def vars_for_template(player: Player): # round_num = self.subsession.round_number rand_num = player.subsession.rand_round # unzip into list of lists choices = player.participant.vars['environment'][rand_num - 1] endowment = choices[1] probability = round(choices[2], 2) if player.winner == 1: return_rate = round(choices[3], 2) else: return_rate = round(choices[4], 2) return { 'round_to_pay': rand_num, 'chosen_endowment': endowment, 'chosen_investment': player.participant.vars['investment'][rand_num - 1], 'chosen_probability': probability, 'chosen_return': return_rate, 'payoff': player.participant.payoff, } # ******************************************************************************************************************** # # *** PAGE SEQUENCE *** # # ******************************************************************************************************************** # page_sequence = [Instruction, Investment]