from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) import random from .machine_learning_algo import prediction_generator doc = """ A market game experiment to study learning based on machine learning. Essential market mechanism based on Kuhnen (2015) """ class Constants(BaseConstants): name_in_url = 'machine_teaching_with_pmachine' players_per_group = 2 num_rounds = 7 fixed_payoff = 3 high_payoff = 5 low_payoff = 1 instructions_template = 'Finance_experiment_with_ML/instructions_.html' class Subsession(BaseSubsession): def creating_session(self): for g in self.get_groups(): #random.seed(a=7) #experts payoffs = [] expert_1 = [] expert_2 = [] expert_3 = [] expert_4 = [] #random definition of asset states: 0 - low, 1 - high g.random_state = (0 if int(random.uniform(0, 1) // 0.5)==0 else 1) ###payoff definitions #low state k = 0 if g.random_state == 0: while k <= int(5): payoffs.append(int(0) if int(random.uniform(0, 1) // 0.7)==0 else 1) #note: 0.7 is the probability of bad outcome k += 1 #high state elif g.random_state == 1: while k <= int(5): payoffs.append(int(0) if int(random.uniform(0, 1) // 0.3)==0 else 1) #note: 0.3 is the probability of bad outcome k += 1 ###expert opinions for i in range(5): #payoff is high if payoffs[i] == 1: expert_1.append(int(0) if int(random.uniform(0, 1) // 0.8)==0 else 1) #note: 0.3 is the probability of - opinion expert_2.append(int(0) if int(random.uniform(0, 1) // 0.25)==0 else 1) #note: 0.5 is the probability of - opinion expert_3.append(int(0) if int(random.uniform(0, 1) // 0.5)==0 else 1) #note: 0.1 is the probability of - opinion expert_4.append(int(0) if int(random.uniform(0, 1) // 0.7) == 0 else 1) #payoff is low elif payoffs[i] == 0: expert_1.append(int(0) if int(random.uniform(0, 1) // 0.25)==0 else 1) # note: 0.9 is the probability of - opinion expert_2.append(int(0) if int(random.uniform(0, 1) // 0.8)==0 else 1) # note: 0.5 is the probability of - opinion expert_3.append(int(0) if int(random.uniform(0, 1) // 0.5)==0 else 1) # note: 0.4 is the probability of - opinion expert_4.append(int(0) if int(random.uniform(0, 1) // 0.25) == 0 else 1) g.expert_1_1 = expert_1[0] g.expert_1_2 = expert_1[1] g.expert_1_3 = expert_1[2] g.expert_1_4 = expert_1[3] g.expert_1_5 = expert_1[4] g.expert_2_1 = expert_2[0] g.expert_2_2 = expert_2[1] g.expert_2_3 = expert_2[2] g.expert_2_4 = expert_2[3] g.expert_2_5 = expert_2[4] g.expert_3_1 = expert_3[0] g.expert_3_2 = expert_3[1] g.expert_3_3 = expert_3[2] g.expert_3_4 = expert_3[3] g.expert_3_5 = expert_3[4] g.expert_4_1 = expert_4[0] g.expert_4_2 = expert_4[1] g.expert_4_3 = expert_4[2] g.expert_4_4 = expert_4[3] g.expert_4_5 = expert_4[4] g.payoff_1 = payoffs[0] g.payoff_2 = payoffs[1] g.payoff_3 = payoffs[2] g.payoff_4 = payoffs[3] g.payoff_5 = payoffs[4] #PREDICTIONS pred_input_1 = [g.expert_1_1, g.expert_2_1, g.expert_3_1, g.expert_4_1] pred_input_2 = [g.expert_1_2, g.expert_2_2, g.expert_3_2, g.expert_4_2] pred_input_3 = [g.expert_1_3, g.expert_2_3, g.expert_3_3, g.expert_4_3] pred_input_4 = [g.expert_1_4, g.expert_2_4, g.expert_3_4, g.expert_4_4] pred_input_5 = [g.expert_1_5, g.expert_2_5, g.expert_3_5, g.expert_4_5] g.prediction_1 = prediction_generator(pred_input_1) g.prediction_2 = prediction_generator(pred_input_2) g.prediction_3 = prediction_generator(pred_input_3) g.prediction_4 = prediction_generator(pred_input_4) g.prediction_5 = prediction_generator(pred_input_5) class Group(BaseGroup): def set_income(self): for p in self.get_players(): p.payoff = p.income_1 + p.income_2 + p.income_3 + p.income_4 + p.income_5 p.passing_payoffs() def set_payoffs(self): for p in self.get_players(): list_ = [ [p.choice_1, self.payoff_1], [p.choice_2, self.payoff_2], [p.choice_3, self.payoff_3], [p.choice_4, self.payoff_4], [p.choice_5, self.payoff_5] ] payoff_list = [] for k in range(len(list_)): if list_[k][0] == 0: payoff_list.append(Constants.fixed_payoff) elif list_[k][0] == 1 & list_[k][1] == 0.0: payoff_list.append(Constants.low_payoff) elif list_[k][0] == 1 & list_[k][1] == 1: payoff_list.append(Constants.high_payoff) else: payoff_list.append(1) p.income_1 = payoff_list[0] p.income_2 = payoff_list[1] p.income_3 = payoff_list[2] p.income_4 = payoff_list[3] p.income_5 = payoff_list[4] random_state = models.IntegerField(initial=-1) #round 1 expert_1_1 = models.IntegerField(initial=-1) expert_2_1 = models.IntegerField(initial=-1) expert_3_1 = models.IntegerField(initial=-1) expert_4_1 = models.IntegerField(initial=-1) prediction_1 = models.IntegerField(initial=-1) payoff_1 = models.IntegerField(initial=-1) # round 2 expert_1_2 = models.IntegerField(initial=-1) expert_2_2 = models.IntegerField(initial=-1) expert_3_2 = models.IntegerField(initial=-1) expert_4_2 = models.IntegerField(initial=-1) prediction_2 = models.IntegerField(initial=-1) payoff_2 = models.IntegerField(initial=-1) # round 1 expert_1_3 = models.IntegerField(initial=-1) expert_2_3 = models.IntegerField(initial=-1) expert_3_3 = models.IntegerField(initial=-1) expert_4_3 = models.IntegerField(initial=-1) prediction_3 = models.IntegerField(initial=-1) payoff_3 = models.IntegerField(initial=-1) # round 1 expert_1_4 = models.IntegerField(initial=-1) expert_2_4 = models.IntegerField(initial=-1) expert_3_4 = models.IntegerField(initial=-1) expert_4_4 = models.IntegerField(initial=-1) prediction_4 = models.IntegerField(initial=-1) payoff_4 = models.IntegerField(initial=-1) # round 1 expert_1_5 = models.IntegerField(initial=-1) expert_2_5 = models.IntegerField(initial=-1) expert_3_5 = models.IntegerField(initial=-1) expert_4_5 = models.IntegerField(initial=-1) prediction_5 = models.IntegerField(initial=-1) payoff_5 = models.IntegerField(initial=-1) class Player(BasePlayer): #################### # RELIANCE MEASURES #################### q_reliance_1 = models.IntegerField(label='On which source of information did you rely most?', choices=[ [1, 'Expert 1'], [2, 'Expert 2'], [3, 'Expert 3'], [4, 'Expert 4'], [5, 'The Machine Learning System'], ], widget=widgets.RadioSelect ) # q_reliance_2 = models.IntegerField(label='If you had the choice, would you rather see only the information provided by the artificial intelligence, or only the information provided by the four experts?', # choices=[ # [0, 'Experts'], # [1, 'The Artificial Intelligence'], # ], # widget=widgets.RadioSelect # ) #################### # TRIALS #################### trial_1 = models.IntegerField(initial=-1, label='I invest into the', choices=[ [0, 'Bond'], [1, 'Stock'], ], widget=widgets.RadioSelect ) trial_2 = models.IntegerField(initial=-1, label='I invest into the', choices=[ [0, 'Bond'], [1, 'Stock'], ], widget=widgets.RadioSelect ) #################### # MARKET 1 #################### choice_1 = models.IntegerField(initial=-1, label='I invest into the', choices=[ [0, 'Bond'], [1, 'Stock'], ], widget=widgets.RadioSelect ) income_1 = models.IntegerField(initial=-1) #################### # MARKET 2 #################### choice_2 = models.IntegerField(initial=-1, label='I invest into the', choices=[ [0, 'Bond'], [1, 'Stock'], ], widget=widgets.RadioSelect ) income_2 = models.IntegerField(initial=-1) #################### # MARKET 3 #################### choice_3 = models.IntegerField(initial=-1, label='I invest into the', choices=[ [0, 'Bond'], [1, 'Stock'], ], widget=widgets.RadioSelect ) income_3 = models.IntegerField(initial=-1) #################### # MARKET 4 #################### choice_4 = models.IntegerField(initial=-1, label='I invest into the', choices=[ [0, 'Bond'], [1, 'Stock'], ], widget=widgets.RadioSelect ) income_4 = models.IntegerField(initial=-1) #################### # MARKET 5 #################### choice_5 = models.IntegerField(initial=-1, label='I invest into the', choices=[ [0, 'Bond'], [1, 'Stock'], ], widget=widgets.RadioSelect ) income_5 = models.IntegerField(initial=-1) #################### # TIME OUTS #################### time_out_1 = models.BooleanField(initial=False) time_out_2 = models.BooleanField(initial=False) time_out_3 = models.BooleanField(initial=False) time_out_4 = models.BooleanField(initial=False) time_out_5 = models.BooleanField(initial=False) over_all_payoff = models.CurrencyField(initial=0) def passing_payoffs(self): temp = 0 for i in range(len(self.in_all_rounds())): temp += self.in_all_rounds()[i].payoff self.over_all_payoff = int(temp) self.participant.vars['payoffs_app1'] = self.over_all_payoff