Diversifiable risk (company specific risk)

Un-diversifiable risk (systematic risk)

$\quad Recession \: of \: the \: economy, \: Low \: consumer \: spending, \: Wars, \: Forces \: of \: nature$

In [1]:
import numpy as np
import pandas as pd
from pandas_datareader import data as wb
import matplotlib.pyplot as plt
In [2]:
tickers = ['PG', 'BEI.DE']

sec_data = pd.DataFrame()

for t in tickers:
    sec_data[t] = wb.DataReader(t, data_source='yahoo', start='2007-1-1')['Adj Close']

sec_returns = np.log(sec_data / sec_data.shift(1))

Calculating Diversifiable and Non-Diversifiable Risk of a Portfolio

In [3]:
weights = np.array([0.5, 0.5])
In [4]:
weights[0]
Out[4]:
0.5
In [5]:
weights[1]
Out[5]:
0.5

Diversifiable Risk:

diversifiable risk = portfolio variance - weighted annual variances

portfolio variance = $(w・Cov)^2$

In [6]:
pfolio_var = np.dot(weights.T, np.dot(sec_returns.cov() * 250, weights))
pfolio_var
Out[6]:
0.026448725193696735
In [7]:
# double brackets (shows dtype)
PG_var_a = sec_returns[['PG']].var() * 250
PG_var_a
Out[7]:
PG    0.035557
dtype: float64
In [8]:
# double brackets (shows dtype)
BEI_var_a = sec_returns[['BEI.DE']].var() * 250
BEI_var_a
Out[8]:
BEI.DE    0.047786
dtype: float64
In [9]:
# inappropriate (shows dtype)
dr = pfolio_var - (weights[0] ** 2 * PG_var_a) - (weights[1] ** 2 * BEI_var_a)
dr
Out[9]:
BEI.DE   NaN
PG       NaN
dtype: float64
In [10]:
float (PG_var_a)
Out[10]:
0.0355573750515694
In [11]:
# single brackets (dtype disappears)
PG_var_a = sec_returns['PG'].var() * 250
PG_var_a
Out[11]:
0.0355573750515694
In [12]:
# single brackets (dtype disappears)
BEI_var_a = sec_returns['BEI.DE'].var() * 250
BEI_var_a
Out[12]:
0.04778558050677794
In [13]:
# appropriate (dtype disappears)
dr = pfolio_var - (weights[0] ** 2 * PG_var_a) - (weights[1] ** 2 * BEI_var_a)
dr
Out[13]:
0.005612986304109899
In [14]:
print (str(round(dr * 100, 3)) + ' %')
0.561 %

Non-Diversifiable Risk:

non-diversifiable risk = portfolio variance - diversifiable risk

non-diversifiable risk = weighted annual variances

In [15]:
n_dr_1 = pfolio_var - dr
n_dr_1
Out[15]:
0.020835738889586834
In [16]:
n_dr_2 = (weights[0] ** 2 * PG_var_a) + (weights[1] ** 2 * BEI_var_a)
n_dr_2
Out[16]:
0.020835738889586834
In [17]:
n_dr_1 == n_dr_2
Out[17]:
True