from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) import random #doc = """収入とリスク資産への投資割合の関係性をみる実験""" class Constants(BaseConstants): name_in_url = 'my_invest' players_per_group = None num_rounds = 10 instructions_template = 'my_invest/instructions.html' min_income=1000 max_income=10000 min_bond=0.8 max_bond=1.2 min_stock=0 max_stock=2.5 class Subsession(BaseSubsession): def creating_session(self): for p in self.get_players(): import random bond = random.uniform(Constants.min_bond, Constants.max_bond) p.bond = round(bond, 1) stock = random.uniform(Constants.min_stock, Constants.max_stock) p.stock = round(stock, 1) if self.round_number == 1: for p in self.get_players(): import random income = random.uniform( Constants.min_income, Constants.max_income ) p.income = round(income, -2) else: for p in self.get_players(): p.income = p.in_round(1).income class Group(BaseGroup): pass class Player(BasePlayer): income = models.FloatField() bond = models.FloatField() stock = models.FloatField() investment_gain = models.FloatField() total_payment = models.FloatField() basic_income = models.FloatField() total_payoff = models.FloatField() real_gain = models.FloatField() invest_bond = models.FloatField( label='' '株を何単位購入しますか?購入しない場合は0を記入してください。' '', min=0) def invest_bond_max(self): return self.income invest_point = models.FloatField( label='' '株への投資金額を入力してください' '', min=0) def invest_point_max(self): return self.income def invest_return(self): self.investment_gain = self.invest_bond * self.bond + self.invest_point * self.stock self.investment_gain = round(self.investment_gain, 0) self.total_payment = self.investment_gain + self.income - self.invest_bond - self.invest_point self.total_payment = round(self.total_payment,0) def final_payment(self): self.basic_income = self.income * Constants.num_rounds def set_payoffs(self): player.total_payment = self.total_payment