from otree.api import * c = cu doc = '' class C(BaseConstants): NAME_IN_URL = 'Experiment' PLAYERS_PER_GROUP = None NUM_ROUNDS = 60 PRICE = 100 class Subsession(BaseSubsession): price1 = models.IntegerField() price3 = models.IntegerField() price5 = models.IntegerField() price7 = models.IntegerField() price9 = models.IntegerField() def path1(subsession: Subsession): list1=[-10, -10, 10, 10, 10, -10, -10, 10, -10, -10, 10, -10, -10, -10, 10, 10, 10, -10, 10, -10, 10, 10, 10, 10, 10, -10, 10, 10, -10, -10] test=list1 return test def path3(subsession: Subsession): list3=[10, 10, 10, 10, -10, 10, 10, -10, -10, 10, 10, 10, 10, -10, 10, 10, -10, 10, -10, -10, 10, -10, 10, -10, 10, 10, 10, 10, 10, -10] test=list3 return test def path5(subsession: Subsession): list5=[10, 10, 10, 10, -10, 10, -10, 10, 10, -10, -10, 10, 10, 10, -10, 10, 10, 10, 10, -10, 10, 10, -10, -10, 10, 10, -10, -10, -10, 10] test=list5 return test def path7(subsession: Subsession): list7=[-10, -10, 10, 10, -10, -10, 10, -10, -10, 10, 10, -10, 10, 10, 10, 10, 10, -10, -10, 10, 10, -10, -10, 10, 10, -10, 10, 10, 10, 10] test=list7 return test def path9(subsession: Subsession): list9=[-10, -10, -10, 10, -10, 10, 10, 10, 10, 10, 10, -10, 10, -10, -10, 10, 10, -10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10] test=list9 return test class Group(BaseGroup): pass class Player(BasePlayer): Buy1 = models.BooleanField(choices=[[True, 'Yes'], [False, 'No']], label='Do you want to buy the stock now?', widget=widgets.RadioSelect) Sell1 = models.BooleanField(choices=[[True, 'Yes'], [False, 'No']], label='Do you want to sell the stock now?', widget=widgets.RadioSelect) Treatment = models.IntegerField() Trading_question = models.StringField() Treatment2 = models.IntegerField() Account = models.IntegerField() Price = models.IntegerField() PriceChange = models.IntegerField() Belief = models.IntegerField() Bought = models.BooleanField() Sold = models.BooleanField() NoTransaction = models.BooleanField() LastBelief = models.IntegerField() PaymentSet = models.IntegerField() AggregateChange = models.IntegerField() OwnsStock = models.BooleanField() IndividualPrices = models.StringField() CorrectProb = models.FloatField() def assign_second_treatment(player: Player): import random if player.Treatment==1: player.Treatment2=random.choice([4,6,8,10,12,13,14,15]) elif player.Treatment==3: player.Treatment2=random.choice([2,6,8,10,11,13,14,15]) elif player.Treatment==5: player.Treatment2=random.choice([2,4,8,10,11,12,14,15]) elif player.Treatment==7: player.Treatment2=random.choice([2,4,6,10,11,12,13,15]) elif player.Treatment==9: player.Treatment2=random.choice([2,4,6,8,11,12,13,14]) elif player.Treatment==2: player.Treatment2=random.choice([3,5,7,9,12,13,14,15]) elif player.Treatment==4: player.Treatment2=random.choice([1,5,7,9,11,13,14,15]) elif player.Treatment==6: player.Treatment2=random.choice([1,3,7,9,11,12,14,15]) elif player.Treatment==8: player.Treatment2=random.choice([1,3,5,9,11,12,13,15]) elif player.Treatment==10: player.Treatment2=random.choice([1,3,5,7,11,12,13,14]) elif player.Treatment==11: player.Treatment2=random.choice([4,6,8,10,3,5,7,9]) elif player.Treatment==12: player.Treatment2=random.choice([2,6,8,10,1,5,7,9]) elif player.Treatment==13: player.Treatment2=random.choice([2,4,8,10,1,5,7,9]) elif player.Treatment==14: player.Treatment2=random.choice([2,4,6,10,1,3,5,9]) else: player.Treatment2=random.choice([2,4,6,8,1,3,5,7]) return player.Treatment2 def determine_payment(player: Player): import random player.PaymentSet=random.choice([1,2]) return player.PaymentSet class TreatmentInstruction(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): session = player.session subsession = player.subsession participant = player.participant if player.round_number==1: player.Treatment=participant.treatmentnumber else: prev_player=player.in_round(subsession.round_number-1) player.Treatment2=prev_player.Treatment2 return player.round_number==1 or player.round_number==31 @staticmethod def vars_for_template(player: Player): if player.round_number==1: treatment=player.Treatment set="First Set" else: treatment=player.Treatment2 set="Second Set" if treatment==1 or treatment==3 or treatment==5 or treatment==7 or treatment==9: description="cont5" elif treatment>10: description="cont1" else: description="disc" return dict( description=description, set=set, ) class Zero(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number==1 or player.round_number==31 @staticmethod def vars_for_template(player: Player): if player.round_number==1: round=player.round_number-1 else: round=player.round_number-31 return dict( round=round, ) class PriceUpdate(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): session = player.session subsession = player.subsession x1=path1(subsession) x3=path3(subsession) x5=path5(subsession) x7=path7(subsession) x9=path9(subsession) if subsession.round_number<=30: z1=x1[subsession.round_number-1] z3=x3[subsession.round_number-1] z5=x5[subsession.round_number-1] z7=x7[subsession.round_number-1] z9=x9[subsession.round_number-1] else: z1=x1[subsession.round_number-31] z3=x3[subsession.round_number-31] z5=x5[subsession.round_number-31] z7=x7[subsession.round_number-31] z9=x9[subsession.round_number-31] if subsession.round_number==1: subsession.price1=C.PRICE+z1 subsession.price3=C.PRICE+z3 subsession.price5=C.PRICE+z5 subsession.price7=C.PRICE+z7 subsession.price9=C.PRICE+z9 player.Trading_question="sell" player.Buy1=True player.Sell1=False player.Treatment=player.Treatment player.Treatment2=assign_second_treatment(player) elif subsession.round_number==31: subsession.price1=C.PRICE+z1 subsession.price3=C.PRICE+z3 subsession.price5=C.PRICE+z5 subsession.price7=C.PRICE+z7 subsession.price9=C.PRICE+z9 prev_player=player.in_round(subsession.round_number-1) player.Treatment=prev_player.Treatment player.Treatment2=prev_player.Treatment2 prev_account=prev_player.Account player.Trading_question="sell" player.Buy1=True player.Sell1=False else: prev_subsession=subsession.in_round(subsession.round_number-1) prev_player=player.in_round(subsession.round_number-1) prev_price=prev_player.Price prev_price1=prev_subsession.price1 subsession.price1=prev_price+z1 prev_price3=prev_subsession.price3 subsession.price3=prev_price+z3 prev_price5=prev_subsession.price5 subsession.price5=prev_price+z5 prev_price7=prev_subsession.price7 subsession.price7=prev_price+z7 prev_price9=prev_subsession.price9 subsession.price9=prev_price+z9 player.Buy1=prev_player.Buy1 player.Sell1=prev_player.Sell1 player.Treatment=prev_player.Treatment player.Treatment2=prev_player.Treatment2 prev_account=prev_player.Account if prev_player.Trading_question=="sell" and player.Sell1==False: current_account1=prev_account current_account3=prev_account current_account5=prev_account current_account7=prev_account current_account9=prev_account elif prev_player.Trading_question=="sell" and player.Sell1==True: current_account1=prev_account+prev_price1 current_account3=prev_account+prev_price3 current_account5=prev_account+prev_price5 current_account7=prev_account+prev_price7 current_account9=prev_account+prev_price9 elif prev_player.Trading_question=="buy" and player.Buy1==False: current_account1=prev_account current_account3=prev_account current_account5=prev_account current_account7=prev_account current_account9=prev_account else: current_account1=prev_account-prev_price1 current_account3=prev_account-prev_price3 current_account5=prev_account-prev_price5 current_account7=prev_account-prev_price7 current_account9=prev_account-prev_price9 player.Trading_question=prev_player.Trading_question if subsession.round_number<=30: treatment=player.Treatment else: treatment=player.Treatment2 if treatment<=10: if subsession.round_number==1 or subsession.round_number==31: player.Account=50 elif player.round_number%5==1: if treatment==1 or treatment==2: player.Account=current_account1 elif treatment==3 or treatment==4: player.Account=current_account3 elif treatment==5 or treatment==6: player.Account=current_account5 elif treatment==7 or treatment==8: player.Account=current_account7 else: player.Account=current_account9 else: prev_player=player.in_round(subsession.round_number-1) player.Account=prev_player.Account else: if subsession.round_number==1 or subsession.round_number==31: player.Account=50 else: if treatment==11: player.Account=current_account1 elif treatment==12: player.Account=current_account3 elif treatment==13: player.Account=current_account5 elif treatment==14: player.Account=current_account7 else: player.Account=current_account9 if treatment==1 or treatment==11 or treatment==2: player.Price=subsession.price1 player.PriceChange=z1 elif treatment==3 or treatment==12 or treatment==4: player.Price=subsession.price3 player.PriceChange=z3 elif treatment==5 or treatment==13 or treatment==6: player.Price=subsession.price5 player.PriceChange=z5 elif treatment==7 or treatment==14 or treatment==8: player.Price=subsession.price7 player.PriceChange=z7 else: player.Price=subsession.price9 player.PriceChange=z9 if subsession.round_number==1 or subsession.round_number==31: pgood=0.5 else: prev_player=player.in_round(subsession.round_number-1) player.CorrectProb=prev_player.CorrectProb pgood=player.CorrectProb*0.8+(1-player.CorrectProb)*0.2 if player.PriceChange>0: numerator=0.7*pgood denominator=0.7*pgood+0.3*(1-pgood) else: numerator=0.3*pgood denominator=0.3*pgood+0.7*(1-pgood) player.CorrectProb=numerator/denominator if treatment==1 or treatment==3 or treatment==5 or treatment==7 or treatment==9 or treatment==11 or treatment==12 or treatment==13 or treatment==14 or treatment==15: return True else: return player.round_number%5==0 @staticmethod def vars_for_template(player: Player): session = player.session subsession = player.subsession if subsession.round_number<=30: treatment=player.Treatment round=subsession.round_number else: treatment=player.Treatment2 round=subsession.round_number-30 if treatment==2 or treatment==4 or treatment==6 or treatment==8 or treatment==10: prev1_player=player.in_round(subsession.round_number-1) prev2_player=player.in_round(subsession.round_number-2) prev3_player=player.in_round(subsession.round_number-3) prev4_player=player.in_round(subsession.round_number-4) current_price=player.PriceChange prev_price1=prev1_player.PriceChange prev_price2=prev2_player.PriceChange prev_price3=prev3_player.PriceChange prev_price4=prev4_player.PriceChange player.IndividualPrices="$"+str(prev_price4)+", $"+str(prev_price3)+", $"+str(prev_price2)+", $"+str(prev_price1)+", $"+str(current_price) player.AggregateChange=current_price+prev_price1+prev_price2+prev_price3+prev_price4 else: player.IndividualPrices="0" player.AggregateChange=0 return dict( treatment=treatment, round=round, individual_prices=player.IndividualPrices, aggregate_change=player.AggregateChange, ) class BeliefElicitation(Page): form_model = 'player' form_fields = ['Belief'] @staticmethod def is_displayed(player: Player): session = player.session subsession = player.subsession if subsession.round_number<=30: treatment=player.Treatment else: treatment=player.Treatment2 if treatment==1 or treatment==3 or treatment==5 or treatment==7 or treatment==9 or treatment==11 or treatment==12 or treatment==13 or treatment==14 or treatment==15: return True else: return player.round_number%5==0 @staticmethod def vars_for_template(player: Player): session = player.session subsession = player.subsession if subsession.round_number<=30: treatment=player.Treatment round=subsession.round_number else: treatment=player.Treatment2 round=subsession.round_number-30 if subsession.round_number==1 or subsession.round_number==31: past_prices="There are no previous price changes." elif subsession.round_number==2 or subsession.round_number==32: prev1_player=player.in_round(subsession.round_number-1) prev_price1=prev1_player.PriceChange past_prices="The last period's price change was $"+str(prev_price1)+"." elif subsession.round_number==3 or subsession.round_number==33: prev1_player=player.in_round(subsession.round_number-1) prev2_player=player.in_round(subsession.round_number-2) prev_price1=prev1_player.PriceChange prev_price2=prev2_player.PriceChange past_prices="The last 2 period's price changes were $"+str(prev_price1)+" and $"+str(prev_price2)+"." elif subsession.round_number==4 or subsession.round_number==34: prev1_player=player.in_round(subsession.round_number-1) prev2_player=player.in_round(subsession.round_number-2) prev3_player=player.in_round(subsession.round_number-3) prev_price1=prev1_player.PriceChange prev_price2=prev2_player.PriceChange prev_price3=prev3_player.PriceChange past_prices="The last 3 period's price changes were $"+str(prev_price1)+", $"+str(prev_price2)+" and $"+str(prev_price3)+"." else: prev1_player=player.in_round(subsession.round_number-1) prev2_player=player.in_round(subsession.round_number-2) prev3_player=player.in_round(subsession.round_number-3) prev4_player=player.in_round(subsession.round_number-4) prev_price1=prev1_player.PriceChange prev_price2=prev2_player.PriceChange prev_price3=prev3_player.PriceChange prev_price4=prev4_player.PriceChange past_prices="The last 4 period's price changes were $"+str(prev_price1)+", $"+str(prev_price2)+", $"+str(prev_price3)+" and $"+str(prev_price4)+"." if treatment==1 or treatment==3 or treatment==5 or treatment==7 or treatment==9 or treatment>10: cont=1 if subsession.round_number==1 or subsession.round_number==31: player.LastBelief=50 player.OwnsStock=True else: prev_player=player.in_round(subsession.round_number-1) player.LastBelief=prev_player.Belief player.OwnsStock=prev_player.OwnsStock else: cont=0 if subsession.round_number==5 or subsession.round_number==35: player.LastBelief=50 player.OwnsStock=True else: prev5_player=player.in_round(subsession.round_number-5) player.LastBelief=prev5_player.Belief player.OwnsStock=prev5_player.OwnsStock return dict( treatment=treatment, round=round, cont=cont, past_prices=past_prices, lastbelief=player.LastBelief, individual_prices=player.IndividualPrices, ) class TradingDecision(Page): form_model = 'player' form_fields = ['Buy1', 'Sell1'] @staticmethod def get_form_fields(player: Player): session = player.session subsession = player.subsession if subsession.round_number==1 or subsession.round_number==31: player.Trading_question="sell" player.Buy1=True player.Sell1=False else: prev_player=player.in_round(subsession.round_number-1) player.Trading_question=prev_player.Trading_question player.Buy1=prev_player.Buy1 player.Sell1=prev_player.Sell1 if player.Trading_question=="sell" and player.Sell1==False: player.Sell1=None return ['Sell1'] elif player.Trading_question=="sell" and player.Sell1==True: player.Trading_question="buy" player.Buy1=None return ['Buy1'] elif player.Trading_question=="buy" and player.Buy1==False: player.Buy1=None return ['Buy1'] else: player.Trading_question="sell" player.Sell1=None return ['Sell1'] @staticmethod def is_displayed(player: Player): session = player.session subsession = player.subsession if subsession.round_number<=30: treatment=player.Treatment else: treatment=player.Treatment2 if treatment<=10: return player.round_number%5==0 and player.round_number%30!=0 else: return player.round_number%1==0 and player.round_number%30!=0 @staticmethod def vars_for_template(player: Player): session = player.session subsession = player.subsession if subsession.round_number==1 or subsession.round_number==31: past_prices="There are no previous price changes." elif subsession.round_number==2 or subsession.round_number==32: prev1_player=player.in_round(subsession.round_number-1) prev_price1=prev1_player.PriceChange past_prices="The last period's price change was $"+str(prev_price1)+"." elif subsession.round_number==3 or subsession.round_number==33: prev1_player=player.in_round(subsession.round_number-1) prev2_player=player.in_round(subsession.round_number-2) prev_price1=prev1_player.PriceChange prev_price2=prev2_player.PriceChange past_prices="The last 2 period's price changes were $"+str(prev_price1)+" and $"+str(prev_price2)+"." elif subsession.round_number==4 or subsession.round_number==34: prev1_player=player.in_round(subsession.round_number-1) prev2_player=player.in_round(subsession.round_number-2) prev3_player=player.in_round(subsession.round_number-3) prev_price1=prev1_player.PriceChange prev_price2=prev2_player.PriceChange prev_price3=prev3_player.PriceChange past_prices="The last 3 period's price changes were $"+str(prev_price1)+", $"+str(prev_price2)+" and $"+str(prev_price3)+"." else: prev1_player=player.in_round(subsession.round_number-1) prev2_player=player.in_round(subsession.round_number-2) prev3_player=player.in_round(subsession.round_number-3) prev4_player=player.in_round(subsession.round_number-4) prev_price1=prev1_player.PriceChange prev_price2=prev2_player.PriceChange prev_price3=prev3_player.PriceChange prev_price4=prev4_player.PriceChange past_prices="The last 4 period's price changes were $"+str(prev_price1)+", $"+str(prev_price2)+", $"+str(prev_price3)+" and $"+str(prev_price4)+"." if subsession.round_number<=30: treatment=player.Treatment round=subsession.round_number else: treatment=player.Treatment2 round=subsession.round_number-30 if treatment==1 or treatment==3 or treatment==5 or treatment==7 or treatment==9 or treatment>10: cont=1 if subsession.round_number==1 or subsession.round_number==31: player.OwnsStock=True else: prev_player=player.in_round(subsession.round_number-1) player.OwnsStock=prev_player.OwnsStock else: cont=0 if subsession.round_number==5 or subsession.round_number==35: player.OwnsStock=True else: prev5_player=player.in_round(subsession.round_number-5) player.OwnsStock=prev5_player.OwnsStock return dict( past_prices=past_prices, round=round, cont=cont, individual_prices=player.IndividualPrices, ) class Infoscreen(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): session = player.session subsession = player.subsession if player.Trading_question=="sell" and player.Sell1==False: player.Bought=False player.Sold=False player.NoTransaction=True player.OwnsStock=True elif player.Trading_question=="sell" and player.Sell1==True: player.Bought=False player.Sold=True player.NoTransaction=False player.OwnsStock=False elif player.Trading_question=="buy" and player.Buy1==False: player.Bought=False player.Sold=False player.NoTransaction=True player.OwnsStock=False else: player.Bought=True player.Sold=False player.NoTransaction=False player.OwnsStock=True if subsession.round_number<=30: treatment=player.Treatment else: treatment=player.Treatment2 if treatment<=10: return player.round_number%5==0 and player.round_number%30!=0 else: return player.round_number%1==0 and player.round_number%30!=0 @staticmethod def vars_for_template(player: Player): session = player.session subsession = player.subsession if subsession.round_number<=30: round=subsession.round_number else: round=subsession.round_number-30 if player.Bought==True: new_account=player.Account-player.Price elif player.Sold==True: new_account=player.Account+player.Price else: new_account=player.Account return dict( round=round, new_account=new_account, ) class Outcome(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number%30==0 @staticmethod def vars_for_template(player: Player): session = player.session subsession = player.subsession round=subsession.round_number prev_player=player.in_round(subsession.round_number-1) player.Treatment=prev_player.Treatment player.Treatment2=prev_player.Treatment2 if prev_player.Trading_question=="sell" and player.Sell1==False: current_account1=player.Account+player.Price current_account2=player.Account+player.Price current_account3=player.Account+player.Price current_account4=player.Account+player.Price current_account5=player.Account+player.Price current_account6=player.Account+player.Price current_account7=player.Account+player.Price current_account8=player.Account+player.Price current_account9=player.Account+player.Price current_account10=player.Account+player.Price elif prev_player.Trading_question=="sell" and player.Sell1==True: current_account1=player.Account current_account2=player.Account current_account3=player.Account current_account4=player.Account current_account5=player.Account current_account6=player.Account current_account7=player.Account current_account8=player.Account current_account9=player.Account current_account10=player.Account elif prev_player.Trading_question=="buy" and player.Buy1==False: current_account1=player.Account current_account2=player.Account current_account3=player.Account current_account4=player.Account current_account5=player.Account current_account6=player.Account current_account7=player.Account current_account8=player.Account current_account9=player.Account current_account10=player.Account else: current_account1=player.Account+player.Price current_account2=player.Account+player.Price current_account3=player.Account+player.Price current_account4=player.Account+player.Price current_account5=player.Account+player.Price current_account6=player.Account+player.Price current_account7=player.Account+player.Price current_account8=player.Account+player.Price current_account9=player.Account+player.Price current_account10=player.Account+player.Price if round<=30: treatment=player.Treatment else: treatment=player.Treatment2 if treatment==1 or treatment==11: player.Account=current_account1 elif treatment==2: player.Account=current_account2 elif treatment==3 or treatment==12: player.Account=current_account3 elif treatment==4: player.Account=current_account4 elif treatment==5 or treatment==13: player.Account=current_account5 elif treatment==6: player.Account=current_account6 elif treatment==7 or treatment==14: player.Account=current_account7 elif treatment==8: player.Account=current_account8 elif treatment==9 or treatment==15: player.Account=current_account9 else: player.Account=current_account10 return dict( balance=player.Account, ) class SetForPayment(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number%60==0 @staticmethod def vars_for_template(player: Player): session = player.session subsession = player.subsession player.PaymentSet=determine_payment(player) firstset_player=player.in_round(subsession.round_number-30) firstset_account=firstset_player.Account secondset_account=player.Account import random if (player.Treatment==1 or player.Treatment==3 or player.Treatment==5 or player.Treatment==7 or player.Treatment==9 or player.Treatment>10) and (player.Treatment2==1 or player.Treatment2==3 or player.Treatment2==5 or player.Treatment2==7 or player.Treatment2==9 or player.Treatment2>10): selected_estimates=random.sample(range(60),10) elif (player.Treatment==1 or player.Treatment==3 or player.Treatment==5 or player.Treatment==7 or player.Treatment==9 or player.Treatment>10) and (player.Treatment2==2 or player.Treatment2==4 or player.Treatment2==6 or player.Treatment2==8 or player.Treatment2==10): selected_estimates=random.sample([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,35,40,45,50,55,60],10) else: selected_estimates=random.sample([5,10,15,20,25,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60],10) estimate1round=selected_estimates[0] estimate2round=selected_estimates[1] estimate3round=selected_estimates[2] estimate4round=selected_estimates[3] estimate5round=selected_estimates[4] estimate6round=selected_estimates[5] estimate7round=selected_estimates[6] estimate8round=selected_estimates[7] estimate9round=selected_estimates[8] estimate10round=selected_estimates[9] estimate1player=player.in_round(estimate1round) estimate1=estimate1player.Belief correctprob1=estimate1player.CorrectProb if estimate1>correctprob1*100-5 and estimate1correctprob2*100-5 and estimate2correctprob3*100-5 and estimate3correctprob4*100-5 and estimate4correctprob5*100-5 and estimate5correctprob6*100-5 and estimate6correctprob7*100-5 and estimate7correctprob8*100-5 and estimate8correctprob9*100-5 and estimate9correctprob10*100-5 and estimate10