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 with two assets. ''' class Constants(BaseConstants): name_in_url = 'TwoAssets' players_per_group = None num_rounds = 15 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): def func_model(self,x,a,b): return a*x[0]+b*x[1] gamma=models.FloatField(initial=.001) eta=models.FloatField(initial=1) def calc_hara(self): val=[] f=[] pi=[] for x in self.in_all_rounds()[-9:]: val.append(x.mert_value/100) pi.append(x.mert_B/100) f.append(np.exp(-self.rf_rate*(5-x.round_number))) xdata=np.array([val,f],dtype="float") pi = np.array(pi,dtype="float") # print(xdata.shape) estimates, vcov=curve_fit(self.func_model,xdata,pi) # print(estimates) self.gamma=1-(.235-.03)/(.734**2)/estimates[0] self.eta=estimates[1]*(.734)**2/(.235-.03) # print(self.gamma) # print(self.eta) self.participant.vars['gamma']=self.gamma self.participant.vars['eta']=self.eta ###################################################################################################### ###################### MERTON TASK ################################################################## mert_value=models.FloatField(initial=100) rf_rate=models.FloatField(initial=.03) mert_A=models.IntegerField(max=100,min=0,initial=50, label='''Risk Free''', widget=d_widgets.NumberInput(attrs={"step":5,'class':'spinner','type':'hidden'})) mert_B=models.IntegerField(max=100,min=0,initial=50, label='''Risky''', widget=d_widgets.NumberInput(attrs={"step":5,'class':'spinner','type':'hidden'})) def mert_return(self): ret=np.exp(np.random.normal(.06,.55)) if self.round_number not in [1,6,11]: prev_val=self.in_previous_rounds()[-1].mert_value else: prev_val=self.mert_value self.mert_value=round((self.mert_A*prev_val*(1+self.rf_rate) + self.mert_B*prev_val*ret)/100,2) # print(self.mert_value) #####################################################################################################3