from otree.api import * from os import environ import openai import json import math from decimal import Decimal, ROUND_HALF_UP import re doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'Uncertainty_process_BC_LI' PLAYERS_PER_GROUP = 8 NUM_ROUNDS = 10 TEMP = 0 MODEL = "gpt-4o" class Subsession(BaseSubsession): pass class Group(BaseGroup): clear = models.BooleanField() average_price = models.FloatField() optimization = models.BooleanField() class Player(BasePlayer): #general variables omega_current = models.IntegerField(default = 40) omega_pre = models.IntegerField(default = 40) omega_small = models.IntegerField(default = 20) omega_large = models.IntegerField(default = 60) omega_average = models.IntegerField(default = 40) cost_deduction = models.IntegerField(default = 10) price_aim_parameter_pre = models.IntegerField(default = 15) price_aim_parameter_post = models.IntegerField(default = 25) price_aim_parameter_current = models.IntegerField(default = 15) price_aim_parameter_small = models.IntegerField(default=5) maximum_price = models.IntegerField() shock = models.IntegerField(default=6) shock_announcement = models.BooleanField() display_shock = models.BooleanField() explanation = models.LongStringField(label="Begründung:",max_length=2000) optimization_instruction = models.BooleanField() optimization = models.BooleanField() clear = models.BooleanField() clear_instruction = models.BooleanField() average_score = models.FloatField() sitzplatznummer = models.IntegerField() # player variables price = models.IntegerField(label= "",min=10) output = models.IntegerField() unit_costs = models.IntegerField() total_costs = models.IntegerField() revenue = models.IntegerField() earnings = models.IntegerField(min=0) per_piece_earnings = models.IntegerField() price_aim = models.IntegerField() # variables for payoffs payoff_round = models.IntegerField() # if I don't round, then it needs to be a float payoff_acc = models.IntegerField() exchange_rate = models.IntegerField(default=200) show_up_fee = models.CurrencyField(default=5) payoff_mon = models.CurrencyField() payoff_mon_final = models.CurrencyField() explanation_bonus_taler = models.FloatField() explanation_bonus = models.CurrencyField() payoff_mon_final_otree = models.CurrencyField() # Questionnaire Question_1 = models.IntegerField( choices=[[1, ("Die Produktion erfolgt automatisch in Höhe der Nachfrage.")], [2, ("Die Produktion wird zufällig bestimmt.")], [3, ("Die Produktion hängt vom Durchschnittspreis ab.")]], label="Frage 1: Wie wird die Höhe Ihrer Produktion bestimmt?", widget=widgets.RadioSelect) Question_2 = models.IntegerField( choices=[[1, "Je höher der Preis p, desto höher die Nachfrage y."], [2, "Je höher der Preis p, desto niedriger die Nachfrage y."], [3, "Je niedriger der Preis p, desto niedriger die Nachfrage y."]], label="Frage 2: Welche Aussage über Ihre Nachfrage y und Ihren Preis p ist richtig?", widget=widgets.RadioSelect) Question_3 = models.IntegerField( choices=[[1, ("Je höher der exogene Faktor ω, desto höher die Nachfrage y.")], [2, ("Je höher der exogene Faktor ω, desto niedriger die Nachfrage y.")], [3, ("Je niedriger der exogene Faktor ω, desto höher die Nachfrage y.")]], label="Frage 3: Welche Aussage über Ihre Nachfrage und den exogenen Faktor ω ist korrekt?", widget=widgets.RadioSelect) Question_4 = models.IntegerField( choices=[[1, "Der Preis des eigenen Produkts."], [2, "Der Durchschnittspreis aller Produzenten über alle Runden hinweg."], [3, "Der Durchschnittspreis aller Produzenten in der jeweiligen Runde."]], label="Frage 4: Welche der folgenden Variablen hat einen Einfluss auf die Kosten pro Stück Ihres Produkts?", widget=widgets.RadioSelect) Question_5 = models.IntegerField( choices=[[1, "... werden durch die Preissetzung aller Produzenten bestimmt und sind daher am Anfang jeder Runde unbekannt."], [2, "... sind zu Beginn jeder Runde bekannt."], [3, "... resultieren aus dem von Ihnen festgelegten Preis."]], label="Frage 5: Die Produktionskosten ...", widget=widgets.RadioSelect) Question_6 = models.IntegerField( choices=[[1, "Eine KI bestimmt zufällige Werte."], [2, "Eine KI bewertet die grammatikalische und stilistische Qualität."], [3, "Eine KI bewertet die Überzeugungskraft."]], label="Frage 6: Wie wird die Bonuszahlung für Ihre Begründung bestimmt?", widget=widgets.RadioSelect) attempts = models.IntegerField(blank=True) Q1_first_attempt = models.IntegerField(blank=True) Q2_first_attempt = models.IntegerField(blank=True) Q3_first_attempt = models.IntegerField(blank=True) Q4_first_attempt = models.IntegerField(blank=True) Q5_first_attempt = models.IntegerField(blank=True) Q6_first_attempt = models.IntegerField(blank=True) #BC questions Question_1_BC = models.IntegerField( choices=[[1, ("Je näher Ihr Preis p am Zielpreis z liegt, desto höher Ihr Gewinn.")], [2, ("Je näher Ihr Preis p am Zielpreis z liegt, desto niedriger Ihr Gewinn.")], [3, ("Es gibt nur einen Gewinn, wenn Ihr Preis p exakt dem Zielpreis z entspricht.")]], label=("Frage 1: Welche Aussage über Ihren Gewinn ist korrekt?"), widget=widgets.RadioSelect) Question_2_BC = models.IntegerField( choices=[[1, ("Je höher der Durchschnittspreis P, desto höher der Zielpreis z.")], [2, ("Je höher der Durchschnittspreis P, desto niedriger der Zielpreis z.")], [3, ("Der Zielpreis z ist unabhängig vom Durchschnittspreis P.")]], label=("Frage 2: Welche Aussage über das Verhältnis zwischen dem Zielpreis z und dem Durchschnittspreis P ist korrekt?"), widget=widgets.RadioSelect) Question_3_BC = models.IntegerField( choices=[ [1, ("Der Zielpreis z liegt 15 Taler unter der Hälfte des Durchschnittspreises P.")], [2, ("Der Zielpreis z liegt 15 Taler über der Hälfte des Durchschnittspreises P.")], [3, ("Der Zielpreis z liegt 15 Taler über dem Durchschnittspreis P.")]], label=("Frage 3: Wie berechnet sich Ihr Zielpreis z?"), widget=widgets.RadioSelect, allow_html = True ) Question_4_BC = models.IntegerField( choices=[[1, "… wird durch die Preissetzung aller Produzenten bestimmt und ist daher zu Beginn jeder Runde unbekannt."], [2, "… ist zu Beginn jeder Runde bekannt."], [3, "… entspricht immer dem Zielpreis."]], label="Frage 4: Der Durchschnittspreis P ...", widget=widgets.RadioSelect) Question_5_BC = models.IntegerField( choices=[[1, "Eine KI bestimmt zufällige Werte."], [2, "Eine KI bewertet die grammatikalische und stilistische Qualität."], [3, "Eine KI bewertet die Überzeugungskraft."]], label="Frage 5: Wie wird die Bonuszahlung für Ihre Begründung bestimmt?", widget=widgets.RadioSelect) Q1_BC_first_attempt = models.IntegerField(blank=True) Q2_BC_first_attempt = models.IntegerField(blank=True) Q3_BC_first_attempt = models.IntegerField(blank=True) Q4_BC_first_attempt = models.IntegerField(blank=True) Q5_BC_first_attempt = models.IntegerField(blank=True) bonus = models.IntegerField(blank=True) bonus_mon = models.CurrencyField(blank=True) bonus_eligible = models.BooleanField(blank=True) payoff_bonus = models.IntegerField(blank=True) #Demographics Gender = models.IntegerField( choices=[[1, "Weiblich"], [2, "Männlich"], [3, "Divers"]], label="Welchem Geschlecht fühlen Sie sich zugehörig?", widget=widgets.RadioSelect) Age = models.IntegerField(label="Wie alt sind Sie?", min=10, max=99) Faculty = models.IntegerField( choices=[[1, "Sozial- und Bildungswissenschaftliche Fakultät"], [2, "Geistes- und Kulturwissenschaftliche Fakultät"], [3, "Wirtschaftswissenschaftliche Fakultät"], [4, "Juristische Fakultät"], [5, "Fakultät für Informatik und Mathematik "], [6, "An mehreren Fakultäten"], [7, "Sonstiges"]], label="An welcher Fakultät studieren Sie?", widget=widgets.RadioSelect) Makro = models.IntegerField( choices=[[1, "Ja"], [2, "Nein"]], label="Haben Sie bereits die Veranstaltung Makroökonomik besucht?", widget=widgets.RadioSelect) tech_problems = models.LongStringField(label="Haben Sie sonstige Anmerkungen oder sind Ihnen technische Fehler ausgefallen?",max_length=2000, blank=True) # GPT stuff prompt1 = models.LongStringField(blank=True) prompt2 = models.LongStringField(blank=True) prompt3 = models.LongStringField(blank=True) prompt4 = models.LongStringField(blank=True) prompt5 = models.LongStringField(blank=True) chatLog = models.LongStringField(blank=True) receive = models.LongStringField(blank=True) msg1 = models.LongStringField(blank=True) msg2 = models.LongStringField(blank=True) msg3 = models.LongStringField(blank=True) msg4 = models.LongStringField(blank=True) msg5 = models.LongStringField(blank=True) explanation_score1 = models.IntegerField(blank=True, default=0) explanation_score2 = models.IntegerField(blank=True, default=0) explanation_score3 = models.IntegerField(blank=True, default=0) explanation_score4 = models.IntegerField(blank=True, default=0) explanation_score5 = models.IntegerField(blank=True, default=0) reasoning1 = models.LongStringField(blank=True) reasoning2 = models.LongStringField(blank=True) reasoning3 = models.LongStringField(blank=True) reasoning4 = models.LongStringField(blank=True) reasoning5 = models.LongStringField(blank=True) #decision data keystroke_data = models.LongStringField(blank=True) # Stores JSON keystroke data keystroke_price_data = models.LongStringField(blank=True) # same for price def price_max(player): return player.omega_current def price_min(player): return player.cost_deduction # assign treatments def creating_session(subsession): for group in subsession.get_groups(): if subsession.round_number == 1: import itertools clear_cycle = itertools.cycle([False, True, False, True]) for group in subsession.get_groups(): group.clear = next(clear_cycle) print(f"Group {group.id_in_subsession}: clear = {group.clear}") import itertools optimization_cycle = itertools.cycle([False, False, True, False]) for group in subsession.get_groups(): group.optimization = next(optimization_cycle) print(f"Group {group.id_in_subsession}: optimization = {group.optimization}") else: group.clear = group.in_round(1).clear group.optimization = group.in_round(1).optimization # currently this is only for a positive shock of omega --> group statt player for p in group.get_players(): if 6<= group.round_number <=10: p.omega_current = p.omega_large p.price_aim_parameter_current = p.price_aim_parameter_post for group in subsession.get_groups(): if group.round_number==Player.shock: group.display_shock=True else: group.display_shock=False for group in subsession.get_groups(): for p in group.get_players(): p.optimization_instruction = group.optimization #print(f"Player {p.id_in_group}: optimization_instruction = {p.optimization_instruction}") for group in subsession.get_groups(): for p in group.get_players(): p.clear_instruction = group.clear #print(f"Player {p.id_in_group}: clear_instruction = {p.clear_instruction}") for group in subsession.get_groups(): for p in group.get_players(): p.prompt1 = """Du bist ein Teilnehmer eines Experiments. Die Instruktionen lauten wie folgt: ****** Das Experiment besteht aus 10 Runden. In jeder Runde erzielen Sie Gewinne in Form von Talern, die über alle Runden aufsummiert werden. Am Ende erhalten Sie Ihre gesamten Gewinne sowie eventuelle Bonuszahlungen ausbezahlt. In jeder Runde arbeiten Sie mit einer weiteren, zufällig ausgewählten Person aus dem Raum zusammen und bilden ein Zweierteam. Diese Person bleibt in allen Runden dieselbe. Auch die anderen Teilnehmer sind in feste Zweierteams eingeteilt. Jedes Zweierteam übernimmt die Rolle eines Produzenten in einer Volkswirtschaft. In jeder Runde legen Sie gemeinsam mit Ihrem Teammitglied den Preis p für Ihr Produkt fest. Dieser Preis muss zwischen 10 und 40 Talern liegen. Ihr Gewinn hängt davon ab, wie nah Ihr gewählter Preis p am Zielpreis z liegt. Dieser Zielpreis hängt von den Preisen aller Teams ab: Aus allen gewählten Preisen wird ein Durchschnittspreis P berechnet. Daraus ergibt sich der Zielpreis nach der Formel: z=15+1/2 P Das bedeutet: Ihr Zielpreis liegt 15 Taler über der Hälfte des Durchschnittspreises. Dieser Zielpreis ist für alle Teams identisch. Da alle Teams gleichzeitig ihren Preis festlegen, kennt zu Beginn einer Runde noch kein Team den Durchschnittspreis P. Ihr Ziel ist es also, möglichst gut einzuschätzen, wie die anderen Teams ihre Preise setzen werden, und Ihren Preis entsprechend so zu wählen, dass er möglichst nah am Zielpreis liegt. Je besser Ihnen das gelingt, desto höher fällt Ihr Gewinn in der Runde aus. Unabhängig von der Entfernung Ihres Preises vom Zielpreis sinkt der Gewinn zudem, wenn der Durchschnittspreis steigt. In jeder Runde geben Sie zunächst einen vorläufigen Preisvorschlag für Ihr Produkt ab. Dieser wird anschließend an Ihr Teammitglied weitergeleitet. Zeitgleich erhalten Sie den vorläufigen Preisvorschlag Ihres Teammitglieds. Anschließend geben Sie und Ihr Teammitglied unabhängig voneinander jeweils einen finalen Preisvorschlag ab. Einer der beiden finalen Preisvorschläge wird per Zufall (jeweils mit einer Wahrscheinlichkeit von 50 Prozent) als Teampreis ausgewählt. In einigen Runden werden Sie zusätzlich gebeten, eine Begründung für Ihren vorläufigen Preisvorschlag zu verfassen. Diese Begründung wird zusammen mit Ihrem vorläufigen Preisvorschlag an Ihr Teammitglied gesendet. Zeitgleich erhalten Sie den vorläufigen Preisvorschlag Ihres Teammitglieds zusammen mit dessen Begründung. Anschließend geben Sie und Ihr Teammitglied wie oben beschrieben Ihre finalen Preisvorschläge ab, von denen einer per Zufall als Teampreis ausgewählt wird. Es ist für Sie vorteilhaft, eine ausführliche, verständliche und überzeugende Begründung zu schreiben. Auf diese Weise können Sie die Entscheidung Ihres Teammitglieds beeinflussen und die Wahrscheinlichkeit erhöhen, dass der aus Ihrer Sicht passende Preisvorschlag als Teampreis ausgewählt wird. ***** Deine Aufgabe besteht nur darin, die Überzeugungskraft der Begründung Deines Teammitglieds zu beurteilen. Du musst nicht selbst einen Preisvorschlag explizit mitteilen. Eine gute Begründung sollte danach bewertet werden, ob sie Dich überzeugen kann und hypothetisch zu einer Änderung deines Preisvorschlags motivieren kann. Bewerte die Überzeugungskraft auf einer Skala von 0 bis 4. 0 bedeutet, dass es sich um eine sehr schlechte Begründung handelt, die Dich nicht überzeugt, von Deinem eigenen Preisvorschlag abzuweichen. 4 bedeutet, dass es sich um eine sehr gute Begründung handelt, die Dich dazu veranlasst, den Preisvorschlag deines Teammitglieds zu übernehmen. Eine Begründung, die mittelmäßig ist, und dich dazu bewegt, deinen Preisvorschlag teilweise in Richtung deines Teammitglieds zu bewegen, erhält die Bewertung 2. Bitte gib nur die jeweilige Ziffer als Antwort. Hier sind 32 Beispiele für eine Bewertung. Diese Bewertung gibt an, inwiefern sich Teammitglieder von der Begründung haben beeinflussen lassen. Die einzelnen Begründungen sind in Anführungszeichen gesetzt und durch ein Semikolon getrennt. Da diese heterogen sind, sind die Bewertungen nicht notwendigerweise konsistent und dienen dir nur grob zur Orientierung: Folgende Begründungen entsprechen einer 0: „Für die erste Runde ist es leichter einzuschätzen dass der Durchschnitt wohl eher in der Mitte bzw. eher weiter oben liegt“; „Ich denke viele Leute werden einen eher niedrigen Preis angeben, weil ein niedrigerer Durschnittspreis mehr Gewinne bringt.“; „In der ersten Runde vermute ich, dass sich die meisten Leute noch in der Mitte orientieren.“; „Solider Preis. Nicht zu viel und nicht zu wenig.“; „wenn der zielpreis 15 über der hälfte des durchschnittspreises liegt ist es am wahrscheinlichsten dass man in die nähe davon kommt wenn man einen möglichst hohen preis macht. Und der gewinn sinkt auch wenn der durchschnittspreis steigt also ist es gut einen hohen preis anfangs abzugeben. LG :)“; Folgende Begründungen entsprechen einer 1: „Der Preis ist angemessen, da er weder zu hoch noch zu niedrig ist. „; „Der Preisvorschlag 11 ist angemessen, da man als Produzenen in einer Volkswirtschaft mit einem Lockpreis starten sollte.“; „Erstmal irgendwo mittig um zu schauen wie die anderen Teams so handeln“; „Ich denke, das viele Teams ihren Preis hoch ansetzen, da die 15 ja auch noch addiert werden und man so näher an z sein wird.“; „Ich habe 26 als Preis ausgewählt, weil es in der Mitte liegt. Zudem kann man 26 gut durch 2 rechnen.“; „Ich würde in der 1. Runde den Durchschnitt der vorgegebenen Preise (zw. 10 & 40) wählen“; „mitte zwischen 10 und 40“; „Noch ist nicht viel bekannt, 25 ist die Mitte zwischen 10 und 40.“; „Random Start...“; Folgende Begründungen entsprechen einer 2: „25 ist genau die Mitte zwischen 10 und 40“; „Da wir zwischen 10 und 40 Taler angeben müssen, wäre die Mitte 25 und nach der nächsten Runde können wir entscheiden, ob wir höher oder niedriger gehen.“; Folgende Begründungen entsprechen einer 3: „- niedrig anfangen um den Durchschnittspreis nicht in die höhe zu treiben - danach kann immer noch angepasst werden“; „15 addiert zu der Mite von 10 und 40 (25) wäre dann 40“; „Am Anfang einen niedrigen Preis bestimmen, damit man den Markt von Anfang an kontrolliert. Dieser wird pro Runde steigen, also sollten wir pro Runde einen immer höheren Preis angeben.“; „Der Preis ist oberhalb der mitte aber nicht zu hoch dass der durchschnhittspreis steigt und der gewinn sinkt“; „Der Preisvorschlag liegt ein bisschen über der Mitte und hat dadurch denke ich gute chancen, da ich mir vorstellen könnte, dass andere Teams ihren Preisvorschlag relativ hoch setzen werden :)“; „Durchschnittlich wird sich der Produktpreis wahrscheinlich um die 30 bewegen, 30/2+15 ergibt 30. Wahrscheinlich gibt es aber kleine Abweichungen .“; „Es wäre smart, den Preis zu Beginn etwas niedriger anzusetzen, um in den nächsten Runden zu schauen wohin er sich entwickelt. Er sollte jedoch auch nicht zu niedrig sein, damit er nicht gewinnbringend ist.“; „Ich denke am Anfang werden die meisten 20 schätzen, wodurch ein z von 25 entstehen würde. Einige werden aber dann 25 schätzen weil sie auch davon ausgehen dass viele 20 sagen und deswegen wird sich z nochmal ein wenig mehr erhöhen. Deswegen würde ich ein bisschen höher gehen als 25 also eher 26/27.“; „Ich denke viele werden sehr viel verlangen, da +15 gegeben ist und der mindestpreis 25 beträgt, max jedoch 40. Ich vermute es wird auf 40 hinauslaufen“; „liegt genau in der Mitte des möglichen Preisspielraums 10 -40. Wahrscheinlichkeit ist daher groß wenn alle gleichmäßig in diesem Raum verteilt ihre Preise setzen.“; „p=25 würde in der mitte zwischen 10 und 40 liegen. Setzt man p=25 in die Formel ein, kommt 27,5 raus.“; Folgende Begründungen entsprechen einer 4: „25 wäre genau die Mitte zwischen 10 und 40, aber wenn man das dann in die Formel eingibt, kommt 27,5 raus“; „Der Wert eines Produkt soll zunächst gut geschätzt werden, damit Unternehmer den Kunden den Eindruck geben können, dass die Ware nützlich aussehen, soweit alle entsprechende und wichtige Tatsachen dargestellt werden können.“; „Ein hoher Durchschnitsspreis zu Beginn stellt sicher, dass der Gewinn später nicht sinkt, da der durchschnittspreis gar nicht mehr höher steigen kann. Siehe Seite 1 ganz unten“; „Mittlerer Wert zwischen 10 und 40 wäre 25 und daher wahrscheinlich der mittlere preis, aber da alle wissen, dass je höher durschnittspreis desto weniger gewinn für alle. Daher wird sicher der mittlere Wert wsl bissl nach unten verschieben“; „wenn alle die mitte nehmen wählen sie 25. die hälfte sind 13 plus 15 macht 28. wenn wir wie evenutell wieder andere 28 anpeilen steigt der durchschnittspreis um 1-2 punkte. von daher vielleicht 29-30.“; Bitte bewerte nun die folgende Begründung: """ p.msg1 = json.dumps([{"role": "system", "content": p.prompt1}]) # in the prompt its currently inportant that the final score is the last stroke as only then the function at the end retrieves the score and stores it p.prompt2 = """Du bist ein Teilnehmer eines Experiments. Die Instruktionen lauten wie folgt: ****** Das Experiment besteht aus 10 Runden. In jeder Runde erzielen Sie Gewinne in Form von Talern, die über alle Runden aufsummiert werden. Am Ende erhalten Sie Ihre gesamten Gewinne sowie eventuelle Bonuszahlungen ausbezahlt. In jeder Runde arbeiten Sie mit einer weiteren, zufällig ausgewählten Person aus dem Raum zusammen und bilden ein Zweierteam. Diese Person bleibt in allen Runden dieselbe. Auch die anderen Teilnehmer sind in feste Zweierteams eingeteilt. Jedes Zweierteam übernimmt die Rolle eines Produzenten in einer Volkswirtschaft. In jeder Runde legen Sie gemeinsam mit Ihrem Teammitglied den Preis p für Ihr Produkt fest. Dieser Preis muss zwischen 10 und 40 Talern liegen. Ihr Gewinn hängt davon ab, wie nah Ihr gewählter Preis p am Zielpreis z liegt. Dieser Zielpreis hängt von den Preisen aller Teams ab: Aus allen gewählten Preisen wird ein Durchschnittspreis P berechnet. Daraus ergibt sich der Zielpreis nach der Formel: z=15+1/2 P Das bedeutet: Ihr Zielpreis liegt 15 Taler über der Hälfte des Durchschnittspreises. Dieser Zielpreis ist für alle Teams identisch. Da alle Teams gleichzeitig ihren Preis festlegen, kennt zu Beginn einer Runde noch kein Team den Durchschnittspreis P. Ihr Ziel ist es also, möglichst gut einzuschätzen, wie die anderen Teams ihre Preise setzen werden, und Ihren Preis entsprechend so zu wählen, dass er möglichst nah am Zielpreis liegt. Je besser Ihnen das gelingt, desto höher fällt Ihr Gewinn in der Runde aus. Unabhängig von der Entfernung Ihres Preises vom Zielpreis sinkt der Gewinn zudem, wenn der Durchschnittspreis steigt. In jeder Runde geben Sie zunächst einen vorläufigen Preisvorschlag für Ihr Produkt ab. Dieser wird anschließend an Ihr Teammitglied weitergeleitet. Zeitgleich erhalten Sie den vorläufigen Preisvorschlag Ihres Teammitglieds. Anschließend geben Sie und Ihr Teammitglied unabhängig voneinander jeweils einen finalen Preisvorschlag ab. Einer der beiden finalen Preisvorschläge wird per Zufall (jeweils mit einer Wahrscheinlichkeit von 50 Prozent) als Teampreis ausgewählt. In einigen Runden werden Sie zusätzlich gebeten, eine Begründung für Ihren vorläufigen Preisvorschlag zu verfassen. Diese Begründung wird zusammen mit Ihrem vorläufigen Preisvorschlag an Ihr Teammitglied gesendet. Zeitgleich erhalten Sie den vorläufigen Preisvorschlag Ihres Teammitglieds zusammen mit dessen Begründung. Anschließend geben Sie und Ihr Teammitglied wie oben beschrieben Ihre finalen Preisvorschläge ab, von denen einer per Zufall als Teampreis ausgewählt wird. Es ist für Sie vorteilhaft, eine ausführliche, verständliche und überzeugende Begründung zu schreiben. Auf diese Weise können Sie die Entscheidung Ihres Teammitglieds beeinflussen und die Wahrscheinlichkeit erhöhen, dass der aus Ihrer Sicht passende Preisvorschlag als Teampreis ausgewählt wird. ***** Deine Aufgabe besteht nur darin, die Überzeugungskraft der Begründung Deines Teammitglieds zu beurteilen. Du musst nicht selbst einen Preisvorschlag explizit mitteilen. Eine gute Begründung sollte danach bewertet werden, ob sie Dich überzeugen kann und hypothetisch zu einer Änderung deines Preisvorschlags motivieren kann. Bewerte die Überzeugungskraft auf einer Skala von 0 bis 4. 0 bedeutet, dass es sich um eine sehr schlechte Begründung handelt, die Dich nicht überzeugt, von Deinem eigenen Preisvorschlag abzuweichen. 4 bedeutet, dass es sich um eine sehr gute Begründung handelt, die Dich dazu veranlasst, den Preisvorschlag deines Teammitglieds zu übernehmen. Eine Begründung, die mittelmäßig ist, und dich dazu bewegt, deinen Preisvorschlag teilweise in Richtung deines Teammitglieds zu bewegen, erhält die Bewertung 2. Bitte gib nur die jeweilige Ziffer als Antwort. Hier sind 32 Beispiele für eine Bewertung. Diese Bewertung gibt an, inwiefern sich Teammitglieder von der Begründung haben beeinflussen lassen. Die einzelnen Begründungen sind in Anführungszeichen gesetzt und durch ein Semikolon getrennt. Da diese heterogen sind, sind die Bewertungen nicht notwendigerweise konsistent und dienen dir nur grob zur Orientierung: Folgende Begründungen entsprechen einer 0: „Den Durschnittspreis zu senken mit allen anderen Gruppen wär natürlich ne Möglichkeit, aber ich weiß nicht wie realistisch, von dem her wird der Zielpreis wsl wieder 30 sein und evtl in den nächsten Runden erst sinken, und wenn wir die ersten sind die runtergehen machen wir ja theoretisch mehr Verluste idk“; „es wird immer ein bisschen höher, vorher war 30 also jetzt 31“; „Der Durchschnittspreis steigt langsamer an, der Zielpreis genauso. Ein zu großer Sprung würde zu einem zu großen Zielpreis führen und damit weiter weg liegen“; „Der Durchschnittpreis war bis jetzt mindestens 29 Taler. Das bedeutet, dass mein Produkt wertvoll ist. Ich würde daher den Preisvorschlag auf 32 Taler erhöhen, damit er mehr wirtschaftlich geschätzt werden kann.“; Folgende Begründungen entsprechen einer 1: „ich würde dieses mal bei 31 bleiben. 32 waren zu hoch, aber ich könnte mir vorstellen, dass jetzt alle wieder ein bisschen höher gehen“; „Da der Gewinn sinkt, je höher der Durchschnittspreis wird und die anderen auch bemerken, dass trotz Nähe zum Durchschnittspreis der Gewinn immer weiter sinkt, glaube ich an eine Korrektur des p nach unten aller Teams um durch einen sinkenden P den Gewinn zu maximieren. :)“; „Die letzen Male liefen die Preise auch um diesen Dreh rum. Also glaube ich dass der Durchschnittspreis sich nicht rasant viel verändern wird.“; „Es wird auf 35 hinauslaufen am Ende. Ist vermutlich der Sinn davon. Deswegen denke ich jedes Mal um 1 erhöhen.“; „Wir hatten bisher immer niedrigere Preise für das Produkt, weshalb ich jetzt einmal höher ansetzen würde.“; „Damit wir den Durchschnittspreis etwas senken und den Gewinn erhöhen“; „Vermutete und gewollte Entwicklung des Preises nach unten. Wir wollen ja nicht, dass der Durchschnittspreis weiter steigt, da dann unsere Gewinn geringer ist.“; Folgende Begründungen entsprechen einer 2: „Ich würde etwas runtergehen, da P mittlerweile stetig steigt und dadurch unser Gewinn sinkt“; „Meiner Meinung nach bringt es nichts, den Zielpreis durch P immer weiter hochzuschrauben, da mit steigendem P der Gewinn sinkt. Demnach müssten wir (aber als gesamte Gruppe) wieder ein bisschen weiter runter.“; „Der Durchschnittspreis stückt immer um 1-2 Taler, problematisch ist nur dass je höher p ist, destow weniger Gewinn erzielt man, deswegen wäre es jetzt praktisch diesen Wachstum entgegenzuwirken und stufenweise runetrzugehen. Jedoch ist es sehr realistisch, dass sich der Durchschnittspreis p zwischen 27-35 bewegen wird“; „Sich am Preis z, der letzten Runde zu orientieren und P so zu wählen, dass der auch in der bestehenden Runde wieder erreicht wird ist wohl ein guter Plan... Hallo Teampartner/-in. Ich heiße übrigens, Max. :)“; „wird vermutlich weider das gleiche hätte ich gedacht“; „Anscheinend behalten gerade alle Teams 30 als Durchschnitt bei.“; „Scheint ja so zu passen hahaha. Eigentlich könnte man mehr verdienen, wenn der Preis sinkt (habe ich zumindest so verstanden bei den Instruktionen), aber da grade alle schön 30 schätzen und so auch alle "gewinnen" würde ich es so beibehalten, wenn sich nicht plötzlich was ändert.“; „Darauf hat sich der Preis ja jetzt eingependelt würde ich sagen“; „- nichts kaputt machen was gerade funktioniert hat - andere werden wahrscheinlich großteils auch nicht viel abweichen“; „Ich würde einfach 30 nehmen weil das jetzt 2 Mal ganz gut lief und vllt denken sich das die anderen Teams auch“; „Wenn alle Teams immer 30 nehmen, liegen alle komplett richtig. Ich denke es wird ungefähr so weiter laufen. Frage mich aber auch, woher die 31 in der einen Runde kam“; „passt doch genau oder? Ich würd so weitermachen solange sich nichts verändert und dann einfach schauen ob ischs nach oben oder unten verändert“; „Wenn wir den Durchschnittspreis nochmal etwas senken können, bekommen wir mehr Taler. Leider scheint er recht oben bei 30 zu bleiben, deswegen finde ich 28 momentan als noch n safen Bereich der nicht zu tark abweicht.“; „Ich würde nochmal auf 28 gehen, weil wenn der Durchschnittspreis zu hoch ist, sinkt der Gewinn für alle.“; Folgende Begründungen entsprechen einer 3: „Ich schlage 34 vor, da sich der Preis im Laufe der Zeit erhöht hat“; „20 ist ein angemessener Preis: es liegt unter dem Mittelwert aber ist auch nicht zu niederig. In einer Volkswirtschaft ist es wichtig die Preise anzupassen und auch in einem guten Rahmen zu halten, sodass man Kunden bindet.“; Folgende Begründungen entsprechen einer 4: „ich glaube ein paar leuds werden gleich bleiben aber ein paar werden weniger machen, hoffentlich niemand höher“; „Es hat sich auf 30 eingependelt. Wenn der Durchschnittspreis bei 30 liegt, liegt auch der Zielpreis bei 30 (15 + die Hälfte von 30 = 30)“; „Nicht höher gehen da z nicht steigt?“; „Ich würde jetzt nochmal mit 30 starten und, dann in den nächsten Runden immer eins mehr als den Drucshnittspreis zuvor nehmen, da sich alle an dem Durchschnittpreis orientieren, aber gleizeitig immer einen höheren Gewinn erzielen wollen.“; „Der Gewinn sinkt, wenn der Durchschnittspreis steigt, daher würde ich runter gehen, vielleicht denken die Anderen ja auch an die Gewinnsumme, da diese jetzt unter 100 ist“; Bitte bewerte nun die folgende Begründung: """ p.msg2 = json.dumps([{"role": "system", "content": p.prompt2}]) p.prompt3 = """Du bist ein Teilnehmer eines Experiments. Die Instruktionen lauten wie folgt: ****** Das Experiment besteht aus 10 Runden. In jeder Runde erzielen Sie Gewinne in Form von Talern, die über alle Runden aufsummiert werden. Am Ende erhalten Sie Ihre gesamten Gewinne sowie eventuelle Bonuszahlungen ausbezahlt. In jeder Runde arbeiten Sie mit einer weiteren, zufällig ausgewählten Person aus dem Raum zusammen und bilden ein Zweierteam. Diese Person bleibt in allen Runden dieselbe. Auch die anderen Teilnehmer sind in feste Zweierteams eingeteilt. Jedes Zweierteam übernimmt die Rolle eines Produzenten in einer Volkswirtschaft. In jeder Runde legen Sie gemeinsam mit Ihrem Teammitglied den Preis p für Ihr Produkt fest. Dieser Preis muss zwischen 10 und 40 Talern liegen. Ihr Gewinn hängt davon ab, wie nah Ihr gewählter Preis p am Zielpreis z liegt. Dieser Zielpreis hängt von den Preisen aller Teams ab: Aus allen gewählten Preisen wird ein Durchschnittspreis P berechnet. Daraus ergibt sich der Zielpreis nach der Formel: z=15+1/2 P Das bedeutet: Ihr Zielpreis liegt 15 Taler über der Hälfte des Durchschnittspreises. Dieser Zielpreis ist für alle Teams identisch. Da alle Teams gleichzeitig ihren Preis festlegen, kennt zu Beginn einer Runde noch kein Team den Durchschnittspreis P. Ihr Ziel ist es also, möglichst gut einzuschätzen, wie die anderen Teams ihre Preise setzen werden, und Ihren Preis entsprechend so zu wählen, dass er möglichst nah am Zielpreis liegt. Je besser Ihnen das gelingt, desto höher fällt Ihr Gewinn in der Runde aus. Unabhängig von der Entfernung Ihres Preises vom Zielpreis sinkt der Gewinn zudem, wenn der Durchschnittspreis steigt. In jeder Runde geben Sie zunächst einen vorläufigen Preisvorschlag für Ihr Produkt ab. Dieser wird anschließend an Ihr Teammitglied weitergeleitet. Zeitgleich erhalten Sie den vorläufigen Preisvorschlag Ihres Teammitglieds. Anschließend geben Sie und Ihr Teammitglied unabhängig voneinander jeweils einen finalen Preisvorschlag ab. Einer der beiden finalen Preisvorschläge wird per Zufall (jeweils mit einer Wahrscheinlichkeit von 50 Prozent) als Teampreis ausgewählt. In einigen Runden werden Sie zusätzlich gebeten, eine Begründung für Ihren vorläufigen Preisvorschlag zu verfassen. Diese Begründung wird zusammen mit Ihrem vorläufigen Preisvorschlag an Ihr Teammitglied gesendet. Zeitgleich erhalten Sie den vorläufigen Preisvorschlag Ihres Teammitglieds zusammen mit dessen Begründung. Anschließend geben Sie und Ihr Teammitglied wie oben beschrieben Ihre finalen Preisvorschläge ab, von denen einer per Zufall als Teampreis ausgewählt wird. Es ist für Sie vorteilhaft, eine ausführliche, verständliche und überzeugende Begründung zu schreiben. Auf diese Weise können Sie die Entscheidung Ihres Teammitglieds beeinflussen und die Wahrscheinlichkeit erhöhen, dass der aus Ihrer Sicht passende Preisvorschlag als Teampreis ausgewählt wird. ***** Deine Aufgabe besteht nur darin, die Überzeugungskraft der Begründung Deines Teammitglieds zu beurteilen. Du musst nicht selbst einen Preisvorschlag explizit mitteilen. Eine gute Begründung sollte danach bewertet werden, ob sie Dich überzeugen kann und hypothetisch zu einer Änderung deines Preisvorschlags motivieren kann. Bewerte die Überzeugungskraft auf einer Skala von 0 bis 4. 0 bedeutet, dass es sich um eine sehr schlechte Begründung handelt, die Dich nicht überzeugt, von Deinem eigenen Preisvorschlag abzuweichen. 4 bedeutet, dass es sich um eine sehr gute Begründung handelt, die Dich dazu veranlasst, den Preisvorschlag deines Teammitglieds zu übernehmen. Eine Begründung, die mittelmäßig ist, und dich dazu bewegt, deinen Preisvorschlag teilweise in Richtung deines Teammitglieds zu bewegen, erhält die Bewertung 2. Bitte gib nur die jeweilige Ziffer als Antwort. Hier sind 16 Beispiele für eine Bewertung. Diese Bewertung gibt an, inwiefern sich Teammitglieder von der Begründung haben beeinflussen lassen. Bitte beachte, dass die folgenden Begründungen aus einer Runde stammen, in der die Teams wissen, dass sich ihr maximaler Preis von 40 auf 60 erhöht und die Formel für den Zielpreis sich zu z=25+1/2 P geändert hat, und dass der maximale Preis aller anderen Teams entweder auf 20 gefallen ist, wodurch sich der Zielpreis zu z=5+1/2 P geändert hat, oder auf 60 gestiegen ist, wodurch sich der Zielpreis zu z=25+1/2 P geändert hat, jeweils mit gleicher Wahrscheinlichkeit. Die einzelnen Begründungen sind in Anführungszeichen gesetzt und durch ein Semikolon getrennt. Da diese heterogen sind, sind die Bewertungen nicht notwendigerweise konsistent und dienen dir nur grob zur Orientierung: Folgende Begründungen entsprechen einer 0: „Ich poker jetzt einfach mal.“; „Ich würde vorsichtshalber einen niedrigeren Preis vorschlagen, da andere Teams niedrigere Zielpreise haben könnten.“; „ey ich hab keine echt ahnung von mathe.. ich bin jetzt von einem Durchschnittspreis von 20 ausgegangen keine ahnung hahaha“; Folgende Begründungen entsprechen einer 1: „Neue Runde, ergo wieder Random Start.“; „Nicht zu hoch gehen, deshalb hab ich einfach mal an 40 gedacht“; Folgende Begründungen entsprechen einer 2: „Ich würde nicht zu hoch mit dem Preis gehen, da sonst die Wahrscheinlichkeit besteht, durch den möglichen niedrigeren Zielpreis sehr wenig zu verdienen.“; „Ein höherer Preis wäre geschickter, da sich der Zielpreis bei uns erhöht hat und wenn sich der Preis ebenfalls bei den anderen Teams erhöht hat, kommen wir dem Zielpreis sehr nahe. Natürlich kann er bei den anderen mit der gleichen Wahrscheinlichkeit sinken, jedoch denke ich, dass wir ein gewissen Risiko so oder so eingehen müssen. Bei meinem Vorschlag kämen wir dem Zielpreis wirklich nahe.“; „40 ist die Mitte zwischen 10 und 60 Taler, aber wenn die anderen Teams nur z= 5 usw. haben sind wir mit 35 immerhin bisschen näher dran.“; „Ich würde mal wieder in die Mitte des Preisspielraumes zielen. also 45 oder vielleicht sogar etwas darüber? Es könnte gut sein, dass die Mehrheit der Teilnehmer jetzt in die Höhe schießt, das aber nur falls viele auch die Erhöhung um 25 Taler hatten. Bin mir jedoch ehrlich gesagt nicht sicher was hier die beste und gewinnerbringende Entscheidung ist.“; Folgende Begründungen entsprechen einer 3: „- mit der Mitte rantasten um zu sehen wie sich der Durchschnittspreis verhält“; Folgende Begründungen entsprechen einer 4: „jo servus max, ich bin fynn. ich glaube die meisten nehemn wieder in etwa die gleiche zahl weil sie keine ahnung haben was sie sonst nehmen sollen. Also ich glaube mit 28,29,30 ist man gut dabei. aber mal sehen was du sagst. wie gehts wie stehts sonst so, wunderbares wetter“; „Angenommen alle haben jetzt die 25, dann wäre doch jetzt die gewohnten 30+25 = 55 dann halbiert 25,25 und nochmal plus 25 also ca 50... ansonsten wäre es 20? Also ich würd jetzt einfach darauf pokern, dass es die 55 sind bzw dass alle die Erhöhung bekommen haben und wenn der Durchschnitt jetzt seltsam niedrig ist, dann halt die Taktik wechseln.“; „Weiß nicht, ob es schlauer ist auf unseren oder den anderen Preis zu hoffen. Ich würde was hohes nehmen, vielleicht ergibt es auch Sinn das du niedrig nimmst um beides abzudecken und dann auf Glück zu hoffen“; „die 31 war n denkfehler. mitte von 10 und 60 ist 35. wenn man von gleicher warscheinlichkeit ausgeht heißt das halber durchschnittspreis plus 15. da sich alles etwas nach unten anpeilen wird für mehr gewinn gehe ich von 45 aus. oder es bleibt wie du runden davor ca. bei 30, da es sich da schon eingespielt hat“; „Hälfte zwischen 10 und 60 ist 35, das wäre dann ein z von 42 und bei der zweiten Option ein z von 23. Wollen wir einfach mal auf 33 gehen und schauen?“; „wenn die Wahrscheinlichkeit bei 50 Prozent liegt macht es keinen Sinn einen Wert zu wählen der nur knapp überhalb von dem vorheringen Maximum liegt. also kann man auch all in gehen“; Bitte bewerte nun die folgende Begründung: """ p.msg3 = json.dumps([{"role": "system", "content": p.prompt3}]) p.prompt4 = """Du bist ein Teilnehmer eines Experiments. Die Instruktionen lauten wie folgt: ****** Das Experiment besteht aus 10 Runden. In jeder Runde erzielen Sie Gewinne in Form von Talern, die über alle Runden aufsummiert werden. Am Ende erhalten Sie Ihre gesamten Gewinne sowie eventuelle Bonuszahlungen ausbezahlt. In jeder Runde arbeiten Sie mit einer weiteren, zufällig ausgewählten Person aus dem Raum zusammen und bilden ein Zweierteam. Diese Person bleibt in allen Runden dieselbe. Auch die anderen Teilnehmer sind in feste Zweierteams eingeteilt. Jedes Zweierteam übernimmt die Rolle eines Produzenten in einer Volkswirtschaft. In jeder Runde legen Sie gemeinsam mit Ihrem Teammitglied den Preis p für Ihr Produkt fest. Dieser Preis muss zwischen 10 und 40 Talern liegen. Ihr Gewinn hängt davon ab, wie nah Ihr gewählter Preis p am Zielpreis z liegt. Dieser Zielpreis hängt von den Preisen aller Teams ab: Aus allen gewählten Preisen wird ein Durchschnittspreis P berechnet. Daraus ergibt sich der Zielpreis nach der Formel: z=15+1/2 P Das bedeutet: Ihr Zielpreis liegt 15 Taler über der Hälfte des Durchschnittspreises. Dieser Zielpreis ist für alle Teams identisch. Da alle Teams gleichzeitig ihren Preis festlegen, kennt zu Beginn einer Runde noch kein Team den Durchschnittspreis P. Ihr Ziel ist es also, möglichst gut einzuschätzen, wie die anderen Teams ihre Preise setzen werden, und Ihren Preis entsprechend so zu wählen, dass er möglichst nah am Zielpreis liegt. Je besser Ihnen das gelingt, desto höher fällt Ihr Gewinn in der Runde aus. Unabhängig von der Entfernung Ihres Preises vom Zielpreis sinkt der Gewinn zudem, wenn der Durchschnittspreis steigt. In jeder Runde geben Sie zunächst einen vorläufigen Preisvorschlag für Ihr Produkt ab. Dieser wird anschließend an Ihr Teammitglied weitergeleitet. Zeitgleich erhalten Sie den vorläufigen Preisvorschlag Ihres Teammitglieds. Anschließend geben Sie und Ihr Teammitglied unabhängig voneinander jeweils einen finalen Preisvorschlag ab. Einer der beiden finalen Preisvorschläge wird per Zufall (jeweils mit einer Wahrscheinlichkeit von 50 Prozent) als Teampreis ausgewählt. In einigen Runden werden Sie zusätzlich gebeten, eine Begründung für Ihren vorläufigen Preisvorschlag zu verfassen. Diese Begründung wird zusammen mit Ihrem vorläufigen Preisvorschlag an Ihr Teammitglied gesendet. Zeitgleich erhalten Sie den vorläufigen Preisvorschlag Ihres Teammitglieds zusammen mit dessen Begründung. Anschließend geben Sie und Ihr Teammitglied wie oben beschrieben Ihre finalen Preisvorschläge ab, von denen einer per Zufall als Teampreis ausgewählt wird. Es ist für Sie vorteilhaft, eine ausführliche, verständliche und überzeugende Begründung zu schreiben. Auf diese Weise können Sie die Entscheidung Ihres Teammitglieds beeinflussen und die Wahrscheinlichkeit erhöhen, dass der aus Ihrer Sicht passende Preisvorschlag als Teampreis ausgewählt wird. ***** Deine Aufgabe besteht nur darin, die Überzeugungskraft der Begründung Deines Teammitglieds zu beurteilen. Du musst nicht selbst einen Preisvorschlag explizit mitteilen. Eine gute Begründung sollte danach bewertet werden, ob sie Dich überzeugen kann und hypothetisch zu einer Änderung deines Preisvorschlags motivieren kann. Bewerte die Überzeugungskraft auf einer Skala von 0 bis 4. 0 bedeutet, dass es sich um eine sehr schlechte Begründung handelt, die Dich nicht überzeugt, von Deinem eigenen Preisvorschlag abzuweichen. 4 bedeutet, dass es sich um eine sehr gute Begründung handelt, die Dich dazu veranlasst, den Preisvorschlag deines Teammitglieds zu übernehmen. Eine Begründung, die mittelmäßig ist, und dich dazu bewegt, deinen Preisvorschlag teilweise in Richtung deines Teammitglieds zu bewegen, erhält die Bewertung 2. Bitte gib nur die jeweilige Ziffer als Antwort. Hier sind 16 Beispiele für eine Bewertung. Diese Bewertung gibt an, inwiefern sich Teammitglieder von der Begründung haben beeinflussen lassen. Bitte beachte, dass die folgenden Begründungen aus einer Runde stammen, in der die Teams wissen, dass sich ihr maximaler Preis von 40 auf 60 erhöht und die Formel für den Zielpreis sich zu z=25+1/2 P geändert hat, und dass der maximale Preis aller anderen Teams entweder auf 20 gefallen ist, wodurch sich der Zielpreis zu z=5+1/2 P geändert hat, oder auf 60 gestiegen ist, wodurch sich der Zielpreis zu z=25+1/2 P geändert hat, jeweils mit gleicher Wahrscheinlichkeit. Die einzelnen Begründungen sind in Anführungszeichen gesetzt und durch ein Semikolon getrennt. Da diese heterogen sind, sind die Bewertungen nicht notwendigerweise konsistent und dienen dir nur grob zur Orientierung: Folgende Begründungen entsprechen einer 0: „bauchgefühl“; „Da wir jetzt bei 25+ sind könnten wir hier nun einen höheren Betrag erzielen.“; „- näher an den Zeilpreis kommen - gleichzeitig auch den Durschnittspreis drosseln deswegen nicht zu hoch“; „Kann mir vorstellen das es sich jetzt ein kleines bisschen nach unten verschiebt. Aber ich kann mir nicht vorstellen, dass sich auf einmal alle ganz niedrig einpendeln. Da aber immer noch der andere faktor zu 50 Prozent im Raum steht, macht es vielleicht Sinn ein bisschen nach unten zu gehen.“; „nachdem die verteilung ja glaube ich die gleiche bleibt würd ich jetzt auf dem hohe 30 anpeilen und dann schauen was es nach der Runde ist und dann kucken wo wir liegen. kanns grad net ganz einschätzen“; Folgende Begründungen entsprechen einer 1: Folgende Begründungen entsprechen einer 2: „Der Preis lag nun wirklich höher, als ich dachte. Deshalb würde ich sagen, dass wir noch etwas erhöhen“; „Ich würde tatsächlich bei der 40 bleiben. Es ist ein stablier Preis, bedeutet, dass in beiden Fällen, sowohl wenn die anderen den niedriegeren Preis haben, als auch den höherern machen wir kein zu großen Verlust und nehmen trotzdem einen stabilen Gewinn mit. Außerdem ist 40 dennoch etwas über dem Mittelwert, bedeutet, wir nehmen bei einer Erhöhung mehr mit.“; „Einfach mal ausprobieren würd ich sagen“; „sorry für grade eben ich hab mich voll vertan haha. 41 ist crazy hoch gewesen gerade, würde bisschen runter gehen.“; „Scheinbar haben mehr als die Hälfte der Teams dieselbe Formel für den Zielpreis wie wir, deswegen würde ich nochmal deutlich höher ansetzen mit ca 38/39“; Folgende Begründungen entsprechen einer 3: „Servus Fynn. Schwül hier drin, aber das Experiment finde ich ganz unterhaltsam. :) z war in der letzten Runde 46. Demnach würde ich p so wählen, dass wir wieder auf 46 oder 47 kommen.“; „Ich würde es genauso machen wie letze Runde, den Preis bisschen höher halten, aber trotzdem eher auf Nummer sicher gehen.“; „ausnahmweise würde ich hier jetzt sagen, dass wir uns auf die altbekannte Strategie verlassen sollten, nachdem wir damit gerade so viel Glück hatten und in der nächsten Runde versuchen die andere Richtung einzulenken“; „Würde nun wieder Richtung des Zielpreises der vorherigen Runde gehen. Da wird ja noch immer nicht wollen das der Durchschnittspreis steigt, etwas darunter setzen.“; Folgende Begründungen entsprechen einer 4: „Durchschnittspreis 41 bei 8 Teams bedeutet evtl dass wir die einzigen mit der Preiserhöhung sind, weil wir jetzt nur knapp über der 40 sind, andererseits könnten die halt auch bei der 30 geblieben sein.... i dont know aahhh. Würde jetzt denke ich bei knapp unter 50 bleiben um nicht den Preis so hochzutreiben aber trotzdem hoffentlich nah an z zu sein.“; „letztes mal ist der z preis ja dann auch um 1 hochgegangn, deswegen anstatt 46 diesmal 47?“; Bitte bewerte nun die folgende Begründung: """ p.msg4 = json.dumps([{"role": "system", "content": p.prompt4}]) p.prompt5 = """Du bist ein Teilnehmer eines Experiments. Die Instruktionen lauten wie folgt: ****** Das Experiment besteht aus 10 Runden. In jeder Runde erzielen Sie Gewinne in Form von Talern, die über alle Runden aufsummiert werden. Am Ende erhalten Sie Ihre gesamten Gewinne sowie eventuelle Bonuszahlungen ausbezahlt. In jeder Runde arbeiten Sie mit einer weiteren, zufällig ausgewählten Person aus dem Raum zusammen und bilden ein Zweierteam. Diese Person bleibt in allen Runden dieselbe. Auch die anderen Teilnehmer sind in feste Zweierteams eingeteilt. Jedes Zweierteam übernimmt die Rolle eines Produzenten in einer Volkswirtschaft. In jeder Runde legen Sie gemeinsam mit Ihrem Teammitglied den Preis p für Ihr Produkt fest. Dieser Preis muss zwischen 10 und 40 Talern liegen. Ihr Gewinn hängt davon ab, wie nah Ihr gewählter Preis p am Zielpreis z liegt. Dieser Zielpreis hängt von den Preisen aller Teams ab: Aus allen gewählten Preisen wird ein Durchschnittspreis P berechnet. Daraus ergibt sich der Zielpreis nach der Formel: z=15+1/2 P Das bedeutet: Ihr Zielpreis liegt 15 Taler über der Hälfte des Durchschnittspreises. Dieser Zielpreis ist für alle Teams identisch. Da alle Teams gleichzeitig ihren Preis festlegen, kennt zu Beginn einer Runde noch kein Team den Durchschnittspreis P. Ihr Ziel ist es also, möglichst gut einzuschätzen, wie die anderen Teams ihre Preise setzen werden, und Ihren Preis entsprechend so zu wählen, dass er möglichst nah am Zielpreis liegt. Je besser Ihnen das gelingt, desto höher fällt Ihr Gewinn in der Runde aus. Unabhängig von der Entfernung Ihres Preises vom Zielpreis sinkt der Gewinn zudem, wenn der Durchschnittspreis steigt. In jeder Runde geben Sie zunächst einen vorläufigen Preisvorschlag für Ihr Produkt ab. Dieser wird anschließend an Ihr Teammitglied weitergeleitet. Zeitgleich erhalten Sie den vorläufigen Preisvorschlag Ihres Teammitglieds. Anschließend geben Sie und Ihr Teammitglied unabhängig voneinander jeweils einen finalen Preisvorschlag ab. Einer der beiden finalen Preisvorschläge wird per Zufall (jeweils mit einer Wahrscheinlichkeit von 50 Prozent) als Teampreis ausgewählt. In einigen Runden werden Sie zusätzlich gebeten, eine Begründung für Ihren vorläufigen Preisvorschlag zu verfassen. Diese Begründung wird zusammen mit Ihrem vorläufigen Preisvorschlag an Ihr Teammitglied gesendet. Zeitgleich erhalten Sie den vorläufigen Preisvorschlag Ihres Teammitglieds zusammen mit dessen Begründung. Anschließend geben Sie und Ihr Teammitglied wie oben beschrieben Ihre finalen Preisvorschläge ab, von denen einer per Zufall als Teampreis ausgewählt wird. Es ist für Sie vorteilhaft, eine ausführliche, verständliche und überzeugende Begründung zu schreiben. Auf diese Weise können Sie die Entscheidung Ihres Teammitglieds beeinflussen und die Wahrscheinlichkeit erhöhen, dass der aus Ihrer Sicht passende Preisvorschlag als Teampreis ausgewählt wird. ***** Deine Aufgabe besteht nur darin, die Überzeugungskraft der Begründung Deines Teammitglieds zu beurteilen. Du musst nicht selbst einen Preisvorschlag explizit mitteilen. Eine gute Begründung sollte danach bewertet werden, ob sie Dich überzeugen kann und hypothetisch zu einer Änderung deines Preisvorschlags motivieren kann. Bewerte die Überzeugungskraft auf einer Skala von 0 bis 4. 0 bedeutet, dass es sich um eine sehr schlechte Begründung handelt, die Dich nicht überzeugt, von Deinem eigenen Preisvorschlag abzuweichen. 4 bedeutet, dass es sich um eine sehr gute Begründung handelt, die Dich dazu veranlasst, den Preisvorschlag deines Teammitglieds zu übernehmen. Eine Begründung, die mittelmäßig ist, und dich dazu bewegt, deinen Preisvorschlag teilweise in Richtung deines Teammitglieds zu bewegen, erhält die Bewertung 2. Bitte gib nur die jeweilige Ziffer als Antwort. Hier sind 16 Beispiele für eine Bewertung. Diese Bewertung gibt an, inwiefern sich Teammitglieder von der Begründung haben beeinflussen lassen. Bitte beachte, dass die folgenden Begründungen aus einer Runde stammen, in der die Teams wissen, dass sich ihr maximaler Preis von 40 auf 60 erhöht und die Formel für den Zielpreis sich zu z=25+1/2 P geändert hat, und dass der maximale Preis aller anderen Teams entweder auf 20 gefallen ist, wodurch sich der Zielpreis zu z=5+1/2 P geändert hat, oder auf 60 gestiegen ist, wodurch sich der Zielpreis zu z=25+1/2 P geändert hat, jeweils mit gleicher Wahrscheinlichkeit. Die einzelnen Begründungen sind in Anführungszeichen gesetzt und durch ein Semikolon getrennt. Da diese heterogen sind, sind die Bewertungen nicht notwendigerweise konsistent und dienen dir nur grob zur Orientierung: Folgende Begründungen entsprechen einer 0: Tendenziell war der Preis steigend, demnach würde ich dies beibehalten.“; „Ich gehe jetzt mal noch bisschen Höher auf so 46. Irgendwo da hat es sich die letzten Runden eingependelt. Hatte die 35 eben überlegt, weil ja auch noch die Möglichkeit der hälfte plus 5 besteht, da würde es eher bei Anfang/Mitte 30 liegen“; „Ich glauzb wir müssen nochmal höher, auch wenns langsam crazy wird.“; Folgende Begründungen entsprechen einer 1: „Ich denke, dass wir nun noch mal etwas höher gehen können, zumal sich der Preis stetig erhöht hat, zum anderen da wir selbst bei einer Veränderung nach unten hin, den Preis stetig anpassen können. Ich würde 53, also eine deutliche Erhöhung wagen. Ich denke dass sich der Preis weiter erhöhen wird.“; „- Durchschnittspreis ist hoch - aber eine niedrigere Zahl bringt unserem Einzelteam nichts, wenn die anderen nicht auch runter gehen - deswegen lieber relativ gleich bleiben“; „Letze Runde all in? Aber halt nicht 60“; Folgende Begründungen entsprechen einer 2: „Versuche nochmal z = 48, jetzt möglicherweise in der Runde z = 49 möglich gut mit dem p zu treffen. Tendenz der letzten Runde war ja eher ein steigender Durchschnittspreis z.“; „ouha letzte runde und dann wieder ab in die bib, wad ne kack. Naja egal. ich denke 48 ist ne solide zahl“; „Ja du keine Ahnung. Wie gesagt könnten wir mehr gewinnen, wenn P lower wäre, aber wir scheinen ja offensichtlich nicht die einzigen zu sein die so hoch schätzen, also würde ich das einfach beibehalten weil wir ja damit ganz gut bei z sind :)“; „hat ja gerade so funktioniert lmao..“; Folgende Begründungen entsprechen einer 3: „Gerade läuft es eigentlich ganz gut für uns, deshalb würde ich bei einem solchen Wert bleiben.“; „Ich wähle 48 als Preisvorschlag, da ich davon ausgehe, dass der Preis nun konstant bleibt.“; „Nachdem der Durchschnittspreis in den letzten Runden so stark angestiegen ist können wir ihn in der letzten Runde so vielleicht nochmal etwas nach unten ziehen“; „1 darunter, um nah am Zeilpreis zu bleiben, aber ihn nicht weiter zu erhöhen.“; Folgende Begründungen entsprechen einer 4: „Ich konnte jetzt überhaupt nicht nachvollziehen wo deine 35 herkam und war verunsichert. der preis passt sivch stetig nach oben an. gleich mal auf die 48 einloggen?“; „Die anderen gehen immer höher, Durchschnitt nach unten bringen lohnt sich nicht mehr. Glaube im Bereich von 48-50 sind wir gut aufgestellt.“; Bitte bewerte nun die folgende Begründung: """ p.msg5 = json.dumps([{"role": "system", "content": p.prompt5}]) def runGPT(inputMessage): completion = openai.ChatCompletion.create( model=C.MODEL, messages=inputMessage, temperature=C.TEMP ) return completion["choices"][0]["message"]["content"] def average_price(group): group.average_price = 0 for player in group.get_players(): group.average_price += player.price group.average_price /= C.PLAYERS_PER_GROUP def explanation(player): return player.explanation # calculating the earnings def round_results(group): players = group.get_players() for p in players: if p.price < 10: p.price = 10 players = group.get_players() group.average_price = 0 for player in group.get_players(): group.average_price += player.price group.average_price /= C.PLAYERS_PER_GROUP group.average_price = int(Decimal(group.average_price).to_integral_value(rounding=ROUND_HALF_UP)) for p in players: p.output = (p.omega_current - p.price) p.revenue = p.output * p.price p.unit_costs = group.average_price - p.cost_deduction p.total_costs = p.unit_costs * p.output p.earnings = (p.price - p.unit_costs) * p.output p.per_piece_earnings = p.price - p.unit_costs # if in BC p.price_aim = round((p.omega_current + group.average_price - p.cost_deduction) / 2) for p in players: if p.output < 0: p.output =0 if p.earnings < 0: p.earnings = 0 players = group.get_players() for p in players: p.payoff_round = p.earnings if group.round_number>1: player_in_all_rounds=p.in_all_rounds() p.payoff_acc = sum([p.payoff_round for p in player_in_all_rounds]) else: p.payoff_acc = p.payoff_round if p.in_round(1).attempts > 1: p.bonus_eligible = False p.bonus = 0 if p.in_round(1).attempts == 1: p.bonus_eligible = True p.bonus = 400 p.bonus_mon = cu(p.bonus).to_real_world_currency(p.session) / p.exchange_rate p.payoff_mon = cu(p.payoff_acc).to_real_world_currency(p.session) / p.exchange_rate if p.payoff_mon < 0.1: #? p.payoff_mon = 3.5 if group.round_number == 10: p.explanation_bonus_taler = ( p.in_round(1).explanation_score1 + p.in_round(5).explanation_score2 + p.in_round(6).explanation_score3 + p.in_round(7).explanation_score4 + p.in_round(10).explanation_score5 )*(p.exchange_rate/4) p.explanation_bonus = cu(p.explanation_bonus_taler).to_real_world_currency(p.session) / p.exchange_rate p.average_score= (p.in_round(1).explanation_score1+ p.in_round(5).explanation_score2 + p.in_round(6).explanation_score3 + p.in_round(7).explanation_score4 + p.in_round(10).explanation_score5)/5 p.payoff_mon_final = math.ceil(p.payoff_mon + p.bonus_mon + p.show_up_fee + p.explanation_bonus) p.payoff_mon_final_otree = math.ceil(p.payoff_mon + p.bonus_mon + p.explanation_bonus) p.payoff = p.payoff_mon_final_otree # as currently defined, there cannot be negative value in the end. otherwise use if conditions <0 = =0 # further currently there is no test or anything alike included, thus payoff = payoff_total # currently no calibration of the payoffs # PAGES class Place(Page): form_model = 'player' form_fields = ['sitzplatznummer'] @staticmethod def before_next_page(player: Player, timeout_happened): player.participant.label = str(player.sitzplatznummer) @staticmethod def is_displayed(player: Player): return (player.round_number == 1) class Start(Page): @staticmethod def is_displayed(player: Player): return (player.round_number == 1) class Pre_Comprehension(Page): #timeout_seconds = 240 @staticmethod def is_displayed(player: Player): return (player.round_number == 1) class Comprehension_OT(Page): #timeout_seconds = 720 @staticmethod def is_displayed(player: Player): return (player.round_number == 1) and player.group.optimization == True form_model = 'player' form_fields = ['Question_1', 'Question_2', 'Question_3', 'Question_4', 'Question_5', 'Question_6', 'attempts', 'Q1_first_attempt', 'Q2_first_attempt', 'Q3_first_attempt', 'Q4_first_attempt', 'Q5_first_attempt', 'Q6_first_attempt'] class Comprehension_BC(Page): #timeout_seconds = 720 @staticmethod def is_displayed(player: Player): return (player.round_number == 1) and player.group.optimization == False form_model = 'player' form_fields = ['Question_1_BC', 'Question_2_BC', 'Question_3_BC', 'Question_4_BC', 'Question_5_BC', 'attempts', 'Q1_BC_first_attempt', 'Q2_BC_first_attempt', 'Q3_BC_first_attempt', 'Q4_BC_first_attempt', 'Q5_BC_first_attempt' ] class StartWait(WaitPage): @staticmethod def is_displayed(player: Player): return (player.round_number == 1) # after_all_players_arrive = 'assigned_roles' title_text = "Bitte warten Sie einen Moment." body_text = "Bitte warten Sie, bis die anderen Spieler bereit sind, um mit dem Experiment zu beginnen. " \ "Das Experiment wird in Kürze beginnen." class Price_and_Explanation_R1(Page): @staticmethod def app_after_this_page(player, timeout_happened): if timeout_happened: return None # Stay on the same page if time runs out @staticmethod def is_displayed(player: Player): return (player.round_number == 1) @staticmethod def live_method(player: Player, data): # set chatgpt api key openai.api_key = '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' # load msg messages = json.loads(player.msg1) # functions for retrieving text from openAI if 'text' in data: # grab text that participant inputs and format for chatgpt text = data['text'] inputMsg = {'role': 'user', 'content': text} botMsg = {'role': 'assistant', 'content': text} # append messages and run chat gpt function messages.append(inputMsg) output = runGPT(messages) # also append messages with bot message botMsg = {'role': 'assistant', 'content': output} messages.append(botMsg) numbers = re.findall(r'\d+', output) score1 = int(numbers[-1]) if numbers else 0 player.explanation_score1=score1 player.participant.vars['score1'] = score1 reasoning_AI1 = str(output.strip().split()) player.reasoning1 = reasoning_AI1 return {player.id_in_group: output} else: pass form_model = 'player' form_fields = ['price', 'keystroke_data', 'keystroke_price_data', 'chatLog', 'receive'] class Price_and_Explanation_R2(Page): @staticmethod def app_after_this_page(player, timeout_happened): if timeout_happened: return None # Stay on the same page if time runs out @staticmethod def is_displayed(player: Player): return (player.round_number == 5) @staticmethod def live_method(player: Player, data): # set chatgpt api key openai.api_key = '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' # load msg messages = json.loads(player.msg2) # functions for retrieving text from openAI if 'text' in data: # grab text that participant inputs and format for chatgpt text = data['text'] inputMsg = {'role': 'user', 'content': text} botMsg = {'role': 'assistant', 'content': text} # append messages and run chat gpt function messages.append(inputMsg) output = runGPT(messages) # also append messages with bot message botMsg = {'role': 'assistant', 'content': output} messages.append(botMsg) numbers = re.findall(r'\d+', output) score2 = int(numbers[-1]) if numbers else 0 player.explanation_score2=score2 player.participant.vars['score2'] = score2 reasoning_AI2 = str(output.strip().split()) player.reasoning2 = reasoning_AI2 return {player.id_in_group: output} else: pass form_model = 'player' form_fields = ['price', 'keystroke_data', 'keystroke_price_data', 'chatLog', 'receive'] class Price_and_Explanation_R3(Page): @staticmethod def app_after_this_page(player, timeout_happened): if timeout_happened: return None # Stay on the same page if time runs out @staticmethod def is_displayed(player: Player): return (player.round_number == 6) @staticmethod def live_method(player: Player, data): # set chatgpt api key openai.api_key = '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' # load msg messages = json.loads(player.msg3) # functions for retrieving text from openAI if 'text' in data: # grab text that participant inputs and format for chatgpt text = data['text'] inputMsg = {'role': 'user', 'content': text} botMsg = {'role': 'assistant', 'content': text} # append messages and run chat gpt function messages.append(inputMsg) output = runGPT(messages) # also append messages with bot message botMsg = {'role': 'assistant', 'content': output} messages.append(botMsg) numbers = re.findall(r'\d+', output) score3 = int(numbers[-1]) if numbers else 0 player.explanation_score3=score3 player.participant.vars['score3'] = score3 reasoning_AI3 = str(output.strip().split()) player.reasoning3 = reasoning_AI3 return {player.id_in_group: output} else: pass form_model = 'player' form_fields = ['price', 'keystroke_data', 'keystroke_price_data', 'chatLog', 'receive'] class Price_and_Explanation_R4(Page): @staticmethod def app_after_this_page(player, timeout_happened): if timeout_happened: return None # Stay on the same page if time runs out @staticmethod def is_displayed(player: Player): return (player.round_number == 7) @staticmethod def live_method(player: Player, data): # set chatgpt api key openai.api_key = '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' # load msg messages = json.loads(player.msg4) # functions for retrieving text from openAI if 'text' in data: # grab text that participant inputs and format for chatgpt text = data['text'] inputMsg = {'role': 'user', 'content': text} botMsg = {'role': 'assistant', 'content': text} # append messages and run chat gpt function messages.append(inputMsg) output = runGPT(messages) # also append messages with bot message botMsg = {'role': 'assistant', 'content': output} messages.append(botMsg) numbers = re.findall(r'\d+', output) score4 = int(numbers[-1]) if numbers else 0 player.explanation_score4=score4 player.participant.vars['score4'] = score4 reasoning_AI4 = str(output.strip().split()) player.reasoning4 = reasoning_AI4 return {player.id_in_group: output} else: pass form_model = 'player' form_fields = ['price', 'keystroke_data', 'keystroke_price_data', 'chatLog', 'receive'] class Price_and_Explanation_R5(Page): @staticmethod def app_after_this_page(player, timeout_happened): if timeout_happened: return None # Stay on the same page if time runs out @staticmethod def is_displayed(player: Player): return (player.round_number == 10) @staticmethod def live_method(player: Player, data): # set chatgpt api key openai.api_key = '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' # load msg messages = json.loads(player.msg5) # functions for retrieving text from openAI if 'text' in data: # grab text that participant inputs and format for chatgpt text = data['text'] inputMsg = {'role': 'user', 'content': text} botMsg = {'role': 'assistant', 'content': text} # append messages and run chat gpt function messages.append(inputMsg) output = runGPT(messages) # also append messages with bot message botMsg = {'role': 'assistant', 'content': output} messages.append(botMsg) numbers = re.findall(r'\d+', output) score5 = int(numbers[-1]) if numbers else 0 player.explanation_score5=score5 player.participant.vars['score5'] = score5 reasoning_AI5 = str(output.strip().split()) player.reasoning5 = reasoning_AI5 return {player.id_in_group: output} else: pass form_model = 'player' form_fields = ['price', 'keystroke_data', 'keystroke_price_data', 'chatLog', 'receive'] class PriceSetting(Page): @staticmethod def is_displayed(player: Player): return player.round_number in [2, 3, 4, 8, 9] form_model = 'player' form_fields = ['price'] class ResultsWait(WaitPage): after_all_players_arrive='round_results' title_text = "Bitte warten Sie einen Moment." body_text = "Bitte warten Sie kurz bis alle Teilnehmenden eine Entscheidung getroffen haben. " \ "Es geht in Kürze weiter." class ResultsFeedback(Page): pass class ShockAnnouncement(Page): @staticmethod def is_displayed(player: Player): return (player.round_number == player.shock) class FinalResults(Page): @staticmethod def is_displayed(player: Player): return (player.round_number == 10) class Demographics(Page): @staticmethod def is_displayed(player: Player): return (player.round_number == 10) form_model = 'player' form_fields = ['Gender', 'Age', 'Faculty', 'Makro', 'tech_problems'] class FinalPage(Page): @staticmethod def is_displayed(player: Player): return (player.round_number == 10) page_sequence = [ Place, Start, Pre_Comprehension, Comprehension_OT, Comprehension_BC, StartWait, ShockAnnouncement, Price_and_Explanation_R1, Price_and_Explanation_R2, Price_and_Explanation_R3, Price_and_Explanation_R4, Price_and_Explanation_R5, PriceSetting, ResultsWait, ResultsFeedback, FinalResults, Demographics, FinalPage]