1998年全国大学生数学建模竞赛A题——投资的收益和风险数模P133|lingo,matlab
1998年全國大學生數學建模競賽A題
目錄
題目
問一
用lingo求解
用matlab求解
?問2
題目
市場上有n 種資產(如股票、債券、…)Si ( i=1,…n) 供投資者選擇,某公司有數額為M 的一筆相當大的資金可用作一個時期的投資。公司財務分析人員對這n 種資產進行了評估,估算出在這一時期內購買Si 的平均收益率為 ri,并預測出購買Si的風險損失率為qi 。考慮到投資越分散,總的風險越小,公司確定,當用這筆資金購買若干種資產時,總體風險可用所投資的Si 中最大的一個風險來度量。
購買Si 要付交易費,費率為 pi,并且當購買額不超過給定值 ui時,交易費按購買ui 計算(不買當然無須付費)。另外,假定同期銀行存款利率是r0, 且既無交易費又無風險。( r0=5% )
1)已知n = 4 時的相關數據如下:
Si ? ?ri(%) ?qi(%) ?pi(%) ?ui(元) ??
S1 ? 28 ? ? 2.5 ? ? 1 ? ? ? ? 103
S2 ? 21 ? ? 1.5 ? ? 2 ? ? ? ? 198
S3 ? 23 ? ? 5.5 ? ? 4.5 ? ? ? 52
S4 ? ?25 ? ?2.6 ? ? 6.5 ? ? ? 40
試給該公司設計一種投資組合方案,即用給定的資金 ,有選擇地購買若干種資產或存銀行生息,使凈收益盡可能大,而總體風險盡可能小。
2)試就一般情況對以上問題進行討論,并利用以下數據進行計算。
| Si | ri/% | qi/% | pi/% | ui/元 |
| S1 | 9.6 | 42 | 2.1 | 181 |
| S2 | 18.5 | 54 | 3.2 | 407 |
| S3 | 49.4 | 60 | 6 | 428 |
| S4 | 23.9 | 42 | 1.5 | 549 |
| S5 | 8.1 | 1.2 | 7.6 | 270 |
| S6 | 14 | 39 | 3.4 | 397 |
| S7 | 40.7 | 68 | 5.6 | 178 |
| S8 | 31.2 | 33.4 | 3.1 | 220 |
| S9 | 33.6 | 53.3 | 2.7 | 475 |
| S10 | 36.8 | 40 | 2.9 | 248 |
| S11 | 11.8 | 31 | 5.1 | 195 |
| S12 | 9 | 5.5 | 5.7 | 320 |
| S13 | 35 | 46 | 2.7 | 267 |
| S14 | 9.4 | 5.3 | 4.5 | 328 |
| S15 | 15 | 23 | 7.6 | 131 |
問一求解?
用lingo求解:
model: sets: type/1..5/:c,x; rate/1..4/:; link(type,rate):asset,A; point/1..11/:w,q_lim,v_lim; endsets data: asset=5 0 0 028 2.5 1 10321 1.5 2 19823 5.5 4.5 5225 2.6 6.5 40; w_start=0; w_add=0.1;!權重初值和每次求解的增量; enddatasubmodel sub: @for(type(i):c(i)=@if(x(i)#eq#0,0,@smax(A(i,3)*A(i,4),A(i,3)*x(i)))); !計算購買各資產的交易費; q=@max(type(i):A(i,2)*x(i)); !投資組合x的風險(以各類資產中最大的風險為度量); v=@sum(type(i):A(i,1)*x(i)-c(i)); !投資組合x的平均凈利潤; @sum(type(i):x(i)+c(i))=10000; !約束條件; endsubmodel submodel obj: min=w_sum*q-(1-w_sum)*v; endsubmodelcalc: @for(link(i,j)|j#le#3:A(i,j)=asset(i,j)*0.01); !#le#左邊運算符<=右邊運算符; @for(link(i,j)|j#eq#4:A(i,j)=asset(i,j)); !系統參數設置; !@set('terseo',1);!只輸出簡單的求解信息; !@set('stawin',0);!關閉求解狀態窗口; !分別求解不同廣告費上限的優化問題; @for(point(n):w_sum=w_start+(n-1)*w_add;@solve(obj,sub);!求解子模型; !記錄計算結果;w(n)=w_sum;q_lim(n)=q;v_lim(n)=v;); !顯示所記錄的結果; @write('w 風險 凈利潤',@newline(1));!@write函數用于輸出結果,@newline即輸出新行; @for(point(n):@write(@format(w(n),'#12.1f'),@format(q_lim(n),'#12.2f'),@format(v_lim(n),'#12.1f'),@newline(1))); endcalc end結果:
還可以對權重w按0.001的間隔取值計算并作圖:
lingo:
sets: type/1..5/:c,x; rate/1..4/:; link(type,rate):asset,A; point/1..1001/:w,q_lim,v_lim; endsets data: asset=5 0 0 028 2.5 1 10321 1.5 2 19823 5.5 4.5 5225 2.6 6.5 40; w_start=0; w_add=0.001;!權重初值和每次求解的增量; @ole('C:\Users\煙雨瀟瀟\Desktop\新建文件夾\CSDN\數模4.8例2.xlsx',q)=q_lim; @ole('C:\Users\煙雨瀟瀟\Desktop\新建文件夾\CSDN\數模4.8例2.xlsx',v)=v_lim; enddatamatlab:
clc,clear q=xlsread('C:\Users\煙雨瀟瀟\Desktop\新建文件夾\CSDN\數模4.8例2.xlsx',1,'A1:A1000'); v=xlsread('C:\Users\煙雨瀟瀟\Desktop\新建文件夾\CSDN\數模4.8例2.xlsx',1,'B1:B1000'); plot(q,v) xlabel('風險/元') ylabel('收益/元') title('例2的有效前沿') grid on %網格線用matlab求解(失敗):
主程序:
clear,clc global w %設定風險q和凈收益v的權重分別為w,1-w global asset global type %資產的數據矩陣,第一行為銀行存款 %列1平均收益率,列2風險損失率,列3交易費率,列4定值 asset=[5 0 0 0;28 2.5 1 103;21 1.5 2 198;23 5.5 4.5 52;25 2.6 6.5 40]; asset(:,1:3)=asset(:,1:3)*0.01;%前三列用百分率 type=size(asset,1); %維度為1時,size返回矩陣的行數(資產種類) % fmincon(@fun,x0,A,b,Aeq,beq,lb,ub,nonlcon(非線性約束),options) %求fun最小值,一般fval=fun(x) %約束條件為Aeq*x = beq 和 A*x <= b x_final=zeros(type,11);%記錄x q=[];%記錄投資組合x的風險 v=[]; %投資組合x的平均凈收益 gs = GlobalSearch; for i=1:11w=(i-1)/10;%[x,fval]=ga(@minfun,5,[],[],[],[],zeros(5,1),[],@nonfun);%x=x';problem = createOptimProblem('fmincon','objective',@minfun,'x0',zeros(5,1),'Aineq',[],'bineq',[],'Aeq',[],... 'beq',[],'lb',zeros(type,1),'ub',[],'nonlcon',@nonfun); %'options',optimset('Algorithm','SQP','Disp','none')x = run(gs,problem);x_final(:,i)=x;q=[q,max(asset(:,2).*x)];v=[v,sum(asset(:,1).*x-cfun(x))]; endminfun.m
function[y]=minfun(x) global w global asset %x=x'; q=max(asset(:,2).*x); %投資組合x的風險(以各類資產中風險最大的一個度量) v=sum(asset(:,1).*x-cfun(x)); %投資組合x的平均凈收益 y=w*q-(1-w)*v; %設定風險q和凈收益v的權重分別為w,1-wcfun.m
function[c]=cfun(x) %cfun函數計算購買各資產的交易費 global type global asset c=zeros(type,1); %列向量 for i=1:typeif x(i)<=0.06c(i,1)=0;elsec(i,1)=max(asset(i,3)*asset(i,4),asset(i,3)*x(i)); %每種資產購買額x(i)不超過定值時,交易費按購買定值計算end endnonfun.m
function[g,ceq]=nonfun(x)%非線性約束:g(x)<=0 ,ceq(x)=0 %x=x'; g=[]; m=10000; ceq=sum(x+cfun(x))-m;matlab嘗試過很多次,下圖是最好的一次,但是cfun里要設置x<=0.06,x==0會和書上結果大不一樣。
?
?問2
簡單的代入就可以了,如果w以0.1為間隔,運行15秒即可出結果。
總結
以上是生活随笔為你收集整理的1998年全国大学生数学建模竞赛A题——投资的收益和风险数模P133|lingo,matlab的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win8安装.net framework
- 下一篇: 黑客组织LulzSec解散了,大公司又恢