from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) doc = '' class Constants(BaseConstants): name_in_url = 'Game' players_per_group = None num_rounds = 61 initial_investment = 50000 timeseries = ('Jan 2021', 'Mar 2021', 'Jun 2021', 'Aug 2021', 'Dec 2021', 'Mar 2022', 'Jun 2022', 'Aug 2022', 'Dec 2022', 'Mar 2023', 'Jun 2023', 'Aug 2023', 'Dec 2023', 'Mar 2024', 'Jun 2024', 'Aug 2024', 'Dec 2024', 'Mar 2025', 'Jun 2025', 'Aug 2025', 'Dec 2025', 'Mar 2026', 'Jun 2026', 'Aug 2026', 'Dec 2026', 'Mar 2027', 'Jun 2027', 'Aug 2027', 'Dec 2027', 'Mar 2028', 'Jun 2028', 'Aug 2028', 'Dec 2028', 'Mar 2029', 'Jun 2029', 'Aug 2029', 'Dec 2029', 'Mar 2030', 'Jun 2030', 'Aug 2030', 'Dec 2030', 'Mar 2031', 'Jun 2031', 'Aug 2031', 'Dec 2031', 'Mar 2032', 'Jun 2032', 'Aug 2032', 'Dec 2032', 'Mar 2033', 'Jun 2033', 'Aug 2033', 'Dec 2033', 'Mar 2034', 'Jun 2034', 'Aug 2034', 'Dec 2034', 'Mar 2035', 'Jun 2035', 'Aug 2035', 'Dec 2035') quarterly_performance = (0, 11.07, 2.41, -19.73, -18.43, 1.37, -8.7, 11.21, 3.38, 5.49, 5.33, 1.89, -3.02, 2.29, 3.42, 7.8, 7.42, 5.34, 3.91, -5.84, 5.45, 4.1, 1.53, 4.98, -2.8, -5.08, -16.09, -1.1, -4.94, -20.95, -7.79, 14.3, 12.7, 6.03, 9.47, -3.53, 2.08, 10.87, -0.93, -1.66, -9.89, 11.2, 8.75, -0.38, 5.26, 0.01, 10.61, -0.57, 3.88, 6.09, 1.24, 5.55, 6.04, 5.45, 15.27, -3.31, -8.62, 8.41, -5.01, 3.61, 3.67) cumulative_market_return = (0, 11.07, 13.74, -8.69, -25.52, -24.5, -31.07, -23.34, -20.75, -16.39, -11.94, -10.27, -12.99, -10.99, -7.95, -0.77, 6.6, 12.29, 16.68, 9.87, 15.85, 20.61, 22.46, 28.55, 24.96, 18.6, -0.48, -1.57, -6.44, -26.04, -31.8, -22.05, -12.15, -6.86, 1.96, -1.63, 0.42, 11.33, 10.3, 8.46, -2.27, 8.68, 18.19, 17.74, 23.94, 23.95, 37.1, 36.31, 41.6, 50.22, 52.09, 60.53, 70.24, 79.52, 106.94, 100.09, 82.85, 98.22, 88.3, 95.09, 102.25) quarterly_performance_PREVIEW = (0, 4.3, 5.4, 3.1, -8.5, -5, 3, 6, 3, 1, 2, 4) cumulative_market_return_PREVIEW = (0, 4.3, 9.7, 12.8, 4.3, -0.7, 2.3, 8.3, 11.3, 12.3, 14.3, 18.3) class Subsession(BaseSubsession): def creating_session(self): import itertools treatment_group = itertools.cycle(['yearly_edu', 'yearly', 'quarterly_edu', 'quarterly']) is_positive_info = itertools.cycle([True, False,False,True]) for p in self.get_players(): p.treatment_group = next(treatment_group) if (p.treatment_group == "yearly_edu" or p.treatment_group =="quarterly_edu"): p.is_positive_info = next(is_positive_info) class Group(BaseGroup): pass class Player(BasePlayer): portfolio_returnInEur = models.CurrencyField() portfolio_returnInPercent = models.FloatField() player_invests = models.BooleanField(initial=True) market_performance = models.FloatField() valence = models.IntegerField(choices=[[1, '1'], [2, '2'], [3, '3'], [4, '4'], [5, '5']], widget=widgets.RadioSelectHorizontal) arousal = models.IntegerField(choices=[[1, '1'], [2, '2'], [3, '3'], [4, '4'], [5, '5']], widget=widgets.RadioSelectHorizontal) perceived_risk = models.IntegerField(choices=[[1, '1 (risikolos)'], [2, '2 (risikoarm)'], [3, '3 (neutral)'], [4, '4 (risikoreich)'], [5, '5 (sehr risikoreich)']], widget=widgets.RadioSelectHorizontal) confidence = models.IntegerField(choices=[[1, '1 (sehr unsicher)'], [2, '2 (unsicher)'], [3, '3 (indifferent)'], [4, '4 (sicher)'], [5, '5 (sehr sicher)']], widget=widgets.RadioSelectHorizontal) cash = models.CurrencyField(initial=0) treatment_group = models.StringField() acs_1 = models.StringField(choices=[['a', 'kann ich mich schlecht auf etwas anderes konzentrieren.'], ['b', 'denke ich nicht mehr lange darüber nach.']], widget=widgets.RadioSelect) acs_2 = models.StringField(choices=[['a', 'muss ich mir oft einen Ruck geben, um den Anfang zu kriegen. '], ['b', 'fällt es mir leicht, es schnell hinter mich zu bringen.']], widget=widgets.RadioSelect) acs_4 = models.StringField(choices=[['a', 'dauert es lange, bis ich mich damit abfinde.'], ['b', 'denke ich nicht mehr lange darüber nach.']], widget=widgets.RadioSelect) acs_5 = models.StringField(choices=[['a', 'kann ich mich manchmal nicht entscheiden, was ich tun soll.'], ['b', 'habe ich meist rasch eine neue Beschäftigung.']], widget=widgets.RadioSelect) acs_7 = models.StringField(choices=[['a', 'denke ich bald nicht mehr daran.'], ['b', 'geht mir das noch eine ganze Weile durch den Kopf.']], widget=widgets.RadioSelect) acs_8 = models.StringField(choices=[['a', 'kommt mir die Sache vor wie ein Berg vor.'], ['b', 'überlege ich, wie ich die Sache auf eine einigermaßen angenehme Weise hinter mich bringen kann.']], widget=widgets.RadioSelect) acs_10 = models.StringField(choices=[['a', 'finde ich mich rasch mit der Sache ab.'], ['b', 'komme ich nicht so schnell darüber hinweg.']], widget=widgets.RadioSelect) acs_11 = models.StringField(choices=[['a', 'lege ich meist sofort los.'], ['b', 'gehen mir zuerst andere Dinge durch den Kopf, bevor ich mich richtig an die Aufgabe heranmache.']], widget=widgets.RadioSelect) acs_13 = models.StringField(choices=[['a', 'geht mir das oft durch den Kopf, auch wenn ich mich schon mit etwas anderem beschäftige.'], ['b', 'blende ich das aus, bis die nächste Gelegenheit kommt, ihn zu treffen.']], widget=widgets.RadioSelect) acs_14 = models.StringField(choices=[['a', 'überlege ich manchmal eine Weile, bis ich mich entscheiden kann.'], ['b', 'entscheide ich mich meist ohne Schwierigkeit für eine der möglichen Beschäftigungen.']], widget=widgets.RadioSelect) acs_16 = models.StringField(choices=[['a', 'fällt es mir schwer, mich auf irgendetwas anderes zu konzentrieren.'], ['b', 'fällt es mir leicht, die Sache auszublenden.']], widget=widgets.RadioSelect) acs_17 = models.StringField(choices=[['a', 'fällt es mir oft schwer, mich an die Arbeit zu machen.'], ['b', 'fange ich meist ohne weiteres an.']], widget=widgets.RadioSelect) acs_19 = models.StringField(choices=[['a', 'lasse ich mich davon nicht lange beirren.'], ['b', 'bin ich zuerst wie gelähmt.']], widget=widgets.RadioSelect) acs_20 = models.StringField(choices=[['a', 'überlege ich oft, wo ich anfangen soll.'], ['b', 'fällt es mir leicht, einen Plan zu machen und ihn auszuführen.']], widget=widgets.RadioSelect) acs_22 = models.StringField(choices=[['a', 'kann ich mich zuerst schlecht aufraffen, irgendetwas anderes anzupacken.'], ['b', 'lasse ich die Sache erst mal auf sich beruhen und wende mich ohne Schwierigkeiten anderen Dingen zu.']], widget=widgets.RadioSelect) acs_23 = models.StringField(choices=[['a', 'beginne ich schnell mit einer Sache und denke gar nicht mehr an die andere.'], ['b', 'fällt es mir nicht so leicht, von einer der beiden Sachen ganz Abstand zu nehmen.']], widget=widgets.RadioSelect) acs_25 = models.StringField(choices=[['a', 'verliere ich allmählich den Mut.'], ['b', 'vergesse ich es zunächst einmal und beschäftige mich mit anderen Dingen.']], widget=widgets.RadioSelect) acs_26 = models.StringField(choices=[['a', 'lege ich meist sofort los.'], ['b', 'kann es eine Weile dauern, bis ich mich dazu aufraffe.']], widget=widgets.RadioSelect) acs_28 = models.StringField(choices=[['a', 'fällt es mir schwer, irgendetwas anderes zu tun.'], ['b', 'fällt es mir leicht, mich durch andere Dinge abzulenken.']], widget=widgets.RadioSelect) acs_29 = models.StringField(choices=[['a', 'denke ich manchmal zu lange nach, womit ich anfangen soll. '], ['b', 'habe ich keine Probleme loszulegen.']], widget=widgets.RadioSelect) acs_31 = models.StringField(choices=[['a', 'weiß ich manchmal nichts mit mir anzufangen.'], ['b', 'bleibe ich fast genauso tatkräftig, als wäre nichts passiert.']], widget=widgets.RadioSelect) acs_32 = models.StringField(choices=[['a', 'habe ich meist keine Probleme, mich an die Arbeit zu machen. '], ['b', 'bin ich manchmal wie gelähmt.']], widget=widgets.RadioSelect) acs_34 = models.StringField(choices=[['a', 'kann ich die Sache auf sich beruhen lassen und mich anderen Dingen zuwenden. '], ['b', 'fällt es mir schwer, überhaupt noch etwas zu tun.']], widget=widgets.RadioSelect) acs_35 = models.StringField(choices=[['a', 'bringe ich die Sachen ohne Schwierigkeiten hinter mich.'], ['b', 'fällt es mir schwer, damit anzufangen.']], widget=widgets.RadioSelect) is_positive_info = models.BooleanField() def calculate_portfolioPerformance(self): # Calculate payoff / portfolio value by adding the new performance if self.round_number > 1: self.payoff = self.in_round(self.round_number - 1).payoff * (1 + Constants.quarterly_performance[self.round_number - 1]/100) else: self.payoff = Constants.initial_investment * (1 + Constants.quarterly_performance[0]/100) def calculate_marketPerformance(self): # Calculate market performance by adding the new performance if self.round_number > 1: market_performance = self.in_round(self.round_number - 1).market_performance * (1 + Constants.quarterly_performance[self.round_number - 1]/100) else: market_performance = Constants.initial_investment * (1 + Constants.quarterly_performance[0]/100) self.market_performance = round(market_performance, 2) def calculate_portfolio_returnInEur(self): self.portfolio_returnInEur = self.payoff - Constants.initial_investment def calculate_portfolio_returnInPercent(self): self.portfolio_returnInPercent = round (100 * float(self.portfolio_returnInEur) / float(Constants.initial_investment), 2)