import csv import pandas as pd import random import time start_time=time.time() sp=pd.read_csv("../../FundData/SP500.csv") sp['ret_s']=sp['Adj Close']/sp['Adj Close'].shift(12) bd=pd.read_csv("../../FundData/ICE US Investment Grade.csv") bd.columns=['Date','BondPrice'] bd['ret_b']=bd['BondPrice']/bd['BondPrice'].shift(12) ret_rf=1+.02/12 all=pd.merge(sp,bd,on='Date') all=all[['Date','ret_s','ret_b']] def util(w,A,gamma,alpha,ret_s,ret_b): u=gamma/(1-gamma)*(A*(w[0]*ret_rf+w[1]*ret_s + w[0]*ret_b) + gamma/alpha)**(1-gamma) return u def util2(w,A,gamma,eta,ret_s, ret_b, ret_rf): u=(1-gamma)/gamma*(A*(w[0]*ret_rf+w[1]*ret_s+w[0]*ret_b)/(1-gamma)+eta)**gamma return u gamma=-1 alpha=.008 A=100 eU=[] best=-999999999 best_port=(0,0,0,-9999999) for i in range(21): for k in range((21-i)): w=(5*i/100,5*k/100,5*(20-i-k)/100) u=[] for j in range(12,len(all['Date'])): u.append(util(w,A,gamma,alpha,all['ret_s'].iloc[j],all['ret_b'].iloc[j])) eU.append((w[0],w[1],w[2],sum(u)/len(u))) if eU[-1][3]>best_port[3]: best_port=eU[-1] # print(i,k,100-i-k,eU[-1]) for x in eU: print(x) print(best_port) print("--------%s seconds ----------" % (time.time()-start_time))