作者hoek (漸漸淡了....)
看板NTU-GIIB2004
標題[情報] 好人做到底...第三次金融計算作業Java程式碼
時間Thu Apr 28 00:17:31 2005
<%@ page import="java.util.*" contentType="text/html;charset=Big5" %>
<%!
double bubble(double[] D, int num)
{
double t=0;
for(int i=num-1;i>=0;i--)
{
for(int j=1;j<=i;j++)
{
if( D[j-1] > D[j] )
{
t = D[j-1];
D[j-1] = D[j];
D[j]=t;
}
}
}
return D[num-1];
}
%>
<%
int num= Integer.parseInt(request.getParameter("num").trim());
double strike= Double.parseDouble(request.getParameter("strike").trim());
double rate= Double.parseDouble(request.getParameter("rate").trim());
double period= Double.parseDouble(request.getParameter("period").trim());
double M[][]=new double[num][num];
double L[][]=new double[num][num];
double F[][]=new double[num][num];
double A[]=new double[num];
double C[]=new double[num];
double D[]=new double[num];
double E[]=new double[num];
double B[][] =new double[num][num];
double normal[] =new double[num];
String a="",b="",c="";
int i=0,j=0,k=0;
double m=0,n=0,future=0,estimate=0;
int repeat = 500000;
String rv="";
for(i=1;i<=num;i++)
{
a= "a" + i;
A[i-1] = Double.parseDouble(request.getParameter(a).trim());
c= "c" + i;
C[i-1] = Double.parseDouble(request.getParameter(c).trim());
}
for(i=1;i<=num;i++)
{
for(j=i;j<=num;j++)
{
if (i!=j)
{
b = "b" + i + j;
B[i-1][j-1] = Double.parseDouble(request.getParameter(b).trim());
}
else B[i-1][j-1]=1;
}
for(j=num;j>i;j--) if (i!=j) B[j-1][i-1] = B[i-1][j-1];
}
for(i=1;i<=num;i++)
{
for(j=1;j<=num;j++)
{
M[i-1][j-1] = C[i-1]*C[j-1]*B[i-1][j-1];
out.write("<br>M("+i+","+j+")="+M[i-1][j-1]);
}
}
i=0;
while(i<num)
{
m=M[i][i];
n=0;
out.write("<br>M1="+m);
for(j=0;j<i;j++) n = n + Math.pow(L[i][j],2);
out.write("<br>N1="+n);
m = m - n;
L[i][i] = Math.sqrt(m);
for(j=0;j<num;j++)
{
m = 0;
if (j != i)
{
for(k=0;k<i;k++) m = m + L[i][k] * L[j][k];
L[j][i]= (M[j][i]-m)/L[i][i];
}
}
++i;
}
for(i=1;i<=num;i++) for(j=1;j<=num;j++) out.write("<br>L("+i+","+j+")="+L[i-1][j-1]);
for(i=0;i<num;i++)
{
for(j=0;j<num;j++)
{
if (i != j)
F[i][j]=L[j][i];
else
F[i][j]=L[i][j];
}
}
for(k=0;k<repeat;k++)
{
for(j=0;j<num;j++) normal[j] = Math.sqrt(-2*Math.log(Math.random()))*Math.cos(2*Math.PI*Math.random());
for(j=0;j<num;j++)
{
m=0;
for(i=0;i<num;i++) m = m + normal[i] * F[i][j];
E[j]=m;
D[j]= A[j] * Math.exp((rate-Math.pow(C[j],2)/2)*period+Math.sqrt(period)*E[j]);
}
future = bubble(D,num);
estimate = estimate + Math.max(future-strike,0);
}
rv = "<br>Rainbow Call選擇權的價值為: " + (estimate/repeat*Math.exp(-1*rate*period));
%>
--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.4.241
推 ZyMe:藍波選擇權 怎麼在峰哥手中一下子就寫出來了>_< 210.58.175.17 04/28
→ ZyMe:太猛了 股掌叫好 甘溫多謝 210.58.175.17 04/28
推 AboveTheRim:不知道的人還以為峰哥po亂碼文 囧rz 219.84.87.24 04/28
推 BODOQOQO:哈哈老實說~~我實在不瞭解JAVA啊 218.166.27.27 04/28