Answered step by step
Verified Expert Solution
Link Copied!

Question

1 Approved Answer

Codebase: import numpy as np import math import cvxpy as cp import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import scipy.cluster.hierarchy

image text in transcribed

Codebase:

import numpy as np

import math

import cvxpy as cp

import pandas as pd

import seaborn as sns

import matplotlib.pyplot as plt

import scipy.cluster.hierarchy as sch,random

import warnings

warnings.filterwarnings('ignore')

plt.style.use('ggplot')

dataset_log_returns = pd.read_csv('dataset.csv', index_col=0, parse_dates=True)

# The function you need to write.

# Input: cov: a dataframe containing the covariance matrix of stocks.

# sortIx: a list containing the stocks names, ordered by the stage 1&2.

# You can add any input argument if you need.

# Output: allocation weight. You can output any data type as long as you can use it properly in Q3.

def getRecBipart(cov,sortIx):

# A sub function for the satge 1 and 2, called in the hrp_s12()

def getQuasiDiag(link):

link=link.astype(int)

sortIx=pd.Series([link[-1,0],link[-1,1]])

numItems=link[-1,3]

while sortIx.max()>=numItems:

sortIx.index=range(0,sortIx.shape[0]*2,2)

df0=sortIx[sortIx>=numItems]

i=df0.index;j=df0.values-numItems

sortIx[i]=link[j,0]

df0=pd.Series(link[j,1],index=i+1)

sortIx=sortIx.append(df0)

sortIx=sortIx.sort_index()

sortIx.index=range(sortIx.shape[0])

return sortIx.tolist()

# Transform the correlation matrix to a distance matrix

def correlDist(corr, n_stock):

dist=((1-corr)/2.)**.5

for i in range(n_stock):

dist.iloc[i,i] = 0

return dist

# Plot the heatmap of the correlation matrix

def plotCorrMatrix(path,corr,labels=None):

#

if labels is None:labels=[]

plt.pcolor(corr)

plt.colorbar()

plt.yticks(np.arange(.5,corr.shape[0]+.5),labels)

plt.xticks(np.arange(.5,corr.shape[0]+.5),labels)

plt.savefig(path)

plt.clf();plt.close()

return

# Function for Stage 1 and 2

def hrp_s12(cov,stock_namelist, ifplot = False):

n_stock = len(stock_namelist)

#1) compute and plot correlation matrix

v = np.diag(np.sqrt(1p.diag(cov)))

corr = np.dot(np.dot(v,cov), v)

cov = pd.DataFrame(cov, columns = stock_namelist, index = stock_namelist)

corr = pd.DataFrame(corr, columns = stock_namelist, index = stock_namelist)

if (ifplot): plotCorrMatrix('HRP_corr0.png',corr,labels=corr.columns)

#2) cluster

dist=correlDist(corr,n_stock)

link=sch.linkage(dist,'single')

sortIx=getQuasiDiag(link)

sortIx=corr.index[sortIx].tolist() # recover labels

df0=corr.loc[sortIx,sortIx] # reorder

if (ifplot): plotCorrMatrix('HRP_corr1.png',df0,labels=df0.columns)

return sortIx

def hrp_s3(cov,stock_namelist,sortIx):

cov = pd.DataFrame(cov, columns = stock_namelist, index = stock_namelist)

# Finish this function getRecBipart(cov,sortIx).

hrp = getRecBipart(cov,sortIx)

# Please print and check the "hrp" returned by the "getRecBipart(cov,sortIx)".

# The order of stocks in "hrp" maybe follow the "sortIx", which is different from the "stock_namelist".

# I suggest you to restore the order of "hrp" to "stock_namelist" here,

# in order to avoid mistakes in Q3.

# My "hrp" is a pandas.series, so this is what I do:

hrp = hrp[stock_namelist]

# It's OK if you want to finish this step in "getRecBipart()".

# It's also Ok if you want to skip this step here and deal with this small order problem in Q3.

return hrp

if __name__ == '__main__':

stock_namelist = dataset_log_returns.columns.values.tolist()

log_returns_1 = dataset_log_returns.loc['2015-01-06':'2015-05-29']

Sigma = np.cov(log_returns_1.T)

# Fill in the right argument to get the plots and new order of stocks:

sortIx = hrp_s12(Sigma, stock_namelist, ifplot= )

# After finish the function of stage 3, call it and print the final weight:

w_hrp = hrp_s3(Sigma, stock_namelist, sortIx)

print(w_hrp)

dataset.csv

image text in transcribed

Question 2: Hierarchical Risk Parity (25 points) Hierarchical Risk Parity (HRP) combines the ideas of hierarchical clustering and inversevariance allocation. The algorithm operates in three stages: tree clustering, quasidiagonalization and recursive bisection. The code of stage 1 and 2 is provided in the attached file "Q2code.py". Stage 1&2 reorder the stocks. The figures__ show the correlation matrix before and after Stage 1&2. Values of correlation matrix are not changed. We just reorder the stocks so that the similar ones are next to each other and form a quasi-diagonal matrix. Stage 3 will be illustrated with a small example. Suppose we have 6 stocks and after Stage 1 &2, the order of stocks are { "JNJ", "PG", "AMZN", "JPM", "V", "FB"\}. The steps of Stage 3 are as follows. 1.Initialization. Set the list of stocks L={1,2,3,4,5,6}. The numbers of L correspond to the stocks. Assign a unit weight to all items: wn=1,n=1,,6. 2.Bisection and weight allocation. 2.1 Bisect L into two subsets L1={1,2,3} and L2={4,5,6}, which correspond to { "JNJ", "PG", "AMZN" } and { "JPM", "V", "FB" } 2.2 Calculate the following value for Li,i=1,2 : Vi=wiViwi,wi=diag(Vi)1/tr(diag(Vi)1), where Vi is the covariance matrix of the Li,diag() is the diagonal operator and tr() is the trace operator. 2.3 Compute the split factor: =1V1+V2V1. 2.4 Re-scale allocations wn,nL1 by :wn=wn,n=1,2,3. Re-scale allocations wn,nL2 by 1:wn=wn(1),n=4,5,6. 3.Continue the bisection and weight allocation for L1 and L2 until all subsets have only 1 stock. In this example, we get subsets {1} and {2,3} from L1. Then we apply step 2 to {1} and {2,3}, updating the allocations of stock {1} and {2,3}. After this round, {1} has only one stock, so no more bisection can be done. But {2,3} need to be bisected and update the allocations one more time. The same is for L2. Question 2: Hierarchical Risk Parity (25 points) Hierarchical Risk Parity (HRP) combines the ideas of hierarchical clustering and inversevariance allocation. The algorithm operates in three stages: tree clustering, quasidiagonalization and recursive bisection. The code of stage 1 and 2 is provided in the attached file "Q2code.py". Stage 1&2 reorder the stocks. The figures__ show the correlation matrix before and after Stage 1&2. Values of correlation matrix are not changed. We just reorder the stocks so that the similar ones are next to each other and form a quasi-diagonal matrix. Stage 3 will be illustrated with a small example. Suppose we have 6 stocks and after Stage 1 &2, the order of stocks are { "JNJ", "PG", "AMZN", "JPM", "V", "FB"\}. The steps of Stage 3 are as follows. 1.Initialization. Set the list of stocks L={1,2,3,4,5,6}. The numbers of L correspond to the stocks. Assign a unit weight to all items: wn=1,n=1,,6. 2.Bisection and weight allocation. 2.1 Bisect L into two subsets L1={1,2,3} and L2={4,5,6}, which correspond to { "JNJ", "PG", "AMZN" } and { "JPM", "V", "FB" } 2.2 Calculate the following value for Li,i=1,2 : Vi=wiViwi,wi=diag(Vi)1/tr(diag(Vi)1), where Vi is the covariance matrix of the Li,diag() is the diagonal operator and tr() is the trace operator. 2.3 Compute the split factor: =1V1+V2V1. 2.4 Re-scale allocations wn,nL1 by :wn=wn,n=1,2,3. Re-scale allocations wn,nL2 by 1:wn=wn(1),n=4,5,6. 3.Continue the bisection and weight allocation for L1 and L2 until all subsets have only 1 stock. In this example, we get subsets {1} and {2,3} from L1. Then we apply step 2 to {1} and {2,3}, updating the allocations of stock {1} and {2,3}. After this round, {1} has only one stock, so no more bisection can be done. But {2,3} need to be bisected and update the allocations one more time. The same is for L2

Step by Step Solution

There are 3 Steps involved in it

Step: 1

blur-text-image

Get Instant Access to Expert-Tailored Solutions

See step-by-step solutions with expert insights and AI powered tools for academic success

Step: 2

blur-text-image

Step: 3

blur-text-image

Ace Your Homework with AI

Get the answers you need in no time with our AI-driven, step-by-step assistance

Get Started

Recommended Textbook for

Financial Sorcery Magical Strategies To Create Real And Lasting Wealth

Authors: Jason Miller

1st Edition

1601632185, 9781601632180

More Books

Students also viewed these Finance questions