Chapter 1. Financial Markets, Prices and Risk (in MATLAB/Julia)


Copyright 2011 - 2020 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: https://www.gnu.org/licenses/.


Listing 1.1/1.2: Download S&P 500 data in MATLAB
Last updated July 2020

price = csvread('index.csv', 1, 0);
y=diff(log(price)); % calculate returns
plot(y)    % plot returns
title("S&P500 returns")
		
Listing 1.1/1.2: Download S&P 500 data in Julia
Last updated July 2020

using CSV;
price = CSV.read("index.csv")
y = diff(log.(price[:,1]))
using Plots;
plot(y, title = "S&P500 returns", legend = false)
		

Listing 1.3/1.4: Sample statistics in MATLAB
Last updated July 2020

mean(y)
std(y)
min(y)
max(y)
skewness(y)
kurtosis(y)
[h,pValue,stat]=jbtest(y);
%% NOTE: in MATLAB some functions require name-value pairs
%% e.g. [h,pValue,stat]=jbtest(y);
		
Listing 1.3/1.4: Sample statistics in Julia
Last updated July 2020

using Statistics, StatsBase;
println("Standard deviation: ", std(y), "\n")
println("Minimum value: ", minimum(y), "\n")
println("Maximum value: ", maximum(y), "\n")
println("Skewness: ", skewness(y), "\n")
println("Kurtosis: ", kurtosis(y), "\n")
println("Autocorrelation of returns:", "\n", autocor(y, 1:20), "\n")
println("Autocorrelation of returns squared:", "\n", autocor(y.^2, 1:20), "\n")
using HypothesisTests;
println(JarqueBeraTest(y))
println(LjungBoxTest(y,20))
println(LjungBoxTest(y.^2, 20))
		

Listing 1.5/1.6: ACF plots and the Ljung-Box test in MATLAB
Last updated July 2020

%% subplots here are just for ease of visualization
subplot(1,2,1)
autocorr(y, 20)
subplot(1,2,2)
autocorr(y.^2, 20)
[h,pValue,stat]=lbqtest(y,'lags',20);
[h,pValue,stat]=lbqtest(y.^2,'lags',20);
		
Listing 1.5/1.6: ACF plots and the Ljung-Box test in Julia
Last updated July 2020

q1 = autocor(y, 1:20)
q2 = autocor(y.^2, 1:20)
plot(bar(q1, title = "ACF of returns"),
    bar(q2, title = "ACF of returns squared"), legend = false)
		

Listing 1.7/1.8: QQ plots in MATLAB
Last updated 2011

%% subplots here are just for ease of visualization
subplot(1,2,1)
qqplot(y)
subplot(1,2,2)
qqplot(y, fitdist(y,'tLocationScale'))
		
Listing 1.7/1.8: QQ plots in Julia
Last updated July 2020

using StatsPlots, Distributions;
plot(qqplot(Normal,float(y),qqline=:quantile, title = "QQPlot vs Normal"),
    qqplot(TDist(5),float(y),qqline=:quantile, title = "QQPlot vs Student-t(5)"),
    qqplot(TDist(4),float(y),qqline=:quantile, title = "QQPlot vs Student-t(4)"),
    qqplot(TDist(3),float(y),qqline=:quantile, title = "QQPlot vs Student-t(3)"))
		

Listing 1.9/1.10: Download stock prices in MATLAB
Last updated 2011

price = csvread('stocks.csv', 1, 0);
y=diff(log(price));
corr(y) % correlation matrix
?tarch
		
Listing 1.9/1.10: Download stock prices in Julia
Last updated July 2020

price = CSV.read("stocks.csv")
y1 = diff(log.(price[:,1]))
y2 = diff(log.(price[:,2]))
y3 = diff(log.(price[:,3]))
y = hcat(y1,y2,y3)
println(cor(y)) # correlation matrix