Диссертация (1137458), страница 23
Текст из файла (страница 23)
Принятие решений агентамиfor (t in 1:(tt-1)){for (i in 1:n){# изменение вероятностей верного определения направдения изменения ценв кризисный периодif ((R[t]==1)&(i<=n/2)) p[i]<-p[i]+0.4 else if ((R[t]==1)&(i>n/2))p[i]<-p[i]-0.4if ((z1[i,t]<p[i]) & (price[t+1]- price[t]>0)) { s[i,t] <- 1}else if ((z1[i,t]<p[i]) & (price[t+1]-price[t]<=0)) { s[i,t] <- -1}else if ((z1[i,t]>=p[i]) & (price[t+1]-price[t]>0)) { s[i,t] <- -1}else if ((z1[i,t]>=p[i]) & (price[t+1]-price[t]<=0)) {s[i,t] <- 1}# возвращаем прежние значения вероятностиif ((R[t]==1)&(i<=n/2)) p[i]<-p[i]-0.4else if ((R[t]==1)&(i>n/2)) p[i]<-p[i]+0.4}# выставление объема заявки для обеих групп трейдеровfor (i in 1:(n/2)){if ((s[i,t]==-1) & (stocks[i,t]>0) & (R[t]==0)) {if (leverage==0) vol[i,t] <- z2[i,t]*stocks[i,t]/10 else vol[i,t] <z2[i,t]*leverage*wealth[i,t]/(price[t]*10)} else if ((s[i,t]==-1) & (stocks[i,t]>0) & (R[t]==1)) {vol[i,t] <- z2[i,t]*stocks[i,t]} else if ((s[i,t]==-1) & (stocks[i,t]<=0) & (R[t]==0)) {vol[i,t] <- z2[i,t]*leverage*wealth[i,t]/(price[t]*10)} else if ((s[i,t]==-1) & (stocks[i,t]<=0) & (R[t]==1)) {vol[i,t] <- 0} else if ((s[i,t]==1) & (R[t]==1)) {180if (cash[i,t]>=0) vol[i,t] <- z2[i,t]*cash[i,t]/price[t] elsevol[i,t]<-0} else if ((s[i,t]==1) & (cash[i,t]>=0) & (R[t]==0) ) {if (leverage==0) vol[i,t]<-z2[i,t]*cash[i,t]/(price[t]*10) elsevol[i,t]<- z2[i,t]*(wealth[i,t]*leverage)/(price[t]*10)}else if ((s[i,t]==1) & (cash[i,t]<=0) & (R[t]==0) ) {if (leverage==0) vol[i,t]<-0 else vol[i,t]<z2[i,t]*(wealth[i,t]*leverage)/(price[t]*10)}}for (i in (n/2+1):n){if ((s[i,t]==-1) & (stocks[i,t]>0) & (R[t]==0)) {if (leverage==0) vol[i,t] <- z2[i,t]*stocks[i,t] else vol[i,t] <z2[i,t]*leverage*wealth[i,t]/(price[t])} else if ((s[i,t]==-1) & (stocks[i,t]>0) & (R[t]==1)) {vol[i,t] <- z2[i,t]*stocks[i,t]} else if ((s[i,t]==-1) & (stocks[i,t]<=0) & (R[t]==0)) {vol[i,t] <- z2[i,t]*leverage*wealth[i,t]/(price[t])} else if ((s[i,t]==-1) & (stocks[i,t]<=0) & (R[t]==1)) {vol[i,t] <- 0} else if ((s[i,t]==1) & (R[t]==1)) {if (cash[i,t]>=0) vol[i,t] <- z2[i,t]*cash[i,t]/price[t] elsevol[i,t]<-0} else if ((s[i,t]==1) & (cash[i,t]>=0) & (R[t]==0) ) {if (leverage==0) vol[i,t]<-z2[i,t]*cash[i,t]/(price[t]) elsevol[i,t]<- z2[i,t]*(wealth[i,t]*leverage)/(price[t])}else if ((s[i,t]==1) & (cash[i,t]<=0) & (R[t]==0) ) {if (leverage==0) vol[i,t]<-0 else vol[i,t]<z2[i,t]*(wealth[i,t]*leverage)/(price[t])}}for (i in 1:n){# пересчет денег и акций после сделокif ((s[i,t]>=0) & (vol[i,t]*price[t]<=cash[i,t])) {cash[i,t+1]<-cash[i,t]-vol[i,t]*price[t]; stocks[i,t+1]<stocks[i,t]+vol[i,t]} else if ((s[i,t]>=0) & (vol[i,t]*price[t]>cash[i,t])) {cash[i,t+1] <- 0; stocks[i,t+1] <- stocks[i,t]+vol[i,t](vol[i,t]*price[t]-cash[i,t])/price[t+1]} else if ((s[i,t]<0) & (stocks[i,t]>0)& (stocks[i,t]>=vol[i,t])) {cash[i,t+1] <- cash[i,t]+vol[i,t]*price[t]; stocks[i,t+1] <stocks[i,t]-vol[i,t]} else if ((s[i,t]<0) & (stocks[i,t]>0)& (stocks[i,t]<vol[i,t])) {cash[i,t+1] <- cash[i,t]+stocks[i,t]*price[t] + (vol[i,t]stocks[i,t])*(price[t]-price[t+1]); stocks[i,t+1] <- 0} else if ((s[i,t]<0) & (stocks[i,t]<=0)) {cash[i,t+1] <- cash[i,t]+vol[i,t]*(price[t]-price[t+1]);stocks[i,t+1]<- 0}# пересчет благосостояния и анализ банкротства181wealth[i,t+1]<-cash[i,t+1]+stocks[i,t+1]*price[t+1]if (wealth[i,t+1]<=wealth0/2){if (i<=(n/2)){b[1,t]<-b[1,t]+1cash[i,t+1]<-cash0stocks[i,t+1]<-stocks0m1[k1]<-p[i]k1<-k1+1p[i]<- runif(1,min=p_min1, max=p_max1)}else{b[2,t]<-b[2,t]+1cash[i,t+1]<-cash0stocks[i,t+1]<-stocks0m2[k2]<-p[i]k2<-k2+1p[i]<- runif(1,min=p_min2, max=p_max2)}}}}av_wealth[i1,ii]<- colMeans(wealth)[tt]num<-0for (i in 1:n) if (wealth[i,tt]>=wealth0) num<-num+1better_wealth[i1,ii]<-numbankrupts[i1,ii]<-sum(b)x11()}}# рисуем графики критериевv<-matrix(10, nrow = n2-n1+1, ncol=1)h<-0; for (j in n1:n2) {h<-h+1; v[h]<-j/100}x11()par(mfrow = c(1, 3))plot(v,rowMeans(av_wealth), xlab="time", ylab="money", main="averagewealth", col="black", type = "l")plot(v, rowMeans(better_wealth), xlab="time", ylab="percentage",main="fraction of agent with wealth greater than initial",col="black", type = "l")plot(v, rowMeans(bankrupts), xlab="time", ylab="number of agents",main="average number of bankrupts", col="black", type = "l")Исходный код для модели из раздела 3.3> restart;Подключение пакетов182> with(linalg):with(simplex):Общее число акций и число акций во множествах I+,I- и 0> n:=6:np:=2:nm:=2:n0:=n-np-nm:Вероятности р+ и р> pp:=0.9:pm:=0.9:Начальные данные - имеющиеся акции, наличные деньги и величина кредитного рычага> v:=vector(n,[10,20,50,0,4,12]):> #v:=vector(n,0):> m:=1000:k:=2:s - массив цен на текущий момент,smin и smax - массивы прогнозируемыхтрейдером границ цен на следующий момент времени> s:=vector(n,[50,90,10,22,49,50]):smin:=vector(n,[40,75,8,18,42,30]):smax:=vector(n,[60,120,13,25,53,70]):Задание матриц> A:=matrix(4*n,2*n,0):for i from 1 to 2*n doA[2*i-1,i]:=1:A[2*i,i]:=-1:od:> bsmall:=vector(4*n,0):> for i from 1 to np dobsmall[(i-1)*4+1]:=s[i]:bsmall[(i-1)*4+2]:=-smax[i]:bsmall[(i-1)*4+3]:=smin[i]:bsmall[(i-1)*4+4]:=-s[i]:od:for i from np+1 to np+nm dobsmall[(i-1)*4+1]:=smin[i]:bsmall[(i-1)*4+2]:=-s[i]:bsmall[(i-1)*4+3]:=s[i]:bsmall[(i-1)*4+4]:=-smax[i]:od:for i from np+nm+1 to n dobsmall[(i-1)*4+1]:=s[i]:bsmall[(i-1)*4+2]:=-smax[i]:bsmall[(i-1)*4+3]:=smin[i]:bsmall[(i-1)*4+4]:=-s[i]:od:> B:=matrix(n+2,n,0):for i from 1 to n doB[i,i]:=1:od:for i from np+1 to np+nm doB[n+1,i]:=-s[i]:B[n+2,i]:=s[i]:od:for i from 1 to np doB[n+2,i]:=-s[i]:od:> dsmall:=vector(n+2,0):dsmall[n+1]:=-k*(m+multiply(s,v)):dsmall[n+2]:=-m+multiply(s,v):> Dbig:=matrix(n,2*n,0):for i from 1 to np doDbig[i,i]:=pp:od:for i from 1 to np doDbig[i,np+i]:=1-pp:183od:for i from 1 to nm doDbig[np+i,2*np+i]:=pm:od:for i from 1 to nm doDbig[np+i,2*np+nm+i]:=1-pm:od:for i from 1 to n-np-nm doDbig[np+nm+i,2*(np+nm)+i]:=1/2:od:for i from 1 to n-np-nm doDbig[np+nm+i,2*(np+nm)+(n-np-nm)+i]:=1/2:od:> q:=vector(2*n):for i from 1 to np doq[i]:=pp*v[i]:q[np+i]:=(1-pp)*v[i]:od:for i from 1 to nm doq[2*np+i]:=pm*v[np+i]:q[2*np+nm+i]:=(1-pm)*v[np+i]:od:for i from 1 to n-np-nm doq[2*(np+nm)+i]:=v[np+nm+i]/2:q[2*(np+nm)+n-np-nm+i]:=v[np+nm+i]/2:od:Задача 1> h:=vector(4*n);x:=vector(n);> eq1:=matadd(matadd(multiply(h,A),-multiply(x,Dbig)),-q):eq2:=map(x -> x<=0, eq1);> eq3:=matadd(multiply(B,x),-dsmall):eq4:=map(x -> x>=0, eq3);> cnsts1:= {seq(eq2[i],i=1...2*n),seq(eq4[i],i=1...n+2)};> obj1:= multiply(bsmall,h);> maximize(obj1,cnsts1,NONNEGATIVE);Задача 2> u:=vector(n+2);w:=vector(2*n);> eq5:=matadd(multiply(u,B),multiply(Dbig,w)):eq6:=map(x -> x<=0, eq5);> eq7:=matadd(multiply(A,w),-bsmall):eq8:=map(x -> x>=0, eq7);> cnsts2:= {seq(eq6[i],i=1...n), seq(eq8[i],i=1...4*n)};obj2:= multiply(-dsmall,u)+multiply(q,w);> minimize(obj2,cnsts2,NONNEGATIVE);184.