Avatar billede tokeras Nybegynder
14. oktober 2007 - 16:57 Der er 4 kommentarer

Optimering af kode.

Hej alle
Jeg har lavet dette lille program der beregner en options pris via et binomial træ. Som det kan ses bruges der arrays og løkker til at nå frem til prisen. Ved at øge antallet af steps i træet får man et mere præcis resultat. Problemet er at jeg kun kan udregne prisen på optionen ved 13.000 steps ved at bruge følgende komando. ”java –Xmx1526m -jar LimToSchoels.jar”.  Jeg skulle gerne kunne udregne prisen på så mange steps som muligt.
Mit spørgsmål er derfor om der er en der kan optimere koden så jeg kan få optionsprisen på mange flere steps?
min kode ser ud som følger:

package limtoschoels;
import java.util.Scanner;

public class Main
{
    public static void main(String[] args)
    {
        // TODO code application logic here
        int N;
        Scanner scan = new Scanner(System.in);
        System.out.println("How many steps do you want the tree to calculate?");
        N = scan.nextInt();
        double K = 100;
        double S0 = 100;
       
        //constant so T-t=8/12
        double months = 12;
        double TimeToExercise = 8/months;
        double Delta_T = TimeToExercise/N;
        System.out.println("Delta_T = " + Delta_T);
        double var = 0.30;
        double r = 0.06;
        double e = Math.E;
        double[] S_t = new double[N+1];
        double[][] f_t = new double[N+1][N+1];
       
        //Calculates up and downs
        double u = Math.pow(e, var*Math.sqrt(Delta_T));
        double d = Math.pow(e, -var*Math.sqrt(Delta_T));
        double a = Math.pow(e, r*Delta_T);
        double p = (a-d)/(u-d);
       
        System.out.println("u = " + u);
        System.out.println("d = " + d);
        System.out.println("a = " + a);
        System.out.println("p = " + p);
        System.out.println("------------------------");
       
        //Calculates the stock price at the final note
        int i = N;
        while(i>=0)
        {
            S_t[i] = S0*Math.pow(u, i)*Math.pow(d, N-i);
            f_t[i][N] = Math.max(S_t[i]-K, 0);
            //System.out.println("f_t[" + i + "][" + N + "] = " + f_t[i][N]);               
            i--;
        }
        System.out.println("-----------------------");
       
        i = N;
        int t = 1;
        int v = N-1;
        while(v>=0)
        {
            while(i>=t)
            {
                f_t[i][v] = Math.exp(-r*Delta_T)*(p*f_t[i][v+1]+(1-p)*f_t[i-1][v+1]);
                //System.out.println("f_t[" + i + "][" + v + "] = " + f_t[i][v]);
                i--;
            }
            //System.out.println("------------------------------------------");
        t++;
        v--;
        i = N;
        }
        System.out.println("f_0 = " + f_t[N][0]);
    }
   
}
Avatar billede erikjacobsen Ekspert
14. oktober 2007 - 17:24 #1
Din variabel f_t bliver ret stor. Med N=13000 omkring 1,3 GB. Og gør du N lidt større bliver pladsforbruget meget større.
Avatar billede tokeras Nybegynder
14. oktober 2007 - 18:11 #2
ja hold da op det er meget. Men ved du hvordan man kan optimere koden så jeg kan køre for N=meget stor?
Avatar billede erikjacobsen Ekspert
14. oktober 2007 - 18:18 #3
Nej - jeg kan ikke gennemskue matematikken bag ved. Tror du virkelig det gør en forskel?
Avatar billede jakoba Nybegynder
14. oktober 2007 - 23:27 #4
Prøve at tænke 'normal-fordeling' istedet for 'binominal træ'. Og brug så formelen, istedet for at iterere.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester