Pracujem s MF-DFA metóda v Matlabu, ale potrebujem, aby ho v Julia. Cieľom je tho získať Hurst exponent S&P 500. Na matlabu kód je nasledovný:
sp500 = readtable('sp500_Nasdaq.csv','PreserveVariableNames', true) ;
spClose = table2array(sp500(:,2)) ;
SP1=cumsum(spClose - mean(spClose)) ;
SP1_ordinary=sqrt(mean(SP1.^2));
X=cumsum(spClose-mean(spClose));
X=transpose(X);
scale=[16,32,64,128,256,512,1024];
q=[-5,-3,-1,0,1,3,5];
m=1;
for ns=1:length(scale),
segments(ns)=floor(length(X)/scale(ns));
for v=1:segments(ns)
Index=( ( ( (v-1)*scale(ns) )+1):(v*scale(ns)));
C = polyfit(Index,X(Index),m) ;
fit=polyval(C,Index);
RMS{ns}(v)=sqrt(mean((X(Index)-fit).^2));
end
for nq=1:length(q),
qRMS{nq,ns}=RMS{ns}.^q(nq);
Fq(nq,ns)=mean(qRMS{nq,ns}).^(1/q(nq));
end
Fq(q==0,ns)=exp(0.5*mean(log(RMS{ns}.^2)));
end
V Julia kód vyzerá takto:
using DelimitedFiles, TimeSeries, Plots, DelimitedFiles, Plots, StatsBase
using Polynomials, LinearAlgebra, CSV, DataFrames
sp500 = CSV.read("sp500_Nasdaq.csv", DataFrame)
sp500_V = values(sp500[:,2])
SP1 = cumsum(sp500_V .- mean(sp500_V) ) ;
SP1_Ord = sqrt(mean(SP1.^2)) ;
X = SP1 ;
X = X';
function polyfit(xVals,yVals)
n = length(xVals)
xBar, yBar = @fastmath mean(xVals), mean(yVals)
sXX, sXY = @fastmath ones(n)'*(xVals.-xBar).^2 , dot(xVals.-xBar,yVals.-yBar)
b1A = @fastmath sXY/sXX
b0A = @fastmath yBar - b1A*xBar
return b0A, b1A
end
scales = [16,32,64,128,256,512,1024];
q = [-5,-3,-1,0,1,3,5] ;
segments = zeros(Int64, (1,length(scales)))
global qRMS = zeros( length(q) ,length(scales) ) ;
global Fq = zeros( length(q) , length(scales) ) ;
@inbounds for ns = 1:length(scales)
global segments[ns] = Int(floor( length(X)/scales[ns] ) ) ;
global Index = Array{UnitRange{Int128}}(undef, (segments[ns], length(scales)) ) ;
global ft = zeros(Float64, (segments[ns], length(scales) ) ) ;
global RMS = zeros(Float64, (length(scales) ,segments[ns] ) ) ;
@inbounds for v=1:segments[ns]
global RMSk = Array{Float64}[] ;
Index = ( ( (v-1)*scales[ns] ) + 1 ):( v*scales[ns] ) ;
global C = polyfit( Index, X[Index]) ;
global p = Polynomial(C)
ft =p.(Index);
RMS[ns,v] = sqrt(mean((X[Index] .- ft).^2));
push!(RMSk,RMS )
end
@inbounds for nq = 1:length(q)
qRMS[nq,ns] = RMS[ns].^q[nq];
Fq[nq,ns] = mean( qRMS[nq,ns] ).^(1/q[nq] );
end
Fq[findall(x->x==0, q)[1], ns] = exp( 0.5*mean(log.(RMS[ns].^2) ) ) ;
end
Vec je, že pole RMS v Matlabu je kód je pole polí, ako je tento:
RMS =
1×7 bunky pole
{1×159 double} {1×79 double} {1×39 double} {1×19 double} {1×9 double} {1×4 double} {1×2 double}
Ale Julia vráti len posledné pole
RMS
7×2 Matrix{Float64}:
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
62178.0 18238.2
Ako môžem získať rovnaký výstup ako v Matlabu? Ako môžete ukladať polia do polí v Julia?
Array{Float64}[]
. Pravdepodobne budete chcieť,Vector{Float64}[]
aleboMatrix{Float64}[]
.