from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) from django.forms import widgets as d_widgets import random import numpy as np from scipy.optimize import curve_fit doc = ''' This app is the investment decision for three assets. ''' class Constants(BaseConstants): name_in_url = 'ThreeAssets' players_per_group = None num_rounds = 15 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): ##################Portfolio Selection########################################################3 def util(self,rets,w,A,gamma,eta): u=(1-gamma)/gamma*(A*(w[0]*rets[0]+w[1]*rets[1]+w[2]*rets[2])/(1-gamma)+eta)**gamma # print(u) return u # def util(self,w,A,gamma,eta,ret_s,ret_b,ret_rf): # u=w[2]*ret_b # return u port_value=models.FloatField(initial=100) port_1_first=models.IntegerField(max=100,min=0,initial=0, label='''Stocks''', widget=d_widgets.NumberInput(attrs={"step":5,'class':'spinner','readonly':'readonly'})) # port_2=models.IntegerField(max=100,min=0, # label='''Small-Cap''', # widget=widgets.NumberInput(attrs={"step":1,'class':'spinner','readonly':'readonly'})) port_2_first=models.IntegerField(max=100,min=0,initial=0, label='''Bonds''', widget=d_widgets.NumberInput(attrs={"step":5,'class':'spinner','readonly':'readonly'})) port_3_first=models.IntegerField(max=100,min=0,initial=0, label='''Risk-Free''', #Treasuries widget=d_widgets.NumberInput(attrs={"step":5,'class':'spinner','readonly':'readonly'})) first_mean=models.FloatField(initial=0) first_bot=models.FloatField(initial=0) first_top=models.FloatField(initial=0) first_mean_final=models.FloatField(initial=0) first_bot_final=models.FloatField(initial=0) first_top_final=models.FloatField(initial=0) port_1=models.IntegerField(max=100,min=0,initial=0, label='''Stocks''', widget=d_widgets.NumberInput(attrs={"step":5,'class':'spinner','readonly':'readonly'})) port_2=models.IntegerField(max=100,min=0,initial=0, label='''Bonds''', widget=d_widgets.NumberInput(attrs={"step":5,'class':'spinner','readonly':'readonly'})) port_3=models.IntegerField(max=100,min=0,initial=0, label='''Risk-Free''', #Treasuries widget=d_widgets.NumberInput(attrs={"step":5,'class':'spinner','readonly':'readonly'})) port_mean=models.FloatField(initial=0) port_bot=models.FloatField(initial=0) port_top=models.FloatField(initial=0) port_mean_final=models.FloatField(initial=0) port_bot_final=models.FloatField(initial=0) port_top_final=models.FloatField(initial=0) port_1_best=models.IntegerField(max=100,min=0,initial=0, label='''Stocks''', widget=d_widgets.NumberInput(attrs={"step":5,'class':'spinner','readonly':'readonly'})) port_2_best=models.IntegerField(max=100,min=0,initial=0, label='''Bonds''', widget=d_widgets.NumberInput(attrs={"step":5,'class':'spinner','readonly':'readonly'})) port_3_best=models.IntegerField(max=100,min=0,initial=0, label='''Risk-Free''', #Treasuries widget=d_widgets.NumberInput(attrs={"step":5,'class':'spinner','readonly':'readonly'})) best_mean_final=models.FloatField(initial=0) best_bot_final=models.FloatField(initial=0) best_top_final=models.FloatField(initial=0) advisor_type=models.IntegerField(initial=0) ret_rf=models.FloatField(initial=1.03) ret_s=models.FloatField(initial=1.00) ret_b=models.FloatField(initial=1.00) gamma=models.FloatField(initial=0) eta=models.FloatField(initial=0) # port_5=models.IntegerField(max=100,min=0, # label='''Real Estate''', # widget=d_widgets.NumberInput(attrs={"step":1,'class':'spinner','readonly':'readonly'})) def port_return(self): self.ret_s=np.exp(np.random.normal(.06,.55)) self.ret_b=np.exp(np.random.normal(0,.4)) if self.round_number not in [1,6,11]: prev_val=self.in_round(self.round_number-1).port_value else: prev_val=self.port_value self.port_value=round(prev_val*(self.port_3*self.ret_rf+self.port_1*self.ret_s+self.port_2*self.ret_b)/100,2) # print(self.mert_value) def func_model(self,x,a,b): return a*x[0]+b*x[1] ######################################################################################################