from otree.api import * doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'tsumitate_teigaku_herding' PLAYERS_PER_GROUP = 3 NUM_ROUNDS = 10 #決算が好景気(0)不景気(1) SETTLEMENT = [0, 1, 1, 0, 1, 0, 1, 0, 1, 1] #決算が好景気の時のメッセージと悪景気の時のメッセージ SETTLEMENT_MESSAGE = [ '株式市場は盛り上がっており、株式Aと株式Bは共に好決算です!', '株式市場は盛り上がっておらず、株式Aと株式Bは共に悪決算です...' ] #株価を定義 STOCK_PRICE_A = [4000, 4400, 5720, 6292, 8179.6, 10633.48] STOCK_PRICE_B = [4000, 4000, 5600, 5600, 7840, 10976] #毎月の積立額 TSUMITATE = 20000 #インフルエンサーのおすすめするポートフォリオを表示 PORTFOLIO = [ '株式Aを0%、株式Bを100%の割合で積立投資する', '株式Aを25%、株式Bを75%の割合で積立投資する', '株式Aを50%、株式Bを50%の割合で積立投資する', '株式Aを75%、株式Bを25%の割合で積立投資する', '株式Aを100%、株式Bを0%の割合で積立投資する' ] INFLUENCER_MESSAGE = [3, 2, 3, 1, 2] class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): income_stock_choice = models.IntegerField( choices=[ [4, '株式Aを100%、株式Bを0%の割合で積立投資する'], [3, '株式Aを75%、株式Bを25%の割合で積立投資する'], [2, '株式Aを50%、株式Bを50%の割合で積立投資する'], [1, '株式Aを25%、株式Bを75%の割合で積立投資する'], [0, '株式Aを0%、株式Bを100%の割合で積立投資する'] ], verbose_name='あなたが投資する株式のポートフォリオを選んでください。', widget=widgets.RadioSelect ) def set_payoff(player:Player): number_A = 0 number_B = 0 #株価を求め、定額分の株式数を計算し、その後現在の株価*保有株式数から取得にかかったコスト(定額*ラウンド数)を引くことでコストを求める #トータルの株式数*株価の計算 for i in range(player.round_number): #ラウンドiでのプレイヤーを定義 prev_player = player.in_round(i+1) #現在の株価を求める stock_price_A = C.STOCK_PRICE_A[prev_player.round_number - 1] stock_price_B = C.STOCK_PRICE_B[prev_player.round_number - 1] #ラウンドiでプレイヤーが保有している株式数を計算 number_A = number_A + C.TSUMITATE * prev_player.income_stock_choice * 0.25 / stock_price_A number_B = number_B + C.TSUMITATE * (4 - prev_player.income_stock_choice) * 0.25 / stock_price_B #訂正版 income_A = number_A * C.STOCK_PRICE_A[player.round_number] income_B = number_B * C.STOCK_PRICE_B[player.round_number] income_total = income_A + income_B - C.TSUMITATE * player.round_number player.payoff = income_total def set_payoffs(group: Group): for p in group.get_players(): set_payoff(p) # PAGES class MyPage(Page): pass class ResultsWaitPage(WaitPage): after_all_players_arrive = set_payoffs class DecisionInvestment(Page): timeout_seconds = 60 form_model = 'player' form_fields = [ 'income_stock_choice' ] @staticmethod # 誰か使い方を教えて下さい def vars_for_template(player: Player): return dict( osusume = C.PORTFOLIO[C.INFLUENCER_MESSAGE[player.round_number - 1]] ) class Results(Page): timeout_seconds = 15 @staticmethod # 誰か使い方を教えて下さい def vars_for_template(player: Player): return dict( my_decision = player.field_display('income_stock_choice'), market_g_b = C.SETTLEMENT_MESSAGE[C.SETTLEMENT[player.round_number - 1]], year = player.round_number ) page_sequence = [DecisionInvestment, ResultsWaitPage, Results]