Copyright 2011 - 2019 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/.

Last updated June 2018

```
x = 10 # assign x the value 10
print(x) # print the value of x
```

Last updated June 2018

```
x = 10 # assign x the value 10
println(x) # print x
## println() puts next output on new line, while print() doesn't
```

Last updated June 2018

```
y = [1,3,5,7,9] # lists in square brackets are stored as arrays
print(y)
print(y[2]) # 3rd element (Python indices start at 0)
print(len(y)) # as expected, y has length 5
import numpy as np
v = np.full([2,3], np.nan) # create a 2x3 matrix with NaN values
print(v)
print(v.shape) # as expected, v is size (2,3)
w=np.tile(np.transpose([1,2,3]),(3,2)) # repeats twice by rows, thrice by columns
print(w)
s = range(10) # an iterator from 0 to 9
print([x for x in s]) # return elements using list comprehension
```

Last updated June 2018

```
y = [1,3,5,7,9] # lists in square brackets are stored as arrays
println(y)
println(y[3]) # 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!(Array{Float64}(2,3),NaN) # 2x3 Float64 matrix of NaNs
println(v) # Julia prints matrices in a single line
println(size(v)) # as expected, v is size (2,3)
w = repmat([1,2,3], 2, 3) # repeats matrix twice by rows, thrice 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
```

Last updated June 2018

```
## There are many data sources for financial data, for instance
## Yahoo Finance, AlphaVantage and Quandl. However, some of the
## free data sources have numerous issues with accuracy and
## handling of missing data, so only CSV importing is shown here.
##
## For csv data, one can use numpy.loadtxt() to read it
##
## Example:
## using numpy as np
## data = np.loadtxt('data.csv', delimiter = ',', skiprows = 1)
## skiprows=1 ensures that the header row is skipped
```

Last updated June 2018

```
## There are many data sources for financial data, for instance
## Yahoo Finance, AlphaVantage and Quandl. However, some of the
## free data sources have numerous issues with accuracy and
## handling of missing data, so only CSV importing is shown here.
##
## For csv data, one can use the package CSV to read it
##
## Example:
## using CSV;
## data = CSV.read("data.csv", nullable = false)
## nullable = false avoids type problems involving NullableArray types
```

Last updated June 2018

```
import numpy as np
y = [3.14,15,9.26,5]
print(sum(y)) # sum of all elements of y
print(max(y)) # maximum value of y
print(min(y)) # minimum value of y
print(np.mean(y)) # arithmetic mean
print(np.median(y)) # median
print(np.var(y)) # variance
print(np.cov(y)) # covar matrix = variance for single vector
print(np.corrcoef(y)) # corr matrix = [1] for single vector
print(np.sort(y)) # sort in ascending order
print(np.log(y)) # natural log
```

Last updated June 2018

```
y = [3.14,15,9.26,5]
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 = [1] for single vector
println(sort(y)) # sorts y in ascending order
println(log.(y)) # natural log, note . denotes elementwise operation
```

Last updated June 2018

```
import numpy as np
from scipy import stats
print(np.mean(y)) # mean
print(np.var(y)) # variance
print(np.std(y, ddof = 1)) # ddof = 1 for unbiased standard deviation
print(stats.skew(y)) # skewness
print(stats.kurtosis(y, fisher = False)) # fisher = False gives Pearson definition
```

Last updated June 2018

```
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)
```

Last updated June 2018

```
import numpy as np
z = np.matrix([[1, 2], [3, 4]]) # z is a 2 x 2 matrix
x = np.matrix([1, 2]) # x is a 1 x 2 matrix
## Note: z * x is undefined since the two matrices are not conformable
print(z * np.transpose(x)) # this evaluates to a 2 x 1 matrix
b = np.concatenate((z,x), axis = 0) # "stacking" z and x vertically
print(b)
c = np.concatenate((z,np.transpose(x)), axis = 1) # "stacking" z and x horizontally
print(c)
## note: dimensions must match along the combining axis
```

Last updated June 2018

```
z = Matrix([[1 2];[3 4]]) # z is a 2 x 2 matrix
x = Matrix([1 2]) # x is a 1 x 2 matrix
## Note: z * x is undefined since the two matrices are not conformable
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
## Note: dimensions must match along the combining axis
```

Last updated June 2018

```
import numpy as np
from scipy import stats
q = np.arange(-3,4,1) # specify a set of values
p = np.arange(0.1,1.0,0.1) # specify a set of probabilities
print(stats.norm.ppf(p)) # element-wise inverse Normal quantile
print(stats.t.cdf(q,4)) # element-wise cdf under Student-t(4)
print(stats.chi2.pdf(q,2)) # element-wise pdf under Chisq(2)
## One can also obtain pseudorandom samples from distributions using numpy.random
x = np.random.standard_t(df=5, size=100) # Sampling 100 times from TDist with 5 df
y = np.random.normal(size=50) # Sampling 50 times from a standard normal
## Given data, we obtain MLE estimates of parameters with stats:
res = stats.norm.fit(x) # Fitting x to normal dist
print(res)
```

Last updated June 2018

```
## Julia has a wide range of functions contained in the package Distributions.jl
## Vectorized versions of the functions are used here as they are relevant for FRF
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)
## Similar syntax for other dists, e.g. Bernoulli(p), Binomial(n,p), Poisson(λ)
## For full list of supported distributions, see Distributions.jl documentation
## One can also obtain pseudorandom samples from distributions using rand()
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
## Given data, we obtain MLE estimates of parameters with fit_mle():
fit_mle(Normal, x) # Fitting x to normal dist
## Some distributions like the Student-t cannot be fitted yet (as of June 2018)
## Supported dists: https://juliastats.github.io/Distributions.jl/latest/fit.html#Applicable-distributions-1
```

Last updated June 2018

```
from scipy import stats
from statsmodels.stats.diagnostic import acorr_ljungbox
x = np.random.standard_t(df=5, size=500) # Create dataset x
print(stats.jarque_bera(x)) # Jarque-Bera test
print(acorr_ljungbox(x, lags=20)) # Ljung-Box test
```

Last updated June 2018

```
srand(100)
x = rand(TDist(5), 500) # Create hypothetical dataset x
## We use the package HypothesisTests
using HypothesisTests;
println(JarqueBeraTest(x)) # Jarque-Bera test for normality
println(LjungBoxTest(x,20)) # Ljung-Box test for serial correlation
```

Last updated June 2018

```
import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt
y = np.random.standard_t(df = 5, size = 60) # Create hypothetical dataset y
q1 = sm.tsa.stattools.acf(y, nlags=20) # autocorrelation for lags 1:20
plt.bar(x = np.arange(1,len(q1)), height = q1[1:])
plt.show()
plt.close()
q2 = sm.tsa.stattools.pacf(y, nlags=20) # partial autocorr for lags 1:20
plt.bar(x = np.arange(1,len(q2)), height = q2[1:])
plt.show()
plt.close()
```

Last updated June 2018

```
srand(100)
x = rand(TDist(5), 60) # Create hypothetical dataset x
using Plots, StatsBase; # refer to Listing 0.11 for Plots.jl
acf = autocor(x, 1:20) # autocorrelation for lags 1:20
pacf = autocor(x, 1:20) # partial autocorrelation for lags 1:20
plot(bar(acf), bar(pacf)) # plotting the ACF/PACF using Plots.jl
```

Last updated June 2018

```
import numpy as np
## For loops
for i in range(3,8): # NOTE: range(start, end), end excluded
print(i**2) # range(3,8) iterates through [3,4,5,6,7)
## If-else loops
X = 10
if X % 3 == 0:
print("X is a multiple of 3")
else:
print("X is not a multiple of 3")
## Functions (example: a simple excess kurtosis function)
def excess_kurtosis(x, excess = 3): # note: excess optional, default = 3
m4=np.mean((x-np.mean(x))**4) # note: exponentiation in Python uses **
excess_kurt=m4/(np.std(x)**4)-excess
return excess_kurt
x = np.random.standard_t(df=5,size=60) # Create hypothetical dataset x
print(excess_kurtosis(x))
```

Last updated June 2018

```
## We demonstrate how loops and functions work in Julia with some examples
## Main differences from Python
## 1) No semicolons on the first line of loops/functions
## 2) insert "end" after the last line of loops/functions
## 3) Note: difference in range(.) function between Python and Julia (see below)
## For loops
for i in range(3,5) # NOTE: range(start,n) unusual!
println(i^2) # where n = number of terms
end # this iterates over [3,4,5,6,7]
## If-else loops
X = 10
if X % 3 == 0
println("X is a multiple of 3")
else
println("X is not a multiple of 3")
end
## Functions (example: a simple excess kurtosis function)
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
srand(100)
x = rand(TDist(5), 60) # Create hypothetical dataset x
excess_kurtosis(x)
## Note: we have forced output to be of type Float64 by the type declaration above
```

Last updated June 2018

```
import numpy as np
import matplotlib.pyplot as plt
y = np.random.normal(size = 50)
z = np.random.standard_t(df = 4, size = 50)
## using Matplotlib to plot bar, line, histogram and scatter plots
plt.subplot(2,2,1)
plt.bar(range(len(y)), y)
plt.subplot(2,2,2)
plt.plot(y)
plt.subplot(2,2,3)
plt.hist(y)
plt.subplot(2,2,4)
plt.scatter(y,z)
```

Last updated June 2018

```
## For the simple plots in FRF we use Plots.jl for plotting
## Full documentation at http://docs.juliaplots.org/latest/
## By default, Plots.jl uses the GR backend, sufficient for plots done in FRF
## Alternative backends are also available, e.g. Plotly, PlotlyJS
y = rand(Normal(0,1), 50)
using Plots;
## plot barplot, lineplot, histogram, scatterplot of y
return plot(bar(y), plot(y), histogram(y), scatter(y))
## Wrapping plot(...) around multiple plots allows for automatic subplotting
## This can, of course, be manually specified too
## Plot individual graphs using histogram(y), bar(y) etc. directly
## More examples using GR (plus syntax for customizations) can be found online:
## http://docs.juliaplots.org/latest/examples/gr/
```

Last updated June 2018

```
## Convert objects from one type to another with int(), float() etc
## To check type, use type(object)
x = 8.0
print(type(x))
x = int(x)
print(type(x))
```

Last updated June 2018

```
## 1) To convert objects from one type to another, use convert(Type, object)
## To check type, use typeof(object)
x = 8.0
println(typeof(x))
x = convert(Int, 8.0)
println(typeof(x))
## 2) To type Greek letters, type \ + name + Tab in succession
## e.g. \gammaTab gives you γ and \GammaTab gives you Γ
##
## Greek letters are sometimes essential in retrieving parameters from functions
## e.g. res = mle_fit(Normal, x) will return an object res of type Distribution
## with fitted parameters res.μ and res.σ
```