{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"printyellow (generic function with 1 method)"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"using Printf, Dates, Statistics, DelimitedFiles, StatsBase\n",
"\n",
"include(\"jlFiles/printmat.jl\")"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"using Plots\n",
"\n",
"gr(size=(480,320))\n",
"default(fmt = :svg)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Load Data"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(10340, 25)"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x = readdlm(\"Data/25_Portfolios_5x5_Daily.CSV\",',',skipstart=1) #daily return data\n",
"ym = round.(Int,x[:,1]) #yearmonthday, like 20071231\n",
"\n",
"dN = Date.(string.(ym),\"yyyymmdd\") #covert to Julia date, eg. 2001-12-31\n",
"\n",
"\n",
"vv = Date(1980,1,1) .<= dN .<= Date(2020,12,31) #pick out the correct sample\n",
"ym = ym[vv]\n",
"R = x[vv,2:end] #returns\n",
"\n",
"(T,n) = size(R) #number of data points, number of assets"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Task 1: Two Simple Strategies\n",
"\n",
"`R_1`: go long each of asset 1-24 (each with the weight 1/24) and short asset 25\n",
"\n",
"`R_2`: go long asset 1 and short asset 25\n",
"\n",
"The returns of these portfolios are easy to calculate without having to explicitly construct the portfolio weights, but it still a good preparation for later to do the explicit calculations as follows:\n",
"\n",
"1. Construct the vector of portfolio weights `w`\n",
"2. The portfolio return in `t` is `w'*R[t,:]`.\n",
"\n",
"Also, do not be afraid of loops: they are quick.\n",
"\n",
"Show means and standard deviations of the two strategies. Annualize the mean by `*252` and the standard deviation by `*sqrt(252)`.\n",
"\n",
"Plot histograms with bins that are 0.25 wide. (Don't annualize anything in the histograms.)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"w1 = [ones(24)/24;-1] #static\n",
"w2 = [1;zeros(23);-1]\n",
"\n",
"(R_1,R_2) = (fill(NaN,T),fill(NaN,T))\n",
"for t = 1:T \n",
" R_1[t] = w1'*R[t,:]\n",
" R_2[t] = w2'*R[t,:]\n",
"end"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" R_1 R_2\n",
"mean -0.348 -8.665\n",
"std 13.860 18.996\n",
"SR -0.025 -0.456\n",
"\n"
]
}
],
"source": [
"R_all = [R_1 R_2]\n",
"\n",
"μ = mean(R_all,dims=1)*252\n",
"σ = std(R_all,dims=1)*sqrt(252)\n",
"SR = μ./σ\n",
"\n",
"printmat([μ;σ;SR],colNames=[\"R_1\",\"R_2\"],rowNames=[\"mean\",\"std\",\"SR\"])"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt = histogram( R_1,bins = -12:0.25:12,normalize=true,legend=false,title=\"strategy 1\" )\n",
"display(plt)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt = histogram( R_2,bins = -12:0.25:12,normalize=true,legend=false,title=\"strategy 2\" )\n",
"display(plt)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Task 2: Another Trading Strategy\n",
"\n",
"We now do simple volatility based trading strategy.\n",
"\n",
"1. Find the 3 least volatile assets over `t-22:t-1` and give each a portfolio weight `w[t,i]=1/3`. \n",
"\n",
"2. Find the 3 most volatile assets over `t-22:t-1` and give each a portfolio weight `w[t,i]=-1/3`. \n",
"\n",
"3. The portfolio return in `t` is `w[t,:]'*R[t,:]`.\n",
"\n",
"4. Compare the average and std (annualized) with the previous portfolios, over periods `23:T`\n",
"\n",
"Hint: `v = sortperm(x)` gives indices such that `v[1:2]` are the indices of the lowest 2 elements in x. Try `sortperm([12,11,13])` to see."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" 2 \n",
" 1 \n",
"\n"
]
}
],
"source": [
"v = sortperm([12,11,13])\n",
"\n",
"printmat(v[1:2])"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"σ_moving = fill(NaN,T,n)\n",
"for t = 22:T\n",
" σ_moving[t,:] = std(R[t-21:t,:],dims=1)\n",
"end "
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"m = 3 #number of long/short positions \n",
"\n",
"R_3 = fill(NaN,T)\n",
"for t = 23:T #loop over periods, save portfolio returns\n",
" #local s,w #local/global is needed in script\n",
" s = sortperm(σ_moving[t-1,:])\n",
" w = zeros(n)\n",
" w[s[1:m]] .= 1/m\n",
" w[s[end-m+1:end]] .= -1/m\n",
" R_3[t] = w'R[t,:]\n",
"end"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" R_1 R_2 Vol sort\n",
"avg return -0.281 -8.739 3.628\n",
"std 13.867 19.002 14.867\n",
"SR -0.020 -0.460 0.244\n",
"\n"
]
}
],
"source": [
"R_all = [R_1[23:end] R_2[23:end] R_3[23:end]]\n",
"\n",
"μ = mean(R_all,dims=1)*252\n",
"σ = std(R_all,dims=1)*sqrt(252)\n",
"SR = μ./σ\n",
"\n",
"printmat([μ;σ;SR],colNames=[\"R_1\",\"R_2\",\"Vol sort\"],rowNames=[\"avg return\",\"std\",\"SR\"])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"@webio": {
"lastCommId": null,
"lastKernelId": null
},
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Julia 1.6.3",
"language": "julia",
"name": "julia-1.6"
},
"language_info": {
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "1.6.3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}