Matlab and Julia Appendix - Introduction

# Appendix - Introduction

### Matlab and Julia

Copyright 2011 - 2023 Jon Danielsson. This code is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. The GNU General Public License is available at: www.gnu.org/licenses.

##### % Entering and Printing Data
x = 10;             % assign x the value 10, silencing output print with ;
disp(x)             % display x

##### Entering and Printing Data in Julia
x = 10             # assign x the value 10
println(x)         # print x


##### % Vectors, Matrices and Sequences
y = [1,3,5,7,9]            % lists are denoted by square brackets
y(3)                       % calling 3rd element (MATLAB indices start at 1)
size(y)                    % shows that y is 1 x 5 (a row vector, by default)
length(y)                  % as expected, y has length 5
v = nan(2,3)               % fill a 2 x 3 matrix with NaN values
size(v)                    % as expected, v is size (2,3)
w = repmat([1,2,3]', 2, 3) % repeats matrix twice by rows, thrice by columns
s = 1:10                   % s is a list of integers from 1 to 10 inclusive

##### Vectors, Matrices and Sequences in Julia
y = [1,3,5,7,9]     # lists in square brackets are stored as arrays
println(y)
println(y)       # calling 3rd element (Julia indices start at 1)
println(size(y))    # size of y
println(length(y))  # as expected, y has length 5
v = fill!(Matrix{Float64}(undef, 2,3),NaN) # 2x3 Float64 matrix of NaNs - computationally better
v = fill(NaN, (2,3))                       # 2x3 Float64 matrix of NaNs - direct
println(v)          # Julia prints matrices in a single line
println(size(v))    # as expected, v is size (2,3)
w = repeat([1,2,3]', outer = [3,2]) # repeats matrix thrice by rows, twice by columns
println(w)
s = 1:10            # s is an sequence which one can loop across
println(collect(s)) # return sequence elements as an array


##### % Basic Summary Statistics
y = [3.14; 15; 9.26; 5];    % List with semicolons is a column vector
sum(y)         % sum of all elements of y
prod(y)        % product of all elements of y
max(y)         % maximum value of y
min(y)         % minimum value of y
range(y)       % difference between max and min value of y
mean(y)        % arithmetic mean
median(y)      % median
var(y)         % variance
cov(y)         % covar matrix = variance for single vector
corrcoef(y)    % corr matrix =  for single vector
sort(y)        % sorting in ascending order
log(y)         % natural log

##### Basic Summary Statistics in Julia
y = [3.14,15,9.26,5]
using Statistics;                # load package needed
println("sum: ", sum(y))         # return sum of all elements of y
println("product: ", prod(y))    # return product of all elements of y
println("max: ", maximum(y))     # return maximum value of y
println("min: ", minimum(y))     # return minimum value of y
println("mean: ", mean(y))       # arithmetic mean
println("median: ", median(y))   # median
println("variance: ", var(y))    # variance
println("cov_matrix: ", cov(y))  # covar matrix = variance for single vector
println("cor_matrix: ", cor(y))  # corr matrix =  for single vector
println(sort(y))                 # sorts y in ascending order
println(log.(y))                 # natural log, note . denotes elementwise operation


##### % Calculating Moments
mean(y)      % mean
var(y)       % variance
std(y)       % unbiased standard deviation, by default
skewness(y)  % skewness
kurtosis(y)  % kurtosis

##### Calculating Moments in Julia
using StatsBase;
println("mean: ", mean(y))          # mean
println("variance: ", var(y))       # variance
println("std dev: ", std(y))        # unbiased standard deviation
println("skewness: ", skewness(y))  # skewness
println("kurtosis: ", kurtosis(y))  # EXCESS kurtosis (note the different default)


##### % Basic Matrix Operations
z = [1, 2; 3, 4]  % z is a 2 x 2 matrix (Note the use of ; as row separator)
x = [1, 2]        % x is a 1 x 2 matrix
z * x'            % this evaluates to a 2 x 1 matrix
vertcat(z,x)      % "stacking" z and x vertically
horzcat(z,x')     % "stacking z and x' horizontally

##### Basic Matrix Operations in Julia
z = Matrix([[1 2];[3 4]])   # z is a 2 x 2 matrix
x = Matrix([1 2])           # x is a 1 x 2 matrix
println(z * x')             # this evaluates to a 2 x 1 matrix
b = vcat(z,x)               # "stacking" z and x vertically
c = hcat(z,x')              # "stacking" z and x' horizontally


##### % Statistical Distributions
q = -3:1:3                       % specify a set of values
p = 0.1:0.1:0.9                  % specify a set of probabilities
norminv(p, 0, 1)                 % element-wise inverse Normal quantile
tcdf(q, 4)                       % element-wise cdf under Student-t(4)
chi2pdf(q, 2)                    % element-wise pdf under Chisq(2)
x = trnd(5, 100, 1);             % Sampling 100 times from t dist with 5 df
y = normrnd(0, 1, 100, 1);       % Sampling 50 times from a standard normal
res = fitdist(x, "Normal")       % Fitting x to normal dist

##### Statistical Distributions in Julia
using Distributions;
q = collect((-3:1:3))              # specify a set of values
p = collect((0.1:0.1:0.9))         # specify a set of probabilities
println(quantile.(Normal(0,1),p))  # element-wise inverse Normal quantile
println(cdf.(TDist(4), q))         # element-wise cdf calculation under Student-t(4)
println(pdf.(Chisq(2), q))         # element-wise pdf calculation under Chisq(2)
x = rand(TDist(5), 100)            # Sampling 100 times from TDist with 5 df
y = rand(Normal(0,1), 50)          # Sampling 50 times from a standard normal
fit_mle(Normal, x)                 # Fitting x to normal dist


##### % Statistical Tests
x = trnd(5, 500, 1);                    % Create hypothetical dataset x
[h1, p1, jbstat] = jbtest(x)            % Jarque-Bera test for normality
[h2, p2, lbstat] = lbqtest(x,'lags',20) % Ljung-Box test for serial correlation - Needs Econometrics Toolbox

##### Statistical Tests in Julia
using Random, HypothesisTests; # loading required packages
Random.seed!(100)                # set random seed
x = rand(TDist(5), 500)          # create hypothetical dataset x
println(JarqueBeraTest(x))       # Jarque-Bera test for normality
println(LjungBoxTest(x,20))      # Ljung-Box test for serial correlation


##### % Time Series
x = trnd(5, 60, 1); % Create hypothetical dataset x
subplot(1,2,1)
autocorr(x, 20)     % autocorrelation for lags 1:20
subplot(1,2,2)
parcorr(x,20)       % partial autocorrelation for lags 1:20

##### Time Series in Julia
using Plots;
Random.seed!(100)
x = rand(TDist(5), 60)           # Create hypothetical dataset x
acf = autocor(x, 1:20)           # autocorrelation for lags 1:20
pacf = autocor(x, 1:20)          # partial autocorrelation for lags 1:20
plot(bar(acf, title = "Autocorrelation", legend = false))
plot(bar(pacf, title = "Partial autocorrelation", legend = false))


##### % Loops and Functions
for i = 3:7        % iterates through [3,4,5,6,7]
i^2
end
X = 10;
if (rem(X,3) == 0)
disp("X is a multiple of 3")
else
disp("X is not a multiple of 3")
end

##### Loops and Functions in Julia
for i in range(3,length = 5)        # using range with the "length" option
println(i^2)                    # where n = number of terms
end                             # this iterates over [3,4,5,6,7]
X = 10
if X % 3 == 0
println("X is a multiple of 3")
else
println("X is not a multiple of 3")
end
using Statistics;
function excess_kurtosis(x, excess = 3)::Float64      # excess optional, default = 3
m4 = mean((x .- mean(x)).^4)                      # element-wise exponentiation .^
excess_kurt = m4/(std(x)^4) - excess
return excess_kurt
end
using Random, Distributions;
Random.seed!(100)
x = rand(TDist(5), 60)           # Create hypothetical dataset x
excess_kurtosis(x)


##### % Basic Graphs
y = normrnd(0, 1, 50, 1);
z = trnd(4, 50, 1);
subplot(2,2,1)
bar(y)            % bar plot
title("Bar plot")
subplot(2,2,2)
plot(y)           % line plot
title("Line plot")
subplot(2,2,3)
histogram(y)      % histogram
title("Histogram")
subplot(2,2,4)
scatter(y,z)      % scatter plot
title("Scatter plot")

##### Basic Graphs in Julia
y = rand(Normal(0,1), 50)
return plot(bar(y, title = "Bar plot"), plot(y, title = "Line plot"),
histogram(y, title = "Histogram"), scatter(y, title = "Scatter plot"), legend = false)


##### % Miscellaneous Useful Functions
x = 8.0;
isfloat(x)
x = int8(x);
isinteger(x)

##### Miscellaneous Useful Functions in Julia
x = 8.0
println(typeof(x))
x = convert(Int, 8.0)
println(typeof(x))
y = rand(Normal(0,1), 100)
res = fit_mle(Normal, y)
println("Fitted mean: ", res.μ)
println("Fitted sd: ", res.σ)


##### Financial Risk Forecasting
Market risk forecasting with R, Julia, Python and Matlab. Code, lecture slides, implementation notes, seminar assignments and questions.