Cześć tam =) I przepraszam za mój angielski, z góry Mam zadanie obliczyć hurst wykładnik metodą regresji liniowej. I mam tekstowy opis rozwiązania. Wygląda to bardzo łatwo, ale zawsze otrzymuję wartości, które wychodzą z zakresu 0..1. Zwykle wartość wynosi 1,9 lub podobnie. Czasami otrzymuje wartość ujemną zbliżoną do zera. Przejrzałem kod o tysiąc razy, ale nie widziałem błędu.Obliczanie Hursta Exponent
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;
Dzięki wszystkim =)
PS:
for tau:=nach to l do
Istnieje L, a nie 1. A L to długość tablicy X. I L> nach zawsze oprócz ostatniego kroku, kiedy l = nach.
P.P.S. To działa, chłopaki. Ale wartości nie są właściwe. I wychodzą z zasięgu. Być może jest błąd w algorytmie. A może pominął jakiś krok.
Ostatnia aktualizacja
To mistyczny, ale jedynie zmieniono sposób obliczania macierzy Z i zaczął poprawnie działa .... Dzięki wszystkim =)
Nie wiem, jak obliczyć "wykładnik hurst metodą regresji liniowej" lub co to jest. Co proponuję ci zrobić, jeśli powiesz, że kod działa bez problemów, ale wyniki są błędne to: idź, wypij kawę/wodę/itp 10 minut (zrób sobie przerwę), a następnie weź papier i ołówek, wykonaj kilka studiów przypadku dotyczących algorytmu (wejścia i wyjścia), ustaw punkty przerwania w kodzie i uruchom je krok po kroku. To właśnie robię, gdy mam złożony kod, który nie działa. – RBA
Dzięki za sugestię, RBA. Ale próbuję tej metody przez 3 dni ... I nie widzę błędu .. Zaraz zwariuję ..) – Letoile
Mówisz, że "L> nach oprócz ostatniego kroku, kiedy L = nach". Ale nie widzę żadnego kodu zmieniającego L lub nach!?! Są to stałe. Gdzie inicjujesz L? – Andreas