2011-05-25 102 views
6

你好=)對不起,我的英語,提前 我有一個任務,通過線性迴歸的方法計算hurst指數。我有解決方案的文字說明。它看起來很容易,但總是我得到值,從範圍0..1出去。通常,值是1.9或類似的東西。有時它會得到接近於零的負值。 我已經查看了大約一千次的代碼,但看不到一個錯誤。計算赫斯特指數

var 
max_z,min_z,x_m:real; //max and min of cumulative sum and mean value of X for every Tau 
st,ss,sst,st2 :real; 
Al, Herst: real; 
x_vr:array of double; //a piece of array with length=tau 
i, j, nach: integer; 
begin 
    //file opening and getting values of X array are in another function 
    nach:=3; //initial value of tau 
    Setlength(ln_rs,l-nach); //length of ln(R/S) array 
    Setlength(ln_t,l-nach); //length of ln(tau) array 
    Setlength(r,l-nach); //length of R array 
    Setlength(s,l-nach); //length of S array 


     //Let's start 
    for tau:=nach to l do //we will change tau 
    begin 
     Setlength(x_vr,tau+1); //set new local array (length=tau) 
     for i:=0 to length(x_vr)-1 do 
      x_vr[i]:=x[i]; 

     x_m:=Mean(x_vr); //mean value 
     Setlength(y,tau+1); //length of array of difference from mean value 
     Setlength(z,tau+1); //length of array of cumulative sum 

     for i:=0 to tau do 
      y[i]:=x_vr[i]-x_m;  //difference from mean value 

     z[0]:=y[0]; 
     for i:=1 to tau do  //cumulative sum 
      for j :=i downto 0 do 
       z[i]:=z[i]+y[j]; 

     max_z:=z[0]; 
     for i:=1 to tau do  //max of cumulative sum 
      max_z:=max(max_z,z[i]); 

     min_z:=z[0]; 
     for i:=1 to tau do  //min of cumulative sum 
      min_z:=min(min_z,z[i]); 

     r[tau-nach]:=max_z-min_z; //R value 
     s[tau-nach]:=0; 
     for i:=0 to tau do 
      s[tau-nach]:=power(y[i],2)+s[tau-nach];   //S value 

     s[tau-nach]:=sqrt(s[tau-nach]/(tau+1)); 

     //new array values 
     ln_rs[tau-nach]:=Ln(R[tau-nach]/S[tau-nach]); // ln(R/S) 
     ln_t[tau-nach]:=ln(tau);      // ln (tau) 

    end; //End of calculating 

    //Method of Least squares 
    for i:=0 to length(ln_rs)-1 do 
     st:=st+ln_t[i]; 

    st:=(1/length(ln_rs))*st; 

    for i:=0 to length(ln_rs)-1 do 
     ss:=ss+ln_rs[i]; 

    ss:=(1/length(ln_rs))*ss; 

    for i:=0 to length(ln_rs)-1 do 
     sst:=sst+ln_t[i]*ln_rs[i]; 

    sst:=(1/length(ln_rs))*sst; 

    for i:=0 to length(ln_rs)-1 do 
     st2:=st2+ln_t[i]*ln_t[i]; 

    st2:=(1/length(ln_rs))*st2; 


    Herst:=(sst-st*ss)/(st2-st*st);  //coefficient of approximal function 
    al:=ss-st*Herst; 

謝謝大家=)

P.S.

for tau:=nach to l do 

有L,而不是1,而L是X數組的長度。而L> nach總是除了最後一步之外,當l = nach時。

P.P.S. 它的工作,夥計們。但是價值觀不對。他們從範圍外出發。也許,算法中存在錯誤。或者,也許我滑了一步。

最後更新

它的神祕,但我計算陣Z的只有改變方法,它正確地開始工程.... 感謝所有=)

+4

我不知道如何計算「通過線性迴歸方法的hurst指數」或它是什麼。我建議你做的,如果你說代碼運行沒有問題,但結果是錯誤的是:去喝咖啡/水/等10分鐘(休息一下),然後拿紙和鉛筆,對算法(輸入和輸出)進行幾個案例研究,在代碼中設置斷點並逐步運行。當我有一個複雜的代碼不起作用時,就是這樣做的。 – RBA 2011-05-25 08:21:38

+0

感謝您的建議,澳大利亞央行。但我嘗試這種方法3天...而看不到一個錯誤..我會去瘋了..) – Letoile 2011-05-25 08:40:55

+0

你說,除了最後一步,當L = nach「時,每一步都有。但是我看不到任何改變L或nach的代碼!?!他們是常數。你在哪裏初始化L? – Andreas 2011-05-25 09:43:44

回答

1

第一件事,我看到:

nach := 3;  
for tau := nach to l do //w 

這會增加。而且因爲nach> 1,這個循環的主體將不會被執行。

如果您希望倒數。使用downto變體。倒計時:

for tau := nach downto l do //w 
+0

嗯..這不是1,它是L ... L> nach總是O_o只在最後一步l = nach 噢..這是我的錯誤。我沒有說L.L是X數組的長度 – Letoile 2011-05-25 07:56:29

+1

好吧,只是另一個不使用單個字符變量的原因。我看起來像1. – 2011-05-25 07:58:16

+0

是的..對不起 – Letoile 2011-05-25 08:00:23

0

鑑於主循環(for tau)迭代從nachl,前四個SetLength調用應設置l - nach + 1,而不是l - nach長度。

+0

我試過它的第一..但它沒有幫助.. 謝謝,我會編輯這個 – Letoile 2011-05-25 09:56:12

0

應行

z[i]:=z[i]+y[j]; 

z[i]:=z[i - 1]+y[j];